diff --git a/src/services/CharacterService.java b/src/services/CharacterService.java index 97f16a06..de94db65 100644 --- a/src/services/CharacterService.java +++ b/src/services/CharacterService.java @@ -264,7 +264,7 @@ public class CharacterService implements INetworkDispatch { object._add(weapon); object.setWeaponId(weapon.getObjectID()); - core.scriptService.callScript("scripts/", "demo", "CreateStartingCharacter", object); + core.scriptService.callScript("scripts/", "demo", "CreateStartingCharacter", core, object); diff --git a/src/services/PlayerService.java b/src/services/PlayerService.java index 52d90a1e..1518d4cf 100644 --- a/src/services/PlayerService.java +++ b/src/services/PlayerService.java @@ -22,7 +22,9 @@ package services; import java.nio.ByteOrder; +import java.util.List; import java.util.Map; +import java.util.Vector; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -37,10 +39,14 @@ import resources.common.FileUtilities; import resources.common.Opcodes; import resources.objects.creature.CreatureObject; import resources.objects.player.PlayerObject; +import services.sui.SUIService.ListBoxType; +import services.sui.SUIWindow; import main.NGECore; import engine.clients.Client; +import engine.resources.objects.SWGObject; +import engine.resources.scene.Point3D; import engine.resources.service.INetworkDispatch; import engine.resources.service.INetworkRemoteEvent; @@ -180,6 +186,28 @@ public class PlayerService implements INetworkDispatch { core.scriptService.callScript("scripts/expertise/", "addExpertisePoint", expertiseBox, core, creature); } + + public void sendCloningWindow(CreatureObject creature) { + + //if(creature.getPosture() != 14) + // return; + + List cloners = core.staticService.getCloningFacilitiesByPlanet(creature.getPlanet()); + Vector cloneData = new Vector(); + Point3D position = creature.getWorldPosition(); + + for(SWGObject cloner : cloners) { + + cloneData.add(core.mapService.getClosestCityName(cloner) + " (" + String.valueOf(position.getDistance2D(cloner.getPosition())) + "m)"); + + } + + SUIWindow window = core.suiService.createListBox(ListBoxType.LIST_BOX_OK_CANCEL, "@base_player:revive_title", "@base_player:revive_closest : " + "\n" + "@base_player:revive_bind : " + "\n" + "Cash Balance : " + creature.getCashCredits() + "\n" + "Select the desired option and click OK.", + cloneData, creature, null, 0); + + core.suiService.openSUIWindow(window); + + } @Override public void shutdown() { diff --git a/src/services/SimulationService.java b/src/services/SimulationService.java index 25cb5730..c6c6bd2e 100644 --- a/src/services/SimulationService.java +++ b/src/services/SimulationService.java @@ -548,6 +548,7 @@ public class SimulationService implements INetworkDispatch { } } } + } public void transferToPlanet(SWGObject object, Planet planet, Point3D newPos, Quaternion newOrientation) { diff --git a/src/services/StaticService.java b/src/services/StaticService.java index 77a80d26..433a63da 100644 --- a/src/services/StaticService.java +++ b/src/services/StaticService.java @@ -21,8 +21,12 @@ ******************************************************************************/ package services; +import java.util.ArrayList; +import java.util.List; import java.util.Map; +import resources.objects.building.BuildingObject; + import main.NGECore; import engine.resources.objects.SWGObject; @@ -95,5 +99,19 @@ public class StaticService implements INetworkDispatch { } } + + public List getCloningFacilitiesByPlanet(Planet planet) { + + List objects = core.simulationService.get(planet, 0, 0, 8300); + List cloners = new ArrayList(); + + for(SWGObject obj : objects) { + if(obj instanceof BuildingObject && (obj.getTemplate().contains("cloning_facility") || obj.getTemplate().contains("cloning_tatooine") || obj.getTemplate().contains("cloning_naboo") || obj.getTemplate().contains("cloning_corellia"))) + cloners.add(obj); + } + + return cloners; + + } } diff --git a/src/services/map/MapService.java b/src/services/map/MapService.java index 029a4f31..e749e61f 100644 --- a/src/services/map/MapService.java +++ b/src/services/map/MapService.java @@ -41,6 +41,7 @@ import engine.clients.Client; import engine.resources.objects.SWGObject; import engine.resources.scene.Grid2D; import engine.resources.scene.Planet; +import engine.resources.scene.Point3D; import engine.resources.service.INetworkDispatch; import engine.resources.service.INetworkRemoteEvent; @@ -113,4 +114,27 @@ public class MapService implements INetworkDispatch { locationMap.get(planet).add(location); } + public String getClosestCityName(SWGObject object) { + + Vector locations = locationMap.get(object.getPlanet()); + float closestDistance = Float.MAX_VALUE; + String closestName = ""; + Point3D objPos = object.getWorldPosition(); + + for(MapLocation location : locations) { + + if(location.getCategory() == 17) { + Point3D position = new Point3D(location.getX(), 0, location.getY()); + if(position.getDistance2D(objPos) < closestDistance) { + closestDistance = position.getDistance2D(objPos); + closestName = location.getName(); + } + } + + } + + return closestName; + + } + } diff --git a/src/services/sui/SUIService.java b/src/services/sui/SUIService.java index 8cccd2cc..1a7bb121 100644 --- a/src/services/sui/SUIService.java +++ b/src/services/sui/SUIService.java @@ -46,6 +46,7 @@ import protocol.swg.objectControllerObjects.ObjectMenuResponse; import resources.common.ObjControllerOpcodes; import resources.common.Opcodes; import resources.common.RadialOptions; +import services.sui.SUIWindow.SUICallback; import engine.clients.Client; import engine.resources.objects.SWGObject; @@ -152,6 +153,9 @@ public class SUIService implements INetworkDispatch { func.__call__(Py.java2py(core), Py.java2py(owner), Py.java2py(suiEvent.getEventType()), Py.java2py(suiEvent.getReturnList())); + SUICallback callback = window.getCallbackByEventId(suiEvent.getEventType()); + callback.process(owner, suiEvent.getEventType(), suiEvent.getReturnList()); + windowMap.remove(window.getWindowId()); } diff --git a/src/services/sui/SUIWindow.java b/src/services/sui/SUIWindow.java index 1c547b47..f03c0b4f 100644 --- a/src/services/sui/SUIWindow.java +++ b/src/services/sui/SUIWindow.java @@ -38,6 +38,7 @@ public class SUIWindow { private float maxDistance = 0; private Vector components = new Vector(); private Map callbacks = new ConcurrentHashMap(); + private Map javaCallbacks = new ConcurrentHashMap(); public SUIWindow(String script, SWGObject owner, int windowId, SWGObject rangeObject, float maxDistance) { @@ -114,6 +115,30 @@ public class SUIWindow { } + public void addHandler(int eventId, String source, byte trigger, Vector returnParams, SUICallback handleFunc) { + + SUIWindowComponent component = new SUIWindowComponent(); + component.setType((byte) 5); + + component.getNarrowParams().add(source); + + component.getNarrowParams().add(new String(new byte[] { trigger })); + component.getNarrowParams().add("handleSUI"); + + for(String returnParam : returnParams) { + + for(String str : returnParam.split(":")) { + component.getNarrowParams().add(str); + } + + } + + components.add(component); + javaCallbacks.put(eventId, handleFunc); + + } + + public void addDataSource(String name, String value) { SUIWindowComponent component = new SUIWindowComponent(); @@ -178,12 +203,27 @@ public class SUIWindow { return callbacks.get(eventId); } + public Map getJavaCallbacks() { + return javaCallbacks; + } + + public SUICallback getCallbackByEventId(int eventId) { + return javaCallbacks.get(eventId); + } + + public enum Trigger {; public static byte TRIGGER_UPDATE = 4; public static byte TRIGGER_OK = 9; public static byte TRIGGER_CANCEL = 10; } + + public interface SUICallback { + + public void process(SWGObject owner, int eventType, Vector returnList); + + } } diff --git a/src/services/sui/SUIWindowComponent.java b/src/services/sui/SUIWindowComponent.java index 4a1c3a73..fa5bac02 100644 --- a/src/services/sui/SUIWindowComponent.java +++ b/src/services/sui/SUIWindowComponent.java @@ -28,6 +28,7 @@ public class SUIWindowComponent { private byte type; private Vector narrowParams = new Vector(); private Vector wideParams = new Vector(); + private long objectId; public byte getType() { return type; @@ -47,6 +48,12 @@ public class SUIWindowComponent { public void setWideParams(Vector wideParams) { this.wideParams = wideParams; } + public long getObjectId() { + return objectId; + } + public void setObjectId(long objectId) { + this.objectId = objectId; + } }