Addition of extended SiegeSchedule configurations.

Contributed by Trance.
This commit is contained in:
MobiusDevelopment 2020-07-02 05:31:27 +00:00
parent 8ff8f5f250
commit a98f093fb3
85 changed files with 921 additions and 627 deletions

View File

@ -1,5 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../data/xsd/SiegeSchedule.xsd">
<schedule day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="1" castleName="Gludio" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="2" castleName="Dion" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="3" castleName="Giran" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="4" castleName="Oren" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="5" castleName="Aden" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="6" castleName="Innadril" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="7" castleName="Goddard" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="8" castleName="Rune" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="9" castleName="Schuttgart" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
</list>

View File

@ -5,6 +5,9 @@
<xs:sequence>
<xs:element name="schedule" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute type="xs:byte" name="castleId" use="optional" />
<xs:attribute type="xs:string" name="castleName" use="optional" />
<xs:attribute type="xs:boolean" name="siegeEnabled" use="optional" />
<xs:attribute type="xs:string" name="day" use="optional" />
<xs:attribute type="xs:byte" name="hour" use="optional" />
<xs:attribute type="xs:byte" name="maxConcurrent" use="optional" />

View File

@ -17,9 +17,9 @@
package org.l2jmobius.gameserver.data.xml.impl;
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -39,7 +39,7 @@ public class SiegeScheduleData implements IXmlReader
{
private static final Logger LOGGER = Logger.getLogger(SiegeScheduleData.class.getName());
private final List<SiegeScheduleDate> _scheduleData = new ArrayList<>();
private final Map<Integer, SiegeScheduleDate> _scheduleData = new HashMap<>();
protected SiegeScheduleData()
{
@ -49,14 +49,8 @@ public class SiegeScheduleData implements IXmlReader
@Override
public synchronized void load()
{
_scheduleData.clear();
parseDatapackFile("config/SiegeSchedule.xml");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _scheduleData.size() + " siege schedulers.");
if (_scheduleData.isEmpty())
{
_scheduleData.add(new SiegeScheduleDate(new StatSet()));
LOGGER.info(getClass().getSimpleName() + ": Emergency loaded " + _scheduleData.size() + " default siege schedulers.");
}
}
@Override
@ -85,7 +79,7 @@ public class SiegeScheduleData implements IXmlReader
}
set.set(key, val);
}
_scheduleData.add(new SiegeScheduleDate(set));
_scheduleData.put(set.getInt("castleId"), new SiegeScheduleDate(set));
break;
}
}
@ -107,9 +101,9 @@ public class SiegeScheduleData implements IXmlReader
}
}
public List<SiegeScheduleDate> getScheduleDates()
public SiegeScheduleDate getScheduleDateForCastleId(int castleId)
{
return _scheduleData;
return _scheduleData.get(castleId);
}
public static SiegeScheduleData getInstance()

View File

@ -26,12 +26,14 @@ public class SiegeScheduleDate
private final int _day;
private final int _hour;
private final int _maxConcurrent;
private final boolean _siegeEnabled;
public SiegeScheduleDate(StatSet set)
{
_day = set.getInt("day", Calendar.SUNDAY);
_hour = set.getInt("hour", 16);
_maxConcurrent = set.getInt("maxConcurrent", 5);
_siegeEnabled = set.getBoolean("siegeEnabled", false);
}
public int getDay()
@ -48,4 +50,9 @@ public class SiegeScheduleDate
{
return _maxConcurrent;
}
public boolean siegeEnabled()
{
return _siegeEnabled;
}
}

View File

