浏览代码

Fort siege bugfixes and unhardcoding of the bypasses. Require DP update.

_DS_ 15 年之前
父节点
当前提交
b1fb020628

+ 1 - 69
L2_GameServer/java/com/l2jserver/gameserver/model/actor/instance/L2FortSiegeNpcInstance.java

@@ -14,14 +14,8 @@
  */
 package com.l2jserver.gameserver.model.actor.instance;
 
-import java.util.StringTokenizer;
-
-import com.l2jserver.gameserver.instancemanager.TerritoryWarManager;
-import com.l2jserver.gameserver.model.L2Clan;
-import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
-import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 import com.l2jserver.gameserver.templates.chars.L2NpcTemplate;
 
 /**
@@ -36,69 +30,7 @@ public class L2FortSiegeNpcInstance extends L2NpcWalkerInstance
 	}
 
 	@Override
-	public void onBypassFeedback(L2PcInstance player, String command)
-	{
-		StringTokenizer st = new StringTokenizer(command, " ");
-		String actualCommand = st.nextToken(); // Get actual command
-
-		String par = "";
-		if (st.countTokens() >= 1)
-			par = st.nextToken();
-
-		if (actualCommand.equalsIgnoreCase("Chat"))
-		{
-			int val = 0;
-			try
-			{
-				val = Integer.parseInt(par);
-			}
-			catch (IndexOutOfBoundsException ioobe){}
-			catch (NumberFormatException nfe){}
-
-			showMessageWindow(player, val);
-		}
-		else if (actualCommand.equalsIgnoreCase("register"))
-		{
-			if ((player.getClanPrivileges() & L2Clan.CP_CS_MANAGE_SIEGE) == L2Clan.CP_CS_MANAGE_SIEGE)
-			{
-				if (System.currentTimeMillis() < TerritoryWarManager.getInstance().getTWStartTimeInMillis()
-						&& TerritoryWarManager.getInstance().getIsRegistrationOver())
-					player.sendPacket(new SystemMessage(SystemMessageId.NOT_SIEGE_REGISTRATION_TIME2));
-				else if (System.currentTimeMillis() > TerritoryWarManager.getInstance().getTWStartTimeInMillis()
-						&& TerritoryWarManager.getInstance().isTWChannelOpen())
-					player.sendPacket(new SystemMessage(SystemMessageId.NOT_SIEGE_REGISTRATION_TIME2));
-				else if (getFort().getSiege().registerAttacker(player, false))
-				{
-					SystemMessage sm = new SystemMessage(SystemMessageId.REGISTERED_TO_S1_FORTRESS_BATTLE);
-					sm.addString(getFort().getName());
-					player.sendPacket(sm);
-					showMessageWindow(player, 7);
-				}
-			}
-			else
-				showMessageWindow(player, 10);
-		}
-		else if (actualCommand.equalsIgnoreCase("unregister"))
-		{
-			if ((player.getClanPrivileges() & L2Clan.CP_CS_MANAGE_SIEGE) == L2Clan.CP_CS_MANAGE_SIEGE)
-			{
-				getFort().getSiege().removeSiegeClan(player);
-				showMessageWindow(player, 8);
-			}
-			else
-				showMessageWindow(player, 10);
-		}
-		else
-			super.onBypassFeedback(player, command);
-	}
-
-	@Override
-	public void showChatWindow(L2PcInstance player)
-	{
-		showMessageWindow(player, 0);
-	}
-
-	private void showMessageWindow(L2PcInstance player, int val)
+	public void showChatWindow(L2PcInstance player, int val)
 	{
 		player.sendPacket(ActionFailed.STATIC_PACKET);
 

+ 18 - 59
L2_GameServer/java/com/l2jserver/gameserver/model/entity/Fort.java

@@ -84,9 +84,10 @@ public class Fort
 	private ScheduledFuture<?> _FortUpdater;
 	
 	// Spawn Data
-	protected FastList<L2Spawn> _siegeNpcs = new FastList<L2Spawn>();
-	protected FastList<L2Spawn> _npcCommanders = new FastList<L2Spawn>();
-	protected FastList<L2Spawn> _specialEnvoys = new FastList<L2Spawn>();
+	private boolean _isSuspiciousMerchantSpawned = false;
+	private FastList<L2Spawn> _siegeNpcs = new FastList<L2Spawn>();
+	private FastList<L2Spawn> _npcCommanders = new FastList<L2Spawn>();
+	private FastList<L2Spawn> _specialEnvoys = new FastList<L2Spawn>();
 	
 	private TIntIntHashMap _envoyCastles = new TIntIntHashMap(2);
 	
@@ -238,7 +239,6 @@ public class Fort
 				}
 				catch (Exception e)
 				{
-					e.printStackTrace();
 				}
 			}
 		}
@@ -261,13 +261,13 @@ public class Fort
 		}
 		initNpcs(); // load and spawn npcs (Always spawned)
 		initSiegeNpcs(); // load suspicious merchants (Despawned 10mins before siege)
-		spawnNpcs(_siegeNpcs);// spawn suspicious merchants
+		//spawnSuspiciousMerchant();// spawn suspicious merchants
 		initNpcCommanders(); // npc Commanders (not monsters) (Spawned during siege)
-		spawnNpcs(_npcCommanders); // spawn npc Commanders
+		spawnNpcCommanders(); // spawn npc Commanders
 		initSpecialEnvoys(); // envoys from castles  (Spawned after fort taken)
 		if (getOwnerClan() != null && getFortState() == 0)
 		{
-			spawnNpcs(_specialEnvoys);
+			spawnSpecialEnvoys();
 			ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleSpecialEnvoysDeSpawn(this), 1 * 60 * 60 * 1000); // Prepare 1hr task for special envoys despawn
 		}
 	}
@@ -296,7 +296,7 @@ public class Fort
 				// if state not decided, change state to indenpendent
 				if (_fortInst.getFortState() == 0)
 					_fortInst.setFortState(1, 0);
-				_fortInst.despawnNpcs(_specialEnvoys);
+				_fortInst.despawnSpecialEnvoys();
 			}
 			catch (Exception e)
 			{
@@ -432,7 +432,7 @@ public class Fort
 		}
 		else
 		{
-			spawnNpcs(_specialEnvoys);
+			spawnSpecialEnvoys();
 			ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleSpecialEnvoysDeSpawn(this), 1 * 60 * 60 * 1000); // Prepare 1hr task for special envoys despawn
 			// if clan have already fortress, remove it
 			if (clan.getHasFort() > 0)
@@ -502,8 +502,6 @@ public class Fort
 			}
 			catch (Exception e)
 			{
-				_log.warning("" + e.getMessage());
-				e.printStackTrace();
 			}
 		}
 	}
@@ -545,9 +543,6 @@ public class Fort
 	public void upgradeDoor(int doorId, int hp, int pDef, int mDef)
 	{
 		L2DoorInstance door = getDoor(doorId);
-		if (door == null)
-			return;
-		
 		if (door != null && door.getDoorId() == doorId)
 		{
 			door.setCurrentHp(door.getMaxHp() + hp);
@@ -622,8 +617,6 @@ public class Fort
 			}
 			catch (Exception e)
 			{
-				_log.warning("" + e.getMessage());
-				e.printStackTrace();
 			}
 		}
 	}
@@ -780,8 +773,6 @@ public class Fort
 			}
 			catch (Exception e)
 			{
-				_log.warning("" + e.getMessage());
-				e.printStackTrace();
 			}
 		}
 	}
@@ -821,8 +812,6 @@ public class Fort
 			}
 			catch (Exception e)
 			{
-				_log.warning("" + e.getMessage());
-				e.printStackTrace();
 			}
 		}
 	}
@@ -859,8 +848,6 @@ public class Fort
 			}
 			catch (Exception e)
 			{
-				_log.warning("" + e.getMessage());
-				e.printStackTrace();
 			}
 		}
 	}
@@ -890,8 +877,6 @@ public class Fort
 			}
 			catch (Exception e)
 			{
-				_log.warning("" + e.getMessage());
-				e.printStackTrace();
 			}
 		}
 	}
@@ -923,8 +908,6 @@ public class Fort
 			}
 			catch (Exception e)
 			{
-				_log.warning("" + e.getMessage());
-				e.printStackTrace();
 			}
 		}
 	}
@@ -996,8 +979,6 @@ public class Fort
 			}
 			catch (Exception e)
 			{
-				_log.warning("" + e.getMessage());
-				e.printStackTrace();
 			}
 		}
 	}
@@ -1158,8 +1139,6 @@ public class Fort
 			}
 			catch (Exception e)
 			{
-				_log.warning("" + e.getMessage());
-				e.printStackTrace();
 			}
 		}
 	}
@@ -1195,36 +1174,25 @@ public class Fort
 		return getFortType() == 0 ? 3 : 5;
 	}
 	
-	public void spawnNpcs(FastList<L2Spawn> spawnList)
-	{
-		for (L2Spawn spawnDat : spawnList)
-		{
-			spawnDat.doSpawn();
-			spawnDat.startRespawn();
-		}
-	}
-	
-	public void despawnNpcs(FastList<L2Spawn> spawnList)
-	{
-		for (L2Spawn spawnDat : spawnList)
-		{
-			spawnDat.stopRespawn();
-			spawnDat.getLastSpawn().deleteMe();
-		}
-	}
-	
-	/** FIXME: deleted
 	public void spawnSuspiciousMerchant()
 	{
+		if (_isSuspiciousMerchantSpawned)
+			return;
+		_isSuspiciousMerchantSpawned = true;
+
 		for (L2Spawn spawnDat : _siegeNpcs)
 		{
 			spawnDat.doSpawn();
 			spawnDat.startRespawn();
 		}
 	}
-	
+
 	public void despawnSuspiciousMerchant()
 	{
+		if (!_isSuspiciousMerchantSpawned)
+			return;
+		_isSuspiciousMerchantSpawned = false;
+
 		for (L2Spawn spawnDat : _siegeNpcs)
 		{
 			spawnDat.stopRespawn();
@@ -1267,7 +1235,6 @@ public class Fort
 			spawnDat.getLastSpawn().deleteMe();
 		}
 	}
-	**/
 	
 	private void initNpcs()
 	{
@@ -1323,8 +1290,6 @@ public class Fort
 			}
 			catch (Exception e)
 			{
-				_log.warning("" + e.getMessage());
-				e.printStackTrace();
 			}
 		}
 	}
