From 017cf5f26833ab0b9c1b81ee03febac53cf3f3eb Mon Sep 17 00:00:00 2001 From: Obique PSWG Date: Mon, 10 Aug 2015 09:02:48 -0500 Subject: [PATCH] Refactored Radial code again to be easier to use and added Galactic Reserve --- scripts/radial/terminal/bank.js | 51 +++- .../object_controller/ObjectMenuRequest.java | 51 +--- .../object_controller/ObjectMenuResponse.java | 49 +--- .../objects/creature/CreatureObject.java | 61 ++++- src/resources/radial/RadialItem.java | 245 +++++++++--------- src/resources/radial/RadialItemInit.java | 13 + src/resources/radial/RadialOption.java | 39 ++- src/resources/radial/RadialOptionList.java | 138 ++++++++++ src/services/objects/RadialService.java | 2 +- 9 files changed, 416 insertions(+), 233 deletions(-) create mode 100644 src/resources/radial/RadialItemInit.java create mode 100644 src/resources/radial/RadialOptionList.java diff --git a/scripts/radial/terminal/bank.js b/scripts/radial/terminal/bank.js index c8db7d645..70c936c41 100644 --- a/scripts/radial/terminal/bank.js +++ b/scripts/radial/terminal/bank.js @@ -1,13 +1,22 @@ var getOptions = function(options, player, target) { - options.add(new RadialOption(0, RadialItem.ITEM_USE)); - options.add(new RadialOption(0, RadialItem.EXAMINE)); - options.add(new RadialOption(1, RadialItem.BANK_TRANSFER)); - options.add(new RadialOption(1, RadialItem.BANK_ITEMS)); + use = new RadialOption(RadialItem.ITEM_USE); + use.addChild(new RadialOption(RadialItem.BANK_TRANSFER)); + use.addChild(new RadialOption(RadialItem.BANK_ITEMS)); + options.add(use); + options.add(new RadialOption(RadialItem.EXAMINE)); creature = player.getCreatureObject(); if (creature.getBankBalance() > 0) - options.add(new RadialOption(1, RadialItem.BANK_WITHDRAW_ALL)); + use.addChild(new RadialOption(RadialItem.BANK_WITHDRAW_ALL)); if (creature.getCashBalance() > 0) - options.add(new RadialOption(1, RadialItem.BANK_DEPOSIT_ALL)); + use.addChild(new RadialOption(RadialItem.BANK_DEPOSIT_ALL)); + if (creature.getBankBalance() >= 1E9 || creature.getCashBalance() >= 1E9 || creature.getReserveBalance() > 0) { + reserve = new RadialOption(RadialItem.BANK_RESERVE); + if (creature.getBankBalance() >= 1E9 || creature.getCashBalance() >= 1E9) + reserve.addChild(new RadialOption(RadialItem.BANK_RESERVE_DEPOSIT)); + if (creature.getReserveBalance() > 0) + reserve.addChild(new RadialOption(RadialItem.BANK_RESERVE_WITHDRAW)); + options.add(reserve); + } }; var handleSelection = function(player, target, selection) { switch (selection) { @@ -51,6 +60,8 @@ var handleSelection = function(player, target, selection) { creature.setBankBalance(0); if (amount > 0) intentFactory.sendSystemMessage(player, "You successfully withdraw " + amount + " credits from your account."); + else + intentFactory.sendSystemMessage(player, '@error_message:bank_withdraw'); break; } case RadialItem.BANK_DEPOSIT_ALL: { @@ -60,6 +71,34 @@ var handleSelection = function(player, target, selection) { creature.setCashBalance(0); if (amount > 0) intentFactory.sendSystemMessage(player, "You successfully deposit " + amount + " credits to your account."); + else + intentFactory.sendSystemMessage(player, '@error_message:bank_deposit'); + break; + } + case RadialItem.BANK_RESERVE_DEPOSIT: { + creature = player.getCreatureObject(); + amount = creature.getBankBalance(); + if (amount > 1E9) + amount = 1E9; + if (creature.getReserveBalance() + amount > 3E9 || amount == 0) { + intentFactory.sendSystemMessage(player, '@error_message:bank_deposit') + break; + } + creature.setBankBalance(creature.getBankBalance() - amount); + creature.setReserveBalance(creature.getReserveBalance() + amount); + break; + } + case RadialItem.BANK_RESERVE_WITHDRAW: { + creature = player.getCreatureObject(); + amount = creature.getReserveBalance(); + if (amount > 1E9) + amount = 1E9; + if (creature.getBankBalance() + amount > 2E9 || amount == 0) { + intentFactory.sendSystemMessage(player, '@error_message:bank_withdraw') + break; + } + creature.setBankBalance(creature.getBankBalance() + amount); + creature.setReserveBalance(creature.getReserveBalance() - amount); break; } } diff --git a/src/network/packets/swg/zone/object_controller/ObjectMenuRequest.java b/src/network/packets/swg/zone/object_controller/ObjectMenuRequest.java index 947dfca56..73b12ba69 100644 --- a/src/network/packets/swg/zone/object_controller/ObjectMenuRequest.java +++ b/src/network/packets/swg/zone/object_controller/ObjectMenuRequest.java @@ -28,79 +28,56 @@ package network.packets.swg.zone.object_controller; import java.nio.ByteBuffer; -import java.util.ArrayList; import java.util.List; - import resources.radial.RadialOption; +import resources.radial.RadialOptionList; public class ObjectMenuRequest extends ObjectController { public static final int CRC = 0x0146; private long targetId; - private long requesterId; - private List options; + private long requestorId; + private RadialOptionList options; private byte counter; public ObjectMenuRequest(long objectId) { super(objectId, CRC); - options = new ArrayList(); + options = new RadialOptionList(); } public ObjectMenuRequest(ByteBuffer data) { super(CRC); - options = new ArrayList(); + options = new RadialOptionList(); decode(data); } public void decode(ByteBuffer data) { decodeHeader(data); - targetId = getLong(data); - requesterId = getLong(data); - - int optionsCount = getInt(data); - for (int i = 0; i < optionsCount; i++) { - RadialOption option = new RadialOption(); - getByte(data); // option number - option.setParentId(getByte(data)); - option.setId(getShort(data)); - option.setOptionType(getByte(data)); - option.setText(getUnicode(data)); - options.add(option); - } + requestorId = getLong(data); + options = getEncodable(data, RadialOptionList.class); counter = getByte(data); } public ByteBuffer encode() { - int optSize = 21; - for (RadialOption option : options) - optSize += 7 + option.getText().length()*2; - ByteBuffer data = ByteBuffer.allocate(HEADER_LENGTH + optSize); + ByteBuffer data = ByteBuffer.allocate(HEADER_LENGTH + options.getSize() + 17); encodeHeader(data); addLong(data, targetId); - addLong(data, requesterId); - addInt(data, options.size()); - int optNum = 1; - for (RadialOption option : options) { - addByte(data, optNum++); // option number - addByte(data, option.getParentId()); - addShort(data, option.getId()); - addByte(data, option.getOptionType()); - addUnicode(data, option.getText()); - } + addLong(data, requestorId); + addEncodable(data, options); addByte(data, counter); return data; } public long getTargetId() { return targetId; } - public long getRequesterId() { return requesterId; } + public long getRequestorId() { return requestorId; } public int getCounter() { return counter; } - public List getOptions() { return options; } + public List getOptions() { return options.getOptions(); } public void setTargetId(long targetId) { this.targetId = targetId; } - public void setRequesterId(long requesterId) { this.requesterId = requesterId; } + public void setRequestorId(long requesterId) { this.requestorId = requesterId; } public void setCounter(byte counter) { this.counter = counter; } - public void addOption(RadialOption opt) { options.add(opt); } + public void addOption(RadialOption opt) { options.addOption(opt); } } diff --git a/src/network/packets/swg/zone/object_controller/ObjectMenuResponse.java b/src/network/packets/swg/zone/object_controller/ObjectMenuResponse.java index 03807fd16..6620c7863 100644 --- a/src/network/packets/swg/zone/object_controller/ObjectMenuResponse.java +++ b/src/network/packets/swg/zone/object_controller/ObjectMenuResponse.java @@ -28,29 +28,30 @@ package network.packets.swg.zone.object_controller; import java.nio.ByteBuffer; -import java.util.ArrayList; import java.util.List; import resources.radial.RadialOption; +import resources.radial.RadialOptionList; public class ObjectMenuResponse extends ObjectController { public static final int CRC = 0x0147; + private RadialOptionList options; private long targetId; private long requestorId; - private List options; private int counter; public ObjectMenuResponse(long objectId) { super(objectId, CRC); + this.options = new RadialOptionList(); } public ObjectMenuResponse(long objectId, long targetId, long requestorId, List options, int counter) { super(objectId, CRC); this.targetId = targetId; this.requestorId = requestorId; - this.options = options; + this.options = new RadialOptionList(options); this.counter = counter; setTargetId(targetId); setRequestorId(requestorId); @@ -60,7 +61,7 @@ public class ObjectMenuResponse extends ObjectController { public ObjectMenuResponse(ByteBuffer data) { super(CRC); - options = new ArrayList<>(); + this.options = new RadialOptionList(); decode(data); } @@ -68,46 +69,16 @@ public class ObjectMenuResponse extends ObjectController { decodeHeader(data); targetId = getLong(data); requestorId = getLong(data); - int optionCount = getInt(data); - for (int i = 0; i < optionCount; i++) { - RadialOption option = new RadialOption(); - getByte(data); // option number - option.setParentId(getByte(data)); - option.setId(getShort(data)); - option.setOptionType(getByte(data)); - option.setText(getUnicode(data)); - options.add(option); - } + options = getEncodable(data, RadialOptionList.class); counter = getByte(data); } public ByteBuffer encode() { - int optionsDataSize = 0; - for (RadialOption o : options) { - optionsDataSize += 9; - if (o.getText() != null && !o.getText().isEmpty()) - optionsDataSize += o.getText().length()*2; - else - optionsDataSize += 4; - } - ByteBuffer data = ByteBuffer.allocate(HEADER_LENGTH + optionsDataSize + 21); + ByteBuffer data = ByteBuffer.allocate(HEADER_LENGTH + options.getSize() + 17); encodeHeader(data); - addLong(data, targetId); addLong(data, requestorId); - - addInt(data, options.size()); - for (int i = 0; i < options.size(); i++) { - RadialOption option = options.get(i); - addByte(data, i + 1); - addByte(data, option.getParentId()); - addShort(data, option.getId()); - addByte(data, option.getOptionType()); - if (option.getText() != null || !option.getText().isEmpty()) - addUnicode(data, option.getText()); - else - data.putInt(0); - } + addEncodable(data, options); addByte(data, counter); return data; } @@ -121,7 +92,7 @@ public class ObjectMenuResponse extends ObjectController { } public void setRadialOptions(List options) { - this.options = options; + this.options.setOptions(options); } public void setCounter(int counter) { @@ -137,7 +108,7 @@ public class ObjectMenuResponse extends ObjectController { } public List getOptions() { - return options; + return options.getOptions(); } public int getCounter() { diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index a2f5eedb0..3b2e0974e 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -71,6 +71,7 @@ public class CreatureObject extends TangibleObject { private CreatureDifficulty difficulty = CreatureDifficulty.NORMAL; private int cashBalance = 0; private int bankBalance = 0; + private long reserveBalance = 0; // Galactic Reserve - capped at 3 billion private String moodAnimation = "neutral"; private String animation = ""; private long equippedWeaponId = 0; @@ -172,6 +173,10 @@ public class CreatureObject extends TangibleObject { public int getBankBalance() { return bankBalance; } + + public long getReserveBalance() { + return reserveBalance; + } public Posture getPosture() { return posture; @@ -263,14 +268,58 @@ public class CreatureObject extends TangibleObject { this.race = race; } - public void setCashBalance(int cashBalance) { - this.cashBalance = cashBalance; - sendDelta(1, 1, cashBalance); + public void setCashBalance(long cashBalance) { + if (cashBalance < 0) + cashBalance = 0; + if (cashBalance > 2E9) { // 2 billion cap + long leftover = cashBalance - (long)2E9; + cashBalance = (long) 2E9; + long bank = bankBalance + leftover; + long reserve = reserveBalance; + leftover = bank - (long) 2E9; + if (leftover > 0) { + bank = (long)2E9; + reserve += leftover; + } + this.cashBalance = (int) cashBalance; + sendDelta(1, 1, cashBalance); + setBankBalance(bank); + setReserveBalance(reserve); + } else { + this.cashBalance = (int) cashBalance; + sendDelta(1, 1, (int) cashBalance); + } } - public void setBankBalance(int bankBalance) { - this.bankBalance = bankBalance; - sendDelta(1, 0, bankBalance); + public void setBankBalance(long bankBalance) { + if (bankBalance < 0) + bankBalance = 0; + if (bankBalance > 2E9) { // 2 billion cap + long leftover = bankBalance - (long)2E9; + bankBalance = (long) 2E9; + long cash = cashBalance + leftover; + long reserve = reserveBalance; + leftover = cash - (long) 2E9; + if (leftover > 0) { + cash = (long)2E9; + reserve += leftover; + } + this.bankBalance = (int) bankBalance; + sendDelta(1, 0, bankBalance); + setCashBalance(cash); + setReserveBalance(reserve); + } else { + this.bankBalance = (int) bankBalance; + sendDelta(1, 0, (int) bankBalance); + } + } + + public void setReserveBalance(long reserveBalance) { + if (reserveBalance < 0) + reserveBalance = 0; + else if (reserveBalance > 3E9) + reserveBalance = (long) 3E9; // 3 billion cap + this.reserveBalance = reserveBalance; } public void setMovementScale(double movementScale) { diff --git a/src/resources/radial/RadialItem.java b/src/resources/radial/RadialItem.java index 96b206408..5551fa5db 100644 --- a/src/resources/radial/RadialItem.java +++ b/src/resources/radial/RadialItem.java @@ -4,124 +4,127 @@ import java.util.Hashtable; import java.util.Map; public enum RadialItem { - UNKNOWN (0x0000, ""), - COMBAT_TARGET (0x0001, ""), - COMBAT_UNTARGET (0x0002, ""), - COMBAT_ATTACK (0x0003, ""), - COMBAT_PEACE (0x0004, ""), - COMBAT_DUEL (0x0005, ""), - COMBAT_DEATH_BLOW (0x0006, ""), - EXAMINE (0x0007, ""), - EXAMINE_CHARACTERSHEET (0x0008, ""), - TRADE_START (0x0009, ""), - TRADE_ACCEPT (0x000A, ""), - ITEM_PICKUP (0x000B, ""), - ITEM_EQUIP (0x000C, ""), - ITEM_UNEQUIP (0x000D, ""), - ITEM_DROP (0x000E, ""), - ITEM_DESTROY (0x000F, ""), - ITEM_TOKEN (0x0010, ""), - ITEM_OPEN (0x0011, ""), - ITEM_OPEN_NEW_WINDOW (0x0012, ""), - ITEM_ACTIVATE (0x0013, ""), - ITEM_DEACTIVATE (0x0014, ""), - ITEM_USE (0x0015, ""), - ITEM_USE_SELF (0x0016, ""), - ITEM_USE_OTHER (0x0017, ""), - ITEM_SIT (0x0018, ""), - ITEM_MAIL (0x0019, ""), - CONVERSE_START (0x001A, ""), - CONVERSE_RESPOND (0x001B, ""), - CONVERSE_RESPONSE (0x001C, ""), - CONVERSE_STOP (0x001D, ""), - CRAFT_OPTIONS (0x001E, ""), - CRAFT_START (0x001F, ""), - CRAFT_HOPPER_INPUT (0x0020, ""), - CRAFT_HOPPER_OUTPUT (0x0021, ""), - TERMINAL_MISSION_LIST (0x0022, ""), - MISSION_DETAILS (0x0023, ""), - LOOT (0x0024, ""), - LOOT_ALL (0x0025, ""), - GROUP_INVITE (0x0026, ""), - GROUP_JOIN (0x0027, ""), - GROUP_LEAVE (0x0028, ""), - GROUP_KICK (0x0029, ""), - GROUP_DISBAND (0x002A, ""), - GROUP_DECLINE (0x002B, ""), - EXTRACT_OBJECT (0x002C, ""), - PET_CALL (0x002D, ""), - TERMINAL_AUCTION_USE (0x002E, ""), - CREATURE_FOLLOW (0x002F, ""), - CREATURE_STOP_FOLLOW (0x0030, ""), - SPLIT (0x0031, ""), - IMAGEDESIGN (0x0032, ""), - SET_NAME (0x0033, ""), - ITEM_ROTATE (0x0034, ""), - ITEM_ROTATE_RIGHT (0x0035, ""), - ITEM_ROTATE_LEFT (0x0036, ""), - ITEM_MOVE (0x0037, ""), - ITEM_MOVE_FORWARD (0x0038, ""), - ITEM_MOVE_BACK (0x0039, ""), - ITEM_MOVE_UP (0x003A, ""), - ITEM_MOVE_DOWN (0x003B, ""), - PET_STORE (0x003C, ""), - VEHICLE_GENERATE (0x003D, ""), - VEHICLE_STORE (0x003E, ""), - MISSION_ABORT (0x003F, ""), - MISSION_END_DUTY (0x0040, ""), - SHIP_MANAGE_COMPONENTS (0x0041, ""), - WAYPOINT_AUTOPILOT (0x0042, ""), - PROGRAM_DROID (0x0043, ""), - VEHICLE_OFFER_RIDE (0x0044, ""), - ITEM_PUBLIC_CONTAINER_USE1 (0x0045, ""), - COLLECTIONS (0x0046, ""), - GROUP_MASTER_LOOTER (0x0047, ""), - GROUP_MAKE_LEADER (0x0048, ""), - GROUP_LOOT (0x0049, ""), - ITEM_ROTATE_FORWARD (0x004A, ""), - ITEM_ROTATE_BACKWARD (0x004B, ""), - ITEM_ROTATE_CLOCKWISE (0x004C, ""), - ITEM_ROTATE_COUNTERCLOCKWISE (0x004D, ""), - ITEM_ROTATE_RANDOM (0x004E, ""), - ITEM_ROTATE_RANDOM_YAW (0x004F, ""), - ITEM_ROTATE_RANDOM_PITCH (0x0050, ""), - ITEM_ROTATE_RANDOM_ROLL (0x0051, ""), - ITEM_ROTATE_RESET (0x0052, ""), - ITEM_ROTATE_COPY (0x0053, ""), - ITEM_MOVE_COPY_LOCATION (0x0054, ""), - ITEM_MOVE_COPY_HEIGHT (0x0055, ""), - GROUP_TELL (0x0056, ""), - ITEM_WP_SETCOLOR (0x0057, ""), - ITEM_WP_SETCOLOR_BLUE (0x0058, ""), - ITEM_WP_SETCOLOR_GREEN (0x0059, ""), - ITEM_WP_SETCOLOR_ORANGE (0x005A, ""), - ITEM_WP_SETCOLOR_YELLOW (0x005B, ""), - ITEM_WP_SETCOLOR_PURPLE (0x005C, ""), - ITEM_WP_SETCOLOR_WHITE (0x005D, ""), - ITEM_MOVE_LEFT (0x005E, ""), - ITEM_MOVE_RIGHT (0x005F, ""), - ROTATE_APPLY (0x0060, ""), - ROTATE_RESET (0x0061, ""), - WINDOW_LOCK (0x0062, ""), - WINDOW_UNLOCK (0x0063, ""), - GROUP_CREATE_PICKUP_POINT (0x0064, ""), - GROUP_USE_PICKUP_POINT (0x0065, ""), - GROUP_USE_PICKUP_POINT_NOCAMP (0x0066, ""), - VOICE_SHORTLIST_REMOVE (0x0067, ""), - VOICE_INVITE (0x0068, ""), - VOICE_KICK (0x0069, ""), - ITEM_EQUIP_APPEARANCE (0x006A, ""), - ITEM_UNEQUIP_APPEARANCE (0x006B, ""), - OPEN_STORYTELLER_RECIPE (0x006C, ""), - CLIENT_MENU_LAST (0x006D, ""), - SERVER_MENU1 (0x006E, ""), - SERVER_MENU2 (0x006F, ""), - BANK_TRANSFER (0x0070, "@sui:bank_credits"), - BANK_ITEMS (0x0071, "@sui:bank_items"), - BANK_WITHDRAW_ALL (0x0072, "@sui:bank_withdrawall"), - BANK_DEPOSIT_ALL (0x0073, "@sui:bank_depositall"), - SERVER_PET_MOUNT (0x011F, ""), - SERVER_VEHICLE_ENTER_EXIT (0x0124, ""); + 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"); private static final Map INT_TO_ITEM = new Hashtable<>(values().length); private int id; @@ -134,9 +137,9 @@ public enum RadialItem { } } - RadialItem(int id, String text) { - this.id = id; - this.optionType = 3; // Client will only select optionType:3 + RadialItem(String text) { + this.id = RadialItemInit.getNextItemId(); + this.optionType = 3; this.text = text; } diff --git a/src/resources/radial/RadialItemInit.java b/src/resources/radial/RadialItemInit.java new file mode 100644 index 000000000..98a2f0dd8 --- /dev/null +++ b/src/resources/radial/RadialItemInit.java @@ -0,0 +1,13 @@ +package resources.radial; + +import java.util.concurrent.atomic.AtomicInteger; + +class RadialItemInit { + + private static final AtomicInteger ID = new AtomicInteger(0); + + public static int getNextItemId() { + return ID.getAndIncrement(); + } + +} diff --git a/src/resources/radial/RadialOption.java b/src/resources/radial/RadialOption.java index 54c902ec2..4f73f5e01 100644 --- a/src/resources/radial/RadialOption.java +++ b/src/resources/radial/RadialOption.java @@ -27,41 +27,34 @@ ***********************************************************************************/ package resources.radial; +import java.util.ArrayList; +import java.util.List; + public class RadialOption { - private int id; - private int parentId; - private int optionType; // 1 unless the option text isn't listed in the radial item list (datatable). - ANHWiki - private String text; + private RadialItem item; + private List children; public RadialOption() { - + this.children = new ArrayList<>(); } - public RadialOption(int parentId, RadialItem id) { - this(parentId, id.getId(), id.getOptionType(), id.getText()); + public RadialOption(RadialItem item) { + this.item = item; + this.children = new ArrayList<>(); } - public RadialOption(int parentId, int id, int optionType, String text) { - this.parentId = parentId; - this.id = id; - this.optionType = optionType; - this.text = text; - } + public void setItem(RadialItem item) { this.item = item; } + public void addChild(RadialOption option) { this.children.add(option); } - public void setParentId(byte parentId) { this.parentId = parentId; } - public void setId(short id) { this.id = id; } - public void setOptionType(byte optionType) { this.optionType = optionType; } - public void setText(String text) { this.text = text; } - - public int getParentId() { return parentId; } - public int getId() { return id; } - public int getOptionType() { return optionType; } - public String getText() { return text; } + public int getId() { return item.getId(); } + public int getOptionType() { return item.getOptionType(); } + public String getText() { return item.getText(); } + public List getChildren() { return children; } @Override public String toString() { - return String.format("ID=%d Parent=%d Option=%d Text=%s", id, parentId, optionType, text); + return String.format("ID=%d Option=%d Text=%s", getId(), getOptionType(), getText()); } } diff --git a/src/resources/radial/RadialOptionList.java b/src/resources/radial/RadialOptionList.java new file mode 100644 index 000000000..16135f8b8 --- /dev/null +++ b/src/resources/radial/RadialOptionList.java @@ -0,0 +1,138 @@ +package resources.radial; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import network.packets.Packet; +import resources.encodables.Encodable; +import resources.server_info.Log; + +public class RadialOptionList implements Encodable { + + private final List options; + + public RadialOptionList() { + options = new ArrayList<>(); + } + + public RadialOptionList(List options) { + this(); + this.options.addAll(options); + } + + public void addOption(RadialOption option) { + options.add(option); + } + + public void setOptions(List options) { + this.options.clear(); + this.options.addAll(options); + } + + public List getOptions() { + return Collections.unmodifiableList(options); + } + + public void decode(ByteBuffer data) { + int optionsCount = Packet.getInt(data); + Map optionMap = new HashMap<>(); + for (int i = 0; i < optionsCount; i++) { + RadialOption option = new RadialOption(); + int opt = Packet.getByte(data); // option number + int parent = Packet.getByte(data); // parentId + int radialType = Packet.getShort(data); // radialType + Packet.getByte(data); // optionType + Packet.getUnicode(data); // text + RadialItem item = RadialItem.getFromId(radialType); + if (item == null) { + Log.e("ObjectMenuRequest", "No radial item found for: %04X"); + continue; + } + option.setItem(item); + optionMap.put(opt, option); + if (parent == 0) { + options.add(option); + } else { + RadialOption parentOpt = optionMap.get(parent); + if (parentOpt == null) { + Log.e("ObjectMenuRequest", "Parent not found! Parent=%d Option=%s", parent, option); + } else { + parentOpt.addChild(option); + } + } + } + } + + public byte [] encode() { + ByteBuffer data = ByteBuffer.allocate(4 + getOptionSize()); + Packet.addInt(data, getOptionCount()); + addOptions(data); + return data.array(); + } + + public int getSize() { + return 4 + getOptionSize(); + } + + private int getOptionCount() { + int count = 0; + for (RadialOption option : options) { + count += getOptionCount(option); + } + return count; + } + + private int getOptionSize() { + int size = 0; + for (RadialOption option : options) { + size += getOptionSize(option); + } + return size; + } + + private void addOptions(ByteBuffer data) { + int index = 1; + for (RadialOption option : options) { + index = addOption(data, option, 0, index); + } + } + + private int getOptionCount(RadialOption parent) { + int count = 1; + for (RadialOption child : parent.getChildren()) { + count += getOptionCount(child); + } + return count; + } + + private int getOptionSize(RadialOption parent) { + int size = 9; + if (parent.getText() != null && !parent.getText().isEmpty()) + size += parent.getText().length()*2; + for (RadialOption child : parent.getChildren()) { + size += getOptionSize(child); + } + return size; + } + + private int addOption(ByteBuffer data, RadialOption parent, int parentIndex, int index) { + int myIndex = index++; + Packet.addByte(data, myIndex); + Packet.addByte(data, parentIndex); + Packet.addShort(data, parent.getId()); + Packet.addByte(data, parent.getOptionType()); + if (parent.getText() != null || !parent.getText().isEmpty()) + Packet.addUnicode(data, parent.getText()); + else + data.putInt(0); + for (RadialOption option : parent.getChildren()) { + index = addOption(data, option, myIndex, index); + } + return index; + } + +} diff --git a/src/services/objects/RadialService.java b/src/services/objects/RadialService.java index d02fefb98..452cb3a80 100644 --- a/src/services/objects/RadialService.java +++ b/src/services/objects/RadialService.java @@ -59,7 +59,7 @@ public class RadialService extends Service { } private void onRequest(ObjectManager objectManager, ObjectMenuRequest request) { - SWGObject requestor = objectManager.getObjectById(request.getRequesterId()); + SWGObject requestor = objectManager.getObjectById(request.getRequestorId()); SWGObject target = objectManager.getObjectById(request.getTargetId()); if (target == null) { System.err.println(requestor + " requested a null target! ID: " + request.getTargetId());