Kaynağa Gözat

Siegable hall update:
- Updating to round based siege (retail like) bandit's stronghold and wild beast reserver sieges
- Fixing aucioner bug
- Make zone spawns location load and build more dynamic
- Improving admin siegable object doors commands
- Fixing siegable hall admin command npe

BiggBoss 13 yıl önce
ebeveyn
işleme
af485b27e2

+ 2 - 18
L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/ZoneManager.java

@@ -353,24 +353,8 @@ public class ZoneManager
 										int spawnX = Integer.parseInt(attrs.getNamedItem("X").getNodeValue());
 										int spawnY = Integer.parseInt(attrs.getNamedItem("Y").getNodeValue());
 										int spawnZ = Integer.parseInt(attrs.getNamedItem("Z").getNodeValue());
-										
-										Node val = attrs.getNamedItem("isOther");
-										boolean other = val != null && Boolean.parseBoolean(val.getNodeValue());
-										
-										val = attrs.getNamedItem("isChaotic");
-										boolean chaotic = val != null && Boolean.parseBoolean(val.getNodeValue());
-										
-										val = attrs.getNamedItem("isBanish");
-										boolean banish = val != null && Boolean.parseBoolean(val.getNodeValue());
-										
-										if (other)
-											((L2ZoneRespawn) temp).addOtherSpawn(spawnX, spawnY, spawnZ);
-										else if (chaotic)
-											((L2ZoneRespawn) temp).addChaoticSpawn(spawnX, spawnY, spawnZ);
-										else if (banish)
-											((L2ZoneRespawn) temp).addBanishSpawn(spawnX, spawnY, spawnZ);
-										else
-											((L2ZoneRespawn) temp).addSpawn(spawnX, spawnY, spawnZ);
+										Node val = attrs.getNamedItem("type");
+										((L2ZoneRespawn)temp).parseLoc(spawnX, spawnY, spawnZ, val == null? null : val.getNodeValue());
 									}
 									else if ("race".equalsIgnoreCase(cd.getNodeName()) && temp instanceof L2RespawnZone)
 									{

+ 10 - 10
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2AuctioneerInstance.java

@@ -165,12 +165,12 @@ public final class L2AuctioneerInstance extends L2Npc
 						html.replace("%OWNER_PLEDGE_MASTER%", a.getSellerName());
 						html.replace("%AGIT_SIZE%", String.valueOf(ClanHallManager.getInstance().getAuctionableHallById(a.getItemId()).getGrade()*10));
 						html.replace("%AGIT_LEASE%", String.valueOf(ClanHallManager.getInstance().getAuctionableHallById(a.getItemId()).getLease()));
-						html.replace("%AGIT_LOCATION%", ClanHallManager.getInstance().getClanHallById(a.getItemId()).getLocation());
+						html.replace("%AGIT_LOCATION%", ClanHallManager.getInstance().getAuctionableHallById(a.getItemId()).getLocation());
 						html.replace("%AGIT_AUCTION_END%", String.valueOf(format.format(a.getEndDate())));
 						html.replace("%AGIT_AUCTION_REMAIN%", String.valueOf((a.getEndDate()- System.currentTimeMillis())/3600000)+" hours "+String.valueOf((((a.getEndDate() - System.currentTimeMillis()) / 60000) % 60))+" minutes");
 						html.replace("%AGIT_AUCTION_MINBID%", String.valueOf(a.getStartingBid()));
 						html.replace("%AGIT_AUCTION_COUNT%", String.valueOf(a.getBidders().size()));
-						html.replace("%AGIT_AUCTION_DESC%", ClanHallManager.getInstance().getClanHallById(a.getItemId()).getDesc());
+						html.replace("%AGIT_AUCTION_DESC%", ClanHallManager.getInstance().getAuctionableHallById(a.getItemId()).getDesc());
 						html.replace("%AGIT_LINK_BACK%", "bypass -h npc_"+getObjectId()+"_list");
 						html.replace("%AGIT_LINK_BIDLIST%", "bypass -h npc_"+getObjectId()+"_bidlist "+a.getId());
 						html.replace("%AGIT_LINK_RE%", "bypass -h npc_"+getObjectId()+"_bid1 "+a.getId());
@@ -309,7 +309,7 @@ public final class L2AuctioneerInstance extends L2Npc
 					
 					items.append("<tr>");
 					items.append("<td>");
-					items.append(ClanHallManager.getInstance().getClanHallById(a.getItemId()).getLocation());
+					items.append(ClanHallManager.getInstance().getAuctionableHallById(a.getItemId()).getLocation());
 					items.append("</td>");
 					items.append("<td><a action=\"bypass -h npc_");
 					items.append(getObjectId());
@@ -386,12 +386,12 @@ public final class L2AuctioneerInstance extends L2Npc
 						html.replace("%OWNER_PLEDGE_MASTER%", a.getSellerName());
 						html.replace("%AGIT_SIZE%", String.valueOf(ClanHallManager.getInstance().getAuctionableHallById(a.getItemId()).getGrade()*10));
 						html.replace("%AGIT_LEASE%", String.valueOf(ClanHallManager.getInstance().getAuctionableHallById(a.getItemId()).getLease()));
-						html.replace("%AGIT_LOCATION%", ClanHallManager.getInstance().getClanHallById(a.getItemId()).getLocation());
+						html.replace("%AGIT_LOCATION%", ClanHallManager.getInstance().getAuctionableHallById(a.getItemId()).getLocation());
 						html.replace("%AGIT_AUCTION_END%", String.valueOf(format.format(a.getEndDate())));
 						html.replace("%AGIT_AUCTION_REMAIN%", String.valueOf((a.getEndDate()-System.currentTimeMillis()) / 3600000)+" hours "+String.valueOf((((a.getEndDate()-System.currentTimeMillis()) / 60000) % 60))+" minutes");
 						html.replace("%AGIT_AUCTION_MINBID%", String.valueOf(a.getStartingBid()));
 						html.replace("%AGIT_AUCTION_MYBID%", String.valueOf(a.getBidders().get(player.getClanId()).getBid()));
-						html.replace("%AGIT_AUCTION_DESC%", ClanHallManager.getInstance().getClanHallById(a.getItemId()).getDesc());
+						html.replace("%AGIT_AUCTION_DESC%", ClanHallManager.getInstance().getAuctionableHallById(a.getItemId()).getDesc());
 						html.replace("%objectId%", String.valueOf(getObjectId()));
 						html.replace("%AGIT_LINK_BACK%", "bypass -h npc_"+getObjectId()+"_start");
 					}
