Addition of extended SiegeSchedule configurations.
Contributed by Trance.
This commit is contained in:
@ -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()
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user