From 615d81f9fd46734de0657152be7b95cdb6978fcd Mon Sep 17 00:00:00 2001 From: Iosnowore Date: Sun, 2 Apr 2017 13:20:58 -0700 Subject: [PATCH] Redid dueling.. - Dueling now handles multiple duels between multiple players - Fixed some other minor bugs involving duel requesting/recieving --- .../objects/creature/CreatureObject.java | 18 ++++++ src/services/combat/CombatManager.java | 2 +- src/services/combat/DuelPlayerService.java | 56 +++++++++---------- 3 files changed, 47 insertions(+), 29 deletions(-) diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index 83c644460..e54665e03 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -30,6 +30,7 @@ package resources.objects.creature; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.List; import java.util.Set; import java.util.Locale; import java.util.function.Predicate; @@ -57,6 +58,7 @@ import resources.objects.tangible.TangibleObject; import resources.objects.weapon.WeaponObject; import resources.persistable.SWGObjectFactory; import resources.player.Player; +import resources.server_info.SynchronizedList; import services.group.GroupInviterData; import utilities.Encoder.StringType; @@ -83,6 +85,10 @@ public class CreatureObject extends TangibleObject { private SWGList baseAttributes = new SWGList(1, 2); + private List activeDuels = new SynchronizedList(); + + private List sentDuels = new SynchronizedList(); + public CreatureObject(long objectId) { super(objectId, BaselineType.CREO); initBaseAttributes(); @@ -798,6 +804,18 @@ public class CreatureObject extends TangibleObject { return isEnemy(otherObject) && otherPosture != Posture.INCAPACITATED && otherPosture != Posture.DEAD; } + public List getActiveDuels() { + return activeDuels; + } + + public List getSentDuels() { + return sentDuels; + } + + public boolean isInADuelWithPlayer(CreatureObject otherPlayer) { + return true; + } + @Override public boolean isEnemy(TangibleObject otherObject) { boolean tangibleEnemy = super.isEnemy(otherObject); diff --git a/src/services/combat/CombatManager.java b/src/services/combat/CombatManager.java index a7bff7f38..30b978f9e 100644 --- a/src/services/combat/CombatManager.java +++ b/src/services/combat/CombatManager.java @@ -706,4 +706,4 @@ public class CombatManager extends Manager { } -} \ No newline at end of file +} diff --git a/src/services/combat/DuelPlayerService.java b/src/services/combat/DuelPlayerService.java index b34c818b1..c76439da0 100644 --- a/src/services/combat/DuelPlayerService.java +++ b/src/services/combat/DuelPlayerService.java @@ -28,49 +28,52 @@ package services.combat; -import java.util.List; - import intents.chat.ChatBroadcastIntent; import intents.combat.DuelPlayerIntent; +import intents.combat.DuelPlayerIntent.DuelEventType; import resources.objects.creature.CreatureObject; -import resources.server_info.SynchronizedList; import resources.control.Service; import resources.encodables.ProsePackage; import resources.encodables.StringId; public class DuelPlayerService extends Service { - - private final List duels; - public DuelPlayerService() { - duels = new SynchronizedList<>(); - registerForIntent(DuelPlayerIntent.class, dpi -> handleDuelPlayerIntent(dpi)); } private void handleAcceptDuel(CreatureObject accepter, CreatureObject target) { - duels.add(target); + if (accepter.getActiveDuels().contains(target)) { + sendSystemMessage(accepter, target, "already_dueling"); + return; + } + accepter.getActiveDuels().add(target); + target.getActiveDuels().add(accepter); sendSystemMessage(accepter, target, "accept_self"); sendSystemMessage(target, accepter, "accept_target"); // TODO: Update each person's pvp status } private void handleEndDuel(CreatureObject ender, CreatureObject target) { - if (duels.contains(target)) { + if (ender.getActiveDuels().contains(target)) { sendSystemMessage(ender, target, "end_self"); sendSystemMessage(target, ender, "end_target"); - duels.remove(ender); - duels.remove(target); - // TODO: Update each person's pvp status + ender.getActiveDuels().remove(target); + target.getActiveDuels().remove(ender); + + if (ender.getSentDuels().contains(target)) { + ender.getSentDuels().remove(target); + } else { + target.getSentDuels().remove(ender); + } } else { sendSystemMessage(ender, target, "not_dueling"); } } private void handleCancelDuel(CreatureObject canceler, CreatureObject target) { + canceler.getSentDuels().remove(target); sendSystemMessage(canceler, target, "cancel_self"); sendSystemMessage(target, canceler, "cancel_target"); - duels.remove(target); } private void handleDeclineDuel(CreatureObject decliner, CreatureObject target) { @@ -78,21 +81,24 @@ public class DuelPlayerService extends Service { } private void handleRequestDuel(CreatureObject requester, CreatureObject target) { - if (!duels.contains(requester)) { - duels.add(target); + if (!requester.getSentDuels().contains(target)) { + requester.getSentDuels().add(target); sendSystemMessage(requester, target, "challenge_self"); sendSystemMessage(target, requester, "challenge_target"); + } else if (requester.getActiveDuels().contains(target)) { + sendSystemMessage(requester, target, "already_dueling"); } else { sendSystemMessage(requester, target, "already_challenged"); } } - private void checkForEventTypeCorrection(DuelPlayerIntent dpi) { - if (dpi.getEventType() == DuelPlayerIntent.DuelEventType.REQUEST && duels.contains(dpi.getSender())) { - dpi.setDuelEventType(DuelPlayerIntent.DuelEventType.ACCEPT); - } else if (dpi.getEventType() == DuelPlayerIntent.DuelEventType.END && duels.contains(dpi.getReciever()) && !duels.contains(dpi.getSender())) { - dpi.setDuelEventType(DuelPlayerIntent.DuelEventType.CANCEL); + private DuelEventType getTrueEventType(DuelPlayerIntent dpi) { + if (dpi.getEventType() == DuelEventType.END && dpi.getSender().getSentDuels().contains(dpi.getReciever())) { + return DuelEventType.CANCEL; + } else if (dpi.getEventType() == DuelEventType.REQUEST && dpi.getReciever().getSentDuels().contains(dpi.getSender())) { + return DuelEventType.ACCEPT; } + return dpi.getEventType(); } private void handleDuelPlayerIntent(DuelPlayerIntent dpi) { @@ -100,9 +106,7 @@ public class DuelPlayerService extends Service { return; } - checkForEventTypeCorrection(dpi); - - switch (dpi.getEventType()) { + switch (getTrueEventType(dpi)) { case ACCEPT: handleAcceptDuel(dpi.getSender(), dpi.getReciever()); break; @@ -121,10 +125,6 @@ public class DuelPlayerService extends Service { } } - public List getDuelsList() { - return duels; - } - private void sendSystemMessage(CreatureObject playerToMessage, CreatureObject playerToMessageAbout, String message) { new ChatBroadcastIntent(playerToMessage.getOwner() , new ProsePackage(new StringId("duel", message), "TT", playerToMessageAbout.getObjectName())).broadcast(); }