@@ -1379,8 +1344,6 @@ public class Fort
 			}
 			catch (Exception e)
 			{
-				_log.warning("" + e.getMessage());
-				e.printStackTrace();
 			}
 		}
 	}
@@ -1436,8 +1399,6 @@ public class Fort
 			}
 			catch (Exception e)
 			{
-				_log.warning("" + e.getMessage());
-				e.printStackTrace();
 			}
 		}
 	}
@@ -1497,8 +1458,6 @@ public class Fort
 			}
 			catch (Exception e)
 			{
-				_log.warning("" + e.getMessage());
-				e.printStackTrace();
 			}
 		}
 	}

+ 71 - 39
L2_GameServer/java/com/l2jserver/gameserver/model/entity/FortSiege.java

@@ -117,7 +117,7 @@ public class FortSiege implements Siegable
 				}
 				else if (_time == 600) // 10min remains
 				{
-					getFort().despawnNpcs(getFort()._siegeNpcs);
+					getFort().despawnSuspiciousMerchant();
 					sm = new SystemMessage(SystemMessageId.S1_MINUTES_UNTIL_THE_FORTRESS_BATTLE_STARTS); 
 					sm.addNumber(10);
 					announceToPlayer(sm);
@@ -196,7 +196,7 @@ public class FortSiege implements Siegable
 
 			try
 			{
-				_fortInst.spawnNpcs(_fortInst._siegeNpcs);
+				_fortInst.spawnSuspiciousMerchant();
 			}
 			catch (Exception e)
 			{
@@ -261,6 +261,7 @@ public class FortSiege implements Siegable
 	{
 		if (getIsInProgress())
 		{
+			_isInProgress = false; // Flag so that siege instance can be started
 			final SystemMessage sm = new SystemMessage(SystemMessageId.THE_FORTRESS_BATTLE_OF_S1_HAS_FINISHED);
 			sm.addFortId(getFort().getFortId());
 			announceToPlayer(sm);
@@ -271,7 +272,6 @@ public class FortSiege implements Siegable
 			updatePlayerSiegeStateFlags(true);
 
 			getFort().getZone().banishForeigners(getFort().getOwnerClan());
-			_isInProgress = false; // Flag so that siege instance can be started
 			getFort().getZone().setIsActive(false);
 			getFort().getZone().updateZoneStatusForCharactersInside();
 
@@ -279,11 +279,13 @@ public class FortSiege implements Siegable
 			clearSiegeClan(); // Clear siege clan from db
 			removeCommanders(); // Remove commander from this fort
 
-			getFort().spawnNpcs(getFort()._npcCommanders); // Spawn NPC commanders
+			getFort().spawnNpcCommanders(); // Spawn NPC commanders
 			getSiegeGuardManager().unspawnSiegeGuard(); // Remove all spawned siege guard from this fort
 			getFort().resetDoors(); // Respawn door to fort
 
 			ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleSuspiciousMerchantSpawn(getFort()), FortSiegeManager.getInstance().getSuspiciousMerchantRespawnDelay()*60*1000); // Prepare 3hr task for suspicious merchant respawn
+			setSiegeDateTime(true); // store suspicious merchant spawn in DB
+
 			if (_siegeEnd != null)
 				_siegeEnd.cancel(true);
 			if (_siegeRestore != null)
@@ -291,6 +293,8 @@ public class FortSiege implements Siegable
 
 			if (getFort().getOwnerClan() != null && getFort().getFlagPole().getMeshIndex() == 0)
 				getFort().setVisibleFlag(true);
+
+			_log.info("Siege of " + getFort().getName() + " fort finished.");
 		}
 	}
 
@@ -304,7 +308,7 @@ public class FortSiege implements Siegable
 			if (_siegeStartTask != null) // used admin command "admin_startfortsiege"
 			{
 				_siegeStartTask.cancel(true);
-				getFort().despawnNpcs(getFort()._siegeNpcs);
+				getFort().despawnSuspiciousMerchant();
 			}
 			_siegeStartTask = null;
 
@@ -317,7 +321,7 @@ public class FortSiege implements Siegable
 			updatePlayerSiegeStateFlags(false);
 			teleportPlayer(FortSiege.TeleportWhoType.Attacker, MapRegionTable.TeleportWhereType.Town); // Teleport to the closest town
 
-			getFort().despawnNpcs(getFort()._npcCommanders); // Despawn NPC commanders
+			getFort().despawnNpcCommanders(); // Despawn NPC commanders
 			spawnCommanders(); // Spawn commanders
 			getFort().resetDoors(); // Spawn door
 			spawnSiegeGuard(); // Spawn siege guard
@@ -333,6 +337,8 @@ public class FortSiege implements Siegable
 			sm.addFortId(getFort().getFortId());
 			announceToPlayer(sm);
 			saveFortSiege();
+
+			_log.info("Siege of " + getFort().getName() + " fort started.");
 		}
 	}
 
