Prechádzať zdrojové kódy

BETA: Core-part for [DP10206].

Adry_85 11 rokov pred
rodič
commit
992572ac2e

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/SevenSigns.java

@@ -1724,7 +1724,7 @@ public class SevenSigns
 			{
 				if (getPlayerCabal(activeChar.getObjectId()) == CABAL_DUSK)
 				{
-					activeChar.sendMessage("You cannot summon Siege Golem or Cannon while Seal of Strife posessed by Lords of Dawn.");
+					activeChar.sendPacket(SystemMessageId.SEAL_OF_STRIFE_FORBIDS_SUMMONING);
 					return true;
 				}
 			}

+ 25 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/engines/DocumentBase.java

@@ -55,11 +55,15 @@ import com.l2jserver.gameserver.model.conditions.ConditionPlayerActiveEffectId;
 import com.l2jserver.gameserver.model.conditions.ConditionPlayerActiveSkillId;
 import com.l2jserver.gameserver.model.conditions.ConditionPlayerAgathionId;
 import com.l2jserver.gameserver.model.conditions.ConditionPlayerCallPc;
+import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanCreateBase;
+import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanCreateOutpost;
 import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanEscape;
-import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanPossessHolything;
 import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanRefuelAirship;
 import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanSummon;
+import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanSummonSiegeGolem;
 import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanSweep;
+import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanTakeCastle;
+import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanTakeFort;
 import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanTransform;
 import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanUntransform;
 import com.l2jserver.gameserver.model.conditions.ConditionPlayerCharges;
@@ -780,13 +784,17 @@ public abstract class DocumentBase
 			{
 				cond = joinAnd(cond, new ConditionPlayerCallPc(Boolean.parseBoolean(a.getNodeValue())));
 			}
-			else if ("canEscape".equalsIgnoreCase(a.getNodeName()))
+			else if ("canCreateBase".equalsIgnoreCase(a.getNodeName()))
 			{
-				cond = joinAnd(cond, new ConditionPlayerCanEscape(Boolean.parseBoolean(a.getNodeValue())));
+				cond = joinAnd(cond, new ConditionPlayerCanCreateBase(Boolean.parseBoolean(a.getNodeValue())));
+			}
+			else if ("canCreateOutpost".equalsIgnoreCase(a.getNodeName()))
+			{
+				cond = joinAnd(cond, new ConditionPlayerCanCreateOutpost(Boolean.parseBoolean(a.getNodeValue())));
 			}
