From f97ea32e5d9e19d9d5b9abb27984a2c877e8cdc2 Mon Sep 17 00:00:00 2001 From: Obique PSWG Date: Tue, 4 Aug 2015 01:39:43 -0500 Subject: [PATCH] Basic functionality of RadialService implemented. All radial logic moved out of SuiService. --- src/intents/radial/RadialRequestIntent.java | 47 +++++++++++++++ src/intents/radial/RadialResponseIntent.java | 59 +++++++++++++++++++ .../object_controller/ObjectMenuResponse.java | 47 +++++++++++++-- src/services/objects/ObjectManager.java | 3 + src/services/objects/RadialService.java | 52 +++++++++++++++- src/services/sui/SuiService.java | 17 ------ 6 files changed, 202 insertions(+), 23 deletions(-) create mode 100644 src/intents/radial/RadialRequestIntent.java create mode 100644 src/intents/radial/RadialResponseIntent.java diff --git a/src/intents/radial/RadialRequestIntent.java b/src/intents/radial/RadialRequestIntent.java new file mode 100644 index 000000000..4c7b4566e --- /dev/null +++ b/src/intents/radial/RadialRequestIntent.java @@ -0,0 +1,47 @@ +package intents.radial; + +import network.packets.swg.zone.object_controller.ObjectMenuRequest; +import resources.control.Intent; +import resources.objects.SWGObject; +import resources.player.Player; + +public class RadialRequestIntent extends Intent { + + public static final String TYPE = "RadialRequestIntent"; + + private Player player; + private SWGObject target; + private ObjectMenuRequest request; + + public RadialRequestIntent(Player player, SWGObject target, ObjectMenuRequest request) { + super(TYPE); + setPlayer(player); + setTarget(target); + setRequest(request); + } + + public void setPlayer(Player player) { + this.player = player; + } + + public void setTarget(SWGObject target) { + this.target = target; + } + + public void setRequest(ObjectMenuRequest request) { + this.request = request; + } + + public Player getPlayer() { + return player; + } + + public SWGObject getTarget() { + return target; + } + + public ObjectMenuRequest getRequest() { + return request; + } + +} diff --git a/src/intents/radial/RadialResponseIntent.java b/src/intents/radial/RadialResponseIntent.java new file mode 100644 index 000000000..ed784e2ac --- /dev/null +++ b/src/intents/radial/RadialResponseIntent.java @@ -0,0 +1,59 @@ +package intents.radial; + +import java.util.List; + +import resources.RadialOption; +import resources.control.Intent; +import resources.objects.SWGObject; +import resources.player.Player; + +public class RadialResponseIntent extends Intent { + + public static final String TYPE = "RadialResponseIntent"; + + private Player player; + private SWGObject target; + private List options; + private int counter; + + public RadialResponseIntent(Player player, SWGObject target, List options, int counter) { + super(TYPE); + setPlayer(player); + setTarget(target); + setOptions(options); + setCounter(counter); + } + + public void setPlayer(Player player) { + this.player = player; + } + + public void setTarget(SWGObject target) { + this.target = target; + } + + public void setOptions(List options) { + this.options = options; + } + + public void setCounter(int counter) { + this.counter = counter; + } + + public Player getPlayer() { + return player; + } + + public SWGObject getTarget() { + return target; + } + + public List getOptions() { + return options; + } + + public int getCounter() { + return counter; + } + +} diff --git a/src/network/packets/swg/zone/object_controller/ObjectMenuResponse.java b/src/network/packets/swg/zone/object_controller/ObjectMenuResponse.java index 7e1d67849..900dbab56 100644 --- a/src/network/packets/swg/zone/object_controller/ObjectMenuResponse.java +++ b/src/network/packets/swg/zone/object_controller/ObjectMenuResponse.java @@ -38,7 +38,7 @@ public class ObjectMenuResponse extends ObjectController { public static final int CRC = 0x0147; private long targetId; - private long requesterId; + private long requestorId; private List options; private int counter; @@ -46,12 +46,16 @@ public class ObjectMenuResponse extends ObjectController { super(objectId, CRC); } - public ObjectMenuResponse(long objectId, long targetId, long requesterId, List options, int counter) { + public ObjectMenuResponse(long objectId, long targetId, long requestorId, List options, int counter) { super(objectId, CRC); this.targetId = targetId; - this.requesterId = requesterId; + this.requestorId = requestorId; this.options = options; this.counter = counter; + setTargetId(targetId); + setRequestorId(requestorId); + setRadialOptions(options); + setCounter(counter); } public ObjectMenuResponse(ByteBuffer data) { @@ -63,7 +67,7 @@ public class ObjectMenuResponse extends ObjectController { public void decode(ByteBuffer data) { decodeHeader(data); targetId = getLong(data); - requesterId = getLong(data); + requestorId = getLong(data); int optionCount = getInt(data); for (int i = 0; i < optionCount; i++) { RadialOption option = new RadialOption(); @@ -88,7 +92,7 @@ public class ObjectMenuResponse extends ObjectController { encodeHeader(data); addLong(data, targetId); - addLong(data, requesterId); + addLong(data, requestorId); addInt(data, options.size()); for (int i = 0; i < options.size(); i++) { @@ -104,4 +108,37 @@ public class ObjectMenuResponse extends ObjectController { addByte(data, counter); return data; } + + public void setTargetId(long targetId) { + this.targetId = targetId; + } + + public void setRequestorId(long requestorId) { + this.requestorId = requestorId; + } + + public void setRadialOptions(List options) { + this.options = options; + } + + public void setCounter(int counter) { + this.counter = counter; + } + + public long getTargetId() { + return targetId; + } + + public long getRequestorId() { + return requestorId; + } + + public List getOptions() { + return options; + } + + public int getCounter() { + return counter; + } + } diff --git a/src/services/objects/ObjectManager.java b/src/services/objects/ObjectManager.java index 8fc86363f..be4314258 100644 --- a/src/services/objects/ObjectManager.java +++ b/src/services/objects/ObjectManager.java @@ -71,6 +71,7 @@ public class ObjectManager extends Manager { private final MapService mapService; private final StaticService staticService; + private final RadialService radialService; private final ObjectDatabase database; private final ObjectAwareness objectAwareness; @@ -80,6 +81,7 @@ public class ObjectManager extends Manager { public ObjectManager() { mapService = new MapService(); staticService = new StaticService(this); + radialService = new RadialService(); database = new CachedObjectDatabase("odb/objects.db"); objectAwareness = new ObjectAwareness(); objectMap = new HashMap<>(); @@ -87,6 +89,7 @@ public class ObjectManager extends Manager { addChildService(mapService); addChildService(staticService); + addChildService(radialService); } @Override diff --git a/src/services/objects/RadialService.java b/src/services/objects/RadialService.java index 10f2fb1c0..05ffb9bf6 100644 --- a/src/services/objects/RadialService.java +++ b/src/services/objects/RadialService.java @@ -2,6 +2,15 @@ package services.objects; import resources.control.Intent; import resources.control.Service; +import network.packets.swg.zone.object_controller.ObjectMenuRequest; +import network.packets.swg.zone.object_controller.ObjectMenuResponse; +import intents.network.GalacticPacketIntent; +import intents.radial.RadialRequestIntent; +import intents.radial.RadialResponseIntent; +import resources.objects.SWGObject; +import resources.objects.creature.CreatureObject; +import resources.player.Player; +import resources.server_info.Log; public class RadialService extends Service { @@ -11,12 +20,53 @@ public class RadialService extends Service { @Override public boolean initialize() { + registerForIntent(GalacticPacketIntent.TYPE); return super.initialize(); } @Override public void onIntentReceived(Intent i) { - + if (i instanceof GalacticPacketIntent) { + GalacticPacketIntent gpi = (GalacticPacketIntent) i; + if (gpi.getPacket() instanceof ObjectMenuRequest) { + onRequest(gpi.getObjectManager(), (ObjectMenuRequest) gpi.getPacket()); + } + } else if (i instanceof RadialResponseIntent) { + onResponse((RadialResponseIntent) i); + } + } + + private void onRequest(ObjectManager objectManager, ObjectMenuRequest request) { + SWGObject requestor = objectManager.getObjectById(request.getRequesterId()); + SWGObject target = objectManager.getObjectById(request.getTargetId()); + if (target == null) { + System.err.println(requestor + " requested a null target! ID: " + request.getTargetId()); + Log.w("RadialService", "%s requested a null target! ID: %d", requestor, request.getTargetId()); + } + if (!(requestor instanceof CreatureObject)) { + System.err.println("Requestor of target: " + target + " is not a creature object!"); + Log.w("RadialService", "Requestor of target: %s is not a creature object! %s", target, requestor); + return; + } + Player player = requestor.getOwner(); + if (player == null) { + System.err.println("Requestor of target: " + target + " does not have an owner!"); + Log.w("RadialService", "Requestor of target: %s does not have an owner! %s", target, requestor); + return; + } + new RadialRequestIntent(player, target, request).broadcast(); + // TODO: Remove the following line. This is a temporary solution to provide Use and Examine radials. + new RadialResponseIntent(player, target, request.getOptions(), request.getCounter()).broadcast(); + } + + private void onResponse(RadialResponseIntent response) { + Player player = response.getPlayer(); + ObjectMenuResponse menuResponse = new ObjectMenuResponse(player.getCreatureObject().getObjectId()); + menuResponse.setTargetId(response.getTarget().getObjectId()); + menuResponse.setRequestorId(player.getCreatureObject().getObjectId()); + menuResponse.setRadialOptions(response.getOptions()); + menuResponse.setCounter(response.getCounter()); + player.sendPacket(menuResponse); } } diff --git a/src/services/sui/SuiService.java b/src/services/sui/SuiService.java index 24b2b8754..988e13a89 100644 --- a/src/services/sui/SuiService.java +++ b/src/services/sui/SuiService.java @@ -33,9 +33,6 @@ import java.util.concurrent.ConcurrentHashMap; import network.packets.Packet; import network.packets.swg.SWGPacket; -import network.packets.swg.zone.object_controller.ObjectController; -import network.packets.swg.zone.object_controller.ObjectMenuRequest; -import network.packets.swg.zone.object_controller.ObjectMenuResponse; import network.packets.swg.zone.server_ui.SuiCreatePageMessage; import network.packets.swg.zone.server_ui.SuiEventNotification; import intents.network.GalacticPacketIntent; @@ -93,25 +90,11 @@ public class SuiService extends Service { if (p instanceof SuiEventNotification) handleSuiEventNotification(player, (SuiEventNotification) p); break; - case OBJECT_CONTROLLER: - if (p instanceof ObjectController) - handleObjectController(player, (ObjectController) p); - break; default: break; } } - private void handleObjectController(Player player, ObjectController objController) { - if (objController instanceof ObjectMenuRequest) - handleRadialMenuRequest(player, (ObjectMenuRequest) objController); - } - - private void handleRadialMenuRequest(Player player, ObjectMenuRequest request) { - // TODO: Modify when object scripts are in to accept a createRadial definition for radials - player.sendPacket(new ObjectMenuResponse(player.getCreatureObject().getObjectId(), request.getTargetId(), request.getRequesterId(), request.getOptions(), request.getCounter())); - } - private void handleSuiWindowIntent(SuiWindowIntent i) { if (i.getEvent() == SuiWindowEvent.NEW) displayWindow(i.getPlayer(), i.getWindow());