From e9203a6085e6758760cc36a6bc6d99a1349a712a Mon Sep 17 00:00:00 2001 From: Zach Date: Mon, 21 Sep 2015 00:20:07 -0400 Subject: [PATCH 01/32] Removed redundant declarations (Were moved) --- .../packets/swg/zone/UpdatePvpStatusMessage.java | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/network/packets/swg/zone/UpdatePvpStatusMessage.java b/src/network/packets/swg/zone/UpdatePvpStatusMessage.java index 3edf08064..b330ac3fd 100644 --- a/src/network/packets/swg/zone/UpdatePvpStatusMessage.java +++ b/src/network/packets/swg/zone/UpdatePvpStatusMessage.java @@ -33,16 +33,6 @@ import java.nio.ByteBuffer; public class UpdatePvpStatusMessage extends SWGPacket { public static final int CRC = getCrc("UpdatePvpStatusMessage"); - - public static final int ATTACKABLE = 1; - public static final int AGGRESSIVE = 2; - public static final int OVERT = 4; - public static final int TEF = 8; - public static final int PLAYER = 16; - public static final int ENEMY = 32; - public static final int GOING_OVERT = 64; // purple/blue blink - public static final int GOING_COVERT = 128; // green blink - public static final int DUEL = 256; private int flag = 16; private int playerFaction = 0; @@ -81,4 +71,4 @@ public class UpdatePvpStatusMessage extends SWGPacket { public int getPlayerFaction() { return playerFaction; } public int getPlayerType() { return flag; } -} +} \ No newline at end of file From ebedf4a0a5bad1aa73ab7f6f06a55aefa0fca812 Mon Sep 17 00:00:00 2001 From: Zach Date: Mon, 21 Sep 2015 00:20:43 -0400 Subject: [PATCH 02/32] Updated CreatureObject to use PvpFlag. --- src/resources/objects/creature/CreatureObject.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index 572c03fce..fd3b6c875 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -33,6 +33,7 @@ import network.packets.swg.zone.baselines.Baseline.BaselineType; import network.packets.swg.zone.object_controller.PostureUpdate; import resources.HologramColour; import resources.Posture; +import resources.PvpFlag; import resources.Race; import resources.collections.SWGList; import resources.collections.SWGMap; @@ -750,7 +751,7 @@ public class CreatureObject extends TangibleObject { target.sendPacket(new UpdatePostureMessage(posture.getId(), getObjectId())); if (getOwner() != null && target != getOwner()) { - target.sendPacket(new UpdatePvpStatusMessage(UpdatePvpStatusMessage.PLAYER, 0, getObjectId())); + target.sendPacket(new UpdatePvpStatusMessage(PvpFlag.PLAYER.getBitmask(), 0, getObjectId())); } } From 4042d1a9e3b7223e5280cc60ed238003bce84d0b Mon Sep 17 00:00:00 2001 From: Zach Date: Mon, 21 Sep 2015 00:21:49 -0400 Subject: [PATCH 03/32] Updated TangibleObject according to Ziggy's repo. --- .../objects/tangible/TangibleObject.java | 83 +++++++++++++------ 1 file changed, 57 insertions(+), 26 deletions(-) diff --git a/src/resources/objects/tangible/TangibleObject.java b/src/resources/objects/tangible/TangibleObject.java index 235aa7720..97dc9e36a 100644 --- a/src/resources/objects/tangible/TangibleObject.java +++ b/src/resources/objects/tangible/TangibleObject.java @@ -27,14 +27,19 @@ ***********************************************************************************/ package resources.objects.tangible; +import intents.FactionIntent; +import intents.FactionIntent.FactionIntentType; import network.packets.swg.zone.baselines.Baseline.BaselineType; +import resources.PvpFaction; +import resources.PvpFlag; +import resources.PvpStatus; import resources.network.BaselineBuilder; import resources.objects.SWGObject; import resources.player.Player; public class TangibleObject extends SWGObject { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 2L; private byte [] appearanceData = new byte[0]; private int damageTaken = 0; @@ -43,8 +48,8 @@ public class TangibleObject extends SWGObject { private boolean inCombat = false; private int condition = 0; private int pvpFlags = 0; - private int pvpType = 0; - private int pvpFactionId = 0; + private PvpStatus pvpStatus = PvpStatus.COMBATANT; + private PvpFaction pvpFaction = PvpFaction.NEUTRAL; private boolean visibleGmOnly = false; private byte [] objectEffects = new byte[0]; private int optionFlags = 0; @@ -82,18 +87,48 @@ public class TangibleObject extends SWGObject { return condition; } + public void setPvpFlags(PvpFlag... pvpFlags) { + for(PvpFlag pvpFlag : pvpFlags) + this.pvpFlags |= pvpFlag.getBitmask(); + + new FactionIntent(this, FactionIntentType.FLAGUPDATE).broadcast(); + } + + public void clearPvpFlags(PvpFlag... pvpFlags) { + for(PvpFlag pvpFlag : pvpFlags) + this.pvpFlags &= ~pvpFlag.getBitmask(); + + new FactionIntent(this, FactionIntentType.FLAGUPDATE).broadcast(); + } + + public boolean hasPvpFlag(PvpFlag pvpFlag) { + return (pvpFlags & pvpFlag.getBitmask()) != 0; + } + + public PvpStatus getPvpStatus() { + return pvpStatus; + } + + public void setPvpStatus(PvpStatus pvpStatus) { + this.pvpStatus = pvpStatus; + + sendDelta(3, 5, pvpStatus.getValue()); + } + + public PvpFaction getPvpFaction() { + return pvpFaction; + } + + public void setPvpFaction(PvpFaction pvpFaction) { + this.pvpFaction = pvpFaction; + + sendDelta(3, 4, pvpFaction.getCrc()); + } + public int getPvpFlags() { return pvpFlags; } - public int getPvpType() { - return pvpType; - } - - public int getPvpFactionId() { - return pvpFactionId; - } - public boolean isVisibleGmOnly() { return visibleGmOnly; } @@ -126,18 +161,6 @@ public class TangibleObject extends SWGObject { this.condition = condition; } - public void setPvpFlags(int pvpFlags) { - this.pvpFlags = pvpFlags; - } - - public void setPvpType(int pvpType) { - this.pvpType = pvpType; - } - - public void setPvpFactionId(int pvpFactionId) { - this.pvpFactionId = pvpFactionId; - } - public void setVisibleGmOnly(boolean visibleGmOnly) { this.visibleGmOnly = visibleGmOnly; } @@ -198,8 +221,8 @@ public class TangibleObject extends SWGObject { public void createBaseline3(Player target, BaselineBuilder bb) { super.createBaseline3(target, bb); // 4 variables - BASE3 (4) - bb.addInt(0); // Faction - 4 - bb.addInt(0); // Faction Status - 5 + bb.addInt(pvpFaction.getCrc()); // Faction - 4 + bb.addInt(pvpStatus.getValue()); // Faction Status - 5 bb.addArray(appearanceData); // - 6 bb.addInt(0); // Component customization (Set, Integer) - 7 bb.addInt(0); //updates @@ -243,4 +266,12 @@ public class TangibleObject extends SWGObject { bb.incrementOperandCount(2); } -} + + @Override + protected void sendBaselines(Player target) { + super.sendBaselines(target); + + new FactionIntent(this, FactionIntentType.FLAGUPDATE).broadcast(); + } + +} \ No newline at end of file From ac52853dffbce8074d1516657beb47d88f329ed3 Mon Sep 17 00:00:00 2001 From: Zach Date: Mon, 21 Sep 2015 00:22:03 -0400 Subject: [PATCH 04/32] Adds FactionService to GameManager. --- src/services/galaxy/GameManager.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/services/galaxy/GameManager.java b/src/services/galaxy/GameManager.java index d208f42a7..b582158e5 100644 --- a/src/services/galaxy/GameManager.java +++ b/src/services/galaxy/GameManager.java @@ -29,6 +29,7 @@ package services.galaxy; import resources.control.Manager; import services.commands.CommandService; +import services.faction.FactionService; import services.galaxy.terminals.TerminalService; import services.sui.SuiService; @@ -39,6 +40,7 @@ public class GameManager extends Manager { private final SuiService suiService; private final WeatherService weatherService; private final TerminalService terminalManager; + private FactionService factionService; public GameManager() { commandService = new CommandService(); @@ -46,11 +48,13 @@ public class GameManager extends Manager { suiService = new SuiService(); weatherService = new WeatherService(); terminalManager = new TerminalService(); + factionService = new FactionService(); addChildService(commandService); addChildService(connectionService); addChildService(suiService); addChildService(weatherService); addChildService(terminalManager); + addChildService(factionService); } } From 4828f2d2e67c81355645cff536b89ced17c8744b Mon Sep 17 00:00:00 2001 From: Zach Date: Mon, 21 Sep 2015 00:22:24 -0400 Subject: [PATCH 05/32] Sets Pvp Flags on CharacterCreationService. --- src/services/player/CharacterCreationService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/services/player/CharacterCreationService.java b/src/services/player/CharacterCreationService.java index a65203cc8..769152062 100644 --- a/src/services/player/CharacterCreationService.java +++ b/src/services/player/CharacterCreationService.java @@ -51,6 +51,7 @@ import network.packets.swg.login.creation.RandomNameResponse; import network.packets.swg.login.creation.ClientVerifyAndLockNameResponse.ErrorMessage; import network.packets.swg.login.creation.CreateCharacterFailure.NameFailureReason; import resources.Location; +import resources.PvpFlag; import resources.Race; import resources.Terrain; import resources.client_info.ClientFactory; @@ -324,7 +325,7 @@ public class CharacterCreationService extends Service { creatureObj.setAppearanceData(create.getCharCustomization()); creatureObj.setHeight(create.getHeight()); creatureObj.setName(create.getName()); - creatureObj.setPvpType(20); + creatureObj.setPvpFlags(PvpFlag.PLAYER, PvpFlag.OVERT); creatureObj.getSkills().add("species_" + creatureObj.getRace().getSpecies()); creatureObj.addObject(inventory); // slot = inventory From c5ae312627cf80d601fa3f69eae6173f54af3631 Mon Sep 17 00:00:00 2001 From: Zach Date: Mon, 21 Sep 2015 00:22:44 -0400 Subject: [PATCH 06/32] Adds FactionService --- src/services/faction/FactionService.java | 200 +++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 src/services/faction/FactionService.java diff --git a/src/services/faction/FactionService.java b/src/services/faction/FactionService.java new file mode 100644 index 000000000..2c51d326f --- /dev/null +++ b/src/services/faction/FactionService.java @@ -0,0 +1,200 @@ +package services.faction; + +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import network.packets.swg.zone.UpdatePvpStatusMessage; +import network.packets.swg.zone.chat.ChatSystemMessage; +import network.packets.swg.zone.chat.ChatSystemMessage.SystemChatType; +import intents.FactionIntent; +import resources.PvpFaction; +import resources.PvpFlag; +import resources.PvpStatus; +import resources.control.Intent; +import resources.control.Service; +import resources.objects.SWGObject; +import resources.objects.creature.CreatureObject; +import resources.objects.tangible.TangibleObject; + +public final class FactionService extends Service { + + private final ScheduledExecutorService executor; + + public FactionService() { + executor = Executors.newSingleThreadScheduledExecutor(); + } + + @Override + public boolean initialize() { + registerForIntent(FactionIntent.TYPE); + return super.initialize(); + } + + @Override + public void onIntentReceived(Intent i) { + if(i instanceof FactionIntent) { + FactionIntent fi = (FactionIntent) i; + + switch(fi.getUpdateType()) { + case FACTIONUPDATE: + handleTypeChange(fi); + break; + case STATUSUPDATE: + handleStatusChange(fi); + break; + case FLAGUPDATE: + handleFlagChange(fi.getTarget()); + break; + } + } + } + + @Override + public boolean terminate() { + executor.shutdown(); + + return super.terminate(); + } + + private void systemMessage(TangibleObject target, String message) { + target.getOwner().sendPacket(new ChatSystemMessage(SystemChatType.SCREEN_AND_CHAT, message)); + } + + private String beginMessage(PvpStatus currentStatus, PvpStatus targetStatus) { + String message = "@faction_recruiter:"; + + if(currentStatus == PvpStatus.ONLEAVE && targetStatus == PvpStatus.COMBATANT) + message += "on_leave_to_covert"; + else if(currentStatus == PvpStatus.COMBATANT && targetStatus == PvpStatus.SPECIALFORCES) + message += "covert_to_overt"; + else if(currentStatus == PvpStatus.SPECIALFORCES && targetStatus == PvpStatus.COMBATANT) + message += "overt_to_covert"; + + return message; + } + + private String completionMessage(PvpStatus currentStatus, PvpStatus targetStatus) { + String message = "@faction_recruiter:"; + + if((currentStatus == PvpStatus.ONLEAVE || currentStatus == PvpStatus.SPECIALFORCES) && targetStatus == PvpStatus.COMBATANT) + message += "covert_complete"; + else if(currentStatus == PvpStatus.COMBATANT && targetStatus == PvpStatus.SPECIALFORCES) + message += "overt_complete"; + else if(currentStatus == PvpStatus.COMBATANT && targetStatus == PvpStatus.ONLEAVE ) + message += "on_leave_complete"; + + return message; + } + + private long delay(PvpStatus currentStatus, PvpStatus targetStatus) { + long delay = 0; + + if(currentStatus == PvpStatus.ONLEAVE && targetStatus == PvpStatus.COMBATANT) + delay = 1; + else if(currentStatus == PvpStatus.COMBATANT && targetStatus == PvpStatus.SPECIALFORCES) + delay = 30; + else if(currentStatus == PvpStatus.SPECIALFORCES && targetStatus == PvpStatus.COMBATANT) + delay = 300; + + return delay; + } + + private void handleTypeChange(FactionIntent fi) { + TangibleObject target = fi.getTarget(); + PvpFaction newFaction = fi.getNewFaction(); + + target.setPvpFaction(newFaction); + target.setPvpStatus(PvpStatus.COMBATANT); + + handleFlagChange(target); // We don't want to remain attackable if we leave our current faction. + + if(target instanceof CreatureObject) { + int rank; + + if(newFaction != PvpFaction.NEUTRAL) + rank = 1; // We're given rank 1 upon joining a PvP faction + else + rank = 0; // Neutrals have no ranks + + ((CreatureObject) target).setFactionRank((byte) rank); + } + } + + private void handleStatusChange(FactionIntent fi) { + final PvpFlag pvpFlag; + final TangibleObject target = fi.getTarget(); + final PvpStatus currentStatus = target.getPvpStatus(); + final PvpStatus targetStatus; + + if(target.hasPvpFlag(PvpFlag.GOING_COVERT) || target.hasPvpFlag(PvpFlag.GOING_OVERT)) { + systemMessage(target, "@faction_recruiter:pvp_status_changing"); + } else { + if(currentStatus == PvpStatus.COMBATANT) { + pvpFlag = PvpFlag.GOING_OVERT; + targetStatus = PvpStatus.SPECIALFORCES; + } else { // Covers both ONLEAVE and SPECIALFORCES + pvpFlag = PvpFlag.GOING_COVERT; + targetStatus = PvpStatus.COMBATANT; + } + + target.setPvpFlags(pvpFlag); + systemMessage(target, beginMessage(currentStatus, targetStatus)); + executor.schedule(new Runnable() { + @Override + public void run() { + target.setPvpStatus(targetStatus); + target.getOwner().sendPacket(new ChatSystemMessage( + SystemChatType.SCREEN_AND_CHAT, + completionMessage(currentStatus, targetStatus))); + target.clearPvpFlags(pvpFlag); + } + }, delay(currentStatus, targetStatus), TimeUnit.SECONDS); + } + } + + private void handleFlagChange(TangibleObject object) { + UpdatePvpStatusMessage objectPacket, targetPacket; + TangibleObject tano; + int objectBitmask; + int targetBitmask; + int pvpBitmask; + boolean enemies; + + for(SWGObject observer : object.getObservers()) { + if(observer instanceof TangibleObject) { + tano = (TangibleObject) observer; + pvpBitmask = 0; + targetBitmask = 0; + objectBitmask = object.getPvpFlags(); + enemies = false; + + // They CAN be enemies if they're not from the same faction and neither of them are neutral + if(object.getPvpFaction() != tano.getPvpFaction() && tano.getPvpFaction() != PvpFaction.NEUTRAL) { + System.out.println(object.getName() + " and " + tano.getName() + " CAN be enemies."); + if(object.getPvpStatus() == PvpStatus.SPECIALFORCES && tano.getPvpStatus() == PvpStatus.SPECIALFORCES) { + System.out.println("They're enemies."); // TODO debug print, remove + pvpBitmask |= PvpFlag.AGGRESSIVE.getBitmask() | PvpFlag.ATTACKABLE.getBitmask(); + enemies = true; + } + } + + objectBitmask |= pvpBitmask; + objectPacket = new UpdatePvpStatusMessage(objectBitmask, object.getPvpFaction().getCrc(), object.getObjectId()); + + targetBitmask = tano.getPvpFlags(); + targetBitmask |= pvpBitmask; + targetPacket = new UpdatePvpStatusMessage(targetBitmask, tano.getPvpFaction().getCrc(), tano.getObjectId()); + + if(!enemies || enemies && !object.hasPvpFlag(PvpFlag.GOING_OVERT) || enemies && object.hasPvpFlag(PvpFlag.GOING_COVERT) ) + tano.sendSelf(objectPacket); + + object.sendSelf(objectPacket, targetPacket); + + System.out.println("Target bitmask: " + targetBitmask); + System.out.println("Object bitmask: " + objectBitmask); + } + } + } + +} \ No newline at end of file From a4f96018c45eea3fb833abc57ea6a8de3bd96b6b Mon Sep 17 00:00:00 2001 From: Zach Date: Mon, 21 Sep 2015 00:23:07 -0400 Subject: [PATCH 07/32] Adds Ziggy's pvp faction implementation. --- src/intents/FactionIntent.java | 47 ++++++++++++++++++++++++++++++++++ src/resources/PvpFaction.java | 21 +++++++++++++++ src/resources/PvpFlag.java | 25 ++++++++++++++++++ src/resources/PvpStatus.java | 19 ++++++++++++++ 4 files changed, 112 insertions(+) create mode 100644 src/intents/FactionIntent.java create mode 100644 src/resources/PvpFaction.java create mode 100644 src/resources/PvpFlag.java create mode 100644 src/resources/PvpStatus.java diff --git a/src/intents/FactionIntent.java b/src/intents/FactionIntent.java new file mode 100644 index 000000000..ae465b6e0 --- /dev/null +++ b/src/intents/FactionIntent.java @@ -0,0 +1,47 @@ +package intents; + +import resources.PvpFaction; +import resources.control.Intent; +import resources.objects.tangible.TangibleObject; + +public class FactionIntent extends Intent { + + public static final String TYPE = "FactionIntent"; + private TangibleObject target; + private PvpFaction newFaction; + private FactionIntentType updateType; + + private FactionIntent(TangibleObject target) { + super(TYPE); + this.target = target; + } + + public FactionIntent(TangibleObject target, FactionIntentType updateType) { + this(target); + this.updateType = updateType; + } + + public FactionIntent(TangibleObject target, PvpFaction newFaction) { + this(target, FactionIntentType.FACTIONUPDATE); + this.newFaction = newFaction; + } + + public TangibleObject getTarget() { + return target; + } + + public PvpFaction getNewFaction() { + return newFaction; + } + + public FactionIntentType getUpdateType() { + return updateType; + } + + public enum FactionIntentType { + FLAGUPDATE, + STATUSUPDATE, + FACTIONUPDATE // Is automatically set in the correct constructor, don't use manually. + } + +} \ No newline at end of file diff --git a/src/resources/PvpFaction.java b/src/resources/PvpFaction.java new file mode 100644 index 000000000..3e017f0e1 --- /dev/null +++ b/src/resources/PvpFaction.java @@ -0,0 +1,21 @@ +package resources; + +import resources.common.CRC; + +public enum PvpFaction { + + NEUTRAL(0), + IMPERIAL(CRC.getCrc("imperial")), + REBEL(CRC.getCrc("rebel")); + + private int crc; + + PvpFaction(int crc) { + this.crc = crc; + } + + public int getCrc() { + return crc; + } + +} \ No newline at end of file diff --git a/src/resources/PvpFlag.java b/src/resources/PvpFlag.java new file mode 100644 index 000000000..e010db110 --- /dev/null +++ b/src/resources/PvpFlag.java @@ -0,0 +1,25 @@ +package resources; + +public enum PvpFlag { + + ATTACKABLE(1<<0), + AGGRESSIVE(1<<1), + OVERT(1<<2), + TEF(1<<3), + PLAYER(1<<4), + ENEMY(1<<5), + GOING_OVERT(1<<6), + GOING_COVERT(1<<7), + DUEL(1<<8); + + private int bitmask; + + PvpFlag(int bitmask) { + this.bitmask = bitmask; + } + + public int getBitmask() { + return bitmask; + } + +} \ No newline at end of file diff --git a/src/resources/PvpStatus.java b/src/resources/PvpStatus.java new file mode 100644 index 000000000..bde504fc8 --- /dev/null +++ b/src/resources/PvpStatus.java @@ -0,0 +1,19 @@ +package resources; + +public enum PvpStatus { + + ONLEAVE(0), + COMBATANT(1), + SPECIALFORCES(2); + + private int value; + + PvpStatus(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + +} \ No newline at end of file From aeff2be744ceabbd06911ec4932649d79c72725a Mon Sep 17 00:00:00 2001 From: Zach Date: Mon, 21 Sep 2015 00:24:31 -0400 Subject: [PATCH 08/32] pors /pvp command to JavaScript. --- scripts/commands/generic/cmdPVP.js | 31 ++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 scripts/commands/generic/cmdPVP.js diff --git a/scripts/commands/generic/cmdPVP.js b/scripts/commands/generic/cmdPVP.js new file mode 100644 index 000000000..3a797072c --- /dev/null +++ b/scripts/commands/generic/cmdPVP.js @@ -0,0 +1,31 @@ +var execute = function(galManager, player, target, args) +{ + var creature = player.getCreatureObject(); + var PvpFaction = Java.type("resources.PvpFaction"); + var FactionIntent = Java.type("intents.FactionIntent"); + var FactionIntentType = Java.type("intents.FactionIntent.FactionIntentType"); + var ChatSystemMessage = Java.type("network.packets.swg.zone.chat.ChatSystemMessage"); + var SystemChatType = Java.type("network.packets.swg.zone.chat.ChatSystemMessage.SystemChatType"); + var intent = null; + + // Ziggy was using this to test until recruiters are enabled. + + if (args.length > 0) { + if (args.indexOf("imperial") > -1) { + intent = new FactionIntent(creature, PvpFaction.IMPERIAL); + } + else if (args.indexOf("rebel") > -1) { + intent = new FactionIntent(creature, PvpFaction.REBEL); + } + else { + intent = new FactionIntent(creature, PvpFaction.NEUTRAL); + } + intent.broadcast(); + } else if (creature.getPvpFaction() != PvpFaction.NEUTRAL) { + intent = FactionIntent(creature, FactionIntentType.STATUSUPDATE); + intent.broadcast(); + } else { + creature.getOwner().sendPacket(new ChatSystemMessage(SystemChatType.SCREEN_AND_CHAT, "@faction_recruiter:not_aligned")); + } + +}; \ No newline at end of file From 1b35b06dc3e5a2ffc8222aab255d80d7471810af Mon Sep 17 00:00:00 2001 From: Zach Date: Mon, 21 Sep 2015 13:18:32 -0400 Subject: [PATCH 09/32] Fixed a bug with a call. --- scripts/commands/generic/cmdPVP.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/commands/generic/cmdPVP.js b/scripts/commands/generic/cmdPVP.js index 3a797072c..524429c56 100644 --- a/scripts/commands/generic/cmdPVP.js +++ b/scripts/commands/generic/cmdPVP.js @@ -22,7 +22,7 @@ var execute = function(galManager, player, target, args) } intent.broadcast(); } else if (creature.getPvpFaction() != PvpFaction.NEUTRAL) { - intent = FactionIntent(creature, FactionIntentType.STATUSUPDATE); + intent = new FactionIntent(creature, FactionIntentType.STATUSUPDATE); intent.broadcast(); } else { creature.getOwner().sendPacket(new ChatSystemMessage(SystemChatType.SCREEN_AND_CHAT, "@faction_recruiter:not_aligned")); From eed7ac996ef967e4677af0a0b23205e1e954eae9 Mon Sep 17 00:00:00 2001 From: Zach Date: Fri, 25 Sep 2015 20:16:58 -0400 Subject: [PATCH 10/32] Updates population on Player first zone and log off --- src/services/galaxy/ConnectionService.java | 39 +++++++++++++++++----- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/src/services/galaxy/ConnectionService.java b/src/services/galaxy/ConnectionService.java index 2e660532b..5f96923c7 100644 --- a/src/services/galaxy/ConnectionService.java +++ b/src/services/galaxy/ConnectionService.java @@ -32,6 +32,19 @@ import intents.network.CloseConnectionIntent; import intents.network.ForceDisconnectIntent; import intents.network.GalacticPacketIntent; import intents.player.ZonePlayerSwapIntent; + +import java.sql.ResultSet; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.Set; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import main.ProjectSWG; import network.packets.soe.Disconnect; import network.packets.soe.Disconnect.DisconnectReason; import network.packets.swg.zone.HeartBeat; @@ -44,16 +57,9 @@ import resources.player.PlayerEvent; import resources.player.PlayerFlags; import resources.player.PlayerState; import resources.server_info.Log; +import resources.server_info.RelationalDatabase; import utilities.ThreadUtilities; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.Set; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - public class ConnectionService extends Service { private static final double LD_THRESHOLD = TimeUnit.MINUTES.toMillis(3); // Time since last packet @@ -140,9 +146,18 @@ public class ConnectionService extends Service { } private void onPlayerEventIntent(PlayerEventIntent pei) { + RelationalDatabase db = this.getLocalDatabase(); switch (pei.getEvent()) { case PE_FIRST_ZONE: { Player p = pei.getPlayer(); + PreparedStatement updateStatement = db.prepareStatement("UPDATE galaxies SET population = population + 1 WHERE id = ?"); + try { + updateStatement.setInt(1, ProjectSWG.getGalaxyId()); + updateStatement.executeUpdate(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } synchronized (zonedInPlayers) { zonedInPlayers.add(p); } @@ -152,6 +167,14 @@ public class ConnectionService extends Service { clearPlayerFlag(pei.getPlayer(), pei.getEvent(), PlayerFlags.LD); break; case PE_LOGGED_OUT: + PreparedStatement updateStatement = db.prepareStatement("UPDATE galaxies SET population = population - 1 WHERE id = ?"); + try { + updateStatement.setInt(1, ProjectSWG.getGalaxyId()); + updateStatement.executeUpdate(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } setPlayerFlag(pei.getPlayer(), pei.getEvent(), PlayerFlags.LD); break; default: From 000ae91648c3998c4c071bb38c70e3877c167509 Mon Sep 17 00:00:00 2001 From: Zach Date: Fri, 25 Sep 2015 20:17:17 -0400 Subject: [PATCH 11/32] Revert "Updates population on Player first zone and log off" This reverts commit eed7ac996ef967e4677af0a0b23205e1e954eae9. --- src/services/galaxy/ConnectionService.java | 39 +++++----------------- 1 file changed, 8 insertions(+), 31 deletions(-) diff --git a/src/services/galaxy/ConnectionService.java b/src/services/galaxy/ConnectionService.java index 5f96923c7..2e660532b 100644 --- a/src/services/galaxy/ConnectionService.java +++ b/src/services/galaxy/ConnectionService.java @@ -32,19 +32,6 @@ import intents.network.CloseConnectionIntent; import intents.network.ForceDisconnectIntent; import intents.network.GalacticPacketIntent; import intents.player.ZonePlayerSwapIntent; - -import java.sql.ResultSet; -import java.sql.PreparedStatement; -import java.sql.SQLException; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.Set; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - -import main.ProjectSWG; import network.packets.soe.Disconnect; import network.packets.soe.Disconnect.DisconnectReason; import network.packets.swg.zone.HeartBeat; @@ -57,9 +44,16 @@ import resources.player.PlayerEvent; import resources.player.PlayerFlags; import resources.player.PlayerState; import resources.server_info.Log; -import resources.server_info.RelationalDatabase; import utilities.ThreadUtilities; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.Set; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + public class ConnectionService extends Service { private static final double LD_THRESHOLD = TimeUnit.MINUTES.toMillis(3); // Time since last packet @@ -146,18 +140,9 @@ public class ConnectionService extends Service { } private void onPlayerEventIntent(PlayerEventIntent pei) { - RelationalDatabase db = this.getLocalDatabase(); switch (pei.getEvent()) { case PE_FIRST_ZONE: { Player p = pei.getPlayer(); - PreparedStatement updateStatement = db.prepareStatement("UPDATE galaxies SET population = population + 1 WHERE id = ?"); - try { - updateStatement.setInt(1, ProjectSWG.getGalaxyId()); - updateStatement.executeUpdate(); - } catch (SQLException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } synchronized (zonedInPlayers) { zonedInPlayers.add(p); } @@ -167,14 +152,6 @@ public class ConnectionService extends Service { clearPlayerFlag(pei.getPlayer(), pei.getEvent(), PlayerFlags.LD); break; case PE_LOGGED_OUT: - PreparedStatement updateStatement = db.prepareStatement("UPDATE galaxies SET population = population - 1 WHERE id = ?"); - try { - updateStatement.setInt(1, ProjectSWG.getGalaxyId()); - updateStatement.executeUpdate(); - } catch (SQLException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } setPlayerFlag(pei.getPlayer(), pei.getEvent(), PlayerFlags.LD); break; default: From 4c0e8e20893520430562e16adc826842baa0adf6 Mon Sep 17 00:00:00 2001 From: Zach Date: Fri, 25 Sep 2015 20:43:08 -0400 Subject: [PATCH 12/32] Adjust player population on log on/off. --- src/services/galaxy/ConnectionService.java | 39 +++++++++++++++++----- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/src/services/galaxy/ConnectionService.java b/src/services/galaxy/ConnectionService.java index 2e660532b..2d75dbd59 100644 --- a/src/services/galaxy/ConnectionService.java +++ b/src/services/galaxy/ConnectionService.java @@ -32,6 +32,19 @@ import intents.network.CloseConnectionIntent; import intents.network.ForceDisconnectIntent; import intents.network.GalacticPacketIntent; import intents.player.ZonePlayerSwapIntent; + +import java.sql.ResultSet; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.Set; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import main.ProjectSWG; import network.packets.soe.Disconnect; import network.packets.soe.Disconnect.DisconnectReason; import network.packets.swg.zone.HeartBeat; @@ -44,16 +57,9 @@ import resources.player.PlayerEvent; import resources.player.PlayerFlags; import resources.player.PlayerState; import resources.server_info.Log; +import resources.server_info.RelationalDatabase; import utilities.ThreadUtilities; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.Set; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - public class ConnectionService extends Service { private static final double LD_THRESHOLD = TimeUnit.MINUTES.toMillis(3); // Time since last packet @@ -140,9 +146,18 @@ public class ConnectionService extends Service { } private void onPlayerEventIntent(PlayerEventIntent pei) { + RelationalDatabase db = this.getLocalDatabase(); switch (pei.getEvent()) { case PE_FIRST_ZONE: { Player p = pei.getPlayer(); + PreparedStatement updateStatement = db.prepareStatement("UPDATE galaxies SET population = population + 1 WHERE id = ?"); + try { + updateStatement.setInt(1, ProjectSWG.getGalaxyId()); + updateStatement.executeUpdate(); + } catch (SQLException e) { + Log.e("ConnectionService", "SQLException occured when trying to increase population value."); + e.printStackTrace(); + } synchronized (zonedInPlayers) { zonedInPlayers.add(p); } @@ -152,6 +167,14 @@ public class ConnectionService extends Service { clearPlayerFlag(pei.getPlayer(), pei.getEvent(), PlayerFlags.LD); break; case PE_LOGGED_OUT: + PreparedStatement updateStatement = db.prepareStatement("UPDATE galaxies SET population = population - 1 WHERE id = ?"); + try { + updateStatement.setInt(1, ProjectSWG.getGalaxyId()); + updateStatement.executeUpdate(); + } catch (SQLException e) { + Log.e("ConnectionService", "SQLException occured when trying to decrease population value."); + e.printStackTrace(); + } setPlayerFlag(pei.getPlayer(), pei.getEvent(), PlayerFlags.LD); break; default: From f2b9ef88c1b529636b78b1b875819b452d85fd92 Mon Sep 17 00:00:00 2001 From: Zach Date: Fri, 25 Sep 2015 20:43:18 -0400 Subject: [PATCH 13/32] Resets player population to zero on server start. --- src/main/ProjectSWG.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/ProjectSWG.java b/src/main/ProjectSWG.java index 2510a3b07..21143bc8b 100644 --- a/src/main/ProjectSWG.java +++ b/src/main/ProjectSWG.java @@ -27,10 +27,16 @@ ***********************************************************************************/ package main; +import java.sql.PreparedStatement; +import java.sql.SQLException; + import intents.server.ServerStatusIntent; import resources.Galaxy.GalaxyStatus; import resources.control.IntentManager; import resources.control.ServerStatus; +import resources.server_info.DataManager; +import resources.server_info.Log; +import resources.server_info.RelationalDatabase; import services.CoreManager; public class ProjectSWG { @@ -128,6 +134,16 @@ public class ProjectSWG { if (!manager.start()) throw new CoreException("Failed to start."); System.out.println("ProjectSWG: Started. Time: " + manager.getCoreTime() + "ms"); + RelationalDatabase db = DataManager.getInstance().getLocalDatabase(); + PreparedStatement resetPopulation = db.prepareStatement("UPDATE galaxies SET population = 0 WHERE id = ?"); + try { + resetPopulation.setInt(1, ProjectSWG.getGalaxyId()); + resetPopulation.executeUpdate(); + } catch (SQLException e) { + Log.e("ProjectSWG", "SQLException occured when trying to reset population value."); + e.printStackTrace(); + } + } private void loop() { From 0553b519aba6d56471e6dea74021014a9cbe91ab Mon Sep 17 00:00:00 2001 From: Zach Date: Fri, 25 Sep 2015 21:11:03 -0400 Subject: [PATCH 14/32] fixed bracket for conventions. --- scripts/commands/generic/cmdPVP.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/commands/generic/cmdPVP.js b/scripts/commands/generic/cmdPVP.js index 524429c56..9299b413f 100644 --- a/scripts/commands/generic/cmdPVP.js +++ b/scripts/commands/generic/cmdPVP.js @@ -1,5 +1,4 @@ -var execute = function(galManager, player, target, args) -{ +var execute = function(galManager, player, target, args) { var creature = player.getCreatureObject(); var PvpFaction = Java.type("resources.PvpFaction"); var FactionIntent = Java.type("intents.FactionIntent"); From 1b897d22affdab0363738413a18dfe00e6c1785a Mon Sep 17 00:00:00 2001 From: Zach Date: Fri, 25 Sep 2015 22:21:44 -0400 Subject: [PATCH 15/32] Moved population reset to Galactic Manager via resetPopulationCount() --- src/main/ProjectSWG.java | 17 +---------------- src/services/galaxy/GalacticManager.java | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/main/ProjectSWG.java b/src/main/ProjectSWG.java index 21143bc8b..b6f4bfb48 100644 --- a/src/main/ProjectSWG.java +++ b/src/main/ProjectSWG.java @@ -27,16 +27,10 @@ ***********************************************************************************/ package main; -import java.sql.PreparedStatement; -import java.sql.SQLException; - import intents.server.ServerStatusIntent; import resources.Galaxy.GalaxyStatus; import resources.control.IntentManager; import resources.control.ServerStatus; -import resources.server_info.DataManager; -import resources.server_info.Log; -import resources.server_info.RelationalDatabase; import services.CoreManager; public class ProjectSWG { @@ -46,7 +40,6 @@ public class ProjectSWG { private CoreManager manager; private boolean shutdownRequested; private ServerStatus status; - public static final void main(String [] args) { server = new ProjectSWG(); Runtime.getRuntime().addShutdownHook(new Thread() { @@ -134,15 +127,7 @@ public class ProjectSWG { if (!manager.start()) throw new CoreException("Failed to start."); System.out.println("ProjectSWG: Started. Time: " + manager.getCoreTime() + "ms"); - RelationalDatabase db = DataManager.getInstance().getLocalDatabase(); - PreparedStatement resetPopulation = db.prepareStatement("UPDATE galaxies SET population = 0 WHERE id = ?"); - try { - resetPopulation.setInt(1, ProjectSWG.getGalaxyId()); - resetPopulation.executeUpdate(); - } catch (SQLException e) { - Log.e("ProjectSWG", "SQLException occured when trying to reset population value."); - e.printStackTrace(); - } + } diff --git a/src/services/galaxy/GalacticManager.java b/src/services/galaxy/GalacticManager.java index 894839b6f..fcb99436c 100644 --- a/src/services/galaxy/GalacticManager.java +++ b/src/services/galaxy/GalacticManager.java @@ -27,12 +27,19 @@ ***********************************************************************************/ package services.galaxy; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +import main.ProjectSWG; import intents.GalacticIntent; import intents.network.GalacticPacketIntent; import intents.network.InboundPacketIntent; import resources.Galaxy; import resources.control.Intent; import resources.control.Manager; +import resources.server_info.DataManager; +import resources.server_info.Log; +import resources.server_info.RelationalDatabase; import services.chat.ChatManager; import services.objects.ObjectManager; import services.player.PlayerManager; @@ -40,6 +47,7 @@ import services.player.PlayerManager; public class GalacticManager extends Manager { private final Object prevPacketIntentMutex = new Object(); + private final static String resetPopulationSQL = "UPDATE galaxies SET population = 0 WHERE id = ?"; private ObjectManager objectManager; private PlayerManager playerManager; @@ -65,6 +73,7 @@ public class GalacticManager extends Manager { @Override public boolean initialize() { registerForIntent(InboundPacketIntent.TYPE); + resetPopulationCount(); return super.initialize(); } @@ -112,5 +121,15 @@ public class GalacticManager extends Manager { i.setGalacticManager(this); i.setGalaxy(galaxy); } + private void resetPopulationCount() { + RelationalDatabase db = DataManager.getInstance().getLocalDatabase(); + try(PreparedStatement resetPopulation = db.prepareStatement(GalacticManager.resetPopulationSQL)) { + resetPopulation.setInt(1, galaxy.getId()); + resetPopulation.executeUpdate(); + } catch (SQLException e) { + Log.e("ProjectSWG", "SQLException occured when trying to reset population value."); + e.printStackTrace(); + } + } } From fa4e1c39fe0faf47e266809c80fe18e093514d61 Mon Sep 17 00:00:00 2001 From: Zach Date: Fri, 25 Sep 2015 22:31:43 -0400 Subject: [PATCH 16/32] Refactored prepared statements. --- src/services/galaxy/ConnectionService.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/services/galaxy/ConnectionService.java b/src/services/galaxy/ConnectionService.java index 2d75dbd59..d0f08373b 100644 --- a/src/services/galaxy/ConnectionService.java +++ b/src/services/galaxy/ConnectionService.java @@ -64,6 +64,8 @@ public class ConnectionService extends Service { private static final double LD_THRESHOLD = TimeUnit.MINUTES.toMillis(3); // Time since last packet private static final double DISAPPEAR_THRESHOLD = TimeUnit.MINUTES.toMillis(2); // Time after the LD + private static final String incrementPopulation = "UPDATE galaxies SET population = population + 1 WHERE id = ?"; + private static final String decrementPopulation = "UPDATE galaxies SET population = population - 1 WHERE id = ?"; private final ScheduledExecutorService updateService; private final Runnable updateRunnable; @@ -149,9 +151,8 @@ public class ConnectionService extends Service { RelationalDatabase db = this.getLocalDatabase(); switch (pei.getEvent()) { case PE_FIRST_ZONE: { - Player p = pei.getPlayer(); - PreparedStatement updateStatement = db.prepareStatement("UPDATE galaxies SET population = population + 1 WHERE id = ?"); - try { + Player p = pei.getPlayer(); + try(PreparedStatement updateStatement = db.prepareStatement(ConnectionService.incrementPopulation)) { updateStatement.setInt(1, ProjectSWG.getGalaxyId()); updateStatement.executeUpdate(); } catch (SQLException e) { @@ -167,8 +168,7 @@ public class ConnectionService extends Service { clearPlayerFlag(pei.getPlayer(), pei.getEvent(), PlayerFlags.LD); break; case PE_LOGGED_OUT: - PreparedStatement updateStatement = db.prepareStatement("UPDATE galaxies SET population = population - 1 WHERE id = ?"); - try { + try (PreparedStatement updateStatement = db.prepareStatement(ConnectionService.decrementPopulation)) { updateStatement.setInt(1, ProjectSWG.getGalaxyId()); updateStatement.executeUpdate(); } catch (SQLException e) { From 3ddf9b91f3c2265b808e332ae823a3a9be7b6123 Mon Sep 17 00:00:00 2001 From: Zach Date: Fri, 25 Sep 2015 22:32:03 -0400 Subject: [PATCH 17/32] Adjusted FactionService based on suggestions by Obique. --- src/services/faction/FactionService.java | 40 +++++++++++++----------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/services/faction/FactionService.java b/src/services/faction/FactionService.java index 2c51d326f..30f095a8e 100644 --- a/src/services/faction/FactionService.java +++ b/src/services/faction/FactionService.java @@ -52,16 +52,21 @@ public final class FactionService extends Service { @Override public boolean terminate() { - executor.shutdown(); - - return super.terminate(); + executor.shutdownNow(); + boolean success = false; + try { + success = executor.awaitTermination(5, TimeUnit.SECONDS); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return super.terminate() && success; } private void systemMessage(TangibleObject target, String message) { target.getOwner().sendPacket(new ChatSystemMessage(SystemChatType.SCREEN_AND_CHAT, message)); } - private String beginMessage(PvpStatus currentStatus, PvpStatus targetStatus) { + private String getBeginMessage(PvpStatus currentStatus, PvpStatus targetStatus) { String message = "@faction_recruiter:"; if(currentStatus == PvpStatus.ONLEAVE && targetStatus == PvpStatus.COMBATANT) @@ -74,7 +79,7 @@ public final class FactionService extends Service { return message; } - private String completionMessage(PvpStatus currentStatus, PvpStatus targetStatus) { + private String getCompletionMessage(PvpStatus currentStatus, PvpStatus targetStatus) { String message = "@faction_recruiter:"; if((currentStatus == PvpStatus.ONLEAVE || currentStatus == PvpStatus.SPECIALFORCES) && targetStatus == PvpStatus.COMBATANT) @@ -87,7 +92,7 @@ public final class FactionService extends Service { return message; } - private long delay(PvpStatus currentStatus, PvpStatus targetStatus) { + private long getDelay(PvpStatus currentStatus, PvpStatus targetStatus) { long delay = 0; if(currentStatus == PvpStatus.ONLEAVE && targetStatus == PvpStatus.COMBATANT) @@ -139,30 +144,30 @@ public final class FactionService extends Service { } target.setPvpFlags(pvpFlag); - systemMessage(target, beginMessage(currentStatus, targetStatus)); + systemMessage(target, getBeginMessage(currentStatus, targetStatus)); executor.schedule(new Runnable() { @Override public void run() { target.setPvpStatus(targetStatus); target.getOwner().sendPacket(new ChatSystemMessage( SystemChatType.SCREEN_AND_CHAT, - completionMessage(currentStatus, targetStatus))); + getCompletionMessage(currentStatus, targetStatus))); target.clearPvpFlags(pvpFlag); } - }, delay(currentStatus, targetStatus), TimeUnit.SECONDS); + }, getDelay(currentStatus, targetStatus), TimeUnit.SECONDS); } } private void handleFlagChange(TangibleObject object) { - UpdatePvpStatusMessage objectPacket, targetPacket; - TangibleObject tano; - int objectBitmask; - int targetBitmask; - int pvpBitmask; - boolean enemies; - + for(SWGObject observer : object.getObservers()) { if(observer instanceof TangibleObject) { + UpdatePvpStatusMessage objectPacket, targetPacket; + TangibleObject tano; + int objectBitmask; + int targetBitmask; + int pvpBitmask; + boolean enemies; tano = (TangibleObject) observer; pvpBitmask = 0; targetBitmask = 0; @@ -190,9 +195,6 @@ public final class FactionService extends Service { tano.sendSelf(objectPacket); object.sendSelf(objectPacket, targetPacket); - - System.out.println("Target bitmask: " + targetBitmask); - System.out.println("Object bitmask: " + objectBitmask); } } } From 96b9e7d37f74404d13a5060f084917b0e83cfa21 Mon Sep 17 00:00:00 2001 From: Zach Date: Fri, 25 Sep 2015 23:40:04 -0400 Subject: [PATCH 18/32] Additional refactors to FactionService. --- src/services/faction/FactionService.java | 26 ++++++++++-------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/services/faction/FactionService.java b/src/services/faction/FactionService.java index 30f095a8e..52ceffb2e 100644 --- a/src/services/faction/FactionService.java +++ b/src/services/faction/FactionService.java @@ -19,15 +19,16 @@ import resources.objects.tangible.TangibleObject; public final class FactionService extends Service { - private final ScheduledExecutorService executor; + private ScheduledExecutorService executor; public FactionService() { - executor = Executors.newSingleThreadScheduledExecutor(); + } @Override public boolean initialize() { registerForIntent(FactionIntent.TYPE); + executor = Executors.newSingleThreadScheduledExecutor(); return super.initialize(); } @@ -62,7 +63,7 @@ public final class FactionService extends Service { return super.terminate() && success; } - private void systemMessage(TangibleObject target, String message) { + private void sendSystemMessage(TangibleObject target, String message) { target.getOwner().sendPacket(new ChatSystemMessage(SystemChatType.SCREEN_AND_CHAT, message)); } @@ -133,7 +134,7 @@ public final class FactionService extends Service { final PvpStatus targetStatus; if(target.hasPvpFlag(PvpFlag.GOING_COVERT) || target.hasPvpFlag(PvpFlag.GOING_OVERT)) { - systemMessage(target, "@faction_recruiter:pvp_status_changing"); + sendSystemMessage(target, "@faction_recruiter:pvp_status_changing"); } else { if(currentStatus == PvpStatus.COMBATANT) { pvpFlag = PvpFlag.GOING_OVERT; @@ -144,7 +145,7 @@ public final class FactionService extends Service { } target.setPvpFlags(pvpFlag); - systemMessage(target, getBeginMessage(currentStatus, targetStatus)); + sendSystemMessage(target, getBeginMessage(currentStatus, targetStatus)); executor.schedule(new Runnable() { @Override public void run() { @@ -163,16 +164,11 @@ public final class FactionService extends Service { for(SWGObject observer : object.getObservers()) { if(observer instanceof TangibleObject) { UpdatePvpStatusMessage objectPacket, targetPacket; - TangibleObject tano; - int objectBitmask; - int targetBitmask; - int pvpBitmask; - boolean enemies; - tano = (TangibleObject) observer; - pvpBitmask = 0; - targetBitmask = 0; - objectBitmask = object.getPvpFlags(); - enemies = false; + TangibleObject tano = (TangibleObject) observer; + int objectBitmask = object.getPvpFlags(); + int targetBitmask = 0; + int pvpBitmask = 0; + boolean enemies = false; // They CAN be enemies if they're not from the same faction and neither of them are neutral if(object.getPvpFaction() != tano.getPvpFaction() && tano.getPvpFaction() != PvpFaction.NEUTRAL) { From f8bd62e44cc26f80b2d838e8bef259f21bdf7511 Mon Sep 17 00:00:00 2001 From: Zach Date: Sat, 26 Sep 2015 01:43:53 -0400 Subject: [PATCH 19/32] Made PvpFlag more similar to CreatureState. --- src/resources/PvpFlag.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/resources/PvpFlag.java b/src/resources/PvpFlag.java index e010db110..6cb759df7 100644 --- a/src/resources/PvpFlag.java +++ b/src/resources/PvpFlag.java @@ -1,5 +1,7 @@ package resources; +import java.util.EnumSet; + public enum PvpFlag { ATTACKABLE(1<<0), @@ -21,5 +23,13 @@ public enum PvpFlag { public int getBitmask() { return bitmask; } + public static EnumSet getFlags(int bits) { + EnumSet states = EnumSet.noneOf(PvpFlag.class); + for (PvpFlag state : values()) { + if ((state.getBitmask() & bits) != 0) + states.add(state); + } + return states; + } } \ No newline at end of file From e90591dc4448b5ed40116966c74c10be0a4f2e36 Mon Sep 17 00:00:00 2001 From: Z61 Date: Sat, 26 Sep 2015 16:37:20 +0000 Subject: [PATCH 20/32] Reverted ProjectSWG.java to its current state. --- src/main/ProjectSWG.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/ProjectSWG.java b/src/main/ProjectSWG.java index b6f4bfb48..48eeb11e7 100644 --- a/src/main/ProjectSWG.java +++ b/src/main/ProjectSWG.java @@ -40,6 +40,7 @@ public class ProjectSWG { private CoreManager manager; private boolean shutdownRequested; private ServerStatus status; + public static final void main(String [] args) { server = new ProjectSWG(); Runtime.getRuntime().addShutdownHook(new Thread() { @@ -127,8 +128,6 @@ public class ProjectSWG { if (!manager.start()) throw new CoreException("Failed to start."); System.out.println("ProjectSWG: Started. Time: " + manager.getCoreTime() + "ms"); - - } private void loop() { @@ -183,4 +182,4 @@ public class ProjectSWG { } -} +} \ No newline at end of file From aef3e31688377eb9fc0db5dead0c1c953e427fda Mon Sep 17 00:00:00 2001 From: Zach Date: Sat, 26 Sep 2015 12:57:47 -0400 Subject: [PATCH 21/32] Adds final modifier to factionService. --- src/services/galaxy/GameManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/galaxy/GameManager.java b/src/services/galaxy/GameManager.java index b582158e5..a0b7747da 100644 --- a/src/services/galaxy/GameManager.java +++ b/src/services/galaxy/GameManager.java @@ -40,7 +40,7 @@ public class GameManager extends Manager { private final SuiService suiService; private final WeatherService weatherService; private final TerminalService terminalManager; - private FactionService factionService; + private final FactionService factionService; public GameManager() { commandService = new CommandService(); From 9c6b78fa52dd6ba77264e6119bcbd805b72260db Mon Sep 17 00:00:00 2001 From: Undercova Date: Sun, 27 Sep 2015 21:30:13 +0200 Subject: [PATCH 22/32] Added checked and unchecked spawner types for better visuality in NPC placement --- src/resources/spawn/SpawnerType.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/resources/spawn/SpawnerType.java b/src/resources/spawn/SpawnerType.java index 4c2d08627..17b15f587 100644 --- a/src/resources/spawn/SpawnerType.java +++ b/src/resources/spawn/SpawnerType.java @@ -55,7 +55,9 @@ public enum SpawnerType { OUT_SCIENTIST("object/tangible/spawning/event/shared_outbreak_dungeon_scientist_spawner.iff"), OUT_GAMMA("object/tangible/spawning/event/shared_outbreak_gamma_survivor_spawner.iff"), OUT_HIDDEN("object/tangible/spawning/event/shared_outbreak_hidden_content_spawner.iff"), - WOD_HERB("object/tangible/spawning/event/shared_wod_themepark_herb_spawner.iff"); + WOD_HERB("object/tangible/spawning/event/shared_wod_themepark_herb_spawner.iff"), + UNCHECKED("object/tangible/npe/shared_npe_gamma_shuttle.iff"), + CHECKED("object/tangible/storyteller/prop/shared_pr_droid_lottery.iff"); private String objectTemplate; @@ -67,4 +69,4 @@ public enum SpawnerType { return objectTemplate; } -} +} \ No newline at end of file From e57b5742cd1e5d58a2837e5b33fa4d4619225697 Mon Sep 17 00:00:00 2001 From: Zach Date: Sun, 27 Sep 2015 16:09:12 -0400 Subject: [PATCH 23/32] Refactored UpdatePvpStatusMessage. --- .../packets/swg/zone/UpdatePvpStatusMessage.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/network/packets/swg/zone/UpdatePvpStatusMessage.java b/src/network/packets/swg/zone/UpdatePvpStatusMessage.java index b330ac3fd..f932dbf99 100644 --- a/src/network/packets/swg/zone/UpdatePvpStatusMessage.java +++ b/src/network/packets/swg/zone/UpdatePvpStatusMessage.java @@ -30,11 +30,14 @@ package network.packets.swg.zone; import network.packets.swg.SWGPacket; import java.nio.ByteBuffer; +import java.util.EnumSet; + +import resources.PvpFlag; public class UpdatePvpStatusMessage extends SWGPacket { public static final int CRC = getCrc("UpdatePvpStatusMessage"); - private int flag = 16; + private PvpFlag flag = PvpFlag.OVERT; private int playerFaction = 0; private long objId = 0; @@ -42,7 +45,7 @@ public class UpdatePvpStatusMessage extends SWGPacket { } - public UpdatePvpStatusMessage(int playerType, int flag, long objId) { + public UpdatePvpStatusMessage(PvpFlag playerType, int flag, long objId) { this.flag = playerType; this.playerFaction = flag; this.objId = objId; @@ -51,7 +54,8 @@ public class UpdatePvpStatusMessage extends SWGPacket { public void decode(ByteBuffer data) { if (!super.decode(data, CRC)) return; - flag = getInt(data); + EnumSet flags = PvpFlag.getFlags(getInt(data)); + flag = flags.iterator().next(); playerFaction = getInt(data); objId = getLong(data); } @@ -61,7 +65,7 @@ public class UpdatePvpStatusMessage extends SWGPacket { ByteBuffer data = ByteBuffer.allocate(length); addShort(data, 4); addInt( data, CRC); - addInt( data, flag); + addInt( data, flag.getBitmask()); addInt( data, playerFaction); addLong( data, objId); return data; @@ -69,6 +73,6 @@ public class UpdatePvpStatusMessage extends SWGPacket { public long getObjectId() { return objId; } public int getPlayerFaction() { return playerFaction; } - public int getPlayerType() { return flag; } + public PvpFlag getPlayerType() { return flag; } } \ No newline at end of file From 91929118fafa92596a6c207de617f5f74f04e722 Mon Sep 17 00:00:00 2001 From: Zach Date: Sun, 27 Sep 2015 16:09:30 -0400 Subject: [PATCH 24/32] Updated to new Constructor requirements. --- src/resources/objects/creature/CreatureObject.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index fd3b6c875..9f2c7034d 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -751,7 +751,7 @@ public class CreatureObject extends TangibleObject { target.sendPacket(new UpdatePostureMessage(posture.getId(), getObjectId())); if (getOwner() != null && target != getOwner()) { - target.sendPacket(new UpdatePvpStatusMessage(PvpFlag.PLAYER.getBitmask(), 0, getObjectId())); + target.sendPacket(new UpdatePvpStatusMessage(PvpFlag.PLAYER, 0, getObjectId())); } } From 10d61ae3b4a8598992849b2a792a7c6ecbb3ac75 Mon Sep 17 00:00:00 2001 From: Zach Date: Sun, 27 Sep 2015 16:09:52 -0400 Subject: [PATCH 25/32] Refactored to use new UpdatePvpStatusMessage. --- src/services/faction/FactionService.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/services/faction/FactionService.java b/src/services/faction/FactionService.java index 52ceffb2e..fe42bb8a4 100644 --- a/src/services/faction/FactionService.java +++ b/src/services/faction/FactionService.java @@ -1,5 +1,6 @@ package services.faction; +import java.util.EnumSet; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -174,18 +175,19 @@ public final class FactionService extends Service { if(object.getPvpFaction() != tano.getPvpFaction() && tano.getPvpFaction() != PvpFaction.NEUTRAL) { System.out.println(object.getName() + " and " + tano.getName() + " CAN be enemies."); if(object.getPvpStatus() == PvpStatus.SPECIALFORCES && tano.getPvpStatus() == PvpStatus.SPECIALFORCES) { - System.out.println("They're enemies."); // TODO debug print, remove pvpBitmask |= PvpFlag.AGGRESSIVE.getBitmask() | PvpFlag.ATTACKABLE.getBitmask(); enemies = true; } } objectBitmask |= pvpBitmask; - objectPacket = new UpdatePvpStatusMessage(objectBitmask, object.getPvpFaction().getCrc(), object.getObjectId()); + EnumSet objectFlags = PvpFlag.getFlags(objectBitmask); + objectPacket = new UpdatePvpStatusMessage(objectFlags.iterator().next(), object.getPvpFaction().getCrc(), object.getObjectId()); targetBitmask = tano.getPvpFlags(); targetBitmask |= pvpBitmask; - targetPacket = new UpdatePvpStatusMessage(targetBitmask, tano.getPvpFaction().getCrc(), tano.getObjectId()); + EnumSet targetFlags = PvpFlag.getFlags(targetBitmask); + targetPacket = new UpdatePvpStatusMessage(targetFlags.iterator().next(), tano.getPvpFaction().getCrc(), tano.getObjectId()); if(!enemies || enemies && !object.hasPvpFlag(PvpFlag.GOING_OVERT) || enemies && object.hasPvpFlag(PvpFlag.GOING_COVERT) ) tano.sendSelf(objectPacket); From 78ec1be0cd70cd35f3da09a2ece3bdd07ccb78c4 Mon Sep 17 00:00:00 2001 From: Zach Date: Sun, 27 Sep 2015 20:04:58 -0400 Subject: [PATCH 26/32] Added a check if the flag is null to UpdatePvpStatusMessage --- .../packets/swg/zone/UpdatePvpStatusMessage.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/network/packets/swg/zone/UpdatePvpStatusMessage.java b/src/network/packets/swg/zone/UpdatePvpStatusMessage.java index f932dbf99..3c19c5b99 100644 --- a/src/network/packets/swg/zone/UpdatePvpStatusMessage.java +++ b/src/network/packets/swg/zone/UpdatePvpStatusMessage.java @@ -37,7 +37,7 @@ import resources.PvpFlag; public class UpdatePvpStatusMessage extends SWGPacket { public static final int CRC = getCrc("UpdatePvpStatusMessage"); - private PvpFlag flag = PvpFlag.OVERT; + private PvpFlag flag = PvpFlag.PLAYER; private int playerFaction = 0; private long objId = 0; @@ -55,7 +55,16 @@ public class UpdatePvpStatusMessage extends SWGPacket { if (!super.decode(data, CRC)) return; EnumSet flags = PvpFlag.getFlags(getInt(data)); - flag = flags.iterator().next(); + PvpFlag tempFlag = flags.iterator().next(); + + if (tempFlag!= null) + { + flag = flags.iterator().next(); + } + else + { + flag = PvpFlag.PLAYER; + } playerFaction = getInt(data); objId = getLong(data); } From 64ce94cb22664c7d7f6ffe82098ff6c287ec14c1 Mon Sep 17 00:00:00 2001 From: Zach Date: Sun, 27 Sep 2015 20:05:08 -0400 Subject: [PATCH 27/32] Removed unused imports. --- src/services/galaxy/ConnectionService.java | 1 - src/services/galaxy/GalacticManager.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/services/galaxy/ConnectionService.java b/src/services/galaxy/ConnectionService.java index d0f08373b..d13c47336 100644 --- a/src/services/galaxy/ConnectionService.java +++ b/src/services/galaxy/ConnectionService.java @@ -33,7 +33,6 @@ import intents.network.ForceDisconnectIntent; import intents.network.GalacticPacketIntent; import intents.player.ZonePlayerSwapIntent; -import java.sql.ResultSet; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.HashSet; diff --git a/src/services/galaxy/GalacticManager.java b/src/services/galaxy/GalacticManager.java index fcb99436c..6705f8a8d 100644 --- a/src/services/galaxy/GalacticManager.java +++ b/src/services/galaxy/GalacticManager.java @@ -30,7 +30,6 @@ package services.galaxy; import java.sql.PreparedStatement; import java.sql.SQLException; -import main.ProjectSWG; import intents.GalacticIntent; import intents.network.GalacticPacketIntent; import intents.network.InboundPacketIntent; From b794b53fde374626a82dbf90f0635eb8371fe027 Mon Sep 17 00:00:00 2001 From: Zach Date: Sun, 27 Sep 2015 20:15:01 -0400 Subject: [PATCH 28/32] Added checks to target and object packets during update. --- src/services/faction/FactionService.java | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/services/faction/FactionService.java b/src/services/faction/FactionService.java index fe42bb8a4..6c7239baa 100644 --- a/src/services/faction/FactionService.java +++ b/src/services/faction/FactionService.java @@ -182,13 +182,27 @@ public final class FactionService extends Service { objectBitmask |= pvpBitmask; EnumSet objectFlags = PvpFlag.getFlags(objectBitmask); - objectPacket = new UpdatePvpStatusMessage(objectFlags.iterator().next(), object.getPvpFaction().getCrc(), object.getObjectId()); - + PvpFlag objectTempFlag = objectFlags.iterator().next(); + if (objectTempFlag != null) + { + objectPacket = new UpdatePvpStatusMessage(objectTempFlag, object.getPvpFaction().getCrc(), object.getObjectId()); + } + else + { + objectPacket = new UpdatePvpStatusMessage(PvpFlag.PLAYER, object.getPvpFaction().getCrc(), object.getObjectId()); + } targetBitmask = tano.getPvpFlags(); targetBitmask |= pvpBitmask; EnumSet targetFlags = PvpFlag.getFlags(targetBitmask); - targetPacket = new UpdatePvpStatusMessage(targetFlags.iterator().next(), tano.getPvpFaction().getCrc(), tano.getObjectId()); - + PvpFlag targetTempFlag = targetFlags.iterator().next(); + if (targetTempFlag != null) + { + targetPacket = new UpdatePvpStatusMessage(targetTempFlag, tano.getPvpFaction().getCrc(), tano.getObjectId()); + } + else + { + targetPacket = new UpdatePvpStatusMessage(PvpFlag.PLAYER, object.getPvpFaction().getCrc(), object.getObjectId()); + } if(!enemies || enemies && !object.hasPvpFlag(PvpFlag.GOING_OVERT) || enemies && object.hasPvpFlag(PvpFlag.GOING_COVERT) ) tano.sendSelf(objectPacket); From 1b7bd60f3d86efb5739ebde788ccdadf898b8019 Mon Sep 17 00:00:00 2001 From: Zach Date: Sun, 27 Sep 2015 22:38:54 -0400 Subject: [PATCH 29/32] Conventions --- src/services/faction/FactionService.java | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/services/faction/FactionService.java b/src/services/faction/FactionService.java index 6c7239baa..bbc3502f4 100644 --- a/src/services/faction/FactionService.java +++ b/src/services/faction/FactionService.java @@ -183,24 +183,18 @@ public final class FactionService extends Service { objectBitmask |= pvpBitmask; EnumSet objectFlags = PvpFlag.getFlags(objectBitmask); PvpFlag objectTempFlag = objectFlags.iterator().next(); - if (objectTempFlag != null) - { + if (objectTempFlag != null) { objectPacket = new UpdatePvpStatusMessage(objectTempFlag, object.getPvpFaction().getCrc(), object.getObjectId()); - } - else - { + } else { objectPacket = new UpdatePvpStatusMessage(PvpFlag.PLAYER, object.getPvpFaction().getCrc(), object.getObjectId()); } targetBitmask = tano.getPvpFlags(); targetBitmask |= pvpBitmask; EnumSet targetFlags = PvpFlag.getFlags(targetBitmask); PvpFlag targetTempFlag = targetFlags.iterator().next(); - if (targetTempFlag != null) - { + if (targetTempFlag != null) { targetPacket = new UpdatePvpStatusMessage(targetTempFlag, tano.getPvpFaction().getCrc(), tano.getObjectId()); - } - else - { + } else { targetPacket = new UpdatePvpStatusMessage(PvpFlag.PLAYER, object.getPvpFaction().getCrc(), object.getObjectId()); } if(!enemies || enemies && !object.hasPvpFlag(PvpFlag.GOING_OVERT) || enemies && object.hasPvpFlag(PvpFlag.GOING_COVERT) ) From 46e43a5c6530d16f211cc8397bc164c6317b7ba7 Mon Sep 17 00:00:00 2001 From: Zach Date: Sun, 27 Sep 2015 22:43:02 -0400 Subject: [PATCH 30/32] S'more conventions. --- src/network/packets/swg/zone/UpdatePvpStatusMessage.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/network/packets/swg/zone/UpdatePvpStatusMessage.java b/src/network/packets/swg/zone/UpdatePvpStatusMessage.java index 3c19c5b99..cba28afe7 100644 --- a/src/network/packets/swg/zone/UpdatePvpStatusMessage.java +++ b/src/network/packets/swg/zone/UpdatePvpStatusMessage.java @@ -58,13 +58,9 @@ public class UpdatePvpStatusMessage extends SWGPacket { PvpFlag tempFlag = flags.iterator().next(); if (tempFlag!= null) - { flag = flags.iterator().next(); - } else - { flag = PvpFlag.PLAYER; - } playerFaction = getInt(data); objId = getLong(data); } From 25fd974edcb8111e208a7c7c53c98583f5674feb Mon Sep 17 00:00:00 2001 From: Obique PSWG Date: Mon, 28 Sep 2015 08:44:18 -0500 Subject: [PATCH 31/32] Fixed serialVersionUID in TangibleObject --- src/resources/objects/tangible/TangibleObject.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/resources/objects/tangible/TangibleObject.java b/src/resources/objects/tangible/TangibleObject.java index 97dc9e36a..5f0a637da 100644 --- a/src/resources/objects/tangible/TangibleObject.java +++ b/src/resources/objects/tangible/TangibleObject.java @@ -39,7 +39,7 @@ import resources.player.Player; public class TangibleObject extends SWGObject { - private static final long serialVersionUID = 2L; + private static final long serialVersionUID = 1L; private byte [] appearanceData = new byte[0]; private int damageTaken = 0; From cd763e1bf249b330cb83f810d604f7bc537e75d3 Mon Sep 17 00:00:00 2001 From: Waverunner Date: Mon, 28 Sep 2015 11:15:49 -0400 Subject: [PATCH 32/32] Updated RadialItem enumerators --- src/resources/radial/RadialItem.java | 444 +++++++++++++++++++-------- 1 file changed, 323 insertions(+), 121 deletions(-) diff --git a/src/resources/radial/RadialItem.java b/src/resources/radial/RadialItem.java index 5551fa5db..221f9d83e 100644 --- a/src/resources/radial/RadialItem.java +++ b/src/resources/radial/RadialItem.java @@ -4,127 +4,329 @@ import java.util.Hashtable; import java.util.Map; public enum RadialItem { - UNKNOWN (""), - COMBAT_TARGET (""), - COMBAT_UNTARGET (""), - COMBAT_ATTACK (""), - COMBAT_PEACE (""), - COMBAT_DUEL (""), - COMBAT_DEATH_BLOW (""), - EXAMINE (""), - EXAMINE_CHARACTERSHEET (""), - TRADE_START (""), - TRADE_ACCEPT (""), - ITEM_PICKUP (""), - ITEM_EQUIP (""), - ITEM_UNEQUIP (""), - ITEM_DROP (""), - ITEM_DESTROY (""), - ITEM_TOKEN (""), - ITEM_OPEN (""), - ITEM_OPEN_NEW_WINDOW (""), - ITEM_ACTIVATE (""), - ITEM_DEACTIVATE (""), - ITEM_USE (""), - ITEM_USE_SELF (""), - ITEM_USE_OTHER (""), - ITEM_SIT (""), - ITEM_MAIL (""), - CONVERSE_START (""), - CONVERSE_RESPOND (""), - CONVERSE_RESPONSE (""), - CONVERSE_STOP (""), - CRAFT_OPTIONS (""), - CRAFT_START (""), - CRAFT_HOPPER_INPUT (""), - CRAFT_HOPPER_OUTPUT (""), - TERMINAL_MISSION_LIST (""), - MISSION_DETAILS (""), - LOOT (""), - LOOT_ALL (""), - GROUP_INVITE (""), - GROUP_JOIN (""), - GROUP_LEAVE (""), - GROUP_KICK (""), - GROUP_DISBAND (""), - GROUP_DECLINE (""), - EXTRACT_OBJECT (""), - PET_CALL (""), - TERMINAL_AUCTION_USE (""), - CREATURE_FOLLOW (""), - CREATURE_STOP_FOLLOW (""), - SPLIT (""), - IMAGEDESIGN (""), - SET_NAME (""), - ITEM_ROTATE (""), - ITEM_ROTATE_RIGHT (""), - ITEM_ROTATE_LEFT (""), - ITEM_MOVE (""), - ITEM_MOVE_FORWARD (""), - ITEM_MOVE_BACK (""), - ITEM_MOVE_UP (""), - ITEM_MOVE_DOWN (""), - PET_STORE (""), - VEHICLE_GENERATE (""), - VEHICLE_STORE (""), - MISSION_ABORT (""), - MISSION_END_DUTY (""), - SHIP_MANAGE_COMPONENTS (""), - WAYPOINT_AUTOPILOT (""), - PROGRAM_DROID (""), - VEHICLE_OFFER_RIDE (""), - ITEM_PUBLIC_CONTAINER_USE1 (""), - COLLECTIONS (""), - GROUP_MASTER_LOOTER (""), - GROUP_MAKE_LEADER (""), - GROUP_LOOT (""), - ITEM_ROTATE_FORWARD (""), - ITEM_ROTATE_BACKWARD (""), - ITEM_ROTATE_CLOCKWISE (""), - ITEM_ROTATE_COUNTERCLOCKWISE (""), - ITEM_ROTATE_RANDOM (""), - ITEM_ROTATE_RANDOM_YAW (""), - ITEM_ROTATE_RANDOM_PITCH (""), - ITEM_ROTATE_RANDOM_ROLL (""), - ITEM_ROTATE_RESET (""), - ITEM_ROTATE_COPY (""), - ITEM_MOVE_COPY_LOCATION (""), - ITEM_MOVE_COPY_HEIGHT (""), - GROUP_TELL (""), - ITEM_WP_SETCOLOR (""), - ITEM_WP_SETCOLOR_BLUE (""), - ITEM_WP_SETCOLOR_GREEN (""), - ITEM_WP_SETCOLOR_ORANGE (""), - ITEM_WP_SETCOLOR_YELLOW (""), - ITEM_WP_SETCOLOR_PURPLE (""), - ITEM_WP_SETCOLOR_WHITE (""), - ITEM_MOVE_LEFT (""), - ITEM_MOVE_RIGHT (""), - ROTATE_APPLY (""), - ROTATE_RESET (""), - WINDOW_LOCK (""), - WINDOW_UNLOCK (""), - GROUP_CREATE_PICKUP_POINT (""), - GROUP_USE_PICKUP_POINT (""), - GROUP_USE_PICKUP_POINT_NOCAMP (""), - VOICE_SHORTLIST_REMOVE (""), - VOICE_INVITE (""), - VOICE_KICK (""), - ITEM_EQUIP_APPEARANCE (""), - ITEM_UNEQUIP_APPEARANCE (""), - OPEN_STORYTELLER_RECIPE (""), - CLIENT_MENU_LAST (""), - SERVER_MENU1 (""), - SERVER_MENU2 (""), - SERVER_PET_MOUNT (""), - SERVER_VEHICLE_ENTER_EXIT (""), - BANK_TRANSFER ("@sui:bank_credits"), - BANK_ITEMS ("@sui:bank_items"), - BANK_WITHDRAW_ALL ("@sui:bank_withdrawall"), - BANK_DEPOSIT_ALL ("@sui:bank_depositall"), - BANK_RESERVE ("@sui:bank_galactic_reserve"), - BANK_RESERVE_WITHDRAW ("@sui:bank_galactic_reserve_withdraw"), - BANK_RESERVE_DEPOSIT ("@sui:bank_galactic_reserve_deposit"); + UNKNOWN (""), + COMBAT_TARGET (""), + COMBAT_UNTARGET (""), + COMBAT_ATTACK (""), + COMBAT_PEACE (""), + COMBAT_DUEL (""), + COMBAT_DEATH_BLOW (""), + EXAMINE (""), + EXAMINE_CHARACTERSHEET (""), + TRADE_START (""), + TRADE_ACCEPT (""), + ITEM_PICKUP (""), + ITEM_EQUIP (""), + ITEM_UNEQUIP (""), + ITEM_DROP (""), + ITEM_DESTROY (""), + ITEM_TOKEN (""), + ITEM_OPEN (""), + ITEM_OPEN_NEW_WINDOW (""), + ITEM_ACTIVATE (""), + ITEM_DEACTIVATE (""), + ITEM_USE (""), + ITEM_USE_SELF (""), + ITEM_USE_OTHER (""), + ITEM_SIT (""), + ITEM_MAIL (""), + CONVERSE_START (""), + CONVERSE_RESPOND (""), + CONVERSE_RESPONSE (""), + CONVERSE_STOP (""), + CRAFT_OPTIONS (""), + CRAFT_START (""), + CRAFT_HOPPER_INPUT (""), + CRAFT_HOPPER_OUTPUT (""), + MISSION_TERMINAL_LIST (""), + MISSION_DETAILS (""), + LOOT (""), + LOOT_ALL (""), + GROUP_INVITE (""), + GROUP_JOIN (""), + GROUP_LEAVE (""), + GROUP_KICK (""), + GROUP_DISBAND (""), + GROUP_DECLINE (""), + EXTRACT_OBJECT (""), + PET_CALL (""), + TERMINAL_AUCTION_USE (""), + CREATURE_FOLLOW (""), + CREATURE_STOP_FOLLOW (""), + SPLIT (""), + IMAGEDESIGN (""), + SET_NAME (""), + ITEM_ROTATE (""), + ITEM_ROTATE_LEFT (""), + ITEM_MOVE (""), + ITEM_MOVE_FORWARD (""), + ITEM_MOVE_BACK (""), + ITEM_MOVE_UP (""), + ITEM_MOVE_DOWN (""), + PET_STORE (""), + VEHICLE_GENERATE (""), + VEHICLE_STORE (""), + MISSION_ABORT (""), + MISSION_END_DUTY (""), + SHIP_MANAGE_COMPONENTS (""), + WAYPOINT_AUTOPILOT (""), + PROGRAM_DROID (""), + VEHICLE_OFFER_RIDE (""), + ITEM_PUBLIC_CONTAINER_USE1 (""), + COLLECTIONS (""), + GROUP_MASTER_LOOTER (""), + GROUP_MAKE_LEADER (""), + GROUP_LOOT (""), + ITEM_ROTATE_BACKWARD (""), + ITEM_ROTATE_COUNTERCLOCKWISE (""), + ITEM_ROTATE_RANDOM (""), + ITEM_ROTATE_RANDOM_YAW (""), + ITEM_ROTATE_RANDOM_PITCH (""), + ITEM_ROTATE_RANDOM_ROLL (""), + ITEM_ROTATE_RESET (""), + ITEM_ROTATE_COPY (""), + ITEM_MOVE_COPY_LOCATION (""), + ITEM_MOVE_COPY_HEIGHT (""), + GROUP_TELL (""), + ITEM_WP_SETCOLOR (""), + ITEM_WP_SETCOLOR_BLUE (""), + ITEM_WP_SETCOLOR_GREEN (""), + ITEM_WP_SETCOLOR_ORANGE (""), + ITEM_WP_SETCOLOR_YELLOW (""), + ITEM_WP_SETCOLOR_PURPLE (""), + ITEM_WP_SETCOLOR_WHITE (""), + ITEM_MOVE_LEFT (""), + ITEM_MOVE_RIGHT (""), + ROTATE_APPLY (""), + ROTATE_RESET (""), + WINDOW_LOCK (""), + WINDOW_UNLOCK (""), + GROUP_CREATE_PICKUP_POINT (""), + GROUP_USE_PICKUP_POINT (""), + GROUP_USE_PICKUP_POINT_NOCAMP (""), + VOICE_SHORTLIST_REMOVE (""), + VOICE_INVITE (""), + VOICE_KICK (""), + ITEM_EQUIP_APPEARANCE (""), + ITEM_UNEQUIP_APPEARANCE (""), + OPEN_STORYTELLER_RECIPE (""), + SERVER_DIVIDER (""), + SERVER_MENU1 (""), + SERVER_MENU2 (""), + SERVER_MENU3 (""), + SERVER_MENU4 (""), + SERVER_MENU5 (""), + SERVER_MENU6 (""), + SERVER_MENU7 (""), + SERVER_MENU8 (""), + SERVER_MENU9 (""), + SERVER_MENU10 (""), + SERVER_MENU11 (""), + SERVER_MENU12 (""), + SERVER_MENU13 (""), + SERVER_MENU14 (""), + SERVER_MENU15 (""), + SERVER_MENU16 (""), + SERVER_MENU17 (""), + SERVER_MENU18 (""), + SERVER_MENU19 (""), + SERVER_MENU20 (""), + SERVER_MENU21 (""), + SERVER_MENU22 (""), + SERVER_MENU23 (""), + SERVER_MENU24 (""), + SERVER_MENU25 (""), + SERVER_MENU26 (""), + SERVER_MENU27 (""), + SERVER_MENU28 (""), + SERVER_MENU29 (""), + SERVER_MENU30 (""), + SERVER_MENU31 (""), + SERVER_MENU32 (""), + SERVER_MENU33 (""), + SERVER_MENU34 (""), + SERVER_MENU35 (""), + SERVER_MENU36 (""), + SERVER_MENU37 (""), + SERVER_MENU38 (""), + SERVER_MENU39 (""), + SERVER_MENU40 (""), + SERVER_MENU41 (""), + SERVER_MENU42 (""), + SERVER_MENU43 (""), + SERVER_MENU44 (""), + SERVER_MENU45 (""), + SERVER_MENU46 (""), + SERVER_MENU47 (""), + SERVER_MENU48 (""), + SERVER_MENU49 (""), + SERVER_MENU50 (""), + SERVER_HARVESTER_MANAGE (""), + SERVER_HOUSE_MANAGE (""), + SERVER_FACTION_HALL_MANAGE (""), + SERVER_HUE (""), + SERVER_OBSERVE (""), + SERVER_STOP_OBSERVING (""), + SERVER_TRAVEL_OPTIONS (""), + SERVER_BAZAAR_OPTIONS (""), + SERVER_SHIPPING_OPTIONS (""), + SERVER_HEAL_WOUND (""), + SERVER_HEAL_WOUND_HEALTH (""), + SERVER_HEAL_WOUND_ACTION (""), + SERVER_HEAL_WOUND_STRENGTH (""), + SERVER_HEAL_WOUND_CONSTITUTION (""), + SERVER_HEAL_WOUND_QUICKNESS (""), + SERVER_HEAL_WOUND_STAMINA (""), + SERVER_HEAL_DAMAGE (""), + SERVER_HEAL_STATE (""), + SERVER_HEAL_STATE_STUNNED (""), + SERVER_HEAL_STATE_BLINDED (""), + SERVER_HEAL_STATE_DIZZY (""), + SERVER_HEAL_STATE_INTIMIDATED (""), + SERVER_HEAL_ENHANCE (""), + SERVER_HEAL_ENHANCE_HEALTH (""), + SERVER_HEAL_ENHANCE_ACTION (""), + SERVER_HEAL_ENHANCE_STRENGTH (""), + SERVER_HEAL_ENHANCE_CONSTITUTION (""), + SERVER_HEAL_ENHANCE_QUICKNESS (""), + SERVER_HEAL_ENHANCE_STAMINA (""), + SERVER_HEAL_FIRSTAID (""), + SERVER_HEAL_CURE_POISON (""), + SERVER_HEAL_CURE_DISEASE (""), + SERVER_HEAL_APPLY_POISON (""), + SERVER_HEAL_APPLY_DISEASE (""), + SERVER_HARVEST_CORPSE (""), + SERVER_PERFORMANCE_LISTEN (""), + SERVER_PERFORMANCE_WATCH (""), + SERVER_PERFORMANCE_LISTEN_STOP (""), + SERVER_PERFORMANCE_WATCH_STOP (""), + SERVER_TERMINAL_PERMISSIONS (""), + SERVER_TERMINAL_MANAGEMENT (""), + SERVER_TERMINAL_PERMISSIONS_ENTER (""), + SERVER_TERMINAL_PERMISSIONS_BANNED (""), + SERVER_TERMINAL_PERMISSIONS_ADMIN (""), + SERVER_TERMINAL_PERMISSIONS_VENDOR (""), + SERVER_TERMINAL_PERMISSIONS_HOPPER (""), + SERVER_TERMINAL_MANAGEMENT_STATUS (""), + SERVER_TERMINAL_MANAGEMENT_PRIVACY (""), + SERVER_TERMINAL_MANAGEMENT_TRANSFER (""), + SERVER_TERMINAL_MANAGEMENT_RESIDENCE (""), + SERVER_TERMINAL_MANAGEMENT_DESTROY (""), + SERVER_TERMINAL_MANAGEMENT_PAY (""), + SERVER_TERMINAL_CREATE_VENDOR (""), + SERVER_GIVE_VENDOR_MAINTENANCE (""), + SERVER_ITEM_OPTIONS (""), + SERVER_SURVEY_TOOL_RANGE (""), + SERVER_SURVEY_TOOL_RESOLUTION (""), + SERVER_SURVEY_TOOL_CLASS (""), + SERVER_PROBE_DROID_TRACK_TARGET (""), + SERVER_PROBE_DROID_FIND_TARGET (""), + SERVER_PROBE_DROID_ACTIVATE (""), + SERVER_PROBE_DROID_BUY (""), + SERVER_TEACH (""), + PET_COMMAND (""), + PET_FOLLOW (""), + PET_STAY (""), + PET_GUARD (""), + PET_FRIEND (""), + PET_ATTACK (""), + PET_PATROL (""), + PET_GET_PATROL_POINT (""), + PET_CLEAR_PATROL_POINTS (""), + PET_ASSUME_FORMATION_1 (""), + PET_ASSUME_FORMATION_2 (""), + PET_TRANSFER (""), + PET_RELEASE (""), + PET_TRICK_1 (""), + PET_TRICK_2 (""), + PET_TRICK_3 (""), + PET_TRICK_4 (""), + PET_GROUP (""), + PET_TAME (""), + PET_FEED (""), + PET_SPECIAL_ATTACK_ONE (""), + PET_SPECIAL_ATTACK_TWO (""), + PET_RANGED_ATTACK (""), + DICE_ROLL (""), + DICE_TWO_FACE (""), + DICE_THREE_FACE (""), + DICE_FOUR_FACE (""), + DICE_FIVE_FACE (""), + DICE_SIX_FACE (""), + DICE_SEVEN_FACE (""), + DICE_EIGHT_FACE (""), + DICE_COUNT_ONE (""), + DICE_COUNT_TWO (""), + DICE_COUNT_THREE (""), + DICE_COUNT_FOUR (""), + CREATE_BALLOT (""), + VOTE (""), + BOMBING_RUN (""), + SELF_DESTRUCT (""), + THIRTY_SEC (""), + FIFTEEN_SEC (""), + SERVER_CAMP_DISBAND (""), + SERVER_CAMP_ASSUME_OWNERSHIP (""), + SERVER_PROBE_DROID_PROGRAM (""), + SERVER_GUILD_CREATE ("@guild:menu_create"), + SERVER_GUILD_INFO (""), + SERVER_GUILD_MEMBERS (""), + SERVER_GUILD_SPONSORED (""), + SERVER_GUILD_ENEMIES (""), + SERVER_GUILD_SPONSOR (""), + SERVER_GUILD_DISBAND (""), + SERVER_GUILD_NAMECHANGE (""), + SERVER_GUILD_GUILD_MANAGEMENT (""), + SERVER_GUILD_MEMBER_MANAGEMENT (""), + SERVER_MANF_HOPPER_INPUT (""), + SERVER_MANF_HOPPER_OUTPUT (""), + SERVER_MANF_STATION_SCHEMATIC (""), + ELEVATOR_UP (""), + ELEVATOR_DOWN (""), + SERVER_PET_OPEN (""), + SERVER_PET_DPAD (""), + SERVER_MED_TOOL_DIAGNOSE (""), + SERVER_MED_TOOL_TENDWOUND (""), + SERVER_MED_TOOL_TENDDAMAGE (""), + SERVER_PET_DISMOUNT (""), + SERVER_PET_TRAIN_MOUNT (""), + SERVER_VEHICLE_ENTER (""), + SERVER_VEHICLE_EXIT (""), + OPEN_NAVICOMP_DPAD (""), + INIT_NAVICOMP_DPAD (""), + CITY_STATUS (""), + CITY_CITIZENS (""), + CITY_STRUCTURES (""), + CITY_TREASURY (""), + CITY_MANAGEMENT (""), + CITY_NAME (""), + CITY_MILITIA (""), + CITY_TAXES (""), + CITY_TREASURY_DEPOSIT (""), + CITY_TREASURY_WITHDRAW (""), + CITY_REGISTER (""), + CITY_RANK (""), + CITY_ADMIN_1 (""), + CITY_ADMIN_2 (""), + CITY_ADMIN_3 (""), + CITY_ADMIN_4 (""), + CITY_ADMIN_5 (""), + CITY_ADMIN_6 (""), + MEMORY_CHIP_PROGRAM (""), + MEMORY_CHIP_TRANSFER (""), + MEMORY_CHIP_ANALYZE (""), + EQUIP_DROID_ON_SHIP (""), + BIO_LINK (""), + LANDMINE_DISARM (""), + LANDMINE_REVERSE_TRIGGER (""), + REWARD_TRADE_IN (""), + BANK_TRANSFER ("@sui:bank_credits"), + BANK_ITEMS ("@sui:bank_items"), + BANK_WITHDRAW_ALL ("@sui:bank_withdrawall"), + BANK_DEPOSIT_ALL ("@sui:bank_depositall"), + BANK_RESERVE ("@sui:bank_galactic_reserve"), + BANK_RESERVE_WITHDRAW ("@sui:bank_galactic_reserve_withdraw"), + BANK_RESERVE_DEPOSIT ("@sui:bank_galactic_reserve_deposit"); private static final Map INT_TO_ITEM = new Hashtable<>(values().length); private int id;