-			else if ("canPossessHolything".equalsIgnoreCase(a.getNodeName()))
+			else if ("canEscape".equalsIgnoreCase(a.getNodeName()))
 			{
-				cond = joinAnd(cond, new ConditionPlayerCanPossessHolything(Boolean.parseBoolean(a.getNodeValue())));
+				cond = joinAnd(cond, new ConditionPlayerCanEscape(Boolean.parseBoolean(a.getNodeValue())));
 			}
 			else if ("canRefuelAirship".equalsIgnoreCase(a.getNodeName()))
 			{
@@ -796,10 +804,22 @@ public abstract class DocumentBase
 			{
 				cond = joinAnd(cond, new ConditionPlayerCanSummon(Boolean.parseBoolean(a.getNodeValue())));
 			}
+			else if ("canSummonSiegeGolem".equalsIgnoreCase(a.getNodeName()))
+			{
+				cond = joinAnd(cond, new ConditionPlayerCanSummonSiegeGolem(Boolean.parseBoolean(a.getNodeValue())));
+			}
 			else if ("canSweep".equalsIgnoreCase(a.getNodeName()))
 			{
 				cond = joinAnd(cond, new ConditionPlayerCanSweep(Boolean.parseBoolean(a.getNodeValue())));
 			}
+			else if ("canTakeCastle".equalsIgnoreCase(a.getNodeName()))
+			{
+				cond = joinAnd(cond, new ConditionPlayerCanTakeCastle(Boolean.parseBoolean(a.getNodeValue())));
+			}
+			else if ("canTakeFort".equalsIgnoreCase(a.getNodeName()))
+			{
+				cond = joinAnd(cond, new ConditionPlayerCanTakeFort(Boolean.parseBoolean(a.getNodeValue())));
+			}
 			else if ("canTransform".equalsIgnoreCase(a.getNodeName()))
 			{
 				cond = joinAnd(cond, new ConditionPlayerCanTransform(Boolean.parseBoolean(a.getNodeValue())));

+ 0 - 56
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -238,7 +238,6 @@ import com.l2jserver.gameserver.model.skills.AbnormalType;
 import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.model.skills.L2SkillType;
-import com.l2jserver.gameserver.model.skills.l2skills.L2SkillSiegeFlag;
 import com.l2jserver.gameserver.model.skills.targets.L2TargetType;
 import com.l2jserver.gameserver.model.stats.Formulas;
 import com.l2jserver.gameserver.model.stats.Stats;
@@ -8868,13 +8867,6 @@ public final class L2PcInstance extends L2Playable
 		
 		// ************************************* Check skill availability *******************************************
 		
-		// Check if it's ok to summon
-		// siege golem (13), Wild Hog Cannon (299), Swoop Cannon (448)
-		if (((skill.getId() == 13) || (skill.getId() == 299) || (skill.getId() == 448)) && ((!SiegeManager.getInstance().checkIfOkToSummon(this, false) && !FortSiegeManager.getInstance().checkIfOkToSummon(this, false)) || (SevenSigns.getInstance().checkSummonConditions(this))))
-		{
-			return false;
-		}
-		
 		// Check if this skill is enabled (ex : reuse time)
 		if (isSkillDisabled(skill))
 		{
@@ -9091,14 +9083,6 @@ public final class L2PcInstance extends L2Playable
 				}
 		}
 		
-		// TODO: Unhardcode skillId 844 which is the outpost construct skill
-		if (((sklTargetType == L2TargetType.FLAGPOLE) && !checkIfOkToCastFlagDisplay(FortManager.getInstance().getFort(this), false, skill, target)) || ((sklType == L2SkillType.SIEGEFLAG) && !L2SkillSiegeFlag.checkIfOkToPlaceFlag(this, false, skill.getId() == 844)))
-		{
-			sendPacket(ActionFailed.STATIC_PACKET);
-			abortCast();
-			return false;
-		}
-		
 		// GeoData Los Check here
 		if (skill.getCastRange() > 0)
 		{
@@ -9129,46 +9113,6 @@ public final class L2PcInstance extends L2Playable
 		return true;
 	}
 	
-	public boolean checkIfOkToCastFlagDisplay(Fort fort, boolean isCheckOnly, L2Skill skill, L2Object target)
-	{
-		SystemMessage sm;
-		
-		if ((fort == null) || (fort.getResidenceId() <= 0))
-		{
-			sm = SystemMessage.getSystemMessage(SystemMessageId.S1_CANNOT_BE_USED);
-			sm.addSkillName(skill);
-		}
-		else if (fort.getFlagPole() != target)
-		{
-			sm = SystemMessage.getSystemMessage(SystemMessageId.INCORRECT_TARGET);
-		}
-		else if (!fort.getSiege().getIsInProgress())
-		{
-			sm = SystemMessage.getSystemMessage(SystemMessageId.S1_CANNOT_BE_USED);
-			sm.addSkillName(skill);
-		}
-		else if (!Util.checkIfInRange(200, this, target, true))
-		{
-			sm = SystemMessage.getSystemMessage(SystemMessageId.DIST_TOO_FAR_CASTING_STOPPED);
-		}
-		else if (fort.getSiege().getAttackerClan(getClan()) == null)
-		{
-			sm = SystemMessage.getSystemMessage(SystemMessageId.S1_CANNOT_BE_USED);
-			sm.addSkillName(skill);
-		}
-		else
-		{
-			if (!isCheckOnly)
-			{
-				fort.getSiege().announceToPlayer(SystemMessage.getSystemMessage(SystemMessageId.S1_TRYING_RAISE_FLAG), getClan().getName());
-			}
-			return true;
-		}
-		
-		sendPacket(sm);
-		return false;
-	}
-	
 	public boolean isInLooterParty(int LooterId)
 	{
 		L2PcInstance looter = L2World.getInstance().getPlayer(LooterId);

+ 100 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanCreateBase.java

@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2004-2014 L2J Server
+ *
+ * This file is part of L2J Server.
+ *
+ * L2J Server 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.
+ *
+ * L2J Server 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.conditions;
+
+import com.l2jserver.gameserver.instancemanager.CastleManager;
+import com.l2jserver.gameserver.instancemanager.FortManager;
+import com.l2jserver.gameserver.instancemanager.FortSiegeManager;
+import com.l2jserver.gameserver.instancemanager.SiegeManager;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.entity.Castle;
+import com.l2jserver.gameserver.model.entity.Fort;
+import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.zone.ZoneId;
+import com.l2jserver.gameserver.network.SystemMessageId;
+import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
+
+/**
+ * Player Can Create Base condition implementation.
+ * @author Adry_85
+ */
+public class ConditionPlayerCanCreateBase extends Condition
+{
+	private final boolean _val;
+	
+	public ConditionPlayerCanCreateBase(boolean val)
+	{
+		_val = val;
+	}
+	
+	@Override
+	public boolean testImpl(Env env)
+	{
+		boolean canCreateBase = true;
+		if ((env.getPlayer() == null) || env.getPlayer().isAlikeDead() || env.getPlayer().isCursedWeaponEquipped() || (env.getPlayer().getClan() == null))
+		{
+			canCreateBase = false;
+		}
+		final Castle castle = CastleManager.getInstance().getCastle(env.getPlayer());
+		final Fort fort = FortManager.getInstance().getFort(env.getPlayer());
+		final SystemMessage sm;
+		L2PcInstance player = env.getPlayer().getActingPlayer();
+		if ((castle == null) && (fort == null))
+		{
+			sm = SystemMessage.getSystemMessage(SystemMessageId.S1_CANNOT_BE_USED);
+			sm.addSkillName(env.getSkill());
+			player.sendPacket(sm);
+			canCreateBase = false;
+		}
+		else if (((castle != null) && !castle.getSiege().getIsInProgress()) || ((fort != null) && !fort.getSiege().getIsInProgress()))
+		{
+			sm = SystemMessage.getSystemMessage(SystemMessageId.S1_CANNOT_BE_USED);
+			sm.addSkillName(env.getSkill());
+			player.sendPacket(sm);
+			canCreateBase = false;
+		}
+		else if (((castle != null) && (castle.getSiege().getAttackerClan(player.getClan()) == null)) || ((fort != null) && (fort.getSiege().getAttackerClan(player.getClan()) == null)))
+		{
+			sm = SystemMessage.getSystemMessage(SystemMessageId.S1_CANNOT_BE_USED);
+			sm.addSkillName(env.getSkill());
+			player.sendPacket(sm);
+			canCreateBase = false;
+		}
+		else if (!player.isClanLeader())
+		{
+			sm = SystemMessage.getSystemMessage(SystemMessageId.S1_CANNOT_BE_USED);
+			sm.addSkillName(env.getSkill());
+			player.sendPacket(sm);
+			canCreateBase = false;
+		}
+		else if (((castle != null) && (castle.getSiege().getAttackerClan(player.getClan()).getNumFlags() >= SiegeManager.getInstance().getFlagMaxCount())) || ((fort != null) && (fort.getSiege().getAttackerClan(player.getClan()).getNumFlags() >= FortSiegeManager.getInstance().getFlagMaxCount())))
+		{
+			sm = SystemMessage.getSystemMessage(SystemMessageId.S1_CANNOT_BE_USED);
+			sm.addSkillName(env.getSkill());
+			player.sendPacket(sm);
+			canCreateBase = false;
+		}
+		else if (!player.isInsideZone(ZoneId.HQ))
+		{
+			player.sendPacket(SystemMessageId.NOT_SET_UP_BASE_HERE);
+			canCreateBase = false;
+		}
+		return (_val == canCreateBase);
+	}
+}

+ 94 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanCreateOutpost.java

@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2004-2014 L2J Server
+ *
+ * This file is part of L2J Server.
+ *
+ * L2J Server 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.
+ *
+ * L2J Server 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.conditions;
+
+import com.l2jserver.gameserver.instancemanager.CastleManager;
+import com.l2jserver.gameserver.instancemanager.FortManager;
+import com.l2jserver.gameserver.instancemanager.TerritoryWarManager;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.entity.Castle;
+import com.l2jserver.gameserver.model.entity.Fort;
+import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.zone.ZoneId;
+import com.l2jserver.gameserver.network.SystemMessageId;
+
+/**
+ * Player Can Create Outpost condition implementation.
+ * @author Adry_85
+ */
+public class ConditionPlayerCanCreateOutpost extends Condition
+{
+	private final boolean _val;
+	
+	public ConditionPlayerCanCreateOutpost(boolean val)
+	{
+		_val = val;
+	}
+	
+	@Override
+	public boolean testImpl(Env env)
+	{
+		boolean canCreateOutpost = true;
+		if ((env.getPlayer() == null) || env.getPlayer().isAlikeDead() || env.getPlayer().isCursedWeaponEquipped() || (env.getPlayer().getClan() == null))
+		{
+			canCreateOutpost = false;
+		}
+		
+		final Castle castle = CastleManager.getInstance().getCastle(env.getPlayer());
+		final Fort fort = FortManager.getInstance().getFort(env.getPlayer());
+		
+		if ((castle == null) && (fort == null))
+		{
+			canCreateOutpost = false;
+		}
+		
+		L2PcInstance player = env.getPlayer().getActingPlayer();
+		if (((fort != null) && (fort.getResidenceId() == 0)) || ((castle != null) && (castle.getResidenceId() == 0)))
+		{
+			player.sendMessage("You must be on fort or castle ground to construct an outpost or flag.");
+			canCreateOutpost = false;
+		}
+		else if (((fort != null) && !fort.getZone().isActive()) || ((castle != null) && !castle.getZone().isActive()))
+		{
+			player.sendMessage("You can only construct an outpost or flag on siege field.");
+			canCreateOutpost = false;
+		}
+		else if (!player.isClanLeader())
+		{
+			player.sendMessage("You must be a clan leader to construct an outpost or flag.");
+			canCreateOutpost = false;
+		}
+		else if (TerritoryWarManager.getInstance().getHQForClan(player.getClan()) != null)
+		{
+			player.sendPacket(SystemMessageId.NOT_ANOTHER_HEADQUARTERS);
+			canCreateOutpost = false;
+		}
+		else if (TerritoryWarManager.getInstance().getFlagForClan(player.getClan()) != null)
+		{
+			player.sendPacket(SystemMessageId.A_FLAG_IS_ALREADY_BEING_DISPLAYED_ANOTHER_FLAG_CANNOT_BE_DISPLAYED);
+			canCreateOutpost = false;
+		}
+		else if (!player.isInsideZone(ZoneId.HQ))
+		{
+			player.sendPacket(SystemMessageId.NOT_SET_UP_BASE_HERE);
+			canCreateOutpost = false;
+		}
+		return (_val == canCreateOutpost);
+	}
+}

+ 81 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanSummonSiegeGolem.java

@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2004-2014 L2J Server
+ *
+ * This file is part of L2J Server.
+ *
+ * L2J Server 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.
+ *
+ * L2J Server 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.conditions;
+
+import com.l2jserver.gameserver.SevenSigns;
+import com.l2jserver.gameserver.instancemanager.CastleManager;
+import com.l2jserver.gameserver.instancemanager.FortManager;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.entity.Castle;
+import com.l2jserver.gameserver.model.entity.Fort;
+import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.network.SystemMessageId;
+
+/**
+ * Player Can Summon Siege Golem implementation.
+ * @author Adry_85
+ */
+public class ConditionPlayerCanSummonSiegeGolem extends Condition
+{
+	private final boolean _val;
+	
+	public ConditionPlayerCanSummonSiegeGolem(boolean val)
+	{
+		_val = val;
+	}
+	
+	@Override
+	public boolean testImpl(Env env)
+	{
+		boolean canSummonSiegeGolem = true;
+		if ((env.getPlayer() == null) || env.getPlayer().isAlikeDead() || env.getPlayer().isCursedWeaponEquipped() || (env.getPlayer().getClan() == null))
+		{
+			canSummonSiegeGolem = false;
+		}
+		
+		final Castle castle = CastleManager.getInstance().getCastle(env.getPlayer());
+		final Fort fort = FortManager.getInstance().getFort(env.getPlayer());
+		if ((castle == null) && (fort == null))
+		{
+			canSummonSiegeGolem = false;
+		}
+		
+		L2PcInstance player = env.getPlayer().getActingPlayer();
+		if (((fort != null) && (fort.getResidenceId() == 0)) || ((castle != null) && (castle.getResidenceId() == 0)))
+		{
+			player.sendPacket(SystemMessageId.INCORRECT_TARGET);
+			canSummonSiegeGolem = false;
+		}
+		else if (((castle != null) && !castle.getSiege().getIsInProgress()) || ((fort != null) && !fort.getSiege().getIsInProgress()))
+		{
+			player.sendPacket(SystemMessageId.INCORRECT_TARGET);
+			canSummonSiegeGolem = false;
+		}
+		else if ((player.getClanId() != 0) && (((castle != null) && (castle.getSiege().getAttackerClan(player.getClanId()) == null)) || ((fort != null) && (fort.getSiege().getAttackerClan(player.getClanId()) == null))))
+		{
+			player.sendPacket(SystemMessageId.INCORRECT_TARGET);
+			canSummonSiegeGolem = false;
+		}
+		else if ((SevenSigns.getInstance().checkSummonConditions(env.getPlayer())))
+		{
+			canSummonSiegeGolem = false;
+		}
+		return (_val == canSummonSiegeGolem);
+	}
+}

+ 9 - 9
L2J_Server_BETA/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanPossessHolything.java → L2J_Server_BETA/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanTakeCastle.java

@@ -29,11 +29,11 @@ import com.l2jserver.gameserver.util.Util;
  * Player Can Possess Holything condition implementation.
  * @author Adry_85
  */
-public class ConditionPlayerCanPossessHolything extends Condition
+public class ConditionPlayerCanTakeCastle extends Condition
 {
 	private final boolean _val;
 	
-	public ConditionPlayerCanPossessHolything(boolean val)
+	public ConditionPlayerCanTakeCastle(boolean val)
 	{
 		_val = val;
 	}
@@ -41,14 +41,14 @@ public class ConditionPlayerCanPossessHolything extends Condition
 	@Override
 	public boolean testImpl(Env env)
 	{
-		boolean canPossessHolything = true;
+		boolean canTakeCastle = true;
 		if ((env.getPlayer() == null) || env.getPlayer().isAlikeDead() || env.getPlayer().isCursedWeaponEquipped())
 		{
-			canPossessHolything = false;
+			canTakeCastle = false;
 		}
 		else if ((env.getPlayer().getClan() == null) || (env.getPlayer().getClan().getLeaderId() != env.getPlayer().getObjectId()))
 		{
-			canPossessHolything = false;
+			canTakeCastle = false;
 		}
 		
 		Castle castle = CastleManager.getInstance().getCastle(env.getPlayer());
@@ -58,18 +58,18 @@ public class ConditionPlayerCanPossessHolything extends Condition
 			sm = SystemMessage.getSystemMessage(SystemMessageId.S1_CANNOT_BE_USED);
 			sm.addSkillName(env.getSkill());
 			env.getPlayer().sendPacket(sm);
-			canPossessHolything = false;
+			canTakeCastle = false;
 		}
 		else if (!castle.getArtefacts().contains(env.getTarget()))
 		{
 			env.getPlayer().sendPacket(SystemMessageId.INCORRECT_TARGET);
-			canPossessHolything = false;
+			canTakeCastle = false;
 		}
 		else if (!Util.checkIfInRange(200, env.getPlayer(), env.getTarget(), true))
 		{
 			env.getPlayer().sendPacket(SystemMessageId.DIST_TOO_FAR_CASTING_STOPPED);
-			canPossessHolything = false;
+			canTakeCastle = false;
 		}
-		return (_val == canPossessHolything);
+		return (_val == canTakeCastle);
 	}
 }

+ 71 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanTakeFort.java

@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2004-2014 L2J Server
+ *
+ * This file is part of L2J Server.
+ *
+ * L2J Server 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.
+ *
+ * L2J Server 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.conditions;
+
+import com.l2jserver.gameserver.instancemanager.FortManager;
+import com.l2jserver.gameserver.model.entity.Fort;
+import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.network.SystemMessageId;
+import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
+import com.l2jserver.gameserver.util.Util;
+
+/**
+ * Player Can Take Fort condition implementation.
+ * @author Adry_85
+ */
+public class ConditionPlayerCanTakeFort extends Condition
+{
+	private final boolean _val;
+	
+	public ConditionPlayerCanTakeFort(boolean val)
+	{
+		_val = val;
+	}
+	
+	@Override
+	public boolean testImpl(Env env)
+	{
+		boolean canTakeFort = true;
+		if ((env.getPlayer() == null) || env.getPlayer().isAlikeDead() || env.getPlayer().isCursedWeaponEquipped() || (env.getPlayer().getClan() == null))
+		{
+			canTakeFort = false;
+		}
+		
+		final Fort fort = FortManager.getInstance().getFort(env.getPlayer());
+		final SystemMessage sm;
+		if ((fort == null) || (fort.getResidenceId() <= 0) || !fort.getSiege().getIsInProgress() || (fort.getSiege().getAttackerClan(env.getPlayer().getClan()) == null))
+		{
+			sm = SystemMessage.getSystemMessage(SystemMessageId.S1_CANNOT_BE_USED);
+			sm.addSkillName(env.getSkill());
+			env.getPlayer().sendPacket(sm);
+			canTakeFort = false;
+		}
+		else if (fort.getFlagPole() != env.getTarget())
+		{
+			env.getPlayer().sendPacket(SystemMessageId.INCORRECT_TARGET);
+			canTakeFort = false;
+		}
+		else if (!Util.checkIfInRange(200, env.getPlayer(), env.getTarget(), true))
+		{
+			env.getPlayer().sendPacket(SystemMessageId.DIST_TOO_FAR_CASTING_STOPPED);
+			canTakeFort = false;
+		}
+		return (_val == canTakeFort);
+	}
+}

+ 16 - 10
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/Fort.java

@@ -73,7 +73,7 @@ public final class Fort extends AbstractResidence
 	
 	private final List<L2DoorInstance> _doors = new ArrayList<>();
 	private L2StaticObjectInstance _flagPole = null;
-	private FortSiege _siege = null;
+	private volatile FortSiege _siege = null;
 	private Calendar _siegeDate;
 	private Calendar _lastOwnedTime;
 	private L2SiegeZone _zone;
@@ -283,12 +283,7 @@ public final class Fort extends AbstractResidence
 	
 	public void endOfSiege(L2Clan clan)
 	{
-		ThreadPoolManager.getInstance().scheduleGeneral(new endFortressSiege(this, clan), 1000);
-	}
-	
-	public void engrave(L2Clan clan)
-	{
-		setOwner(clan, true);
+		ThreadPoolManager.getInstance().executeAi(new endFortressSiege(this, clan));
 	}
 	
 	/**
@@ -393,6 +388,11 @@ public final class Fort extends AbstractResidence
 			_log.warning(getClass().getSimpleName() + ": Updating Fort owner with null clan!!!");
 			return false;
 		}
+		
+		final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.THE_FORTRESS_BATTLE_OF_S1_HAS_FINISHED);
+		sm.addCastleId(getResidenceId());
+		getSiege().announceToPlayer(sm);
+		
 		final L2Clan oldowner = getOwnerClan();
 		if ((oldowner != null) && (clan != oldowner))
 		{
@@ -883,7 +883,7 @@ public final class Fort extends AbstractResidence
 	
 	public final void setOwnerClan(L2Clan clan)
 	{
-		setVisibleFlag(clan != null ? true : false);
+		setVisibleFlag(clan != null);
 		_fortOwner = clan;
 	}
 	
@@ -918,7 +918,13 @@ public final class Fort extends AbstractResidence
 	{
 		if (_siege == null)
 		{
-			_siege = new FortSiege(this);
+			synchronized (this)
+			{
+				if (_siege == null)
+				{
+					return _siege = new FortSiege(this);
+				}
+			}
 		}
 		return _siege;
 	}
@@ -993,7 +999,7 @@ public final class Fort extends AbstractResidence
 		{
 			try
 			{
-				_f.engrave(_clan);
+				_f.setOwner(_clan, true);
 			}
 			catch (Exception e)
 			{

+ 1 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/FortSiege.java

@@ -38,10 +38,10 @@ import com.l2jserver.gameserver.enums.FortTeleportWhoType;
 import com.l2jserver.gameserver.instancemanager.FortManager;
 import com.l2jserver.gameserver.instancemanager.FortSiegeGuardManager;
 import com.l2jserver.gameserver.instancemanager.FortSiegeManager;
+import com.l2jserver.gameserver.model.ClanPrivilege;
 import com.l2jserver.gameserver.model.CombatFlag;
 import com.l2jserver.gameserver.model.FortSiegeSpawn;
 import com.l2jserver.gameserver.model.L2Clan;
-import com.l2jserver.gameserver.model.ClanPrivilege;
 import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.L2SiegeClan;
 import com.l2jserver.gameserver.model.L2SiegeClan.SiegeClanType;
@@ -259,10 +259,6 @@ public class FortSiege implements Siegable
 		if (getIsInProgress())
 		{
 			_isInProgress = false; // Flag so that siege instance can be started
-			final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.THE_FORTRESS_BATTLE_OF_S1_HAS_FINISHED);
-			sm.addCastleId(getFort().getResidenceId());
-			announceToPlayer(sm);
-			
 			removeFlags(); // Removes all flags. Note: Remove flag before teleporting players
 			unSpawnFlags();
 			

+ 0 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/L2SkillType.java

@@ -22,7 +22,6 @@ import java.lang.reflect.Constructor;
 
 import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.skills.l2skills.L2SkillDefault;
-import com.l2jserver.gameserver.model.skills.l2skills.L2SkillSiegeFlag;
 
 /**
  * Skill type enumerated.
@@ -37,8 +36,6 @@ public enum L2SkillType
 	// Misc
 	UNLOCK,
 	UNLOCK_SPECIAL,
-	SIEGEFLAG(L2SkillSiegeFlag.class),
-	TAKEFORT,
 	DELUXE_KEY_UNLOCK,
 	SOW,
 	DETECTION,

+ 0 - 387
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/l2skills/L2SkillSiegeFlag.java

@@ -1,387 +0,0 @@
-/*
- * Copyright (C) 2004-2014 L2J Server
- * 
- * This file is part of L2J Server.
- * 
- * L2J Server 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.
- * 
- * L2J Server 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.skills.l2skills;
-
-import java.util.logging.Level;
-
-import com.l2jserver.Config;
-import com.l2jserver.gameserver.datatables.NpcData;
-import com.l2jserver.gameserver.idfactory.IdFactory;
-import com.l2jserver.gameserver.instancemanager.CHSiegeManager;
-import com.l2jserver.gameserver.instancemanager.CastleManager;
-import com.l2jserver.gameserver.instancemanager.FortManager;
-import com.l2jserver.gameserver.instancemanager.FortSiegeManager;
-import com.l2jserver.gameserver.instancemanager.SiegeManager;
-import com.l2jserver.gameserver.instancemanager.TerritoryWarManager;
-import com.l2jserver.gameserver.model.L2Object;
-import com.l2jserver.gameserver.model.StatsSet;
-import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.actor.instance.L2SiegeFlagInstance;
-import com.l2jserver.gameserver.model.entity.Castle;
-import com.l2jserver.gameserver.model.entity.Fort;
-import com.l2jserver.gameserver.model.entity.clanhall.SiegableHall;
-import com.l2jserver.gameserver.model.skills.L2Skill;
-import com.l2jserver.gameserver.model.zone.ZoneId;
-import com.l2jserver.gameserver.network.SystemMessageId;
-
-public class L2SkillSiegeFlag extends L2Skill
-{
-	private final boolean _isAdvanced;
-	private final boolean _isOutpost;
-	
-	public L2SkillSiegeFlag(StatsSet set)
-	{
-		super(set);
-		_isAdvanced = set.getBoolean("isAdvanced", false);
-		_isOutpost = set.getBoolean("isOutpost", false);
-	}
-	
-	@Override
-	public void useSkill(L2Character activeChar, L2Object[] targets)
-	{
-		if (!activeChar.isPlayer())
-		{
-			return;
-		}
-		
-		L2PcInstance player = activeChar.getActingPlayer();
-		
-		if ((player.getClan() == null) || (player.getClan().getLeaderId() != player.getObjectId()))
-		{
-			return;
-		}
-		
-		if (!checkIfOkToPlaceFlag(player, true, _isOutpost))
-		{
-			return;
-		}
-		
-		// Territory War
-		if (TerritoryWarManager.getInstance().isTWInProgress())
-		{
-			try
-			{
-				// Spawn a new flag
-				L2SiegeFlagInstance flag = new L2SiegeFlagInstance(player, IdFactory.getInstance().getNextId(), NpcData.getInstance().getTemplate((_isOutpost ? 36590 : 35062)), _isAdvanced, _isOutpost);
-				flag.setTitle(player.getClan().getName());
-				flag.setCurrentHpMp(flag.getMaxHp(), flag.getMaxMp());
-				flag.setHeading(player.getHeading());
-				flag.spawnMe(player.getX(), player.getY(), player.getZ() + 50);
-				if (_isOutpost)
-				{
-					TerritoryWarManager.getInstance().setHQForClan(player.getClan(), flag);
-				}
-				else
-				{
-					TerritoryWarManager.getInstance().addClanFlag(player.getClan(), flag);
-				}
-			}
-			catch (Exception e)
-			{
-				player.sendMessage("Error placing flag: " + e);
-				_log.log(Level.WARNING, "Error placing flag: " + e.getMessage(), e);
-			}
-			return;
-		}
-		// Fortress/Castle siege
-		try
-		{
-			// Spawn a new flag
-			L2SiegeFlagInstance flag = new L2SiegeFlagInstance(player, IdFactory.getInstance().getNextId(), NpcData.getInstance().getTemplate(35062), _isAdvanced, false);
-			flag.setTitle(player.getClan().getName());
-			flag.setCurrentHpMp(flag.getMaxHp(), flag.getMaxMp());
-			flag.setHeading(player.getHeading());
-			flag.spawnMe(player.getX(), player.getY(), player.getZ() + 50);
-			Castle castle = CastleManager.getInstance().getCastle(activeChar);
-			Fort fort = FortManager.getInstance().getFort(activeChar);
-			SiegableHall hall = CHSiegeManager.getInstance().getNearbyClanHall(activeChar);
-			if (castle != null)
-			{
-				castle.getSiege().getFlag(player.getClan()).add(flag);
-			}
-			else if (fort != null)
-			{
-				fort.getSiege().getFlag(player.getClan()).add(flag);
-			}
-			else
-			{
-				hall.getSiege().getFlag(player.getClan()).add(flag);
-			}
-			
-		}
-		catch (Exception e)
-		{
-			player.sendMessage("Error placing flag:" + e);
-			_log.log(Level.WARNING, "Error placing flag: " + e.getMessage(), e);
-		}
-	}
-	
-	/**
-	 * @param activeChar The L2Character of the character placing the flag
-	 * @param isCheckOnly if false, it will send a notification to the player telling him why it failed
-	 * @param isOutPost
-	 * @return true if character clan place a flag
-	 */
-	public static boolean checkIfOkToPlaceFlag(L2Character activeChar, boolean isCheckOnly, boolean isOutPost)
-	{
-		if (TerritoryWarManager.getInstance().isTWInProgress())
-		{
-			return checkIfOkToPlaceHQ(activeChar, isCheckOnly, isOutPost);
-		}
-		else if (isOutPost)
-		{
-			return false;
-		}
-		Castle castle = CastleManager.getInstance().getCastle(activeChar);
-		Fort fort = FortManager.getInstance().getFort(activeChar);
-		SiegableHall hall = CHSiegeManager.getInstance().getNearbyClanHall(activeChar);
-		
-		if ((castle == null) && (fort == null) && (hall == null))
-		{
-			return false;
-		}
-		if (castle != null)
-		{
-			return checkIfOkToPlaceFlag(activeChar, castle, isCheckOnly);
-		}
-		else if (fort != null)
-		{
-			return checkIfOkToPlaceFlag(activeChar, fort, isCheckOnly);
-		}
-		return checkIfOkToPlaceFlag(activeChar, hall, isCheckOnly);
-	}
-	
-	/**
-	 * @param activeChar
-	 * @param castle
-	 * @param isCheckOnly
-	 * @return TODO: Replace strings with system messages!
-	 */
-	public static boolean checkIfOkToPlaceFlag(L2Character activeChar, Castle castle, boolean isCheckOnly)
-	{
-		if (!activeChar.isPlayer())
-		{
-			return false;
-		}
-		
-		String text = "";
-		L2PcInstance player = activeChar.getActingPlayer();
-		
-		if ((castle == null) || (castle.getResidenceId() <= 0))
-		{
-			text = "You must be on castle ground to place a flag.";
-		}
-		else if (!castle.getSiege().getIsInProgress())
-		{
-			text = "You can only place a flag during a siege.";
-		}
-		else if (castle.getSiege().getAttackerClan(player.getClan()) == null)
-		{
-			text = "You must be an attacker to place a flag.";
-		}
-		else if (!player.isClanLeader())
-		{
-			text = "You must be a clan leader to place a flag.";
-		}
-		else if (castle.getSiege().getAttackerClan(player.getClan()).getNumFlags() >= SiegeManager.getInstance().getFlagMaxCount())
-		{
-			text = "You have already placed the maximum number of flags possible.";
-		}
-		else if (!player.isInsideZone(ZoneId.HQ))
-		{
-			player.sendPacket(SystemMessageId.NOT_SET_UP_BASE_HERE);
-		}
-		else
-		{
-			return true;
-		}
-		
-		if (!isCheckOnly)
-		{
-			player.sendMessage(text);
-		}
-		return false;
-	}
-	
-	/**
-	 * @param activeChar
-	 * @param fort
-	 * @param isCheckOnly
-	 * @return TODO: Replace strings with system messages!
-	 */
-	public static boolean checkIfOkToPlaceFlag(L2Character activeChar, Fort fort, boolean isCheckOnly)
-	{
-		if (!activeChar.isPlayer())
-		{
-			return false;
-		}
-		
-		String text = "";
-		L2PcInstance player = activeChar.getActingPlayer();
-		
-		if ((fort == null) || (fort.getResidenceId() <= 0))
-		{
-			text = "You must be on fort ground to place a flag.";
-		}
-		else if (!fort.getSiege().getIsInProgress())
-		{
-			text = "You can only place a flag during a siege.";
-		}
-		else if (fort.getSiege().getAttackerClan(player.getClan()) == null)
-		{
-			text = "You must be an attacker to place a flag.";
-		}
-		else if (!player.isClanLeader())
-		{
-			text = "You must be a clan leader to place a flag.";
-		}
-		else if (fort.getSiege().getAttackerClan(player.getClan()).getNumFlags() >= FortSiegeManager.getInstance().getFlagMaxCount())
-		{
-			text = "You have already placed the maximum number of flags possible.";
-		}
-		else if (!player.isInsideZone(ZoneId.HQ))
-		{
-			player.sendPacket(SystemMessageId.NOT_SET_UP_BASE_HERE);
-		}
-		else
-		{
-			return true;
-		}
-		
-		if (!isCheckOnly)
-		{
-			player.sendMessage(text);
-		}
-		return false;
-	}
-	
-	/**
-	 * @param activeChar
-	 * @param hall
-	 * @param isCheckOnly
-	 * @return TODO: Replace strings with system messages!
-	 */
-	public static boolean checkIfOkToPlaceFlag(L2Character activeChar, SiegableHall hall, boolean isCheckOnly)
-	{
-		if (!activeChar.isPlayer())
-		{
-			return false;
-		}
-		
-		String text = "";
-		L2PcInstance player = activeChar.getActingPlayer();
-		final int hallId = hall.getId();
-		
-		if (hallId <= 0)
-		{
-			text = "You must be on Siegable clan hall ground to place a flag.";
-		}
-		else if (!hall.isInSiege())
-		{
-			text = "You can only place a flag during a siege.";
-		}
-		else if ((player.getClan() == null) || !player.isClanLeader())
-		{
-			text = "You must be a clan leader to place a flag.";
-		}
-		else if (!hall.isRegistered(player.getClan()))
-		{
-			text = "You must be an attacker to place a flag.";
-		}
-		else if (hall.getSiege().getAttackerClan(player.getClan()).getNumFlags() > Config.CHS_MAX_FLAGS_PER_CLAN)
-		{
-			text = "You have already placed the maximum number of flags possible.";
-		}
-		else if (!player.isInsideZone(ZoneId.HQ))
-		{
-			player.sendPacket(SystemMessageId.NOT_SET_UP_BASE_HERE);
-		}
-		else if (!hall.getSiege().canPlantFlag())
-		{
-			text = "You cannot place a flag on this siege.";
-		}
-		else
-		{
-			return true;
-		}
-		
-		if (!isCheckOnly)
-		{
-			player.sendMessage(text);
-		}
-		return false;
-	}
-	
-	/**
-	 * TODO: Replace strings with system messages!
-	 * @param activeChar The L2Character of the character placing the flag
-	 * @param isCheckOnly if false, it will send a notification to the player telling him why it failed
-	 * @param isOutPost
-	 * @return true if character clan place a flag
-	 */
-	public static boolean checkIfOkToPlaceHQ(L2Character activeChar, boolean isCheckOnly, boolean isOutPost)
-	{
-		Castle castle = CastleManager.getInstance().getCastle(activeChar);
-		Fort fort = FortManager.getInstance().getFort(activeChar);
-		
-		if ((castle == null) && (fort == null))
-		{
-			return false;
-		}
-		
-		String text = "";
-		L2PcInstance player = activeChar.getActingPlayer();
-		
-		if (((fort != null) && (fort.getResidenceId() == 0)) || ((castle != null) && (castle.getResidenceId() == 0)))
-		{
-			text = "You must be on fort or castle ground to construct an outpost or flag.";
-		}
-		else if (((fort != null) && !fort.getZone().isActive()) || ((castle != null) && !castle.getZone().isActive()))
-		{
-			text = "You can only construct an outpost or flag on siege field.";
-		}
-		else if (!player.isClanLeader())
-		{
-			text = "You must be a clan leader to construct an outpost or flag.";
-		}
-		else if ((TerritoryWarManager.getInstance().getHQForClan(player.getClan()) != null) && isOutPost)
-		{
-			player.sendPacket(SystemMessageId.NOT_ANOTHER_HEADQUARTERS);
-		}
-		else if ((TerritoryWarManager.getInstance().getFlagForClan(player.getClan()) != null) && !isOutPost)
-		{
-			player.sendPacket(SystemMessageId.A_FLAG_IS_ALREADY_BEING_DISPLAYED_ANOTHER_FLAG_CANNOT_BE_DISPLAYED);
-		}
-		else if (!player.isInsideZone(ZoneId.HQ))
-		{
-			player.sendPacket(SystemMessageId.NOT_SET_UP_BASE_HERE);
-		}
-		else
-		{
-			return true;
-		}
-		
-		if (!isCheckOnly)
-		{
-			player.sendMessage(text);
-		}
-		return false;
-	}
-}