From 54cfc197a48dbd7c91b34b336ffb1a2e0fa016c3 Mon Sep 17 00:00:00 2001 From: Obique PSWG Date: Sun, 9 Aug 2015 11:51:33 -0500 Subject: [PATCH] Added selection code for radials for use both in Java and in Javascript --- scripts/radial/terminal/bank.js | 13 +- scripts/radial/terminal/bazaar.js | 7 + scripts/radial/terminal/ticket_collector.js | 7 + scripts/radial/terminal/travel.js | 7 + src/intents/radial/RadialSelectionIntent.java | 47 ++++ src/network/PacketType.java | 1 + .../packets/swg/zone/ObjectMenuSelect.java | 57 ++++ src/resources/radial/RadialItem.java | 247 +++++++++--------- src/resources/radial/Radials.java | 10 +- .../galaxy/terminals/TerminalService.java | 37 ++- src/services/objects/RadialService.java | 27 ++ src/utilities/Scripts.java | 1 + 12 files changed, 326 insertions(+), 135 deletions(-) create mode 100644 src/intents/radial/RadialSelectionIntent.java create mode 100644 src/network/packets/swg/zone/ObjectMenuSelect.java diff --git a/scripts/radial/terminal/bank.js b/scripts/radial/terminal/bank.js index 7e6b2dc23..53551006a 100644 --- a/scripts/radial/terminal/bank.js +++ b/scripts/radial/terminal/bank.js @@ -1,6 +1,17 @@ -var getOptions = function(options) { +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)); +}; +var handleSelection = function(player, target, selection) { + switch (selection) { + case RadialItem.ITEM_USE: + case RadialItem.BANK_ITEMS: + Log.d("bank.js", "Bank Selection: BANK_ITEMS"); + break; + case RadialItem.BANK_TRANSFER: + Log.d("bank.js", "Bank Selection: BANK_TRANSFER"); + break; + } }; \ No newline at end of file diff --git a/scripts/radial/terminal/bazaar.js b/scripts/radial/terminal/bazaar.js index a0850b458..b23e62d30 100644 --- a/scripts/radial/terminal/bazaar.js +++ b/scripts/radial/terminal/bazaar.js @@ -1,4 +1,11 @@ var getOptions = function(options) { options.add(new RadialOption(0, RadialItem.ITEM_USE)); options.add(new RadialOption(0, RadialItem.EXAMINE)); +}; +var handleSelection = function(player, target, selection) { + switch (selection) { + case RadialItem.ITEM_USE: + Log.d("bazaar.js", "Bazaar Selection: ITEM_USE"); + break; + } }; \ No newline at end of file diff --git a/scripts/radial/terminal/ticket_collector.js b/scripts/radial/terminal/ticket_collector.js index a0850b458..aacd54402 100644 --- a/scripts/radial/terminal/ticket_collector.js +++ b/scripts/radial/terminal/ticket_collector.js @@ -1,4 +1,11 @@ var getOptions = function(options) { options.add(new RadialOption(0, RadialItem.ITEM_USE)); options.add(new RadialOption(0, RadialItem.EXAMINE)); +}; +var handleSelection = function(player, target, selection) { + switch (selection) { + case RadialItem.ITEM_USE: + Log.d("ticket_collector.js", "Ticket Collector Selection: ITEM_USE"); + break; + } }; \ No newline at end of file diff --git a/scripts/radial/terminal/travel.js b/scripts/radial/terminal/travel.js index a0850b458..695e15015 100644 --- a/scripts/radial/terminal/travel.js +++ b/scripts/radial/terminal/travel.js @@ -1,4 +1,11 @@ var getOptions = function(options) { options.add(new RadialOption(0, RadialItem.ITEM_USE)); options.add(new RadialOption(0, RadialItem.EXAMINE)); +}; +var handleSelection = function(player, target, selection) { + switch (selection) { + case RadialItem.ITEM_USE: + Log.d("travel.js", "Travel Selection: ITEM_USE"); + break; + } }; \ No newline at end of file diff --git a/src/intents/radial/RadialSelectionIntent.java b/src/intents/radial/RadialSelectionIntent.java new file mode 100644 index 000000000..ceb9d3e18 --- /dev/null +++ b/src/intents/radial/RadialSelectionIntent.java @@ -0,0 +1,47 @@ +package intents.radial; + +import resources.control.Intent; +import resources.objects.SWGObject; +import resources.player.Player; +import resources.radial.RadialItem; + +public class RadialSelectionIntent extends Intent { + + public static final String TYPE = "RadialSelectionIntent"; + + private Player player; + private SWGObject target; + private RadialItem selection; + + public RadialSelectionIntent(Player player, SWGObject target, RadialItem selection) { + super(TYPE); + setPlayer(player); + setTarget(target); + setSelection(selection); + } + + public void setPlayer(Player player) { + this.player = player; + } + + public void setTarget(SWGObject target) { + this.target = target; + } + + public void setSelection(RadialItem selection) { + this.selection = selection; + } + + public Player getPlayer() { + return player; + } + + public SWGObject getTarget() { + return target; + } + + public RadialItem getSelection() { + return selection; + } + +} diff --git a/src/network/PacketType.java b/src/network/PacketType.java index 657c64edd..74963bcca 100644 --- a/src/network/PacketType.java +++ b/src/network/PacketType.java @@ -169,6 +169,7 @@ public enum PacketType { // Server UI OBJECT_MENU_REQUEST (0x00000146, ObjectMenuRequest.class), OBJECT_MENU_RESPONSE (0x00000147, ObjectMenuResponse.class), + OBJECT_MENU_SELECT (ObjectMenuSelect.CRC, ObjectMenuSelect.class), SUI_CREATE_PAGE_MESSAGE (SuiCreatePageMessage.CRC, SuiCreatePageMessage.class), SUI_EVENT_NOTIFICATION (SuiEventNotification.CRC, SuiEventNotification.class), diff --git a/src/network/packets/swg/zone/ObjectMenuSelect.java b/src/network/packets/swg/zone/ObjectMenuSelect.java new file mode 100644 index 000000000..01f55d37b --- /dev/null +++ b/src/network/packets/swg/zone/ObjectMenuSelect.java @@ -0,0 +1,57 @@ +package network.packets.swg.zone; + +import java.nio.ByteBuffer; + +import network.packets.swg.SWGPacket; + +public class ObjectMenuSelect extends SWGPacket { + + public static final int CRC = getCrc("ObjectMenuSelectMessage::MESSAGE_TYPE"); + + private long objectId; + private short selection; + + public ObjectMenuSelect() { + this(0, (short) 0); + } + + public ObjectMenuSelect(long objectId, short selection) { + this.objectId = objectId; + this.selection = selection; + } + + @Override + public void decode(ByteBuffer data) { + if (!super.decode(data, CRC)) + return; + objectId = getLong(data); + selection = getShort(data); + } + + @Override + public ByteBuffer encode() { + ByteBuffer data = ByteBuffer.allocate(16); + addShort(data, 3); + addInt(data, CRC); + addLong(data, objectId); + addShort(data, selection); + return data; + } + + public void setObjectId(long objectId) { + this.objectId = objectId; + } + + public void setSelection(short selection) { + this.selection = selection; + } + + public long getObjectId() { + return objectId; + } + + public short getSelection() { + return selection; + } + +} diff --git a/src/resources/radial/RadialItem.java b/src/resources/radial/RadialItem.java index 1dfdc15e6..16da32599 100644 --- a/src/resources/radial/RadialItem.java +++ b/src/resources/radial/RadialItem.java @@ -4,122 +4,122 @@ import java.util.Hashtable; import java.util.Map; public enum RadialItem { - UNKNOWN (0x0000, 1, ""), - COMBAT_TARGET (0x0001, 1, ""), - COMBAT_UNTARGET (0x0002, 1, ""), - COMBAT_ATTACK (0x0003, 1, ""), - COMBAT_PEACE (0x0004, 1, ""), - COMBAT_DUEL (0x0005, 1, ""), - COMBAT_DEATH_BLOW (0x0006, 1, ""), - EXAMINE (0x0007, 1, ""), - EXAMINE_CHARACTERSHEET (0x0008, 1, ""), - TRADE_START (0x0009, 1, ""), - TRADE_ACCEPT (0x000A, 1, ""), - ITEM_PICKUP (0x000B, 1, ""), - ITEM_EQUIP (0x000C, 1, ""), - ITEM_UNEQUIP (0x000D, 1, ""), - ITEM_DROP (0x000E, 1, ""), - ITEM_DESTROY (0x000F, 1, ""), - ITEM_TOKEN (0x0010, 1, ""), - ITEM_OPEN (0x0011, 1, ""), - ITEM_OPEN_NEW_WINDOW (0x0012, 1, ""), - ITEM_ACTIVATE (0x0013, 1, ""), - ITEM_DEACTIVATE (0x0014, 1, ""), - ITEM_USE (0x0015, 1, ""), - ITEM_USE_SELF (0x0016, 1, ""), - ITEM_USE_OTHER (0x0017, 1, ""), - ITEM_SIT (0x0018, 1, ""), - ITEM_MAIL (0x0019, 1, ""), - CONVERSE_START (0x001A, 1, ""), - CONVERSE_RESPOND (0x001B, 1, ""), - CONVERSE_RESPONSE (0x001C, 1, ""), - CONVERSE_STOP (0x001D, 1, ""), - CRAFT_OPTIONS (0x001E, 1, ""), - CRAFT_START (0x001F, 1, ""), - CRAFT_HOPPER_INPUT (0x0020, 1, ""), - CRAFT_HOPPER_OUTPUT (0x0021, 1, ""), - TERMINAL_MISSION_LIST (0x0022, 1, ""), - MISSION_DETAILS (0x0023, 1, ""), - LOOT (0x0024, 1, ""), - LOOT_ALL (0x0025, 1, ""), - GROUP_INVITE (0x0026, 1, ""), - GROUP_JOIN (0x0027, 1, ""), - GROUP_LEAVE (0x0028, 1, ""), - GROUP_KICK (0x0029, 1, ""), - GROUP_DISBAND (0x002A, 1, ""), - GROUP_DECLINE (0x002B, 1, ""), - EXTRACT_OBJECT (0x002C, 1, ""), - PET_CALL (0x002D, 1, ""), - TERMINAL_AUCTION_USE (0x002E, 1, ""), - CREATURE_FOLLOW (0x002F, 1, ""), - CREATURE_STOP_FOLLOW (0x0030, 1, ""), - SPLIT (0x0031, 1, ""), - IMAGEDESIGN (0x0032, 1, ""), - SET_NAME (0x0033, 1, ""), - ITEM_ROTATE (0x0034, 1, ""), - ITEM_ROTATE_RIGHT (0x0035, 1, ""), - ITEM_ROTATE_LEFT (0x0036, 1, ""), - ITEM_MOVE (0x0037, 1, ""), - ITEM_MOVE_FORWARD (0x0038, 1, ""), - ITEM_MOVE_BACK (0x0039, 1, ""), - ITEM_MOVE_UP (0x003A, 1, ""), - ITEM_MOVE_DOWN (0x003B, 1, ""), - PET_STORE (0x003C, 1, ""), - VEHICLE_GENERATE (0x003D, 1, ""), - VEHICLE_STORE (0x003E, 1, ""), - MISSION_ABORT (0x003F, 1, ""), - MISSION_END_DUTY (0x0040, 1, ""), - SHIP_MANAGE_COMPONENTS (0x0041, 1, ""), - WAYPOINT_AUTOPILOT (0x0042, 1, ""), - PROGRAM_DROID (0x0043, 1, ""), - VEHICLE_OFFER_RIDE (0x0044, 1, ""), - ITEM_PUBLIC_CONTAINER_USE1 (0x0045, 1, ""), - COLLECTIONS (0x0046, 1, ""), - GROUP_MASTER_LOOTER (0x0047, 1, ""), - GROUP_MAKE_LEADER (0x0048, 1, ""), - GROUP_LOOT (0x0049, 1, ""), - ITEM_ROTATE_FORWARD (0x004A, 1, ""), - ITEM_ROTATE_BACKWARD (0x004B, 1, ""), - ITEM_ROTATE_CLOCKWISE (0x004C, 1, ""), - ITEM_ROTATE_COUNTERCLOCKWISE (0x004D, 1, ""), - ITEM_ROTATE_RANDOM (0x004E, 1, ""), - ITEM_ROTATE_RANDOM_YAW (0x004F, 1, ""), - ITEM_ROTATE_RANDOM_PITCH (0x0050, 1, ""), - ITEM_ROTATE_RANDOM_ROLL (0x0051, 1, ""), - ITEM_ROTATE_RESET (0x0052, 1, ""), - ITEM_ROTATE_COPY (0x0053, 1, ""), - ITEM_MOVE_COPY_LOCATION (0x0054, 1, ""), - ITEM_MOVE_COPY_HEIGHT (0x0055, 1, ""), - GROUP_TELL (0x0056, 1, ""), - ITEM_WP_SETCOLOR (0x0057, 1, ""), - ITEM_WP_SETCOLOR_BLUE (0x0058, 1, ""), - ITEM_WP_SETCOLOR_GREEN (0x0059, 1, ""), - ITEM_WP_SETCOLOR_ORANGE (0x005A, 1, ""), - ITEM_WP_SETCOLOR_YELLOW (0x005B, 1, ""), - ITEM_WP_SETCOLOR_PURPLE (0x005C, 1, ""), - ITEM_WP_SETCOLOR_WHITE (0x005D, 1, ""), - ITEM_MOVE_LEFT (0x005E, 1, ""), - ITEM_MOVE_RIGHT (0x005F, 1, ""), - ROTATE_APPLY (0x0060, 1, ""), - ROTATE_RESET (0x0061, 1, ""), - WINDOW_LOCK (0x0062, 1, ""), - WINDOW_UNLOCK (0x0063, 1, ""), - GROUP_CREATE_PICKUP_POINT (0x0064, 1, ""), - GROUP_USE_PICKUP_POINT (0x0065, 1, ""), - GROUP_USE_PICKUP_POINT_NOCAMP (0x0066, 1, ""), - VOICE_SHORTLIST_REMOVE (0x0067, 1, ""), - VOICE_INVITE (0x0068, 1, ""), - VOICE_KICK (0x0069, 1, ""), - ITEM_EQUIP_APPEARANCE (0x006A, 1, ""), - ITEM_UNEQUIP_APPEARANCE (0x006B, 1, ""), - OPEN_STORYTELLER_RECIPE (0x006C, 1, ""), - CLIENT_MENU_LAST (0x006D, 1, ""), - SERVER_MENU1 (0x006E, 1, ""), - SERVER_MENU2 (0x006F, 1, ""), - BANK_TRANSFER (0x0070, 3, "@sui:bank_credits"), - BANK_ITEMS (0x0071, 3, "@sui:bank_items"), - SERVER_PET_MOUNT (0x011F, 1, ""), - SERVER_VEHICLE_ENTER_EXIT (0x0124, 1, ""); + 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"), + SERVER_PET_MOUNT (0x011F, ""), + SERVER_VEHICLE_ENTER_EXIT (0x0124, ""); private static final Map INT_TO_ITEM = new Hashtable<>(values().length); private int id; @@ -132,9 +132,9 @@ public enum RadialItem { } } - RadialItem(int id, int optionType, String text) { + RadialItem(int id, String text) { this.id = id; - this.optionType = optionType; + this.optionType = 3; // Client will only select optionType:3 this.text = text; } @@ -150,4 +150,15 @@ public enum RadialItem { return text; } + /** + * Gets the RadialItem from the selection id. If the item is undefined, + * then NULL is returned + * @param id the selection id that maps to a RadialItem + * @return the RadialItem represented by the selection, or NULL if it does + * not exist + */ + public static RadialItem getFromId(int id) { + return INT_TO_ITEM.get(id); + } + } diff --git a/src/resources/radial/Radials.java b/src/resources/radial/Radials.java index 50827d2a6..b36f3eef0 100644 --- a/src/resources/radial/Radials.java +++ b/src/resources/radial/Radials.java @@ -3,20 +3,22 @@ package resources.radial; import java.util.ArrayList; import java.util.List; +import resources.objects.SWGObject; +import resources.player.Player; import utilities.Scripts; public class Radials { private static final String SCRIPT_PREFIX = "radial/"; - public static List getRadialOptions(String script, Object ... args) { + public static List getRadialOptions(String script, Player player, SWGObject target, Object ... args) { List options = new ArrayList<>(); - Scripts.invoke(SCRIPT_PREFIX + script, "getOptions", options, args); + Scripts.invoke(SCRIPT_PREFIX + script, "getOptions", options, player, target, args); return options; } - public static void handleSelection(String script, Object ... args) { - + public static void handleSelection(String script, Player player, SWGObject target, RadialItem selection, Object ... args) { + Scripts.invoke(SCRIPT_PREFIX + script, "handleSelection", player, target, selection, args); } } diff --git a/src/services/galaxy/terminals/TerminalService.java b/src/services/galaxy/terminals/TerminalService.java index b0ef6709b..4bd9f70c5 100644 --- a/src/services/galaxy/terminals/TerminalService.java +++ b/src/services/galaxy/terminals/TerminalService.java @@ -3,6 +3,7 @@ package services.galaxy.terminals; import intents.radial.RadialRegisterIntent; import intents.radial.RadialRequestIntent; import intents.radial.RadialResponseIntent; +import intents.radial.RadialSelectionIntent; import java.io.FileNotFoundException; import java.sql.PreparedStatement; @@ -41,10 +42,11 @@ public class TerminalService extends Service { getAllTemplatesStatement = iffDatabase.prepareStatement(GET_ALL_TEMPLATES_SQL); getScriptForIffStatement = iffDatabase.prepareStatement(GET_SCRIPT_FOR_IFF_SQL); } - + @Override public boolean initialize() { registerForIntent(RadialRequestIntent.TYPE); + registerForIntent(RadialSelectionIntent.TYPE); synchronized (getAllTemplatesStatement) { // Cool and fancy Java thing to auto-cleanup resources try (ResultSet set = getAllTemplatesStatement.executeQuery()) { @@ -73,17 +75,26 @@ public class TerminalService extends Service { @Override public void onIntentReceived(Intent i) { - if (i instanceof RadialRequestIntent) { - RadialRequestIntent rri = (RadialRequestIntent) i; - String script = lookupScript(rri.getTarget().getTemplate()); - if (script == null) - return; - List options = Radials.getRadialOptions(script); - if (options == null) { - Log.e("TerminalService", "Radial script '%s' had an error in executing.", script); - return; - } - new RadialResponseIntent(rri.getPlayer(), rri.getTarget(), options, rri.getRequest().getCounter()).broadcast(); + switch (i.getType()) { + case RadialRequestIntent.TYPE: + if (i instanceof RadialRequestIntent) { + RadialRequestIntent rri = (RadialRequestIntent) i; + String script = lookupScript(rri.getTarget().getTemplate()); + if (script == null) + return; + List options = Radials.getRadialOptions(script, rri.getPlayer(), rri.getTarget()); + new RadialResponseIntent(rri.getPlayer(), rri.getTarget(), options, rri.getRequest().getCounter()).broadcast(); + } + break; + case RadialSelectionIntent.TYPE: + if (i instanceof RadialSelectionIntent) { + RadialSelectionIntent rsi = (RadialSelectionIntent) i; + String script = lookupScript(rsi.getTarget().getTemplate()); + if (script == null) + return; + Radials.handleSelection(script, rsi.getPlayer(), rsi.getTarget(), rsi.getSelection()); + } + break; } } @@ -95,6 +106,8 @@ public class TerminalService extends Service { set = getScriptForIffStatement.executeQuery(); if (set.next()) return set.getString("script"); + else + Log.e("RadialService", "Cannot find script for template: " + iff); } catch (SQLException e) { e.printStackTrace(); } finally { diff --git a/src/services/objects/RadialService.java b/src/services/objects/RadialService.java index 213e4ac6d..583f3fd09 100644 --- a/src/services/objects/RadialService.java +++ b/src/services/objects/RadialService.java @@ -6,17 +6,22 @@ import java.util.Set; import resources.control.Intent; import resources.control.Service; +import network.packets.swg.zone.ObjectMenuSelect; +import network.packets.swg.zone.object_controller.CommandQueueEnqueue; import network.packets.swg.zone.object_controller.ObjectMenuRequest; import network.packets.swg.zone.object_controller.ObjectMenuResponse; import intents.network.GalacticPacketIntent; import intents.radial.RadialRegisterIntent; import intents.radial.RadialRequestIntent; import intents.radial.RadialResponseIntent; +import intents.radial.RadialSelectionIntent; import resources.objects.SWGObject; import resources.objects.creature.CreatureObject; import resources.player.Player; +import resources.radial.RadialItem; import resources.radial.RadialOption; import resources.server_info.Log; +import services.galaxy.GalacticManager; public class RadialService extends Service { @@ -40,6 +45,8 @@ public class RadialService extends Service { GalacticPacketIntent gpi = (GalacticPacketIntent) i; if (gpi.getPacket() instanceof ObjectMenuRequest) { onRequest(gpi.getObjectManager(), (ObjectMenuRequest) gpi.getPacket()); + } else if (gpi.getPacket() instanceof ObjectMenuSelect) { + onSelection(gpi.getGalacticManager(), gpi.getNetworkId(), (ObjectMenuSelect) gpi.getPacket()); } } else if (i instanceof RadialResponseIntent) { onResponse((RadialResponseIntent) i); @@ -85,6 +92,26 @@ public class RadialService extends Service { sendResponse(player, response.getTarget(), response.getOptions(), response.getCounter()); } + private void onSelection(GalacticManager galacticManager, long networkId, ObjectMenuSelect select) { + Player player = galacticManager.getPlayerManager().getPlayerFromNetworkId(networkId); + SWGObject target = galacticManager.getObjectManager().getObjectById(select.getObjectId()); + if (target == null) { + Log.e("RadialService", "Selection target [%d] does not exist!", select.getObjectId()); + return; + } + if (player == null) { + Log.e("RadialService", "Selection requestor does not exist! Target: [%d] %s", target.getObjectId(), target.getTemplate()); + return; + } + RadialItem selection = RadialItem.getFromId(select.getSelection()); + if (selection == null) { + Log.e("RadialService", "RadialItem does not exist with selection id: %d", select.getSelection()); + return; + } + Log.d("RadialService", "%s selected %s for target %s", player, selection, target); + new RadialSelectionIntent(player, target, selection).broadcast(); + } + private void sendResponse(Player player, SWGObject target, List options, int counter) { ObjectMenuResponse menuResponse = new ObjectMenuResponse(player.getCreatureObject().getObjectId()); menuResponse.setTargetId(target.getObjectId()); diff --git a/src/utilities/Scripts.java b/src/utilities/Scripts.java index 88b0b4f21..2a8ff4b54 100644 --- a/src/utilities/Scripts.java +++ b/src/utilities/Scripts.java @@ -47,6 +47,7 @@ public class Scripts { try { ENGINE.eval("var RadialOption = Java.type('resources.radial.RadialOption')"); ENGINE.eval("var RadialItem = Java.type('resources.radial.RadialItem')"); + ENGINE.eval("var Log = Java.type('resources.server_info.Log')"); } catch (ScriptException e) { e.printStackTrace(); }