@ -1426,35 +1426,42 @@ public class Siege implements Siegable
/** Set the date for the next siege. */
private void setNextSiegeDate()
{
final Calendar cal = _castle.getSiegeDate();
if (cal.getTimeInMillis() < System.currentTimeMillis())
final SiegeScheduleDate holder = SiegeScheduleData.getInstance().getScheduleDateForCastleId(_castle.getResidenceId());
if (!holder.siegeEnabled())
{
cal.setTimeInMillis(System.currentTimeMillis());
return;
}
for (SiegeScheduleDate holder : SiegeScheduleData.getInstance().getScheduleDates())
final Calendar calendar = _castle.getSiegeDate();
if (calendar.getTimeInMillis() < System.currentTimeMillis())
{
cal.set(Calendar.DAY_OF_WEEK, holder.getDay());
cal.set(Calendar.HOUR_OF_DAY, holder.getHour());
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
if (cal.before(Calendar.getInstance()))
{
cal.add(Calendar.WEEK_OF_YEAR, 2);
}
calendar.setTimeInMillis(System.currentTimeMillis());
}
calendar.set(Calendar.DAY_OF_WEEK, holder.getDay());
calendar.set(Calendar.HOUR_OF_DAY, holder.getHour());
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
if (calendar.before(Calendar.getInstance()))
{
calendar.add(Calendar.WEEK_OF_YEAR, 2);
}
if (CastleManager.getInstance().getSiegeDates(calendar.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), calendar.getTimeInMillis());
if (CastleManager.getInstance().getSiegeDates(cal.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), cal.getTimeInMillis());
break;
}
Broadcast.toAllOnlinePlayers(new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME).addCastleId(_castle.getResidenceId()));
// Allow registration for next siege
_isRegistrationOver = false;
}
else
{
// Deny registration for next siege
_isRegistrationOver = true;
}
final SystemMessage sm = new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME);
sm.addCastleId(_castle.getResidenceId());
Broadcast.toAllOnlinePlayers(sm);
_isRegistrationOver = false; // Allow registration for next siege
}
/**

View File

@ -1,5 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../data/xsd/SiegeSchedule.xsd">
<schedule day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="1" castleName="Gludio" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="2" castleName="Dion" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="3" castleName="Giran" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="4" castleName="Oren" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="5" castleName="Aden" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="6" castleName="Innadril" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="7" castleName="Goddard" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="8" castleName="Rune" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="9" castleName="Schuttgart" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
</list>

View File

@ -5,6 +5,9 @@
<xs:sequence>
<xs:element name="schedule" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute type="xs:byte" name="castleId" use="optional" />
<xs:attribute type="xs:string" name="castleName" use="optional" />
<xs:attribute type="xs:boolean" name="siegeEnabled" use="optional" />
<xs:attribute type="xs:string" name="day" use="optional" />
<xs:attribute type="xs:byte" name="hour" use="optional" />
<xs:attribute type="xs:byte" name="maxConcurrent" use="optional" />

View File

@ -17,9 +17,9 @@
package org.l2jmobius.gameserver.data.xml.impl;
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -39,7 +39,7 @@ public class SiegeScheduleData implements IXmlReader
{
private static final Logger LOGGER = Logger.getLogger(SiegeScheduleData.class.getName());
private final List<SiegeScheduleDate> _scheduleData = new ArrayList<>();
private final Map<Integer, SiegeScheduleDate> _scheduleData = new HashMap<>();
protected SiegeScheduleData()
{
@ -49,14 +49,8 @@ public class SiegeScheduleData implements IXmlReader
@Override
public synchronized void load()
{
_scheduleData.clear();
parseDatapackFile("config/SiegeSchedule.xml");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _scheduleData.size() + " siege schedulers.");
if (_scheduleData.isEmpty())
{
_scheduleData.add(new SiegeScheduleDate(new StatSet()));
LOGGER.info(getClass().getSimpleName() + ": Emergency loaded " + _scheduleData.size() + " default siege schedulers.");
}
}
@Override
@ -85,7 +79,7 @@ public class SiegeScheduleData implements IXmlReader
}
set.set(key, val);
}
_scheduleData.add(new SiegeScheduleDate(set));
_scheduleData.put(set.getInt("castleId"), new SiegeScheduleDate(set));
break;
}
}
@ -107,9 +101,9 @@ public class SiegeScheduleData implements IXmlReader
}
}
public List<SiegeScheduleDate> getScheduleDates()
public SiegeScheduleDate getScheduleDateForCastleId(int castleId)
{
return _scheduleData;
return _scheduleData.get(castleId);
}
public static SiegeScheduleData getInstance()

View File

@ -26,12 +26,14 @@ public class SiegeScheduleDate
private final int _day;
private final int _hour;
private final int _maxConcurrent;
private final boolean _siegeEnabled;
public SiegeScheduleDate(StatSet set)
{
_day = set.getInt("day", Calendar.SUNDAY);
_hour = set.getInt("hour", 16);
_maxConcurrent = set.getInt("maxConcurrent", 5);
_siegeEnabled = set.getBoolean("siegeEnabled", false);
}
public int getDay()
@ -48,4 +50,9 @@ public class SiegeScheduleDate
{
return _maxConcurrent;
}
public boolean siegeEnabled()
{
return _siegeEnabled;
}
}

View File

@ -1426,35 +1426,42 @@ public class Siege implements Siegable
/** Set the date for the next siege. */
private void setNextSiegeDate()
{
final Calendar cal = _castle.getSiegeDate();
if (cal.getTimeInMillis() < System.currentTimeMillis())
final SiegeScheduleDate holder = SiegeScheduleData.getInstance().getScheduleDateForCastleId(_castle.getResidenceId());
if (!holder.siegeEnabled())
{
cal.setTimeInMillis(System.currentTimeMillis());
return;
}
for (SiegeScheduleDate holder : SiegeScheduleData.getInstance().getScheduleDates())
final Calendar calendar = _castle.getSiegeDate();
if (calendar.getTimeInMillis() < System.currentTimeMillis())
{
cal.set(Calendar.DAY_OF_WEEK, holder.getDay());
cal.set(Calendar.HOUR_OF_DAY, holder.getHour());
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
if (cal.before(Calendar.getInstance()))
{
cal.add(Calendar.WEEK_OF_YEAR, 2);
}
calendar.setTimeInMillis(System.currentTimeMillis());
}
calendar.set(Calendar.DAY_OF_WEEK, holder.getDay());
calendar.set(Calendar.HOUR_OF_DAY, holder.getHour());
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
if (calendar.before(Calendar.getInstance()))
{
calendar.add(Calendar.WEEK_OF_YEAR, 2);
}
if (CastleManager.getInstance().getSiegeDates(calendar.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), calendar.getTimeInMillis());
if (CastleManager.getInstance().getSiegeDates(cal.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), cal.getTimeInMillis());
break;
}
Broadcast.toAllOnlinePlayers(new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME).addCastleId(_castle.getResidenceId()));
// Allow registration for next siege
_isRegistrationOver = false;
}
else
{
// Deny registration for next siege
_isRegistrationOver = true;
}
final SystemMessage sm = new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME);
sm.addCastleId(_castle.getResidenceId());
Broadcast.toAllOnlinePlayers(sm);
_isRegistrationOver = false; // Allow registration for next siege
}
/**

View File

@ -1,5 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../data/xsd/SiegeSchedule.xsd">
<schedule day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="1" castleName="Gludio" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="2" castleName="Dion" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="3" castleName="Giran" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="4" castleName="Oren" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="5" castleName="Aden" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="6" castleName="Innadril" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="7" castleName="Goddard" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="8" castleName="Rune" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="9" castleName="Schuttgart" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
</list>

View File

@ -5,6 +5,9 @@
<xs:sequence>
<xs:element name="schedule" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute type="xs:byte" name="castleId" use="optional" />
<xs:attribute type="xs:string" name="castleName" use="optional" />
<xs:attribute type="xs:boolean" name="siegeEnabled" use="optional" />
<xs:attribute type="xs:string" name="day" use="optional" />
<xs:attribute type="xs:byte" name="hour" use="optional" />
<xs:attribute type="xs:byte" name="maxConcurrent" use="optional" />

View File

@ -17,9 +17,9 @@
package org.l2jmobius.gameserver.data.xml.impl;
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -39,7 +39,7 @@ public class SiegeScheduleData implements IXmlReader
{
private static final Logger LOGGER = Logger.getLogger(SiegeScheduleData.class.getName());
private final List<SiegeScheduleDate> _scheduleData = new ArrayList<>();
private final Map<Integer, SiegeScheduleDate> _scheduleData = new HashMap<>();
protected SiegeScheduleData()
{
@ -49,14 +49,8 @@ public class SiegeScheduleData implements IXmlReader
@Override
public synchronized void load()
{
_scheduleData.clear();
parseDatapackFile("config/SiegeSchedule.xml");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _scheduleData.size() + " siege schedulers.");
if (_scheduleData.isEmpty())
{
_scheduleData.add(new SiegeScheduleDate(new StatSet()));
LOGGER.info(getClass().getSimpleName() + ": Emergency loaded " + _scheduleData.size() + " default siege schedulers.");
}
}
@Override
@ -85,7 +79,7 @@ public class SiegeScheduleData implements IXmlReader
}
set.set(key, val);
}
_scheduleData.add(new SiegeScheduleDate(set));
_scheduleData.put(set.getInt("castleId"), new SiegeScheduleDate(set));
break;
}
}
@ -107,9 +101,9 @@ public class SiegeScheduleData implements IXmlReader
}
}
public List<SiegeScheduleDate> getScheduleDates()
public SiegeScheduleDate getScheduleDateForCastleId(int castleId)
{
return _scheduleData;
return _scheduleData.get(castleId);
}
public static SiegeScheduleData getInstance()

View File

@ -26,12 +26,14 @@ public class SiegeScheduleDate
private final int _day;
private final int _hour;
private final int _maxConcurrent;
private final boolean _siegeEnabled;
public SiegeScheduleDate(StatSet set)
{
_day = set.getInt("day", Calendar.SUNDAY);
_hour = set.getInt("hour", 16);
_maxConcurrent = set.getInt("maxConcurrent", 5);
_siegeEnabled = set.getBoolean("siegeEnabled", false);
}
public int getDay()
@ -48,4 +50,9 @@ public class SiegeScheduleDate
{
return _maxConcurrent;
}
public boolean siegeEnabled()
{
return _siegeEnabled;
}
}

View File

@ -1426,35 +1426,42 @@ public class Siege implements Siegable
/** Set the date for the next siege. */
private void setNextSiegeDate()
{
final Calendar cal = _castle.getSiegeDate();
if (cal.getTimeInMillis() < System.currentTimeMillis())
final SiegeScheduleDate holder = SiegeScheduleData.getInstance().getScheduleDateForCastleId(_castle.getResidenceId());
if (!holder.siegeEnabled())
{
cal.setTimeInMillis(System.currentTimeMillis());
return;
}
for (SiegeScheduleDate holder : SiegeScheduleData.getInstance().getScheduleDates())
final Calendar calendar = _castle.getSiegeDate();
if (calendar.getTimeInMillis() < System.currentTimeMillis())
{
cal.set(Calendar.DAY_OF_WEEK, holder.getDay());
cal.set(Calendar.HOUR_OF_DAY, holder.getHour());
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
if (cal.before(Calendar.getInstance()))
{
cal.add(Calendar.WEEK_OF_YEAR, 2);
}
calendar.setTimeInMillis(System.currentTimeMillis());
}
calendar.set(Calendar.DAY_OF_WEEK, holder.getDay());
calendar.set(Calendar.HOUR_OF_DAY, holder.getHour());
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
if (calendar.before(Calendar.getInstance()))
{
calendar.add(Calendar.WEEK_OF_YEAR, 2);
}
if (CastleManager.getInstance().getSiegeDates(calendar.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), calendar.getTimeInMillis());
if (CastleManager.getInstance().getSiegeDates(cal.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), cal.getTimeInMillis());
break;
}
Broadcast.toAllOnlinePlayers(new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME).addCastleId(_castle.getResidenceId()));
// Allow registration for next siege
_isRegistrationOver = false;
}
else
{
// Deny registration for next siege
_isRegistrationOver = true;
}
final SystemMessage sm = new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME);
sm.addCastleId(_castle.getResidenceId());
Broadcast.toAllOnlinePlayers(sm);
_isRegistrationOver = false; // Allow registration for next siege
}
/**

View File

@ -1,5 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../data/xsd/SiegeSchedule.xsd">
<schedule day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="1" castleName="Gludio" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="2" castleName="Dion" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="3" castleName="Giran" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="4" castleName="Oren" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="5" castleName="Aden" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="6" castleName="Innadril" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="7" castleName="Goddard" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="8" castleName="Rune" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="9" castleName="Schuttgart" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
</list>

View File

@ -5,6 +5,9 @@
<xs:sequence>
<xs:element name="schedule" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute type="xs:byte" name="castleId" use="optional" />
<xs:attribute type="xs:string" name="castleName" use="optional" />
<xs:attribute type="xs:boolean" name="siegeEnabled" use="optional" />
<xs:attribute type="xs:string" name="day" use="optional" />
<xs:attribute type="xs:byte" name="hour" use="optional" />
<xs:attribute type="xs:byte" name="maxConcurrent" use="optional" />

View File

@ -17,9 +17,9 @@
package org.l2jmobius.gameserver.data.xml.impl;
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -39,7 +39,7 @@ public class SiegeScheduleData implements IXmlReader
{
private static final Logger LOGGER = Logger.getLogger(SiegeScheduleData.class.getName());
private final List<SiegeScheduleDate> _scheduleData = new ArrayList<>();
private final Map<Integer, SiegeScheduleDate> _scheduleData = new HashMap<>();
protected SiegeScheduleData()
{
@ -49,14 +49,8 @@ public class SiegeScheduleData implements IXmlReader
@Override
public synchronized void load()
{
_scheduleData.clear();
parseDatapackFile("config/SiegeSchedule.xml");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _scheduleData.size() + " siege schedulers.");
if (_scheduleData.isEmpty())
{
_scheduleData.add(new SiegeScheduleDate(new StatSet()));
LOGGER.info(getClass().getSimpleName() + ": Emergency loaded " + _scheduleData.size() + " default siege schedulers.");
}
}
@Override
@ -85,7 +79,7 @@ public class SiegeScheduleData implements IXmlReader
}
set.set(key, val);
}
_scheduleData.add(new SiegeScheduleDate(set));
_scheduleData.put(set.getInt("castleId"), new SiegeScheduleDate(set));
break;
}
}
@ -107,9 +101,9 @@ public class SiegeScheduleData implements IXmlReader
}
}
public List<SiegeScheduleDate> getScheduleDates()
public SiegeScheduleDate getScheduleDateForCastleId(int castleId)
{
return _scheduleData;
return _scheduleData.get(castleId);
}
public static SiegeScheduleData getInstance()

View File

@ -26,12 +26,14 @@ public class SiegeScheduleDate
private final int _day;
private final int _hour;
private final int _maxConcurrent;
private final boolean _siegeEnabled;
public SiegeScheduleDate(StatSet set)
{
_day = set.getInt("day", Calendar.SUNDAY);
_hour = set.getInt("hour", 16);
_maxConcurrent = set.getInt("maxConcurrent", 5);
_siegeEnabled = set.getBoolean("siegeEnabled", false);
}
public int getDay()
@ -48,4 +50,9 @@ public class SiegeScheduleDate
{
return _maxConcurrent;
}
public boolean siegeEnabled()
{
return _siegeEnabled;
}
}

View File

@ -1426,35 +1426,42 @@ public class Siege implements Siegable
/** Set the date for the next siege. */
private void setNextSiegeDate()
{
final Calendar cal = _castle.getSiegeDate();
if (cal.getTimeInMillis() < System.currentTimeMillis())
final SiegeScheduleDate holder = SiegeScheduleData.getInstance().getScheduleDateForCastleId(_castle.getResidenceId());
if (!holder.siegeEnabled())
{
cal.setTimeInMillis(System.currentTimeMillis());
return;
}
for (SiegeScheduleDate holder : SiegeScheduleData.getInstance().getScheduleDates())
final Calendar calendar = _castle.getSiegeDate();
if (calendar.getTimeInMillis() < System.currentTimeMillis())
{
cal.set(Calendar.DAY_OF_WEEK, holder.getDay());
cal.set(Calendar.HOUR_OF_DAY, holder.getHour());
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
if (cal.before(Calendar.getInstance()))
{
cal.add(Calendar.WEEK_OF_YEAR, 2);
}
calendar.setTimeInMillis(System.currentTimeMillis());
}
calendar.set(Calendar.DAY_OF_WEEK, holder.getDay());
calendar.set(Calendar.HOUR_OF_DAY, holder.getHour());
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
if (calendar.before(Calendar.getInstance()))
{
calendar.add(Calendar.WEEK_OF_YEAR, 2);
}
if (CastleManager.getInstance().getSiegeDates(calendar.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), calendar.getTimeInMillis());
if (CastleManager.getInstance().getSiegeDates(cal.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), cal.getTimeInMillis());
break;
}
Broadcast.toAllOnlinePlayers(new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME).addCastleId(_castle.getResidenceId()));
// Allow registration for next siege
_isRegistrationOver = false;
}
else
{
// Deny registration for next siege
_isRegistrationOver = true;
}
final SystemMessage sm = new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME);
sm.addCastleId(_castle.getResidenceId());
Broadcast.toAllOnlinePlayers(sm);
_isRegistrationOver = false; // Allow registration for next siege
}
/**

View File

@ -1,5 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../data/xsd/SiegeSchedule.xsd">
<schedule day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="1" castleName="Gludio" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="2" castleName="Dion" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="3" castleName="Giran" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="4" castleName="Oren" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="5" castleName="Aden" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="6" castleName="Innadril" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="7" castleName="Goddard" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="8" castleName="Rune" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="9" castleName="Schuttgart" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
</list>

View File

@ -5,6 +5,9 @@
<xs:sequence>
<xs:element name="schedule" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute type="xs:byte" name="castleId" use="optional" />
<xs:attribute type="xs:string" name="castleName" use="optional" />
<xs:attribute type="xs:boolean" name="siegeEnabled" use="optional" />
<xs:attribute type="xs:string" name="day" use="optional" />
<xs:attribute type="xs:byte" name="hour" use="optional" />
<xs:attribute type="xs:byte" name="maxConcurrent" use="optional" />

View File

@ -17,9 +17,9 @@
package org.l2jmobius.gameserver.data.xml.impl;
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -39,7 +39,7 @@ public class SiegeScheduleData implements IXmlReader
{
private static final Logger LOGGER = Logger.getLogger(SiegeScheduleData.class.getName());
private final List<SiegeScheduleDate> _scheduleData = new ArrayList<>();
private final Map<Integer, SiegeScheduleDate> _scheduleData = new HashMap<>();
protected SiegeScheduleData()
{
@ -49,14 +49,8 @@ public class SiegeScheduleData implements IXmlReader
@Override
public synchronized void load()
{
_scheduleData.clear();
parseDatapackFile("config/SiegeSchedule.xml");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _scheduleData.size() + " siege schedulers.");
if (_scheduleData.isEmpty())
{
_scheduleData.add(new SiegeScheduleDate(new StatSet()));
LOGGER.info(getClass().getSimpleName() + ": Emergency loaded " + _scheduleData.size() + " default siege schedulers.");
}
}
@Override
@ -85,7 +79,7 @@ public class SiegeScheduleData implements IXmlReader
}
set.set(key, val);
}
_scheduleData.add(new SiegeScheduleDate(set));
_scheduleData.put(set.getInt("castleId"), new SiegeScheduleDate(set));
break;
}
}
@ -107,9 +101,9 @@ public class SiegeScheduleData implements IXmlReader
}
}
public List<SiegeScheduleDate> getScheduleDates()
public SiegeScheduleDate getScheduleDateForCastleId(int castleId)
{
return _scheduleData;
return _scheduleData.get(castleId);
}
public static SiegeScheduleData getInstance()

View File

@ -26,12 +26,14 @@ public class SiegeScheduleDate
private final int _day;
private final int _hour;
private final int _maxConcurrent;
private final boolean _siegeEnabled;
public SiegeScheduleDate(StatSet set)
{
_day = set.getInt("day", Calendar.SUNDAY);
_hour = set.getInt("hour", 16);
_maxConcurrent = set.getInt("maxConcurrent", 5);
_siegeEnabled = set.getBoolean("siegeEnabled", false);
}
public int getDay()
@ -48,4 +50,9 @@ public class SiegeScheduleDate
{
return _maxConcurrent;
}
public boolean siegeEnabled()
{
return _siegeEnabled;
}
}

View File

@ -1426,35 +1426,42 @@ public class Siege implements Siegable
/** Set the date for the next siege. */
private void setNextSiegeDate()
{
final Calendar cal = _castle.getSiegeDate();
if (cal.getTimeInMillis() < System.currentTimeMillis())
final SiegeScheduleDate holder = SiegeScheduleData.getInstance().getScheduleDateForCastleId(_castle.getResidenceId());
if (!holder.siegeEnabled())
{
cal.setTimeInMillis(System.currentTimeMillis());
return;
}
for (SiegeScheduleDate holder : SiegeScheduleData.getInstance().getScheduleDates())
final Calendar calendar = _castle.getSiegeDate();
if (calendar.getTimeInMillis() < System.currentTimeMillis())
{
cal.set(Calendar.DAY_OF_WEEK, holder.getDay());
cal.set(Calendar.HOUR_OF_DAY, holder.getHour());
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
if (cal.before(Calendar.getInstance()))
{
cal.add(Calendar.WEEK_OF_YEAR, 2);
}
calendar.setTimeInMillis(System.currentTimeMillis());
}
calendar.set(Calendar.DAY_OF_WEEK, holder.getDay());
calendar.set(Calendar.HOUR_OF_DAY, holder.getHour());
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
if (calendar.before(Calendar.getInstance()))
{
calendar.add(Calendar.WEEK_OF_YEAR, 2);
}
if (CastleManager.getInstance().getSiegeDates(calendar.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), calendar.getTimeInMillis());
if (CastleManager.getInstance().getSiegeDates(cal.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), cal.getTimeInMillis());
break;
}
Broadcast.toAllOnlinePlayers(new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME).addCastleId(_castle.getResidenceId()));
// Allow registration for next siege
_isRegistrationOver = false;
}
else
{
// Deny registration for next siege
_isRegistrationOver = true;
}
final SystemMessage sm = new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME);
sm.addCastleId(_castle.getResidenceId());
Broadcast.toAllOnlinePlayers(sm);
_isRegistrationOver = false; // Allow registration for next siege
}
/**

View File

@ -1,5 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../data/xsd/SiegeSchedule.xsd">
<schedule day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="1" castleName="Gludio" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="2" castleName="Dion" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="3" castleName="Giran" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="4" castleName="Oren" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="5" castleName="Aden" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="6" castleName="Innadril" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="7" castleName="Goddard" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="8" castleName="Rune" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="9" castleName="Schuttgart" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
</list>

View File

@ -5,6 +5,9 @@
<xs:sequence>
<xs:element name="schedule" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute type="xs:byte" name="castleId" use="optional" />
<xs:attribute type="xs:string" name="castleName" use="optional" />
<xs:attribute type="xs:boolean" name="siegeEnabled" use="optional" />
<xs:attribute type="xs:string" name="day" use="optional" />
<xs:attribute type="xs:byte" name="hour" use="optional" />
<xs:attribute type="xs:byte" name="maxConcurrent" use="optional" />

View File

@ -17,9 +17,9 @@
package org.l2jmobius.gameserver.data.xml.impl;
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -39,7 +39,7 @@ public class SiegeScheduleData implements IXmlReader
{
private static final Logger LOGGER = Logger.getLogger(SiegeScheduleData.class.getName());
private final List<SiegeScheduleDate> _scheduleData = new ArrayList<>();
private final Map<Integer, SiegeScheduleDate> _scheduleData = new HashMap<>();
protected SiegeScheduleData()
{
@ -49,14 +49,8 @@ public class SiegeScheduleData implements IXmlReader
@Override
public synchronized void load()
{
_scheduleData.clear();
parseDatapackFile("config/SiegeSchedule.xml");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _scheduleData.size() + " siege schedulers.");
if (_scheduleData.isEmpty())
{
_scheduleData.add(new SiegeScheduleDate(new StatSet()));
LOGGER.info(getClass().getSimpleName() + ": Emergency loaded " + _scheduleData.size() + " default siege schedulers.");
}
}
@Override
@ -85,7 +79,7 @@ public class SiegeScheduleData implements IXmlReader
}
set.set(key, val);
}
_scheduleData.add(new SiegeScheduleDate(set));
_scheduleData.put(set.getInt("castleId"), new SiegeScheduleDate(set));
break;
}
}
@ -107,9 +101,9 @@ public class SiegeScheduleData implements IXmlReader
}
}
public List<SiegeScheduleDate> getScheduleDates()
public SiegeScheduleDate getScheduleDateForCastleId(int castleId)
{
return _scheduleData;
return _scheduleData.get(castleId);
}
public static SiegeScheduleData getInstance()

View File

@ -26,12 +26,14 @@ public class SiegeScheduleDate
private final int _day;
private final int _hour;
private final int _maxConcurrent;
private final boolean _siegeEnabled;
public SiegeScheduleDate(StatSet set)
{
_day = set.getInt("day", Calendar.SUNDAY);
_hour = set.getInt("hour", 16);
_maxConcurrent = set.getInt("maxConcurrent", 5);
_siegeEnabled = set.getBoolean("siegeEnabled", false);
}
public int getDay()
@ -48,4 +50,9 @@ public class SiegeScheduleDate
{
return _maxConcurrent;
}
public boolean siegeEnabled()
{
return _siegeEnabled;
}
}

View File

@ -1426,35 +1426,42 @@ public class Siege implements Siegable
/** Set the date for the next siege. */
private void setNextSiegeDate()
{
final Calendar cal = _castle.getSiegeDate();
if (cal.getTimeInMillis() < System.currentTimeMillis())
final SiegeScheduleDate holder = SiegeScheduleData.getInstance().getScheduleDateForCastleId(_castle.getResidenceId());
if (!holder.siegeEnabled())
{
cal.setTimeInMillis(System.currentTimeMillis());
return;
}
for (SiegeScheduleDate holder : SiegeScheduleData.getInstance().getScheduleDates())
final Calendar calendar = _castle.getSiegeDate();
if (calendar.getTimeInMillis() < System.currentTimeMillis())
{
cal.set(Calendar.DAY_OF_WEEK, holder.getDay());
cal.set(Calendar.HOUR_OF_DAY, holder.getHour());
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
if (cal.before(Calendar.getInstance()))
{
cal.add(Calendar.WEEK_OF_YEAR, 2);
}
calendar.setTimeInMillis(System.currentTimeMillis());
}
calendar.set(Calendar.DAY_OF_WEEK, holder.getDay());
calendar.set(Calendar.HOUR_OF_DAY, holder.getHour());
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
if (calendar.before(Calendar.getInstance()))
{
calendar.add(Calendar.WEEK_OF_YEAR, 2);
}
if (CastleManager.getInstance().getSiegeDates(calendar.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), calendar.getTimeInMillis());
if (CastleManager.getInstance().getSiegeDates(cal.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), cal.getTimeInMillis());
break;
}
Broadcast.toAllOnlinePlayers(new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME).addCastleId(_castle.getResidenceId()));
// Allow registration for next siege
_isRegistrationOver = false;
}
else
{
// Deny registration for next siege
_isRegistrationOver = true;
}
final SystemMessage sm = new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME);
sm.addCastleId(_castle.getResidenceId());
Broadcast.toAllOnlinePlayers(sm);
_isRegistrationOver = false; // Allow registration for next siege
}
/**

View File

@ -1,5 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../data/xsd/SiegeSchedule.xsd">
<schedule day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="1" castleName="Gludio" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="2" castleName="Dion" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="3" castleName="Giran" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="4" castleName="Oren" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="5" castleName="Aden" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="6" castleName="Innadril" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="7" castleName="Goddard" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="8" castleName="Rune" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="9" castleName="Schuttgart" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
</list>

View File

@ -5,6 +5,9 @@
<xs:sequence>
<xs:element name="schedule" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute type="xs:byte" name="castleId" use="optional" />
<xs:attribute type="xs:string" name="castleName" use="optional" />
<xs:attribute type="xs:boolean" name="siegeEnabled" use="optional" />
<xs:attribute type="xs:string" name="day" use="optional" />
<xs:attribute type="xs:byte" name="hour" use="optional" />
<xs:attribute type="xs:byte" name="maxConcurrent" use="optional" />

View File

@ -17,9 +17,9 @@
package org.l2jmobius.gameserver.data.xml.impl;
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -39,7 +39,7 @@ public class SiegeScheduleData implements IXmlReader
{
private static final Logger LOGGER = Logger.getLogger(SiegeScheduleData.class.getName());
private final List<SiegeScheduleDate> _scheduleData = new ArrayList<>();
private final Map<Integer, SiegeScheduleDate> _scheduleData = new HashMap<>();
protected SiegeScheduleData()
{
@ -49,14 +49,8 @@ public class SiegeScheduleData implements IXmlReader
@Override
public synchronized void load()
{
_scheduleData.clear();
parseDatapackFile("config/SiegeSchedule.xml");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _scheduleData.size() + " siege schedulers.");
if (_scheduleData.isEmpty())
{
_scheduleData.add(new SiegeScheduleDate(new StatSet()));
LOGGER.info(getClass().getSimpleName() + ": Emergency loaded " + _scheduleData.size() + " default siege schedulers.");
}
}
@Override
@ -85,7 +79,7 @@ public class SiegeScheduleData implements IXmlReader
}
set.set(key, val);
}
_scheduleData.add(new SiegeScheduleDate(set));
_scheduleData.put(set.getInt("castleId"), new SiegeScheduleDate(set));
break;
}
}
@ -107,9 +101,9 @@ public class SiegeScheduleData implements IXmlReader
}
}
public List<SiegeScheduleDate> getScheduleDates()
public SiegeScheduleDate getScheduleDateForCastleId(int castleId)
{
return _scheduleData;
return _scheduleData.get(castleId);
}
public static SiegeScheduleData getInstance()

View File

@ -26,12 +26,14 @@ public class SiegeScheduleDate
private final int _day;
private final int _hour;
private final int _maxConcurrent;
private final boolean _siegeEnabled;
public SiegeScheduleDate(StatSet set)
{
_day = set.getInt("day", Calendar.SUNDAY);
_hour = set.getInt("hour", 16);
_maxConcurrent = set.getInt("maxConcurrent", 5);
_siegeEnabled = set.getBoolean("siegeEnabled", false);
}
public int getDay()
@ -48,4 +50,9 @@ public class SiegeScheduleDate
{
return _maxConcurrent;
}
public boolean siegeEnabled()
{
return _siegeEnabled;
}
}

View File

@ -1426,35 +1426,42 @@ public class Siege implements Siegable
/** Set the date for the next siege. */
private void setNextSiegeDate()
{
final Calendar cal = _castle.getSiegeDate();
if (cal.getTimeInMillis() < System.currentTimeMillis())
final SiegeScheduleDate holder = SiegeScheduleData.getInstance().getScheduleDateForCastleId(_castle.getResidenceId());
if (!holder.siegeEnabled())
{
cal.setTimeInMillis(System.currentTimeMillis());
return;
}
for (SiegeScheduleDate holder : SiegeScheduleData.getInstance().getScheduleDates())
final Calendar calendar = _castle.getSiegeDate();
if (calendar.getTimeInMillis() < System.currentTimeMillis())
{
cal.set(Calendar.DAY_OF_WEEK, holder.getDay());
cal.set(Calendar.HOUR_OF_DAY, holder.getHour());
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
if (cal.before(Calendar.getInstance()))
{
cal.add(Calendar.WEEK_OF_YEAR, 2);
}
calendar.setTimeInMillis(System.currentTimeMillis());
}
calendar.set(Calendar.DAY_OF_WEEK, holder.getDay());
calendar.set(Calendar.HOUR_OF_DAY, holder.getHour());
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
if (calendar.before(Calendar.getInstance()))
{
calendar.add(Calendar.WEEK_OF_YEAR, 2);
}
if (CastleManager.getInstance().getSiegeDates(calendar.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), calendar.getTimeInMillis());
if (CastleManager.getInstance().getSiegeDates(cal.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), cal.getTimeInMillis());
break;
}
Broadcast.toAllOnlinePlayers(new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME).addCastleId(_castle.getResidenceId()));
// Allow registration for next siege
_isRegistrationOver = false;
}
else
{
// Deny registration for next siege
_isRegistrationOver = true;
}
final SystemMessage sm = new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME);
sm.addCastleId(_castle.getResidenceId());
Broadcast.toAllOnlinePlayers(sm);
_isRegistrationOver = false; // Allow registration for next siege
}
/**

View File

@ -1,5 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../data/xsd/SiegeSchedule.xsd">
<schedule day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="1" castleName="Gludio" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="2" castleName="Dion" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="3" castleName="Giran" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="4" castleName="Oren" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="5" castleName="Aden" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="6" castleName="Innadril" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="7" castleName="Goddard" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="8" castleName="Rune" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="9" castleName="Schuttgart" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
</list>

View File

@ -5,6 +5,9 @@
<xs:sequence>
<xs:element name="schedule" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute type="xs:byte" name="castleId" use="optional" />
<xs:attribute type="xs:string" name="castleName" use="optional" />
<xs:attribute type="xs:boolean" name="siegeEnabled" use="optional" />
<xs:attribute type="xs:string" name="day" use="optional" />
<xs:attribute type="xs:byte" name="hour" use="optional" />
<xs:attribute type="xs:byte" name="maxConcurrent" use="optional" />

View File

@ -17,9 +17,9 @@
package org.l2jmobius.gameserver.data.xml.impl;
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -39,7 +39,7 @@ public class SiegeScheduleData implements IXmlReader
{
private static final Logger LOGGER = Logger.getLogger(SiegeScheduleData.class.getName());
private final List<SiegeScheduleDate> _scheduleData = new ArrayList<>();
private final Map<Integer, SiegeScheduleDate> _scheduleData = new HashMap<>();
protected SiegeScheduleData()
{
@ -49,14 +49,8 @@ public class SiegeScheduleData implements IXmlReader
@Override
public synchronized void load()
{
_scheduleData.clear();
parseDatapackFile("config/SiegeSchedule.xml");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _scheduleData.size() + " siege schedulers.");
if (_scheduleData.isEmpty())
{
_scheduleData.add(new SiegeScheduleDate(new StatSet()));
LOGGER.info(getClass().getSimpleName() + ": Emergency loaded " + _scheduleData.size() + " default siege schedulers.");
}
}
@Override
@ -85,7 +79,7 @@ public class SiegeScheduleData implements IXmlReader
}
set.set(key, val);
}
_scheduleData.add(new SiegeScheduleDate(set));
_scheduleData.put(set.getInt("castleId"), new SiegeScheduleDate(set));
break;
}
}
@ -107,9 +101,9 @@ public class SiegeScheduleData implements IXmlReader
}
}
public List<SiegeScheduleDate> getScheduleDates()
public SiegeScheduleDate getScheduleDateForCastleId(int castleId)
{
return _scheduleData;
return _scheduleData.get(castleId);
}
public static SiegeScheduleData getInstance()

View File

@ -26,12 +26,14 @@ public class SiegeScheduleDate
private final int _day;
private final int _hour;
private final int _maxConcurrent;
private final boolean _siegeEnabled;
public SiegeScheduleDate(StatSet set)
{
_day = set.getInt("day", Calendar.SUNDAY);
_hour = set.getInt("hour", 16);
_maxConcurrent = set.getInt("maxConcurrent", 5);
_siegeEnabled = set.getBoolean("siegeEnabled", false);
}
public int getDay()
@ -48,4 +50,9 @@ public class SiegeScheduleDate
{
return _maxConcurrent;
}
public boolean siegeEnabled()
{
return _siegeEnabled;
}
}

View File

@ -1426,35 +1426,42 @@ public class Siege implements Siegable
/** Set the date for the next siege. */
private void setNextSiegeDate()
{
final Calendar cal = _castle.getSiegeDate();
if (cal.getTimeInMillis() < System.currentTimeMillis())
final SiegeScheduleDate holder = SiegeScheduleData.getInstance().getScheduleDateForCastleId(_castle.getResidenceId());
if (!holder.siegeEnabled())
{
cal.setTimeInMillis(System.currentTimeMillis());
return;
}
for (SiegeScheduleDate holder : SiegeScheduleData.getInstance().getScheduleDates())
final Calendar calendar = _castle.getSiegeDate();
if (calendar.getTimeInMillis() < System.currentTimeMillis())
{
cal.set(Calendar.DAY_OF_WEEK, holder.getDay());
cal.set(Calendar.HOUR_OF_DAY, holder.getHour());
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
if (cal.before(Calendar.getInstance()))
{
cal.add(Calendar.WEEK_OF_YEAR, 2);
}
calendar.setTimeInMillis(System.currentTimeMillis());
}
calendar.set(Calendar.DAY_OF_WEEK, holder.getDay());
calendar.set(Calendar.HOUR_OF_DAY, holder.getHour());
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
if (calendar.before(Calendar.getInstance()))
{
calendar.add(Calendar.WEEK_OF_YEAR, 2);
}
if (CastleManager.getInstance().getSiegeDates(calendar.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), calendar.getTimeInMillis());
if (CastleManager.getInstance().getSiegeDates(cal.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), cal.getTimeInMillis());
break;
}
Broadcast.toAllOnlinePlayers(new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME).addCastleId(_castle.getResidenceId()));
// Allow registration for next siege
_isRegistrationOver = false;
}
else
{
// Deny registration for next siege
_isRegistrationOver = true;
}
final SystemMessage sm = new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME);
sm.addCastleId(_castle.getResidenceId());
Broadcast.toAllOnlinePlayers(sm);
_isRegistrationOver = false; // Allow registration for next siege
}
/**

View File

@ -1,5 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../data/xsd/SiegeSchedule.xsd">
<schedule day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="1" castleName="Gludio" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="2" castleName="Dion" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="3" castleName="Giran" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="4" castleName="Oren" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="5" castleName="Aden" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="6" castleName="Innadril" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="7" castleName="Goddard" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="8" castleName="Rune" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="9" castleName="Schuttgart" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
</list>

View File

@ -5,6 +5,9 @@
<xs:sequence>
<xs:element name="schedule" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute type="xs:byte" name="castleId" use="optional" />
<xs:attribute type="xs:string" name="castleName" use="optional" />
<xs:attribute type="xs:boolean" name="siegeEnabled" use="optional" />
<xs:attribute type="xs:string" name="day" use="optional" />
<xs:attribute type="xs:byte" name="hour" use="optional" />
<xs:attribute type="xs:byte" name="maxConcurrent" use="optional" />

View File

@ -17,10 +17,11 @@
package org.l2jmobius.gameserver.data.xml.impl;
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
@ -36,7 +37,9 @@ import org.l2jmobius.gameserver.util.Util;
*/
public class SiegeScheduleData implements IXmlReader
{
private final List<SiegeScheduleDate> _scheduleData = new ArrayList<>();
private static final Logger LOGGER = Logger.getLogger(SiegeScheduleData.class.getName());
private final Map<Integer, SiegeScheduleDate> _scheduleData = new HashMap<>();
protected SiegeScheduleData()
{
@ -46,14 +49,8 @@ public class SiegeScheduleData implements IXmlReader
@Override
public synchronized void load()
{
_scheduleData.clear();
parseDatapackFile("config/SiegeSchedule.xml");
LOGGER.log(Level.INFO, getClass().getSimpleName() + ": Loaded " + _scheduleData.size() + " siege schedulers.");
if (_scheduleData.isEmpty())
{
_scheduleData.add(new SiegeScheduleDate(new StatSet()));
LOGGER.log(Level.INFO, getClass().getSimpleName() + ": Emergency Loaded: " + _scheduleData.size() + " default siege schedulers.");
}
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _scheduleData.size() + " siege schedulers.");
}
@Override
@ -82,7 +79,7 @@ public class SiegeScheduleData implements IXmlReader
}
set.set(key, val);
}
_scheduleData.add(new SiegeScheduleDate(set));
_scheduleData.put(set.getInt("castleId"), new SiegeScheduleDate(set));
break;
}
}
@ -95,7 +92,7 @@ public class SiegeScheduleData implements IXmlReader
{
try
{
return Calendar.class.getField(field).getInt(Calendar.class);
return Calendar.class.getField(field).getInt(Calendar.class.getName());
}
catch (Exception e)
{
@ -104,9 +101,9 @@ public class SiegeScheduleData implements IXmlReader
}
}
public List<SiegeScheduleDate> getScheduleDates()
public SiegeScheduleDate getScheduleDateForCastleId(int castleId)
{
return _scheduleData;
return _scheduleData.get(castleId);
}
public static SiegeScheduleData getInstance()

