From b43eb937727912cac7358efdd475362be2077f59 Mon Sep 17 00:00:00 2001 From: Waverunner Date: Wed, 23 Oct 2013 16:22:25 -0400 Subject: [PATCH] Most of Travel service finished --- .../building/tatooine/starport_tatooine.py | 1 + src/protocol/swg/ChatFriendsListUpdate.java | 2 - .../swg/ChatOnChangeFriendStatus.java | 1 - .../swg/PlanetTravelPointListRequest.java} | 47 +++++++- .../swg/PlanetTravelPointListResponse.java | 89 ++++++++++++++ src/resources/common/Opcodes.java | 1 + src/services/chat/ChatService.java | 2 +- src/services/map/MapService.java | 4 + src/services/travel/TravelPoint.java | 72 +++++++++++ src/services/travel/TravelService.java | 112 ++++++++++++++++++ 10 files changed, 325 insertions(+), 6 deletions(-) rename src/{services/TravelService.java => protocol/swg/PlanetTravelPointListRequest.java} (57%) create mode 100644 src/protocol/swg/PlanetTravelPointListResponse.java create mode 100644 src/services/travel/TravelPoint.java create mode 100644 src/services/travel/TravelService.java diff --git a/scripts/object/building/tatooine/starport_tatooine.py b/scripts/object/building/tatooine/starport_tatooine.py index e71c9121..0200b779 100644 --- a/scripts/object/building/tatooine/starport_tatooine.py +++ b/scripts/object/building/tatooine/starport_tatooine.py @@ -11,5 +11,6 @@ def setup(core, object): stcSvc.spawnObject('object/tangible/terminal/shared_terminal_travel.iff', object.getPlanet().getName(), cell.getObjectID(), float(-13.2), float(0.6), float(51.3), float(-0.195405), float(-0.980722)) core.mapService.addLocation(object.getPlanet(), 'Starport', object.getPosition().x, object.getPosition().z, 15, 0, 0) + #core.travelService.addTravelPoint(object.getPlanet(), ) return \ No newline at end of file diff --git a/src/protocol/swg/ChatFriendsListUpdate.java b/src/protocol/swg/ChatFriendsListUpdate.java index ec4ead39..b804c17b 100644 --- a/src/protocol/swg/ChatFriendsListUpdate.java +++ b/src/protocol/swg/ChatFriendsListUpdate.java @@ -11,8 +11,6 @@ import engine.resources.config.DefaultConfig; public class ChatFriendsListUpdate extends SWGMessage { - - private NGECore core; private String friendName; private byte onlineFlag; diff --git a/src/protocol/swg/ChatOnChangeFriendStatus.java b/src/protocol/swg/ChatOnChangeFriendStatus.java index c78c24be..5eeb3f33 100644 --- a/src/protocol/swg/ChatOnChangeFriendStatus.java +++ b/src/protocol/swg/ChatOnChangeFriendStatus.java @@ -11,7 +11,6 @@ import engine.resources.config.DefaultConfig; public class ChatOnChangeFriendStatus extends SWGMessage { - private NGECore core; private String name; private int type; private long playerID; diff --git a/src/services/TravelService.java b/src/protocol/swg/PlanetTravelPointListRequest.java similarity index 57% rename from src/services/TravelService.java rename to src/protocol/swg/PlanetTravelPointListRequest.java index dd5c5dc4..c47fffb6 100644 --- a/src/services/TravelService.java +++ b/src/protocol/swg/PlanetTravelPointListRequest.java @@ -19,8 +19,51 @@ * Using NGEngine to work with NGECore2 is making a combined work based on NGEngine. * Therefore all terms and conditions of the GNU Lesser General Public License cover the combination. ******************************************************************************/ -package services; +package protocol.swg; -public class TravelService { +import main.NGECore; + +import org.apache.mina.core.buffer.IoBuffer; + +import engine.resources.scene.Planet; + +public class PlanetTravelPointListRequest extends SWGMessage{ + + private NGECore core; + private long objectId; + private Planet planet; + + @Override + public void deserialize(IoBuffer buffer) { + + buffer.getShort(); + buffer.getInt(); + + setObjectId(buffer.getLong()); + setPlanet(getAsciiString(buffer)); + + } + + @Override + public IoBuffer serialize() { + return null; + } + + public long getObjectId() { + return objectId; + } + + public void setObjectId(long objectId) { + this.objectId = objectId; + } + + public Planet getPlanet() { + return planet; + } + + public void setPlanet(String asciiString) { + Planet planet = core.terrainService.getPlanetByName(asciiString); + this.planet = planet; + } } diff --git a/src/protocol/swg/PlanetTravelPointListResponse.java b/src/protocol/swg/PlanetTravelPointListResponse.java new file mode 100644 index 00000000..414a52ff --- /dev/null +++ b/src/protocol/swg/PlanetTravelPointListResponse.java @@ -0,0 +1,89 @@ +/******************************************************************************* + * Copyright (c) 2013 + * + * This File is part of NGECore2. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + * + * Using NGEngine to work with NGECore2 is making a combined work based on NGEngine. + * Therefore all terms and conditions of the GNU Lesser General Public License cover the combination. + ******************************************************************************/ +package protocol.swg; + +import java.nio.ByteOrder; +import java.util.Vector; + +import main.NGECore; + +import org.apache.mina.core.buffer.IoBuffer; + +import services.travel.TravelPoint; +import engine.resources.scene.Planet; + +@SuppressWarnings("unused") +public class PlanetTravelPointListResponse extends SWGMessage { + + private NGECore core; + private Planet originatePlanet; + private Vector travelPoints; + + public PlanetTravelPointListResponse(Planet planet, Vector travelPoints) { + this.originatePlanet = planet; + } + + @Override + public void deserialize(IoBuffer data) { + + } + + @Override + public IoBuffer serialize() { + IoBuffer result = IoBuffer.allocate(100).order(ByteOrder.LITTLE_ENDIAN); + + result.putShort((short) 9); + result.putInt(0x4D32541F); + + result.put(getAsciiString(originatePlanet.getName())); + result.putInt(core.terrainService.getPlanetList().size()); + + result.putInt(travelPoints.size()); // shuttles/sp count + for (TravelPoint point : travelPoints) { + result.put(getAsciiString(point.getName())); + } + + result.putInt(travelPoints.size()); // shuttles/sp count + for (TravelPoint point : travelPoints) { + + result.putFloat(point.getPosX()); + result.putFloat(point.getPosZ()); // Z and Y may be switched + result.putFloat(point.getPosY()); + + } + + result.putInt(travelPoints.size()); // shuttes/sp count + for (TravelPoint point : travelPoints) { + // TODO: Change ticket price based on planet/distance + result.putInt(point.getTicketPrice()); + } + + result.putInt(travelPoints.size()); + for (TravelPoint point : travelPoints) { + // TODO: Change based on planet/distance + result.put((byte) 1); // isReachable + } + result.flip(); + return result; + } + +} diff --git a/src/resources/common/Opcodes.java b/src/resources/common/Opcodes.java index 9b66fa41..9bdfbc48 100644 --- a/src/resources/common/Opcodes.java +++ b/src/resources/common/Opcodes.java @@ -51,5 +51,6 @@ public class Opcodes { public static int GcwRegionsRsp = CRC.StringtoCRC("GcwRegionsRsp"); public static int GcwGroupsRsp = CRC.StringtoCRC("GcwGroupsRsp"); public static int ExpertiseRequestMessage = 0xC19085D5; + public static int PlanetTravelPointListRequest = 0x96405D4D; } diff --git a/src/services/chat/ChatService.java b/src/services/chat/ChatService.java index db8426c2..0b32913a 100644 --- a/src/services/chat/ChatService.java +++ b/src/services/chat/ChatService.java @@ -344,7 +344,7 @@ public class ChatService implements INetworkDispatch { friendName = friendName.toLowerCase(); - SWGObject friendObject = getObjectByFirstName(friendName); + //SWGObject friendObject = getObjectByFirstName(friendName); if (actor == null || actor.getContainer() == null) return; diff --git a/src/services/map/MapService.java b/src/services/map/MapService.java index e1d81d93..29a6d1fe 100644 --- a/src/services/map/MapService.java +++ b/src/services/map/MapService.java @@ -138,4 +138,8 @@ public class MapService implements INetworkDispatch { } + public Vector getPlanetMapLocations(Planet planet) { + return locationMap.get(planet); + } + } diff --git a/src/services/travel/TravelPoint.java b/src/services/travel/TravelPoint.java new file mode 100644 index 00000000..ae314aa9 --- /dev/null +++ b/src/services/travel/TravelPoint.java @@ -0,0 +1,72 @@ +/******************************************************************************* + * Copyright (c) 2013 + * + * This File is part of NGECore2. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + * + * Using NGEngine to work with NGECore2 is making a combined work based on NGEngine. + * Therefore all terms and conditions of the GNU Lesser General Public License cover the combination. + ******************************************************************************/ +package services.travel; + +public class TravelPoint { + + private String name; + private float posX; + private float posY; + private float posZ; + private int ticketPrice; + + public TravelPoint() { + } + + public TravelPoint(String name, float x, float y, float z, int price) { + this.name = name; + this.posX = x; + this.posY = y; + this.posZ = z; + } + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public float getPosX() { + return posX; + } + public void setPosX(float posX) { + this.posX = posX; + } + public float getPosY() { + return posY; + } + public void setPosY(float posY) { + this.posY = posY; + } + public float getPosZ() { + return posZ; + } + public void setPosZ(float posZ) { + this.posZ = posZ; + } + public int getTicketPrice() { + return ticketPrice; + } + public void setTicketPrice(int ticketPrice) { + this.ticketPrice = ticketPrice; + } +} diff --git a/src/services/travel/TravelService.java b/src/services/travel/TravelService.java new file mode 100644 index 00000000..02f3c724 --- /dev/null +++ b/src/services/travel/TravelService.java @@ -0,0 +1,112 @@ +/******************************************************************************* + * Copyright (c) 2013 + * + * This File is part of NGECore2. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + * + * Using NGEngine to work with NGECore2 is making a combined work based on NGEngine. + * Therefore all terms and conditions of the GNU Lesser General Public License cover the combination. + ******************************************************************************/ +package services.travel; + +import java.nio.ByteOrder; +import java.util.Map; +import java.util.Vector; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.mina.core.buffer.IoBuffer; +import org.apache.mina.core.session.IoSession; + +import protocol.swg.PlanetTravelPointListRequest; +import protocol.swg.PlanetTravelPointListResponse; +import engine.clients.Client; +import engine.resources.objects.SWGObject; +import engine.resources.scene.Planet; +import engine.resources.service.INetworkDispatch; +import engine.resources.service.INetworkRemoteEvent; +import main.NGECore; +import resources.common.Opcodes; +import services.map.*; + +public class TravelService implements INetworkDispatch { + + private NGECore core; + + private Map> travelMap = new ConcurrentHashMap>(); + + public TravelService(NGECore core) { + this.core = core; + } + + @Override + public void insertOpcodes(Map swgOpcodes, Map objControllerOpcodes) { + swgOpcodes.put(Opcodes.PlanetTravelPointListRequest, new INetworkRemoteEvent() { + + @Override + public void handlePacket(IoSession session, IoBuffer data) throws Exception { + + data.order(ByteOrder.LITTLE_ENDIAN); + + PlanetTravelPointListRequest request = new PlanetTravelPointListRequest(); + request.deserialize(data); + + Client client = core.getClient((Integer) session.getAttribute("connectionId")); + + if(client == null || client.getSession() == null) + return; + + SWGObject object = client.getParent(); + + if(object == null) + return; + + PlanetTravelPointListResponse response = new PlanetTravelPointListResponse(request.getPlanet(), travelMap.get(request.getPlanet())); + client.getSession().write(response.serialize()); + + } + + }); + + } + + public void addPlanet(Planet planet) { + Vector travelPointVector = new Vector(); + travelMap.put(planet, travelPointVector); + } + + + public void addTravelPoint(Planet planet, String name, float x, float y, float z) { + TravelPoint travelPoint = new TravelPoint(name, x, y, z, 100); + + if (travelMap.get(planet) != null) { + + travelMap.get(planet).add(travelPoint); + System.out.println("Added travel point " + travelPoint.getName()); + + } else { + Vector travelPointVector = new Vector(); + travelMap.put(planet, travelPointVector); + travelMap.get(planet).add(travelPoint); + System.out.println("Added planet " + planet.getName() + " with travel point: " + travelPoint.getName()); + } + + + } + + @Override + public void shutdown() { + + } +}