@@ -415,12 +415,12 @@ public final class L2AuctioneerInstance extends L2Npc
 						html.replace("%OWNER_PLEDGE_MASTER%", a.getSellerName());
 						html.replace("%AGIT_SIZE%", String.valueOf(ClanHallManager.getInstance().getAuctionableHallById(a.getItemId()).getGrade()*10));
 						html.replace("%AGIT_LEASE%", String.valueOf(ClanHallManager.getInstance().getAuctionableHallById(a.getItemId()).getLease()));
-						html.replace("%AGIT_LOCATION%", ClanHallManager.getInstance().getClanHallById(a.getItemId()).getLocation());
+						html.replace("%AGIT_LOCATION%", ClanHallManager.getInstance().getAuctionableHallById(a.getItemId()).getLocation());
 						html.replace("%AGIT_AUCTION_END%", String.valueOf(format.format(a.getEndDate())));
 						html.replace("%AGIT_AUCTION_REMAIN%", String.valueOf((a.getEndDate()-System.currentTimeMillis()) / 3600000)+" hours "+String.valueOf((((a.getEndDate()-System.currentTimeMillis()) / 60000) % 60))+" minutes");
 						html.replace("%AGIT_AUCTION_MINBID%", String.valueOf(a.getStartingBid()));
 						html.replace("%AGIT_AUCTION_BIDCOUNT%", String.valueOf(a.getBidders().size()));
-						html.replace("%AGIT_AUCTION_DESC%", ClanHallManager.getInstance().getClanHallById(a.getItemId()).getDesc());
+						html.replace("%AGIT_AUCTION_DESC%", ClanHallManager.getInstance().getAuctionableHallById(a.getItemId()).getDesc());
 						html.replace("%AGIT_LINK_BACK%", "bypass -h npc_"+getObjectId()+"_start");
 						html.replace("%id%", String.valueOf(a.getId()));
 						html.replace("%objectId%", String.valueOf(getObjectId()));
