Addition of extended SiegeSchedule configurations.
Contributed by Trance.
This commit is contained in:
		| @@ -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> | ||||
| @@ -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" /> | ||||
|   | ||||
| @@ -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
	 MobiusDevelopment
					MobiusDevelopment