diff --git a/scripts/object/tangible/terminal/terminal_mission.py b/scripts/object/tangible/terminal/terminal_mission.py index 4884aa67..ccf684c0 100644 --- a/scripts/object/tangible/terminal/terminal_mission.py +++ b/scripts/object/tangible/terminal/terminal_mission.py @@ -1,7 +1,9 @@ +from resources.common import TerminalType import sys def setup(core, object): core.mapService.addLocation(object.getPlanet(), 'Mission Terminal', object.getPosition().x, object.getPosition().z, 41, 44, 0) + object.setAttachment("terminalType", TerminalType.MISSION_GENERIC) return \ No newline at end of file diff --git a/src/main/NGECore.java b/src/main/NGECore.java index 77bac93b..9ac42a8c 100644 --- a/src/main/NGECore.java +++ b/src/main/NGECore.java @@ -35,7 +35,6 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import net.engio.mbassy.bus.config.BusConfiguration; - import resources.common.RadialOptions; import resources.common.ThreadMonitor; import resources.objects.creature.CreatureObject; @@ -47,6 +46,7 @@ import services.EntertainmentService; import services.EquipmentService; import services.GroupService; import services.LoginService; +import services.MissionService; import services.PlayerService; import services.ScriptService; import services.SimulationService; @@ -144,6 +144,7 @@ public class NGECore { public WeatherService weatherService; public SpawnService spawnService; public AIService aiService; + //public MissionService missionService; // Login Server public NetworkDispatch loginDispatch; @@ -220,6 +221,7 @@ public class NGECore { entertainmentService = new EntertainmentService(this); spawnService = new SpawnService(this); aiService = new AIService(this); + //missionService = new MissionService(this); // Ping Server try { @@ -250,6 +252,7 @@ public class NGECore { zoneDispatch.addService(playerService); zoneDispatch.addService(buffService); zoneDispatch.addService(entertainmentService); + //zoneDispatch.addService(missionService); zoneServer = new MINAServer(zoneDispatch, config.getInt("ZONE.PORT")); zoneServer.start(); diff --git a/src/protocol/swg/objectControllerObjects/MissionListRequest.java b/src/protocol/swg/objectControllerObjects/MissionListRequest.java index 1cafd618..7fbe2d02 100644 --- a/src/protocol/swg/objectControllerObjects/MissionListRequest.java +++ b/src/protocol/swg/objectControllerObjects/MissionListRequest.java @@ -39,6 +39,7 @@ public class MissionListRequest extends ObjControllerObject { public void deserialize(IoBuffer data) { Console.println("MissionListRequest: " + StringUtilities.bytesToHex(data.array())); setObjectId(data.getLong()); + data.getInt(); // unk data.get(); // unk byte setTickCount(data.get()); setTerminalId(data.getLong()); diff --git a/src/resources/common/ObjControllerOpcodes.java b/src/resources/common/ObjControllerOpcodes.java index 17c9784c..551857d9 100644 --- a/src/resources/common/ObjControllerOpcodes.java +++ b/src/resources/common/ObjControllerOpcodes.java @@ -31,6 +31,6 @@ public class ObjControllerOpcodes { public static final int OBJECT_MENU_REQUEST = 0x46010000; public static final int SECURE_TRADE = 0x15010000; public static final int BUFF_BUILDER_CHANGE = 0x5A020000; - public static final int MISSION_LIST_REQUEST = 0x5F000000; + public static final int MISSION_LIST_REQUEST = 0xF5000000; } diff --git a/src/resources/objects/mission/MissionMessageBuilder.java b/src/resources/objects/mission/MissionMessageBuilder.java index dff9bc55..190773ad 100644 --- a/src/resources/objects/mission/MissionMessageBuilder.java +++ b/src/resources/objects/mission/MissionMessageBuilder.java @@ -26,6 +26,8 @@ import java.nio.ByteOrder; import org.apache.mina.core.buffer.IoBuffer; import engine.resources.common.CRC; +import resources.common.Console; +import resources.common.StringUtilities; import resources.objects.ObjectMessageBuilder; import resources.objects.waypoint.WaypointObject; @@ -40,7 +42,7 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { IoBuffer buffer = IoBuffer.allocate(100, false).order(ByteOrder.LITTLE_ENDIAN); buffer.setAutoExpand(true); - buffer.putShort((short) 11); + buffer.putShort((short) 17); buffer.putFloat(1); // mission complexity ?? buffer.put(getAsciiString(mission.getStfFilename())); @@ -50,7 +52,7 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { if (mission.getCustomName() == null) { buffer.put(getUnicodeString("")); } else { buffer.put(getUnicodeString(mission.getCustomName())); } - buffer.putInt(mission.getVolume()); + buffer.putInt(0); // volume buffer.putInt(0); // unused buffer.putInt(mission.getMissionLevel()); @@ -60,8 +62,12 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { buffer.putLong(0); // ?? - buffer.putInt(CRC.StringtoCRC(mission.getMissionStartPlanet())); - + if (mission.getMissionStartPlanet() == null) { + buffer.putInt(0); + } else { + buffer.putInt(CRC.StringtoCRC(mission.getMissionStartPlanet())); + } + buffer.put(getUnicodeString(mission.getMissionCreator())); buffer.putInt(mission.getMissionCredits()); @@ -71,10 +77,18 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { buffer.putLong(0); // ?? - buffer.putInt(CRC.StringtoCRC(mission.getMissionDestinationPlanet())); - - buffer.putInt(CRC.StringtoCRC(mission.getMissionTemplateObject())); + if (mission.getMissionDestinationPlanet() == null) { + buffer.putInt(0); + } else { + buffer.putInt(CRC.StringtoCRC(mission.getMissionDestinationPlanet())); + } + if (mission.getTargetTemplateObject() == null) { + buffer.putInt(0); + } else { + buffer.putInt(CRC.StringtoCRC(mission.getTargetTemplateObject())); + } + buffer.put(getAsciiString(mission.getMissionDescription())); buffer.putInt(0); buffer.put(getAsciiString(mission.getMissionDescId())); @@ -85,8 +99,12 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { buffer.putInt(0); // refresh counter - buffer.putInt(CRC.StringtoCRC(mission.getMissionType())); - + if(mission.getMissionType() == null) { + buffer.putInt(0); + } else { + buffer.putInt(CRC.StringtoCRC(mission.getMissionType())); + } + buffer.put(getAsciiString(mission.getMissionTargetName())); WaypointObject wp = mission.getMissionAttachedWaypoint(); @@ -109,6 +127,8 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { buffer.putFloat(wp.getPosition().y); buffer.putLong(0); buffer.putInt(CRC.StringtoCRC(wp.getPlanet().name)); + buffer.put((byte) 0); + buffer.put((byte) 0x01); } int size = buffer.position(); buffer = bufferPool.allocate(size, false).put(buffer.array(), 0, size); @@ -116,6 +136,7 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { buffer.flip(); buffer = createBaseline("MISO", (byte) 3, buffer, size); + Console.println("Bytes: " + StringUtilities.bytesToHex(buffer.array())); return buffer; } @@ -132,14 +153,13 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } - public IoBuffer buildStfDelta() { - MissionObject mission = (MissionObject) object; + public IoBuffer buildStfDelta(String stfFile, String stfName) { - IoBuffer buffer = IoBuffer.allocate(4 + mission.getStfFilename().length() + mission.getStfName().length(), false).order(ByteOrder.LITTLE_ENDIAN); + IoBuffer buffer = IoBuffer.allocate(4 + stfFile.length() + stfName.length(), false).order(ByteOrder.LITTLE_ENDIAN); - buffer.put(getAsciiString(mission.getStfFilename())); + buffer.put(getAsciiString(stfFile)); buffer.putInt(0); - buffer.put(getAsciiString(mission.getStfName())); + buffer.put(getAsciiString(stfName)); int size = buffer.position(); buffer.flip(); @@ -148,12 +168,11 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } - public IoBuffer buildDifficultyLevelDelta() { - MissionObject mission = (MissionObject) object; + public IoBuffer buildDifficultyLevelDelta(int difficulty) { IoBuffer buffer = IoBuffer.allocate(4, false).order(ByteOrder.LITTLE_ENDIAN); - buffer.putInt(mission.getMissionLevel()); + buffer.putInt(difficulty); int size = buffer.position(); buffer.flip(); @@ -162,18 +181,17 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } - public IoBuffer buildStartLocationDelta() { - MissionObject mission = (MissionObject) object; - + public IoBuffer buildStartLocationDelta(float x, float z, float y, String planet) { + IoBuffer buffer = IoBuffer.allocate(24, false).order(ByteOrder.LITTLE_ENDIAN); - buffer.putFloat(mission.getMissionStartX()); - buffer.putFloat(mission.getMissionStartZ()); - buffer.putFloat(mission.getMissionStartY()); + buffer.putFloat(x); + buffer.putFloat(z); + buffer.putFloat(y); buffer.putLong(0); - buffer.putInt(CRC.StringtoCRC(mission.getMissionStartPlanet())); + buffer.putInt(CRC.StringtoCRC(planet)); int size = buffer.position(); buffer.flip(); @@ -182,12 +200,11 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } - public IoBuffer buildCreatorNameDelta() { - MissionObject mission = (MissionObject) object; + public IoBuffer buildCreatorNameDelta(String creator) { + + IoBuffer buffer = IoBuffer.allocate(4 + creator.length(), false).order(ByteOrder.LITTLE_ENDIAN); - IoBuffer buffer = IoBuffer.allocate(4 + mission.getMissionCreator().length(), false).order(ByteOrder.LITTLE_ENDIAN); - - buffer.put(getAsciiString(mission.getMissionCreator())); + buffer.put(getAsciiString(creator)); int size = buffer.position(); buffer.flip(); @@ -196,12 +213,11 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } - public IoBuffer buildCreditsRewardDelta() { - MissionObject mission = (MissionObject) object; - + public IoBuffer buildCreditsRewardDelta(int creds) { + IoBuffer buffer = IoBuffer.allocate(4, false).order(ByteOrder.LITTLE_ENDIAN); - buffer.putInt(mission.getMissionCredits()); + buffer.putInt(creds); int size = buffer.position(); buffer.flip(); @@ -210,18 +226,17 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } - public IoBuffer buildDestinationDelta() { - MissionObject mission = (MissionObject) object; - + public IoBuffer buildDestinationDelta(float x, float z, float y, String planet) { + IoBuffer buffer = IoBuffer.allocate(24, false).order(ByteOrder.LITTLE_ENDIAN); - buffer.putFloat(mission.getMissionDestinationX()); - buffer.putFloat(mission.getMissionDestinationZ()); - buffer.putFloat(mission.getMissionDestinationY()); + buffer.putFloat(x); + buffer.putFloat(z); + buffer.putFloat(y); buffer.putLong(0); // Destination Object ID - buffer.putInt(CRC.StringtoCRC(mission.getMissionDestinationPlanet())); + buffer.putInt(CRC.StringtoCRC(planet)); int size = buffer.position(); buffer.flip(); @@ -230,12 +245,11 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } - public IoBuffer buildTargetObjectIffDelta() { - MissionObject mission = (MissionObject) object; - + public IoBuffer buildTargetObjectIffDelta(String template) { + IoBuffer buffer = IoBuffer.allocate(4, false).order(ByteOrder.LITTLE_ENDIAN); - buffer.putInt(CRC.StringtoCRC(mission.getMissionTemplateObject())); + buffer.putInt(CRC.StringtoCRC(template)); int size = buffer.position(); buffer.flip(); @@ -244,14 +258,13 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } - public IoBuffer buildMissionDescriptionDelta() { - MissionObject mission = (MissionObject) object; + public IoBuffer buildMissionDescriptionDelta(String desc, String id) { - IoBuffer buffer = IoBuffer.allocate(4 + mission.getMissionDescription().length() + mission.getMissionDescId().length(), false).order(ByteOrder.LITTLE_ENDIAN); + IoBuffer buffer = IoBuffer.allocate(8 + desc.length() + id.length(), false).order(ByteOrder.LITTLE_ENDIAN); - buffer.put(getAsciiString(mission.getMissionDescription())); + buffer.put(getAsciiString(desc)); buffer.putInt(0); - buffer.put(getAsciiString(mission.getMissionDescId())); + buffer.put(getAsciiString(id)); int size = buffer.position(); buffer.flip(); @@ -260,14 +273,13 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } - public IoBuffer buildMissionTitleDelta() { - MissionObject mission = (MissionObject) object; + public IoBuffer buildMissionTitleDelta(String title, String id) { + + IoBuffer buffer = IoBuffer.allocate(8 + title.length() + id.length(), false).order(ByteOrder.LITTLE_ENDIAN); - IoBuffer buffer = IoBuffer.allocate(4 + mission.getMissionTitle().length() + mission.getMissionTitleId().length(), false).order(ByteOrder.LITTLE_ENDIAN); - - buffer.put(getAsciiString(mission.getMissionTitle())); + buffer.put(getAsciiString(title)); buffer.putInt(0); - buffer.put(getAsciiString(mission.getMissionTitleId())); + buffer.put(getAsciiString(id)); int size = buffer.position(); buffer.flip(); @@ -276,12 +288,11 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } - public IoBuffer buildRepeatCounterDelta() { - MissionObject mission = (MissionObject) object; + public IoBuffer buildRepeatCounterDelta(int counter) { IoBuffer buffer = IoBuffer.allocate(4, false).order(ByteOrder.LITTLE_ENDIAN); - buffer.putInt(mission.getMissionRepeatCounter()); + buffer.putInt(counter); int size = buffer.position(); buffer.flip(); @@ -290,12 +301,11 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } - public IoBuffer buildMissionTypeDelta() { - MissionObject mission = (MissionObject) object; - + public IoBuffer buildMissionTypeDelta(String type) { + IoBuffer buffer = IoBuffer.allocate(4, false).order(ByteOrder.LITTLE_ENDIAN); - buffer.putInt(CRC.StringtoCRC(mission.getMissionType())); + buffer.putInt(CRC.StringtoCRC(type)); int size = buffer.position(); buffer.flip(); @@ -304,12 +314,11 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } - public IoBuffer buildTargetNameDelta() { - MissionObject mission = (MissionObject) object; + public IoBuffer buildTargetNameDelta(String targetName) { - IoBuffer buffer = IoBuffer.allocate(4 + mission.getMissionTargetName().length(), false).order(ByteOrder.LITTLE_ENDIAN); + IoBuffer buffer = IoBuffer.allocate(4 + targetName.length(), false).order(ByteOrder.LITTLE_ENDIAN); - buffer.put(getAsciiString(mission.getMissionTargetName())); + buffer.put(getAsciiString(targetName)); int size = buffer.position(); buffer.flip(); diff --git a/src/resources/objects/mission/MissionObject.java b/src/resources/objects/mission/MissionObject.java index c98ab0c7..635da311 100644 --- a/src/resources/objects/mission/MissionObject.java +++ b/src/resources/objects/mission/MissionObject.java @@ -23,7 +23,9 @@ package resources.objects.mission; import com.sleepycat.je.Environment; import com.sleepycat.je.Transaction; +import com.sleepycat.persist.model.Entity; import com.sleepycat.persist.model.NotPersistent; +import com.sleepycat.persist.model.Persistent; import resources.objects.tangible.TangibleObject; import resources.objects.waypoint.WaypointObject; @@ -34,6 +36,7 @@ import engine.resources.scene.Planet; import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; +@Persistent(version=1) public class MissionObject extends SWGObject implements IPersistent { private float missionDestinationX; @@ -47,12 +50,12 @@ public class MissionObject extends SWGObject implements IPersistent { private String missionDestinationPlanet; private int missionRepeatCounter; // increases for each player using the mission; used for redisplaying on mission term too private int missionCredits; - private String missionCreator; - private String missionDescription; - private String missionTitle; - private String missionTargetName; // target/destination - private String missionDescId; - private String missionTitleId; + private String missionCreator = ""; + private String missionDescription = ""; + private String missionTitle = ""; + private String missionTargetName = ""; // Target object I guess? + private String missionDescId = ""; + private String missionTitleId = ""; private String missionType; private WaypointObject missionAttachedWaypoint; @@ -63,158 +66,222 @@ public class MissionObject extends SWGObject implements IPersistent { @NotPersistent private Transaction txn; - + + public MissionObject() { + super(); + } public MissionObject(long objectID, Planet planet, String template) { super(objectID, planet, new Point3D(0, 0, 0), new Quaternion(1, 0, 0, 0), template); } public float getMissionStartX() { - return missionStartX; + synchronized(objectMutex) { + return missionStartX; + } } public float getMissionStartY() { - return missionStartY; + synchronized(objectMutex) { + return missionStartY; + } } public float getMissionStartZ() { - return missionStartZ; + synchronized(objectMutex) { + return missionStartZ; + } } - public void setMissionStart(float x, float y, float z) { - this.missionStartZ = z; - this.missionStartX = x; - this.missionStartY = y; + public void setMissionStart(float x, float y, float z, String planet) { + synchronized(objectMutex) { + this.missionStartZ = z; + this.missionStartX = x; + this.missionStartY = y; + this.missionStartPlanet = planet; + } + + notifyObservers(messageBuilder.buildStartLocationDelta(x, z, y, planet), false); } public float getMissionDestinationX() { - return missionDestinationX; + synchronized(objectMutex) { + return missionDestinationX; + } } public float getMissionDestinationY() { - return missionDestinationY; + synchronized(objectMutex) { + return missionDestinationY; + } } public float getMissionDestinationZ() { - return missionDestinationZ; + synchronized(objectMutex) { + return missionDestinationZ; + } } - public void setMissionDestination(float x, float y, float z) { - this.missionDestinationZ = z; - this.missionDestinationY = y; - this.missionDestinationZ = z; + public void setMissionDestination(float x, float y, float z, String planet) { + synchronized(objectMutex) { + this.missionDestinationZ = z; + this.missionDestinationY = y; + this.missionDestinationZ = z; + this.missionDestinationPlanet = planet; + } } public String getMissionDestinationPlanet() { - return missionDestinationPlanet; - } - - public void setMissionDestinationPlanet(String missionDestinationPlanet) { - this.missionDestinationPlanet = missionDestinationPlanet; + synchronized(objectMutex) { + return missionDestinationPlanet; + } } public int getMissionLevel() { - return missionLevel; + synchronized(objectMutex) { + return missionLevel; + } } public void setMissionLevel(int missionLevel) { - this.missionLevel = missionLevel; + synchronized(objectMutex) { + this.missionLevel = missionLevel; + } } public String getMissionStartPlanet() { - return missionStartPlanet; - } - - public void setMissionStartPlanet(String missionStartPlanetCRC) { - this.missionStartPlanet = missionStartPlanetCRC; + synchronized(objectMutex) { + return missionStartPlanet; + } } public int getMissionRepeatCounter() { - return missionRepeatCounter; + synchronized(objectMutex) { + return missionRepeatCounter; + } } public void setMissionRepeatCounter(int missionRepeatCounter) { - this.missionRepeatCounter = missionRepeatCounter; + synchronized(objectMutex) { + this.missionRepeatCounter = missionRepeatCounter; + } } public int getMissionCredits() { - return missionCredits; + synchronized(objectMutex) { + return missionCredits; + } } public void setMissionCredits(int missionCredits) { - this.missionCredits = missionCredits; + synchronized(objectMutex) { + this.missionCredits = missionCredits; + } + notifyObservers(messageBuilder.buildCreditsRewardDelta(missionCredits), false); } public String getMissionCreator() { - return missionCreator; + synchronized(objectMutex) { + return missionCreator; + } } public void setMissionCreator(String missionCreator) { - this.missionCreator = missionCreator; + synchronized(objectMutex) { + this.missionCreator = missionCreator; + } + notifyObservers(messageBuilder.buildCreatorNameDelta(missionCreator), false); } public String getMissionDescription() { - return missionDescription; + synchronized(objectMutex) { + return missionDescription; + } } - public void setMissionDescription(String missionDescription) { - this.missionDescription = missionDescription; + public void setMissionDescription(String missionDescription, String id) { + synchronized(objectMutex) { + this.missionDescription = missionDescription; + this.missionDescId = id; + } + notifyObservers(messageBuilder.buildMissionDescriptionDelta(missionDescription, id), false); } public String getMissionTitle() { - return missionTitle; + synchronized(objectMutex) { + return missionTitle; + } } - public void setMissionTitle(String missionTitle) { - this.missionTitle = missionTitle; + public void setMissionTitle(String missionTitle, String id) { + synchronized(objectMutex) { + this.missionTitle = missionTitle; + this.missionTitleId = id; + } + notifyObservers(messageBuilder.buildMissionTitleDelta(missionTitle, id), false); } public String getMissionTargetName() { - return missionTargetName; + synchronized(objectMutex) { + return missionTargetName; + } } public void setMissionTargetName(String missionTargetName) { - this.missionTargetName = missionTargetName; + synchronized(objectMutex) { + this.missionTargetName = missionTargetName; + } + notifyObservers(messageBuilder.buildTargetNameDelta(missionTargetName), false); } public WaypointObject getMissionAttachedWaypoint() { - return missionAttachedWaypoint; + synchronized(objectMutex) { + return missionAttachedWaypoint; + } } public void setMissionAttachedWaypoint(WaypointObject missionAttachedWaypoint) { - this.missionAttachedWaypoint = missionAttachedWaypoint; + synchronized(objectMutex) { + this.missionAttachedWaypoint = missionAttachedWaypoint; + } } - public String getMissionTemplateObject() { - return missionTemplateObject; + public String getTargetTemplateObject() { + synchronized(objectMutex) { + return missionTemplateObject; + } } - public void setMissionTemplateObject(String missionTemplateObject) { - this.missionTemplateObject = missionTemplateObject; + public void setTargetTemplateObject(String missionTemplateObject) { + synchronized(objectMutex) { + this.missionTemplateObject = missionTemplateObject; + } + notifyObservers(messageBuilder.buildTargetObjectIffDelta(missionTemplateObject), false); } public String getMissionDescId() { - return missionDescId; - } - - public void setMissionDescId(String missionDescId) { - this.missionDescId = missionDescId; + synchronized(objectMutex) { + return missionDescId; + } } public String getMissionTitleId() { - return missionTitleId; - } - - public void setMissionTitleId(String missionTitleId) { - this.missionTitleId = missionTitleId; + synchronized(objectMutex) { + return missionTitleId; + } } public String getMissionType() { - return missionType; + synchronized(objectMutex) { + return missionType; + } } public void setMissionType(String missionType) { - this.missionType = missionType; + synchronized(objectMutex) { + this.missionType = missionType; + } + notifyObservers(messageBuilder.buildMissionTypeDelta(missionType), false); } public Transaction getTransaction() { diff --git a/src/services/CharacterService.java b/src/services/CharacterService.java index 5298d0da..99d3f926 100644 --- a/src/services/CharacterService.java +++ b/src/services/CharacterService.java @@ -37,6 +37,7 @@ import engine.clients.Client; import engine.resources.common.CRC; import engine.resources.container.CreatureContainerPermissions; import engine.resources.container.CreaturePermissions; +import engine.resources.container.Traverser; import engine.resources.database.DatabaseConnection; import engine.resources.objects.SWGObject; import engine.resources.scene.Point3D; @@ -44,7 +45,6 @@ import engine.resources.scene.Quaternion; import engine.resources.service.INetworkDispatch; import engine.resources.service.INetworkRemoteEvent; import resources.common.*; - import protocol.swg.ClientCreateCharacter; import protocol.swg.ClientMfdStatusUpdateMessage; import protocol.swg.ClientRandomNameRequest; @@ -53,8 +53,8 @@ import protocol.swg.ClientVerifyAndLockNameRequest; import protocol.swg.ClientVerifyAndLockNameResponse; import protocol.swg.CreateCharacterSuccess; import protocol.swg.HeartBeatMessage; - import resources.objects.creature.CreatureObject; +import resources.objects.mission.MissionObject; import resources.objects.player.PlayerObject; import resources.objects.tangible.TangibleObject; import resources.objects.weapon.WeaponObject; @@ -264,6 +264,14 @@ public class CharacterService implements INetworkDispatch { object._add(datapad); object._add(bank); object._add(missionBag); + + /*for(int missionsAdded = 0; missionsAdded < 12; missionsAdded++) { + MissionObject mission = (MissionObject) core.objectService.createObject("object/mission/shared_mission_object.iff", object.getPlanet()); + + missionBag._add(mission); + Console.println("Added empty mission " + missionsAdded); + }*/ + TangibleObject backpack = (TangibleObject) core.objectService.createObject("object/tangible/wearables/backpack/shared_backpack_galactic_marine.iff", object.getPlanet()); inventory._add(backpack); //object.addObjectToEquipList(datapad); diff --git a/src/services/MissionService.java b/src/services/MissionService.java index d376f698..4eaca9bb 100644 --- a/src/services/MissionService.java +++ b/src/services/MissionService.java @@ -21,29 +21,192 @@ ******************************************************************************/ package services; +import java.nio.ByteOrder; import java.util.Map; +import java.util.Random; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; + +import main.NGECore; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.session.IoSession; +import protocol.swg.objectControllerObjects.MissionListRequest; +import resources.common.Console; +import resources.common.TerminalType; import resources.common.ObjControllerOpcodes; +import resources.objects.creature.CreatureObject; +import resources.objects.mission.MissionObject; +import resources.objects.tangible.TangibleObject; +import engine.clientdata.ClientFileManager; +import engine.clientdata.visitors.DatatableVisitor; +import engine.clients.Client; +import engine.resources.container.Traverser; +import engine.resources.objects.SWGObject; +import engine.resources.scene.Planet; import engine.resources.service.INetworkDispatch; import engine.resources.service.INetworkRemoteEvent; public class MissionService implements INetworkDispatch { + private NGECore core; + + public MissionService(NGECore core) { + this.core = core; + } + @Override public void insertOpcodes(Map swgOpcodes, Map objControllerOpcodes) { objControllerOpcodes.put(ObjControllerOpcodes.MISSION_LIST_REQUEST, new INetworkRemoteEvent() { @Override public void handlePacket(IoSession session, IoBuffer data) throws Exception { + data.order(ByteOrder.LITTLE_ENDIAN); + + MissionListRequest request = new MissionListRequest(); + 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; + + SWGObject terminal = core.objectService.getObject(request.getTerminalId()); + + int terminalType = (int) terminal.getAttachment("terminalType"); + + if (terminalType == TerminalType.MISSION_GENERIC) { + populateMissions(core.objectService.getObject(request.getObjectId()), TerminalType.MISSION_GENERIC); + } else if (terminalType == TerminalType.MISSION_BOUNTYHUNTER) { + + } else if (terminalType == TerminalType.MISSION_ENTERTAINER) { + + } else if (terminalType == TerminalType.MISSION_ARTISAN) { + + } else { + Console.println("ERROR: Unsupported terminal " + terminal.getObjectId()); + } } }); } + + private void populateMissions(final SWGObject player, int type) { + CreatureObject creature = (CreatureObject) player; + TangibleObject missionBag = (TangibleObject) creature.getSlottedObject("mission_bag"); + + final AtomicInteger deliveryCount = new AtomicInteger(); + final AtomicInteger destroyCount = new AtomicInteger(); + final int deliveryEntries = 30; + + final Random ran = new Random(); + + final int bagSize = core.objectService.objsInContainer(creature, missionBag); + Console.println("Delivery Entries: " + deliveryEntries); + if (bagSize != 12) { + for(int missionsAdded = 0; missionsAdded < 12; missionsAdded++) { + MissionObject mission = (MissionObject) core.objectService.createObject("object/mission/shared_mission_object.iff", creature.getPlanet()); + + int textId = ran.nextInt(deliveryEntries); + + Console.println("Random Int Value: " + textId); + Console.println("Now the value is: " + textId); + + mission.setMissionLevel(5); + + mission.setMissionStart(0, 0, 0, player.getPlanet().name); + + mission.setMissionCreator("Waverunner"); + mission.setMissionCredits(9000); + + // TODO: Base this off of textId + f + mission.setTargetTemplateObject("object/tangible/mission/shared_mission_datadisk.iff"); + // TODO: Base this off of textId + l + mission.setMissionTargetName("Osskscosco"); + + mission.setMissionDescription("mission/mission_deliver_neutral_easy", "m" + textId + "d"); + mission.setMissionTitle("mission/mission_deliver_neutral_easy", "m" + textId + "t"); + + mission.setMissionType("deliver"); + + mission.setMissionDestination(-5962, 0, -6259, player.getPlanet().name); + deliveryCount.getAndIncrement(); + + + missionBag._add(mission); + Console.println("Added mission " + missionsAdded); + } + return; + } + + missionBag.viewChildren(player, false, false, new Traverser() { + + @Override + public void process(SWGObject child) { + if (deliveryCount.get() == 6) + return; + + MissionObject mission = (MissionObject) child; + int textId = ran.nextInt(deliveryEntries); + + Console.println("Random Int Value: " + textId); + Console.println("Now the value is: " + textId); + + mission.setMissionLevel(5); + + mission.setMissionStart(0, 0, 0, player.getPlanet().name); + + mission.setMissionCreator("Waverunner"); + mission.setMissionCredits(9000); + + // TODO: Base this off of textId + f + mission.setTargetTemplateObject("object/tangible/mission/shared_mission_datadisk.iff"); + // TODO: Base this off of textId + l + mission.setMissionTargetName("Osskscosco"); + + mission.setMissionDescription("mission/mission_deliver_neutral_easy", "m" + textId + "d"); + mission.setMissionTitle("mission/mission_deliver_neutral_easy", "m" + textId + "t"); + + mission.setMissionType("deliver"); + + mission.setMissionDestination(-5962, 0, -6259, player.getPlanet().name); + deliveryCount.getAndIncrement(); + } + + }); + + Console.println("Outside of the traverser now!"); + } + + // May want to create a map for the server with needed info + public int getNumberOfEntries(String stf) { + try { + DatatableVisitor stfFile = ClientFileManager.loadFile(stf, DatatableVisitor.class); + + for (int s = 0; s < stfFile.getRowCount(); s++) { + String name = ((String) stfFile.getObject(s, 3)); + Console.println("Name: " + name); + if (name.equals("number_of_entries")) { + int entryCount = ((int) stfFile.getObject(s, 4)); + Console.println("Entry Count: " + entryCount); + return entryCount; + } + } + } + catch (InstantiationException | IllegalAccessException e) { + e.printStackTrace(); + } + + return 0; + } + @Override public void shutdown() { diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index b08ad2f9..8da5bc20 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -36,6 +36,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import resources.common.*; @@ -740,5 +741,24 @@ public class ObjectService implements INetworkDispatch { } - + public int objsInContainer(SWGObject owner, TangibleObject container) { + if (owner == null) { + Console.println("Owner null!"); + } + if (container == null) { + Console.println("Container is null!"); + } + final AtomicInteger count = new AtomicInteger(); + + container.viewChildren(owner, false, false, new Traverser() { + + @Override + public void process(SWGObject child) { + count.getAndIncrement(); + } + + }); + + return count.get(); + } } diff --git a/src/services/travel/TravelService.java b/src/services/travel/TravelService.java index 541615a3..bd3ba0b7 100644 --- a/src/services/travel/TravelService.java +++ b/src/services/travel/TravelService.java @@ -116,7 +116,7 @@ public class TravelService implements INetworkDispatch { for(TravelPoint tp : travelMap.get(planet)) { if(tp.isStarport() || tp.getPlanetName().equalsIgnoreCase(object.getPlanet().getName())) { correctTravelPoints.add(tp); - Console.println(tp.getName()); + //Console.println(tp.getName()); } } PlanetTravelPointListResponse response = new PlanetTravelPointListResponse(planetString, correctTravelPoints); @@ -367,7 +367,7 @@ public class TravelService implements INetworkDispatch { for (int f = 0; f < travelFares.getRowCount(); f++) { Planet planet = core.terrainService.getPlanetByName((String) travelFares.getObject(f, 0)); if (travelMap.containsKey(planet)) { - int corellia = ((Integer) travelFares.getObject(f, 1)); + int corellia = ((int) travelFares.getObject(f, 1)); int dantooine = ((int) travelFares.getObject(f, 2)); int dathomir = ((int) travelFares.getObject(f, 3)); int endor = ((int) travelFares.getObject(f, 4));