@@ -437,14 +437,14 @@ public final class L2AuctioneerInstance extends L2Npc
 					String filename = "data/html/auction/AgitInfo.htm";
 					NpcHtmlMessage html = new NpcHtmlMessage(1);
 					html.setFile(player.getHtmlPrefix(), filename);
-					if (ClanHallManager.getInstance().getClanHallById(ItemId) != null)
+					if (ClanHallManager.getInstance().getAuctionableHallById(ItemId) != null)
 					{
-						html.replace("%AGIT_NAME%", ClanHallManager.getInstance().getClanHallById(ItemId).getName());
+						html.replace("%AGIT_NAME%", ClanHallManager.getInstance().getAuctionableHallById(ItemId).getName());
 						html.replace("%AGIT_OWNER_PLEDGE_NAME%", player.getClan().getName());
 						html.replace("%OWNER_PLEDGE_MASTER%", player.getClan().getLeaderName());
 						html.replace("%AGIT_SIZE%", String.valueOf(ClanHallManager.getInstance().getAuctionableHallById(ItemId).getGrade()*10));
 						html.replace("%AGIT_LEASE%", String.valueOf(ClanHallManager.getInstance().getAuctionableHallById(ItemId).getLease()));
-						html.replace("%AGIT_LOCATION%", ClanHallManager.getInstance().getClanHallById(ItemId).getLocation());
+						html.replace("%AGIT_LOCATION%", ClanHallManager.getInstance().getAuctionableHallById(ItemId).getLocation());
 						html.replace("%AGIT_LINK_BACK%", "bypass -h npc_"+getObjectId()+"_start");
 						html.replace("%objectId%", String.valueOf(getObjectId()));
 					}

+ 4 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2ClanHallManagerInstance.java

@@ -28,6 +28,7 @@ import com.l2jserver.gameserver.model.L2Skill;
 import com.l2jserver.gameserver.model.L2TeleportLocation;
 import com.l2jserver.gameserver.model.entity.ClanHall;
 import com.l2jserver.gameserver.model.entity.clanhall.AuctionableHall;
+import com.l2jserver.gameserver.model.entity.clanhall.SiegableHall;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 import com.l2jserver.gameserver.network.serverpackets.AgitDecoInfo;
@@ -63,6 +64,9 @@ public class L2ClanHallManagerInstance extends L2MerchantInstance
 	@Override
 	public void onBypassFeedback(L2PcInstance player, String command)
 	{
+		if(getClanHall().isSiegableHall() && ((SiegableHall)getClanHall()).isInSiege())
+			return;
+		
 		int condition = validateCondition(player);
 		if (condition <= COND_ALL_FALSE)
 			return;

+ 1 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2DoorInstance.java

@@ -418,6 +418,7 @@ public class L2DoorInstance extends L2Character
 			if(!getClanHall().isSiegableHall())
 				return false;
 			return ((SiegableHall)getClanHall()).isInSiege()
+					&& ((SiegableHall)getClanHall()).getSiege().doorIsAutoAttackable()
 					&& ((SiegableHall)getClanHall()).getSiege().checkIsAttacker(actingPlayer.getClan());
 		}
 		// Attackable  only during siege by everyone (not owner)

+ 6 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/clanhall/ClanHallSiegeEngine.java

@@ -316,7 +316,7 @@ public abstract class ClanHallSiegeEngine extends Quest implements Siegable
 		}
 		
 		_hall.free();
-		
+		_hall.banishForeigners();
 		SystemMessage msg = SystemMessage.getSystemMessage(SystemMessageId.REGISTRATION_TERM_FOR_S1_ENDED);
 		msg.addString(getName());
 		Announcements.getInstance().announceToAll(msg);
@@ -341,7 +341,6 @@ public abstract class ClanHallSiegeEngine extends Quest implements Siegable
 			return;
 		}
 		
-		_hall.banishForeigners();
 		_hall.spawnDoor();
 		loadGuards();
 		spawnSiegeGuards();
@@ -495,6 +494,11 @@ public abstract class ClanHallSiegeEngine extends Quest implements Siegable
 	{
 		return true;
 	}
