diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java index ee5b54f923..13040871bb 100644 --- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java +++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java @@ -19,6 +19,7 @@ package org.l2jmobius.gameserver.model.ceremonyofchaos; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.OptionalInt; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -113,10 +114,11 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void preparePlayers() { - final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), getMembers().values()); + final Map members = getMembers(); + final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), members.values()); final NpcHtmlMessage msg = new NpcHtmlMessage(0); int index = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player.inObserverMode()) @@ -278,7 +280,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void stopFight() { - for (CeremonyOfChaosMember member : getMembers().values()) + final Map members = getMembers(); + for (CeremonyOfChaosMember member : members.values()) { if (member.getLifeTime() == 0) { @@ -288,7 +291,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent validateWinner(); final List winners = getWinners(); - final List members = new ArrayList<>(getMembers().size()); + final List memberList = new ArrayList<>(members.size()); SystemMessage msg = null; if (winners.isEmpty() || (winners.size() > 1)) { @@ -389,7 +392,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } } - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player != null) @@ -402,14 +405,14 @@ public class CeremonyOfChaosEvent extends AbstractEvent // Send result player.sendPacket(new ExCuriousHouseResult(member.getResultType(), this)); - members.add(member); + memberList.add(member); } } getTimers().cancelTimer("update", null, null); final StatSet params = new StatSet(); params.set("time", 30); getTimers().addTimer("match_end_countdown", params, 30 * 1000, null, null); - EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, members)); + EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, memberList)); } private void teleportPlayersOut() @@ -474,14 +477,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent public List getWinners() { final List winners = new ArrayList<>(); + final Map members = getMembers(); + //@formatter:off - final OptionalInt winnerLifeTime = getMembers().values().stream() + final OptionalInt winnerLifeTime = members.values().stream() .mapToInt(CeremonyOfChaosMember::getLifeTime) .max(); if(winnerLifeTime.isPresent()) { - getMembers().values().stream() + members.values().stream() .sorted(Comparator.comparingLong(CeremonyOfChaosMember::getLifeTime) .reversed() .thenComparingInt(CeremonyOfChaosMember::getScore) @@ -491,6 +496,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } //@formatter:on + return winners; } @@ -507,13 +513,15 @@ public class CeremonyOfChaosEvent extends AbstractEvent { case "update": { + final Map members = getMembers(); + final int time = (int) CeremonyOfChaosManager.getInstance().getScheduler("stopFight").getRemainingTime(TimeUnit.SECONDS); broadcastPacket(new ExCuriousHouseRemainTime(time)); - getMembers().values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); + members.values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); // Validate winner int count = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (!member.isDefeated()) { @@ -605,7 +613,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent final PlayerInstance player = event.getPlayer(); if (player != null) { - removeMember(player.getObjectId()); + final Map members = getMembers(); + final int playerObjectId = player.getObjectId(); + if (members.containsKey(playerObjectId)) + { + removeMember(playerObjectId); + if (members.size() <= 1) + { + stopFight(); + } + } } } @@ -617,8 +634,9 @@ public class CeremonyOfChaosEvent extends AbstractEvent { final PlayerInstance attackerPlayer = event.getAttacker().getActingPlayer(); final PlayerInstance targetPlayer = event.getTarget().getActingPlayer(); - final CeremonyOfChaosMember attackerMember = getMembers().get(attackerPlayer.getObjectId()); - final CeremonyOfChaosMember targetMember = getMembers().get(targetPlayer.getObjectId()); + final Map members = getMembers(); + final CeremonyOfChaosMember attackerMember = members.get(attackerPlayer.getObjectId()); + final CeremonyOfChaosMember targetMember = members.get(targetPlayer.getObjectId()); final DeleteObject deleteObject = new DeleteObject(targetPlayer); if ((attackerMember != null) && (targetMember != null)) { @@ -629,7 +647,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent targetMember.setDefeated(true); // Delete target player - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (member.getObjectId() != targetPlayer.getObjectId()) { diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java index c82fc4f646..1ccabadff3 100644 --- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java +++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java @@ -19,6 +19,7 @@ package org.l2jmobius.gameserver.model.ceremonyofchaos; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.OptionalInt; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -117,10 +118,11 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void preparePlayers() { - final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), getMembers().values()); + final Map members = getMembers(); + final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), members.values()); final NpcHtmlMessage msg = new NpcHtmlMessage(0); int index = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player.inObserverMode()) @@ -282,7 +284,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void stopFight() { - for (CeremonyOfChaosMember member : getMembers().values()) + final Map members = getMembers(); + for (CeremonyOfChaosMember member : members.values()) { if (member.getLifeTime() == 0) { @@ -292,7 +295,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent validateWinner(); final List winners = getWinners(); - final List members = new ArrayList<>(getMembers().size()); + final List memberList = new ArrayList<>(members.size()); SystemMessage msg = null; if (winners.isEmpty() || (winners.size() > 1)) { @@ -393,7 +396,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } } - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player != null) @@ -406,14 +409,14 @@ public class CeremonyOfChaosEvent extends AbstractEvent // Send result player.sendPacket(new ExCuriousHouseResult(member.getResultType(), this)); - members.add(member); + memberList.add(member); } } getTimers().cancelTimer("update", null, null); final StatSet params = new StatSet(); params.set("time", 30); getTimers().addTimer("match_end_countdown", params, 30 * 1000, null, null); - EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, members)); + EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, memberList)); // XXX: ML2 Rewards ForGlory, ForHonor and ForVictory quests for (CeremonyOfChaosMember member : getMembers().values()) @@ -422,7 +425,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent if (player == null) { continue; - } + } final QuestState qs = player.getQuestState("Q10813_ForGlory"); final QuestState qs1 = player.getQuestState("Q10819_ForHonor"); if ((qs != null) && !qs.isCompleted() && qs.isCond(1)) @@ -508,14 +511,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent public List getWinners() { final List winners = new ArrayList<>(); + final Map members = getMembers(); + //@formatter:off - final OptionalInt winnerLifeTime = getMembers().values().stream() + final OptionalInt winnerLifeTime = members.values().stream() .mapToInt(CeremonyOfChaosMember::getLifeTime) .max(); if(winnerLifeTime.isPresent()) { - getMembers().values().stream() + members.values().stream() .sorted(Comparator.comparingLong(CeremonyOfChaosMember::getLifeTime) .reversed() .thenComparingInt(CeremonyOfChaosMember::getScore) @@ -525,6 +530,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } //@formatter:on + return winners; } @@ -541,13 +547,15 @@ public class CeremonyOfChaosEvent extends AbstractEvent { case "update": { + final Map members = getMembers(); + final int time = (int) CeremonyOfChaosManager.getInstance().getScheduler("stopFight").getRemainingTime(TimeUnit.SECONDS); broadcastPacket(new ExCuriousHouseRemainTime(time)); - getMembers().values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); + members.values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); // Validate winner int count = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (!member.isDefeated()) { @@ -639,7 +647,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent final PlayerInstance player = event.getPlayer(); if (player != null) { - removeMember(player.getObjectId()); + final Map members = getMembers(); + final int playerObjectId = player.getObjectId(); + if (members.containsKey(playerObjectId)) + { + removeMember(playerObjectId); + if (members.size() <= 1) + { + stopFight(); + } + } } } @@ -651,8 +668,9 @@ public class CeremonyOfChaosEvent extends AbstractEvent { final PlayerInstance attackerPlayer = event.getAttacker().getActingPlayer(); final PlayerInstance targetPlayer = event.getTarget().getActingPlayer(); - final CeremonyOfChaosMember attackerMember = getMembers().get(attackerPlayer.getObjectId()); - final CeremonyOfChaosMember targetMember = getMembers().get(targetPlayer.getObjectId()); + final Map members = getMembers(); + final CeremonyOfChaosMember attackerMember = members.get(attackerPlayer.getObjectId()); + final CeremonyOfChaosMember targetMember = members.get(targetPlayer.getObjectId()); final DeleteObject deleteObject = new DeleteObject(targetPlayer); if ((attackerMember != null) && (targetMember != null)) { @@ -663,7 +681,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent targetMember.setDefeated(true); // Delete target player - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (member.getObjectId() != targetPlayer.getObjectId()) { diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java index c82fc4f646..1ccabadff3 100644 --- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java +++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java @@ -19,6 +19,7 @@ package org.l2jmobius.gameserver.model.ceremonyofchaos; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.OptionalInt; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -117,10 +118,11 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void preparePlayers() { - final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), getMembers().values()); + final Map members = getMembers(); + final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), members.values()); final NpcHtmlMessage msg = new NpcHtmlMessage(0); int index = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player.inObserverMode()) @@ -282,7 +284,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void stopFight() { - for (CeremonyOfChaosMember member : getMembers().values()) + final Map members = getMembers(); + for (CeremonyOfChaosMember member : members.values()) { if (member.getLifeTime() == 0) { @@ -292,7 +295,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent validateWinner(); final List winners = getWinners(); - final List members = new ArrayList<>(getMembers().size()); + final List memberList = new ArrayList<>(members.size()); SystemMessage msg = null; if (winners.isEmpty() || (winners.size() > 1)) { @@ -393,7 +396,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } } - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player != null) @@ -406,14 +409,14 @@ public class CeremonyOfChaosEvent extends AbstractEvent // Send result player.sendPacket(new ExCuriousHouseResult(member.getResultType(), this)); - members.add(member); + memberList.add(member); } } getTimers().cancelTimer("update", null, null); final StatSet params = new StatSet(); params.set("time", 30); getTimers().addTimer("match_end_countdown", params, 30 * 1000, null, null); - EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, members)); + EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, memberList)); // XXX: ML2 Rewards ForGlory, ForHonor and ForVictory quests for (CeremonyOfChaosMember member : getMembers().values()) @@ -422,7 +425,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent if (player == null) { continue; - } + } final QuestState qs = player.getQuestState("Q10813_ForGlory"); final QuestState qs1 = player.getQuestState("Q10819_ForHonor"); if ((qs != null) && !qs.isCompleted() && qs.isCond(1)) @@ -508,14 +511,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent public List getWinners() { final List winners = new ArrayList<>(); + final Map members = getMembers(); + //@formatter:off - final OptionalInt winnerLifeTime = getMembers().values().stream() + final OptionalInt winnerLifeTime = members.values().stream() .mapToInt(CeremonyOfChaosMember::getLifeTime) .max(); if(winnerLifeTime.isPresent()) { - getMembers().values().stream() + members.values().stream() .sorted(Comparator.comparingLong(CeremonyOfChaosMember::getLifeTime) .reversed() .thenComparingInt(CeremonyOfChaosMember::getScore) @@ -525,6 +530,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } //@formatter:on + return winners; } @@ -541,13 +547,15 @@ public class CeremonyOfChaosEvent extends AbstractEvent { case "update": { + final Map members = getMembers(); + final int time = (int) CeremonyOfChaosManager.getInstance().getScheduler("stopFight").getRemainingTime(TimeUnit.SECONDS); broadcastPacket(new ExCuriousHouseRemainTime(time)); - getMembers().values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); + members.values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); // Validate winner int count = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (!member.isDefeated()) { @@ -639,7 +647,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent final PlayerInstance player = event.getPlayer(); if (player != null) { - removeMember(player.getObjectId()); + final Map members = getMembers(); + final int playerObjectId = player.getObjectId(); + if (members.containsKey(playerObjectId)) + { + removeMember(playerObjectId); + if (members.size() <= 1) + { + stopFight(); + } + } } } @@ -651,8 +668,9 @@ public class CeremonyOfChaosEvent extends AbstractEvent { final PlayerInstance attackerPlayer = event.getAttacker().getActingPlayer(); final PlayerInstance targetPlayer = event.getTarget().getActingPlayer(); - final CeremonyOfChaosMember attackerMember = getMembers().get(attackerPlayer.getObjectId()); - final CeremonyOfChaosMember targetMember = getMembers().get(targetPlayer.getObjectId()); + final Map members = getMembers(); + final CeremonyOfChaosMember attackerMember = members.get(attackerPlayer.getObjectId()); + final CeremonyOfChaosMember targetMember = members.get(targetPlayer.getObjectId()); final DeleteObject deleteObject = new DeleteObject(targetPlayer); if ((attackerMember != null) && (targetMember != null)) { @@ -663,7 +681,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent targetMember.setDefeated(true); // Delete target player - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (member.getObjectId() != targetPlayer.getObjectId()) { diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java index c82fc4f646..1ccabadff3 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java @@ -19,6 +19,7 @@ package org.l2jmobius.gameserver.model.ceremonyofchaos; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.OptionalInt; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -117,10 +118,11 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void preparePlayers() { - final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), getMembers().values()); + final Map members = getMembers(); + final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), members.values()); final NpcHtmlMessage msg = new NpcHtmlMessage(0); int index = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player.inObserverMode()) @@ -282,7 +284,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void stopFight() { - for (CeremonyOfChaosMember member : getMembers().values()) + final Map members = getMembers(); + for (CeremonyOfChaosMember member : members.values()) { if (member.getLifeTime() == 0) { @@ -292,7 +295,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent validateWinner(); final List winners = getWinners(); - final List members = new ArrayList<>(getMembers().size()); + final List memberList = new ArrayList<>(members.size()); SystemMessage msg = null; if (winners.isEmpty() || (winners.size() > 1)) { @@ -393,7 +396,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } } - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player != null) @@ -406,14 +409,14 @@ public class CeremonyOfChaosEvent extends AbstractEvent // Send result player.sendPacket(new ExCuriousHouseResult(member.getResultType(), this)); - members.add(member); + memberList.add(member); } } getTimers().cancelTimer("update", null, null); final StatSet params = new StatSet(); params.set("time", 30); getTimers().addTimer("match_end_countdown", params, 30 * 1000, null, null); - EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, members)); + EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, memberList)); // XXX: ML2 Rewards ForGlory, ForHonor and ForVictory quests for (CeremonyOfChaosMember member : getMembers().values()) @@ -422,7 +425,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent if (player == null) { continue; - } + } final QuestState qs = player.getQuestState("Q10813_ForGlory"); final QuestState qs1 = player.getQuestState("Q10819_ForHonor"); if ((qs != null) && !qs.isCompleted() && qs.isCond(1)) @@ -508,14 +511,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent public List getWinners() { final List winners = new ArrayList<>(); + final Map members = getMembers(); + //@formatter:off - final OptionalInt winnerLifeTime = getMembers().values().stream() + final OptionalInt winnerLifeTime = members.values().stream() .mapToInt(CeremonyOfChaosMember::getLifeTime) .max(); if(winnerLifeTime.isPresent()) { - getMembers().values().stream() + members.values().stream() .sorted(Comparator.comparingLong(CeremonyOfChaosMember::getLifeTime) .reversed() .thenComparingInt(CeremonyOfChaosMember::getScore) @@ -525,6 +530,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } //@formatter:on + return winners; } @@ -541,13 +547,15 @@ public class CeremonyOfChaosEvent extends AbstractEvent { case "update": { + final Map members = getMembers(); + final int time = (int) CeremonyOfChaosManager.getInstance().getScheduler("stopFight").getRemainingTime(TimeUnit.SECONDS); broadcastPacket(new ExCuriousHouseRemainTime(time)); - getMembers().values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); + members.values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); // Validate winner int count = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (!member.isDefeated()) { @@ -639,7 +647,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent final PlayerInstance player = event.getPlayer(); if (player != null) { - removeMember(player.getObjectId()); + final Map members = getMembers(); + final int playerObjectId = player.getObjectId(); + if (members.containsKey(playerObjectId)) + { + removeMember(playerObjectId); + if (members.size() <= 1) + { + stopFight(); + } + } } } @@ -651,8 +668,9 @@ public class CeremonyOfChaosEvent extends AbstractEvent { final PlayerInstance attackerPlayer = event.getAttacker().getActingPlayer(); final PlayerInstance targetPlayer = event.getTarget().getActingPlayer(); - final CeremonyOfChaosMember attackerMember = getMembers().get(attackerPlayer.getObjectId()); - final CeremonyOfChaosMember targetMember = getMembers().get(targetPlayer.getObjectId()); + final Map members = getMembers(); + final CeremonyOfChaosMember attackerMember = members.get(attackerPlayer.getObjectId()); + final CeremonyOfChaosMember targetMember = members.get(targetPlayer.getObjectId()); final DeleteObject deleteObject = new DeleteObject(targetPlayer); if ((attackerMember != null) && (targetMember != null)) { @@ -663,7 +681,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent targetMember.setDefeated(true); // Delete target player - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (member.getObjectId() != targetPlayer.getObjectId()) { diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java index 2dc69139bb..8e5e7b71d1 100644 --- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java +++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java @@ -19,6 +19,7 @@ package org.l2jmobius.gameserver.model.ceremonyofchaos; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.OptionalInt; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -117,10 +118,11 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void preparePlayers() { - final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), getMembers().values()); + final Map members = getMembers(); + final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), members.values()); final NpcHtmlMessage msg = new NpcHtmlMessage(0); int index = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player.inObserverMode()) @@ -282,7 +284,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void stopFight() { - for (CeremonyOfChaosMember member : getMembers().values()) + final Map members = getMembers(); + for (CeremonyOfChaosMember member : members.values()) { if (member.getLifeTime() == 0) { @@ -292,7 +295,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent validateWinner(); final List winners = getWinners(); - final List members = new ArrayList<>(getMembers().size()); + final List memberList = new ArrayList<>(members.size()); SystemMessage msg = null; if (winners.isEmpty() || (winners.size() > 1)) { @@ -393,7 +396,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } } - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player != null) @@ -406,14 +409,14 @@ public class CeremonyOfChaosEvent extends AbstractEvent // Send result player.sendPacket(new ExCuriousHouseResult(member.getResultType(), this)); - members.add(member); + memberList.add(member); } } getTimers().cancelTimer("update", null, null); final StatSet params = new StatSet(); params.set("time", 30); getTimers().addTimer("match_end_countdown", params, 30 * 1000, null, null); - EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, members)); + EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, memberList)); // XXX: ML2 Rewards ForGlory, ForHonor and ForVictory quests for (CeremonyOfChaosMember member : getMembers().values()) @@ -422,7 +425,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent if (player == null) { continue; - } + } final QuestState qs = player.getQuestState("Q10813_ForGlory"); final QuestState qs1 = player.getQuestState("Q10819_ForHonor"); if ((qs != null) && !qs.isCompleted() && qs.isCond(1)) @@ -508,14 +511,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent public List getWinners() { final List winners = new ArrayList<>(); + final Map members = getMembers(); + //@formatter:off - final OptionalInt winnerLifeTime = getMembers().values().stream() + final OptionalInt winnerLifeTime = members.values().stream() .mapToInt(CeremonyOfChaosMember::getLifeTime) .max(); if(winnerLifeTime.isPresent()) { - getMembers().values().stream() + members.values().stream() .sorted(Comparator.comparingLong(CeremonyOfChaosMember::getLifeTime) .reversed() .thenComparingInt(CeremonyOfChaosMember::getScore) @@ -525,6 +530,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } //@formatter:on + return winners; } @@ -541,13 +547,15 @@ public class CeremonyOfChaosEvent extends AbstractEvent { case "update": { + final Map members = getMembers(); + final int time = (int) CeremonyOfChaosManager.getInstance().getScheduler("stopFight").getRemainingTime(TimeUnit.SECONDS); broadcastPacket(new ExCuriousHouseRemainTime(time)); - getMembers().values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); + members.values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); // Validate winner int count = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (!member.isDefeated()) { @@ -639,7 +647,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent final PlayerInstance player = event.getPlayer(); if (player != null) { - removeMember(player.getObjectId()); + final Map members = getMembers(); + final int playerObjectId = player.getObjectId(); + if (members.containsKey(playerObjectId)) + { + removeMember(playerObjectId); + if (members.size() <= 1) + { + stopFight(); + } + } } } @@ -651,8 +668,9 @@ public class CeremonyOfChaosEvent extends AbstractEvent { final PlayerInstance attackerPlayer = event.getAttacker().getActingPlayer(); final PlayerInstance targetPlayer = event.getTarget().getActingPlayer(); - final CeremonyOfChaosMember attackerMember = getMembers().get(attackerPlayer.getObjectId()); - final CeremonyOfChaosMember targetMember = getMembers().get(targetPlayer.getObjectId()); + final Map members = getMembers(); + final CeremonyOfChaosMember attackerMember = members.get(attackerPlayer.getObjectId()); + final CeremonyOfChaosMember targetMember = members.get(targetPlayer.getObjectId()); final DeleteObject deleteObject = new DeleteObject(targetPlayer); if ((attackerMember != null) && (targetMember != null)) { @@ -663,7 +681,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent targetMember.setDefeated(true); // Delete target player - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (member.getObjectId() != targetPlayer.getObjectId()) { diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java index c82fc4f646..1ccabadff3 100644 --- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java +++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java @@ -19,6 +19,7 @@ package org.l2jmobius.gameserver.model.ceremonyofchaos; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.OptionalInt; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -117,10 +118,11 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void preparePlayers() { - final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), getMembers().values()); + final Map members = getMembers(); + final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), members.values()); final NpcHtmlMessage msg = new NpcHtmlMessage(0); int index = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player.inObserverMode()) @@ -282,7 +284,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void stopFight() { - for (CeremonyOfChaosMember member : getMembers().values()) + final Map members = getMembers(); + for (CeremonyOfChaosMember member : members.values()) { if (member.getLifeTime() == 0) { @@ -292,7 +295,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent validateWinner(); final List winners = getWinners(); - final List members = new ArrayList<>(getMembers().size()); + final List memberList = new ArrayList<>(members.size()); SystemMessage msg = null; if (winners.isEmpty() || (winners.size() > 1)) { @@ -393,7 +396,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } } - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player != null) @@ -406,14 +409,14 @@ public class CeremonyOfChaosEvent extends AbstractEvent // Send result player.sendPacket(new ExCuriousHouseResult(member.getResultType(), this)); - members.add(member); + memberList.add(member); } } getTimers().cancelTimer("update", null, null); final StatSet params = new StatSet(); params.set("time", 30); getTimers().addTimer("match_end_countdown", params, 30 * 1000, null, null); - EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, members)); + EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, memberList)); // XXX: ML2 Rewards ForGlory, ForHonor and ForVictory quests for (CeremonyOfChaosMember member : getMembers().values()) @@ -422,7 +425,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent if (player == null) { continue; - } + } final QuestState qs = player.getQuestState("Q10813_ForGlory"); final QuestState qs1 = player.getQuestState("Q10819_ForHonor"); if ((qs != null) && !qs.isCompleted() && qs.isCond(1)) @@ -508,14 +511,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent public List getWinners() { final List winners = new ArrayList<>(); + final Map members = getMembers(); + //@formatter:off - final OptionalInt winnerLifeTime = getMembers().values().stream() + final OptionalInt winnerLifeTime = members.values().stream() .mapToInt(CeremonyOfChaosMember::getLifeTime) .max(); if(winnerLifeTime.isPresent()) { - getMembers().values().stream() + members.values().stream() .sorted(Comparator.comparingLong(CeremonyOfChaosMember::getLifeTime) .reversed() .thenComparingInt(CeremonyOfChaosMember::getScore) @@ -525,6 +530,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } //@formatter:on + return winners; } @@ -541,13 +547,15 @@ public class CeremonyOfChaosEvent extends AbstractEvent { case "update": { + final Map members = getMembers(); + final int time = (int) CeremonyOfChaosManager.getInstance().getScheduler("stopFight").getRemainingTime(TimeUnit.SECONDS); broadcastPacket(new ExCuriousHouseRemainTime(time)); - getMembers().values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); + members.values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); // Validate winner int count = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (!member.isDefeated()) { @@ -639,7 +647,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent final PlayerInstance player = event.getPlayer(); if (player != null) { - removeMember(player.getObjectId()); + final Map members = getMembers(); + final int playerObjectId = player.getObjectId(); + if (members.containsKey(playerObjectId)) + { + removeMember(playerObjectId); + if (members.size() <= 1) + { + stopFight(); + } + } } } @@ -651,8 +668,9 @@ public class CeremonyOfChaosEvent extends AbstractEvent { final PlayerInstance attackerPlayer = event.getAttacker().getActingPlayer(); final PlayerInstance targetPlayer = event.getTarget().getActingPlayer(); - final CeremonyOfChaosMember attackerMember = getMembers().get(attackerPlayer.getObjectId()); - final CeremonyOfChaosMember targetMember = getMembers().get(targetPlayer.getObjectId()); + final Map members = getMembers(); + final CeremonyOfChaosMember attackerMember = members.get(attackerPlayer.getObjectId()); + final CeremonyOfChaosMember targetMember = members.get(targetPlayer.getObjectId()); final DeleteObject deleteObject = new DeleteObject(targetPlayer); if ((attackerMember != null) && (targetMember != null)) { @@ -663,7 +681,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent targetMember.setDefeated(true); // Delete target player - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (member.getObjectId() != targetPlayer.getObjectId()) { diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java index c82fc4f646..1ccabadff3 100644 --- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java +++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java @@ -19,6 +19,7 @@ package org.l2jmobius.gameserver.model.ceremonyofchaos; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.OptionalInt; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -117,10 +118,11 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void preparePlayers() { - final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), getMembers().values()); + final Map members = getMembers(); + final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), members.values()); final NpcHtmlMessage msg = new NpcHtmlMessage(0); int index = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player.inObserverMode()) @@ -282,7 +284,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void stopFight() { - for (CeremonyOfChaosMember member : getMembers().values()) + final Map members = getMembers(); + for (CeremonyOfChaosMember member : members.values()) { if (member.getLifeTime() == 0) { @@ -292,7 +295,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent validateWinner(); final List winners = getWinners(); - final List members = new ArrayList<>(getMembers().size()); + final List memberList = new ArrayList<>(members.size()); SystemMessage msg = null; if (winners.isEmpty() || (winners.size() > 1)) { @@ -393,7 +396,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } } - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player != null) @@ -406,14 +409,14 @@ public class CeremonyOfChaosEvent extends AbstractEvent // Send result player.sendPacket(new ExCuriousHouseResult(member.getResultType(), this)); - members.add(member); + memberList.add(member); } } getTimers().cancelTimer("update", null, null); final StatSet params = new StatSet(); params.set("time", 30); getTimers().addTimer("match_end_countdown", params, 30 * 1000, null, null); - EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, members)); + EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, memberList)); // XXX: ML2 Rewards ForGlory, ForHonor and ForVictory quests for (CeremonyOfChaosMember member : getMembers().values()) @@ -422,7 +425,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent if (player == null) { continue; - } + } final QuestState qs = player.getQuestState("Q10813_ForGlory"); final QuestState qs1 = player.getQuestState("Q10819_ForHonor"); if ((qs != null) && !qs.isCompleted() && qs.isCond(1)) @@ -508,14 +511,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent public List getWinners() { final List winners = new ArrayList<>(); + final Map members = getMembers(); + //@formatter:off - final OptionalInt winnerLifeTime = getMembers().values().stream() + final OptionalInt winnerLifeTime = members.values().stream() .mapToInt(CeremonyOfChaosMember::getLifeTime) .max(); if(winnerLifeTime.isPresent()) { - getMembers().values().stream() + members.values().stream() .sorted(Comparator.comparingLong(CeremonyOfChaosMember::getLifeTime) .reversed() .thenComparingInt(CeremonyOfChaosMember::getScore) @@ -525,6 +530,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } //@formatter:on + return winners; } @@ -541,13 +547,15 @@ public class CeremonyOfChaosEvent extends AbstractEvent { case "update": { + final Map members = getMembers(); + final int time = (int) CeremonyOfChaosManager.getInstance().getScheduler("stopFight").getRemainingTime(TimeUnit.SECONDS); broadcastPacket(new ExCuriousHouseRemainTime(time)); - getMembers().values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); + members.values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); // Validate winner int count = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (!member.isDefeated()) { @@ -639,7 +647,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent final PlayerInstance player = event.getPlayer(); if (player != null) { - removeMember(player.getObjectId()); + final Map members = getMembers(); + final int playerObjectId = player.getObjectId(); + if (members.containsKey(playerObjectId)) + { + removeMember(playerObjectId); + if (members.size() <= 1) + { + stopFight(); + } + } } } @@ -651,8 +668,9 @@ public class CeremonyOfChaosEvent extends AbstractEvent { final PlayerInstance attackerPlayer = event.getAttacker().getActingPlayer(); final PlayerInstance targetPlayer = event.getTarget().getActingPlayer(); - final CeremonyOfChaosMember attackerMember = getMembers().get(attackerPlayer.getObjectId()); - final CeremonyOfChaosMember targetMember = getMembers().get(targetPlayer.getObjectId()); + final Map members = getMembers(); + final CeremonyOfChaosMember attackerMember = members.get(attackerPlayer.getObjectId()); + final CeremonyOfChaosMember targetMember = members.get(targetPlayer.getObjectId()); final DeleteObject deleteObject = new DeleteObject(targetPlayer); if ((attackerMember != null) && (targetMember != null)) { @@ -663,7 +681,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent targetMember.setDefeated(true); // Delete target player - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (member.getObjectId() != targetPlayer.getObjectId()) { diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java index 079aec7d02..3c36a20d0f 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java @@ -19,6 +19,7 @@ package org.l2jmobius.gameserver.model.ceremonyofchaos; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.OptionalInt; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -117,10 +118,11 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void preparePlayers() { - final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), getMembers().values()); + final Map members = getMembers(); + final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), members.values()); final NpcHtmlMessage msg = new NpcHtmlMessage(0); int index = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player.inObserverMode()) @@ -282,7 +284,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void stopFight() { - for (CeremonyOfChaosMember member : getMembers().values()) + final Map members = getMembers(); + for (CeremonyOfChaosMember member : members.values()) { if (member.getLifeTime() == 0) { @@ -292,7 +295,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent validateWinner(); final List winners = getWinners(); - final List members = new ArrayList<>(getMembers().size()); + final List memberList = new ArrayList<>(members.size()); SystemMessage msg = null; if (winners.isEmpty() || (winners.size() > 1)) { @@ -393,7 +396,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } } - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player != null) @@ -406,14 +409,14 @@ public class CeremonyOfChaosEvent extends AbstractEvent // Send result player.sendPacket(new ExCuriousHouseResult(member.getResultType(), this)); - members.add(member); + memberList.add(member); } } getTimers().cancelTimer("update", null, null); final StatSet params = new StatSet(); params.set("time", 30); getTimers().addTimer("match_end_countdown", params, 30 * 1000, null, null); - EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, members)); + EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, memberList)); // XXX: ML2 Rewards ForGlory, ForHonor and ForVictory quests for (CeremonyOfChaosMember member : getMembers().values()) @@ -422,7 +425,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent if (player == null) { continue; - } + } final QuestState qs = player.getQuestState("Q10813_ForGlory"); final QuestState qs1 = player.getQuestState("Q10819_ForHonor"); final QuestState qs2 = player.getQuestState("Q10825_ForVictory"); @@ -518,14 +521,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent public List getWinners() { final List winners = new ArrayList<>(); + final Map members = getMembers(); + //@formatter:off - final OptionalInt winnerLifeTime = getMembers().values().stream() + final OptionalInt winnerLifeTime = members.values().stream() .mapToInt(CeremonyOfChaosMember::getLifeTime) .max(); if(winnerLifeTime.isPresent()) { - getMembers().values().stream() + members.values().stream() .sorted(Comparator.comparingLong(CeremonyOfChaosMember::getLifeTime) .reversed() .thenComparingInt(CeremonyOfChaosMember::getScore) @@ -535,6 +540,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } //@formatter:on + return winners; } @@ -551,13 +557,15 @@ public class CeremonyOfChaosEvent extends AbstractEvent { case "update": { + final Map members = getMembers(); + final int time = (int) CeremonyOfChaosManager.getInstance().getScheduler("stopFight").getRemainingTime(TimeUnit.SECONDS); broadcastPacket(new ExCuriousHouseRemainTime(time)); - getMembers().values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); + members.values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); // Validate winner int count = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (!member.isDefeated()) { @@ -649,7 +657,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent final PlayerInstance player = event.getPlayer(); if (player != null) { - removeMember(player.getObjectId()); + final Map members = getMembers(); + final int playerObjectId = player.getObjectId(); + if (members.containsKey(playerObjectId)) + { + removeMember(playerObjectId); + if (members.size() <= 1) + { + stopFight(); + } + } } } @@ -661,8 +678,9 @@ public class CeremonyOfChaosEvent extends AbstractEvent { final PlayerInstance attackerPlayer = event.getAttacker().getActingPlayer(); final PlayerInstance targetPlayer = event.getTarget().getActingPlayer(); - final CeremonyOfChaosMember attackerMember = getMembers().get(attackerPlayer.getObjectId()); - final CeremonyOfChaosMember targetMember = getMembers().get(targetPlayer.getObjectId()); + final Map members = getMembers(); + final CeremonyOfChaosMember attackerMember = members.get(attackerPlayer.getObjectId()); + final CeremonyOfChaosMember targetMember = members.get(targetPlayer.getObjectId()); final DeleteObject deleteObject = new DeleteObject(targetPlayer); if ((attackerMember != null) && (targetMember != null)) { @@ -673,7 +691,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent targetMember.setDefeated(true); // Delete target player - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (member.getObjectId() != targetPlayer.getObjectId()) { diff --git a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java index ee5b54f923..13040871bb 100644 --- a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java +++ b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java @@ -19,6 +19,7 @@ package org.l2jmobius.gameserver.model.ceremonyofchaos; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.OptionalInt; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -113,10 +114,11 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void preparePlayers() { - final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), getMembers().values()); + final Map members = getMembers(); + final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), members.values()); final NpcHtmlMessage msg = new NpcHtmlMessage(0); int index = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player.inObserverMode()) @@ -278,7 +280,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void stopFight() { - for (CeremonyOfChaosMember member : getMembers().values()) + final Map members = getMembers(); + for (CeremonyOfChaosMember member : members.values()) { if (member.getLifeTime() == 0) { @@ -288,7 +291,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent validateWinner(); final List winners = getWinners(); - final List members = new ArrayList<>(getMembers().size()); + final List memberList = new ArrayList<>(members.size()); SystemMessage msg = null; if (winners.isEmpty() || (winners.size() > 1)) { @@ -389,7 +392,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } } - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player != null) @@ -402,14 +405,14 @@ public class CeremonyOfChaosEvent extends AbstractEvent // Send result player.sendPacket(new ExCuriousHouseResult(member.getResultType(), this)); - members.add(member); + memberList.add(member); } } getTimers().cancelTimer("update", null, null); final StatSet params = new StatSet(); params.set("time", 30); getTimers().addTimer("match_end_countdown", params, 30 * 1000, null, null); - EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, members)); + EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, memberList)); } private void teleportPlayersOut() @@ -474,14 +477,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent public List getWinners() { final List winners = new ArrayList<>(); + final Map members = getMembers(); + //@formatter:off - final OptionalInt winnerLifeTime = getMembers().values().stream() + final OptionalInt winnerLifeTime = members.values().stream() .mapToInt(CeremonyOfChaosMember::getLifeTime) .max(); if(winnerLifeTime.isPresent()) { - getMembers().values().stream() + members.values().stream() .sorted(Comparator.comparingLong(CeremonyOfChaosMember::getLifeTime) .reversed() .thenComparingInt(CeremonyOfChaosMember::getScore) @@ -491,6 +496,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } //@formatter:on + return winners; } @@ -507,13 +513,15 @@ public class CeremonyOfChaosEvent extends AbstractEvent { case "update": { + final Map members = getMembers(); + final int time = (int) CeremonyOfChaosManager.getInstance().getScheduler("stopFight").getRemainingTime(TimeUnit.SECONDS); broadcastPacket(new ExCuriousHouseRemainTime(time)); - getMembers().values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); + members.values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); // Validate winner int count = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (!member.isDefeated()) { @@ -605,7 +613,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent final PlayerInstance player = event.getPlayer(); if (player != null) { - removeMember(player.getObjectId()); + final Map members = getMembers(); + final int playerObjectId = player.getObjectId(); + if (members.containsKey(playerObjectId)) + { + removeMember(playerObjectId); + if (members.size() <= 1) + { + stopFight(); + } + } } } @@ -617,8 +634,9 @@ public class CeremonyOfChaosEvent extends AbstractEvent { final PlayerInstance attackerPlayer = event.getAttacker().getActingPlayer(); final PlayerInstance targetPlayer = event.getTarget().getActingPlayer(); - final CeremonyOfChaosMember attackerMember = getMembers().get(attackerPlayer.getObjectId()); - final CeremonyOfChaosMember targetMember = getMembers().get(targetPlayer.getObjectId()); + final Map members = getMembers(); + final CeremonyOfChaosMember attackerMember = members.get(attackerPlayer.getObjectId()); + final CeremonyOfChaosMember targetMember = members.get(targetPlayer.getObjectId()); final DeleteObject deleteObject = new DeleteObject(targetPlayer); if ((attackerMember != null) && (targetMember != null)) { @@ -629,7 +647,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent targetMember.setDefeated(true); // Delete target player - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (member.getObjectId() != targetPlayer.getObjectId()) { diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java index df8c2c0c2e..13040871bb 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java @@ -19,6 +19,7 @@ package org.l2jmobius.gameserver.model.ceremonyofchaos; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.OptionalInt; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -31,6 +32,7 @@ import org.l2jmobius.gameserver.enums.CeremonyOfChaosResult; import org.l2jmobius.gameserver.instancemanager.CeremonyOfChaosManager; import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager; import org.l2jmobius.gameserver.instancemanager.InstanceManager; +import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Party; import org.l2jmobius.gameserver.model.Party.MessageType; import org.l2jmobius.gameserver.model.StatSet; @@ -47,6 +49,7 @@ import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent; import org.l2jmobius.gameserver.model.events.annotations.RegisterType; import org.l2jmobius.gameserver.model.events.impl.ceremonyofchaos.OnCeremonyOfChaosMatchResult; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath; +import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogout; import org.l2jmobius.gameserver.model.holders.ItemHolder; import org.l2jmobius.gameserver.model.holders.SkillHolder; import org.l2jmobius.gameserver.model.instancezone.Instance; @@ -111,10 +114,11 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void preparePlayers() { - final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), getMembers().values()); + final Map members = getMembers(); + final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), members.values()); final NpcHtmlMessage msg = new NpcHtmlMessage(0); int index = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player.inObserverMode()) @@ -276,7 +280,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void stopFight() { - for (CeremonyOfChaosMember member : getMembers().values()) + final Map members = getMembers(); + for (CeremonyOfChaosMember member : members.values()) { if (member.getLifeTime() == 0) { @@ -286,8 +291,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent validateWinner(); final List winners = getWinners(); - final List members = new ArrayList<>(getMembers().size()); - final SystemMessage msg; + final List memberList = new ArrayList<>(members.size()); + SystemMessage msg = null; if (winners.isEmpty() || (winners.size() > 1)) { msg = new SystemMessage(SystemMessageId.THERE_IS_NO_VICTOR_THE_MATCH_ENDS_IN_A_TIE); @@ -295,113 +300,119 @@ public class CeremonyOfChaosEvent extends AbstractEvent else { final PlayerInstance winner = winners.get(0).getPlayer(); - msg = new SystemMessage(SystemMessageId.CONGRATULATIONS_C1_YOU_WIN_THE_MATCH); - msg.addString(winner.getName()); - - // Rewards according to https://l2wiki.com/Ceremony_of_Chaos - final int marksRewarded = Rnd.get(2, 4); - winner.addItem("CoC-Winner", 34900, marksRewarded, winner, true); // Mysterious Marks - - // Possible additional rewards - - // Improved Life Stone - if (Rnd.get(10) < 3) // Chance to get reward (30%) + if (winner != null) { - switch (Rnd.get(4)) + msg = new SystemMessage(SystemMessageId.CONGRATULATIONS_C1_YOU_WIN_THE_MATCH); + msg.addString(winner.getName()); + + // Rewards according to https://l2wiki.com/Ceremony_of_Chaos + final int marksRewarded = Rnd.get(2, 4); + winner.addItem("CoC-Winner", 34900, marksRewarded, winner, true); // Mysterious Marks + + // Possible additional rewards + + // Improved Life Stone + if (Rnd.get(10) < 3) // Chance to get reward (30%) { - case 0: + switch (Rnd.get(4)) { - winner.addItem("CoC-Winner", 18570, 1, winner, true); // Improved Life Stone (R95-grade) - break; - } - case 1: - { - winner.addItem("CoC-Winner", 18571, 1, winner, true); // Improved Life Stone (R95-grade) - break; - } - case 2: - { - winner.addItem("CoC-Winner", 18575, 1, winner, true); // Improved Life Stone (R99-grade) - break; - } - case 3: - { - winner.addItem("CoC-Winner", 18576, 1, winner, true); // Improved Life Stone (R99-grade) - break; + case 0: + { + winner.addItem("CoC-Winner", 18570, 1, winner, true); // Improved Life Stone (R95-grade) + break; + } + case 1: + { + winner.addItem("CoC-Winner", 18571, 1, winner, true); // Improved Life Stone (R95-grade) + break; + } + case 2: + { + winner.addItem("CoC-Winner", 18575, 1, winner, true); // Improved Life Stone (R99-grade) + break; + } + case 3: + { + winner.addItem("CoC-Winner", 18576, 1, winner, true); // Improved Life Stone (R99-grade) + break; + } } } - } - // Soul Crystal Fragment - else if (Rnd.get(10) < 3) // Chance to get reward (30%) - { - switch (Rnd.get(6)) + // Soul Crystal Fragment + else if (Rnd.get(10) < 3) // Chance to get reward (30%) { - case 0: + switch (Rnd.get(6)) { - winner.addItem("CoC-Winner", 19467, 1, winner, true); // Yellow Soul Crystal Fragment (R99-Grade) - break; - } - case 1: - { - winner.addItem("CoC-Winner", 19468, 1, winner, true); // Teal Soul Crystal Fragment (R99-Grade) - break; - } - case 2: - { - winner.addItem("CoC-Winner", 19469, 1, winner, true); // Purple Soul Crystal Fragment (R99-Grade) - break; - } - case 3: - { - winner.addItem("CoC-Winner", 19511, 1, winner, true); // Yellow Soul Crystal Fragment (R95-Grade) - break; - } - case 4: - { - winner.addItem("CoC-Winner", 19512, 1, winner, true); // Teal Soul Crystal Fragment (R95-Grade) - break; - } - case 5: - { - winner.addItem("CoC-Winner", 19513, 1, winner, true); // Purple Soul Crystal Fragment (R95-Grade) - break; + case 0: + { + winner.addItem("CoC-Winner", 19467, 1, winner, true); // Yellow Soul Crystal Fragment (R99-Grade) + break; + } + case 1: + { + winner.addItem("CoC-Winner", 19468, 1, winner, true); // Teal Soul Crystal Fragment (R99-Grade) + break; + } + case 2: + { + winner.addItem("CoC-Winner", 19469, 1, winner, true); // Purple Soul Crystal Fragment (R99-Grade) + break; + } + case 3: + { + winner.addItem("CoC-Winner", 19511, 1, winner, true); // Yellow Soul Crystal Fragment (R95-Grade) + break; + } + case 4: + { + winner.addItem("CoC-Winner", 19512, 1, winner, true); // Teal Soul Crystal Fragment (R95-Grade) + break; + } + case 5: + { + winner.addItem("CoC-Winner", 19513, 1, winner, true); // Purple Soul Crystal Fragment (R95-Grade) + break; + } } } - } - // Mysterious Belt - else if (Rnd.get(10) < 1) // Chance to get reward (10%) - { - winner.addItem("CoC-Winner", 35565, 1, winner, true); // Mysterious Belt - } - - // Save monthly progress. - final int totalMarks = winner.getVariables().getInt(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, 0) + marksRewarded; - winner.getVariables().set(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, totalMarks); - if (totalMarks > GlobalVariablesManager.getInstance().getInt(GlobalVariablesManager.COC_TOP_MARKS, 0)) - { - GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MARKS, totalMarks); - GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MEMBER, winner.getObjectId()); + // Mysterious Belt + else if (Rnd.get(10) < 1) // Chance to get reward (10%) + { + winner.addItem("CoC-Winner", 35565, 1, winner, true); // Mysterious Belt + } + + // Save monthly progress. + final int totalMarks = winner.getVariables().getInt(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, 0) + marksRewarded; + winner.getVariables().set(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, totalMarks); + if (totalMarks > GlobalVariablesManager.getInstance().getInt(GlobalVariablesManager.COC_TOP_MARKS, 0)) + { + GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MARKS, totalMarks); + GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MEMBER, winner.getObjectId()); + } } } - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player != null) { // Send winner message - player.sendPacket(msg); + if (msg != null) + { + player.sendPacket(msg); + } // Send result player.sendPacket(new ExCuriousHouseResult(member.getResultType(), this)); - members.add(member); + memberList.add(member); } } getTimers().cancelTimer("update", null, null); final StatSet params = new StatSet(); params.set("time", 30); getTimers().addTimer("match_end_countdown", params, 30 * 1000, null, null); - EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, members)); + EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, memberList)); } private void teleportPlayersOut() @@ -440,7 +451,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent player.sendPacket(ExCuriousHouseObserveMode.STATIC_DISABLED); // Teleport player back - player.teleToLocation(player.getLastLocation(), null); + final Location lastLocation = player.getLastLocation(); + player.teleToLocation(lastLocation != null ? lastLocation : new Location(82201, 147587, -3473), null); // Restore player information final PlayerAppearance app = player.getAppearance(); @@ -465,14 +477,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent public List getWinners() { final List winners = new ArrayList<>(); + final Map members = getMembers(); + //@formatter:off - final OptionalInt winnerLifeTime = getMembers().values().stream() + final OptionalInt winnerLifeTime = members.values().stream() .mapToInt(CeremonyOfChaosMember::getLifeTime) .max(); if(winnerLifeTime.isPresent()) { - getMembers().values().stream() + members.values().stream() .sorted(Comparator.comparingLong(CeremonyOfChaosMember::getLifeTime) .reversed() .thenComparingInt(CeremonyOfChaosMember::getScore) @@ -482,6 +496,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } //@formatter:on + return winners; } @@ -498,13 +513,15 @@ public class CeremonyOfChaosEvent extends AbstractEvent { case "update": { + final Map members = getMembers(); + final int time = (int) CeremonyOfChaosManager.getInstance().getScheduler("stopFight").getRemainingTime(TimeUnit.SECONDS); broadcastPacket(new ExCuriousHouseRemainTime(time)); - getMembers().values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); + members.values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); // Validate winner int count = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (!member.isDefeated()) { @@ -589,6 +606,26 @@ public class CeremonyOfChaosEvent extends AbstractEvent } } + @RegisterEvent(EventType.ON_PLAYER_LOGOUT) + @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) + private void OnPlayerLogout(OnPlayerLogout event) + { + final PlayerInstance player = event.getPlayer(); + if (player != null) + { + final Map members = getMembers(); + final int playerObjectId = player.getObjectId(); + if (members.containsKey(playerObjectId)) + { + removeMember(playerObjectId); + if (members.size() <= 1) + { + stopFight(); + } + } + } + } + @RegisterEvent(EventType.ON_CREATURE_DEATH) @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) public void onPlayerDeath(OnCreatureDeath event) @@ -597,8 +634,9 @@ public class CeremonyOfChaosEvent extends AbstractEvent { final PlayerInstance attackerPlayer = event.getAttacker().getActingPlayer(); final PlayerInstance targetPlayer = event.getTarget().getActingPlayer(); - final CeremonyOfChaosMember attackerMember = getMembers().get(attackerPlayer.getObjectId()); - final CeremonyOfChaosMember targetMember = getMembers().get(targetPlayer.getObjectId()); + final Map members = getMembers(); + final CeremonyOfChaosMember attackerMember = members.get(attackerPlayer.getObjectId()); + final CeremonyOfChaosMember targetMember = members.get(targetPlayer.getObjectId()); final DeleteObject deleteObject = new DeleteObject(targetPlayer); if ((attackerMember != null) && (targetMember != null)) { @@ -609,7 +647,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent targetMember.setDefeated(true); // Delete target player - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (member.getObjectId() != targetPlayer.getObjectId()) { diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java index 569e883943..c7d0cb125f 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java @@ -63,6 +63,11 @@ public abstract class AbstractEvent>extends Abs _members.put(member.getObjectId(), member); } + public void removeMember(int objectId) + { + _members.remove(objectId); + } + public void clearMembers() { _members.clear(); diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java index df8c2c0c2e..13040871bb 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java @@ -19,6 +19,7 @@ package org.l2jmobius.gameserver.model.ceremonyofchaos; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.OptionalInt; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -31,6 +32,7 @@ import org.l2jmobius.gameserver.enums.CeremonyOfChaosResult; import org.l2jmobius.gameserver.instancemanager.CeremonyOfChaosManager; import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager; import org.l2jmobius.gameserver.instancemanager.InstanceManager; +import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Party; import org.l2jmobius.gameserver.model.Party.MessageType; import org.l2jmobius.gameserver.model.StatSet; @@ -47,6 +49,7 @@ import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent; import org.l2jmobius.gameserver.model.events.annotations.RegisterType; import org.l2jmobius.gameserver.model.events.impl.ceremonyofchaos.OnCeremonyOfChaosMatchResult; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath; +import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogout; import org.l2jmobius.gameserver.model.holders.ItemHolder; import org.l2jmobius.gameserver.model.holders.SkillHolder; import org.l2jmobius.gameserver.model.instancezone.Instance; @@ -111,10 +114,11 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void preparePlayers() { - final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), getMembers().values()); + final Map members = getMembers(); + final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), members.values()); final NpcHtmlMessage msg = new NpcHtmlMessage(0); int index = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player.inObserverMode()) @@ -276,7 +280,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void stopFight() { - for (CeremonyOfChaosMember member : getMembers().values()) + final Map members = getMembers(); + for (CeremonyOfChaosMember member : members.values()) { if (member.getLifeTime() == 0) { @@ -286,8 +291,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent validateWinner(); final List winners = getWinners(); - final List members = new ArrayList<>(getMembers().size()); - final SystemMessage msg; + final List memberList = new ArrayList<>(members.size()); + SystemMessage msg = null; if (winners.isEmpty() || (winners.size() > 1)) { msg = new SystemMessage(SystemMessageId.THERE_IS_NO_VICTOR_THE_MATCH_ENDS_IN_A_TIE); @@ -295,113 +300,119 @@ public class CeremonyOfChaosEvent extends AbstractEvent else { final PlayerInstance winner = winners.get(0).getPlayer(); - msg = new SystemMessage(SystemMessageId.CONGRATULATIONS_C1_YOU_WIN_THE_MATCH); - msg.addString(winner.getName()); - - // Rewards according to https://l2wiki.com/Ceremony_of_Chaos - final int marksRewarded = Rnd.get(2, 4); - winner.addItem("CoC-Winner", 34900, marksRewarded, winner, true); // Mysterious Marks - - // Possible additional rewards - - // Improved Life Stone - if (Rnd.get(10) < 3) // Chance to get reward (30%) + if (winner != null) { - switch (Rnd.get(4)) + msg = new SystemMessage(SystemMessageId.CONGRATULATIONS_C1_YOU_WIN_THE_MATCH); + msg.addString(winner.getName()); + + // Rewards according to https://l2wiki.com/Ceremony_of_Chaos + final int marksRewarded = Rnd.get(2, 4); + winner.addItem("CoC-Winner", 34900, marksRewarded, winner, true); // Mysterious Marks + + // Possible additional rewards + + // Improved Life Stone + if (Rnd.get(10) < 3) // Chance to get reward (30%) { - case 0: + switch (Rnd.get(4)) { - winner.addItem("CoC-Winner", 18570, 1, winner, true); // Improved Life Stone (R95-grade) - break; - } - case 1: - { - winner.addItem("CoC-Winner", 18571, 1, winner, true); // Improved Life Stone (R95-grade) - break; - } - case 2: - { - winner.addItem("CoC-Winner", 18575, 1, winner, true); // Improved Life Stone (R99-grade) - break; - } - case 3: - { - winner.addItem("CoC-Winner", 18576, 1, winner, true); // Improved Life Stone (R99-grade) - break; + case 0: + { + winner.addItem("CoC-Winner", 18570, 1, winner, true); // Improved Life Stone (R95-grade) + break; + } + case 1: + { + winner.addItem("CoC-Winner", 18571, 1, winner, true); // Improved Life Stone (R95-grade) + break; + } + case 2: + { + winner.addItem("CoC-Winner", 18575, 1, winner, true); // Improved Life Stone (R99-grade) + break; + } + case 3: + { + winner.addItem("CoC-Winner", 18576, 1, winner, true); // Improved Life Stone (R99-grade) + break; + } } } - } - // Soul Crystal Fragment - else if (Rnd.get(10) < 3) // Chance to get reward (30%) - { - switch (Rnd.get(6)) + // Soul Crystal Fragment + else if (Rnd.get(10) < 3) // Chance to get reward (30%) { - case 0: + switch (Rnd.get(6)) { - winner.addItem("CoC-Winner", 19467, 1, winner, true); // Yellow Soul Crystal Fragment (R99-Grade) - break; - } - case 1: - { - winner.addItem("CoC-Winner", 19468, 1, winner, true); // Teal Soul Crystal Fragment (R99-Grade) - break; - } - case 2: - { - winner.addItem("CoC-Winner", 19469, 1, winner, true); // Purple Soul Crystal Fragment (R99-Grade) - break; - } - case 3: - { - winner.addItem("CoC-Winner", 19511, 1, winner, true); // Yellow Soul Crystal Fragment (R95-Grade) - break; - } - case 4: - { - winner.addItem("CoC-Winner", 19512, 1, winner, true); // Teal Soul Crystal Fragment (R95-Grade) - break; - } - case 5: - { - winner.addItem("CoC-Winner", 19513, 1, winner, true); // Purple Soul Crystal Fragment (R95-Grade) - break; + case 0: + { + winner.addItem("CoC-Winner", 19467, 1, winner, true); // Yellow Soul Crystal Fragment (R99-Grade) + break; + } + case 1: + { + winner.addItem("CoC-Winner", 19468, 1, winner, true); // Teal Soul Crystal Fragment (R99-Grade) + break; + } + case 2: + { + winner.addItem("CoC-Winner", 19469, 1, winner, true); // Purple Soul Crystal Fragment (R99-Grade) + break; + } + case 3: + { + winner.addItem("CoC-Winner", 19511, 1, winner, true); // Yellow Soul Crystal Fragment (R95-Grade) + break; + } + case 4: + { + winner.addItem("CoC-Winner", 19512, 1, winner, true); // Teal Soul Crystal Fragment (R95-Grade) + break; + } + case 5: + { + winner.addItem("CoC-Winner", 19513, 1, winner, true); // Purple Soul Crystal Fragment (R95-Grade) + break; + } } } - } - // Mysterious Belt - else if (Rnd.get(10) < 1) // Chance to get reward (10%) - { - winner.addItem("CoC-Winner", 35565, 1, winner, true); // Mysterious Belt - } - - // Save monthly progress. - final int totalMarks = winner.getVariables().getInt(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, 0) + marksRewarded; - winner.getVariables().set(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, totalMarks); - if (totalMarks > GlobalVariablesManager.getInstance().getInt(GlobalVariablesManager.COC_TOP_MARKS, 0)) - { - GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MARKS, totalMarks); - GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MEMBER, winner.getObjectId()); + // Mysterious Belt + else if (Rnd.get(10) < 1) // Chance to get reward (10%) + { + winner.addItem("CoC-Winner", 35565, 1, winner, true); // Mysterious Belt + } + + // Save monthly progress. + final int totalMarks = winner.getVariables().getInt(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, 0) + marksRewarded; + winner.getVariables().set(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, totalMarks); + if (totalMarks > GlobalVariablesManager.getInstance().getInt(GlobalVariablesManager.COC_TOP_MARKS, 0)) + { + GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MARKS, totalMarks); + GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MEMBER, winner.getObjectId()); + } } } - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player != null) { // Send winner message - player.sendPacket(msg); + if (msg != null) + { + player.sendPacket(msg); + } // Send result player.sendPacket(new ExCuriousHouseResult(member.getResultType(), this)); - members.add(member); + memberList.add(member); } } getTimers().cancelTimer("update", null, null); final StatSet params = new StatSet(); params.set("time", 30); getTimers().addTimer("match_end_countdown", params, 30 * 1000, null, null); - EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, members)); + EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, memberList)); } private void teleportPlayersOut() @@ -440,7 +451,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent player.sendPacket(ExCuriousHouseObserveMode.STATIC_DISABLED); // Teleport player back - player.teleToLocation(player.getLastLocation(), null); + final Location lastLocation = player.getLastLocation(); + player.teleToLocation(lastLocation != null ? lastLocation : new Location(82201, 147587, -3473), null); // Restore player information final PlayerAppearance app = player.getAppearance(); @@ -465,14 +477,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent public List getWinners() { final List winners = new ArrayList<>(); + final Map members = getMembers(); + //@formatter:off - final OptionalInt winnerLifeTime = getMembers().values().stream() + final OptionalInt winnerLifeTime = members.values().stream() .mapToInt(CeremonyOfChaosMember::getLifeTime) .max(); if(winnerLifeTime.isPresent()) { - getMembers().values().stream() + members.values().stream() .sorted(Comparator.comparingLong(CeremonyOfChaosMember::getLifeTime) .reversed() .thenComparingInt(CeremonyOfChaosMember::getScore) @@ -482,6 +496,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } //@formatter:on + return winners; } @@ -498,13 +513,15 @@ public class CeremonyOfChaosEvent extends AbstractEvent { case "update": { + final Map members = getMembers(); + final int time = (int) CeremonyOfChaosManager.getInstance().getScheduler("stopFight").getRemainingTime(TimeUnit.SECONDS); broadcastPacket(new ExCuriousHouseRemainTime(time)); - getMembers().values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); + members.values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); // Validate winner int count = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (!member.isDefeated()) { @@ -589,6 +606,26 @@ public class CeremonyOfChaosEvent extends AbstractEvent } } + @RegisterEvent(EventType.ON_PLAYER_LOGOUT) + @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) + private void OnPlayerLogout(OnPlayerLogout event) + { + final PlayerInstance player = event.getPlayer(); + if (player != null) + { + final Map members = getMembers(); + final int playerObjectId = player.getObjectId(); + if (members.containsKey(playerObjectId)) + { + removeMember(playerObjectId); + if (members.size() <= 1) + { + stopFight(); + } + } + } + } + @RegisterEvent(EventType.ON_CREATURE_DEATH) @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) public void onPlayerDeath(OnCreatureDeath event) @@ -597,8 +634,9 @@ public class CeremonyOfChaosEvent extends AbstractEvent { final PlayerInstance attackerPlayer = event.getAttacker().getActingPlayer(); final PlayerInstance targetPlayer = event.getTarget().getActingPlayer(); - final CeremonyOfChaosMember attackerMember = getMembers().get(attackerPlayer.getObjectId()); - final CeremonyOfChaosMember targetMember = getMembers().get(targetPlayer.getObjectId()); + final Map members = getMembers(); + final CeremonyOfChaosMember attackerMember = members.get(attackerPlayer.getObjectId()); + final CeremonyOfChaosMember targetMember = members.get(targetPlayer.getObjectId()); final DeleteObject deleteObject = new DeleteObject(targetPlayer); if ((attackerMember != null) && (targetMember != null)) { @@ -609,7 +647,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent targetMember.setDefeated(true); // Delete target player - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (member.getObjectId() != targetPlayer.getObjectId()) { diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java index 569e883943..c7d0cb125f 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java @@ -63,6 +63,11 @@ public abstract class AbstractEvent>extends Abs _members.put(member.getObjectId(), member); } + public void removeMember(int objectId) + { + _members.remove(objectId); + } + public void clearMembers() { _members.clear(); diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java index df8c2c0c2e..13040871bb 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java @@ -19,6 +19,7 @@ package org.l2jmobius.gameserver.model.ceremonyofchaos; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.OptionalInt; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -31,6 +32,7 @@ import org.l2jmobius.gameserver.enums.CeremonyOfChaosResult; import org.l2jmobius.gameserver.instancemanager.CeremonyOfChaosManager; import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager; import org.l2jmobius.gameserver.instancemanager.InstanceManager; +import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Party; import org.l2jmobius.gameserver.model.Party.MessageType; import org.l2jmobius.gameserver.model.StatSet; @@ -47,6 +49,7 @@ import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent; import org.l2jmobius.gameserver.model.events.annotations.RegisterType; import org.l2jmobius.gameserver.model.events.impl.ceremonyofchaos.OnCeremonyOfChaosMatchResult; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath; +import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogout; import org.l2jmobius.gameserver.model.holders.ItemHolder; import org.l2jmobius.gameserver.model.holders.SkillHolder; import org.l2jmobius.gameserver.model.instancezone.Instance; @@ -111,10 +114,11 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void preparePlayers() { - final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), getMembers().values()); + final Map members = getMembers(); + final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), members.values()); final NpcHtmlMessage msg = new NpcHtmlMessage(0); int index = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player.inObserverMode()) @@ -276,7 +280,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void stopFight() { - for (CeremonyOfChaosMember member : getMembers().values()) + final Map members = getMembers(); + for (CeremonyOfChaosMember member : members.values()) { if (member.getLifeTime() == 0) { @@ -286,8 +291,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent validateWinner(); final List winners = getWinners(); - final List members = new ArrayList<>(getMembers().size()); - final SystemMessage msg; + final List memberList = new ArrayList<>(members.size()); + SystemMessage msg = null; if (winners.isEmpty() || (winners.size() > 1)) { msg = new SystemMessage(SystemMessageId.THERE_IS_NO_VICTOR_THE_MATCH_ENDS_IN_A_TIE); @@ -295,113 +300,119 @@ public class CeremonyOfChaosEvent extends AbstractEvent else { final PlayerInstance winner = winners.get(0).getPlayer(); - msg = new SystemMessage(SystemMessageId.CONGRATULATIONS_C1_YOU_WIN_THE_MATCH); - msg.addString(winner.getName()); - - // Rewards according to https://l2wiki.com/Ceremony_of_Chaos - final int marksRewarded = Rnd.get(2, 4); - winner.addItem("CoC-Winner", 34900, marksRewarded, winner, true); // Mysterious Marks - - // Possible additional rewards - - // Improved Life Stone - if (Rnd.get(10) < 3) // Chance to get reward (30%) + if (winner != null) { - switch (Rnd.get(4)) + msg = new SystemMessage(SystemMessageId.CONGRATULATIONS_C1_YOU_WIN_THE_MATCH); + msg.addString(winner.getName()); + + // Rewards according to https://l2wiki.com/Ceremony_of_Chaos + final int marksRewarded = Rnd.get(2, 4); + winner.addItem("CoC-Winner", 34900, marksRewarded, winner, true); // Mysterious Marks + + // Possible additional rewards + + // Improved Life Stone + if (Rnd.get(10) < 3) // Chance to get reward (30%) { - case 0: + switch (Rnd.get(4)) { - winner.addItem("CoC-Winner", 18570, 1, winner, true); // Improved Life Stone (R95-grade) - break; - } - case 1: - { - winner.addItem("CoC-Winner", 18571, 1, winner, true); // Improved Life Stone (R95-grade) - break; - } - case 2: - { - winner.addItem("CoC-Winner", 18575, 1, winner, true); // Improved Life Stone (R99-grade) - break; - } - case 3: - { - winner.addItem("CoC-Winner", 18576, 1, winner, true); // Improved Life Stone (R99-grade) - break; + case 0: + { + winner.addItem("CoC-Winner", 18570, 1, winner, true); // Improved Life Stone (R95-grade) + break; + } + case 1: + { + winner.addItem("CoC-Winner", 18571, 1, winner, true); // Improved Life Stone (R95-grade) + break; + } + case 2: + { + winner.addItem("CoC-Winner", 18575, 1, winner, true); // Improved Life Stone (R99-grade) + break; + } + case 3: + { + winner.addItem("CoC-Winner", 18576, 1, winner, true); // Improved Life Stone (R99-grade) + break; + } } } - } - // Soul Crystal Fragment - else if (Rnd.get(10) < 3) // Chance to get reward (30%) - { - switch (Rnd.get(6)) + // Soul Crystal Fragment + else if (Rnd.get(10) < 3) // Chance to get reward (30%) { - case 0: + switch (Rnd.get(6)) { - winner.addItem("CoC-Winner", 19467, 1, winner, true); // Yellow Soul Crystal Fragment (R99-Grade) - break; - } - case 1: - { - winner.addItem("CoC-Winner", 19468, 1, winner, true); // Teal Soul Crystal Fragment (R99-Grade) - break; - } - case 2: - { - winner.addItem("CoC-Winner", 19469, 1, winner, true); // Purple Soul Crystal Fragment (R99-Grade) - break; - } - case 3: - { - winner.addItem("CoC-Winner", 19511, 1, winner, true); // Yellow Soul Crystal Fragment (R95-Grade) - break; - } - case 4: - { - winner.addItem("CoC-Winner", 19512, 1, winner, true); // Teal Soul Crystal Fragment (R95-Grade) - break; - } - case 5: - { - winner.addItem("CoC-Winner", 19513, 1, winner, true); // Purple Soul Crystal Fragment (R95-Grade) - break; + case 0: + { + winner.addItem("CoC-Winner", 19467, 1, winner, true); // Yellow Soul Crystal Fragment (R99-Grade) + break; + } + case 1: + { + winner.addItem("CoC-Winner", 19468, 1, winner, true); // Teal Soul Crystal Fragment (R99-Grade) + break; + } + case 2: + { + winner.addItem("CoC-Winner", 19469, 1, winner, true); // Purple Soul Crystal Fragment (R99-Grade) + break; + } + case 3: + { + winner.addItem("CoC-Winner", 19511, 1, winner, true); // Yellow Soul Crystal Fragment (R95-Grade) + break; + } + case 4: + { + winner.addItem("CoC-Winner", 19512, 1, winner, true); // Teal Soul Crystal Fragment (R95-Grade) + break; + } + case 5: + { + winner.addItem("CoC-Winner", 19513, 1, winner, true); // Purple Soul Crystal Fragment (R95-Grade) + break; + } } } - } - // Mysterious Belt - else if (Rnd.get(10) < 1) // Chance to get reward (10%) - { - winner.addItem("CoC-Winner", 35565, 1, winner, true); // Mysterious Belt - } - - // Save monthly progress. - final int totalMarks = winner.getVariables().getInt(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, 0) + marksRewarded; - winner.getVariables().set(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, totalMarks); - if (totalMarks > GlobalVariablesManager.getInstance().getInt(GlobalVariablesManager.COC_TOP_MARKS, 0)) - { - GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MARKS, totalMarks); - GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MEMBER, winner.getObjectId()); + // Mysterious Belt + else if (Rnd.get(10) < 1) // Chance to get reward (10%) + { + winner.addItem("CoC-Winner", 35565, 1, winner, true); // Mysterious Belt + } + + // Save monthly progress. + final int totalMarks = winner.getVariables().getInt(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, 0) + marksRewarded; + winner.getVariables().set(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, totalMarks); + if (totalMarks > GlobalVariablesManager.getInstance().getInt(GlobalVariablesManager.COC_TOP_MARKS, 0)) + { + GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MARKS, totalMarks); + GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MEMBER, winner.getObjectId()); + } } } - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player != null) { // Send winner message - player.sendPacket(msg); + if (msg != null) + { + player.sendPacket(msg); + } // Send result player.sendPacket(new ExCuriousHouseResult(member.getResultType(), this)); - members.add(member); + memberList.add(member); } } getTimers().cancelTimer("update", null, null); final StatSet params = new StatSet(); params.set("time", 30); getTimers().addTimer("match_end_countdown", params, 30 * 1000, null, null); - EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, members)); + EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, memberList)); } private void teleportPlayersOut() @@ -440,7 +451,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent player.sendPacket(ExCuriousHouseObserveMode.STATIC_DISABLED); // Teleport player back - player.teleToLocation(player.getLastLocation(), null); + final Location lastLocation = player.getLastLocation(); + player.teleToLocation(lastLocation != null ? lastLocation : new Location(82201, 147587, -3473), null); // Restore player information final PlayerAppearance app = player.getAppearance(); @@ -465,14 +477,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent public List getWinners() { final List winners = new ArrayList<>(); + final Map members = getMembers(); + //@formatter:off - final OptionalInt winnerLifeTime = getMembers().values().stream() + final OptionalInt winnerLifeTime = members.values().stream() .mapToInt(CeremonyOfChaosMember::getLifeTime) .max(); if(winnerLifeTime.isPresent()) { - getMembers().values().stream() + members.values().stream() .sorted(Comparator.comparingLong(CeremonyOfChaosMember::getLifeTime) .reversed() .thenComparingInt(CeremonyOfChaosMember::getScore) @@ -482,6 +496,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } //@formatter:on + return winners; } @@ -498,13 +513,15 @@ public class CeremonyOfChaosEvent extends AbstractEvent { case "update": { + final Map members = getMembers(); + final int time = (int) CeremonyOfChaosManager.getInstance().getScheduler("stopFight").getRemainingTime(TimeUnit.SECONDS); broadcastPacket(new ExCuriousHouseRemainTime(time)); - getMembers().values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); + members.values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); // Validate winner int count = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (!member.isDefeated()) { @@ -589,6 +606,26 @@ public class CeremonyOfChaosEvent extends AbstractEvent } } + @RegisterEvent(EventType.ON_PLAYER_LOGOUT) + @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) + private void OnPlayerLogout(OnPlayerLogout event) + { + final PlayerInstance player = event.getPlayer(); + if (player != null) + { + final Map members = getMembers(); + final int playerObjectId = player.getObjectId(); + if (members.containsKey(playerObjectId)) + { + removeMember(playerObjectId); + if (members.size() <= 1) + { + stopFight(); + } + } + } + } + @RegisterEvent(EventType.ON_CREATURE_DEATH) @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) public void onPlayerDeath(OnCreatureDeath event) @@ -597,8 +634,9 @@ public class CeremonyOfChaosEvent extends AbstractEvent { final PlayerInstance attackerPlayer = event.getAttacker().getActingPlayer(); final PlayerInstance targetPlayer = event.getTarget().getActingPlayer(); - final CeremonyOfChaosMember attackerMember = getMembers().get(attackerPlayer.getObjectId()); - final CeremonyOfChaosMember targetMember = getMembers().get(targetPlayer.getObjectId()); + final Map members = getMembers(); + final CeremonyOfChaosMember attackerMember = members.get(attackerPlayer.getObjectId()); + final CeremonyOfChaosMember targetMember = members.get(targetPlayer.getObjectId()); final DeleteObject deleteObject = new DeleteObject(targetPlayer); if ((attackerMember != null) && (targetMember != null)) { @@ -609,7 +647,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent targetMember.setDefeated(true); // Delete target player - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (member.getObjectId() != targetPlayer.getObjectId()) { diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java index 569e883943..c7d0cb125f 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java @@ -63,6 +63,11 @@ public abstract class AbstractEvent>extends Abs _members.put(member.getObjectId(), member); } + public void removeMember(int objectId) + { + _members.remove(objectId); + } + public void clearMembers() { _members.clear(); diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java index df8c2c0c2e..13040871bb 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java @@ -19,6 +19,7 @@ package org.l2jmobius.gameserver.model.ceremonyofchaos; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.OptionalInt; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -31,6 +32,7 @@ import org.l2jmobius.gameserver.enums.CeremonyOfChaosResult; import org.l2jmobius.gameserver.instancemanager.CeremonyOfChaosManager; import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager; import org.l2jmobius.gameserver.instancemanager.InstanceManager; +import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Party; import org.l2jmobius.gameserver.model.Party.MessageType; import org.l2jmobius.gameserver.model.StatSet; @@ -47,6 +49,7 @@ import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent; import org.l2jmobius.gameserver.model.events.annotations.RegisterType; import org.l2jmobius.gameserver.model.events.impl.ceremonyofchaos.OnCeremonyOfChaosMatchResult; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath; +import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogout; import org.l2jmobius.gameserver.model.holders.ItemHolder; import org.l2jmobius.gameserver.model.holders.SkillHolder; import org.l2jmobius.gameserver.model.instancezone.Instance; @@ -111,10 +114,11 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void preparePlayers() { - final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), getMembers().values()); + final Map members = getMembers(); + final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), members.values()); final NpcHtmlMessage msg = new NpcHtmlMessage(0); int index = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player.inObserverMode()) @@ -276,7 +280,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void stopFight() { - for (CeremonyOfChaosMember member : getMembers().values()) + final Map members = getMembers(); + for (CeremonyOfChaosMember member : members.values()) { if (member.getLifeTime() == 0) { @@ -286,8 +291,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent validateWinner(); final List winners = getWinners(); - final List members = new ArrayList<>(getMembers().size()); - final SystemMessage msg; + final List memberList = new ArrayList<>(members.size()); + SystemMessage msg = null; if (winners.isEmpty() || (winners.size() > 1)) { msg = new SystemMessage(SystemMessageId.THERE_IS_NO_VICTOR_THE_MATCH_ENDS_IN_A_TIE); @@ -295,113 +300,119 @@ public class CeremonyOfChaosEvent extends AbstractEvent else { final PlayerInstance winner = winners.get(0).getPlayer(); - msg = new SystemMessage(SystemMessageId.CONGRATULATIONS_C1_YOU_WIN_THE_MATCH); - msg.addString(winner.getName()); - - // Rewards according to https://l2wiki.com/Ceremony_of_Chaos - final int marksRewarded = Rnd.get(2, 4); - winner.addItem("CoC-Winner", 34900, marksRewarded, winner, true); // Mysterious Marks - - // Possible additional rewards - - // Improved Life Stone - if (Rnd.get(10) < 3) // Chance to get reward (30%) + if (winner != null) { - switch (Rnd.get(4)) + msg = new SystemMessage(SystemMessageId.CONGRATULATIONS_C1_YOU_WIN_THE_MATCH); + msg.addString(winner.getName()); + + // Rewards according to https://l2wiki.com/Ceremony_of_Chaos + final int marksRewarded = Rnd.get(2, 4); + winner.addItem("CoC-Winner", 34900, marksRewarded, winner, true); // Mysterious Marks + + // Possible additional rewards + + // Improved Life Stone + if (Rnd.get(10) < 3) // Chance to get reward (30%) { - case 0: + switch (Rnd.get(4)) { - winner.addItem("CoC-Winner", 18570, 1, winner, true); // Improved Life Stone (R95-grade) - break; - } - case 1: - { - winner.addItem("CoC-Winner", 18571, 1, winner, true); // Improved Life Stone (R95-grade) - break; - } - case 2: - { - winner.addItem("CoC-Winner", 18575, 1, winner, true); // Improved Life Stone (R99-grade) - break; - } - case 3: - { - winner.addItem("CoC-Winner", 18576, 1, winner, true); // Improved Life Stone (R99-grade) - break; + case 0: + { + winner.addItem("CoC-Winner", 18570, 1, winner, true); // Improved Life Stone (R95-grade) + break; + } + case 1: + { + winner.addItem("CoC-Winner", 18571, 1, winner, true); // Improved Life Stone (R95-grade) + break; + } + case 2: + { + winner.addItem("CoC-Winner", 18575, 1, winner, true); // Improved Life Stone (R99-grade) + break; + } + case 3: + { + winner.addItem("CoC-Winner", 18576, 1, winner, true); // Improved Life Stone (R99-grade) + break; + } } } - } - // Soul Crystal Fragment - else if (Rnd.get(10) < 3) // Chance to get reward (30%) - { - switch (Rnd.get(6)) + // Soul Crystal Fragment + else if (Rnd.get(10) < 3) // Chance to get reward (30%) { - case 0: + switch (Rnd.get(6)) { - winner.addItem("CoC-Winner", 19467, 1, winner, true); // Yellow Soul Crystal Fragment (R99-Grade) - break; - } - case 1: - { - winner.addItem("CoC-Winner", 19468, 1, winner, true); // Teal Soul Crystal Fragment (R99-Grade) - break; - } - case 2: - { - winner.addItem("CoC-Winner", 19469, 1, winner, true); // Purple Soul Crystal Fragment (R99-Grade) - break; - } - case 3: - { - winner.addItem("CoC-Winner", 19511, 1, winner, true); // Yellow Soul Crystal Fragment (R95-Grade) - break; - } - case 4: - { - winner.addItem("CoC-Winner", 19512, 1, winner, true); // Teal Soul Crystal Fragment (R95-Grade) - break; - } - case 5: - { - winner.addItem("CoC-Winner", 19513, 1, winner, true); // Purple Soul Crystal Fragment (R95-Grade) - break; + case 0: + { + winner.addItem("CoC-Winner", 19467, 1, winner, true); // Yellow Soul Crystal Fragment (R99-Grade) + break; + } + case 1: + { + winner.addItem("CoC-Winner", 19468, 1, winner, true); // Teal Soul Crystal Fragment (R99-Grade) + break; + } + case 2: + { + winner.addItem("CoC-Winner", 19469, 1, winner, true); // Purple Soul Crystal Fragment (R99-Grade) + break; + } + case 3: + { + winner.addItem("CoC-Winner", 19511, 1, winner, true); // Yellow Soul Crystal Fragment (R95-Grade) + break; + } + case 4: + { + winner.addItem("CoC-Winner", 19512, 1, winner, true); // Teal Soul Crystal Fragment (R95-Grade) + break; + } + case 5: + { + winner.addItem("CoC-Winner", 19513, 1, winner, true); // Purple Soul Crystal Fragment (R95-Grade) + break; + } } } - } - // Mysterious Belt - else if (Rnd.get(10) < 1) // Chance to get reward (10%) - { - winner.addItem("CoC-Winner", 35565, 1, winner, true); // Mysterious Belt - } - - // Save monthly progress. - final int totalMarks = winner.getVariables().getInt(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, 0) + marksRewarded; - winner.getVariables().set(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, totalMarks); - if (totalMarks > GlobalVariablesManager.getInstance().getInt(GlobalVariablesManager.COC_TOP_MARKS, 0)) - { - GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MARKS, totalMarks); - GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MEMBER, winner.getObjectId()); + // Mysterious Belt + else if (Rnd.get(10) < 1) // Chance to get reward (10%) + { + winner.addItem("CoC-Winner", 35565, 1, winner, true); // Mysterious Belt + } + + // Save monthly progress. + final int totalMarks = winner.getVariables().getInt(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, 0) + marksRewarded; + winner.getVariables().set(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, totalMarks); + if (totalMarks > GlobalVariablesManager.getInstance().getInt(GlobalVariablesManager.COC_TOP_MARKS, 0)) + { + GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MARKS, totalMarks); + GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MEMBER, winner.getObjectId()); + } } } - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player != null) { // Send winner message - player.sendPacket(msg); + if (msg != null) + { + player.sendPacket(msg); + } // Send result player.sendPacket(new ExCuriousHouseResult(member.getResultType(), this)); - members.add(member); + memberList.add(member); } } getTimers().cancelTimer("update", null, null); final StatSet params = new StatSet(); params.set("time", 30); getTimers().addTimer("match_end_countdown", params, 30 * 1000, null, null); - EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, members)); + EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, memberList)); } private void teleportPlayersOut() @@ -440,7 +451,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent player.sendPacket(ExCuriousHouseObserveMode.STATIC_DISABLED); // Teleport player back - player.teleToLocation(player.getLastLocation(), null); + final Location lastLocation = player.getLastLocation(); + player.teleToLocation(lastLocation != null ? lastLocation : new Location(82201, 147587, -3473), null); // Restore player information final PlayerAppearance app = player.getAppearance(); @@ -465,14 +477,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent public List getWinners() { final List winners = new ArrayList<>(); + final Map members = getMembers(); + //@formatter:off - final OptionalInt winnerLifeTime = getMembers().values().stream() + final OptionalInt winnerLifeTime = members.values().stream() .mapToInt(CeremonyOfChaosMember::getLifeTime) .max(); if(winnerLifeTime.isPresent()) { - getMembers().values().stream() + members.values().stream() .sorted(Comparator.comparingLong(CeremonyOfChaosMember::getLifeTime) .reversed() .thenComparingInt(CeremonyOfChaosMember::getScore) @@ -482,6 +496,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } //@formatter:on + return winners; } @@ -498,13 +513,15 @@ public class CeremonyOfChaosEvent extends AbstractEvent { case "update": { + final Map members = getMembers(); + final int time = (int) CeremonyOfChaosManager.getInstance().getScheduler("stopFight").getRemainingTime(TimeUnit.SECONDS); broadcastPacket(new ExCuriousHouseRemainTime(time)); - getMembers().values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); + members.values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); // Validate winner int count = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (!member.isDefeated()) { @@ -589,6 +606,26 @@ public class CeremonyOfChaosEvent extends AbstractEvent } } + @RegisterEvent(EventType.ON_PLAYER_LOGOUT) + @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) + private void OnPlayerLogout(OnPlayerLogout event) + { + final PlayerInstance player = event.getPlayer(); + if (player != null) + { + final Map members = getMembers(); + final int playerObjectId = player.getObjectId(); + if (members.containsKey(playerObjectId)) + { + removeMember(playerObjectId); + if (members.size() <= 1) + { + stopFight(); + } + } + } + } + @RegisterEvent(EventType.ON_CREATURE_DEATH) @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) public void onPlayerDeath(OnCreatureDeath event) @@ -597,8 +634,9 @@ public class CeremonyOfChaosEvent extends AbstractEvent { final PlayerInstance attackerPlayer = event.getAttacker().getActingPlayer(); final PlayerInstance targetPlayer = event.getTarget().getActingPlayer(); - final CeremonyOfChaosMember attackerMember = getMembers().get(attackerPlayer.getObjectId()); - final CeremonyOfChaosMember targetMember = getMembers().get(targetPlayer.getObjectId()); + final Map members = getMembers(); + final CeremonyOfChaosMember attackerMember = members.get(attackerPlayer.getObjectId()); + final CeremonyOfChaosMember targetMember = members.get(targetPlayer.getObjectId()); final DeleteObject deleteObject = new DeleteObject(targetPlayer); if ((attackerMember != null) && (targetMember != null)) { @@ -609,7 +647,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent targetMember.setDefeated(true); // Delete target player - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (member.getObjectId() != targetPlayer.getObjectId()) { diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java index 569e883943..c7d0cb125f 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java @@ -63,6 +63,11 @@ public abstract class AbstractEvent>extends Abs _members.put(member.getObjectId(), member); } + public void removeMember(int objectId) + { + _members.remove(objectId); + } + public void clearMembers() { _members.clear(); diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java index df8c2c0c2e..13040871bb 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java @@ -19,6 +19,7 @@ package org.l2jmobius.gameserver.model.ceremonyofchaos; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.OptionalInt; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -31,6 +32,7 @@ import org.l2jmobius.gameserver.enums.CeremonyOfChaosResult; import org.l2jmobius.gameserver.instancemanager.CeremonyOfChaosManager; import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager; import org.l2jmobius.gameserver.instancemanager.InstanceManager; +import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Party; import org.l2jmobius.gameserver.model.Party.MessageType; import org.l2jmobius.gameserver.model.StatSet; @@ -47,6 +49,7 @@ import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent; import org.l2jmobius.gameserver.model.events.annotations.RegisterType; import org.l2jmobius.gameserver.model.events.impl.ceremonyofchaos.OnCeremonyOfChaosMatchResult; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath; +import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogout; import org.l2jmobius.gameserver.model.holders.ItemHolder; import org.l2jmobius.gameserver.model.holders.SkillHolder; import org.l2jmobius.gameserver.model.instancezone.Instance; @@ -111,10 +114,11 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void preparePlayers() { - final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), getMembers().values()); + final Map members = getMembers(); + final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), members.values()); final NpcHtmlMessage msg = new NpcHtmlMessage(0); int index = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player.inObserverMode()) @@ -276,7 +280,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void stopFight() { - for (CeremonyOfChaosMember member : getMembers().values()) + final Map members = getMembers(); + for (CeremonyOfChaosMember member : members.values()) { if (member.getLifeTime() == 0) { @@ -286,8 +291,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent validateWinner(); final List winners = getWinners(); - final List members = new ArrayList<>(getMembers().size()); - final SystemMessage msg; + final List memberList = new ArrayList<>(members.size()); + SystemMessage msg = null; if (winners.isEmpty() || (winners.size() > 1)) { msg = new SystemMessage(SystemMessageId.THERE_IS_NO_VICTOR_THE_MATCH_ENDS_IN_A_TIE); @@ -295,113 +300,119 @@ public class CeremonyOfChaosEvent extends AbstractEvent else { final PlayerInstance winner = winners.get(0).getPlayer(); - msg = new SystemMessage(SystemMessageId.CONGRATULATIONS_C1_YOU_WIN_THE_MATCH); - msg.addString(winner.getName()); - - // Rewards according to https://l2wiki.com/Ceremony_of_Chaos - final int marksRewarded = Rnd.get(2, 4); - winner.addItem("CoC-Winner", 34900, marksRewarded, winner, true); // Mysterious Marks - - // Possible additional rewards - - // Improved Life Stone - if (Rnd.get(10) < 3) // Chance to get reward (30%) + if (winner != null) { - switch (Rnd.get(4)) + msg = new SystemMessage(SystemMessageId.CONGRATULATIONS_C1_YOU_WIN_THE_MATCH); + msg.addString(winner.getName()); + + // Rewards according to https://l2wiki.com/Ceremony_of_Chaos + final int marksRewarded = Rnd.get(2, 4); + winner.addItem("CoC-Winner", 34900, marksRewarded, winner, true); // Mysterious Marks + + // Possible additional rewards + + // Improved Life Stone + if (Rnd.get(10) < 3) // Chance to get reward (30%) { - case 0: + switch (Rnd.get(4)) { - winner.addItem("CoC-Winner", 18570, 1, winner, true); // Improved Life Stone (R95-grade) - break; - } - case 1: - { - winner.addItem("CoC-Winner", 18571, 1, winner, true); // Improved Life Stone (R95-grade) - break; - } - case 2: - { - winner.addItem("CoC-Winner", 18575, 1, winner, true); // Improved Life Stone (R99-grade) - break; - } - case 3: - { - winner.addItem("CoC-Winner", 18576, 1, winner, true); // Improved Life Stone (R99-grade) - break; + case 0: + { + winner.addItem("CoC-Winner", 18570, 1, winner, true); // Improved Life Stone (R95-grade) + break; + } + case 1: + { + winner.addItem("CoC-Winner", 18571, 1, winner, true); // Improved Life Stone (R95-grade) + break; + } + case 2: + { + winner.addItem("CoC-Winner", 18575, 1, winner, true); // Improved Life Stone (R99-grade) + break; + } + case 3: + { + winner.addItem("CoC-Winner", 18576, 1, winner, true); // Improved Life Stone (R99-grade) + break; + } } } - } - // Soul Crystal Fragment - else if (Rnd.get(10) < 3) // Chance to get reward (30%) - { - switch (Rnd.get(6)) + // Soul Crystal Fragment + else if (Rnd.get(10) < 3) // Chance to get reward (30%) { - case 0: + switch (Rnd.get(6)) { - winner.addItem("CoC-Winner", 19467, 1, winner, true); // Yellow Soul Crystal Fragment (R99-Grade) - break; - } - case 1: - { - winner.addItem("CoC-Winner", 19468, 1, winner, true); // Teal Soul Crystal Fragment (R99-Grade) - break; - } - case 2: - { - winner.addItem("CoC-Winner", 19469, 1, winner, true); // Purple Soul Crystal Fragment (R99-Grade) - break; - } - case 3: - { - winner.addItem("CoC-Winner", 19511, 1, winner, true); // Yellow Soul Crystal Fragment (R95-Grade) - break; - } - case 4: - { - winner.addItem("CoC-Winner", 19512, 1, winner, true); // Teal Soul Crystal Fragment (R95-Grade) - break; - } - case 5: - { - winner.addItem("CoC-Winner", 19513, 1, winner, true); // Purple Soul Crystal Fragment (R95-Grade) - break; + case 0: + { + winner.addItem("CoC-Winner", 19467, 1, winner, true); // Yellow Soul Crystal Fragment (R99-Grade) + break; + } + case 1: + { + winner.addItem("CoC-Winner", 19468, 1, winner, true); // Teal Soul Crystal Fragment (R99-Grade) + break; + } + case 2: + { + winner.addItem("CoC-Winner", 19469, 1, winner, true); // Purple Soul Crystal Fragment (R99-Grade) + break; + } + case 3: + { + winner.addItem("CoC-Winner", 19511, 1, winner, true); // Yellow Soul Crystal Fragment (R95-Grade) + break; + } + case 4: + { + winner.addItem("CoC-Winner", 19512, 1, winner, true); // Teal Soul Crystal Fragment (R95-Grade) + break; + } + case 5: + { + winner.addItem("CoC-Winner", 19513, 1, winner, true); // Purple Soul Crystal Fragment (R95-Grade) + break; + } } } - } - // Mysterious Belt - else if (Rnd.get(10) < 1) // Chance to get reward (10%) - { - winner.addItem("CoC-Winner", 35565, 1, winner, true); // Mysterious Belt - } - - // Save monthly progress. - final int totalMarks = winner.getVariables().getInt(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, 0) + marksRewarded; - winner.getVariables().set(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, totalMarks); - if (totalMarks > GlobalVariablesManager.getInstance().getInt(GlobalVariablesManager.COC_TOP_MARKS, 0)) - { - GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MARKS, totalMarks); - GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MEMBER, winner.getObjectId()); + // Mysterious Belt + else if (Rnd.get(10) < 1) // Chance to get reward (10%) + { + winner.addItem("CoC-Winner", 35565, 1, winner, true); // Mysterious Belt + } + + // Save monthly progress. + final int totalMarks = winner.getVariables().getInt(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, 0) + marksRewarded; + winner.getVariables().set(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, totalMarks); + if (totalMarks > GlobalVariablesManager.getInstance().getInt(GlobalVariablesManager.COC_TOP_MARKS, 0)) + { + GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MARKS, totalMarks); + GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MEMBER, winner.getObjectId()); + } } } - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player != null) { // Send winner message - player.sendPacket(msg); + if (msg != null) + { + player.sendPacket(msg); + } // Send result player.sendPacket(new ExCuriousHouseResult(member.getResultType(), this)); - members.add(member); + memberList.add(member); } } getTimers().cancelTimer("update", null, null); final StatSet params = new StatSet(); params.set("time", 30); getTimers().addTimer("match_end_countdown", params, 30 * 1000, null, null); - EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, members)); + EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, memberList)); } private void teleportPlayersOut() @@ -440,7 +451,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent player.sendPacket(ExCuriousHouseObserveMode.STATIC_DISABLED); // Teleport player back - player.teleToLocation(player.getLastLocation(), null); + final Location lastLocation = player.getLastLocation(); + player.teleToLocation(lastLocation != null ? lastLocation : new Location(82201, 147587, -3473), null); // Restore player information final PlayerAppearance app = player.getAppearance(); @@ -465,14 +477,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent public List getWinners() { final List winners = new ArrayList<>(); + final Map members = getMembers(); + //@formatter:off - final OptionalInt winnerLifeTime = getMembers().values().stream() + final OptionalInt winnerLifeTime = members.values().stream() .mapToInt(CeremonyOfChaosMember::getLifeTime) .max(); if(winnerLifeTime.isPresent()) { - getMembers().values().stream() + members.values().stream() .sorted(Comparator.comparingLong(CeremonyOfChaosMember::getLifeTime) .reversed() .thenComparingInt(CeremonyOfChaosMember::getScore) @@ -482,6 +496,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } //@formatter:on + return winners; } @@ -498,13 +513,15 @@ public class CeremonyOfChaosEvent extends AbstractEvent { case "update": { + final Map members = getMembers(); + final int time = (int) CeremonyOfChaosManager.getInstance().getScheduler("stopFight").getRemainingTime(TimeUnit.SECONDS); broadcastPacket(new ExCuriousHouseRemainTime(time)); - getMembers().values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); + members.values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); // Validate winner int count = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (!member.isDefeated()) { @@ -589,6 +606,26 @@ public class CeremonyOfChaosEvent extends AbstractEvent } } + @RegisterEvent(EventType.ON_PLAYER_LOGOUT) + @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) + private void OnPlayerLogout(OnPlayerLogout event) + { + final PlayerInstance player = event.getPlayer(); + if (player != null) + { + final Map members = getMembers(); + final int playerObjectId = player.getObjectId(); + if (members.containsKey(playerObjectId)) + { + removeMember(playerObjectId); + if (members.size() <= 1) + { + stopFight(); + } + } + } + } + @RegisterEvent(EventType.ON_CREATURE_DEATH) @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) public void onPlayerDeath(OnCreatureDeath event) @@ -597,8 +634,9 @@ public class CeremonyOfChaosEvent extends AbstractEvent { final PlayerInstance attackerPlayer = event.getAttacker().getActingPlayer(); final PlayerInstance targetPlayer = event.getTarget().getActingPlayer(); - final CeremonyOfChaosMember attackerMember = getMembers().get(attackerPlayer.getObjectId()); - final CeremonyOfChaosMember targetMember = getMembers().get(targetPlayer.getObjectId()); + final Map members = getMembers(); + final CeremonyOfChaosMember attackerMember = members.get(attackerPlayer.getObjectId()); + final CeremonyOfChaosMember targetMember = members.get(targetPlayer.getObjectId()); final DeleteObject deleteObject = new DeleteObject(targetPlayer); if ((attackerMember != null) && (targetMember != null)) { @@ -609,7 +647,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent targetMember.setDefeated(true); // Delete target player - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (member.getObjectId() != targetPlayer.getObjectId()) { diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java index 569e883943..c7d0cb125f 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java @@ -63,6 +63,11 @@ public abstract class AbstractEvent>extends Abs _members.put(member.getObjectId(), member); } + public void removeMember(int objectId) + { + _members.remove(objectId); + } + public void clearMembers() { _members.clear(); diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java index df8c2c0c2e..13040871bb 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java @@ -19,6 +19,7 @@ package org.l2jmobius.gameserver.model.ceremonyofchaos; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.OptionalInt; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -31,6 +32,7 @@ import org.l2jmobius.gameserver.enums.CeremonyOfChaosResult; import org.l2jmobius.gameserver.instancemanager.CeremonyOfChaosManager; import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager; import org.l2jmobius.gameserver.instancemanager.InstanceManager; +import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Party; import org.l2jmobius.gameserver.model.Party.MessageType; import org.l2jmobius.gameserver.model.StatSet; @@ -47,6 +49,7 @@ import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent; import org.l2jmobius.gameserver.model.events.annotations.RegisterType; import org.l2jmobius.gameserver.model.events.impl.ceremonyofchaos.OnCeremonyOfChaosMatchResult; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath; +import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogout; import org.l2jmobius.gameserver.model.holders.ItemHolder; import org.l2jmobius.gameserver.model.holders.SkillHolder; import org.l2jmobius.gameserver.model.instancezone.Instance; @@ -111,10 +114,11 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void preparePlayers() { - final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), getMembers().values()); + final Map members = getMembers(); + final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), members.values()); final NpcHtmlMessage msg = new NpcHtmlMessage(0); int index = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player.inObserverMode()) @@ -276,7 +280,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void stopFight() { - for (CeremonyOfChaosMember member : getMembers().values()) + final Map members = getMembers(); + for (CeremonyOfChaosMember member : members.values()) { if (member.getLifeTime() == 0) { @@ -286,8 +291,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent validateWinner(); final List winners = getWinners(); - final List members = new ArrayList<>(getMembers().size()); - final SystemMessage msg; + final List memberList = new ArrayList<>(members.size()); + SystemMessage msg = null; if (winners.isEmpty() || (winners.size() > 1)) { msg = new SystemMessage(SystemMessageId.THERE_IS_NO_VICTOR_THE_MATCH_ENDS_IN_A_TIE); @@ -295,113 +300,119 @@ public class CeremonyOfChaosEvent extends AbstractEvent else { final PlayerInstance winner = winners.get(0).getPlayer(); - msg = new SystemMessage(SystemMessageId.CONGRATULATIONS_C1_YOU_WIN_THE_MATCH); - msg.addString(winner.getName()); - - // Rewards according to https://l2wiki.com/Ceremony_of_Chaos - final int marksRewarded = Rnd.get(2, 4); - winner.addItem("CoC-Winner", 34900, marksRewarded, winner, true); // Mysterious Marks - - // Possible additional rewards - - // Improved Life Stone - if (Rnd.get(10) < 3) // Chance to get reward (30%) + if (winner != null) { - switch (Rnd.get(4)) + msg = new SystemMessage(SystemMessageId.CONGRATULATIONS_C1_YOU_WIN_THE_MATCH); + msg.addString(winner.getName()); + + // Rewards according to https://l2wiki.com/Ceremony_of_Chaos + final int marksRewarded = Rnd.get(2, 4); + winner.addItem("CoC-Winner", 34900, marksRewarded, winner, true); // Mysterious Marks + + // Possible additional rewards + + // Improved Life Stone + if (Rnd.get(10) < 3) // Chance to get reward (30%) { - case 0: + switch (Rnd.get(4)) { - winner.addItem("CoC-Winner", 18570, 1, winner, true); // Improved Life Stone (R95-grade) - break; - } - case 1: - { - winner.addItem("CoC-Winner", 18571, 1, winner, true); // Improved Life Stone (R95-grade) - break; - } - case 2: - { - winner.addItem("CoC-Winner", 18575, 1, winner, true); // Improved Life Stone (R99-grade) - break; - } - case 3: - { - winner.addItem("CoC-Winner", 18576, 1, winner, true); // Improved Life Stone (R99-grade) - break; + case 0: + { + winner.addItem("CoC-Winner", 18570, 1, winner, true); // Improved Life Stone (R95-grade) + break; + } + case 1: + { + winner.addItem("CoC-Winner", 18571, 1, winner, true); // Improved Life Stone (R95-grade) + break; + } + case 2: + { + winner.addItem("CoC-Winner", 18575, 1, winner, true); // Improved Life Stone (R99-grade) + break; + } + case 3: + { + winner.addItem("CoC-Winner", 18576, 1, winner, true); // Improved Life Stone (R99-grade) + break; + } } } - } - // Soul Crystal Fragment - else if (Rnd.get(10) < 3) // Chance to get reward (30%) - { - switch (Rnd.get(6)) + // Soul Crystal Fragment + else if (Rnd.get(10) < 3) // Chance to get reward (30%) { - case 0: + switch (Rnd.get(6)) { - winner.addItem("CoC-Winner", 19467, 1, winner, true); // Yellow Soul Crystal Fragment (R99-Grade) - break; - } - case 1: - { - winner.addItem("CoC-Winner", 19468, 1, winner, true); // Teal Soul Crystal Fragment (R99-Grade) - break; - } - case 2: - { - winner.addItem("CoC-Winner", 19469, 1, winner, true); // Purple Soul Crystal Fragment (R99-Grade) - break; - } - case 3: - { - winner.addItem("CoC-Winner", 19511, 1, winner, true); // Yellow Soul Crystal Fragment (R95-Grade) - break; - } - case 4: - { - winner.addItem("CoC-Winner", 19512, 1, winner, true); // Teal Soul Crystal Fragment (R95-Grade) - break; - } - case 5: - { - winner.addItem("CoC-Winner", 19513, 1, winner, true); // Purple Soul Crystal Fragment (R95-Grade) - break; + case 0: + { + winner.addItem("CoC-Winner", 19467, 1, winner, true); // Yellow Soul Crystal Fragment (R99-Grade) + break; + } + case 1: + { + winner.addItem("CoC-Winner", 19468, 1, winner, true); // Teal Soul Crystal Fragment (R99-Grade) + break; + } + case 2: + { + winner.addItem("CoC-Winner", 19469, 1, winner, true); // Purple Soul Crystal Fragment (R99-Grade) + break; + } + case 3: + { + winner.addItem("CoC-Winner", 19511, 1, winner, true); // Yellow Soul Crystal Fragment (R95-Grade) + break; + } + case 4: + { + winner.addItem("CoC-Winner", 19512, 1, winner, true); // Teal Soul Crystal Fragment (R95-Grade) + break; + } + case 5: + { + winner.addItem("CoC-Winner", 19513, 1, winner, true); // Purple Soul Crystal Fragment (R95-Grade) + break; + } } } - } - // Mysterious Belt - else if (Rnd.get(10) < 1) // Chance to get reward (10%) - { - winner.addItem("CoC-Winner", 35565, 1, winner, true); // Mysterious Belt - } - - // Save monthly progress. - final int totalMarks = winner.getVariables().getInt(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, 0) + marksRewarded; - winner.getVariables().set(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, totalMarks); - if (totalMarks > GlobalVariablesManager.getInstance().getInt(GlobalVariablesManager.COC_TOP_MARKS, 0)) - { - GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MARKS, totalMarks); - GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MEMBER, winner.getObjectId()); + // Mysterious Belt + else if (Rnd.get(10) < 1) // Chance to get reward (10%) + { + winner.addItem("CoC-Winner", 35565, 1, winner, true); // Mysterious Belt + } + + // Save monthly progress. + final int totalMarks = winner.getVariables().getInt(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, 0) + marksRewarded; + winner.getVariables().set(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, totalMarks); + if (totalMarks > GlobalVariablesManager.getInstance().getInt(GlobalVariablesManager.COC_TOP_MARKS, 0)) + { + GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MARKS, totalMarks); + GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MEMBER, winner.getObjectId()); + } } } - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player != null) { // Send winner message - player.sendPacket(msg); + if (msg != null) + { + player.sendPacket(msg); + } // Send result player.sendPacket(new ExCuriousHouseResult(member.getResultType(), this)); - members.add(member); + memberList.add(member); } } getTimers().cancelTimer("update", null, null); final StatSet params = new StatSet(); params.set("time", 30); getTimers().addTimer("match_end_countdown", params, 30 * 1000, null, null); - EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, members)); + EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, memberList)); } private void teleportPlayersOut() @@ -440,7 +451,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent player.sendPacket(ExCuriousHouseObserveMode.STATIC_DISABLED); // Teleport player back - player.teleToLocation(player.getLastLocation(), null); + final Location lastLocation = player.getLastLocation(); + player.teleToLocation(lastLocation != null ? lastLocation : new Location(82201, 147587, -3473), null); // Restore player information final PlayerAppearance app = player.getAppearance(); @@ -465,14 +477,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent public List getWinners() { final List winners = new ArrayList<>(); + final Map members = getMembers(); + //@formatter:off - final OptionalInt winnerLifeTime = getMembers().values().stream() + final OptionalInt winnerLifeTime = members.values().stream() .mapToInt(CeremonyOfChaosMember::getLifeTime) .max(); if(winnerLifeTime.isPresent()) { - getMembers().values().stream() + members.values().stream() .sorted(Comparator.comparingLong(CeremonyOfChaosMember::getLifeTime) .reversed() .thenComparingInt(CeremonyOfChaosMember::getScore) @@ -482,6 +496,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } //@formatter:on + return winners; } @@ -498,13 +513,15 @@ public class CeremonyOfChaosEvent extends AbstractEvent { case "update": { + final Map members = getMembers(); + final int time = (int) CeremonyOfChaosManager.getInstance().getScheduler("stopFight").getRemainingTime(TimeUnit.SECONDS); broadcastPacket(new ExCuriousHouseRemainTime(time)); - getMembers().values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); + members.values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); // Validate winner int count = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (!member.isDefeated()) { @@ -589,6 +606,26 @@ public class CeremonyOfChaosEvent extends AbstractEvent } } + @RegisterEvent(EventType.ON_PLAYER_LOGOUT) + @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) + private void OnPlayerLogout(OnPlayerLogout event) + { + final PlayerInstance player = event.getPlayer(); + if (player != null) + { + final Map members = getMembers(); + final int playerObjectId = player.getObjectId(); + if (members.containsKey(playerObjectId)) + { + removeMember(playerObjectId); + if (members.size() <= 1) + { + stopFight(); + } + } + } + } + @RegisterEvent(EventType.ON_CREATURE_DEATH) @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) public void onPlayerDeath(OnCreatureDeath event) @@ -597,8 +634,9 @@ public class CeremonyOfChaosEvent extends AbstractEvent { final PlayerInstance attackerPlayer = event.getAttacker().getActingPlayer(); final PlayerInstance targetPlayer = event.getTarget().getActingPlayer(); - final CeremonyOfChaosMember attackerMember = getMembers().get(attackerPlayer.getObjectId()); - final CeremonyOfChaosMember targetMember = getMembers().get(targetPlayer.getObjectId()); + final Map members = getMembers(); + final CeremonyOfChaosMember attackerMember = members.get(attackerPlayer.getObjectId()); + final CeremonyOfChaosMember targetMember = members.get(targetPlayer.getObjectId()); final DeleteObject deleteObject = new DeleteObject(targetPlayer); if ((attackerMember != null) && (targetMember != null)) { @@ -609,7 +647,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent targetMember.setDefeated(true); // Delete target player - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (member.getObjectId() != targetPlayer.getObjectId()) { diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java index 569e883943..c7d0cb125f 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java @@ -63,6 +63,11 @@ public abstract class AbstractEvent>extends Abs _members.put(member.getObjectId(), member); } + public void removeMember(int objectId) + { + _members.remove(objectId); + } + public void clearMembers() { _members.clear(); diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java index df8c2c0c2e..13040871bb 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java @@ -19,6 +19,7 @@ package org.l2jmobius.gameserver.model.ceremonyofchaos; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.OptionalInt; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -31,6 +32,7 @@ import org.l2jmobius.gameserver.enums.CeremonyOfChaosResult; import org.l2jmobius.gameserver.instancemanager.CeremonyOfChaosManager; import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager; import org.l2jmobius.gameserver.instancemanager.InstanceManager; +import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Party; import org.l2jmobius.gameserver.model.Party.MessageType; import org.l2jmobius.gameserver.model.StatSet; @@ -47,6 +49,7 @@ import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent; import org.l2jmobius.gameserver.model.events.annotations.RegisterType; import org.l2jmobius.gameserver.model.events.impl.ceremonyofchaos.OnCeremonyOfChaosMatchResult; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath; +import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogout; import org.l2jmobius.gameserver.model.holders.ItemHolder; import org.l2jmobius.gameserver.model.holders.SkillHolder; import org.l2jmobius.gameserver.model.instancezone.Instance; @@ -111,10 +114,11 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void preparePlayers() { - final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), getMembers().values()); + final Map members = getMembers(); + final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), members.values()); final NpcHtmlMessage msg = new NpcHtmlMessage(0); int index = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player.inObserverMode()) @@ -276,7 +280,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void stopFight() { - for (CeremonyOfChaosMember member : getMembers().values()) + final Map members = getMembers(); + for (CeremonyOfChaosMember member : members.values()) { if (member.getLifeTime() == 0) { @@ -286,8 +291,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent validateWinner(); final List winners = getWinners(); - final List members = new ArrayList<>(getMembers().size()); - final SystemMessage msg; + final List memberList = new ArrayList<>(members.size()); + SystemMessage msg = null; if (winners.isEmpty() || (winners.size() > 1)) { msg = new SystemMessage(SystemMessageId.THERE_IS_NO_VICTOR_THE_MATCH_ENDS_IN_A_TIE); @@ -295,113 +300,119 @@ public class CeremonyOfChaosEvent extends AbstractEvent else { final PlayerInstance winner = winners.get(0).getPlayer(); - msg = new SystemMessage(SystemMessageId.CONGRATULATIONS_C1_YOU_WIN_THE_MATCH); - msg.addString(winner.getName()); - - // Rewards according to https://l2wiki.com/Ceremony_of_Chaos - final int marksRewarded = Rnd.get(2, 4); - winner.addItem("CoC-Winner", 34900, marksRewarded, winner, true); // Mysterious Marks - - // Possible additional rewards - - // Improved Life Stone - if (Rnd.get(10) < 3) // Chance to get reward (30%) + if (winner != null) { - switch (Rnd.get(4)) + msg = new SystemMessage(SystemMessageId.CONGRATULATIONS_C1_YOU_WIN_THE_MATCH); + msg.addString(winner.getName()); + + // Rewards according to https://l2wiki.com/Ceremony_of_Chaos + final int marksRewarded = Rnd.get(2, 4); + winner.addItem("CoC-Winner", 34900, marksRewarded, winner, true); // Mysterious Marks + + // Possible additional rewards + + // Improved Life Stone + if (Rnd.get(10) < 3) // Chance to get reward (30%) { - case 0: + switch (Rnd.get(4)) { - winner.addItem("CoC-Winner", 18570, 1, winner, true); // Improved Life Stone (R95-grade) - break; - } - case 1: - { - winner.addItem("CoC-Winner", 18571, 1, winner, true); // Improved Life Stone (R95-grade) - break; - } - case 2: - { - winner.addItem("CoC-Winner", 18575, 1, winner, true); // Improved Life Stone (R99-grade) - break; - } - case 3: - { - winner.addItem("CoC-Winner", 18576, 1, winner, true); // Improved Life Stone (R99-grade) - break; + case 0: + { + winner.addItem("CoC-Winner", 18570, 1, winner, true); // Improved Life Stone (R95-grade) + break; + } + case 1: + { + winner.addItem("CoC-Winner", 18571, 1, winner, true); // Improved Life Stone (R95-grade) + break; + } + case 2: + { + winner.addItem("CoC-Winner", 18575, 1, winner, true); // Improved Life Stone (R99-grade) + break; + } + case 3: + { + winner.addItem("CoC-Winner", 18576, 1, winner, true); // Improved Life Stone (R99-grade) + break; + } } } - } - // Soul Crystal Fragment - else if (Rnd.get(10) < 3) // Chance to get reward (30%) - { - switch (Rnd.get(6)) + // Soul Crystal Fragment + else if (Rnd.get(10) < 3) // Chance to get reward (30%) { - case 0: + switch (Rnd.get(6)) { - winner.addItem("CoC-Winner", 19467, 1, winner, true); // Yellow Soul Crystal Fragment (R99-Grade) - break; - } - case 1: - { - winner.addItem("CoC-Winner", 19468, 1, winner, true); // Teal Soul Crystal Fragment (R99-Grade) - break; - } - case 2: - { - winner.addItem("CoC-Winner", 19469, 1, winner, true); // Purple Soul Crystal Fragment (R99-Grade) - break; - } - case 3: - { - winner.addItem("CoC-Winner", 19511, 1, winner, true); // Yellow Soul Crystal Fragment (R95-Grade) - break; - } - case 4: - { - winner.addItem("CoC-Winner", 19512, 1, winner, true); // Teal Soul Crystal Fragment (R95-Grade) - break; - } - case 5: - { - winner.addItem("CoC-Winner", 19513, 1, winner, true); // Purple Soul Crystal Fragment (R95-Grade) - break; + case 0: + { + winner.addItem("CoC-Winner", 19467, 1, winner, true); // Yellow Soul Crystal Fragment (R99-Grade) + break; + } + case 1: + { + winner.addItem("CoC-Winner", 19468, 1, winner, true); // Teal Soul Crystal Fragment (R99-Grade) + break; + } + case 2: + { + winner.addItem("CoC-Winner", 19469, 1, winner, true); // Purple Soul Crystal Fragment (R99-Grade) + break; + } + case 3: + { + winner.addItem("CoC-Winner", 19511, 1, winner, true); // Yellow Soul Crystal Fragment (R95-Grade) + break; + } + case 4: + { + winner.addItem("CoC-Winner", 19512, 1, winner, true); // Teal Soul Crystal Fragment (R95-Grade) + break; + } + case 5: + { + winner.addItem("CoC-Winner", 19513, 1, winner, true); // Purple Soul Crystal Fragment (R95-Grade) + break; + } } } - } - // Mysterious Belt - else if (Rnd.get(10) < 1) // Chance to get reward (10%) - { - winner.addItem("CoC-Winner", 35565, 1, winner, true); // Mysterious Belt - } - - // Save monthly progress. - final int totalMarks = winner.getVariables().getInt(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, 0) + marksRewarded; - winner.getVariables().set(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, totalMarks); - if (totalMarks > GlobalVariablesManager.getInstance().getInt(GlobalVariablesManager.COC_TOP_MARKS, 0)) - { - GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MARKS, totalMarks); - GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MEMBER, winner.getObjectId()); + // Mysterious Belt + else if (Rnd.get(10) < 1) // Chance to get reward (10%) + { + winner.addItem("CoC-Winner", 35565, 1, winner, true); // Mysterious Belt + } + + // Save monthly progress. + final int totalMarks = winner.getVariables().getInt(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, 0) + marksRewarded; + winner.getVariables().set(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, totalMarks); + if (totalMarks > GlobalVariablesManager.getInstance().getInt(GlobalVariablesManager.COC_TOP_MARKS, 0)) + { + GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MARKS, totalMarks); + GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MEMBER, winner.getObjectId()); + } } } - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player != null) { // Send winner message - player.sendPacket(msg); + if (msg != null) + { + player.sendPacket(msg); + } // Send result player.sendPacket(new ExCuriousHouseResult(member.getResultType(), this)); - members.add(member); + memberList.add(member); } } getTimers().cancelTimer("update", null, null); final StatSet params = new StatSet(); params.set("time", 30); getTimers().addTimer("match_end_countdown", params, 30 * 1000, null, null); - EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, members)); + EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, memberList)); } private void teleportPlayersOut() @@ -440,7 +451,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent player.sendPacket(ExCuriousHouseObserveMode.STATIC_DISABLED); // Teleport player back - player.teleToLocation(player.getLastLocation(), null); + final Location lastLocation = player.getLastLocation(); + player.teleToLocation(lastLocation != null ? lastLocation : new Location(82201, 147587, -3473), null); // Restore player information final PlayerAppearance app = player.getAppearance(); @@ -465,14 +477,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent public List getWinners() { final List winners = new ArrayList<>(); + final Map members = getMembers(); + //@formatter:off - final OptionalInt winnerLifeTime = getMembers().values().stream() + final OptionalInt winnerLifeTime = members.values().stream() .mapToInt(CeremonyOfChaosMember::getLifeTime) .max(); if(winnerLifeTime.isPresent()) { - getMembers().values().stream() + members.values().stream() .sorted(Comparator.comparingLong(CeremonyOfChaosMember::getLifeTime) .reversed() .thenComparingInt(CeremonyOfChaosMember::getScore) @@ -482,6 +496,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } //@formatter:on + return winners; } @@ -498,13 +513,15 @@ public class CeremonyOfChaosEvent extends AbstractEvent { case "update": { + final Map members = getMembers(); + final int time = (int) CeremonyOfChaosManager.getInstance().getScheduler("stopFight").getRemainingTime(TimeUnit.SECONDS); broadcastPacket(new ExCuriousHouseRemainTime(time)); - getMembers().values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); + members.values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); // Validate winner int count = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (!member.isDefeated()) { @@ -589,6 +606,26 @@ public class CeremonyOfChaosEvent extends AbstractEvent } } + @RegisterEvent(EventType.ON_PLAYER_LOGOUT) + @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) + private void OnPlayerLogout(OnPlayerLogout event) + { + final PlayerInstance player = event.getPlayer(); + if (player != null) + { + final Map members = getMembers(); + final int playerObjectId = player.getObjectId(); + if (members.containsKey(playerObjectId)) + { + removeMember(playerObjectId); + if (members.size() <= 1) + { + stopFight(); + } + } + } + } + @RegisterEvent(EventType.ON_CREATURE_DEATH) @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) public void onPlayerDeath(OnCreatureDeath event) @@ -597,8 +634,9 @@ public class CeremonyOfChaosEvent extends AbstractEvent { final PlayerInstance attackerPlayer = event.getAttacker().getActingPlayer(); final PlayerInstance targetPlayer = event.getTarget().getActingPlayer(); - final CeremonyOfChaosMember attackerMember = getMembers().get(attackerPlayer.getObjectId()); - final CeremonyOfChaosMember targetMember = getMembers().get(targetPlayer.getObjectId()); + final Map members = getMembers(); + final CeremonyOfChaosMember attackerMember = members.get(attackerPlayer.getObjectId()); + final CeremonyOfChaosMember targetMember = members.get(targetPlayer.getObjectId()); final DeleteObject deleteObject = new DeleteObject(targetPlayer); if ((attackerMember != null) && (targetMember != null)) { @@ -609,7 +647,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent targetMember.setDefeated(true); // Delete target player - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (member.getObjectId() != targetPlayer.getObjectId()) { diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java index 569e883943..c7d0cb125f 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java @@ -63,6 +63,11 @@ public abstract class AbstractEvent>extends Abs _members.put(member.getObjectId(), member); } + public void removeMember(int objectId) + { + _members.remove(objectId); + } + public void clearMembers() { _members.clear(); diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java index 413d8812e4..47ac4befa3 100644 --- a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java +++ b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/ceremonyofchaos/CeremonyOfChaosEvent.java @@ -19,6 +19,7 @@ package org.l2jmobius.gameserver.model.ceremonyofchaos; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.OptionalInt; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -31,6 +32,7 @@ import org.l2jmobius.gameserver.enums.CeremonyOfChaosResult; import org.l2jmobius.gameserver.instancemanager.CeremonyOfChaosManager; import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager; import org.l2jmobius.gameserver.instancemanager.InstanceManager; +import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Party; import org.l2jmobius.gameserver.model.Party.MessageType; import org.l2jmobius.gameserver.model.StatSet; @@ -47,6 +49,7 @@ import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent; import org.l2jmobius.gameserver.model.events.annotations.RegisterType; import org.l2jmobius.gameserver.model.events.impl.ceremonyofchaos.OnCeremonyOfChaosMatchResult; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath; +import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogout; import org.l2jmobius.gameserver.model.holders.ItemHolder; import org.l2jmobius.gameserver.model.holders.SkillHolder; import org.l2jmobius.gameserver.model.instancezone.Instance; @@ -111,10 +114,11 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void preparePlayers() { - final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), getMembers().values()); + final Map members = getMembers(); + final ExCuriousHouseMemberList membersList = new ExCuriousHouseMemberList(_id, CeremonyOfChaosManager.getInstance().getMaxPlayersInArena(), members.values()); final NpcHtmlMessage msg = new NpcHtmlMessage(0); int index = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player.inObserverMode()) @@ -276,7 +280,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent public void stopFight() { - for (CeremonyOfChaosMember member : getMembers().values()) + final Map members = getMembers(); + for (CeremonyOfChaosMember member : members.values()) { if (member.getLifeTime() == 0) { @@ -286,8 +291,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent validateWinner(); final List winners = getWinners(); - final List members = new ArrayList<>(getMembers().size()); - final SystemMessage msg; + final List memberList = new ArrayList<>(members.size()); + SystemMessage msg = null; if (winners.isEmpty() || (winners.size() > 1)) { msg = new SystemMessage(SystemMessageId.THE_DUEL_HAS_ENDED_IN_A_TIE); @@ -295,113 +300,119 @@ public class CeremonyOfChaosEvent extends AbstractEvent else { final PlayerInstance winner = winners.get(0).getPlayer(); - msg = new SystemMessage(SystemMessageId.CONGRATULATIONS_C1_YOU_WIN_THE_MATCH); - msg.addString(winner.getName()); - - // Rewards according to https://l2wiki.com/Ceremony_of_Chaos - final int marksRewarded = Rnd.get(2, 4); - winner.addItem("CoC-Winner", 34900, marksRewarded, winner, true); // Mysterious Marks - - // Possible additional rewards - - // Improved Life Stone - if (Rnd.get(10) < 3) // Chance to get reward (30%) + if (winner != null) { - switch (Rnd.get(4)) + msg = new SystemMessage(SystemMessageId.CONGRATULATIONS_C1_YOU_WIN_THE_MATCH); + msg.addString(winner.getName()); + + // Rewards according to https://l2wiki.com/Ceremony_of_Chaos + final int marksRewarded = Rnd.get(2, 4); + winner.addItem("CoC-Winner", 34900, marksRewarded, winner, true); // Mysterious Marks + + // Possible additional rewards + + // Improved Life Stone + if (Rnd.get(10) < 3) // Chance to get reward (30%) { - case 0: + switch (Rnd.get(4)) { - winner.addItem("CoC-Winner", 18570, 1, winner, true); // Improved Life Stone (R95-grade) - break; - } - case 1: - { - winner.addItem("CoC-Winner", 18571, 1, winner, true); // Improved Life Stone (R95-grade) - break; - } - case 2: - { - winner.addItem("CoC-Winner", 18575, 1, winner, true); // Improved Life Stone (R99-grade) - break; - } - case 3: - { - winner.addItem("CoC-Winner", 18576, 1, winner, true); // Improved Life Stone (R99-grade) - break; + case 0: + { + winner.addItem("CoC-Winner", 18570, 1, winner, true); // Improved Life Stone (R95-grade) + break; + } + case 1: + { + winner.addItem("CoC-Winner", 18571, 1, winner, true); // Improved Life Stone (R95-grade) + break; + } + case 2: + { + winner.addItem("CoC-Winner", 18575, 1, winner, true); // Improved Life Stone (R99-grade) + break; + } + case 3: + { + winner.addItem("CoC-Winner", 18576, 1, winner, true); // Improved Life Stone (R99-grade) + break; + } } } - } - // Soul Crystal Fragment - else if (Rnd.get(10) < 3) // Chance to get reward (30%) - { - switch (Rnd.get(6)) + // Soul Crystal Fragment + else if (Rnd.get(10) < 3) // Chance to get reward (30%) { - case 0: + switch (Rnd.get(6)) { - winner.addItem("CoC-Winner", 19467, 1, winner, true); // Yellow Soul Crystal Fragment (R99-Grade) - break; - } - case 1: - { - winner.addItem("CoC-Winner", 19468, 1, winner, true); // Teal Soul Crystal Fragment (R99-Grade) - break; - } - case 2: - { - winner.addItem("CoC-Winner", 19469, 1, winner, true); // Purple Soul Crystal Fragment (R99-Grade) - break; - } - case 3: - { - winner.addItem("CoC-Winner", 19511, 1, winner, true); // Yellow Soul Crystal Fragment (R95-Grade) - break; - } - case 4: - { - winner.addItem("CoC-Winner", 19512, 1, winner, true); // Teal Soul Crystal Fragment (R95-Grade) - break; - } - case 5: - { - winner.addItem("CoC-Winner", 19513, 1, winner, true); // Purple Soul Crystal Fragment (R95-Grade) - break; + case 0: + { + winner.addItem("CoC-Winner", 19467, 1, winner, true); // Yellow Soul Crystal Fragment (R99-Grade) + break; + } + case 1: + { + winner.addItem("CoC-Winner", 19468, 1, winner, true); // Teal Soul Crystal Fragment (R99-Grade) + break; + } + case 2: + { + winner.addItem("CoC-Winner", 19469, 1, winner, true); // Purple Soul Crystal Fragment (R99-Grade) + break; + } + case 3: + { + winner.addItem("CoC-Winner", 19511, 1, winner, true); // Yellow Soul Crystal Fragment (R95-Grade) + break; + } + case 4: + { + winner.addItem("CoC-Winner", 19512, 1, winner, true); // Teal Soul Crystal Fragment (R95-Grade) + break; + } + case 5: + { + winner.addItem("CoC-Winner", 19513, 1, winner, true); // Purple Soul Crystal Fragment (R95-Grade) + break; + } } } - } - // Mysterious Belt - else if (Rnd.get(10) < 1) // Chance to get reward (10%) - { - winner.addItem("CoC-Winner", 35565, 1, winner, true); // Mysterious Belt - } - - // Save monthly progress. - final int totalMarks = winner.getVariables().getInt(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, 0) + marksRewarded; - winner.getVariables().set(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, totalMarks); - if (totalMarks > GlobalVariablesManager.getInstance().getInt(GlobalVariablesManager.COC_TOP_MARKS, 0)) - { - GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MARKS, totalMarks); - GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MEMBER, winner.getObjectId()); + // Mysterious Belt + else if (Rnd.get(10) < 1) // Chance to get reward (10%) + { + winner.addItem("CoC-Winner", 35565, 1, winner, true); // Mysterious Belt + } + + // Save monthly progress. + final int totalMarks = winner.getVariables().getInt(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, 0) + marksRewarded; + winner.getVariables().set(PlayerVariables.CEREMONY_OF_CHAOS_MARKS, totalMarks); + if (totalMarks > GlobalVariablesManager.getInstance().getInt(GlobalVariablesManager.COC_TOP_MARKS, 0)) + { + GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MARKS, totalMarks); + GlobalVariablesManager.getInstance().set(GlobalVariablesManager.COC_TOP_MEMBER, winner.getObjectId()); + } } } - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { final PlayerInstance player = member.getPlayer(); if (player != null) { // Send winner message - player.sendPacket(msg); + if (msg != null) + { + player.sendPacket(msg); + } // Send result player.sendPacket(new ExCuriousHouseResult(member.getResultType(), this)); - members.add(member); + memberList.add(member); } } getTimers().cancelTimer("update", null, null); final StatSet params = new StatSet(); params.set("time", 30); getTimers().addTimer("match_end_countdown", params, 30 * 1000, null, null); - EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, members)); + EventDispatcher.getInstance().notifyEvent(new OnCeremonyOfChaosMatchResult(winners, memberList)); } private void teleportPlayersOut() @@ -440,7 +451,8 @@ public class CeremonyOfChaosEvent extends AbstractEvent player.sendPacket(ExCuriousHouseObserveMode.STATIC_DISABLED); // Teleport player back - player.teleToLocation(player.getLastLocation(), null); + final Location lastLocation = player.getLastLocation(); + player.teleToLocation(lastLocation != null ? lastLocation : new Location(82201, 147587, -3473), null); // Restore player information final PlayerAppearance app = player.getAppearance(); @@ -465,14 +477,16 @@ public class CeremonyOfChaosEvent extends AbstractEvent public List getWinners() { final List winners = new ArrayList<>(); + final Map members = getMembers(); + //@formatter:off - final OptionalInt winnerLifeTime = getMembers().values().stream() + final OptionalInt winnerLifeTime = members.values().stream() .mapToInt(CeremonyOfChaosMember::getLifeTime) .max(); if(winnerLifeTime.isPresent()) { - getMembers().values().stream() + members.values().stream() .sorted(Comparator.comparingLong(CeremonyOfChaosMember::getLifeTime) .reversed() .thenComparingInt(CeremonyOfChaosMember::getScore) @@ -482,6 +496,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent } //@formatter:on + return winners; } @@ -498,13 +513,15 @@ public class CeremonyOfChaosEvent extends AbstractEvent { case "update": { + final Map members = getMembers(); + final int time = (int) CeremonyOfChaosManager.getInstance().getScheduler("stopFight").getRemainingTime(TimeUnit.SECONDS); broadcastPacket(new ExCuriousHouseRemainTime(time)); - getMembers().values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); + members.values().forEach(p -> broadcastPacket(new ExCuriousHouseMemberUpdate(p))); // Validate winner int count = 0; - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (!member.isDefeated()) { @@ -589,6 +606,26 @@ public class CeremonyOfChaosEvent extends AbstractEvent } } + @RegisterEvent(EventType.ON_PLAYER_LOGOUT) + @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) + private void OnPlayerLogout(OnPlayerLogout event) + { + final PlayerInstance player = event.getPlayer(); + if (player != null) + { + final Map members = getMembers(); + final int playerObjectId = player.getObjectId(); + if (members.containsKey(playerObjectId)) + { + removeMember(playerObjectId); + if (members.size() <= 1) + { + stopFight(); + } + } + } + } + @RegisterEvent(EventType.ON_CREATURE_DEATH) @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) public void onPlayerDeath(OnCreatureDeath event) @@ -597,8 +634,9 @@ public class CeremonyOfChaosEvent extends AbstractEvent { final PlayerInstance attackerPlayer = event.getAttacker().getActingPlayer(); final PlayerInstance targetPlayer = event.getTarget().getActingPlayer(); - final CeremonyOfChaosMember attackerMember = getMembers().get(attackerPlayer.getObjectId()); - final CeremonyOfChaosMember targetMember = getMembers().get(targetPlayer.getObjectId()); + final Map members = getMembers(); + final CeremonyOfChaosMember attackerMember = members.get(attackerPlayer.getObjectId()); + final CeremonyOfChaosMember targetMember = members.get(targetPlayer.getObjectId()); final DeleteObject deleteObject = new DeleteObject(targetPlayer); if ((attackerMember != null) && (targetMember != null)) { @@ -609,7 +647,7 @@ public class CeremonyOfChaosEvent extends AbstractEvent targetMember.setDefeated(true); // Delete target player - for (CeremonyOfChaosMember member : getMembers().values()) + for (CeremonyOfChaosMember member : members.values()) { if (member.getObjectId() != targetPlayer.getObjectId()) { diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java index 569e883943..c7d0cb125f 100644 --- a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java +++ b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/eventengine/AbstractEvent.java @@ -63,6 +63,11 @@ public abstract class AbstractEvent>extends Abs _members.put(member.getObjectId(), member); } + public void removeMember(int objectId) + { + _members.remove(objectId); + } + public void clearMembers() { _members.clear();