View File

@ -26,12 +26,14 @@ public class SiegeScheduleDate
private final int _day;
private final int _hour;
private final int _maxConcurrent;
private final boolean _siegeEnabled;
public SiegeScheduleDate(StatSet set)
{
_day = set.getInt("day", Calendar.SUNDAY);
_hour = set.getInt("hour", 16);
_maxConcurrent = set.getInt("maxConcurrent", 5);
_siegeEnabled = set.getBoolean("siegeEnabled", false);
}
public int getDay()
@ -48,4 +50,9 @@ public class SiegeScheduleDate
{
return _maxConcurrent;
}
public boolean siegeEnabled()
{
return _siegeEnabled;
}
}

View File

@ -1405,35 +1405,42 @@ public class Siege implements Siegable
/** Set the date for the next siege. */
private void setNextSiegeDate()
{
final Calendar cal = getCastle().getSiegeDate();
if (cal.getTimeInMillis() < System.currentTimeMillis())
final SiegeScheduleDate holder = SiegeScheduleData.getInstance().getScheduleDateForCastleId(_castle.getResidenceId());
if (!holder.siegeEnabled())
{
cal.setTimeInMillis(System.currentTimeMillis());
return;
}
for (SiegeScheduleDate holder : SiegeScheduleData.getInstance().getScheduleDates())
final Calendar calendar = _castle.getSiegeDate();
if (calendar.getTimeInMillis() < System.currentTimeMillis())
{
cal.set(Calendar.DAY_OF_WEEK, holder.getDay());
cal.set(Calendar.HOUR_OF_DAY, holder.getHour());
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
if (cal.before(Calendar.getInstance()))
{
cal.add(Calendar.WEEK_OF_YEAR, 2);
}
calendar.setTimeInMillis(System.currentTimeMillis());
}
calendar.set(Calendar.DAY_OF_WEEK, holder.getDay());
calendar.set(Calendar.HOUR_OF_DAY, holder.getHour());
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
if (calendar.before(Calendar.getInstance()))
{
calendar.add(Calendar.WEEK_OF_YEAR, 2);
}
if (CastleManager.getInstance().getSiegeDates(calendar.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), calendar.getTimeInMillis());
if (CastleManager.getInstance().getSiegeDates(cal.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), cal.getTimeInMillis());
break;
}
Broadcast.toAllOnlinePlayers(new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME).addCastleId(_castle.getResidenceId()));
// Allow registration for next siege
_isRegistrationOver = false;
}
else
{
// Deny registration for next siege
_isRegistrationOver = true;
}
final SystemMessage sm = new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME);
sm.addCastleId(getCastle().getResidenceId());
Broadcast.toAllOnlinePlayers(sm);
_isRegistrationOver = false; // Allow registration for next siege
}
/**

View File

@ -1,5 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../data/xsd/SiegeSchedule.xsd">
<schedule day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="1" castleName="Gludio" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="2" castleName="Dion" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="3" castleName="Giran" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="4" castleName="Oren" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="5" castleName="Aden" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="6" castleName="Innadril" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="7" castleName="Goddard" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="8" castleName="Rune" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="9" castleName="Schuttgart" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
</list>

View File

@ -5,6 +5,9 @@
<xs:sequence>
<xs:element name="schedule" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute type="xs:byte" name="castleId" use="optional" />
<xs:attribute type="xs:string" name="castleName" use="optional" />
<xs:attribute type="xs:boolean" name="siegeEnabled" use="optional" />
<xs:attribute type="xs:string" name="day" use="optional" />
<xs:attribute type="xs:byte" name="hour" use="optional" />
<xs:attribute type="xs:byte" name="maxConcurrent" use="optional" />

View File

@ -17,10 +17,11 @@
package org.l2jmobius.gameserver.data.xml.impl;
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
@ -36,7 +37,9 @@ import org.l2jmobius.gameserver.util.Util;
*/
public class SiegeScheduleData implements IXmlReader
{
private final List<SiegeScheduleDate> _scheduleData = new ArrayList<>();
private static final Logger LOGGER = Logger.getLogger(SiegeScheduleData.class.getName());
private final Map<Integer, SiegeScheduleDate> _scheduleData = new HashMap<>();
protected SiegeScheduleData()
{
@ -46,14 +49,8 @@ public class SiegeScheduleData implements IXmlReader
@Override
public synchronized void load()
{
_scheduleData.clear();
parseDatapackFile("config/SiegeSchedule.xml");
LOGGER.log(Level.INFO, getClass().getSimpleName() + ": Loaded " + _scheduleData.size() + " siege schedulers.");
if (_scheduleData.isEmpty())
{
_scheduleData.add(new SiegeScheduleDate(new StatSet()));
LOGGER.log(Level.INFO, getClass().getSimpleName() + ": Emergency Loaded: " + _scheduleData.size() + " default siege schedulers.");
}
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _scheduleData.size() + " siege schedulers.");
}
@Override
@ -82,7 +79,7 @@ public class SiegeScheduleData implements IXmlReader
}
set.set(key, val);
}
_scheduleData.add(new SiegeScheduleDate(set));
_scheduleData.put(set.getInt("castleId"), new SiegeScheduleDate(set));
break;
}
}
@ -95,7 +92,7 @@ public class SiegeScheduleData implements IXmlReader
{
try
{
return Calendar.class.getField(field).getInt(Calendar.class);
return Calendar.class.getField(field).getInt(Calendar.class.getName());
}
catch (Exception e)
{
@ -104,9 +101,9 @@ public class SiegeScheduleData implements IXmlReader
}
}
public List<SiegeScheduleDate> getScheduleDates()
public SiegeScheduleDate getScheduleDateForCastleId(int castleId)
{
return _scheduleData;
return _scheduleData.get(castleId);
}
public static SiegeScheduleData getInstance()

