diff --git a/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java b/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java index 1a95ac29be..13aca7de62 100644 --- a/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java +++ b/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java @@ -84,6 +84,13 @@ public class NotFriend implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriend implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // At this point summon should be prevented from attacking friendly targets. if (creature.isSummon() && (target == creature.getTarget())) { diff --git a/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java b/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java index 27adfc38e6..f1651ed5b0 100644 --- a/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java +++ b/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java @@ -84,6 +84,13 @@ public class NotFriendPc implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriendPc implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // By default any flagged/PK player is considered enemy. return (target.getActingPlayer().getPvpFlag() > 0) || (target.getActingPlayer().getReputation() < 0); } diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/Player.java index a192208041..72fa721374 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -1677,6 +1677,13 @@ public class Player extends Playable return false; } + // Check first castle mid victory. + final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); + if ((castle != null) && !castle.isFirstMidVictory()) + { + return true; + } + // If target isn't a player, is self, isn't on same siege or not on same state, not friends. final Player targetPlayer = target.getActingPlayer(); if ((targetPlayer == null) || (targetPlayer == this) || (targetPlayer.getSiegeSide() != _siegeSide) || (_siegeState != targetPlayer.getSiegeState())) @@ -1687,7 +1694,6 @@ public class Player extends Playable // Attackers are considered friends only if castle has no owner. if (_siegeState == 1) { - final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); if (castle == null) { return false; @@ -8260,16 +8266,17 @@ public class Player extends Playable final Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ()); if (siege != null) { - // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan + // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan. if (siege.checkIsDefender(attackerClan) && siege.checkIsDefender(clan)) { return false; } - // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan + // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan. if (siege.checkIsAttacker(attackerClan) && siege.checkIsAttacker(clan)) { - return false; + // If first mid victory is achieved, attackers can attack attackers. + return CastleManager.getInstance().getCastleById(_siegeSide).isFirstMidVictory(); } } diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/siege/Castle.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/siege/Castle.java index f496ae219b..9f883b28a1 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/siege/Castle.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/siege/Castle.java @@ -85,6 +85,7 @@ public class Castle extends AbstractResidence private final List _artefacts = new ArrayList<>(1); private final Map _function = new ConcurrentHashMap<>(); private int _ticketBuyCount = 0; + private boolean _isFirstMidVictory = false; /** Castle Functions */ public static final int FUNC_TELEPORT = 1; @@ -915,6 +916,16 @@ public class Castle extends AbstractResidence return _doors; } + public boolean isFirstMidVictory() + { + return _isFirstMidVictory; + } + + public void setFirstMidVictory(boolean value) + { + _isFirstMidVictory = value; + } + @Override public int getOwnerId() { diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/siege/Siege.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/siege/Siege.java index d1496b598d..010904dcf1 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/siege/Siege.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/siege/Siege.java @@ -338,6 +338,7 @@ public class Siege implements Siegable SiegeGuardManager.getInstance().removeSiegeGuards(getCastle()); } _castle.spawnDoor(); // Respawn door to castle + _castle.setFirstMidVictory(false); _castle.getZone().setActive(false); _castle.getZone().updateZoneStatusForCharactersInside(); _castle.getZone().setSiegeInstance(null); @@ -452,6 +453,7 @@ public class Siege implements Siegable addDefender(sc, SiegeClanType.DEFENDER); } } + _castle.setFirstMidVictory(true); teleportPlayer(SiegeTeleportWhoType.Attacker, TeleportWhereType.SIEGEFLAG); // Teleport to the second closest town teleportPlayer(SiegeTeleportWhoType.Spectator, TeleportWhereType.TOWN); // Teleport to the second closest town removeDefenderFlags(); // Removes defenders' flags diff --git a/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java b/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java index 161c07a3f7..1fe1f42feb 100644 --- a/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java +++ b/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java @@ -85,6 +85,13 @@ public class NotFriend implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -126,13 +133,6 @@ public class NotFriend implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // At this point summon should be prevented from attacking friendly targets. if (creature.isSummon() && (target == creature.getTarget())) { diff --git a/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java b/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java index 95effcbc90..a28056572b 100644 --- a/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java +++ b/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java @@ -85,6 +85,13 @@ public class NotFriendPc implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -126,13 +133,6 @@ public class NotFriendPc implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // By default any flagged/PK player is considered enemy. return (target.getActingPlayer().getPvpFlag() > 0) || (target.getActingPlayer().getReputation() < 0); } diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/Player.java index bb766a9846..ffad4c19c1 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -1679,6 +1679,13 @@ public class Player extends Playable return false; } + // Check first castle mid victory. + final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); + if ((castle != null) && !castle.isFirstMidVictory()) + { + return true; + } + // If target isn't a player, is self, isn't on same siege or not on same state, not friends. final Player targetPlayer = target.getActingPlayer(); if ((targetPlayer == null) || (targetPlayer == this) || (targetPlayer.getSiegeSide() != _siegeSide) || (_siegeState != targetPlayer.getSiegeState())) @@ -1689,7 +1696,6 @@ public class Player extends Playable // Attackers are considered friends only if castle has no owner. if (_siegeState == 1) { - final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); if (castle == null) { return false; @@ -8263,16 +8269,17 @@ public class Player extends Playable final Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ()); if (siege != null) { - // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan + // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan. if (siege.checkIsDefender(attackerClan) && siege.checkIsDefender(clan)) { return false; } - // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan + // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan. if (siege.checkIsAttacker(attackerClan) && siege.checkIsAttacker(clan)) { - return false; + // If first mid victory is achieved, attackers can attack attackers. + return CastleManager.getInstance().getCastleById(_siegeSide).isFirstMidVictory(); } } diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/siege/Castle.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/siege/Castle.java index f496ae219b..9f883b28a1 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/siege/Castle.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/siege/Castle.java @@ -85,6 +85,7 @@ public class Castle extends AbstractResidence private final List _artefacts = new ArrayList<>(1); private final Map _function = new ConcurrentHashMap<>(); private int _ticketBuyCount = 0; + private boolean _isFirstMidVictory = false; /** Castle Functions */ public static final int FUNC_TELEPORT = 1; @@ -915,6 +916,16 @@ public class Castle extends AbstractResidence return _doors; } + public boolean isFirstMidVictory() + { + return _isFirstMidVictory; + } + + public void setFirstMidVictory(boolean value) + { + _isFirstMidVictory = value; + } + @Override public int getOwnerId() { diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/siege/Siege.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/siege/Siege.java index 48de2fdff4..b79e46b455 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/siege/Siege.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/siege/Siege.java @@ -338,6 +338,7 @@ public class Siege implements Siegable SiegeGuardManager.getInstance().removeSiegeGuards(getCastle()); } _castle.spawnDoor(); // Respawn door to castle + _castle.setFirstMidVictory(false); _castle.getZone().setActive(false); _castle.getZone().updateZoneStatusForCharactersInside(); _castle.getZone().setSiegeInstance(null); @@ -452,6 +453,7 @@ public class Siege implements Siegable addDefender(sc, SiegeClanType.DEFENDER); } } + _castle.setFirstMidVictory(true); teleportPlayer(SiegeTeleportWhoType.Attacker, TeleportWhereType.SIEGEFLAG); // Teleport to the second closest town teleportPlayer(SiegeTeleportWhoType.Spectator, TeleportWhereType.TOWN); // Teleport to the second closest town removeDefenderFlags(); // Removes defenders' flags diff --git a/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java b/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java index 161c07a3f7..1fe1f42feb 100644 --- a/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java +++ b/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java @@ -85,6 +85,13 @@ public class NotFriend implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -126,13 +133,6 @@ public class NotFriend implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // At this point summon should be prevented from attacking friendly targets. if (creature.isSummon() && (target == creature.getTarget())) { diff --git a/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java b/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java index 95effcbc90..a28056572b 100644 --- a/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java +++ b/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java @@ -85,6 +85,13 @@ public class NotFriendPc implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -126,13 +133,6 @@ public class NotFriendPc implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // By default any flagged/PK player is considered enemy. return (target.getActingPlayer().getPvpFlag() > 0) || (target.getActingPlayer().getReputation() < 0); } diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/Player.java index 529e90baf4..2a35f36465 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -1681,6 +1681,13 @@ public class Player extends Playable return false; } + // Check first castle mid victory. + final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); + if ((castle != null) && !castle.isFirstMidVictory()) + { + return true; + } + // If target isn't a player, is self, isn't on same siege or not on same state, not friends. final Player targetPlayer = target.getActingPlayer(); if ((targetPlayer == null) || (targetPlayer == this) || (targetPlayer.getSiegeSide() != _siegeSide) || (_siegeState != targetPlayer.getSiegeState())) @@ -1691,7 +1698,6 @@ public class Player extends Playable // Attackers are considered friends only if castle has no owner. if (_siegeState == 1) { - final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); if (castle == null) { return false; @@ -8265,16 +8271,17 @@ public class Player extends Playable final Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ()); if (siege != null) { - // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan + // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan. if (siege.checkIsDefender(attackerClan) && siege.checkIsDefender(clan)) { return false; } - // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan + // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan. if (siege.checkIsAttacker(attackerClan) && siege.checkIsAttacker(clan)) { - return false; + // If first mid victory is achieved, attackers can attack attackers. + return CastleManager.getInstance().getCastleById(_siegeSide).isFirstMidVictory(); } } diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/siege/Castle.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/siege/Castle.java index f496ae219b..9f883b28a1 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/siege/Castle.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/siege/Castle.java @@ -85,6 +85,7 @@ public class Castle extends AbstractResidence private final List _artefacts = new ArrayList<>(1); private final Map _function = new ConcurrentHashMap<>(); private int _ticketBuyCount = 0; + private boolean _isFirstMidVictory = false; /** Castle Functions */ public static final int FUNC_TELEPORT = 1; @@ -915,6 +916,16 @@ public class Castle extends AbstractResidence return _doors; } + public boolean isFirstMidVictory() + { + return _isFirstMidVictory; + } + + public void setFirstMidVictory(boolean value) + { + _isFirstMidVictory = value; + } + @Override public int getOwnerId() { diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/siege/Siege.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/siege/Siege.java index 48de2fdff4..b79e46b455 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/siege/Siege.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/siege/Siege.java @@ -338,6 +338,7 @@ public class Siege implements Siegable SiegeGuardManager.getInstance().removeSiegeGuards(getCastle()); } _castle.spawnDoor(); // Respawn door to castle + _castle.setFirstMidVictory(false); _castle.getZone().setActive(false); _castle.getZone().updateZoneStatusForCharactersInside(); _castle.getZone().setSiegeInstance(null); @@ -452,6 +453,7 @@ public class Siege implements Siegable addDefender(sc, SiegeClanType.DEFENDER); } } + _castle.setFirstMidVictory(true); teleportPlayer(SiegeTeleportWhoType.Attacker, TeleportWhereType.SIEGEFLAG); // Teleport to the second closest town teleportPlayer(SiegeTeleportWhoType.Spectator, TeleportWhereType.TOWN); // Teleport to the second closest town removeDefenderFlags(); // Removes defenders' flags diff --git a/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java index 1a95ac29be..13aca7de62 100644 --- a/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java +++ b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java @@ -84,6 +84,13 @@ public class NotFriend implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriend implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // At this point summon should be prevented from attacking friendly targets. if (creature.isSummon() && (target == creature.getTarget())) { diff --git a/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java index 27adfc38e6..f1651ed5b0 100644 --- a/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java +++ b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java @@ -84,6 +84,13 @@ public class NotFriendPc implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriendPc implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // By default any flagged/PK player is considered enemy. return (target.getActingPlayer().getPvpFlag() > 0) || (target.getActingPlayer().getReputation() < 0); } diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/Player.java index 3d25c3790d..9cd8f54d01 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -1691,6 +1691,13 @@ public class Player extends Playable return false; } + // Check first castle mid victory. + final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); + if ((castle != null) && !castle.isFirstMidVictory()) + { + return true; + } + // If target isn't a player, is self, isn't on same siege or not on same state, not friends. final Player targetPlayer = target.getActingPlayer(); if ((targetPlayer == null) || (targetPlayer == this) || (targetPlayer.getSiegeSide() != _siegeSide) || (_siegeState != targetPlayer.getSiegeState())) @@ -1701,7 +1708,6 @@ public class Player extends Playable // Attackers are considered friends only if castle has no owner. if (_siegeState == 1) { - final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); if (castle == null) { return false; @@ -8260,16 +8266,17 @@ public class Player extends Playable final Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ()); if (siege != null) { - // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan + // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan. if (siege.checkIsDefender(attackerClan) && siege.checkIsDefender(clan)) { return false; } - // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan + // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan. if (siege.checkIsAttacker(attackerClan) && siege.checkIsAttacker(clan)) { - return false; + // If first mid victory is achieved, attackers can attack attackers. + return CastleManager.getInstance().getCastleById(_siegeSide).isFirstMidVictory(); } } diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/siege/Castle.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/siege/Castle.java index f496ae219b..9f883b28a1 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/siege/Castle.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/siege/Castle.java @@ -85,6 +85,7 @@ public class Castle extends AbstractResidence private final List _artefacts = new ArrayList<>(1); private final Map _function = new ConcurrentHashMap<>(); private int _ticketBuyCount = 0; + private boolean _isFirstMidVictory = false; /** Castle Functions */ public static final int FUNC_TELEPORT = 1; @@ -915,6 +916,16 @@ public class Castle extends AbstractResidence return _doors; } + public boolean isFirstMidVictory() + { + return _isFirstMidVictory; + } + + public void setFirstMidVictory(boolean value) + { + _isFirstMidVictory = value; + } + @Override public int getOwnerId() { diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/siege/Siege.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/siege/Siege.java index 48de2fdff4..b79e46b455 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/siege/Siege.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/siege/Siege.java @@ -338,6 +338,7 @@ public class Siege implements Siegable SiegeGuardManager.getInstance().removeSiegeGuards(getCastle()); } _castle.spawnDoor(); // Respawn door to castle + _castle.setFirstMidVictory(false); _castle.getZone().setActive(false); _castle.getZone().updateZoneStatusForCharactersInside(); _castle.getZone().setSiegeInstance(null); @@ -452,6 +453,7 @@ public class Siege implements Siegable addDefender(sc, SiegeClanType.DEFENDER); } } + _castle.setFirstMidVictory(true); teleportPlayer(SiegeTeleportWhoType.Attacker, TeleportWhereType.SIEGEFLAG); // Teleport to the second closest town teleportPlayer(SiegeTeleportWhoType.Spectator, TeleportWhereType.TOWN); // Teleport to the second closest town removeDefenderFlags(); // Removes defenders' flags diff --git a/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java b/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java index 1a95ac29be..13aca7de62 100644 --- a/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java +++ b/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java @@ -84,6 +84,13 @@ public class NotFriend implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriend implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // At this point summon should be prevented from attacking friendly targets. if (creature.isSummon() && (target == creature.getTarget())) { diff --git a/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java b/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java index 27adfc38e6..f1651ed5b0 100644 --- a/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java +++ b/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java @@ -84,6 +84,13 @@ public class NotFriendPc implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriendPc implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // By default any flagged/PK player is considered enemy. return (target.getActingPlayer().getPvpFlag() > 0) || (target.getActingPlayer().getReputation() < 0); } diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/Player.java index 02b87d0fd7..0087a91dbd 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -1687,6 +1687,13 @@ public class Player extends Playable return false; } + // Check first castle mid victory. + final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); + if ((castle != null) && !castle.isFirstMidVictory()) + { + return true; + } + // If target isn't a player, is self, isn't on same siege or not on same state, not friends. final Player targetPlayer = target.getActingPlayer(); if ((targetPlayer == null) || (targetPlayer == this) || (targetPlayer.getSiegeSide() != _siegeSide) || (_siegeState != targetPlayer.getSiegeState())) @@ -1697,7 +1704,6 @@ public class Player extends Playable // Attackers are considered friends only if castle has no owner. if (_siegeState == 1) { - final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); if (castle == null) { return false; @@ -8276,16 +8282,17 @@ public class Player extends Playable final Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ()); if (siege != null) { - // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan + // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan. if (siege.checkIsDefender(attackerClan) && siege.checkIsDefender(clan)) { return false; } - // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan + // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan. if (siege.checkIsAttacker(attackerClan) && siege.checkIsAttacker(clan)) { - return false; + // If first mid victory is achieved, attackers can attack attackers. + return CastleManager.getInstance().getCastleById(_siegeSide).isFirstMidVictory(); } } diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/siege/Castle.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/siege/Castle.java index 6669f1fc57..063570e334 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/siege/Castle.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/siege/Castle.java @@ -85,6 +85,7 @@ public class Castle extends AbstractResidence private final List _artefacts = new ArrayList<>(1); private final Map _function = new ConcurrentHashMap<>(); private int _ticketBuyCount = 0; + private boolean _isFirstMidVictory = false; /** Castle Functions */ public static final int FUNC_TELEPORT = 1; @@ -915,6 +916,16 @@ public class Castle extends AbstractResidence return _doors; } + public boolean isFirstMidVictory() + { + return _isFirstMidVictory; + } + + public void setFirstMidVictory(boolean value) + { + _isFirstMidVictory = value; + } + @Override public int getOwnerId() { diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/siege/Siege.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/siege/Siege.java index 33907d32fc..dba91db269 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/siege/Siege.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/siege/Siege.java @@ -338,6 +338,7 @@ public class Siege implements Siegable SiegeGuardManager.getInstance().removeSiegeGuards(getCastle()); } _castle.spawnDoor(); // Respawn door to castle + _castle.setFirstMidVictory(false); _castle.getZone().setActive(false); _castle.getZone().updateZoneStatusForCharactersInside(); _castle.getZone().setSiegeInstance(null); @@ -452,6 +453,7 @@ public class Siege implements Siegable addDefender(sc, SiegeClanType.DEFENDER); } } + _castle.setFirstMidVictory(true); teleportPlayer(SiegeTeleportWhoType.Attacker, TeleportWhereType.SIEGEFLAG); // Teleport to the second closest town teleportPlayer(SiegeTeleportWhoType.Spectator, TeleportWhereType.TOWN); // Teleport to the second closest town removeDefenderFlags(); // Removes defenders' flags diff --git a/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java b/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java index 1a95ac29be..13aca7de62 100644 --- a/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java +++ b/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java @@ -84,6 +84,13 @@ public class NotFriend implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriend implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // At this point summon should be prevented from attacking friendly targets. if (creature.isSummon() && (target == creature.getTarget())) { diff --git a/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java b/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java index 27adfc38e6..f1651ed5b0 100644 --- a/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java +++ b/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java @@ -84,6 +84,13 @@ public class NotFriendPc implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriendPc implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // By default any flagged/PK player is considered enemy. return (target.getActingPlayer().getPvpFlag() > 0) || (target.getActingPlayer().getReputation() < 0); } diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/Player.java index 62c6ff63aa..8fdac98b0f 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -1687,6 +1687,13 @@ public class Player extends Playable return false; } + // Check first castle mid victory. + final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); + if ((castle != null) && !castle.isFirstMidVictory()) + { + return true; + } + // If target isn't a player, is self, isn't on same siege or not on same state, not friends. final Player targetPlayer = target.getActingPlayer(); if ((targetPlayer == null) || (targetPlayer == this) || (targetPlayer.getSiegeSide() != _siegeSide) || (_siegeState != targetPlayer.getSiegeState())) @@ -1697,7 +1704,6 @@ public class Player extends Playable // Attackers are considered friends only if castle has no owner. if (_siegeState == 1) { - final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); if (castle == null) { return false; @@ -8276,16 +8282,17 @@ public class Player extends Playable final Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ()); if (siege != null) { - // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan + // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan. if (siege.checkIsDefender(attackerClan) && siege.checkIsDefender(clan)) { return false; } - // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan + // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan. if (siege.checkIsAttacker(attackerClan) && siege.checkIsAttacker(clan)) { - return false; + // If first mid victory is achieved, attackers can attack attackers. + return CastleManager.getInstance().getCastleById(_siegeSide).isFirstMidVictory(); } } diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/siege/Castle.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/siege/Castle.java index 6669f1fc57..063570e334 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/siege/Castle.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/siege/Castle.java @@ -85,6 +85,7 @@ public class Castle extends AbstractResidence private final List _artefacts = new ArrayList<>(1); private final Map _function = new ConcurrentHashMap<>(); private int _ticketBuyCount = 0; + private boolean _isFirstMidVictory = false; /** Castle Functions */ public static final int FUNC_TELEPORT = 1; @@ -915,6 +916,16 @@ public class Castle extends AbstractResidence return _doors; } + public boolean isFirstMidVictory() + { + return _isFirstMidVictory; + } + + public void setFirstMidVictory(boolean value) + { + _isFirstMidVictory = value; + } + @Override public int getOwnerId() { diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/siege/Siege.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/siege/Siege.java index c972187019..d78aa5ee0a 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/siege/Siege.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/siege/Siege.java @@ -338,6 +338,7 @@ public class Siege implements Siegable SiegeGuardManager.getInstance().removeSiegeGuards(getCastle()); } _castle.spawnDoor(); // Respawn door to castle + _castle.setFirstMidVictory(false); _castle.getZone().setActive(false); _castle.getZone().updateZoneStatusForCharactersInside(); _castle.getZone().setSiegeInstance(null); @@ -452,6 +453,7 @@ public class Siege implements Siegable addDefender(sc, SiegeClanType.DEFENDER); } } + _castle.setFirstMidVictory(true); teleportPlayer(SiegeTeleportWhoType.Attacker, TeleportWhereType.SIEGEFLAG); // Teleport to the second closest town teleportPlayer(SiegeTeleportWhoType.Spectator, TeleportWhereType.TOWN); // Teleport to the second closest town removeDefenderFlags(); // Removes defenders' flags diff --git a/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java b/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java index 1a95ac29be..13aca7de62 100644 --- a/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java +++ b/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java @@ -84,6 +84,13 @@ public class NotFriend implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriend implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // At this point summon should be prevented from attacking friendly targets. if (creature.isSummon() && (target == creature.getTarget())) { diff --git a/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java b/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java index 27adfc38e6..f1651ed5b0 100644 --- a/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java +++ b/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java @@ -84,6 +84,13 @@ public class NotFriendPc implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriendPc implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // By default any flagged/PK player is considered enemy. return (target.getActingPlayer().getPvpFlag() > 0) || (target.getActingPlayer().getReputation() < 0); } diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/Player.java index e6b5db270a..976d040639 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -1687,6 +1687,13 @@ public class Player extends Playable return false; } + // Check first castle mid victory. + final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); + if ((castle != null) && !castle.isFirstMidVictory()) + { + return true; + } + // If target isn't a player, is self, isn't on same siege or not on same state, not friends. final Player targetPlayer = target.getActingPlayer(); if ((targetPlayer == null) || (targetPlayer == this) || (targetPlayer.getSiegeSide() != _siegeSide) || (_siegeState != targetPlayer.getSiegeState())) @@ -1697,7 +1704,6 @@ public class Player extends Playable // Attackers are considered friends only if castle has no owner. if (_siegeState == 1) { - final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); if (castle == null) { return false; @@ -8277,16 +8283,17 @@ public class Player extends Playable final Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ()); if (siege != null) { - // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan + // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan. if (siege.checkIsDefender(attackerClan) && siege.checkIsDefender(clan)) { return false; } - // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan + // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan. if (siege.checkIsAttacker(attackerClan) && siege.checkIsAttacker(clan)) { - return false; + // If first mid victory is achieved, attackers can attack attackers. + return CastleManager.getInstance().getCastleById(_siegeSide).isFirstMidVictory(); } } diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/siege/Castle.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/siege/Castle.java index 6669f1fc57..063570e334 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/siege/Castle.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/siege/Castle.java @@ -85,6 +85,7 @@ public class Castle extends AbstractResidence private final List _artefacts = new ArrayList<>(1); private final Map _function = new ConcurrentHashMap<>(); private int _ticketBuyCount = 0; + private boolean _isFirstMidVictory = false; /** Castle Functions */ public static final int FUNC_TELEPORT = 1; @@ -915,6 +916,16 @@ public class Castle extends AbstractResidence return _doors; } + public boolean isFirstMidVictory() + { + return _isFirstMidVictory; + } + + public void setFirstMidVictory(boolean value) + { + _isFirstMidVictory = value; + } + @Override public int getOwnerId() { diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/siege/Siege.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/siege/Siege.java index c972187019..d78aa5ee0a 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/siege/Siege.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/siege/Siege.java @@ -338,6 +338,7 @@ public class Siege implements Siegable SiegeGuardManager.getInstance().removeSiegeGuards(getCastle()); } _castle.spawnDoor(); // Respawn door to castle + _castle.setFirstMidVictory(false); _castle.getZone().setActive(false); _castle.getZone().updateZoneStatusForCharactersInside(); _castle.getZone().setSiegeInstance(null); @@ -452,6 +453,7 @@ public class Siege implements Siegable addDefender(sc, SiegeClanType.DEFENDER); } } + _castle.setFirstMidVictory(true); teleportPlayer(SiegeTeleportWhoType.Attacker, TeleportWhereType.SIEGEFLAG); // Teleport to the second closest town teleportPlayer(SiegeTeleportWhoType.Spectator, TeleportWhereType.TOWN); // Teleport to the second closest town removeDefenderFlags(); // Removes defenders' flags diff --git a/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java index 1a95ac29be..13aca7de62 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java +++ b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java @@ -84,6 +84,13 @@ public class NotFriend implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriend implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // At this point summon should be prevented from attacking friendly targets. if (creature.isSummon() && (target == creature.getTarget())) { diff --git a/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java index 27adfc38e6..f1651ed5b0 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java +++ b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java @@ -84,6 +84,13 @@ public class NotFriendPc implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriendPc implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // By default any flagged/PK player is considered enemy. return (target.getActingPlayer().getPvpFlag() > 0) || (target.getActingPlayer().getReputation() < 0); } diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/Player.java index 146942cf96..795ffd9eb4 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -1705,6 +1705,13 @@ public class Player extends Playable return false; } + // Check first castle mid victory. + final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); + if ((castle != null) && !castle.isFirstMidVictory()) + { + return true; + } + // If target isn't a player, is self, isn't on same siege or not on same state, not friends. final Player targetPlayer = target.getActingPlayer(); if ((targetPlayer == null) || (targetPlayer == this) || (targetPlayer.getSiegeSide() != _siegeSide) || (_siegeState != targetPlayer.getSiegeState())) @@ -1715,7 +1722,6 @@ public class Player extends Playable // Attackers are considered friends only if castle has no owner. if (_siegeState == 1) { - final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); if (castle == null) { return false; @@ -8292,16 +8298,17 @@ public class Player extends Playable final Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ()); if (siege != null) { - // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan + // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan. if (siege.checkIsDefender(attackerClan) && siege.checkIsDefender(clan)) { return false; } - // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan + // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan. if (siege.checkIsAttacker(attackerClan) && siege.checkIsAttacker(clan)) { - return false; + // If first mid victory is achieved, attackers can attack attackers. + return CastleManager.getInstance().getCastleById(_siegeSide).isFirstMidVictory(); } } diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/siege/Castle.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/siege/Castle.java index 6669f1fc57..063570e334 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/siege/Castle.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/siege/Castle.java @@ -85,6 +85,7 @@ public class Castle extends AbstractResidence private final List _artefacts = new ArrayList<>(1); private final Map _function = new ConcurrentHashMap<>(); private int _ticketBuyCount = 0; + private boolean _isFirstMidVictory = false; /** Castle Functions */ public static final int FUNC_TELEPORT = 1; @@ -915,6 +916,16 @@ public class Castle extends AbstractResidence return _doors; } + public boolean isFirstMidVictory() + { + return _isFirstMidVictory; + } + + public void setFirstMidVictory(boolean value) + { + _isFirstMidVictory = value; + } + @Override public int getOwnerId() { diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/siege/Siege.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/siege/Siege.java index 7e7f064907..3eb91c09e5 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/siege/Siege.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/siege/Siege.java @@ -340,6 +340,7 @@ public class Siege implements Siegable SiegeGuardManager.getInstance().removeSiegeGuards(getCastle()); } _castle.spawnDoor(); // Respawn door to castle + _castle.setFirstMidVictory(false); _castle.getZone().setActive(false); _castle.getZone().updateZoneStatusForCharactersInside(); _castle.getZone().setSiegeInstance(null); @@ -454,6 +455,7 @@ public class Siege implements Siegable addDefender(sc, SiegeClanType.DEFENDER); } } + _castle.setFirstMidVictory(true); teleportPlayer(SiegeTeleportWhoType.Attacker, TeleportWhereType.SIEGEFLAG); // Teleport to the second closest town teleportPlayer(SiegeTeleportWhoType.Spectator, TeleportWhereType.TOWN); // Teleport to the second closest town removeDefenderFlags(); // Removes defenders' flags diff --git a/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java b/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java index 1a95ac29be..13aca7de62 100644 --- a/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java +++ b/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java @@ -84,6 +84,13 @@ public class NotFriend implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriend implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // At this point summon should be prevented from attacking friendly targets. if (creature.isSummon() && (target == creature.getTarget())) { diff --git a/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java b/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java index 27adfc38e6..f1651ed5b0 100644 --- a/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java +++ b/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java @@ -84,6 +84,13 @@ public class NotFriendPc implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriendPc implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // By default any flagged/PK player is considered enemy. return (target.getActingPlayer().getPvpFlag() > 0) || (target.getActingPlayer().getReputation() < 0); } diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/Player.java index 7c1d3db8ac..a447ba7596 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -1707,6 +1707,13 @@ public class Player extends Playable return false; } + // Check first castle mid victory. + final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); + if ((castle != null) && !castle.isFirstMidVictory()) + { + return true; + } + // If target isn't a player, is self, isn't on same siege or not on same state, not friends. final Player targetPlayer = target.getActingPlayer(); if ((targetPlayer == null) || (targetPlayer == this) || (targetPlayer.getSiegeSide() != _siegeSide) || (_siegeState != targetPlayer.getSiegeState())) @@ -1717,7 +1724,6 @@ public class Player extends Playable // Attackers are considered friends only if castle has no owner. if (_siegeState == 1) { - final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); if (castle == null) { return false; @@ -8394,16 +8400,17 @@ public class Player extends Playable final Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ()); if (siege != null) { - // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan + // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan. if (siege.checkIsDefender(attackerClan) && siege.checkIsDefender(clan)) { return false; } - // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan + // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan. if (siege.checkIsAttacker(attackerClan) && siege.checkIsAttacker(clan)) { - return false; + // If first mid victory is achieved, attackers can attack attackers. + return CastleManager.getInstance().getCastleById(_siegeSide).isFirstMidVictory(); } } diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/siege/Castle.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/siege/Castle.java index 6669f1fc57..063570e334 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/siege/Castle.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/siege/Castle.java @@ -85,6 +85,7 @@ public class Castle extends AbstractResidence private final List _artefacts = new ArrayList<>(1); private final Map _function = new ConcurrentHashMap<>(); private int _ticketBuyCount = 0; + private boolean _isFirstMidVictory = false; /** Castle Functions */ public static final int FUNC_TELEPORT = 1; @@ -915,6 +916,16 @@ public class Castle extends AbstractResidence return _doors; } + public boolean isFirstMidVictory() + { + return _isFirstMidVictory; + } + + public void setFirstMidVictory(boolean value) + { + _isFirstMidVictory = value; + } + @Override public int getOwnerId() { diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/siege/Siege.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/siege/Siege.java index 569fc8f7ff..5583e123ce 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/siege/Siege.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/siege/Siege.java @@ -338,6 +338,7 @@ public class Siege implements Siegable SiegeGuardManager.getInstance().removeSiegeGuards(getCastle()); } _castle.spawnDoor(); // Respawn door to castle + _castle.setFirstMidVictory(false); _castle.getZone().setActive(false); _castle.getZone().updateZoneStatusForCharactersInside(); _castle.getZone().setSiegeInstance(null); @@ -452,6 +453,7 @@ public class Siege implements Siegable addDefender(sc, SiegeClanType.DEFENDER); } } + _castle.setFirstMidVictory(true); teleportPlayer(SiegeTeleportWhoType.Attacker, TeleportWhereType.SIEGEFLAG); // Teleport to the second closest town teleportPlayer(SiegeTeleportWhoType.Spectator, TeleportWhereType.TOWN); // Teleport to the second closest town removeDefenderFlags(); // Removes defenders' flags diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java index 1a95ac29be..13aca7de62 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java @@ -84,6 +84,13 @@ public class NotFriend implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriend implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // At this point summon should be prevented from attacking friendly targets. if (creature.isSummon() && (target == creature.getTarget())) { diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java index 27adfc38e6..f1651ed5b0 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java @@ -84,6 +84,13 @@ public class NotFriendPc implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriendPc implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // By default any flagged/PK player is considered enemy. return (target.getActingPlayer().getPvpFlag() > 0) || (target.getActingPlayer().getReputation() < 0); } diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/Player.java index 73e16b1803..21e7d94552 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -1724,6 +1724,13 @@ public class Player extends Playable return false; } + // Check first castle mid victory. + final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); + if ((castle != null) && !castle.isFirstMidVictory()) + { + return true; + } + // If target isn't a player, is self, isn't on same siege or not on same state, not friends. final Player targetPlayer = target.getActingPlayer(); if ((targetPlayer == null) || (targetPlayer == this) || (targetPlayer.getSiegeSide() != _siegeSide) || (_siegeState != targetPlayer.getSiegeState())) @@ -1734,7 +1741,6 @@ public class Player extends Playable // Attackers are considered friends only if castle has no owner. if (_siegeState == 1) { - final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); if (castle == null) { return false; @@ -8420,16 +8426,17 @@ public class Player extends Playable final Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ()); if (siege != null) { - // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan + // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan. if (siege.checkIsDefender(attackerClan) && siege.checkIsDefender(clan)) { return false; } - // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan + // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan. if (siege.checkIsAttacker(attackerClan) && siege.checkIsAttacker(clan)) { - return false; + // If first mid victory is achieved, attackers can attack attackers. + return CastleManager.getInstance().getCastleById(_siegeSide).isFirstMidVictory(); } } diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/siege/Castle.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/siege/Castle.java index 6669f1fc57..063570e334 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/siege/Castle.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/siege/Castle.java @@ -85,6 +85,7 @@ public class Castle extends AbstractResidence private final List _artefacts = new ArrayList<>(1); private final Map _function = new ConcurrentHashMap<>(); private int _ticketBuyCount = 0; + private boolean _isFirstMidVictory = false; /** Castle Functions */ public static final int FUNC_TELEPORT = 1; @@ -915,6 +916,16 @@ public class Castle extends AbstractResidence return _doors; } + public boolean isFirstMidVictory() + { + return _isFirstMidVictory; + } + + public void setFirstMidVictory(boolean value) + { + _isFirstMidVictory = value; + } + @Override public int getOwnerId() { diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/siege/Siege.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/siege/Siege.java index 569fc8f7ff..5583e123ce 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/siege/Siege.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/siege/Siege.java @@ -338,6 +338,7 @@ public class Siege implements Siegable SiegeGuardManager.getInstance().removeSiegeGuards(getCastle()); } _castle.spawnDoor(); // Respawn door to castle + _castle.setFirstMidVictory(false); _castle.getZone().setActive(false); _castle.getZone().updateZoneStatusForCharactersInside(); _castle.getZone().setSiegeInstance(null); @@ -452,6 +453,7 @@ public class Siege implements Siegable addDefender(sc, SiegeClanType.DEFENDER); } } + _castle.setFirstMidVictory(true); teleportPlayer(SiegeTeleportWhoType.Attacker, TeleportWhereType.SIEGEFLAG); // Teleport to the second closest town teleportPlayer(SiegeTeleportWhoType.Spectator, TeleportWhereType.TOWN); // Teleport to the second closest town removeDefenderFlags(); // Removes defenders' flags diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java b/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java index 1a95ac29be..13aca7de62 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java @@ -84,6 +84,13 @@ public class NotFriend implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriend implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // At this point summon should be prevented from attacking friendly targets. if (creature.isSummon() && (target == creature.getTarget())) { diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java b/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java index 27adfc38e6..f1651ed5b0 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java @@ -84,6 +84,13 @@ public class NotFriendPc implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriendPc implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // By default any flagged/PK player is considered enemy. return (target.getActingPlayer().getPvpFlag() > 0) || (target.getActingPlayer().getReputation() < 0); } diff --git a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java index 4dc9a5d3b3..160e30a455 100644 --- a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -1726,6 +1726,13 @@ public class Player extends Playable return false; } + // Check first castle mid victory. + final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); + if ((castle != null) && !castle.isFirstMidVictory()) + { + return true; + } + // If target isn't a player, is self, isn't on same siege or not on same state, not friends. final Player targetPlayer = target.getActingPlayer(); if ((targetPlayer == null) || (targetPlayer == this) || (targetPlayer.getSiegeSide() != _siegeSide) || (_siegeState != targetPlayer.getSiegeState())) @@ -1736,7 +1743,6 @@ public class Player extends Playable // Attackers are considered friends only if castle has no owner. if (_siegeState == 1) { - final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); if (castle == null) { return false; @@ -8457,16 +8463,17 @@ public class Player extends Playable final Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ()); if (siege != null) { - // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan + // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan. if (siege.checkIsDefender(attackerClan) && siege.checkIsDefender(clan)) { return false; } - // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan + // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan. if (siege.checkIsAttacker(attackerClan) && siege.checkIsAttacker(clan)) { - return false; + // If first mid victory is achieved, attackers can attack attackers. + return CastleManager.getInstance().getCastleById(_siegeSide).isFirstMidVictory(); } } diff --git a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/siege/Castle.java b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/siege/Castle.java index 6669f1fc57..063570e334 100644 --- a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/siege/Castle.java +++ b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/siege/Castle.java @@ -85,6 +85,7 @@ public class Castle extends AbstractResidence private final List _artefacts = new ArrayList<>(1); private final Map _function = new ConcurrentHashMap<>(); private int _ticketBuyCount = 0; + private boolean _isFirstMidVictory = false; /** Castle Functions */ public static final int FUNC_TELEPORT = 1; @@ -915,6 +916,16 @@ public class Castle extends AbstractResidence return _doors; } + public boolean isFirstMidVictory() + { + return _isFirstMidVictory; + } + + public void setFirstMidVictory(boolean value) + { + _isFirstMidVictory = value; + } + @Override public int getOwnerId() { diff --git a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/siege/Siege.java b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/siege/Siege.java index 00645dca90..406915baec 100644 --- a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/siege/Siege.java +++ b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/siege/Siege.java @@ -338,6 +338,7 @@ public class Siege implements Siegable SiegeGuardManager.getInstance().removeSiegeGuards(getCastle()); } _castle.spawnDoor(); // Respawn door to castle + _castle.setFirstMidVictory(false); _castle.getZone().setActive(false); _castle.getZone().updateZoneStatusForCharactersInside(); _castle.getZone().setSiegeInstance(null); @@ -452,6 +453,7 @@ public class Siege implements Siegable addDefender(sc, SiegeClanType.DEFENDER); } } + _castle.setFirstMidVictory(true); teleportPlayer(SiegeTeleportWhoType.Attacker, TeleportWhereType.SIEGEFLAG); // Teleport to the second closest town teleportPlayer(SiegeTeleportWhoType.Spectator, TeleportWhereType.TOWN); // Teleport to the second closest town removeDefenderFlags(); // Removes defenders' flags diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/Player.java index 68cd628d74..62a5450855 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -1634,6 +1634,13 @@ public class Player extends Playable return false; } + // Check first castle mid victory. + final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); + if ((castle != null) && !castle.isFirstMidVictory()) + { + return true; + } + // If target isn't a player, is self, isn't on same siege or not on same state, not friends. final Player targetPlayer = target.getActingPlayer(); if ((targetPlayer == null) || (targetPlayer == this) || (targetPlayer.getSiegeSide() != _siegeSide) || (_siegeState != targetPlayer.getSiegeState())) @@ -1644,7 +1651,6 @@ public class Player extends Playable // Attackers are considered friends only if castle has no owner. if (_siegeState == 1) { - final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); if (castle == null) { return false; @@ -8474,16 +8480,16 @@ public class Player extends Playable final Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ()); if (siege != null) { - // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan + // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan. if (siege.checkIsDefender(attackerPlayer.getClan()) && siege.checkIsDefender(getClan())) { return false; } - // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan + // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan. if (siege.checkIsAttacker(attackerPlayer.getClan()) && siege.checkIsAttacker(getClan())) { - return false; + return CastleManager.getInstance().getCastleById(_siegeSide).isFirstMidVictory(); } } diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/siege/Castle.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/siege/Castle.java index f5736c1998..aeffed81cb 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/siege/Castle.java +++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/siege/Castle.java @@ -81,6 +81,7 @@ public class Castle extends AbstractResidence private final List _artefacts = new ArrayList<>(1); private final Map _function; private int _ticketBuyCount = 0; + private boolean _isFirstMidVictory = false; /** Castle Functions */ public static final int FUNC_TELEPORT = 1; @@ -397,6 +398,16 @@ public class Castle extends AbstractResidence return _zone; } + public boolean isFirstMidVictory() + { + return _isFirstMidVictory; + } + + public void setFirstMidVictory(boolean value) + { + _isFirstMidVictory = value; + } + @Override public CastleZone getResidenceZone() { diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/siege/Siege.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/siege/Siege.java index 451fb648a0..b55eb41033 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/siege/Siege.java +++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/siege/Siege.java @@ -252,15 +252,15 @@ public class Siege implements Siegable if (_isInProgress) { SystemMessage sm = new SystemMessage(SystemMessageId.THE_S1_SIEGE_HAS_FINISHED); - sm.addCastleId(getCastle().getResidenceId()); + sm.addCastleId(_castle.getResidenceId()); Broadcast.toAllOnlinePlayers(sm); Broadcast.toAllOnlinePlayers(new PlaySound("systemmsg_e.18")); - if (getCastle().getOwnerId() > 0) + if (_castle.getOwnerId() > 0) { - final Clan clan = ClanTable.getInstance().getClan(getCastle().getOwnerId()); + final Clan clan = ClanTable.getInstance().getClan(_castle.getOwnerId()); sm = new SystemMessage(SystemMessageId.CLAN_S1_IS_VICTORIOUS_OVER_S2_S_CASTLE_SIEGE); sm.addString(clan.getName()); - sm.addCastleId(getCastle().getResidenceId()); + sm.addCastleId(_castle.getResidenceId()); Broadcast.toAllOnlinePlayers(sm); if (clan.getId() == _firstOwnerClanId) @@ -270,7 +270,7 @@ public class Siege implements Siegable } else { - getCastle().setTicketBuyCount(0); + _castle.setTicketBuyCount(0); for (ClanMember member : clan.getMembers()) { if (member != null) @@ -278,7 +278,7 @@ public class Siege implements Siegable final Player player = member.getPlayer(); if ((player != null) && player.isNoble()) { - Hero.getInstance().setCastleTaken(player.getObjectId(), getCastle().getResidenceId()); + Hero.getInstance().setCastleTaken(player.getObjectId(), _castle.getResidenceId()); } } } @@ -287,7 +287,7 @@ public class Siege implements Siegable else { sm = new SystemMessage(SystemMessageId.THE_SIEGE_OF_S1_HAS_ENDED_IN_A_DRAW); - sm.addCastleId(getCastle().getResidenceId()); + sm.addCastleId(_castle.getResidenceId()); Broadcast.toAllOnlinePlayers(sm); } @@ -315,7 +315,7 @@ public class Siege implements Siegable clan.clearSiegeDeaths(); } - getCastle().updateClansReputation(); + _castle.updateClansReputation(); removeFlags(); // Removes all flags. Note: Remove flag before teleporting players teleportPlayer(SiegeTeleportWhoType.NotOwner, TeleportWhereType.TOWN); // Teleport to the second closest town _isInProgress = false; // Flag so that siege instance can be started @@ -324,17 +324,18 @@ public class Siege implements Siegable clearSiegeClan(); // Clear siege clan from db removeTowers(); // Remove all towers from this castle _siegeGuardManager.unspawnSiegeGuard(); // Remove all spawned siege guard from this castle - if (getCastle().getOwnerId() > 0) + if (_castle.getOwnerId() > 0) { _siegeGuardManager.removeMercs(); } - getCastle().spawnDoor(); // Respawn door to castle - getCastle().getZone().setActive(false); - getCastle().getZone().updateZoneStatusForCharactersInside(); - getCastle().getZone().setSiegeInstance(null); + _castle.spawnDoor(); // Respawn door to castle + _castle.setFirstMidVictory(false); + _castle.getZone().setActive(false); + _castle.getZone().updateZoneStatusForCharactersInside(); + _castle.getZone().setSiegeInstance(null); // Notify to scripts. - EventDispatcher.getInstance().notifyEventAsync(new OnCastleSiegeFinish(this), getCastle()); + EventDispatcher.getInstance().notifyEventAsync(new OnCastleSiegeFinish(this), _castle); } } @@ -381,24 +382,23 @@ public class Siege implements Siegable { if (_isInProgress) // Siege still in progress { - if (getCastle().getOwnerId() > 0) + if (_castle.getOwnerId() > 0) { _siegeGuardManager.removeMercs(); // Remove all merc entry from db } if (getDefenderClans().isEmpty() && // If defender doesn't exist (Pc vs Npc) - (getAttackerClans().size() == 1 // Only 1 attacker - )) + (getAttackerClans().size() == 1)) // Only 1 attacker { - final SiegeClan scNewOwner = getAttackerClan(getCastle().getOwnerId()); + final SiegeClan scNewOwner = getAttackerClan(_castle.getOwnerId()); removeAttacker(scNewOwner); addDefender(scNewOwner, SiegeClanType.OWNER); endSiege(); return; } - if (getCastle().getOwnerId() > 0) + if (_castle.getOwnerId() > 0) { - final int allyId = ClanTable.getInstance().getClan(getCastle().getOwnerId()).getAllyId(); + final int allyId = ClanTable.getInstance().getClan(_castle.getOwnerId()).getAllyId(); // If defender doesn't exist (Pc vs Npc) and only an alliance attacks and the player's clan is in an alliance if (getDefenderClans().isEmpty() && (allyId != 0)) { @@ -412,7 +412,7 @@ public class Siege implements Siegable } if (allinsamealliance) { - final SiegeClan scNewOwner = getAttackerClan(getCastle().getOwnerId()); + final SiegeClan scNewOwner = getAttackerClan(_castle.getOwnerId()); removeAttacker(scNewOwner); addDefender(scNewOwner, SiegeClanType.OWNER); endSiege(); @@ -429,7 +429,7 @@ public class Siege implements Siegable } } - final SiegeClan scNewOwner = getAttackerClan(getCastle().getOwnerId()); + final SiegeClan scNewOwner = getAttackerClan(_castle.getOwnerId()); removeAttacker(scNewOwner); addDefender(scNewOwner, SiegeClanType.OWNER); @@ -443,11 +443,12 @@ public class Siege implements Siegable addDefender(sc, SiegeClanType.DEFENDER); } } + _castle.setFirstMidVictory(true); teleportPlayer(SiegeTeleportWhoType.Attacker, TeleportWhereType.SIEGEFLAG); // Teleport to the second closest town teleportPlayer(SiegeTeleportWhoType.Spectator, TeleportWhereType.TOWN); // Teleport to the second closest town removeDefenderFlags(); // Removes defenders' flags - getCastle().removeUpgrade(); // Remove all castle upgrade - getCastle().spawnDoor(true); // Respawn door to castle but make them weaker (50% hp) + _castle.removeUpgrade(); // Remove all castle upgrade + _castle.spawnDoor(true); // Respawn door to castle but make them weaker (50% hp) removeTowers(); // Remove all towers from this castle _controlTowerCount = 0; // Each new siege midvictory CT are completely respawned. spawnControlTower(); @@ -455,7 +456,7 @@ public class Siege implements Siegable updatePlayerSiegeStateFlags(false); // Notify to scripts. - EventDispatcher.getInstance().notifyEventAsync(new OnCastleSiegeOwnerChange(this), getCastle()); + EventDispatcher.getInstance().notifyEventAsync(new OnCastleSiegeOwnerChange(this), _castle); } } } @@ -468,7 +469,7 @@ public class Siege implements Siegable { if (!_isInProgress) { - _firstOwnerClanId = getCastle().getOwnerId(); + _firstOwnerClanId = _castle.getOwnerId(); if (getAttackerClans().isEmpty()) { SystemMessage sm; @@ -482,7 +483,7 @@ public class Siege implements Siegable final Clan ownerClan = ClanTable.getInstance().getClan(_firstOwnerClanId); ownerClan.increaseBloodAllianceCount(); } - sm.addCastleId(getCastle().getResidenceId()); + sm.addCastleId(_castle.getResidenceId()); Broadcast.toAllOnlinePlayers(sm); saveCastleSiege(); return; @@ -496,25 +497,25 @@ public class Siege implements Siegable _controlTowerCount = 0; spawnControlTower(); // Spawn control tower spawnFlameTower(); // Spawn control tower - getCastle().spawnDoor(); // Spawn door + _castle.spawnDoor(); // Spawn door spawnSiegeGuard(); // Spawn siege guard - MercTicketManager.getInstance().deleteTickets(getCastle().getResidenceId()); // remove the tickets from the ground - getCastle().getZone().setSiegeInstance(this); - getCastle().getZone().setActive(true); - getCastle().getZone().updateZoneStatusForCharactersInside(); + MercTicketManager.getInstance().deleteTickets(_castle.getResidenceId()); // remove the tickets from the ground + _castle.getZone().setSiegeInstance(this); + _castle.getZone().setActive(true); + _castle.getZone().updateZoneStatusForCharactersInside(); // Schedule a task to prepare auto siege end _siegeEndDate = Calendar.getInstance(); _siegeEndDate.add(Calendar.MINUTE, SiegeManager.getInstance().getSiegeLength()); - ThreadPool.schedule(new ScheduleEndSiegeTask(getCastle()), 1000); // Prepare auto end task + ThreadPool.schedule(new ScheduleEndSiegeTask(_castle), 1000); // Prepare auto end task final SystemMessage sm = new SystemMessage(SystemMessageId.THE_S1_SIEGE_HAS_STARTED); - sm.addCastleId(getCastle().getResidenceId()); + sm.addCastleId(_castle.getResidenceId()); Broadcast.toAllOnlinePlayers(sm); Broadcast.toAllOnlinePlayers(new PlaySound("systemmsg_e.17")); // Notify to scripts. - EventDispatcher.getInstance().notifyEventAsync(new OnCastleSiegeStart(this), getCastle()); + EventDispatcher.getInstance().notifyEventAsync(new OnCastleSiegeStart(this), _castle); } } diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/Player.java index 2e542d9b91..bfef69c9ce 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -1655,6 +1655,13 @@ public class Player extends Playable return false; } + // Check first castle mid victory. + final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); + if ((castle != null) && !castle.isFirstMidVictory()) + { + return true; + } + // If target isn't a player, is self, isn't on same siege or not on same state, not friends. final Player targetPlayer = target.getActingPlayer(); if ((targetPlayer == null) || (targetPlayer == this) || (targetPlayer.getSiegeSide() != _siegeSide) || (_siegeState != targetPlayer.getSiegeState())) @@ -1665,7 +1672,6 @@ public class Player extends Playable // Attackers are considered friends only if castle has no owner. if (_siegeState == 1) { - final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); if (castle == null) { return false; @@ -8358,16 +8364,16 @@ public class Player extends Playable final Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ()); if (siege != null) { - // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan + // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan. if (siege.checkIsDefender(attackerPlayer.getClan()) && siege.checkIsDefender(getClan())) { return false; } - // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan + // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan. if (siege.checkIsAttacker(attackerPlayer.getClan()) && siege.checkIsAttacker(getClan())) { - return false; + return CastleManager.getInstance().getCastleById(_siegeSide).isFirstMidVictory(); } } diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/siege/Castle.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/siege/Castle.java index f5736c1998..aeffed81cb 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/siege/Castle.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/siege/Castle.java @@ -81,6 +81,7 @@ public class Castle extends AbstractResidence private final List _artefacts = new ArrayList<>(1); private final Map _function; private int _ticketBuyCount = 0; + private boolean _isFirstMidVictory = false; /** Castle Functions */ public static final int FUNC_TELEPORT = 1; @@ -397,6 +398,16 @@ public class Castle extends AbstractResidence return _zone; } + public boolean isFirstMidVictory() + { + return _isFirstMidVictory; + } + + public void setFirstMidVictory(boolean value) + { + _isFirstMidVictory = value; + } + @Override public CastleZone getResidenceZone() { diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/siege/Siege.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/siege/Siege.java index 451fb648a0..b55eb41033 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/siege/Siege.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/siege/Siege.java @@ -252,15 +252,15 @@ public class Siege implements Siegable if (_isInProgress) { SystemMessage sm = new SystemMessage(SystemMessageId.THE_S1_SIEGE_HAS_FINISHED); - sm.addCastleId(getCastle().getResidenceId()); + sm.addCastleId(_castle.getResidenceId()); Broadcast.toAllOnlinePlayers(sm); Broadcast.toAllOnlinePlayers(new PlaySound("systemmsg_e.18")); - if (getCastle().getOwnerId() > 0) + if (_castle.getOwnerId() > 0) { - final Clan clan = ClanTable.getInstance().getClan(getCastle().getOwnerId()); + final Clan clan = ClanTable.getInstance().getClan(_castle.getOwnerId()); sm = new SystemMessage(SystemMessageId.CLAN_S1_IS_VICTORIOUS_OVER_S2_S_CASTLE_SIEGE); sm.addString(clan.getName()); - sm.addCastleId(getCastle().getResidenceId()); + sm.addCastleId(_castle.getResidenceId()); Broadcast.toAllOnlinePlayers(sm); if (clan.getId() == _firstOwnerClanId) @@ -270,7 +270,7 @@ public class Siege implements Siegable } else { - getCastle().setTicketBuyCount(0); + _castle.setTicketBuyCount(0); for (ClanMember member : clan.getMembers()) { if (member != null) @@ -278,7 +278,7 @@ public class Siege implements Siegable final Player player = member.getPlayer(); if ((player != null) && player.isNoble()) { - Hero.getInstance().setCastleTaken(player.getObjectId(), getCastle().getResidenceId()); + Hero.getInstance().setCastleTaken(player.getObjectId(), _castle.getResidenceId()); } } } @@ -287,7 +287,7 @@ public class Siege implements Siegable else { sm = new SystemMessage(SystemMessageId.THE_SIEGE_OF_S1_HAS_ENDED_IN_A_DRAW); - sm.addCastleId(getCastle().getResidenceId()); + sm.addCastleId(_castle.getResidenceId()); Broadcast.toAllOnlinePlayers(sm); } @@ -315,7 +315,7 @@ public class Siege implements Siegable clan.clearSiegeDeaths(); } - getCastle().updateClansReputation(); + _castle.updateClansReputation(); removeFlags(); // Removes all flags. Note: Remove flag before teleporting players teleportPlayer(SiegeTeleportWhoType.NotOwner, TeleportWhereType.TOWN); // Teleport to the second closest town _isInProgress = false; // Flag so that siege instance can be started @@ -324,17 +324,18 @@ public class Siege implements Siegable clearSiegeClan(); // Clear siege clan from db removeTowers(); // Remove all towers from this castle _siegeGuardManager.unspawnSiegeGuard(); // Remove all spawned siege guard from this castle - if (getCastle().getOwnerId() > 0) + if (_castle.getOwnerId() > 0) { _siegeGuardManager.removeMercs(); } - getCastle().spawnDoor(); // Respawn door to castle - getCastle().getZone().setActive(false); - getCastle().getZone().updateZoneStatusForCharactersInside(); - getCastle().getZone().setSiegeInstance(null); + _castle.spawnDoor(); // Respawn door to castle + _castle.setFirstMidVictory(false); + _castle.getZone().setActive(false); + _castle.getZone().updateZoneStatusForCharactersInside(); + _castle.getZone().setSiegeInstance(null); // Notify to scripts. - EventDispatcher.getInstance().notifyEventAsync(new OnCastleSiegeFinish(this), getCastle()); + EventDispatcher.getInstance().notifyEventAsync(new OnCastleSiegeFinish(this), _castle); } } @@ -381,24 +382,23 @@ public class Siege implements Siegable { if (_isInProgress) // Siege still in progress { - if (getCastle().getOwnerId() > 0) + if (_castle.getOwnerId() > 0) { _siegeGuardManager.removeMercs(); // Remove all merc entry from db } if (getDefenderClans().isEmpty() && // If defender doesn't exist (Pc vs Npc) - (getAttackerClans().size() == 1 // Only 1 attacker - )) + (getAttackerClans().size() == 1)) // Only 1 attacker { - final SiegeClan scNewOwner = getAttackerClan(getCastle().getOwnerId()); + final SiegeClan scNewOwner = getAttackerClan(_castle.getOwnerId()); removeAttacker(scNewOwner); addDefender(scNewOwner, SiegeClanType.OWNER); endSiege(); return; } - if (getCastle().getOwnerId() > 0) + if (_castle.getOwnerId() > 0) { - final int allyId = ClanTable.getInstance().getClan(getCastle().getOwnerId()).getAllyId(); + final int allyId = ClanTable.getInstance().getClan(_castle.getOwnerId()).getAllyId(); // If defender doesn't exist (Pc vs Npc) and only an alliance attacks and the player's clan is in an alliance if (getDefenderClans().isEmpty() && (allyId != 0)) { @@ -412,7 +412,7 @@ public class Siege implements Siegable } if (allinsamealliance) { - final SiegeClan scNewOwner = getAttackerClan(getCastle().getOwnerId()); + final SiegeClan scNewOwner = getAttackerClan(_castle.getOwnerId()); removeAttacker(scNewOwner); addDefender(scNewOwner, SiegeClanType.OWNER); endSiege(); @@ -429,7 +429,7 @@ public class Siege implements Siegable } } - final SiegeClan scNewOwner = getAttackerClan(getCastle().getOwnerId()); + final SiegeClan scNewOwner = getAttackerClan(_castle.getOwnerId()); removeAttacker(scNewOwner); addDefender(scNewOwner, SiegeClanType.OWNER); @@ -443,11 +443,12 @@ public class Siege implements Siegable addDefender(sc, SiegeClanType.DEFENDER); } } + _castle.setFirstMidVictory(true); teleportPlayer(SiegeTeleportWhoType.Attacker, TeleportWhereType.SIEGEFLAG); // Teleport to the second closest town teleportPlayer(SiegeTeleportWhoType.Spectator, TeleportWhereType.TOWN); // Teleport to the second closest town removeDefenderFlags(); // Removes defenders' flags - getCastle().removeUpgrade(); // Remove all castle upgrade - getCastle().spawnDoor(true); // Respawn door to castle but make them weaker (50% hp) + _castle.removeUpgrade(); // Remove all castle upgrade + _castle.spawnDoor(true); // Respawn door to castle but make them weaker (50% hp) removeTowers(); // Remove all towers from this castle _controlTowerCount = 0; // Each new siege midvictory CT are completely respawned. spawnControlTower(); @@ -455,7 +456,7 @@ public class Siege implements Siegable updatePlayerSiegeStateFlags(false); // Notify to scripts. - EventDispatcher.getInstance().notifyEventAsync(new OnCastleSiegeOwnerChange(this), getCastle()); + EventDispatcher.getInstance().notifyEventAsync(new OnCastleSiegeOwnerChange(this), _castle); } } } @@ -468,7 +469,7 @@ public class Siege implements Siegable { if (!_isInProgress) { - _firstOwnerClanId = getCastle().getOwnerId(); + _firstOwnerClanId = _castle.getOwnerId(); if (getAttackerClans().isEmpty()) { SystemMessage sm; @@ -482,7 +483,7 @@ public class Siege implements Siegable final Clan ownerClan = ClanTable.getInstance().getClan(_firstOwnerClanId); ownerClan.increaseBloodAllianceCount(); } - sm.addCastleId(getCastle().getResidenceId()); + sm.addCastleId(_castle.getResidenceId()); Broadcast.toAllOnlinePlayers(sm); saveCastleSiege(); return; @@ -496,25 +497,25 @@ public class Siege implements Siegable _controlTowerCount = 0; spawnControlTower(); // Spawn control tower spawnFlameTower(); // Spawn control tower - getCastle().spawnDoor(); // Spawn door + _castle.spawnDoor(); // Spawn door spawnSiegeGuard(); // Spawn siege guard - MercTicketManager.getInstance().deleteTickets(getCastle().getResidenceId()); // remove the tickets from the ground - getCastle().getZone().setSiegeInstance(this); - getCastle().getZone().setActive(true); - getCastle().getZone().updateZoneStatusForCharactersInside(); + MercTicketManager.getInstance().deleteTickets(_castle.getResidenceId()); // remove the tickets from the ground + _castle.getZone().setSiegeInstance(this); + _castle.getZone().setActive(true); + _castle.getZone().updateZoneStatusForCharactersInside(); // Schedule a task to prepare auto siege end _siegeEndDate = Calendar.getInstance(); _siegeEndDate.add(Calendar.MINUTE, SiegeManager.getInstance().getSiegeLength()); - ThreadPool.schedule(new ScheduleEndSiegeTask(getCastle()), 1000); // Prepare auto end task + ThreadPool.schedule(new ScheduleEndSiegeTask(_castle), 1000); // Prepare auto end task final SystemMessage sm = new SystemMessage(SystemMessageId.THE_S1_SIEGE_HAS_STARTED); - sm.addCastleId(getCastle().getResidenceId()); + sm.addCastleId(_castle.getResidenceId()); Broadcast.toAllOnlinePlayers(sm); Broadcast.toAllOnlinePlayers(new PlaySound("systemmsg_e.17")); // Notify to scripts. - EventDispatcher.getInstance().notifyEventAsync(new OnCastleSiegeStart(this), getCastle()); + EventDispatcher.getInstance().notifyEventAsync(new OnCastleSiegeStart(this), _castle); } } diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java index 1a95ac29be..13aca7de62 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java @@ -84,6 +84,13 @@ public class NotFriend implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriend implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // At this point summon should be prevented from attacking friendly targets. if (creature.isSummon() && (target == creature.getTarget())) { diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java index 27adfc38e6..f1651ed5b0 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java @@ -84,6 +84,13 @@ public class NotFriendPc implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriendPc implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // By default any flagged/PK player is considered enemy. return (target.getActingPlayer().getPvpFlag() > 0) || (target.getActingPlayer().getReputation() < 0); } diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/Player.java index 44ac347412..344f69ec66 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -1644,6 +1644,13 @@ public class Player extends Playable return false; } + // Check first castle mid victory. + final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); + if ((castle != null) && !castle.isFirstMidVictory()) + { + return true; + } + // If target isn't a player, is self, isn't on same siege or not on same state, not friends. final Player targetPlayer = target.getActingPlayer(); if ((targetPlayer == null) || (targetPlayer == this) || (targetPlayer.getSiegeSide() != _siegeSide) || (_siegeState != targetPlayer.getSiegeState())) @@ -1654,7 +1661,6 @@ public class Player extends Playable // Attackers are considered friends only if castle has no owner. if (_siegeState == 1) { - final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); if (castle == null) { return false; @@ -8168,16 +8174,17 @@ public class Player extends Playable final Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ()); if (siege != null) { - // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan + // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan. if (siege.checkIsDefender(attackerClan) && siege.checkIsDefender(clan)) { return false; } - // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan + // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan. if (siege.checkIsAttacker(attackerClan) && siege.checkIsAttacker(clan)) { - return false; + // If first mid victory is achieved, attackers can attack attackers. + return CastleManager.getInstance().getCastleById(_siegeSide).isFirstMidVictory(); } } diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/siege/Castle.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/siege/Castle.java index 4e3cdc7e02..d053196bec 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/siege/Castle.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/siege/Castle.java @@ -86,6 +86,7 @@ public class Castle extends AbstractResidence private final List _artefacts = new ArrayList<>(1); private final Map _function = new ConcurrentHashMap<>(); private int _ticketBuyCount = 0; + private boolean _isFirstMidVictory = false; /** Castle Functions */ public static final int FUNC_TELEPORT = 1; @@ -916,6 +917,16 @@ public class Castle extends AbstractResidence return _doors; } + public boolean isFirstMidVictory() + { + return _isFirstMidVictory; + } + + public void setFirstMidVictory(boolean value) + { + _isFirstMidVictory = value; + } + @Override public int getOwnerId() { diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/siege/Siege.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/siege/Siege.java index 4017d44308..911f5868fc 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/siege/Siege.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/siege/Siege.java @@ -338,6 +338,7 @@ public class Siege implements Siegable SiegeGuardManager.getInstance().removeSiegeGuards(getCastle()); } _castle.spawnDoor(); // Respawn door to castle + _castle.setFirstMidVictory(false); _castle.getZone().setActive(false); _castle.getZone().updateZoneStatusForCharactersInside(); _castle.getZone().setSiegeInstance(null); @@ -452,6 +453,7 @@ public class Siege implements Siegable addDefender(sc, SiegeClanType.DEFENDER); } } + _castle.setFirstMidVictory(true); teleportPlayer(SiegeTeleportWhoType.Attacker, TeleportWhereType.SIEGEFLAG); // Teleport to the second closest town teleportPlayer(SiegeTeleportWhoType.Spectator, TeleportWhereType.TOWN); // Teleport to the second closest town removeDefenderFlags(); // Removes defenders' flags diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java index 1a95ac29be..13aca7de62 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java +++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java @@ -84,6 +84,13 @@ public class NotFriend implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriend implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // At this point summon should be prevented from attacking friendly targets. if (creature.isSummon() && (target == creature.getTarget())) { diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java index 27adfc38e6..f1651ed5b0 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java +++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java @@ -84,6 +84,13 @@ public class NotFriendPc implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriendPc implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // By default any flagged/PK player is considered enemy. return (target.getActingPlayer().getPvpFlag() > 0) || (target.getActingPlayer().getReputation() < 0); } diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/Player.java index e7cc6baa54..e7b8bf8fac 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -1644,6 +1644,13 @@ public class Player extends Playable return false; } + // Check first castle mid victory. + final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); + if ((castle != null) && !castle.isFirstMidVictory()) + { + return true; + } + // If target isn't a player, is self, isn't on same siege or not on same state, not friends. final Player targetPlayer = target.getActingPlayer(); if ((targetPlayer == null) || (targetPlayer == this) || (targetPlayer.getSiegeSide() != _siegeSide) || (_siegeState != targetPlayer.getSiegeState())) @@ -1654,7 +1661,6 @@ public class Player extends Playable // Attackers are considered friends only if castle has no owner. if (_siegeState == 1) { - final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); if (castle == null) { return false; @@ -8168,16 +8174,17 @@ public class Player extends Playable final Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ()); if (siege != null) { - // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan + // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan. if (siege.checkIsDefender(attackerClan) && siege.checkIsDefender(clan)) { return false; } - // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan + // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan. if (siege.checkIsAttacker(attackerClan) && siege.checkIsAttacker(clan)) { - return false; + // If first mid victory is achieved, attackers can attack attackers. + return CastleManager.getInstance().getCastleById(_siegeSide).isFirstMidVictory(); } } diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/siege/Castle.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/siege/Castle.java index 4e3cdc7e02..d053196bec 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/siege/Castle.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/siege/Castle.java @@ -86,6 +86,7 @@ public class Castle extends AbstractResidence private final List _artefacts = new ArrayList<>(1); private final Map _function = new ConcurrentHashMap<>(); private int _ticketBuyCount = 0; + private boolean _isFirstMidVictory = false; /** Castle Functions */ public static final int FUNC_TELEPORT = 1; @@ -916,6 +917,16 @@ public class Castle extends AbstractResidence return _doors; } + public boolean isFirstMidVictory() + { + return _isFirstMidVictory; + } + + public void setFirstMidVictory(boolean value) + { + _isFirstMidVictory = value; + } + @Override public int getOwnerId() { diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/siege/Siege.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/siege/Siege.java index 4017d44308..911f5868fc 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/siege/Siege.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/siege/Siege.java @@ -338,6 +338,7 @@ public class Siege implements Siegable SiegeGuardManager.getInstance().removeSiegeGuards(getCastle()); } _castle.spawnDoor(); // Respawn door to castle + _castle.setFirstMidVictory(false); _castle.getZone().setActive(false); _castle.getZone().updateZoneStatusForCharactersInside(); _castle.getZone().setSiegeInstance(null); @@ -452,6 +453,7 @@ public class Siege implements Siegable addDefender(sc, SiegeClanType.DEFENDER); } } + _castle.setFirstMidVictory(true); teleportPlayer(SiegeTeleportWhoType.Attacker, TeleportWhereType.SIEGEFLAG); // Teleport to the second closest town teleportPlayer(SiegeTeleportWhoType.Spectator, TeleportWhereType.TOWN); // Teleport to the second closest town removeDefenderFlags(); // Removes defenders' flags diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java index 1a95ac29be..13aca7de62 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java +++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java @@ -84,6 +84,13 @@ public class NotFriend implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriend implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // At this point summon should be prevented from attacking friendly targets. if (creature.isSummon() && (target == creature.getTarget())) { diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java index 27adfc38e6..f1651ed5b0 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java +++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java @@ -84,6 +84,13 @@ public class NotFriendPc implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriendPc implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // By default any flagged/PK player is considered enemy. return (target.getActingPlayer().getPvpFlag() > 0) || (target.getActingPlayer().getReputation() < 0); } diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/Player.java index cd1d368f95..84f856025a 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -1642,6 +1642,13 @@ public class Player extends Playable return false; } + // Check first castle mid victory. + final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); + if ((castle != null) && !castle.isFirstMidVictory()) + { + return true; + } + // If target isn't a player, is self, isn't on same siege or not on same state, not friends. final Player targetPlayer = target.getActingPlayer(); if ((targetPlayer == null) || (targetPlayer == this) || (targetPlayer.getSiegeSide() != _siegeSide) || (_siegeState != targetPlayer.getSiegeState())) @@ -1652,7 +1659,6 @@ public class Player extends Playable // Attackers are considered friends only if castle has no owner. if (_siegeState == 1) { - final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); if (castle == null) { return false; @@ -8154,16 +8160,17 @@ public class Player extends Playable final Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ()); if (siege != null) { - // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan + // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan. if (siege.checkIsDefender(attackerClan) && siege.checkIsDefender(clan)) { return false; } - // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan + // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan. if (siege.checkIsAttacker(attackerClan) && siege.checkIsAttacker(clan)) { - return false; + // If first mid victory is achieved, attackers can attack attackers. + return CastleManager.getInstance().getCastleById(_siegeSide).isFirstMidVictory(); } } diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/siege/Castle.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/siege/Castle.java index 4e3cdc7e02..d053196bec 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/siege/Castle.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/siege/Castle.java @@ -86,6 +86,7 @@ public class Castle extends AbstractResidence private final List _artefacts = new ArrayList<>(1); private final Map _function = new ConcurrentHashMap<>(); private int _ticketBuyCount = 0; + private boolean _isFirstMidVictory = false; /** Castle Functions */ public static final int FUNC_TELEPORT = 1; @@ -916,6 +917,16 @@ public class Castle extends AbstractResidence return _doors; } + public boolean isFirstMidVictory() + { + return _isFirstMidVictory; + } + + public void setFirstMidVictory(boolean value) + { + _isFirstMidVictory = value; + } + @Override public int getOwnerId() { diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/siege/Siege.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/siege/Siege.java index 4017d44308..911f5868fc 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/siege/Siege.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/siege/Siege.java @@ -338,6 +338,7 @@ public class Siege implements Siegable SiegeGuardManager.getInstance().removeSiegeGuards(getCastle()); } _castle.spawnDoor(); // Respawn door to castle + _castle.setFirstMidVictory(false); _castle.getZone().setActive(false); _castle.getZone().updateZoneStatusForCharactersInside(); _castle.getZone().setSiegeInstance(null); @@ -452,6 +453,7 @@ public class Siege implements Siegable addDefender(sc, SiegeClanType.DEFENDER); } } + _castle.setFirstMidVictory(true); teleportPlayer(SiegeTeleportWhoType.Attacker, TeleportWhereType.SIEGEFLAG); // Teleport to the second closest town teleportPlayer(SiegeTeleportWhoType.Spectator, TeleportWhereType.TOWN); // Teleport to the second closest town removeDefenderFlags(); // Removes defenders' flags diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java index 1a95ac29be..13aca7de62 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java @@ -84,6 +84,13 @@ public class NotFriend implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriend implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // At this point summon should be prevented from attacking friendly targets. if (creature.isSummon() && (target == creature.getTarget())) { diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java index 27adfc38e6..f1651ed5b0 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java @@ -84,6 +84,13 @@ public class NotFriendPc implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriendPc implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // By default any flagged/PK player is considered enemy. return (target.getActingPlayer().getPvpFlag() > 0) || (target.getActingPlayer().getReputation() < 0); } diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/Player.java index 9010525a19..3eaed20507 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -1655,6 +1655,13 @@ public class Player extends Playable return false; } + // Check first castle mid victory. + final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); + if ((castle != null) && !castle.isFirstMidVictory()) + { + return true; + } + // If target isn't a player, is self, isn't on same siege or not on same state, not friends. final Player targetPlayer = target.getActingPlayer(); if ((targetPlayer == null) || (targetPlayer == this) || (targetPlayer.getSiegeSide() != _siegeSide) || (_siegeState != targetPlayer.getSiegeState())) @@ -1665,7 +1672,6 @@ public class Player extends Playable // Attackers are considered friends only if castle has no owner. if (_siegeState == 1) { - final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); if (castle == null) { return false; @@ -8181,16 +8187,17 @@ public class Player extends Playable final Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ()); if (siege != null) { - // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan + // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan. if (siege.checkIsDefender(attackerClan) && siege.checkIsDefender(clan)) { return false; } - // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan + // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan. if (siege.checkIsAttacker(attackerClan) && siege.checkIsAttacker(clan)) { - return false; + // If first mid victory is achieved, attackers can attack attackers. + return CastleManager.getInstance().getCastleById(_siegeSide).isFirstMidVictory(); } } diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/siege/Castle.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/siege/Castle.java index 4e3cdc7e02..d053196bec 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/siege/Castle.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/siege/Castle.java @@ -86,6 +86,7 @@ public class Castle extends AbstractResidence private final List _artefacts = new ArrayList<>(1); private final Map _function = new ConcurrentHashMap<>(); private int _ticketBuyCount = 0; + private boolean _isFirstMidVictory = false; /** Castle Functions */ public static final int FUNC_TELEPORT = 1; @@ -916,6 +917,16 @@ public class Castle extends AbstractResidence return _doors; } + public boolean isFirstMidVictory() + { + return _isFirstMidVictory; + } + + public void setFirstMidVictory(boolean value) + { + _isFirstMidVictory = value; + } + @Override public int getOwnerId() { diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/siege/Siege.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/siege/Siege.java index 4017d44308..911f5868fc 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/siege/Siege.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/siege/Siege.java @@ -338,6 +338,7 @@ public class Siege implements Siegable SiegeGuardManager.getInstance().removeSiegeGuards(getCastle()); } _castle.spawnDoor(); // Respawn door to castle + _castle.setFirstMidVictory(false); _castle.getZone().setActive(false); _castle.getZone().updateZoneStatusForCharactersInside(); _castle.getZone().setSiegeInstance(null); @@ -452,6 +453,7 @@ public class Siege implements Siegable addDefender(sc, SiegeClanType.DEFENDER); } } + _castle.setFirstMidVictory(true); teleportPlayer(SiegeTeleportWhoType.Attacker, TeleportWhereType.SIEGEFLAG); // Teleport to the second closest town teleportPlayer(SiegeTeleportWhoType.Spectator, TeleportWhereType.TOWN); // Teleport to the second closest town removeDefenderFlags(); // Removes defenders' flags diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java index 1a95ac29be..13aca7de62 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java @@ -84,6 +84,13 @@ public class NotFriend implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriend implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // At this point summon should be prevented from attacking friendly targets. if (creature.isSummon() && (target == creature.getTarget())) { diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java index 27adfc38e6..f1651ed5b0 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java @@ -84,6 +84,13 @@ public class NotFriendPc implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriendPc implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // By default any flagged/PK player is considered enemy. return (target.getActingPlayer().getPvpFlag() > 0) || (target.getActingPlayer().getReputation() < 0); } diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/Player.java index 2fc3aa9e02..f00e6b7589 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -1655,6 +1655,13 @@ public class Player extends Playable return false; } + // Check first castle mid victory. + final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); + if ((castle != null) && !castle.isFirstMidVictory()) + { + return true; + } + // If target isn't a player, is self, isn't on same siege or not on same state, not friends. final Player targetPlayer = target.getActingPlayer(); if ((targetPlayer == null) || (targetPlayer == this) || (targetPlayer.getSiegeSide() != _siegeSide) || (_siegeState != targetPlayer.getSiegeState())) @@ -1665,7 +1672,6 @@ public class Player extends Playable // Attackers are considered friends only if castle has no owner. if (_siegeState == 1) { - final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); if (castle == null) { return false; @@ -8181,16 +8187,17 @@ public class Player extends Playable final Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ()); if (siege != null) { - // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan + // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan. if (siege.checkIsDefender(attackerClan) && siege.checkIsDefender(clan)) { return false; } - // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan + // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan. if (siege.checkIsAttacker(attackerClan) && siege.checkIsAttacker(clan)) { - return false; + // If first mid victory is achieved, attackers can attack attackers. + return CastleManager.getInstance().getCastleById(_siegeSide).isFirstMidVictory(); } } diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/siege/Castle.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/siege/Castle.java index 4e3cdc7e02..d053196bec 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/siege/Castle.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/siege/Castle.java @@ -86,6 +86,7 @@ public class Castle extends AbstractResidence private final List _artefacts = new ArrayList<>(1); private final Map _function = new ConcurrentHashMap<>(); private int _ticketBuyCount = 0; + private boolean _isFirstMidVictory = false; /** Castle Functions */ public static final int FUNC_TELEPORT = 1; @@ -916,6 +917,16 @@ public class Castle extends AbstractResidence return _doors; } + public boolean isFirstMidVictory() + { + return _isFirstMidVictory; + } + + public void setFirstMidVictory(boolean value) + { + _isFirstMidVictory = value; + } + @Override public int getOwnerId() { diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/siege/Siege.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/siege/Siege.java index 4017d44308..911f5868fc 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/siege/Siege.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/siege/Siege.java @@ -338,6 +338,7 @@ public class Siege implements Siegable SiegeGuardManager.getInstance().removeSiegeGuards(getCastle()); } _castle.spawnDoor(); // Respawn door to castle + _castle.setFirstMidVictory(false); _castle.getZone().setActive(false); _castle.getZone().updateZoneStatusForCharactersInside(); _castle.getZone().setSiegeInstance(null); @@ -452,6 +453,7 @@ public class Siege implements Siegable addDefender(sc, SiegeClanType.DEFENDER); } } + _castle.setFirstMidVictory(true); teleportPlayer(SiegeTeleportWhoType.Attacker, TeleportWhereType.SIEGEFLAG); // Teleport to the second closest town teleportPlayer(SiegeTeleportWhoType.Spectator, TeleportWhereType.TOWN); // Teleport to the second closest town removeDefenderFlags(); // Removes defenders' flags diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java index 1a95ac29be..13aca7de62 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java @@ -84,6 +84,13 @@ public class NotFriend implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriend implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // At this point summon should be prevented from attacking friendly targets. if (creature.isSummon() && (target == creature.getTarget())) { diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java index 27adfc38e6..f1651ed5b0 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java @@ -84,6 +84,13 @@ public class NotFriendPc implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriendPc implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // By default any flagged/PK player is considered enemy. return (target.getActingPlayer().getPvpFlag() > 0) || (target.getActingPlayer().getReputation() < 0); } diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/Player.java index 43387a492b..5f5aa01137 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -1675,6 +1675,13 @@ public class Player extends Playable return false; } + // Check first castle mid victory. + final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); + if ((castle != null) && !castle.isFirstMidVictory()) + { + return true; + } + // If target isn't a player, is self, isn't on same siege or not on same state, not friends. final Player targetPlayer = target.getActingPlayer(); if ((targetPlayer == null) || (targetPlayer == this) || (targetPlayer.getSiegeSide() != _siegeSide) || (_siegeState != targetPlayer.getSiegeState())) @@ -1685,7 +1692,6 @@ public class Player extends Playable // Attackers are considered friends only if castle has no owner. if (_siegeState == 1) { - final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); if (castle == null) { return false; @@ -8135,16 +8141,17 @@ public class Player extends Playable final Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ()); if (siege != null) { - // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan + // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan. if (siege.checkIsDefender(attackerClan) && siege.checkIsDefender(clan)) { return false; } - // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan + // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan. if (siege.checkIsAttacker(attackerClan) && siege.checkIsAttacker(clan)) { - return false; + // If first mid victory is achieved, attackers can attack attackers. + return CastleManager.getInstance().getCastleById(_siegeSide).isFirstMidVictory(); } } diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/siege/Castle.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/siege/Castle.java index 4e3cdc7e02..d053196bec 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/siege/Castle.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/siege/Castle.java @@ -86,6 +86,7 @@ public class Castle extends AbstractResidence private final List _artefacts = new ArrayList<>(1); private final Map _function = new ConcurrentHashMap<>(); private int _ticketBuyCount = 0; + private boolean _isFirstMidVictory = false; /** Castle Functions */ public static final int FUNC_TELEPORT = 1; @@ -916,6 +917,16 @@ public class Castle extends AbstractResidence return _doors; } + public boolean isFirstMidVictory() + { + return _isFirstMidVictory; + } + + public void setFirstMidVictory(boolean value) + { + _isFirstMidVictory = value; + } + @Override public int getOwnerId() { diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/siege/Siege.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/siege/Siege.java index 4017d44308..911f5868fc 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/siege/Siege.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/siege/Siege.java @@ -338,6 +338,7 @@ public class Siege implements Siegable SiegeGuardManager.getInstance().removeSiegeGuards(getCastle()); } _castle.spawnDoor(); // Respawn door to castle + _castle.setFirstMidVictory(false); _castle.getZone().setActive(false); _castle.getZone().updateZoneStatusForCharactersInside(); _castle.getZone().setSiegeInstance(null); @@ -452,6 +453,7 @@ public class Siege implements Siegable addDefender(sc, SiegeClanType.DEFENDER); } } + _castle.setFirstMidVictory(true); teleportPlayer(SiegeTeleportWhoType.Attacker, TeleportWhereType.SIEGEFLAG); // Teleport to the second closest town teleportPlayer(SiegeTeleportWhoType.Spectator, TeleportWhereType.TOWN); // Teleport to the second closest town removeDefenderFlags(); // Removes defenders' flags diff --git a/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java b/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java index 1a95ac29be..13aca7de62 100644 --- a/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java +++ b/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java @@ -84,6 +84,13 @@ public class NotFriend implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriend implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // At this point summon should be prevented from attacking friendly targets. if (creature.isSummon() && (target == creature.getTarget())) { diff --git a/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java b/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java index 27adfc38e6..f1651ed5b0 100644 --- a/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java +++ b/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java @@ -84,6 +84,13 @@ public class NotFriendPc implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriendPc implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // By default any flagged/PK player is considered enemy. return (target.getActingPlayer().getPvpFlag() > 0) || (target.getActingPlayer().getReputation() < 0); } diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/Player.java index c8558d464a..d6b34fa92d 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -1641,6 +1641,13 @@ public class Player extends Playable return false; } + // Check first castle mid victory. + final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); + if ((castle != null) && !castle.isFirstMidVictory()) + { + return true; + } + // If target isn't a player, is self, isn't on same siege or not on same state, not friends. final Player targetPlayer = target.getActingPlayer(); if ((targetPlayer == null) || (targetPlayer == this) || (targetPlayer.getSiegeSide() != _siegeSide) || (_siegeState != targetPlayer.getSiegeState())) @@ -1651,7 +1658,6 @@ public class Player extends Playable // Attackers are considered friends only if castle has no owner. if (_siegeState == 1) { - final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); if (castle == null) { return false; @@ -8146,16 +8152,17 @@ public class Player extends Playable final Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ()); if (siege != null) { - // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan + // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan. if (siege.checkIsDefender(attackerClan) && siege.checkIsDefender(clan)) { return false; } - // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan + // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan. if (siege.checkIsAttacker(attackerClan) && siege.checkIsAttacker(clan)) { - return false; + // If first mid victory is achieved, attackers can attack attackers. + return CastleManager.getInstance().getCastleById(_siegeSide).isFirstMidVictory(); } } diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/siege/Castle.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/siege/Castle.java index 4e3cdc7e02..d053196bec 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/siege/Castle.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/siege/Castle.java @@ -86,6 +86,7 @@ public class Castle extends AbstractResidence private final List _artefacts = new ArrayList<>(1); private final Map _function = new ConcurrentHashMap<>(); private int _ticketBuyCount = 0; + private boolean _isFirstMidVictory = false; /** Castle Functions */ public static final int FUNC_TELEPORT = 1; @@ -916,6 +917,16 @@ public class Castle extends AbstractResidence return _doors; } + public boolean isFirstMidVictory() + { + return _isFirstMidVictory; + } + + public void setFirstMidVictory(boolean value) + { + _isFirstMidVictory = value; + } + @Override public int getOwnerId() { diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/siege/Siege.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/siege/Siege.java index 8dc8d9be7a..856f2235df 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/siege/Siege.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/siege/Siege.java @@ -338,6 +338,7 @@ public class Siege implements Siegable SiegeGuardManager.getInstance().removeSiegeGuards(getCastle()); } _castle.spawnDoor(); // Respawn door to castle + _castle.setFirstMidVictory(false); _castle.getZone().setActive(false); _castle.getZone().updateZoneStatusForCharactersInside(); _castle.getZone().setSiegeInstance(null); @@ -452,6 +453,7 @@ public class Siege implements Siegable addDefender(sc, SiegeClanType.DEFENDER); } } + _castle.setFirstMidVictory(true); teleportPlayer(SiegeTeleportWhoType.Attacker, TeleportWhereType.SIEGEFLAG); // Teleport to the second closest town teleportPlayer(SiegeTeleportWhoType.Spectator, TeleportWhereType.TOWN); // Teleport to the second closest town removeDefenderFlags(); // Removes defenders' flags diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java index 1a95ac29be..13aca7de62 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java @@ -84,6 +84,13 @@ public class NotFriend implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriend implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // At this point summon should be prevented from attacking friendly targets. if (creature.isSummon() && (target == creature.getTarget())) { diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java index 27adfc38e6..f1651ed5b0 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java @@ -84,6 +84,13 @@ public class NotFriendPc implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriendPc implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // By default any flagged/PK player is considered enemy. return (target.getActingPlayer().getPvpFlag() > 0) || (target.getActingPlayer().getReputation() < 0); } diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/Player.java index da70279ae4..2bceafcd45 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -1732,6 +1732,13 @@ public class Player extends Playable return false; } + // Check first castle mid victory. + final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); + if ((castle != null) && !castle.isFirstMidVictory()) + { + return true; + } + // If target isn't a player, is self, isn't on same siege or not on same state, not friends. final Player targetPlayer = target.getActingPlayer(); if ((targetPlayer == null) || (targetPlayer == this) || (targetPlayer.getSiegeSide() != _siegeSide) || (_siegeState != targetPlayer.getSiegeState())) @@ -1742,7 +1749,6 @@ public class Player extends Playable // Attackers are considered friends only if castle has no owner. if (_siegeState == 1) { - final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); if (castle == null) { return false; @@ -8287,16 +8293,17 @@ public class Player extends Playable final Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ()); if (siege != null) { - // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan + // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan. if (siege.checkIsDefender(attackerClan) && siege.checkIsDefender(clan)) { return false; } - // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan + // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan. if (siege.checkIsAttacker(attackerClan) && siege.checkIsAttacker(clan)) { - return false; + // If first mid victory is achieved, attackers can attack attackers. + return CastleManager.getInstance().getCastleById(_siegeSide).isFirstMidVictory(); } } diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/siege/Castle.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/siege/Castle.java index bddf435ab5..0244ddbd3b 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/siege/Castle.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/siege/Castle.java @@ -86,6 +86,7 @@ public class Castle extends AbstractResidence private final List _artefacts = new ArrayList<>(1); private final Map _function = new ConcurrentHashMap<>(); private int _ticketBuyCount = 0; + private boolean _isFirstMidVictory = false; /** Castle Functions */ public static final int FUNC_TELEPORT = 1; @@ -916,6 +917,16 @@ public class Castle extends AbstractResidence return _doors; } + public boolean isFirstMidVictory() + { + return _isFirstMidVictory; + } + + public void setFirstMidVictory(boolean value) + { + _isFirstMidVictory = value; + } + @Override public int getOwnerId() { diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/siege/Siege.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/siege/Siege.java index 4196cde094..8618a787ae 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/siege/Siege.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/siege/Siege.java @@ -338,6 +338,7 @@ public class Siege implements Siegable SiegeGuardManager.getInstance().removeSiegeGuards(getCastle()); } _castle.spawnDoor(); // Respawn door to castle + _castle.setFirstMidVictory(false); _castle.getZone().setActive(false); _castle.getZone().updateZoneStatusForCharactersInside(); _castle.getZone().setSiegeInstance(null); @@ -452,6 +453,7 @@ public class Siege implements Siegable addDefender(sc, SiegeClanType.DEFENDER); } } + _castle.setFirstMidVictory(true); teleportPlayer(SiegeTeleportWhoType.Attacker, TeleportWhereType.SIEGEFLAG); // Teleport to the second closest town teleportPlayer(SiegeTeleportWhoType.Spectator, TeleportWhereType.TOWN); // Teleport to the second closest town removeDefenderFlags(); // Removes defenders' flags diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java index 1a95ac29be..13aca7de62 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java @@ -84,6 +84,13 @@ public class NotFriend implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriend implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // At this point summon should be prevented from attacking friendly targets. if (creature.isSummon() && (target == creature.getTarget())) { diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java index 27adfc38e6..f1651ed5b0 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java @@ -84,6 +84,13 @@ public class NotFriendPc implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriendPc implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // By default any flagged/PK player is considered enemy. return (target.getActingPlayer().getPvpFlag() > 0) || (target.getActingPlayer().getReputation() < 0); } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/Player.java index 5c11faa664..b9d9bc40e2 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -1763,6 +1763,13 @@ public class Player extends Playable return false; } + // Check first castle mid victory. + final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); + if ((castle != null) && !castle.isFirstMidVictory()) + { + return true; + } + // If target isn't a player, is self, isn't on same siege or not on same state, not friends. final Player targetPlayer = target.getActingPlayer(); if ((targetPlayer == null) || (targetPlayer == this) || (targetPlayer.getSiegeSide() != _siegeSide) || (_siegeState != targetPlayer.getSiegeState())) @@ -1773,7 +1780,6 @@ public class Player extends Playable // Attackers are considered friends only if castle has no owner. if (_siegeState == 1) { - final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); if (castle == null) { return false; @@ -8353,16 +8359,17 @@ public class Player extends Playable final Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ()); if (siege != null) { - // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan + // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan. if (siege.checkIsDefender(attackerClan) && siege.checkIsDefender(clan)) { return false; } - // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan + // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan. if (siege.checkIsAttacker(attackerClan) && siege.checkIsAttacker(clan)) { - return false; + // If first mid victory is achieved, attackers can attack attackers. + return CastleManager.getInstance().getCastleById(_siegeSide).isFirstMidVictory(); } } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/siege/Castle.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/siege/Castle.java index bddf435ab5..0244ddbd3b 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/siege/Castle.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/siege/Castle.java @@ -86,6 +86,7 @@ public class Castle extends AbstractResidence private final List _artefacts = new ArrayList<>(1); private final Map _function = new ConcurrentHashMap<>(); private int _ticketBuyCount = 0; + private boolean _isFirstMidVictory = false; /** Castle Functions */ public static final int FUNC_TELEPORT = 1; @@ -916,6 +917,16 @@ public class Castle extends AbstractResidence return _doors; } + public boolean isFirstMidVictory() + { + return _isFirstMidVictory; + } + + public void setFirstMidVictory(boolean value) + { + _isFirstMidVictory = value; + } + @Override public int getOwnerId() { diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/siege/Siege.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/siege/Siege.java index 4196cde094..8618a787ae 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/siege/Siege.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/siege/Siege.java @@ -338,6 +338,7 @@ public class Siege implements Siegable SiegeGuardManager.getInstance().removeSiegeGuards(getCastle()); } _castle.spawnDoor(); // Respawn door to castle + _castle.setFirstMidVictory(false); _castle.getZone().setActive(false); _castle.getZone().updateZoneStatusForCharactersInside(); _castle.getZone().setSiegeInstance(null); @@ -452,6 +453,7 @@ public class Siege implements Siegable addDefender(sc, SiegeClanType.DEFENDER); } } + _castle.setFirstMidVictory(true); teleportPlayer(SiegeTeleportWhoType.Attacker, TeleportWhereType.SIEGEFLAG); // Teleport to the second closest town teleportPlayer(SiegeTeleportWhoType.Spectator, TeleportWhereType.TOWN); // Teleport to the second closest town removeDefenderFlags(); // Removes defenders' flags diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java index 1a95ac29be..13aca7de62 100644 --- a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriend.java @@ -84,6 +84,13 @@ public class NotFriend implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriend implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // At this point summon should be prevented from attacking friendly targets. if (creature.isSummon() && (target == creature.getTarget())) { diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java index 27adfc38e6..f1651ed5b0 100644 --- a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/handlers/targethandlers/affectobject/NotFriendPc.java @@ -84,6 +84,13 @@ public class NotFriendPc implements IAffectObjectHandler return false; } + // Siege. + if (target.isInsideZone(ZoneId.SIEGE)) + { + // Players in the same siege side at the same castle are considered friends. + return !player.isSiegeFriend(targetPlayer); + } + // Arena. if (creature.isInsideZone(ZoneId.PVP) && !creature.isInsideZone(ZoneId.SIEGE) && target.isInsideZone(ZoneId.PVP) && !target.isInsideZone(ZoneId.SIEGE)) { @@ -125,13 +132,6 @@ public class NotFriendPc implements IAffectObjectHandler return false; } - // Siege. - if (target.isInsideZone(ZoneId.SIEGE)) - { - // Players in the same siege side at the same castle are considered friends. - return !player.isSiegeFriend(targetPlayer); - } - // By default any flagged/PK player is considered enemy. return (target.getActingPlayer().getPvpFlag() > 0) || (target.getActingPlayer().getReputation() < 0); } diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/Player.java index 7602682c8f..7d322729eb 100644 --- a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -1763,6 +1763,13 @@ public class Player extends Playable return false; } + // Check first castle mid victory. + final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); + if ((castle != null) && !castle.isFirstMidVictory()) + { + return true; + } + // If target isn't a player, is self, isn't on same siege or not on same state, not friends. final Player targetPlayer = target.getActingPlayer(); if ((targetPlayer == null) || (targetPlayer == this) || (targetPlayer.getSiegeSide() != _siegeSide) || (_siegeState != targetPlayer.getSiegeState())) @@ -1773,7 +1780,6 @@ public class Player extends Playable // Attackers are considered friends only if castle has no owner. if (_siegeState == 1) { - final Castle castle = CastleManager.getInstance().getCastleById(_siegeSide); if (castle == null) { return false; @@ -8353,16 +8359,17 @@ public class Player extends Playable final Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ()); if (siege != null) { - // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan + // Check if a siege is in progress and if attacker and the Player aren't in the Defender clan. if (siege.checkIsDefender(attackerClan) && siege.checkIsDefender(clan)) { return false; } - // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan + // Check if a siege is in progress and if attacker and the Player aren't in the Attacker clan. if (siege.checkIsAttacker(attackerClan) && siege.checkIsAttacker(clan)) { - return false; + // If first mid victory is achieved, attackers can attack attackers. + return CastleManager.getInstance().getCastleById(_siegeSide).isFirstMidVictory(); } } diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/siege/Castle.java b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/siege/Castle.java index bddf435ab5..0244ddbd3b 100644 --- a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/siege/Castle.java +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/siege/Castle.java @@ -86,6 +86,7 @@ public class Castle extends AbstractResidence private final List _artefacts = new ArrayList<>(1); private final Map _function = new ConcurrentHashMap<>(); private int _ticketBuyCount = 0; + private boolean _isFirstMidVictory = false; /** Castle Functions */ public static final int FUNC_TELEPORT = 1; @@ -916,6 +917,16 @@ public class Castle extends AbstractResidence return _doors; } + public boolean isFirstMidVictory() + { + return _isFirstMidVictory; + } + + public void setFirstMidVictory(boolean value) + { + _isFirstMidVictory = value; + } + @Override public int getOwnerId() { diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/siege/Siege.java b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/siege/Siege.java index 4196cde094..8618a787ae 100644 --- a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/siege/Siege.java +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/siege/Siege.java @@ -338,6 +338,7 @@ public class Siege implements Siegable SiegeGuardManager.getInstance().removeSiegeGuards(getCastle()); } _castle.spawnDoor(); // Respawn door to castle + _castle.setFirstMidVictory(false); _castle.getZone().setActive(false); _castle.getZone().updateZoneStatusForCharactersInside(); _castle.getZone().setSiegeInstance(null); @@ -452,6 +453,7 @@ public class Siege implements Siegable addDefender(sc, SiegeClanType.DEFENDER); } } + _castle.setFirstMidVictory(true); teleportPlayer(SiegeTeleportWhoType.Attacker, TeleportWhereType.SIEGEFLAG); // Teleport to the second closest town teleportPlayer(SiegeTeleportWhoType.Spectator, TeleportWhereType.TOWN); // Teleport to the second closest town removeDefenderFlags(); // Removes defenders' flags