diff --git a/scripts/object/creature/npc/theme_park/player_shuttle.py b/scripts/object/creature/npc/theme_park/player_shuttle.py index ccad8904..e1dd8242 100644 --- a/scripts/object/creature/npc/theme_park/player_shuttle.py +++ b/scripts/object/creature/npc/theme_park/player_shuttle.py @@ -1,4 +1,10 @@ import sys def setup(core, object): + object.setPosture(0) # land = 0 : away = 2 + tp = core.travelService.getNearestTravelPoint(object) + if tp: + tp.setShuttle(object) + tp.setShuttleAvailable(True) + tp.setShuttleLanding(False) return \ No newline at end of file diff --git a/scripts/static_travel_points.py b/scripts/static_travel_points.py index 54964e53..49a20aa2 100644 --- a/scripts/static_travel_points.py +++ b/scripts/static_travel_points.py @@ -26,6 +26,16 @@ def addPoints(core, planet): def corelliaPoints(core, planet): trvSvc = core.travelService + + trvSvc.addTravelPoint(planet, "Coronet Shuttle A", -25, 28, -4409) + trvSvc.addTravelPoint(planet, "Coronet Shuttle B", -329, 28, -4641) + trvSvc.addTravelPoint(planet, "Vreni Island Shuttle", -5551, 15, -6059) + trvSvc.addTravelPoint(planet, "Tyrena Shuttle A", -5005, 21, -2386) + trvSvc.addTravelPoint(planet, "Tyrena Shuttle B", -5600, 21, -2790) + trvSvc.addTravelPoint(planet, "Doaba Guerfel Shuttleport", 3085, 280, 4993) + trvSvc.addTravelPoint(planet, "Kor Vella Shuttleport", -3775, 31, 3234) + trvSvc.addTravelPoint(planet, "Bela Vistal Shuttleport A", 6644, 330, -5922) + trvSvc.addTravelPoint(planet, "Bela Vistal Shuttleport B", 6930, 330, -5534) trvSvc.addTravelPoint(planet, "Coronet Starport", -51, 28, -4735) trvSvc.addTravelPoint(planet, "Tyrena Starport", -4975, 21, -2230) @@ -35,25 +45,24 @@ def corelliaPoints(core, planet): def dantooinePoints(core, planet): trvSvc = core.travelService - - trvSvc.addTravelPoint(planet, "Coronet Starport", -51, 28, -4735) - trvSvc.addTravelPoint(planet, "Tyrena Starport", -4975, 21, -2230) - trvSvc.addTravelPoint(planet, "Kor Vella Starport", -3136, 31, 2894) - trvSvc.addTravelPoint(planet, "Doaba Guerful Starport", 3377, 308, 5605) + + trvSvc.addTravelPoint(planet, "Mining Outpost", -635, 3, 2507) + trvSvc.addTravelPoint(planet, "Imperial Outpost", -4208, 3, -2350) + trvSvc.addTravelPoint(planet, "Agro Outpost", 1569, 4, -6415) return def dathomirPoints(core, planet): trvSvc = core.travelService - trvSvc.addTravelPoint(planet, "Science Outpost", -76, 18, -1586) - trvSvc.addTravelPoint(planet, "Trade Outpost", -592, 6, 3087) + trvSvc.addTravelPoint(planet, "Science Outpost", -49, 18, -1584) + trvSvc.addTravelPoint(planet, "Trade Outpost", 618, 6, 3092) return def endorPoints(core, planet): trvSvc = core.travelService - trvSvc.addTravelPoint(planet, "Smuggler Outpost", -978, 73, 1554) - trvSvc.addTravelPoint(planet, "Research Outpost", 3222, 24, -3482) + trvSvc.addTravelPoint(planet, "Smuggler Outpost", -950, 73, 1553) + trvSvc.addTravelPoint(planet, "Research Outpost", 3201, 24, -3499) return def lokPoints(core, planet): @@ -66,23 +75,36 @@ def nabooPoints(core, planet): trvSvc = core.travelService trvSvc.addTravelPoint(planet, "Kaadara Starport", 5295, -192, 6664) + trvSvc.addTravelPoint(planet, "Kaadara Shuttleport", 5123, -192, 6616) + trvSvc.addTravelPoint(planet, "Dee'ja Peak Shuttleport", 5331, 327, -1576) + trvSvc.addTravelPoint(planet, "Moenia Shuttleport", 4961, 3, -4892) + trvSvc.addTravelPoint(planet, "The Lake Retreat", -5494, -150, -21) + trvSvc.addTravelPoint(planet, "Keren Shuttleport", 2021, 19, 2525) + trvSvc.addTravelPoint(planet, "Keren Shuttleport South", 1567, 25, 2837) trvSvc.addTravelPoint(planet, "Keren Starport", 1352, 13, 2768) trvSvc.addTravelPoint(planet, "Moenia Starport", 4728, 4, -4650) + trvSvc.addTravelPoint(planet, "Theed Shuttle A", -5856, 19, 4172) + trvSvc.addTravelPoint(planet, "Theed Shuttle B", -5005, 19, 4072) + trvSvc.addTravelPoint(planet, "Theed Shuttle C", -5411, 19, 4332) + return def roriPoints(core, planet): trvSvc = core.travelService - trvSvc.addTravelPoint(planet, "Narmle Starport", -5472, 80, 2161) + trvSvc.addTravelPoint(planet, "Narmle Starport", -5374, 80, -2188) + trvSvc.addTravelPoint(planet, "Shuttleport", -5255, 80, -2161) trvSvc.addTravelPoint(planet, "Rebel Outpost", 3672, 96, -6421) return def talusPoints(core, planet): trvSvc = core.travelService - trvSvc.addTravelPoint(planet, "Dearic Starport", 245, 6, -2931) - trvSvc.addTravelPoint(planet, "Nashal Starport", 4480, 2, 6365) - trvSvc.addTravelPoint(planet, "Imperial Outpost", -2212, 20, 2302) + trvSvc.addTravelPoint(planet, "Dearic Starport", 263, 6, -2952) + trvSvc.addTravelPoint(planet, "Dearic Shuttleport", 699, 6, -3041) + trvSvc.addTravelPoint(planet, "Nashal Starport", 4453, 2, 5354) + trvSvc.addTravelPoint(planet, "Nashal Shuttleport", 4334, 9, 5431) + trvSvc.addTravelPoint(planet, "Imperial Outpost", -2226, 20, 2319) return def tatooinePoints(core, planet): @@ -106,7 +128,7 @@ def tatooinePoints(core, planet): def yavin4Points(core, planet): trvSvc = core.travelService - trvSvc.addTravelPoint(planet, "Imperial Base", 4033, 37, -6234) - trvSvc.addTravelPoint(planet, "Labor Outpost", -6939, 73, -5706) - trvSvc.addTravelPoint(planet, "Mining Outpost", -277, 35, 4879) + trvSvc.addTravelPoint(planet, "Imperial Base", 4054, 37, -6216) + trvSvc.addTravelPoint(planet, "Labor Outpost", -6921, 73, -5726) + trvSvc.addTravelPoint(planet, "Mining Outpost", -267, 35, 4896) return \ No newline at end of file diff --git a/src/main/NGECore.java b/src/main/NGECore.java index f1a4ed52..ba630888 100644 --- a/src/main/NGECore.java +++ b/src/main/NGECore.java @@ -278,7 +278,7 @@ public class NGECore { zoneDispatch.addService(skillService); - travelService.startShuttleSchedule(); + //travelService.startShuttleSchedule(); weatherService = new WeatherService(this); weatherService.loadPlanetSettings(); diff --git a/src/protocol/swg/EnterTicketPurchaseModeMessage.java b/src/protocol/swg/EnterTicketPurchaseModeMessage.java index d5d8d02c..04cec6fb 100644 --- a/src/protocol/swg/EnterTicketPurchaseModeMessage.java +++ b/src/protocol/swg/EnterTicketPurchaseModeMessage.java @@ -51,7 +51,7 @@ public class EnterTicketPurchaseModeMessage extends SWGMessage { public IoBuffer serialize() { final NGECore core = NGECore.getInstance(); TravelPoint nearestPoint = core.travelService.getNearestTravelPoint(player); - IoBuffer result = IoBuffer.allocate(20 + planetName.length() + nearestPoint.getName().length()).order(ByteOrder.LITTLE_ENDIAN); + IoBuffer result = IoBuffer.allocate(11 + planetName.length() + nearestPoint.getName().length()).order(ByteOrder.LITTLE_ENDIAN); result.putShort((short) 3); result.putInt(0x904DAE1A); @@ -59,6 +59,8 @@ public class EnterTicketPurchaseModeMessage extends SWGMessage { result.put(getAsciiString(planetName)); result.put(getAsciiString(nearestPoint.getName())); + result.put((byte) 0); + return result.flip(); } diff --git a/src/protocol/swg/PlanetTravelPointListResponse.java b/src/protocol/swg/PlanetTravelPointListResponse.java index 46d37683..4bd409b9 100644 --- a/src/protocol/swg/PlanetTravelPointListResponse.java +++ b/src/protocol/swg/PlanetTravelPointListResponse.java @@ -35,12 +35,10 @@ public class PlanetTravelPointListResponse extends SWGMessage { private String planetString; private Vector travelPoints; - private List planetList; - public PlanetTravelPointListResponse(String planetString, Vector travelPoints, List planetList) { + public PlanetTravelPointListResponse(String planetString, Vector travelPoints) { this.planetString = planetString; this.travelPoints = travelPoints; - this.planetList = planetList; } @Override @@ -50,7 +48,7 @@ public class PlanetTravelPointListResponse extends SWGMessage { @Override public IoBuffer serialize() { - IoBuffer result = IoBuffer.allocate(travelPoints.size() * 2).order(ByteOrder.LITTLE_ENDIAN); + IoBuffer result = IoBuffer.allocate(100).order(ByteOrder.LITTLE_ENDIAN); result.setAutoExpand(true); result.putShort((short) 6); @@ -81,8 +79,9 @@ public class PlanetTravelPointListResponse extends SWGMessage { for (TravelPoint point : travelPoints) { result.put((byte) 1); // isReachable } - result.flip(); - return result; + int size = result.position(); + result = IoBuffer.allocate(size).put(result.array(), 0, size); + return result.flip(); } } diff --git a/src/protocol/swg/objectControllerObjects/ObjectMenuResponse.java b/src/protocol/swg/objectControllerObjects/ObjectMenuResponse.java index b4450dc9..1d1ae2c5 100644 --- a/src/protocol/swg/objectControllerObjects/ObjectMenuResponse.java +++ b/src/protocol/swg/objectControllerObjects/ObjectMenuResponse.java @@ -73,12 +73,13 @@ public class ObjectMenuResponse extends ObjControllerObject { result.putInt(size); if(size > 0) { - byte counter = 1; + byte counter = 0; for(RadialOptions radialOption : radialOptions) { - result.put(counter++); + result.put(++counter); result.put(radialOption.getParentId()); result.putShort(radialOption.getOptionId()); - result.put(radialOption.getOptionType()); + //result.put(radialOption.getOptionType()); + result.put((byte) 3); if(radialOption.getDescription().length() > 0) result.put(getUnicodeString(radialOption.getDescription())); @@ -87,7 +88,6 @@ public class ObjectMenuResponse extends ObjControllerObject { } } - result.put(radialCount); int packetSize = result.position(); diff --git a/src/services/ScriptService.java b/src/services/ScriptService.java index e7d3b966..791e3cd5 100644 --- a/src/services/ScriptService.java +++ b/src/services/ScriptService.java @@ -45,6 +45,7 @@ public class ScriptService { PyObject func = interpreter.get(method); func.__call__(Py.java2py(core));*/ PythonInterpreter python = new PythonInterpreter(); + python.cleanup(); python.execfile(path + module + ".py"); return python.get(method).__call__(); } @@ -56,6 +57,7 @@ public class ScriptService { PyObject func = interpreter.get(method); func.__call__(Py.java2py(core), Py.java2py(arg1));*/ PythonInterpreter python = new PythonInterpreter(); + python.cleanup(); python.execfile(path + module + ".py"); return python.get(method).__call__(Py.java2py(arg1)); } @@ -67,6 +69,7 @@ public class ScriptService { PyObject func = interpreter.get(method); func.__call__(Py.java2py(arg1), Py.java2py(arg2));*/ PythonInterpreter python = new PythonInterpreter(); + python.cleanup(); python.execfile(path + module + ".py"); return python.get(method).__call__(Py.java2py(arg1), Py.java2py(arg2)); } @@ -78,6 +81,7 @@ public class ScriptService { PyObject func = interpreter.get(method); func.__call__(Py.java2py(arg1), Py.java2py(arg2), Py.java2py(arg3));*/ PythonInterpreter python = new PythonInterpreter(); + python.cleanup(); python.execfile(path + module + ".py"); return python.get(method).__call__(Py.java2py(arg1), Py.java2py(arg2), Py.java2py(arg3)); @@ -90,12 +94,14 @@ public class ScriptService { PyObject func = interpreter.get(method); func.__call__(Py.java2py(arg1), Py.java2py(arg2), Py.java2py(arg3), Py.java2py(arg4));*/ PythonInterpreter python = new PythonInterpreter(); + python.cleanup(); python.execfile(path + module + ".py"); return python.get(method).__call__(Py.java2py(arg1), Py.java2py(arg2), Py.java2py(arg3), Py.java2py(arg4)); } public PyObject getMethod(String path, String module, String method) { PythonInterpreter python = new PythonInterpreter(); + python.cleanup(); python.execfile(path + module + ".py"); PyObject func = python.get(method); return func; diff --git a/src/services/SkillService.java b/src/services/SkillService.java index 5fa961b5..35fef3db 100644 --- a/src/services/SkillService.java +++ b/src/services/SkillService.java @@ -21,14 +21,22 @@ ******************************************************************************/ package services; +import java.nio.ByteOrder; import java.util.Map; +import org.apache.mina.core.buffer.IoBuffer; +import org.apache.mina.core.session.IoSession; + +import protocol.swg.ExpertiseRequestMessage; + import resources.common.Console; +import resources.common.Opcodes; import resources.objects.creature.CreatureObject; import resources.objects.player.PlayerObject; import main.NGECore; import engine.clientdata.ClientFileManager; import engine.clientdata.visitors.DatatableVisitor; +import engine.clients.Client; import engine.resources.service.INetworkDispatch; import engine.resources.service.INetworkRemoteEvent; @@ -225,7 +233,36 @@ public class SkillService implements INetworkDispatch { } @Override - public void insertOpcodes(Map arg0, Map arg1) { + public void insertOpcodes(Map swgOpcodes, Map objControllerOpcodes) { + + /*swgOpcodes.put(Opcodes.ExpertiseRequestMessage, new INetworkRemoteEvent() { + + @Override + public void handlePacket(IoSession session, IoBuffer buffer) throws Exception { + + buffer = buffer.order(ByteOrder.LITTLE_ENDIAN); + buffer.position(0); + + ExpertiseRequestMessage expertise = new ExpertiseRequestMessage(); + expertise.deserialize(buffer); + + Client client = core.getClient((Integer) session.getAttribute("connectionId")); + if(client == null) { + System.out.println("NULL Client"); + return; + } + + if(client.getParent() == null) + return; + + CreatureObject creature = (CreatureObject) client.getParent(); + + for(String expertiseName : expertise.getExpertiseSkills()) { + addSkill(creature, expertiseName); + } + + } + });*/ } diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index 801fec4a..3fe26398 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -524,7 +524,6 @@ public class ObjectService implements INetworkDispatch { if (object == null) { return; } - useObject(creature, object); } diff --git a/src/services/sui/SUIService.java b/src/services/sui/SUIService.java index be3c2ecf..457c90e7 100644 --- a/src/services/sui/SUIService.java +++ b/src/services/sui/SUIService.java @@ -104,7 +104,6 @@ public class SUIService implements INetworkDispatch { objMenuSelect.deserialize(data); Client client = core.getClient((Integer) session.getAttribute("connectionId")); - if(client == null || client.getSession() == null) return; @@ -113,7 +112,7 @@ public class SUIService implements INetworkDispatch { if(target == null || owner == null) return; - + core.scriptService.callScript("scripts/radial/", getRadialFilename(target), "handleSelection", core, owner, target, objMenuSelect.getSelection()); } diff --git a/src/services/travel/TravelPoint.java b/src/services/travel/TravelPoint.java index 27baf809..081910fa 100644 --- a/src/services/travel/TravelPoint.java +++ b/src/services/travel/TravelPoint.java @@ -21,6 +21,10 @@ ******************************************************************************/ package services.travel; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; + import resources.common.SpawnPoint; import resources.objects.creature.CreatureObject; import engine.resources.scene.Point3D; @@ -37,6 +41,8 @@ public class TravelPoint { private boolean shuttleLanding; private int secondsRemaining; private boolean shuttleDeparting; + private ExecutorService scheduler = Executors.newFixedThreadPool(1); + private long departureTimestamp; public TravelPoint() { } @@ -96,6 +102,7 @@ public class TravelPoint { public void setShuttle(CreatureObject shuttleObj) { this.shuttle = shuttleObj; + startShuttleSchedule(); } public boolean isShuttleAvailable() { @@ -115,11 +122,15 @@ public class TravelPoint { } public int getSecondsRemaining() { - return secondsRemaining; + long currentTime = System.currentTimeMillis() / 1000; + long diff = currentTime - getDepartureTimestamp(); + + return (int) (60 - diff); } public void setSecondsRemaining(int secondsRemaining) { this.secondsRemaining = secondsRemaining; + System.out.println(secondsRemaining); } public boolean isShuttleDeparting() { @@ -129,4 +140,60 @@ public class TravelPoint { public void setShuttleDeparting(boolean shuttleDeparting) { this.shuttleDeparting = shuttleDeparting; } + + public boolean isStarport() { + if(getShuttle() != null) { + return getShuttle().getTemplate().equals("object/creature/npc/theme_park/shared_player_transport.iff"); + } else { + System.out.println("null shuttle at: " + getName()); + return false; + } + } + + private void startShuttleSchedule() { + + scheduler.execute(new Runnable() { + @Override + public void run() { + while(getShuttle() != null) { + + try { + setShuttleAvailable(true); + setShuttleLanding(false); + Thread.sleep(120000); + setShuttleAvailable(false); + setShuttleDeparting(true); + setDepartureTimestamp(System.currentTimeMillis() / 1000); + getShuttle().setPosture((byte) 2); + setShuttleDeparting(false); + Thread.sleep(60000); + setShuttleLanding(true); + getShuttle().setPosture((byte) 0); + if(isStarport()) + Thread.sleep(14000); + else + Thread.sleep(11000); + + + } catch (InterruptedException e) { + e.printStackTrace(); + } + + } + } + + }); + + + + + } + + public long getDepartureTimestamp() { + return departureTimestamp; + } + + public void setDepartureTimestamp(long depatureTimestamp) { + this.departureTimestamp = depatureTimestamp; + } } diff --git a/src/services/travel/TravelService.java b/src/services/travel/TravelService.java index 987f9492..81e11383 100644 --- a/src/services/travel/TravelService.java +++ b/src/services/travel/TravelService.java @@ -28,6 +28,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Vector; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; @@ -96,19 +97,42 @@ public class TravelService implements INetworkDispatch { if(object == null) return; - List planetList = core.terrainService.getPlanetList(); + TravelPoint travelPoint = getNearestTravelPoint(object); - for (Planet planet : planetList) { - String planetString = planet.getName(); + if(travelPoint == null) + return; + + if(travelPoint.isStarport()) { + + List planetList = core.terrainService.getPlanetList(); - if (request.getPlanet().equals(planetString)) { - - PlanetTravelPointListResponse response = new PlanetTravelPointListResponse(planetString, travelMap.get(planet), planetList); - client.getSession().write(response.serialize()); - break; + for (Planet planet : planetList) { + String planetString = planet.getName(); + if (request.getPlanet().equals(planetString)) { + + Vector correctTravelPoints = new Vector(); + + for(TravelPoint tp : travelMap.get(planet)) { + if(tp.isStarport() || tp.getPlanetName().equalsIgnoreCase(object.getPlanet().getName())) + correctTravelPoints.add(tp); + } + PlanetTravelPointListResponse response = new PlanetTravelPointListResponse(planetString, correctTravelPoints); + client.getSession().write(response.serialize()); + break; + + } } + + } else { + + Planet planet = object.getPlanet(); + + PlanetTravelPointListResponse response = new PlanetTravelPointListResponse(planet.getName(), travelMap.get(planet)); + client.getSession().write(response.serialize()); + } + } }); @@ -181,7 +205,6 @@ public class TravelService implements INetworkDispatch { for(TravelPoint tp : entry.getValue()) { tp.setShuttleDeparting(false); tp.setSecondsRemaining(60); - } } shuttleCountdown(); @@ -218,15 +241,17 @@ public class TravelService implements INetworkDispatch { TravelPoint returnedPoint = null; Vector planetTp = travelMap.get(obj.getPlanet()); - for (TravelPoint tp : planetTp) { - //System.out.println("Distance for point " + tp.getName() + " is " + tp.getLocation().getDistance2D(obj.getWorldPosition())); - if (tp.getLocation().getDistance2D(obj.getWorldPosition()) <= 70) { - returnedPoint = tp; + synchronized(travelMap) { + for (TravelPoint tp : planetTp) { + //System.out.println("Distance for point " + tp.getName() + " is " + tp.getLocation().getDistance2D(obj.getWorldPosition())); + if (tp.getLocation().getDistance2D(obj.getWorldPosition()) <= 70) { + returnedPoint = tp; + } } } if (returnedPoint == null) { - System.out.println("NULL TravelPoint!"); + System.out.println("NULL TravelPoint at : " + core.mapService.getClosestCityName(obj)); } return returnedPoint; } @@ -238,11 +263,14 @@ public class TravelService implements INetworkDispatch { TravelPoint returnedPoint = null; - for (TravelPoint tp : tpMap) { - if (tp.getName().equals(tpName)) { - returnedPoint = tp; + synchronized(travelMap) { + for (TravelPoint tp : tpMap) { + if (tp.getName().equals(tpName)) { + returnedPoint = tp; + } } } + if (returnedPoint == null) { System.out.println("Couldn't find a travelpoint w/ name " + tpName); } return returnedPoint; } @@ -258,7 +286,6 @@ public class TravelService implements INetworkDispatch { TravelPoint travelPoint = new TravelPoint(name, x, y, z, 150); travelPoint.setPlanetName(WordUtils.capitalize(planet.getName())); - if (travelMap.containsKey(planet)) { travelMap.get(planet).add(travelPoint); @@ -271,6 +298,7 @@ public class TravelService implements INetworkDispatch { System.out.println("Added planet " + planet.getName() + " to TravelMap."); System.out.println("Added travel point " + travelPoint.getName()); } + } public void removeTravelPointByName(Planet planet, String name){