+	
+	public boolean doorIsAutoAttackable()
+	{
+		return true;
+	}
 		
 	public void onSiegeStarts() 
 	{

+ 7 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/clanhall/SiegableHall.java

@@ -30,6 +30,7 @@ import com.l2jserver.gameserver.model.L2SiegeClan.SiegeClanType;
 import com.l2jserver.gameserver.model.actor.instance.L2DoorInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.entity.ClanHall;
+import com.l2jserver.gameserver.model.zone.type.L2SiegableHallZone;
 import com.l2jserver.gameserver.model.zone.type.L2SiegeZone;
 import com.l2jserver.gameserver.network.serverpackets.SiegeInfo;
 import com.l2jserver.gameserver.templates.StatsSet;
@@ -258,4 +259,10 @@ public final class SiegableHall extends ClanHall
 	{
 		return true;
 	}
+	
+	@Override
+	public L2SiegableHallZone getZone()
+	{
+		return (L2SiegableHallZone)super.getZone();
+	}
 }

+ 23 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/L2ZoneRespawn.java

@@ -37,6 +37,29 @@ public abstract class L2ZoneRespawn extends L2ZoneType
 		super(id);
 	}
 	
+	public void parseLoc(int x, int y, int z, String type)
+	{
+		if(type == null || type.isEmpty())
+			addSpawn(x,y,z);
+		else
+		{
+			switch(type)
+			{
+				case "other":
+					addOtherSpawn(x,y,z);
+					break;
+				case "chaotic":
+					addChaoticSpawn(x,y,z);
+					break;
+				case "banish":
+					addBanishSpawn(x,y,z);
+					break;
+				default:
+					_log.warning("L2ZoneRespawn: Unknown location type: "+type);
+			}
+		}
+	}
+	
 	public final void addSpawn(int x, int y, int z)
 	{
 		if (_spawnLocs == null)

+ 6 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2ResidenceHallTeleportZone.java

@@ -19,6 +19,7 @@ import java.util.concurrent.ScheduledFuture;
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.model.Location;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.util.Rnd;
 
 /**
  * @author BiggBoss
@@ -62,13 +63,16 @@ public class L2ResidenceHallTeleportZone extends L2ResidenceTeleportZone
 		@Override
 		public void run()
 		{
-			final Location loc = getSpawns().get(0);
+			int index = 0;
+			if(getSpawns().size() > 1)
+				index = Rnd.get(getSpawns().size());
+			final Location loc = getSpawns().get(index);
 			if(loc == null)
 				throw new NullPointerException();
 			
 			for(L2PcInstance pc : getAllPlayers())
 				if(pc != null)
-					pc.teleToLocation(loc, 0);
+					pc.teleToLocation(loc, false);
 		}
 	}
 }

+ 66 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2SiegableHallZone.java

@@ -0,0 +1,66 @@
+/*
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ * 
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.model.zone.type;
+
+import java.util.List;
+
+import com.l2jserver.gameserver.instancemanager.MapRegionManager.TeleportWhereType;
+import com.l2jserver.gameserver.model.Location;
+import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+
+/**
+ * @author BiggBoss
+ */
+public final class L2SiegableHallZone extends L2ClanHallZone
+{
+	private List<Location> _challengerLocations;
+	
+	public L2SiegableHallZone(int id)
+	{
+		super(id);
+	}
+	
+	@Override
+	public void parseLoc(int x, int y, int z, String type)
+	{
+		if(type != null && type.equals("challenger"))
+		{
+			if(_challengerLocations == null)
+				_challengerLocations = new java.util.ArrayList<Location>();
+			_challengerLocations.add(new Location(x,y,z));
+		}
+		else
+			super.parseLoc(x, y, z, type);
+	}
+	
+	public List<Location> getChallengerSpawns()
+	{
+		return _challengerLocations;
+	}
+	
+	public void banishNonSiegeParticipants()
+	{
+		final TeleportWhereType banish = TeleportWhereType.ClanHall_banish;
+		for(L2Character character : getCharactersInsideArray())
+		{
+			if(character instanceof L2PcInstance)
+			{
+				if(!((L2PcInstance)character).isInHideoutSiege())
+					character.teleToLocation(banish);
+			}
+		}
+	}
+}