package services.objects; import java.util.HashSet; import java.util.List; import java.util.Set; import resources.control.Intent; import resources.control.Service; import network.packets.Packet; import network.packets.swg.zone.ObjectMenuSelect; import network.packets.swg.zone.object_controller.IntendedTarget; import network.packets.swg.zone.object_controller.ObjectMenuRequest; import network.packets.swg.zone.object_controller.ObjectMenuResponse; import intents.network.GalacticPacketIntent; import intents.radial.ObjectClickedIntent; 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 { private final Set templatesRegistered; public RadialService() { templatesRegistered = new HashSet<>(); registerForIntent(GalacticPacketIntent.TYPE); registerForIntent(RadialResponseIntent.TYPE); registerForIntent(RadialRegisterIntent.TYPE); } @Override public void onIntentReceived(Intent i) { if (i instanceof GalacticPacketIntent) { GalacticPacketIntent gpi = (GalacticPacketIntent) i; Packet p = gpi.getPacket(); if (p instanceof ObjectMenuRequest) { onRequest(gpi.getObjectManager(), (ObjectMenuRequest) p); } else if (p instanceof ObjectMenuSelect) { onSelection(gpi.getGalacticManager(), gpi.getNetworkId(), (ObjectMenuSelect) p); } else if (p instanceof IntendedTarget) { onObjectClicked(gpi.getObjectManager(), (IntendedTarget) p); } } else if (i instanceof RadialResponseIntent) { onResponse((RadialResponseIntent) i); } else if (i instanceof RadialRegisterIntent) { synchronized (templatesRegistered) { if (((RadialRegisterIntent) i).isRegister()) { templatesRegistered.addAll(((RadialRegisterIntent) i).getTemplates()); } else { templatesRegistered.removeAll(((RadialRegisterIntent) i).getTemplates()); } } } } private void onRequest(ObjectManager objectManager, ObjectMenuRequest request) { SWGObject requestor = objectManager.getObjectById(request.getRequestorId()); SWGObject target = objectManager.getObjectById(request.getTargetId()); if (target == null) return; 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; } synchronized (templatesRegistered) { if (templatesRegistered.contains(target.getTemplate())) { new RadialRequestIntent(player, target, request).broadcast(); } else { sendResponse(player, target, request.getOptions(), request.getCounter()); } } } private void onResponse(RadialResponseIntent response) { Player player = response.getPlayer(); 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; } new RadialSelectionIntent(player, target, selection).broadcast(); } private void onObjectClicked(ObjectManager objectManager, IntendedTarget it) { SWGObject requestor = objectManager.getObjectById(it.getObjectId()); SWGObject target = objectManager.getObjectById(it.getTargetId()); if (target == null) return; 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; } synchronized (templatesRegistered) { if (templatesRegistered.contains(target.getTemplate())) { new ObjectClickedIntent((CreatureObject) requestor, target).broadcast(); } } } private void sendResponse(Player player, SWGObject target, List options, int counter) { ObjectMenuResponse menuResponse = new ObjectMenuResponse(player.getCreatureObject().getObjectId()); menuResponse.setTargetId(target.getObjectId()); menuResponse.setRequestorId(player.getCreatureObject().getObjectId()); menuResponse.setRadialOptions(options); menuResponse.setCounter(counter); player.sendPacket(menuResponse); } }