@@ -524,12 +530,11 @@ public class FortSiege implements Siegable
 			if (getIsInProgress())
 				endSiege();
 
-			// if siege isnt in progress (1hr waiting time till siege starts), cancel waiting time and spawn Suspicious Merchant
+			// if siege isnt in progress (1hr waiting time till siege starts), cancel waiting time
 			if (_siegeStartTask != null)
 			{
 				_siegeStartTask.cancel(true);
 				_siegeStartTask = null;
-				ThreadPoolManager.getInstance().executeTask(new ScheduleSuspiciousMerchantSpawn(getFort()));
 			}
 		}
 		catch (Exception e)
@@ -553,8 +558,6 @@ public class FortSiege implements Siegable
 			}
 			catch (Exception e)
 			{
-				_log.warning("" + e.getMessage());
-            	e.printStackTrace();
 			}
 		}
 	}
@@ -720,6 +723,7 @@ public class FortSiege implements Siegable
 
 	/**
 	 * Remove clan from siege<BR><BR>
+	 * This function does not do any checks and should not be called from bypass !
 	 * @param clanId The int of player's clan id
 	 */
 	public void removeSiegeClan(int clanId)
@@ -744,12 +748,13 @@ public class FortSiege implements Siegable
 			{
 				if (getIsInProgress())
 					endSiege();
+				else
+					saveFortSiege(); // Clear siege time in DB
 
 				if (_siegeStartTask != null)
 				{
 					_siegeStartTask.cancel(true);
 					_siegeStartTask = null;
-					ThreadPoolManager.getInstance().executeTask(new ScheduleSuspiciousMerchantSpawn(getFort()));
 				}
 			}
 		}