View File

@ -26,12 +26,14 @@ public class SiegeScheduleDate
private final int _day;
private final int _hour;
private final int _maxConcurrent;
private final boolean _siegeEnabled;
public SiegeScheduleDate(StatSet set)
{
_day = set.getInt("day", Calendar.SUNDAY);
_hour = set.getInt("hour", 16);
_maxConcurrent = set.getInt("maxConcurrent", 5);
_siegeEnabled = set.getBoolean("siegeEnabled", false);
}
public int getDay()
@ -48,4 +50,9 @@ public class SiegeScheduleDate
{
return _maxConcurrent;
}
public boolean siegeEnabled()
{
return _siegeEnabled;
}
}

View File

@ -1405,35 +1405,42 @@ public class Siege implements Siegable
/** Set the date for the next siege. */
private void setNextSiegeDate()
{
final Calendar cal = getCastle().getSiegeDate();
if (cal.getTimeInMillis() < System.currentTimeMillis())
final SiegeScheduleDate holder = SiegeScheduleData.getInstance().getScheduleDateForCastleId(_castle.getResidenceId());
if (!holder.siegeEnabled())
{
cal.setTimeInMillis(System.currentTimeMillis());
return;
}
for (SiegeScheduleDate holder : SiegeScheduleData.getInstance().getScheduleDates())
final Calendar calendar = _castle.getSiegeDate();
if (calendar.getTimeInMillis() < System.currentTimeMillis())
{
cal.set(Calendar.DAY_OF_WEEK, holder.getDay());
cal.set(Calendar.HOUR_OF_DAY, holder.getHour());
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
if (cal.before(Calendar.getInstance()))
{
cal.add(Calendar.WEEK_OF_YEAR, 2);
}
calendar.setTimeInMillis(System.currentTimeMillis());
}
calendar.set(Calendar.DAY_OF_WEEK, holder.getDay());
calendar.set(Calendar.HOUR_OF_DAY, holder.getHour());
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
if (calendar.before(Calendar.getInstance()))
{
calendar.add(Calendar.WEEK_OF_YEAR, 2);
}
if (CastleManager.getInstance().getSiegeDates(calendar.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), calendar.getTimeInMillis());
if (CastleManager.getInstance().getSiegeDates(cal.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), cal.getTimeInMillis());
break;
}
Broadcast.toAllOnlinePlayers(new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME).addCastleId(_castle.getResidenceId()));
// Allow registration for next siege
_isRegistrationOver = false;
}
else
{
// Deny registration for next siege
_isRegistrationOver = true;
}
final SystemMessage sm = new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME);
sm.addCastleId(getCastle().getResidenceId());
Broadcast.toAllOnlinePlayers(sm);
_isRegistrationOver = false; // Allow registration for next siege
}
/**

View File

@ -1,4 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../data/xsd/SiegeSchedule.xsd">
<schedule day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="1" castleName="Gludio" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="2" castleName="Dion" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="3" castleName="Giran" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="4" castleName="Oren" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="5" castleName="Aden" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
</list>

View File

@ -5,6 +5,9 @@
<xs:sequence>
<xs:element name="schedule" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute type="xs:byte" name="castleId" use="optional" />
<xs:attribute type="xs:string" name="castleName" use="optional" />
<xs:attribute type="xs:boolean" name="siegeEnabled" use="optional" />
<xs:attribute type="xs:string" name="day" use="optional" />
<xs:attribute type="xs:byte" name="hour" use="optional" />
<xs:attribute type="xs:byte" name="maxConcurrent" use="optional" />

View File

@ -17,9 +17,9 @@
package org.l2jmobius.gameserver.data.xml.impl;
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -39,7 +39,7 @@ public class SiegeScheduleData implements IXmlReader
{
private static final Logger LOGGER = Logger.getLogger(SiegeScheduleData.class.getName());
private final List<SiegeScheduleDate> _scheduleData = new ArrayList<>();
private final Map<Integer, SiegeScheduleDate> _scheduleData = new HashMap<>();
protected SiegeScheduleData()
{
@ -49,14 +49,8 @@ public class SiegeScheduleData implements IXmlReader
@Override
public synchronized void load()
{
_scheduleData.clear();
parseDatapackFile("config/SiegeSchedule.xml");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _scheduleData.size() + " siege schedulers.");
if (_scheduleData.isEmpty())
{
_scheduleData.add(new SiegeScheduleDate(new StatSet()));
LOGGER.info(getClass().getSimpleName() + ": Emergency loaded " + _scheduleData.size() + " default siege schedulers.");
}
}
@Override
@ -85,7 +79,7 @@ public class SiegeScheduleData implements IXmlReader
}
set.set(key, val);
}
_scheduleData.add(new SiegeScheduleDate(set));
_scheduleData.put(set.getInt("castleId"), new SiegeScheduleDate(set));
break;
}
}
@ -107,9 +101,9 @@ public class SiegeScheduleData implements IXmlReader
}
}
public List<SiegeScheduleDate> getScheduleDates()
public SiegeScheduleDate getScheduleDateForCastleId(int castleId)
{
return _scheduleData;
return _scheduleData.get(castleId);
}
public static SiegeScheduleData getInstance()

View File

@ -26,12 +26,14 @@ public class SiegeScheduleDate
private final int _day;
private final int _hour;
private final int _maxConcurrent;
private final boolean _siegeEnabled;
public SiegeScheduleDate(StatSet set)
{
_day = set.getInt("day", Calendar.SUNDAY);
_hour = set.getInt("hour", 16);
_maxConcurrent = set.getInt("maxConcurrent", 5);
_siegeEnabled = set.getBoolean("siegeEnabled", false);
}
public int getDay()
@ -48,4 +50,9 @@ public class SiegeScheduleDate
{
return _maxConcurrent;
}
public boolean siegeEnabled()
{
return _siegeEnabled;
}
}

View File

@ -1426,35 +1426,42 @@ public class Siege implements Siegable
/** Set the date for the next siege. */
private void setNextSiegeDate()
{
final Calendar cal = _castle.getSiegeDate();
if (cal.getTimeInMillis() < System.currentTimeMillis())
final SiegeScheduleDate holder = SiegeScheduleData.getInstance().getScheduleDateForCastleId(_castle.getResidenceId());
if (!holder.siegeEnabled())
{
cal.setTimeInMillis(System.currentTimeMillis());
return;
}
for (SiegeScheduleDate holder : SiegeScheduleData.getInstance().getScheduleDates())
final Calendar calendar = _castle.getSiegeDate();
if (calendar.getTimeInMillis() < System.currentTimeMillis())
{
cal.set(Calendar.DAY_OF_WEEK, holder.getDay());
cal.set(Calendar.HOUR_OF_DAY, holder.getHour());
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
if (cal.before(Calendar.getInstance()))
{
cal.add(Calendar.WEEK_OF_YEAR, 2);
}
calendar.setTimeInMillis(System.currentTimeMillis());
}
calendar.set(Calendar.DAY_OF_WEEK, holder.getDay());
calendar.set(Calendar.HOUR_OF_DAY, holder.getHour());
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
if (calendar.before(Calendar.getInstance()))
{
calendar.add(Calendar.WEEK_OF_YEAR, 2);
}
if (CastleManager.getInstance().getSiegeDates(calendar.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), calendar.getTimeInMillis());
if (CastleManager.getInstance().getSiegeDates(cal.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), cal.getTimeInMillis());
break;
}
Broadcast.toAllOnlinePlayers(new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME).addCastleId(_castle.getResidenceId()));
// Allow registration for next siege
_isRegistrationOver = false;
}
else
{
// Deny registration for next siege
_isRegistrationOver = true;
}
final SystemMessage sm = new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME);
sm.addCastleId(_castle.getResidenceId());
Broadcast.toAllOnlinePlayers(sm);
_isRegistrationOver = false; // Allow registration for next siege
}
/**

View File

@ -1,4 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../data/xsd/SiegeSchedule.xsd">
<schedule day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="1" castleName="Gludio" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="2" castleName="Dion" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="3" castleName="Giran" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="4" castleName="Oren" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="5" castleName="Aden" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
</list>

View File

@ -5,6 +5,9 @@
<xs:sequence>
<xs:element name="schedule" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute type="xs:byte" name="castleId" use="optional" />
<xs:attribute type="xs:string" name="castleName" use="optional" />
<xs:attribute type="xs:boolean" name="siegeEnabled" use="optional" />
<xs:attribute type="xs:string" name="day" use="optional" />
<xs:attribute type="xs:byte" name="hour" use="optional" />
<xs:attribute type="xs:byte" name="maxConcurrent" use="optional" />

View File

@ -17,9 +17,9 @@
package org.l2jmobius.gameserver.data.xml.impl;
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -39,7 +39,7 @@ public class SiegeScheduleData implements IXmlReader
{
private static final Logger LOGGER = Logger.getLogger(SiegeScheduleData.class.getName());
private final List<SiegeScheduleDate> _scheduleData = new ArrayList<>();
private final Map<Integer, SiegeScheduleDate> _scheduleData = new HashMap<>();
protected SiegeScheduleData()
{
@ -49,14 +49,8 @@ public class SiegeScheduleData implements IXmlReader
@Override
public synchronized void load()
{
_scheduleData.clear();
parseDatapackFile("config/SiegeSchedule.xml");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _scheduleData.size() + " siege schedulers.");
if (_scheduleData.isEmpty())
{
_scheduleData.add(new SiegeScheduleDate(new StatSet()));
LOGGER.info(getClass().getSimpleName() + ": Emergency loaded " + _scheduleData.size() + " default siege schedulers.");
}
}
@Override
@ -85,7 +79,7 @@ public class SiegeScheduleData implements IXmlReader
}
set.set(key, val);
}
_scheduleData.add(new SiegeScheduleDate(set));
_scheduleData.put(set.getInt("castleId"), new SiegeScheduleDate(set));
break;
}
}
@ -107,9 +101,9 @@ public class SiegeScheduleData implements IXmlReader
}
}
public List<SiegeScheduleDate> getScheduleDates()
public SiegeScheduleDate getScheduleDateForCastleId(int castleId)
{
return _scheduleData;
return _scheduleData.get(castleId);
}
public static SiegeScheduleData getInstance()

View File

@ -26,12 +26,14 @@ public class SiegeScheduleDate
private final int _day;
private final int _hour;
private final int _maxConcurrent;
private final boolean _siegeEnabled;
public SiegeScheduleDate(StatSet set)
{
_day = set.getInt("day", Calendar.SUNDAY);
_hour = set.getInt("hour", 16);
_maxConcurrent = set.getInt("maxConcurrent", 5);
_siegeEnabled = set.getBoolean("siegeEnabled", false);
}
public int getDay()
@ -48,4 +50,9 @@ public class SiegeScheduleDate
{
return _maxConcurrent;
}
public boolean siegeEnabled()
{
return _siegeEnabled;
}
}

View File

@ -1426,35 +1426,42 @@ public class Siege implements Siegable
/** Set the date for the next siege. */
private void setNextSiegeDate()
{
final Calendar cal = _castle.getSiegeDate();
if (cal.getTimeInMillis() < System.currentTimeMillis())
final SiegeScheduleDate holder = SiegeScheduleData.getInstance().getScheduleDateForCastleId(_castle.getResidenceId());
if (!holder.siegeEnabled())
{
cal.setTimeInMillis(System.currentTimeMillis());
return;
}
for (SiegeScheduleDate holder : SiegeScheduleData.getInstance().getScheduleDates())
final Calendar calendar = _castle.getSiegeDate();
if (calendar.getTimeInMillis() < System.currentTimeMillis())
{
cal.set(Calendar.DAY_OF_WEEK, holder.getDay());
cal.set(Calendar.HOUR_OF_DAY, holder.getHour());
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
if (cal.before(Calendar.getInstance()))
{
cal.add(Calendar.WEEK_OF_YEAR, 2);
}
calendar.setTimeInMillis(System.currentTimeMillis());
}
calendar.set(Calendar.DAY_OF_WEEK, holder.getDay());
calendar.set(Calendar.HOUR_OF_DAY, holder.getHour());
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
if (calendar.before(Calendar.getInstance()))
{
calendar.add(Calendar.WEEK_OF_YEAR, 2);
}
if (CastleManager.getInstance().getSiegeDates(calendar.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), calendar.getTimeInMillis());
if (CastleManager.getInstance().getSiegeDates(cal.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), cal.getTimeInMillis());
break;
}
Broadcast.toAllOnlinePlayers(new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME).addCastleId(_castle.getResidenceId()));
// Allow registration for next siege
_isRegistrationOver = false;
}
else
{
// Deny registration for next siege
_isRegistrationOver = true;
}
final SystemMessage sm = new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME);
sm.addCastleId(_castle.getResidenceId());
Broadcast.toAllOnlinePlayers(sm);
_isRegistrationOver = false; // Allow registration for next siege
}
/**

View File

@ -1,4 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../data/xsd/SiegeSchedule.xsd">
<schedule day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="1" castleName="Gludio" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="2" castleName="Dion" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="3" castleName="Giran" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="4" castleName="Oren" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="5" castleName="Aden" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
</list>

View File

@ -5,6 +5,9 @@
<xs:sequence>
<xs:element name="schedule" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute type="xs:byte" name="castleId" use="optional" />
<xs:attribute type="xs:string" name="castleName" use="optional" />
<xs:attribute type="xs:boolean" name="siegeEnabled" use="optional" />
<xs:attribute type="xs:string" name="day" use="optional" />
<xs:attribute type="xs:byte" name="hour" use="optional" />
<xs:attribute type="xs:byte" name="maxConcurrent" use="optional" />

View File

@ -17,9 +17,9 @@
package org.l2jmobius.gameserver.data.xml.impl;
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -39,7 +39,7 @@ public class SiegeScheduleData implements IXmlReader
{
private static final Logger LOGGER = Logger.getLogger(SiegeScheduleData.class.getName());
private final List<SiegeScheduleDate> _scheduleData = new ArrayList<>();
private final Map<Integer, SiegeScheduleDate> _scheduleData = new HashMap<>();
protected SiegeScheduleData()
{
@ -49,14 +49,8 @@ public class SiegeScheduleData implements IXmlReader
@Override
public synchronized void load()
{
_scheduleData.clear();
parseDatapackFile("config/SiegeSchedule.xml");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _scheduleData.size() + " siege schedulers.");
if (_scheduleData.isEmpty())
{
_scheduleData.add(new SiegeScheduleDate(new StatSet()));
LOGGER.info(getClass().getSimpleName() + ": Emergency loaded " + _scheduleData.size() + " default siege schedulers.");
}
}
@Override
@ -85,7 +79,7 @@ public class SiegeScheduleData implements IXmlReader
}
set.set(key, val);
}
_scheduleData.add(new SiegeScheduleDate(set));
_scheduleData.put(set.getInt("castleId"), new SiegeScheduleDate(set));
break;
}
}
@ -107,9 +101,9 @@ public class SiegeScheduleData implements IXmlReader
}
}
public List<SiegeScheduleDate> getScheduleDates()
public SiegeScheduleDate getScheduleDateForCastleId(int castleId)
{
return _scheduleData;
return _scheduleData.get(castleId);
}
public static SiegeScheduleData getInstance()

View File

@ -26,12 +26,14 @@ public class SiegeScheduleDate
private final int _day;
private final int _hour;
private final int _maxConcurrent;
private final boolean _siegeEnabled;
public SiegeScheduleDate(StatSet set)
{
_day = set.getInt("day", Calendar.SUNDAY);
_hour = set.getInt("hour", 16);
_maxConcurrent = set.getInt("maxConcurrent", 5);
_siegeEnabled = set.getBoolean("siegeEnabled", false);
}
public int getDay()
@ -48,4 +50,9 @@ public class SiegeScheduleDate
{
return _maxConcurrent;
}
public boolean siegeEnabled()
{
return _siegeEnabled;
}
}

View File

@ -1426,35 +1426,42 @@ public class Siege implements Siegable
/** Set the date for the next siege. */
private void setNextSiegeDate()
{
final Calendar cal = _castle.getSiegeDate();
if (cal.getTimeInMillis() < System.currentTimeMillis())
final SiegeScheduleDate holder = SiegeScheduleData.getInstance().getScheduleDateForCastleId(_castle.getResidenceId());
if (!holder.siegeEnabled())
{
cal.setTimeInMillis(System.currentTimeMillis());
return;
}
for (SiegeScheduleDate holder : SiegeScheduleData.getInstance().getScheduleDates())
final Calendar calendar = _castle.getSiegeDate();
if (calendar.getTimeInMillis() < System.currentTimeMillis())
{
cal.set(Calendar.DAY_OF_WEEK, holder.getDay());
cal.set(Calendar.HOUR_OF_DAY, holder.getHour());
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
if (cal.before(Calendar.getInstance()))
{
cal.add(Calendar.WEEK_OF_YEAR, 2);
}
calendar.setTimeInMillis(System.currentTimeMillis());
}
calendar.set(Calendar.DAY_OF_WEEK, holder.getDay());
calendar.set(Calendar.HOUR_OF_DAY, holder.getHour());
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
if (calendar.before(Calendar.getInstance()))
{
calendar.add(Calendar.WEEK_OF_YEAR, 2);
}
if (CastleManager.getInstance().getSiegeDates(calendar.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), calendar.getTimeInMillis());
if (CastleManager.getInstance().getSiegeDates(cal.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), cal.getTimeInMillis());
break;
}
Broadcast.toAllOnlinePlayers(new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME).addCastleId(_castle.getResidenceId()));
// Allow registration for next siege
_isRegistrationOver = false;
}
else
{
// Deny registration for next siege
_isRegistrationOver = true;
}
final SystemMessage sm = new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME);
sm.addCastleId(_castle.getResidenceId());
Broadcast.toAllOnlinePlayers(sm);
_isRegistrationOver = false; // Allow registration for next siege
}
/**

View File

@ -1,4 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../data/xsd/SiegeSchedule.xsd">
<schedule day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="1" castleName="Gludio" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="2" castleName="Dion" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="3" castleName="Giran" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="4" castleName="Oren" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="5" castleName="Aden" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
</list>

View File

@ -5,6 +5,9 @@
<xs:sequence>
<xs:element name="schedule" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute type="xs:byte" name="castleId" use="optional" />
<xs:attribute type="xs:string" name="castleName" use="optional" />
<xs:attribute type="xs:boolean" name="siegeEnabled" use="optional" />
<xs:attribute type="xs:string" name="day" use="optional" />
<xs:attribute type="xs:byte" name="hour" use="optional" />
<xs:attribute type="xs:byte" name="maxConcurrent" use="optional" />

View File

@ -17,9 +17,9 @@
package org.l2jmobius.gameserver.data.xml.impl;
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -39,7 +39,7 @@ public class SiegeScheduleData implements IXmlReader
{
private static final Logger LOGGER = Logger.getLogger(SiegeScheduleData.class.getName());
private final List<SiegeScheduleDate> _scheduleData = new ArrayList<>();
private final Map<Integer, SiegeScheduleDate> _scheduleData = new HashMap<>();
protected SiegeScheduleData()
{
@ -49,14 +49,8 @@ public class SiegeScheduleData implements IXmlReader
@Override
public synchronized void load()
{
_scheduleData.clear();
parseDatapackFile("config/SiegeSchedule.xml");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _scheduleData.size() + " siege schedulers.");
if (_scheduleData.isEmpty())
{
_scheduleData.add(new SiegeScheduleDate(new StatSet()));
LOGGER.info(getClass().getSimpleName() + ": Emergency loaded " + _scheduleData.size() + " default siege schedulers.");
}
}
@Override
@ -85,7 +79,7 @@ public class SiegeScheduleData implements IXmlReader
}
set.set(key, val);
}
_scheduleData.add(new SiegeScheduleDate(set));
_scheduleData.put(set.getInt("castleId"), new SiegeScheduleDate(set));
break;
}
}
@ -107,9 +101,9 @@ public class SiegeScheduleData implements IXmlReader
}
}
public List<SiegeScheduleDate> getScheduleDates()
public SiegeScheduleDate getScheduleDateForCastleId(int castleId)
{
return _scheduleData;
return _scheduleData.get(castleId);
}
public static SiegeScheduleData getInstance()

View File

@ -26,12 +26,14 @@ public class SiegeScheduleDate
private final int _day;
private final int _hour;
private final int _maxConcurrent;
private final boolean _siegeEnabled;
public SiegeScheduleDate(StatSet set)
{
_day = set.getInt("day", Calendar.SUNDAY);
_hour = set.getInt("hour", 16);
_maxConcurrent = set.getInt("maxConcurrent", 5);
_siegeEnabled = set.getBoolean("siegeEnabled", false);
}
public int getDay()
@ -48,4 +50,9 @@ public class SiegeScheduleDate
{
return _maxConcurrent;
}
public boolean siegeEnabled()
{
return _siegeEnabled;
}
}

View File

@ -1426,35 +1426,42 @@ public class Siege implements Siegable
/** Set the date for the next siege. */
private void setNextSiegeDate()
{
final Calendar cal = _castle.getSiegeDate();
if (cal.getTimeInMillis() < System.currentTimeMillis())
final SiegeScheduleDate holder = SiegeScheduleData.getInstance().getScheduleDateForCastleId(_castle.getResidenceId());
if (!holder.siegeEnabled())
{
cal.setTimeInMillis(System.currentTimeMillis());
return;
}
for (SiegeScheduleDate holder : SiegeScheduleData.getInstance().getScheduleDates())
final Calendar calendar = _castle.getSiegeDate();
if (calendar.getTimeInMillis() < System.currentTimeMillis())
{
cal.set(Calendar.DAY_OF_WEEK, holder.getDay());
cal.set(Calendar.HOUR_OF_DAY, holder.getHour());
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
if (cal.before(Calendar.getInstance()))
{
cal.add(Calendar.WEEK_OF_YEAR, 2);
}
calendar.setTimeInMillis(System.currentTimeMillis());
}
calendar.set(Calendar.DAY_OF_WEEK, holder.getDay());
calendar.set(Calendar.HOUR_OF_DAY, holder.getHour());
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
if (calendar.before(Calendar.getInstance()))
{
calendar.add(Calendar.WEEK_OF_YEAR, 2);
}
if (CastleManager.getInstance().getSiegeDates(calendar.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), calendar.getTimeInMillis());
if (CastleManager.getInstance().getSiegeDates(cal.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), cal.getTimeInMillis());
break;
}
Broadcast.toAllOnlinePlayers(new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME).addCastleId(_castle.getResidenceId()));
// Allow registration for next siege
_isRegistrationOver = false;
}
else
{
// Deny registration for next siege
_isRegistrationOver = true;
}
final SystemMessage sm = new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME);
sm.addCastleId(_castle.getResidenceId());
Broadcast.toAllOnlinePlayers(sm);
_isRegistrationOver = false; // Allow registration for next siege
}
/**

View File

@ -1,4 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../data/xsd/SiegeSchedule.xsd">
<schedule day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="1" castleName="Gludio" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="2" castleName="Dion" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="3" castleName="Giran" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="4" castleName="Oren" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="5" castleName="Aden" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
</list>

View File

@ -5,6 +5,9 @@
<xs:sequence>
<xs:element name="schedule" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute type="xs:byte" name="castleId" use="optional" />
<xs:attribute type="xs:string" name="castleName" use="optional" />
<xs:attribute type="xs:boolean" name="siegeEnabled" use="optional" />
<xs:attribute type="xs:string" name="day" use="optional" />
<xs:attribute type="xs:byte" name="hour" use="optional" />
<xs:attribute type="xs:byte" name="maxConcurrent" use="optional" />

View File

@ -17,9 +17,9 @@
package org.l2jmobius.gameserver.data.xml.impl;
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -39,7 +39,7 @@ public class SiegeScheduleData implements IXmlReader
{
private static final Logger LOGGER = Logger.getLogger(SiegeScheduleData.class.getName());
private final List<SiegeScheduleDate> _scheduleData = new ArrayList<>();
private final Map<Integer, SiegeScheduleDate> _scheduleData = new HashMap<>();
protected SiegeScheduleData()
{
@ -49,14 +49,8 @@ public class SiegeScheduleData implements IXmlReader
@Override
public synchronized void load()
{
_scheduleData.clear();
parseDatapackFile("config/SiegeSchedule.xml");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _scheduleData.size() + " siege schedulers.");
if (_scheduleData.isEmpty())
{
_scheduleData.add(new SiegeScheduleDate(new StatSet()));
LOGGER.info(getClass().getSimpleName() + ": Emergency loaded " + _scheduleData.size() + " default siege schedulers.");
}
}
@Override
@ -85,7 +79,7 @@ public class SiegeScheduleData implements IXmlReader
}
set.set(key, val);
}
_scheduleData.add(new SiegeScheduleDate(set));
_scheduleData.put(set.getInt("castleId"), new SiegeScheduleDate(set));
break;
}
}
@ -107,9 +101,9 @@ public class SiegeScheduleData implements IXmlReader
}
}
public List<SiegeScheduleDate> getScheduleDates()
public SiegeScheduleDate getScheduleDateForCastleId(int castleId)
{
return _scheduleData;
return _scheduleData.get(castleId);
}
public static SiegeScheduleData getInstance()

View File

@ -26,12 +26,14 @@ public class SiegeScheduleDate
private final int _day;
private final int _hour;
private final int _maxConcurrent;
private final boolean _siegeEnabled;
public SiegeScheduleDate(StatSet set)
{
_day = set.getInt("day", Calendar.SUNDAY);
_hour = set.getInt("hour", 16);
_maxConcurrent = set.getInt("maxConcurrent", 5);
_siegeEnabled = set.getBoolean("siegeEnabled", false);
}
public int getDay()
@ -48,4 +50,9 @@ public class SiegeScheduleDate
{
return _maxConcurrent;
}
public boolean siegeEnabled()
{
return _siegeEnabled;
}
}

View File

@ -1426,35 +1426,42 @@ public class Siege implements Siegable
/** Set the date for the next siege. */
private void setNextSiegeDate()
{
final Calendar cal = _castle.getSiegeDate();
if (cal.getTimeInMillis() < System.currentTimeMillis())
final SiegeScheduleDate holder = SiegeScheduleData.getInstance().getScheduleDateForCastleId(_castle.getResidenceId());
if (!holder.siegeEnabled())
{
cal.setTimeInMillis(System.currentTimeMillis());
return;
}
for (SiegeScheduleDate holder : SiegeScheduleData.getInstance().getScheduleDates())
final Calendar calendar = _castle.getSiegeDate();
if (calendar.getTimeInMillis() < System.currentTimeMillis())
{
cal.set(Calendar.DAY_OF_WEEK, holder.getDay());
cal.set(Calendar.HOUR_OF_DAY, holder.getHour());
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
if (cal.before(Calendar.getInstance()))
{
cal.add(Calendar.WEEK_OF_YEAR, 2);
}
calendar.setTimeInMillis(System.currentTimeMillis());
}
calendar.set(Calendar.DAY_OF_WEEK, holder.getDay());
calendar.set(Calendar.HOUR_OF_DAY, holder.getHour());
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
if (calendar.before(Calendar.getInstance()))
{
calendar.add(Calendar.WEEK_OF_YEAR, 2);
}
if (CastleManager.getInstance().getSiegeDates(calendar.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), calendar.getTimeInMillis());
if (CastleManager.getInstance().getSiegeDates(cal.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), cal.getTimeInMillis());
break;
}
Broadcast.toAllOnlinePlayers(new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME).addCastleId(_castle.getResidenceId()));
// Allow registration for next siege
_isRegistrationOver = false;
}
else
{
// Deny registration for next siege
_isRegistrationOver = true;
}
final SystemMessage sm = new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME);
sm.addCastleId(_castle.getResidenceId());
Broadcast.toAllOnlinePlayers(sm);
_isRegistrationOver = false; // Allow registration for next siege
}
/**

View File

@ -1,4 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../data/xsd/SiegeSchedule.xsd">
<schedule day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="1" castleName="Gludio" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="2" castleName="Dion" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="3" castleName="Giran" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="4" castleName="Oren" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="5" castleName="Aden" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
</list>

View File

@ -5,6 +5,9 @@
<xs:sequence>
<xs:element name="schedule" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute type="xs:byte" name="castleId" use="optional" />
<xs:attribute type="xs:string" name="castleName" use="optional" />
<xs:attribute type="xs:boolean" name="siegeEnabled" use="optional" />
<xs:attribute type="xs:string" name="day" use="optional" />
<xs:attribute type="xs:byte" name="hour" use="optional" />
<xs:attribute type="xs:byte" name="maxConcurrent" use="optional" />

View File

@ -17,9 +17,9 @@
package org.l2jmobius.gameserver.data.xml.impl;
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -39,7 +39,7 @@ public class SiegeScheduleData implements IXmlReader
{
private static final Logger LOGGER = Logger.getLogger(SiegeScheduleData.class.getName());
private final List<SiegeScheduleDate> _scheduleData = new ArrayList<>();
private final Map<Integer, SiegeScheduleDate> _scheduleData = new HashMap<>();
protected SiegeScheduleData()
{
@ -49,14 +49,8 @@ public class SiegeScheduleData implements IXmlReader
@Override
public synchronized void load()
{
_scheduleData.clear();
parseDatapackFile("config/SiegeSchedule.xml");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _scheduleData.size() + " siege schedulers.");
if (_scheduleData.isEmpty())
{
_scheduleData.add(new SiegeScheduleDate(new StatSet()));
LOGGER.info(getClass().getSimpleName() + ": Emergency loaded " + _scheduleData.size() + " default siege schedulers.");
}
}
@Override
@ -85,7 +79,7 @@ public class SiegeScheduleData implements IXmlReader
}
set.set(key, val);
}
_scheduleData.add(new SiegeScheduleDate(set));
_scheduleData.put(set.getInt("castleId"), new SiegeScheduleDate(set));
break;
}
}
@ -107,9 +101,9 @@ public class SiegeScheduleData implements IXmlReader
}
}
public List<SiegeScheduleDate> getScheduleDates()
public SiegeScheduleDate getScheduleDateForCastleId(int castleId)
{
return _scheduleData;
return _scheduleData.get(castleId);
}
public static SiegeScheduleData getInstance()

View File

@ -26,12 +26,14 @@ public class SiegeScheduleDate
private final int _day;
private final int _hour;
private final int _maxConcurrent;
private final boolean _siegeEnabled;
public SiegeScheduleDate(StatSet set)
{
_day = set.getInt("day", Calendar.SUNDAY);
_hour = set.getInt("hour", 16);
_maxConcurrent = set.getInt("maxConcurrent", 5);
_siegeEnabled = set.getBoolean("siegeEnabled", false);
}
public int getDay()
@ -48,4 +50,9 @@ public class SiegeScheduleDate
{
return _maxConcurrent;
}
public boolean siegeEnabled()
{
return _siegeEnabled;
}
}

View File

@ -1426,35 +1426,42 @@ public class Siege implements Siegable
/** Set the date for the next siege. */
private void setNextSiegeDate()
{
final Calendar cal = _castle.getSiegeDate();
if (cal.getTimeInMillis() < System.currentTimeMillis())
final SiegeScheduleDate holder = SiegeScheduleData.getInstance().getScheduleDateForCastleId(_castle.getResidenceId());
if (!holder.siegeEnabled())
{
cal.setTimeInMillis(System.currentTimeMillis());
return;
}
for (SiegeScheduleDate holder : SiegeScheduleData.getInstance().getScheduleDates())
final Calendar calendar = _castle.getSiegeDate();
if (calendar.getTimeInMillis() < System.currentTimeMillis())
{
cal.set(Calendar.DAY_OF_WEEK, holder.getDay());
cal.set(Calendar.HOUR_OF_DAY, holder.getHour());
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
if (cal.before(Calendar.getInstance()))
{
cal.add(Calendar.WEEK_OF_YEAR, 2);
}
calendar.setTimeInMillis(System.currentTimeMillis());
}
calendar.set(Calendar.DAY_OF_WEEK, holder.getDay());
calendar.set(Calendar.HOUR_OF_DAY, holder.getHour());
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
if (calendar.before(Calendar.getInstance()))
{
calendar.add(Calendar.WEEK_OF_YEAR, 2);
}
if (CastleManager.getInstance().getSiegeDates(calendar.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), calendar.getTimeInMillis());
if (CastleManager.getInstance().getSiegeDates(cal.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), cal.getTimeInMillis());
break;
}
Broadcast.toAllOnlinePlayers(new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME).addCastleId(_castle.getResidenceId()));
// Allow registration for next siege
_isRegistrationOver = false;
}
else
{
// Deny registration for next siege
_isRegistrationOver = true;
}
final SystemMessage sm = new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME);
sm.addCastleId(_castle.getResidenceId());
Broadcast.toAllOnlinePlayers(sm);
_isRegistrationOver = false; // Allow registration for next siege
}
/**

View File

@ -1,5 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../data/xsd/SiegeSchedule.xsd">
<schedule day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="1" castleName="Gludio" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="2" castleName="Dion" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="3" castleName="Giran" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="4" castleName="Oren" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="5" castleName="Aden" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="6" castleName="Innadril" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="7" castleName="Goddard" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
<schedule castleId="8" castleName="Rune" siegeEnabled="true" day="SUNDAY" hour="20" maxConcurrent="5" />
<schedule castleId="9" castleName="Schuttgart" siegeEnabled="true" day="SUNDAY" hour="16" maxConcurrent="5" />
</list>

View File

@ -5,6 +5,9 @@
<xs:sequence>
<xs:element name="schedule" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute type="xs:byte" name="castleId" use="optional" />
<xs:attribute type="xs:string" name="castleName" use="optional" />
<xs:attribute type="xs:boolean" name="siegeEnabled" use="optional" />
<xs:attribute type="xs:string" name="day" use="optional" />
<xs:attribute type="xs:byte" name="hour" use="optional" />
<xs:attribute type="xs:byte" name="maxConcurrent" use="optional" />

View File

@ -17,9 +17,9 @@
package org.l2jmobius.gameserver.data.xml.impl;
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -39,7 +39,7 @@ public class SiegeScheduleData implements IXmlReader
{
private static final Logger LOGGER = Logger.getLogger(SiegeScheduleData.class.getName());
private final List<SiegeScheduleDate> _scheduleData = new ArrayList<>();
private final Map<Integer, SiegeScheduleDate> _scheduleData = new HashMap<>();
protected SiegeScheduleData()
{
@ -49,14 +49,8 @@ public class SiegeScheduleData implements IXmlReader
@Override
public synchronized void load()
{
_scheduleData.clear();
parseDatapackFile("config/SiegeSchedule.xml");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _scheduleData.size() + " siege schedulers.");
if (_scheduleData.isEmpty())
{
_scheduleData.add(new SiegeScheduleDate(new StatSet()));
LOGGER.info(getClass().getSimpleName() + ": Emergency loaded " + _scheduleData.size() + " default siege schedulers.");
}
}
@Override
@ -85,7 +79,7 @@ public class SiegeScheduleData implements IXmlReader
}
set.set(key, val);
}
_scheduleData.add(new SiegeScheduleDate(set));
_scheduleData.put(set.getInt("castleId"), new SiegeScheduleDate(set));
break;
}
}
@ -107,9 +101,9 @@ public class SiegeScheduleData implements IXmlReader
}
}
public List<SiegeScheduleDate> getScheduleDates()
public SiegeScheduleDate getScheduleDateForCastleId(int castleId)
{
return _scheduleData;
return _scheduleData.get(castleId);
}
public static SiegeScheduleData getInstance()

View File

@ -26,12 +26,14 @@ public class SiegeScheduleDate
private final int _day;
private final int _hour;
private final int _maxConcurrent;
private final boolean _siegeEnabled;
public SiegeScheduleDate(StatSet set)
{
_day = set.getInt("day", Calendar.SUNDAY);
_hour = set.getInt("hour", 16);
_maxConcurrent = set.getInt("maxConcurrent", 5);
_siegeEnabled = set.getBoolean("siegeEnabled", false);
}
public int getDay()
@ -48,4 +50,9 @@ public class SiegeScheduleDate
{
return _maxConcurrent;
}
public boolean siegeEnabled()
{
return _siegeEnabled;
}
}

View File

@ -1426,35 +1426,42 @@ public class Siege implements Siegable
/** Set the date for the next siege. */
private void setNextSiegeDate()
{
final Calendar cal = _castle.getSiegeDate();
if (cal.getTimeInMillis() < System.currentTimeMillis())
final SiegeScheduleDate holder = SiegeScheduleData.getInstance().getScheduleDateForCastleId(_castle.getResidenceId());
if (!holder.siegeEnabled())
{
cal.setTimeInMillis(System.currentTimeMillis());
return;
}
for (SiegeScheduleDate holder : SiegeScheduleData.getInstance().getScheduleDates())
final Calendar calendar = _castle.getSiegeDate();
if (calendar.getTimeInMillis() < System.currentTimeMillis())
{
cal.set(Calendar.DAY_OF_WEEK, holder.getDay());
cal.set(Calendar.HOUR_OF_DAY, holder.getHour());
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
if (cal.before(Calendar.getInstance()))
{
cal.add(Calendar.WEEK_OF_YEAR, 2);
}
calendar.setTimeInMillis(System.currentTimeMillis());
}
calendar.set(Calendar.DAY_OF_WEEK, holder.getDay());
calendar.set(Calendar.HOUR_OF_DAY, holder.getHour());
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
if (calendar.before(Calendar.getInstance()))
{
calendar.add(Calendar.WEEK_OF_YEAR, 2);
}
if (CastleManager.getInstance().getSiegeDates(calendar.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), calendar.getTimeInMillis());
if (CastleManager.getInstance().getSiegeDates(cal.getTimeInMillis()) < holder.getMaxConcurrent())
{
CastleManager.getInstance().registerSiegeDate(getCastle().getResidenceId(), cal.getTimeInMillis());
break;
}
Broadcast.toAllOnlinePlayers(new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME).addCastleId(_castle.getResidenceId()));
// Allow registration for next siege
_isRegistrationOver = false;
}
else
{
// Deny registration for next siege
_isRegistrationOver = true;
}
final SystemMessage sm = new SystemMessage(SystemMessageId.S1_HAS_ANNOUNCED_THE_NEXT_CASTLE_SIEGE_TIME);
sm.addCastleId(_castle.getResidenceId());
Broadcast.toAllOnlinePlayers(sm);
_isRegistrationOver = false; // Allow registration for next siege
}
/**