@@ -774,48 +779,73 @@ public class FortSiege implements Siegable
 			}
 			catch (Exception e)
 			{
-				_log.warning(""+e.getMessage());
-            	e.printStackTrace();
 			}
 		}
 	}
 
 	/**
 	 * Remove clan from siege<BR><BR>
-	 * @param player The L2PcInstance of player/clan being removed
+	 * @paramclan The clan being removed
 	 */
 	public void removeSiegeClan(L2Clan clan)
 	{
-		if (clan == null || clan.getHasFort() == getFort().getFortId() || !FortSiegeManager.getInstance().checkIsRegistered(clan, getFort().getFortId()))
+		if (clan == null
+				|| clan.getHasFort() == getFort().getFortId()
+				|| !FortSiegeManager.getInstance().checkIsRegistered(clan, getFort().getFortId()))
 			return;
 
 		removeSiegeClan(clan.getClanId());
 	}
 
-	/**
-	 * Remove clan from siege<BR><BR>
-	 * @param player The L2PcInstance of player/clan being removed
-	 */
-	public void removeSiegeClan(L2PcInstance player)
-	{
-		removeSiegeClan(player.getClan());
-	}
-
 	/**
 	 * Start the auto tasks<BR>
 	 * <BR>
 	 */
 	public void checkAutoTask()
 	{
-		if (getFort().getSiegeDate().getTimeInMillis() < Calendar.getInstance().getTimeInMillis())
+		if (_siegeStartTask != null) //safety check
+			return;
+
+		final long delay = getFort().getSiegeDate().getTimeInMillis() - Calendar.getInstance().getTimeInMillis();
+		
+		if (delay < 0)
 		{
-			clearSiegeDate();
-			saveSiegeDate();
-			removeSiegeClan(0); // remove all clans
+			// siege time in past
+			saveFortSiege();
+			clearSiegeClan(); // remove all clans
+			// spawn suspicious merchant immediately
+			ThreadPoolManager.getInstance().executeTask(new ScheduleSuspiciousMerchantSpawn(getFort()));
 			return;
 		}
-
-		startAutoTask(false);
+		else
+		{
+			loadSiegeClan();
+			if (getAttackerClans().isEmpty())
+				// no attackers - waiting for suspicious merchant spawn
+				ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleSuspiciousMerchantSpawn(getFort()), delay);
+			else
+			{
+				// preparing start siege task
+				if (delay > 3600000) // more than hour, how this can happens ? spawn suspicious merchant
+				{
+					ThreadPoolManager.getInstance().executeTask(new ScheduleSuspiciousMerchantSpawn(getFort()));
+					_siegeStartTask = ThreadPoolManager.getInstance().scheduleGeneral(new FortSiege.ScheduleStartSiegeTask(getFort(), 3600), delay - 3600000);
+				}
+				if (delay > 600000) // more than 10 min, spawn suspicious merchant
+				{
+					ThreadPoolManager.getInstance().executeTask(new ScheduleSuspiciousMerchantSpawn(getFort()));
+					_siegeStartTask = ThreadPoolManager.getInstance().scheduleGeneral(new FortSiege.ScheduleStartSiegeTask(getFort(), 600), delay - 600000);
+				}
+				else if (delay > 300000) // more than 5 min
+					_siegeStartTask = ThreadPoolManager.getInstance().scheduleGeneral(new FortSiege.ScheduleStartSiegeTask(getFort(), 300), delay - 300000);
+				else if (delay > 60000) //more than 1 min
+					_siegeStartTask = ThreadPoolManager.getInstance().scheduleGeneral(new FortSiege.ScheduleStartSiegeTask(getFort(), 60), delay - 60000);
+				else // lower than 1 min, set to 1 min
+					_siegeStartTask = ThreadPoolManager.getInstance().scheduleGeneral(new FortSiege.ScheduleStartSiegeTask(getFort(), 60), 0);
+
+				_log.info("Siege of " + getFort().getName() + " fort: " + getFort().getSiegeDate().getTime());
+			}
+		}
 	}
 
 	/**
@@ -823,16 +853,15 @@ public class FortSiege implements Siegable
 	 */
 	public void startAutoTask(boolean setTime)
 	{
+		if (_siegeStartTask != null)
+			return;
+
 		if (setTime)
-			setSiegeDateTime();
+			setSiegeDateTime(false);
 
 		if (getFort().getOwnerClan() != null)
-		{
-			L2Clan clan = ClanTable.getInstance().getClan(getFort().getOwnerClan().getClanId());
-			for (L2PcInstance member : clan.getOnlineMembers(0))
-				member.sendPacket(new SystemMessage(SystemMessageId.A_FORTRESS_IS_UNDER_ATTACK));
-		}
-		loadSiegeClan();
+			getFort().getOwnerClan().broadcastToOnlineMembers(new SystemMessage(SystemMessageId.A_FORTRESS_IS_UNDER_ATTACK));
+
 		// Execute siege auto start
 		_siegeStartTask = ThreadPoolManager.getInstance().scheduleGeneral(new FortSiege.ScheduleStartSiegeTask(getFort(),3600), 0);
 	}
@@ -950,10 +979,13 @@ public class FortSiege implements Siegable
 		return false;
 	}
 
-	private void setSiegeDateTime()
+	private void setSiegeDateTime(boolean merchant)
 	{
 		Calendar newDate = Calendar.getInstance();
-		newDate.add(Calendar.MINUTE, 60);
+		if (merchant)
+			newDate.add(Calendar.MINUTE, FortSiegeManager.getInstance().getSuspiciousMerchantRespawnDelay());
+		else
+			newDate.add(Calendar.MINUTE, 60);
 		getFort().setSiegeDate(newDate);
 		saveSiegeDate();
 	}