From 1216cf6d4579d764a240ca70bed96ad5a0f7afb0 Mon Sep 17 00:00:00 2001 From: Waverunner Date: Thu, 6 Feb 2014 17:50:11 -0500 Subject: [PATCH 1/9] Changes to variables and MISO3 baseline --- src/main/NGECore.java | 6 +- src/protocol/swg/ChatFriendsListUpdate.java | 2 - .../mission/MissionMessageBuilder.java | 40 +++--- .../objects/mission/MissionObject.java | 126 +++++++++--------- src/services/CharacterService.java | 2 + src/services/MissionService.java | 102 ++++++++------ 6 files changed, 154 insertions(+), 124 deletions(-) diff --git a/src/main/NGECore.java b/src/main/NGECore.java index 84ca2611..b053a018 100644 --- a/src/main/NGECore.java +++ b/src/main/NGECore.java @@ -155,7 +155,7 @@ public class NGECore { public WeatherService weatherService; public SpawnService spawnService; public AIService aiService; - //public MissionService missionService; + public MissionService missionService; // Login Server public NetworkDispatch loginDispatch; @@ -260,7 +260,7 @@ public class NGECore { } spawnService = new SpawnService(this); aiService = new AIService(this); - //missionService = new MissionService(this); + missionService = new MissionService(this); // Ping Server try { @@ -292,7 +292,7 @@ public class NGECore { zoneDispatch.addService(playerService); zoneDispatch.addService(buffService); zoneDispatch.addService(entertainmentService); - //zoneDispatch.addService(missionService); + zoneDispatch.addService(missionService); zoneServer = new MINAServer(zoneDispatch, config.getInt("ZONE.PORT")); zoneServer.start(); diff --git a/src/protocol/swg/ChatFriendsListUpdate.java b/src/protocol/swg/ChatFriendsListUpdate.java index bd6debb0..313235d7 100644 --- a/src/protocol/swg/ChatFriendsListUpdate.java +++ b/src/protocol/swg/ChatFriendsListUpdate.java @@ -6,8 +6,6 @@ import main.NGECore; import org.apache.mina.core.buffer.IoBuffer; -import engine.resources.config.Config; -import engine.resources.config.DefaultConfig; public class ChatFriendsListUpdate extends SWGMessage { diff --git a/src/resources/objects/mission/MissionMessageBuilder.java b/src/resources/objects/mission/MissionMessageBuilder.java index 190773ad..ad024381 100644 --- a/src/resources/objects/mission/MissionMessageBuilder.java +++ b/src/resources/objects/mission/MissionMessageBuilder.java @@ -48,8 +48,8 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { buffer.put(getAsciiString(mission.getStfFilename())); buffer.putInt(0); buffer.put(getAsciiString(mission.getStfName())); - - if (mission.getCustomName() == null) { buffer.put(getUnicodeString("")); } + + if (mission.getCustomName() == null) { buffer.putInt(0); } else { buffer.put(getUnicodeString(mission.getCustomName())); } buffer.putInt(0); // volume @@ -57,10 +57,10 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { buffer.putInt(mission.getMissionLevel()); buffer.putFloat(mission.getMissionStartX()); - buffer.putFloat(0); // missionStartZ + buffer.putFloat(mission.getMissionStartZ()); // missionStartZ buffer.putFloat(mission.getMissionStartY()); - buffer.putLong(0); // ?? + buffer.putLong(0); // Start Object ID if (mission.getMissionStartPlanet() == null) { buffer.putInt(0); @@ -69,13 +69,13 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { } buffer.put(getUnicodeString(mission.getMissionCreator())); - buffer.putInt(mission.getMissionCredits()); + buffer.putInt(mission.getCreditReward()); buffer.putFloat(mission.getMissionDestinationX()); - buffer.putFloat(0); // missionDestinationZ + buffer.putFloat(mission.getMissionDestinationZ()); buffer.putFloat(mission.getMissionDestinationY()); - buffer.putLong(0); // ?? + buffer.putLong(0); // Destination Object ID if (mission.getMissionDestinationPlanet() == null) { buffer.putInt(0); @@ -83,10 +83,10 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { buffer.putInt(CRC.StringtoCRC(mission.getMissionDestinationPlanet())); } - if (mission.getTargetTemplateObject() == null) { + if (mission.getMissionTemplateObject() == null) { buffer.putInt(0); } else { - buffer.putInt(CRC.StringtoCRC(mission.getTargetTemplateObject())); + buffer.putInt(CRC.StringtoCRC(mission.getMissionTemplateObject())); } buffer.put(getAsciiString(mission.getMissionDescription())); @@ -107,7 +107,7 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { buffer.put(getAsciiString(mission.getMissionTargetName())); - WaypointObject wp = mission.getMissionAttachedWaypoint(); + WaypointObject wp = mission.getAttachedWaypoint(); if (wp == null) { buffer.putInt(0); @@ -116,7 +116,7 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { buffer.putFloat(0); // y buffer.putLong(0); // target id buffer.putInt(0); // planet crc - buffer.put(getUnicodeString("")); + buffer.putInt(0); buffer.putLong(0); // waypoint id buffer.put((byte) 0); // color buffer.put((byte) 0x01); //active @@ -130,13 +130,14 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { buffer.put((byte) 0); buffer.put((byte) 0x01); } + int size = buffer.position(); buffer = bufferPool.allocate(size, false).put(buffer.array(), 0, size); buffer.flip(); buffer = createBaseline("MISO", (byte) 3, buffer, size); - Console.println("Bytes: " + StringUtilities.bytesToHex(buffer.array())); + //Console.println("MISO3 Bytes: " + StringUtilities.bytesToHex(buffer.array())); return buffer; } @@ -144,7 +145,7 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { IoBuffer buffer = IoBuffer.allocate(4, false).order(ByteOrder.LITTLE_ENDIAN); - buffer.putInt(121); // unk + buffer.putInt(121); // server id int size = buffer.position(); buffer.flip(); @@ -191,8 +192,11 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { buffer.putLong(0); - buffer.putInt(CRC.StringtoCRC(planet)); - + if (planet == null) { + buffer.putInt(CRC.StringtoCRC(object.getPlanet().name)); + } else { + buffer.putInt(CRC.StringtoCRC(planet)); + } int size = buffer.position(); buffer.flip(); buffer = createDelta("MISO", (byte) 3, (short) 1, (short) 0x06, buffer, size + 4); @@ -236,7 +240,11 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { buffer.putLong(0); // Destination Object ID - buffer.putInt(CRC.StringtoCRC(planet)); + if (planet == null) { + buffer.putInt(CRC.StringtoCRC(object.getPlanet().name)); + } else { + buffer.putInt(CRC.StringtoCRC(planet)); + } int size = buffer.position(); buffer.flip(); diff --git a/src/resources/objects/mission/MissionObject.java b/src/resources/objects/mission/MissionObject.java index 69562ef6..0576b7be 100644 --- a/src/resources/objects/mission/MissionObject.java +++ b/src/resources/objects/mission/MissionObject.java @@ -37,25 +37,25 @@ import engine.resources.scene.Quaternion; @Persistent(version=0) public class MissionObject extends IntangibleObject implements IPersistent { - private float missionDestinationX; - private float missionDestinationY; - private float missionDestinationZ; - private float missionStartX; - private float missionStartY; - private float missionStartZ; - private String missionStartPlanet; - private int missionLevel; // Difficulty level displayed in details - 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 object I guess? - private String missionDescId = ""; - private String missionTitleId = ""; - private String missionType; - private WaypointObject missionAttachedWaypoint; + private float destX; + private float destY; + private float destZ; + private float startX; + private float startY; + private float startZ; + private String startPlanet; + private int difficultyLevel; // Difficulty level displayed in details + private String destinationPlanet; + private int repeatCount; // increases for each player using the mission; used for redisplaying on mission term too + private int reward; + private String creator; + private String description; // TODO: Base off of a new Object, SWGString? + private String title; // TODO: Base off of a new Object, SWGString? + private String missionTargetName; // Target object I guess? + private String descId; + private String titleId; + private String type; + private WaypointObject attachedWaypoint; private String missionTemplateObject; @@ -75,28 +75,28 @@ public class MissionObject extends IntangibleObject implements IPersistent { public float getMissionStartX() { synchronized(objectMutex) { - return missionStartX; + return startX; } } public float getMissionStartY() { synchronized(objectMutex) { - return missionStartY; + return startY; } } public float getMissionStartZ() { synchronized(objectMutex) { - return missionStartZ; + return startZ; } } 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; + this.startZ = z; + this.startX = x; + this.startY = y; + this.startPlanet = planet; } notifyObservers(messageBuilder.buildStartLocationDelta(x, z, y, planet), false); @@ -104,117 +104,119 @@ public class MissionObject extends IntangibleObject implements IPersistent { public float getMissionDestinationX() { synchronized(objectMutex) { - return missionDestinationX; + return destX; } } public float getMissionDestinationY() { synchronized(objectMutex) { - return missionDestinationY; + return destY; } } public float getMissionDestinationZ() { synchronized(objectMutex) { - return missionDestinationZ; + return destZ; } } 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; + this.destZ = z; + this.destY = y; + this.destZ = z; + this.destinationPlanet = planet; } + notifyObservers(messageBuilder.buildDestinationDelta(x, z, y, planet), false); } public String getMissionDestinationPlanet() { synchronized(objectMutex) { - return missionDestinationPlanet; + return destinationPlanet; } } public int getMissionLevel() { synchronized(objectMutex) { - return missionLevel; + return difficultyLevel; } } public void setMissionLevel(int missionLevel) { synchronized(objectMutex) { - this.missionLevel = missionLevel; + this.difficultyLevel = missionLevel; } + notifyObservers(messageBuilder.buildDifficultyLevelDelta(missionLevel), false); } public String getMissionStartPlanet() { synchronized(objectMutex) { - return missionStartPlanet; + return startPlanet; } } public int getMissionRepeatCounter() { synchronized(objectMutex) { - return missionRepeatCounter; + return repeatCount; } } - public void setMissionRepeatCounter(int missionRepeatCounter) { + public void setRepeatCount(int missionRepeatCounter) { synchronized(objectMutex) { - this.missionRepeatCounter = missionRepeatCounter; + this.repeatCount = missionRepeatCounter; } } - public int getMissionCredits() { + public int getCreditReward() { synchronized(objectMutex) { - return missionCredits; + return reward; } } - public void setMissionCredits(int missionCredits) { + public void setCreditReward(int missionCredits) { synchronized(objectMutex) { - this.missionCredits = missionCredits; + this.reward = missionCredits; } notifyObservers(messageBuilder.buildCreditsRewardDelta(missionCredits), false); } public String getMissionCreator() { synchronized(objectMutex) { - return missionCreator; + return creator; } } public void setMissionCreator(String missionCreator) { synchronized(objectMutex) { - this.missionCreator = missionCreator; + this.creator = missionCreator; } notifyObservers(messageBuilder.buildCreatorNameDelta(missionCreator), false); } public String getMissionDescription() { synchronized(objectMutex) { - return missionDescription; + return description; } } public void setMissionDescription(String missionDescription, String id) { synchronized(objectMutex) { - this.missionDescription = missionDescription; - this.missionDescId = id; + this.description = missionDescription; + this.descId = id; } notifyObservers(messageBuilder.buildMissionDescriptionDelta(missionDescription, id), false); } public String getMissionTitle() { synchronized(objectMutex) { - return missionTitle; + return title; } } public void setMissionTitle(String missionTitle, String id) { synchronized(objectMutex) { - this.missionTitle = missionTitle; - this.missionTitleId = id; + this.title = missionTitle; + this.titleId = id; } notifyObservers(messageBuilder.buildMissionTitleDelta(missionTitle, id), false); } @@ -232,25 +234,25 @@ public class MissionObject extends IntangibleObject implements IPersistent { notifyObservers(messageBuilder.buildTargetNameDelta(missionTargetName), false); } - public WaypointObject getMissionAttachedWaypoint() { + public WaypointObject getAttachedWaypoint() { synchronized(objectMutex) { - return missionAttachedWaypoint; + return attachedWaypoint; } } - public void setMissionAttachedWaypoint(WaypointObject missionAttachedWaypoint) { + public void setAttachedWaypoint(WaypointObject missionAttachedWaypoint) { synchronized(objectMutex) { - this.missionAttachedWaypoint = missionAttachedWaypoint; + this.attachedWaypoint = missionAttachedWaypoint; } } - public String getTargetTemplateObject() { + public String getMissionTemplateObject() { synchronized(objectMutex) { return missionTemplateObject; } } - public void setTargetTemplateObject(String missionTemplateObject) { + public void setMissionTemplateObject(String missionTemplateObject) { synchronized(objectMutex) { this.missionTemplateObject = missionTemplateObject; } @@ -259,25 +261,25 @@ public class MissionObject extends IntangibleObject implements IPersistent { public String getMissionDescId() { synchronized(objectMutex) { - return missionDescId; + return descId; } } public String getMissionTitleId() { synchronized(objectMutex) { - return missionTitleId; + return titleId; } } public String getMissionType() { synchronized(objectMutex) { - return missionType; + return type; } } public void setMissionType(String missionType) { synchronized(objectMutex) { - this.missionType = missionType; + this.type = missionType; } notifyObservers(messageBuilder.buildMissionTypeDelta(missionType), false); } diff --git a/src/services/CharacterService.java b/src/services/CharacterService.java index 57318516..df9d5bdf 100644 --- a/src/services/CharacterService.java +++ b/src/services/CharacterService.java @@ -297,6 +297,8 @@ public class CharacterService implements INetworkDispatch { object.addObjectToEquipList(missionBag); object.addObjectToEquipList(appInventory); + core.missionService.createDefaultMissions(object); + WeaponObject defaultWeapon = (WeaponObject) core.objectService.createObject("object/weapon/creature/shared_creature_default_weapon.iff", object.getPlanet()); defaultWeapon.setDamageType("@obj_attr_n:armor_eff_kinetic"); defaultWeapon.setStringAttribute("cat_wpn_damage.damage", "0-0"); diff --git a/src/services/MissionService.java b/src/services/MissionService.java index 78fce706..ca915841 100644 --- a/src/services/MissionService.java +++ b/src/services/MissionService.java @@ -114,33 +114,27 @@ public class MissionService implements INetworkDispatch { 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.setStfFilename("mission/mission_object"); + //mission.setStfName("destroy_mission"); - mission.setMissionLevel(5); + mission.setMissionLevel(50); + mission.setMissionStart(0, 0, 0, null); + mission.setMissionCreator(""); + mission.setCreditReward(100); - mission.setMissionStart(0, 0, 0, player.getPlanet().name); + mission.setMissionDestination(0, 0, 0, null); - 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(); + //mission.setMissionTemplateObject(missionTemplateObject); + mission.setMissionDescription("mission/mission_npc_survey_neutral_easy", "m1o"); + mission.setMissionTitle("mission/mission_npc_survey_neutral_easy", "m1t"); + mission.setMissionType("survey"); // 0x19C9FAC1 + mission.setMissionTargetName("Testing target name"); + missionBag._add(mission); + Console.println("Added mission " + missionsAdded); } return; @@ -156,28 +150,23 @@ public class MissionService implements INetworkDispatch { 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(); + + mission.setMissionLevel(10); + mission.setMissionStart(0, 0, 0, null); + mission.setMissionCreator("Waverunner"); + mission.setCreditReward(100); + + mission.setMissionDestination(0, 0, 0, null); + + //mission.setMissionTemplateObject(missionTemplateObject); + mission.setMissionDescription("mission/mission_npc_survey_neutral_easy", "m1o"); + mission.setMissionTitle("mission/mission_npc_survey_neutral_easy", "m1t"); + + mission.setMissionType("survey"); // 0x19C9FAC1 + + mission.setMissionTargetName("Testing target name"); + Console.println("Sent delta/'s!"); } }); @@ -207,6 +196,37 @@ public class MissionService implements INetworkDispatch { return 0; } + public void createDefaultMissions(CreatureObject player) { + for(int missionsAdded = 0; missionsAdded < 12; missionsAdded++) { + MissionObject mission = (MissionObject) core.objectService.createObject("object/mission/shared_mission_object.iff", player.getPlanet()); + + + //mission.setStfFilename("mission/mission_object"); + //mission.setStfName("destroy_mission"); + + mission.setMissionLevel(50); + mission.setMissionStart(0, 0, 0, null); + mission.setMissionCreator(""); + mission.setCreditReward(100); + + mission.setMissionDestination(0, 0, 0, null); + + //mission.setMissionTemplateObject(missionTemplateObject); + mission.setMissionDescription("mission/mission_npc_survey_neutral_easy", "m1o"); + mission.setMissionTitle("mission/mission_npc_survey_neutral_easy", "m1t"); + + mission.setMissionType("survey"); // 0x19C9FAC1 + + mission.setMissionTargetName("Testing target name"); + + TangibleObject missionBag = (TangibleObject) player.getSlottedObject("mission_bag"); + missionBag._add(mission); + + Console.println("Added mission " + missionsAdded); + } + Console.println("Successfully created default missions"); + } + @Override public void shutdown() { From e19c0048a5c45acf02b69990a02312a67d7d7817 Mon Sep 17 00:00:00 2001 From: Waverunner Date: Fri, 14 Feb 2014 17:57:18 -0500 Subject: [PATCH 2/9] Changed MISO6, Added MISO8 and MISO9 baselines --- .../mission/MissionMessageBuilder.java | 31 +++++++++++++++++-- .../objects/mission/MissionObject.java | 2 ++ src/services/MissionService.java | 7 +++-- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/resources/objects/mission/MissionMessageBuilder.java b/src/resources/objects/mission/MissionMessageBuilder.java index ad024381..ff874ee2 100644 --- a/src/resources/objects/mission/MissionMessageBuilder.java +++ b/src/resources/objects/mission/MissionMessageBuilder.java @@ -143,9 +143,12 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { public IoBuffer buildBaseline6() { - IoBuffer buffer = IoBuffer.allocate(4, false).order(ByteOrder.LITTLE_ENDIAN); + IoBuffer buffer = IoBuffer.allocate(18, false).order(ByteOrder.LITTLE_ENDIAN); - buffer.putInt(121); // server id + buffer.putShort((short) 3); + buffer.putInt(76); // server id + buffer.putLong(0); // detail stf + buffer.putInt(0xFFFFFFFF); // unknown int size = buffer.position(); buffer.flip(); @@ -154,6 +157,30 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } + public IoBuffer buildBaseline8() { + IoBuffer buffer = IoBuffer.allocate(2, false).order(ByteOrder.LITTLE_ENDIAN); + + buffer.putShort((short) 0); // unknown + + int size = buffer.position(); + buffer.flip(); + buffer = createBaseline("MISO", (byte) 8, buffer, size); + + return buffer; + } + + public IoBuffer buildBaseline9() { + IoBuffer buffer = IoBuffer.allocate(2, false).order(ByteOrder.LITTLE_ENDIAN); + + buffer.putShort((short) 0); // unknown + + int size = buffer.position(); + buffer.flip(); + buffer = createBaseline("MISO", (byte) 9, buffer, size); + + return buffer; + } + public IoBuffer buildStfDelta(String stfFile, String stfName) { IoBuffer buffer = IoBuffer.allocate(4 + stfFile.length() + stfName.length(), false).order(ByteOrder.LITTLE_ENDIAN); diff --git a/src/resources/objects/mission/MissionObject.java b/src/resources/objects/mission/MissionObject.java index 0576b7be..5855d4b3 100644 --- a/src/resources/objects/mission/MissionObject.java +++ b/src/resources/objects/mission/MissionObject.java @@ -302,6 +302,8 @@ public class MissionObject extends IntangibleObject implements IPersistent { destination.getSession().write(messageBuilder.buildBaseline3()); destination.getSession().write(messageBuilder.buildBaseline6()); + destination.getSession().write(messageBuilder.buildBaseline8()); + destination.getSession().write(messageBuilder.buildBaseline9()); } } diff --git a/src/services/MissionService.java b/src/services/MissionService.java index ca915841..c7135da7 100644 --- a/src/services/MissionService.java +++ b/src/services/MissionService.java @@ -110,8 +110,9 @@ public class MissionService implements INetworkDispatch { final int bagSize = core.objectService.objsInContainer(creature, missionBag); Console.println("Delivery Entries: " + deliveryEntries); - if (bagSize != 12) { - for(int missionsAdded = 0; missionsAdded < 12; missionsAdded++) { + if (bagSize != 10) { + for(int missionsAdded = 0; missionsAdded < 10; missionsAdded++) { + // object/mission/shared_mission_object.iff MissionObject mission = (MissionObject) core.objectService.createObject("object/mission/shared_mission_object.iff", creature.getPlanet()); @@ -197,7 +198,7 @@ public class MissionService implements INetworkDispatch { } public void createDefaultMissions(CreatureObject player) { - for(int missionsAdded = 0; missionsAdded < 12; missionsAdded++) { + for(int missionsAdded = 0; missionsAdded < 10; missionsAdded++) { MissionObject mission = (MissionObject) core.objectService.createObject("object/mission/shared_mission_object.iff", player.getPlanet()); From a1556032b46030fedbe866cb1a2cf15a81e8e353 Mon Sep 17 00:00:00 2001 From: Waverunner Date: Sat, 15 Feb 2014 15:00:46 -0500 Subject: [PATCH 3/9] Mission deltas send to client only --- .../mission/MissionMessageBuilder.java | 78 +++++++++++++- .../objects/mission/MissionObject.java | 54 +++++++--- src/services/MissionService.java | 102 +++++++----------- 3 files changed, 149 insertions(+), 85 deletions(-) diff --git a/src/resources/objects/mission/MissionMessageBuilder.java b/src/resources/objects/mission/MissionMessageBuilder.java index ff874ee2..eb84b539 100644 --- a/src/resources/objects/mission/MissionMessageBuilder.java +++ b/src/resources/objects/mission/MissionMessageBuilder.java @@ -68,7 +68,7 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { buffer.putInt(CRC.StringtoCRC(mission.getMissionStartPlanet())); } - buffer.put(getUnicodeString(mission.getMissionCreator())); + buffer.put(getUnicodeString(mission.getCreator())); buffer.putInt(mission.getCreditReward()); buffer.putFloat(mission.getMissionDestinationX()); @@ -110,13 +110,13 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { WaypointObject wp = mission.getAttachedWaypoint(); if (wp == null) { - buffer.putInt(0); + buffer.putInt(0); // cell buffer.putFloat(0); // x buffer.putFloat(0); // z buffer.putFloat(0); // y buffer.putLong(0); // target id buffer.putInt(0); // planet crc - buffer.putInt(0); + buffer.putInt(0); // name buffer.putLong(0); // waypoint id buffer.put((byte) 0); // color buffer.put((byte) 0x01); //active @@ -127,7 +127,9 @@ 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(getUnicodeString(wp.getName())); + buffer.putLong(mission.getObjectId() + 1); + buffer.put(wp.getColor()); buffer.put((byte) 0x01); } @@ -361,7 +363,73 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } - + + public IoBuffer buildMissionDelta() { + IoBuffer buffer = IoBuffer.allocate(100, false).order(ByteOrder.LITTLE_ENDIAN); + buffer.isAutoExpand(); + + MissionObject mission = (MissionObject) object; + + buffer.putShort((short) 0x05); + buffer.putInt(mission.getMissionLevel()); + + buffer.putShort((short) 0x06); + buffer.putFloat(mission.getMissionStartX()); + buffer.putFloat(mission.getMissionStartZ()); + buffer.putFloat(mission.getMissionStartY()); + buffer.putLong(0); + buffer.putInt(CRC.StringtoCRC(mission.getMissionStartPlanet())); + + buffer.putShort((short) 0x07); + buffer.put(getUnicodeString(mission.getCreator())); + + buffer.putShort((short) 0x08); + buffer.putInt(mission.getCreditReward()); + + buffer.putShort((short) 0x09); + buffer.putFloat(mission.getMissionDestinationX()); + buffer.putFloat(mission.getMissionDestinationZ()); + buffer.putFloat(mission.getMissionDestinationY()); + buffer.putLong(0); + buffer.putInt(CRC.StringtoCRC(mission.getMissionDestinationPlanet())); + + buffer.putShort((short) 0x0A); + buffer.putInt(CRC.StringtoCRC(mission.getMissionTemplateObject())); + + buffer.putShort((short) 0x0B); + buffer.put(getAsciiString(mission.getMissionDescription())); + buffer.putInt(0); + buffer.put(getAsciiString(mission.getMissionDescId())); + + buffer.putShort((short) 0x0C); + buffer.put(getAsciiString(mission.getMissionTitle())); + buffer.putInt(0); + buffer.put(getAsciiString(mission.getMissionTitleId())); + + buffer.putShort((short) 0x0E); + buffer.putInt(CRC.StringtoCRC(mission.getMissionType())); + + buffer.putShort((short) 0x0F); + buffer.put(getAsciiString(mission.getMissionTargetName())); + + buffer.putShort((short) 0x10); + WaypointObject wp = mission.getAttachedWaypoint(); + buffer.putInt(wp.getCellId()); // wp cell + buffer.putFloat(wp.getPosition().x); + buffer.putFloat(wp.getPosition().z); + buffer.putFloat(wp.getPosition().y); + buffer.putLong(0); + buffer.putInt(CRC.StringtoCRC(wp.getPlanet().name)); + buffer.put(getUnicodeString(wp.getName())); + buffer.putLong(mission.getObjectId() + 1); + buffer.put(wp.getColor()); + buffer.put((byte) 0x01); + + int size = buffer.position(); + buffer.flip(); + buffer = createDelta("MISO", (byte) 3, (short) 11, buffer, size + 4); + return buffer; + } @Override public void sendListDelta(byte viewType, short updateType, IoBuffer buffer) { diff --git a/src/resources/objects/mission/MissionObject.java b/src/resources/objects/mission/MissionObject.java index 5855d4b3..ed3f6064 100644 --- a/src/resources/objects/mission/MissionObject.java +++ b/src/resources/objects/mission/MissionObject.java @@ -55,9 +55,8 @@ public class MissionObject extends IntangibleObject implements IPersistent { private String descId; private String titleId; private String type; - private WaypointObject attachedWaypoint; - private String missionTemplateObject; + private WaypointObject attachedWaypoint; @NotPersistent MissionMessageBuilder messageBuilder = new MissionMessageBuilder(this); @@ -98,8 +97,9 @@ public class MissionObject extends IntangibleObject implements IPersistent { this.startY = y; this.startPlanet = planet; } - - notifyObservers(messageBuilder.buildStartLocationDelta(x, z, y, planet), false); + if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { + getContainer().getClient().getSession().write(messageBuilder.buildStartLocationDelta(x, z, y, planet)); + } } public float getMissionDestinationX() { @@ -127,7 +127,9 @@ public class MissionObject extends IntangibleObject implements IPersistent { this.destZ = z; this.destinationPlanet = planet; } - notifyObservers(messageBuilder.buildDestinationDelta(x, z, y, planet), false); + if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { + getContainer().getClient().getSession().write(messageBuilder.buildDestinationDelta(x, z, y, planet)); + } } public String getMissionDestinationPlanet() { @@ -146,7 +148,9 @@ public class MissionObject extends IntangibleObject implements IPersistent { synchronized(objectMutex) { this.difficultyLevel = missionLevel; } - notifyObservers(messageBuilder.buildDifficultyLevelDelta(missionLevel), false); + if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { + getContainer().getClient().getSession().write(messageBuilder.buildDifficultyLevelDelta(missionLevel)); + } } public String getMissionStartPlanet() { @@ -177,20 +181,24 @@ public class MissionObject extends IntangibleObject implements IPersistent { synchronized(objectMutex) { this.reward = missionCredits; } - notifyObservers(messageBuilder.buildCreditsRewardDelta(missionCredits), false); + if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { + getContainer().getClient().getSession().write(messageBuilder.buildCreditsRewardDelta(missionCredits)); + } } - public String getMissionCreator() { + public String getCreator() { synchronized(objectMutex) { return creator; } } - public void setMissionCreator(String missionCreator) { + public void setCreator(String missionCreator) { synchronized(objectMutex) { this.creator = missionCreator; } - notifyObservers(messageBuilder.buildCreatorNameDelta(missionCreator), false); + if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { + getContainer().getClient().getSession().write(messageBuilder.buildCreatorNameDelta(missionCreator)); + } } public String getMissionDescription() { @@ -204,7 +212,9 @@ public class MissionObject extends IntangibleObject implements IPersistent { this.description = missionDescription; this.descId = id; } - notifyObservers(messageBuilder.buildMissionDescriptionDelta(missionDescription, id), false); + if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { + getContainer().getClient().getSession().write(messageBuilder.buildMissionDescriptionDelta(missionDescription, id)); + } } public String getMissionTitle() { @@ -218,7 +228,9 @@ public class MissionObject extends IntangibleObject implements IPersistent { this.title = missionTitle; this.titleId = id; } - notifyObservers(messageBuilder.buildMissionTitleDelta(missionTitle, id), false); + if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { + getContainer().getClient().getSession().write(messageBuilder.buildMissionTitleDelta(missionTitle, id)); + } } public String getMissionTargetName() { @@ -231,7 +243,9 @@ public class MissionObject extends IntangibleObject implements IPersistent { synchronized(objectMutex) { this.missionTargetName = missionTargetName; } - notifyObservers(messageBuilder.buildTargetNameDelta(missionTargetName), false); + if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { + getContainer().getClient().getSession().write(messageBuilder.buildTargetNameDelta(missionTargetName)); + } } public WaypointObject getAttachedWaypoint() { @@ -256,7 +270,9 @@ public class MissionObject extends IntangibleObject implements IPersistent { synchronized(objectMutex) { this.missionTemplateObject = missionTemplateObject; } - notifyObservers(messageBuilder.buildTargetObjectIffDelta(missionTemplateObject), false); + if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { + getContainer().getClient().getSession().write(messageBuilder.buildTargetObjectIffDelta(missionTemplateObject)); + } } public String getMissionDescId() { @@ -281,7 +297,15 @@ public class MissionObject extends IntangibleObject implements IPersistent { synchronized(objectMutex) { this.type = missionType; } - notifyObservers(messageBuilder.buildMissionTypeDelta(missionType), false); + if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { + getContainer().getClient().getSession().write(messageBuilder.buildMissionTypeDelta(missionType)); + } + } + + public void sendMissionDelta() { + if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { + getContainer().getClient().getSession().write(messageBuilder.buildMissionDelta()); + } } public Transaction getTransaction() { diff --git a/src/services/MissionService.java b/src/services/MissionService.java index c7135da7..7141dee8 100644 --- a/src/services/MissionService.java +++ b/src/services/MissionService.java @@ -39,12 +39,14 @@ import resources.common.ObjControllerOpcodes; import resources.objects.creature.CreatureObject; import resources.objects.mission.MissionObject; import resources.objects.tangible.TangibleObject; +import resources.objects.waypoint.WaypointObject; 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.scene.Point3D; import engine.resources.service.INetworkDispatch; import engine.resources.service.INetworkRemoteEvent; @@ -101,78 +103,48 @@ public class MissionService implements INetworkDispatch { 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 != 10) { - for(int missionsAdded = 0; missionsAdded < 10; missionsAdded++) { - // object/mission/shared_mission_object.iff - MissionObject mission = (MissionObject) core.objectService.createObject("object/mission/shared_mission_object.iff", creature.getPlanet()); - - - //mission.setStfFilename("mission/mission_object"); - //mission.setStfName("destroy_mission"); - - mission.setMissionLevel(50); - mission.setMissionStart(0, 0, 0, null); - mission.setMissionCreator(""); - mission.setCreditReward(100); - - mission.setMissionDestination(0, 0, 0, null); - - //mission.setMissionTemplateObject(missionTemplateObject); - mission.setMissionDescription("mission/mission_npc_survey_neutral_easy", "m1o"); - mission.setMissionTitle("mission/mission_npc_survey_neutral_easy", "m1t"); - - mission.setMissionType("survey"); // 0x19C9FAC1 - - mission.setMissionTargetName("Testing target name"); - - missionBag._add(mission); - - Console.println("Added mission " + missionsAdded); - } - return; - } - - missionBag.viewChildren(player, false, false, new Traverser() { + final AtomicInteger deCount = new AtomicInteger(); + final AtomicInteger dCount = new AtomicInteger(); + //createDefaultMissions(creature); + missionBag.viewChildren(creature, true, false, new Traverser() { @Override public void process(SWGObject child) { - if (deliveryCount.get() == 6) - return; - MissionObject mission = (MissionObject) child; - int textId = ran.nextInt(deliveryEntries); - - deliveryCount.getAndIncrement(); - + if (deCount.get() <= 7) { + mission.setMissionType("destroy"); + deCount.getAndIncrement(); + Console.println("Destroy missions: " + String.valueOf(deCount.get())); + } + else if (dCount.get() <= 7) { + mission.setMissionType("deliver"); + dCount.getAndIncrement(); + Console.println("Deliver missions: " + String.valueOf(dCount.get())); + } else { + return; + } + mission.setCreditReward(1337); + mission.setCreator("Waverunner"); mission.setMissionLevel(10); - mission.setMissionStart(0, 0, 0, null); - mission.setMissionCreator("Waverunner"); - mission.setCreditReward(100); + mission.setMissionDescription("mission/mission_destroy_neutral_hard_creature_tatooine", "m17d"); + mission.setMissionTitle("mission/mission_destroy_neutral_hard_creature_tatooine", "m17t"); + mission.setMissionDestination(0, 0, 0, "tatooine"); + mission.setMissionTemplateObject("object/tangible/lair/womp_rat/shared_lair_womp_rat_desert"); + mission.setMissionTargetName("@lair_n:tatooine_giant_worrt_lair_neutral_medium"); - mission.setMissionDestination(0, 0, 0, null); + WaypointObject wp = new WaypointObject(); + wp.setName("@mission/mission_destroy_neutral_hard_creature_tatooine:m17t"); + wp.setColor(WaypointObject.ORANGE); + wp.setPosition(new Point3D(10, 10, 10)); + wp.setCellId(0); + wp.setPlanet(core.terrainService.getPlanetByName("tatooine")); + //mission.sendMissionDelta(); - //mission.setMissionTemplateObject(missionTemplateObject); - mission.setMissionDescription("mission/mission_npc_survey_neutral_easy", "m1o"); - mission.setMissionTitle("mission/mission_npc_survey_neutral_easy", "m1t"); - - mission.setMissionType("survey"); // 0x19C9FAC1 - - mission.setMissionTargetName("Testing target name"); - Console.println("Sent delta/'s!"); } }); - Console.println("Outside of the traverser now!"); + Console.println("Sent deltas"); } // May want to create a map for the server with needed info @@ -198,16 +170,16 @@ public class MissionService implements INetworkDispatch { } public void createDefaultMissions(CreatureObject player) { - for(int missionsAdded = 0; missionsAdded < 10; missionsAdded++) { + for(int missionsAdded = 0; missionsAdded <= 16; missionsAdded++) { MissionObject mission = (MissionObject) core.objectService.createObject("object/mission/shared_mission_object.iff", player.getPlanet()); - //mission.setStfFilename("mission/mission_object"); - //mission.setStfName("destroy_mission"); + mission.setStfFilename("mission/mission_object"); + mission.setStfName("destroy_mission"); mission.setMissionLevel(50); mission.setMissionStart(0, 0, 0, null); - mission.setMissionCreator(""); + mission.setCreator(""); mission.setCreditReward(100); mission.setMissionDestination(0, 0, 0, null); From e9abd57db931df094c0edb2e864710fc9e7e4fd1 Mon Sep 17 00:00:00 2001 From: Waverunner Date: Sat, 15 Mar 2014 15:02:09 -0400 Subject: [PATCH 4/9] Changed deltas and variables for MissionObject's --- .../MissionListRequest.java | 2 +- .../mission/MissionMessageBuilder.java | 77 ++++++++----------- .../objects/mission/MissionObject.java | 35 +++++---- src/services/MissionService.java | 42 +++++----- 4 files changed, 76 insertions(+), 80 deletions(-) diff --git a/src/protocol/swg/objectControllerObjects/MissionListRequest.java b/src/protocol/swg/objectControllerObjects/MissionListRequest.java index 7fbe2d02..6a2878cd 100644 --- a/src/protocol/swg/objectControllerObjects/MissionListRequest.java +++ b/src/protocol/swg/objectControllerObjects/MissionListRequest.java @@ -37,7 +37,7 @@ public class MissionListRequest extends ObjControllerObject { @Override public void deserialize(IoBuffer data) { - Console.println("MissionListRequest: " + StringUtilities.bytesToHex(data.array())); + //Console.println("MissionListRequest: " + StringUtilities.bytesToHex(data.array())); setObjectId(data.getLong()); data.getInt(); // unk data.get(); // unk byte diff --git a/src/resources/objects/mission/MissionMessageBuilder.java b/src/resources/objects/mission/MissionMessageBuilder.java index eb84b539..1baca6ee 100644 --- a/src/resources/objects/mission/MissionMessageBuilder.java +++ b/src/resources/objects/mission/MissionMessageBuilder.java @@ -45,9 +45,9 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { buffer.putShort((short) 17); buffer.putFloat(1); // mission complexity ?? - buffer.put(getAsciiString(mission.getStfFilename())); + buffer.put(getAsciiString("mission/mission_object")); buffer.putInt(0); - buffer.put(getAsciiString(mission.getStfName())); + buffer.put(getAsciiString("destroy_mission")); if (mission.getCustomName() == null) { buffer.putInt(0); } else { buffer.put(getUnicodeString(mission.getCustomName())); } @@ -83,11 +83,7 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { buffer.putInt(CRC.StringtoCRC(mission.getMissionDestinationPlanet())); } - if (mission.getMissionTemplateObject() == null) { - buffer.putInt(0); - } else { - buffer.putInt(CRC.StringtoCRC(mission.getMissionTemplateObject())); - } + buffer.putInt(mission.getMissionTemplateObject()); buffer.put(getAsciiString(mission.getMissionDescription())); buffer.putInt(0); @@ -182,7 +178,7 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } - +/* public IoBuffer buildStfDelta(String stfFile, String stfName) { IoBuffer buffer = IoBuffer.allocate(4 + stfFile.length() + stfName.length(), false).order(ByteOrder.LITTLE_ENDIAN); @@ -363,71 +359,64 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } - +*/ + @SuppressWarnings("unused") public IoBuffer buildMissionDelta() { - IoBuffer buffer = IoBuffer.allocate(100, false).order(ByteOrder.LITTLE_ENDIAN); + IoBuffer buffer = IoBuffer.allocate(500, false).order(ByteOrder.LITTLE_ENDIAN); buffer.isAutoExpand(); + buffer.isAutoShrink(); MissionObject mission = (MissionObject) object; - buffer.putShort((short) 0x05); + buffer.putShort((short) 11); + buffer.put(getAsciiString(mission.getMissionDescription())); + buffer.putInt(0); + buffer.put(getAsciiString(mission.getMissionDescId())); + + buffer.putShort((short) 5); buffer.putInt(mission.getMissionLevel()); - buffer.putShort((short) 0x06); - buffer.putFloat(mission.getMissionStartX()); - buffer.putFloat(mission.getMissionStartZ()); - buffer.putFloat(mission.getMissionStartY()); - buffer.putLong(0); - buffer.putInt(CRC.StringtoCRC(mission.getMissionStartPlanet())); - - buffer.putShort((short) 0x07); + buffer.putShort((short) 7); buffer.put(getUnicodeString(mission.getCreator())); - buffer.putShort((short) 0x08); + buffer.putShort((short) 8); buffer.putInt(mission.getCreditReward()); - buffer.putShort((short) 0x09); + buffer.putShort((short) 9); buffer.putFloat(mission.getMissionDestinationX()); buffer.putFloat(mission.getMissionDestinationZ()); buffer.putFloat(mission.getMissionDestinationY()); buffer.putLong(0); buffer.putInt(CRC.StringtoCRC(mission.getMissionDestinationPlanet())); - buffer.putShort((short) 0x0A); - buffer.putInt(CRC.StringtoCRC(mission.getMissionTemplateObject())); + buffer.putShort((short) 10); + buffer.putInt(mission.getMissionTemplateObject()); - buffer.putShort((short) 0x0B); - buffer.put(getAsciiString(mission.getMissionDescription())); - buffer.putInt(0); - buffer.put(getAsciiString(mission.getMissionDescId())); - - buffer.putShort((short) 0x0C); + buffer.putShort((short) 12); buffer.put(getAsciiString(mission.getMissionTitle())); buffer.putInt(0); buffer.put(getAsciiString(mission.getMissionTitleId())); - buffer.putShort((short) 0x0E); + buffer.putShort((short) 13); + buffer.putInt(mission.getMissionRepeatCounter()); + + buffer.putShort((short) 14); buffer.putInt(CRC.StringtoCRC(mission.getMissionType())); - buffer.putShort((short) 0x0F); + buffer.putShort((short) 15); buffer.put(getAsciiString(mission.getMissionTargetName())); - buffer.putShort((short) 0x10); - WaypointObject wp = mission.getAttachedWaypoint(); - buffer.putInt(wp.getCellId()); // wp cell - buffer.putFloat(wp.getPosition().x); - buffer.putFloat(wp.getPosition().z); - buffer.putFloat(wp.getPosition().y); - buffer.putLong(0); - buffer.putInt(CRC.StringtoCRC(wp.getPlanet().name)); - buffer.put(getUnicodeString(wp.getName())); - buffer.putLong(mission.getObjectId() + 1); - buffer.put(wp.getColor()); - buffer.put((byte) 0x01); + buffer.putShort((short) 6); + buffer.putFloat(mission.getMissionStartX()); + buffer.putFloat(mission.getMissionStartZ()); + buffer.putFloat(mission.getMissionStartY()); + buffer.putLong(0); // Start Object ID + buffer.putInt(CRC.StringtoCRC(mission.getMissionStartPlanet())); int size = buffer.position(); buffer.flip(); - buffer = createDelta("MISO", (byte) 3, (short) 11, buffer, size + 4); + buffer = createDelta("MISO", (byte) 3, (short) 8, buffer, size + 4); + Console.println("MISO3 Delta: " + StringUtilities.bytesToHex(buffer.array())); return buffer; } @Override diff --git a/src/resources/objects/mission/MissionObject.java b/src/resources/objects/mission/MissionObject.java index ed3f6064..baca60e7 100644 --- a/src/resources/objects/mission/MissionObject.java +++ b/src/resources/objects/mission/MissionObject.java @@ -21,6 +21,8 @@ ******************************************************************************/ package resources.objects.mission; +import java.util.List; + import com.sleepycat.je.Environment; import com.sleepycat.je.Transaction; import com.sleepycat.persist.model.NotPersistent; @@ -55,8 +57,9 @@ public class MissionObject extends IntangibleObject implements IPersistent { private String descId; private String titleId; private String type; - private String missionTemplateObject; + private int missionTemplateObject; private WaypointObject attachedWaypoint; + @NotPersistent MissionMessageBuilder messageBuilder = new MissionMessageBuilder(this); @@ -98,7 +101,7 @@ public class MissionObject extends IntangibleObject implements IPersistent { this.startPlanet = planet; } if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { - getContainer().getClient().getSession().write(messageBuilder.buildStartLocationDelta(x, z, y, planet)); + //getContainer().getClient().getSession().write(messageBuilder.buildStartLocationDelta(x, z, y, planet)); } } @@ -128,7 +131,7 @@ public class MissionObject extends IntangibleObject implements IPersistent { this.destinationPlanet = planet; } if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { - getContainer().getClient().getSession().write(messageBuilder.buildDestinationDelta(x, z, y, planet)); + //getContainer().getClient().getSession().write(messageBuilder.buildDestinationDelta(x, z, y, planet)); } } @@ -149,7 +152,7 @@ public class MissionObject extends IntangibleObject implements IPersistent { this.difficultyLevel = missionLevel; } if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { - getContainer().getClient().getSession().write(messageBuilder.buildDifficultyLevelDelta(missionLevel)); + //getContainer().getClient().getSession().write(messageBuilder.buildDifficultyLevelDelta(missionLevel)); } } @@ -182,7 +185,7 @@ public class MissionObject extends IntangibleObject implements IPersistent { this.reward = missionCredits; } if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { - getContainer().getClient().getSession().write(messageBuilder.buildCreditsRewardDelta(missionCredits)); + //getContainer().getClient().getSession().write(messageBuilder.buildCreditsRewardDelta(missionCredits)); } } @@ -197,7 +200,7 @@ public class MissionObject extends IntangibleObject implements IPersistent { this.creator = missionCreator; } if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { - getContainer().getClient().getSession().write(messageBuilder.buildCreatorNameDelta(missionCreator)); + //getContainer().getClient().getSession().write(messageBuilder.buildCreatorNameDelta(missionCreator)); } } @@ -213,7 +216,7 @@ public class MissionObject extends IntangibleObject implements IPersistent { this.descId = id; } if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { - getContainer().getClient().getSession().write(messageBuilder.buildMissionDescriptionDelta(missionDescription, id)); + //getContainer().getClient().getSession().write(messageBuilder.buildMissionDescriptionDelta(missionDescription, id)); } } @@ -229,7 +232,7 @@ public class MissionObject extends IntangibleObject implements IPersistent { this.titleId = id; } if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { - getContainer().getClient().getSession().write(messageBuilder.buildMissionTitleDelta(missionTitle, id)); + //getContainer().getClient().getSession().write(messageBuilder.buildMissionTitleDelta(missionTitle, id)); } } @@ -244,7 +247,7 @@ public class MissionObject extends IntangibleObject implements IPersistent { this.missionTargetName = missionTargetName; } if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { - getContainer().getClient().getSession().write(messageBuilder.buildTargetNameDelta(missionTargetName)); + //getContainer().getClient().getSession().write(messageBuilder.buildTargetNameDelta(missionTargetName)); } } @@ -260,18 +263,18 @@ public class MissionObject extends IntangibleObject implements IPersistent { } } - public String getMissionTemplateObject() { + public int getMissionTemplateObject() { synchronized(objectMutex) { return missionTemplateObject; } } - public void setMissionTemplateObject(String missionTemplateObject) { + public void setMissionTemplateObject(int missionTemplateObject) { synchronized(objectMutex) { this.missionTemplateObject = missionTemplateObject; } if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { - getContainer().getClient().getSession().write(messageBuilder.buildTargetObjectIffDelta(missionTemplateObject)); + //getContainer().getClient().getSession().write(messageBuilder.buildTargetObjectIffDelta(missionTemplateObject)); } } @@ -298,13 +301,17 @@ public class MissionObject extends IntangibleObject implements IPersistent { this.type = missionType; } if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { - getContainer().getClient().getSession().write(messageBuilder.buildMissionTypeDelta(missionType)); + //getContainer().getClient().getSession().write(messageBuilder.buildMissionTypeDelta(missionType)); } } public void sendMissionDelta() { + getGrandparent().getClient().getSession().write(messageBuilder.buildMissionDelta()); + //getContainer().getClient().getSession().write(messageBuilder.buildMissionDelta()); + System.out.println("Sent delta"); if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { - getContainer().getClient().getSession().write(messageBuilder.buildMissionDelta()); + //getContainer().getClient().getSession().write(messageBuilder.buildMissionDelta()); + //System.out.println("Sent delta"); } } diff --git a/src/services/MissionService.java b/src/services/MissionService.java index 7141dee8..fcc25005 100644 --- a/src/services/MissionService.java +++ b/src/services/MissionService.java @@ -43,6 +43,7 @@ import resources.objects.waypoint.WaypointObject; import engine.clientdata.ClientFileManager; import engine.clientdata.visitors.DatatableVisitor; import engine.clients.Client; +import engine.resources.common.CRC; import engine.resources.container.Traverser; import engine.resources.objects.SWGObject; import engine.resources.scene.Planet; @@ -99,6 +100,7 @@ public class MissionService implements INetworkDispatch { }); } + @SuppressWarnings("unused") private void populateMissions(final SWGObject player, int type) { CreatureObject creature = (CreatureObject) player; TangibleObject missionBag = (TangibleObject) creature.getSlottedObject("mission_bag"); @@ -111,13 +113,15 @@ public class MissionService implements INetworkDispatch { @Override public void process(SWGObject child) { MissionObject mission = (MissionObject) child; - if (deCount.get() <= 7) { + if (deCount.get() < 5) { mission.setMissionType("destroy"); + mission.setMissionStart(200, 0, 200, "tatooine"); deCount.getAndIncrement(); Console.println("Destroy missions: " + String.valueOf(deCount.get())); } - else if (dCount.get() <= 7) { + else if (dCount.get() < 5) { mission.setMissionType("deliver"); + mission.setMissionStart(0, 0, 0, "tatooine"); dCount.getAndIncrement(); Console.println("Deliver missions: " + String.valueOf(dCount.get())); } else { @@ -125,26 +129,26 @@ public class MissionService implements INetworkDispatch { } mission.setCreditReward(1337); mission.setCreator("Waverunner"); - mission.setMissionLevel(10); + mission.setMissionLevel(5); mission.setMissionDescription("mission/mission_destroy_neutral_hard_creature_tatooine", "m17d"); mission.setMissionTitle("mission/mission_destroy_neutral_hard_creature_tatooine", "m17t"); - mission.setMissionDestination(0, 0, 0, "tatooine"); - mission.setMissionTemplateObject("object/tangible/lair/womp_rat/shared_lair_womp_rat_desert"); + mission.setMissionDestination(400, 0, 400, "tatooine"); + mission.setMissionTemplateObject(CRC.StringtoCRC("object/tangible/lair/base/shared_objective_power_generator.iff")); mission.setMissionTargetName("@lair_n:tatooine_giant_worrt_lair_neutral_medium"); - - WaypointObject wp = new WaypointObject(); + mission.setRepeatCount(1); + /*WaypointObject wp = new WaypointObject(); wp.setName("@mission/mission_destroy_neutral_hard_creature_tatooine:m17t"); wp.setColor(WaypointObject.ORANGE); wp.setPosition(new Point3D(10, 10, 10)); wp.setCellId(0); - wp.setPlanet(core.terrainService.getPlanetByName("tatooine")); - //mission.sendMissionDelta(); + wp.setPlanet(core.terrainService.getPlanetByName("tatooine"));*/ + mission.sendMissionDelta(); } }); - Console.println("Sent deltas"); + //Console.println("Sent deltas"); } // May want to create a map for the server with needed info @@ -170,27 +174,23 @@ public class MissionService implements INetworkDispatch { } public void createDefaultMissions(CreatureObject player) { - for(int missionsAdded = 0; missionsAdded <= 16; missionsAdded++) { + for(int missionsAdded = 0; missionsAdded <= 10; missionsAdded++) { MissionObject mission = (MissionObject) core.objectService.createObject("object/mission/shared_mission_object.iff", player.getPlanet()); - - mission.setStfFilename("mission/mission_object"); - mission.setStfName("destroy_mission"); - - mission.setMissionLevel(50); + mission.setMissionLevel(0); mission.setMissionStart(0, 0, 0, null); mission.setCreator(""); - mission.setCreditReward(100); + mission.setCreditReward(0); mission.setMissionDestination(0, 0, 0, null); //mission.setMissionTemplateObject(missionTemplateObject); - mission.setMissionDescription("mission/mission_npc_survey_neutral_easy", "m1o"); - mission.setMissionTitle("mission/mission_npc_survey_neutral_easy", "m1t"); + mission.setMissionDescription("", ""); + mission.setMissionTitle("", ""); - mission.setMissionType("survey"); // 0x19C9FAC1 + mission.setMissionType("destroy"); // 0x19C9FAC1 - mission.setMissionTargetName("Testing target name"); + mission.setMissionTargetName(""); TangibleObject missionBag = (TangibleObject) player.getSlottedObject("mission_bag"); missionBag._add(mission); From 851ba612527fae9e9832b3f28e081a84ebda08b1 Mon Sep 17 00:00:00 2001 From: Waverunner Date: Sun, 20 Apr 2014 20:21:38 -0400 Subject: [PATCH 5/9] More work on Missions --- .../mission/MissionMessageBuilder.java | 111 ++++------------ .../objects/mission/MissionObject.java | 94 +++++++------- src/services/CharacterService.java | 7 +- src/services/MissionService.java | 121 ++++++++---------- 4 files changed, 121 insertions(+), 212 deletions(-) diff --git a/src/resources/objects/mission/MissionMessageBuilder.java b/src/resources/objects/mission/MissionMessageBuilder.java index 1baca6ee..c97226cd 100644 --- a/src/resources/objects/mission/MissionMessageBuilder.java +++ b/src/resources/objects/mission/MissionMessageBuilder.java @@ -42,46 +42,47 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { IoBuffer buffer = IoBuffer.allocate(100, false).order(ByteOrder.LITTLE_ENDIAN); buffer.setAutoExpand(true); - buffer.putShort((short) 17); + buffer.putShort((short) 16); - buffer.putFloat(1); // mission complexity ?? - buffer.put(getAsciiString("mission/mission_object")); + buffer.putFloat(object.getComplexity()); // mission complexity ?? + + buffer.put(getAsciiString(object.getStfFilename())); buffer.putInt(0); - buffer.put(getAsciiString("destroy_mission")); + buffer.put(getAsciiString(object.getStfName())); if (mission.getCustomName() == null) { buffer.putInt(0); } else { buffer.put(getUnicodeString(mission.getCustomName())); } - buffer.putInt(0); // volume + buffer.putInt(object.getVolume()); // volume + buffer.putInt(0); // unused + buffer.putInt(mission.getMissionLevel()); buffer.putFloat(mission.getMissionStartX()); buffer.putFloat(mission.getMissionStartZ()); // missionStartZ buffer.putFloat(mission.getMissionStartY()); - buffer.putLong(0); // Start Object ID - - if (mission.getMissionStartPlanet() == null) { + if (mission.getMissionStartPlanet() == null) buffer.putInt(0); - } else { + else buffer.putInt(CRC.StringtoCRC(mission.getMissionStartPlanet())); - } - - buffer.put(getUnicodeString(mission.getCreator())); + + if (mission.getCreator() != null) + buffer.put(getUnicodeString(mission.getCreator())); + else + buffer.putInt(0); + buffer.putInt(mission.getCreditReward()); buffer.putFloat(mission.getMissionDestinationX()); buffer.putFloat(mission.getMissionDestinationZ()); buffer.putFloat(mission.getMissionDestinationY()); - buffer.putLong(0); // Destination Object ID - - if (mission.getMissionDestinationPlanet() == null) { + if (mission.getMissionDestinationPlanet() == null) buffer.putInt(0); - } else { + else buffer.putInt(CRC.StringtoCRC(mission.getMissionDestinationPlanet())); - } buffer.putInt(mission.getMissionTemplateObject()); @@ -95,11 +96,10 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { buffer.putInt(0); // refresh counter - if(mission.getMissionType() == null) { + if(mission.getMissionType() == null) buffer.putInt(0); - } else { + else buffer.putInt(CRC.StringtoCRC(mission.getMissionType())); - } buffer.put(getAsciiString(mission.getMissionTargetName())); @@ -178,7 +178,7 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } -/* + public IoBuffer buildStfDelta(String stfFile, String stfName) { IoBuffer buffer = IoBuffer.allocate(4 + stfFile.length() + stfName.length(), false).order(ByteOrder.LITTLE_ENDIAN); @@ -231,9 +231,9 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { public IoBuffer buildCreatorNameDelta(String creator) { - IoBuffer buffer = IoBuffer.allocate(4 + creator.length(), false).order(ByteOrder.LITTLE_ENDIAN); + IoBuffer buffer = IoBuffer.allocate(4 + (creator.length() * 2), false).order(ByteOrder.LITTLE_ENDIAN); - buffer.put(getAsciiString(creator)); + buffer.put(getUnicodeString(creator)); int size = buffer.position(); buffer.flip(); @@ -278,11 +278,11 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } - public IoBuffer buildTargetObjectIffDelta(String template) { + public IoBuffer buildTargetObjectIffDelta(int template) { IoBuffer buffer = IoBuffer.allocate(4, false).order(ByteOrder.LITTLE_ENDIAN); - buffer.putInt(CRC.StringtoCRC(template)); + buffer.putInt(template); int size = buffer.position(); buffer.flip(); @@ -359,66 +359,7 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } -*/ - @SuppressWarnings("unused") - public IoBuffer buildMissionDelta() { - IoBuffer buffer = IoBuffer.allocate(500, false).order(ByteOrder.LITTLE_ENDIAN); - buffer.isAutoExpand(); - buffer.isAutoShrink(); - - MissionObject mission = (MissionObject) object; - - buffer.putShort((short) 11); - buffer.put(getAsciiString(mission.getMissionDescription())); - buffer.putInt(0); - buffer.put(getAsciiString(mission.getMissionDescId())); - - buffer.putShort((short) 5); - buffer.putInt(mission.getMissionLevel()); - - buffer.putShort((short) 7); - buffer.put(getUnicodeString(mission.getCreator())); - - buffer.putShort((short) 8); - buffer.putInt(mission.getCreditReward()); - - buffer.putShort((short) 9); - buffer.putFloat(mission.getMissionDestinationX()); - buffer.putFloat(mission.getMissionDestinationZ()); - buffer.putFloat(mission.getMissionDestinationY()); - buffer.putLong(0); - buffer.putInt(CRC.StringtoCRC(mission.getMissionDestinationPlanet())); - - buffer.putShort((short) 10); - buffer.putInt(mission.getMissionTemplateObject()); - - buffer.putShort((short) 12); - buffer.put(getAsciiString(mission.getMissionTitle())); - buffer.putInt(0); - buffer.put(getAsciiString(mission.getMissionTitleId())); - - buffer.putShort((short) 13); - buffer.putInt(mission.getMissionRepeatCounter()); - - buffer.putShort((short) 14); - buffer.putInt(CRC.StringtoCRC(mission.getMissionType())); - - buffer.putShort((short) 15); - buffer.put(getAsciiString(mission.getMissionTargetName())); - - buffer.putShort((short) 6); - buffer.putFloat(mission.getMissionStartX()); - buffer.putFloat(mission.getMissionStartZ()); - buffer.putFloat(mission.getMissionStartY()); - buffer.putLong(0); // Start Object ID - buffer.putInt(CRC.StringtoCRC(mission.getMissionStartPlanet())); - - int size = buffer.position(); - buffer.flip(); - buffer = createDelta("MISO", (byte) 3, (short) 8, buffer, size + 4); - Console.println("MISO3 Delta: " + StringUtilities.bytesToHex(buffer.array())); - return buffer; - } + @Override public void sendListDelta(byte viewType, short updateType, IoBuffer buffer) { diff --git a/src/resources/objects/mission/MissionObject.java b/src/resources/objects/mission/MissionObject.java index baca60e7..c5d69f0a 100644 --- a/src/resources/objects/mission/MissionObject.java +++ b/src/resources/objects/mission/MissionObject.java @@ -21,8 +21,6 @@ ******************************************************************************/ package resources.objects.mission; -import java.util.List; - import com.sleepycat.je.Environment; import com.sleepycat.je.Transaction; import com.sleepycat.persist.model.NotPersistent; @@ -39,25 +37,25 @@ import engine.resources.scene.Quaternion; @Persistent(version=0) public class MissionObject extends IntangibleObject implements IPersistent { - private float destX; - private float destY; - private float destZ; - private float startX; - private float startY; - private float startZ; - private String startPlanet; - private int difficultyLevel; // Difficulty level displayed in details - private String destinationPlanet; - private int repeatCount; // increases for each player using the mission; used for redisplaying on mission term too - private int reward; - private String creator; - private String description; // TODO: Base off of a new Object, SWGString? - private String title; // TODO: Base off of a new Object, SWGString? - private String missionTargetName; // Target object I guess? - private String descId; - private String titleId; - private String type; - private int missionTemplateObject; + private float destX = 0; + private float destY = 0; + private float destZ = 0; + private float startX = 0; + private float startY = 0; + private float startZ = 0; + private String startPlanet = ""; + private int difficultyLevel = 0; // Difficulty level displayed in details + private String destinationPlanet = ""; + private int repeatCount = 0; // increases for each player using the mission; used for redisplaying on mission term too + private int reward = 0; + private String creator = ""; + private String description = ""; + private String title = ""; + private String missionTargetName = ""; // Target object I guess? + private String descId = ""; + private String titleId = ""; + private String type = ""; + private int missionTemplateObject = 0; private WaypointObject attachedWaypoint; @@ -100,8 +98,8 @@ public class MissionObject extends IntangibleObject implements IPersistent { this.startY = y; this.startPlanet = planet; } - if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { - //getContainer().getClient().getSession().write(messageBuilder.buildStartLocationDelta(x, z, y, planet)); + if (getGrandparent() != null && getGrandparent().getClient() != null && getGrandparent().getClient().getSession() != null) { + getGrandparent().getClient().getSession().write(messageBuilder.buildStartLocationDelta(x, z, y, planet)); } } @@ -130,8 +128,8 @@ public class MissionObject extends IntangibleObject implements IPersistent { this.destZ = z; this.destinationPlanet = planet; } - if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { - //getContainer().getClient().getSession().write(messageBuilder.buildDestinationDelta(x, z, y, planet)); + if (getGrandparent() != null && getGrandparent().getClient() != null && getGrandparent().getClient().getSession() != null) { + getGrandparent().getClient().getSession().write(messageBuilder.buildDestinationDelta(x, z, y, planet)); } } @@ -151,8 +149,8 @@ public class MissionObject extends IntangibleObject implements IPersistent { synchronized(objectMutex) { this.difficultyLevel = missionLevel; } - if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { - //getContainer().getClient().getSession().write(messageBuilder.buildDifficultyLevelDelta(missionLevel)); + if (getGrandparent() != null && getGrandparent().getClient() != null && getGrandparent().getClient().getSession() != null) { + getGrandparent().getClient().getSession().write(messageBuilder.buildDifficultyLevelDelta(missionLevel)); } } @@ -172,6 +170,9 @@ public class MissionObject extends IntangibleObject implements IPersistent { synchronized(objectMutex) { this.repeatCount = missionRepeatCounter; } + if (getGrandparent() != null && getGrandparent().getClient() != null && getGrandparent().getClient().getSession() != null) { + getGrandparent().getClient().getSession().write(messageBuilder.buildRepeatCounterDelta(missionRepeatCounter)); + } } public int getCreditReward() { @@ -184,8 +185,8 @@ public class MissionObject extends IntangibleObject implements IPersistent { synchronized(objectMutex) { this.reward = missionCredits; } - if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { - //getContainer().getClient().getSession().write(messageBuilder.buildCreditsRewardDelta(missionCredits)); + if (getGrandparent() != null && getGrandparent().getClient() != null && getGrandparent().getClient().getSession() != null) { + getGrandparent().getClient().getSession().write(messageBuilder.buildCreditsRewardDelta(missionCredits)); } } @@ -199,8 +200,8 @@ public class MissionObject extends IntangibleObject implements IPersistent { synchronized(objectMutex) { this.creator = missionCreator; } - if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { - //getContainer().getClient().getSession().write(messageBuilder.buildCreatorNameDelta(missionCreator)); + if (getGrandparent() != null && getGrandparent().getClient() != null && getGrandparent().getClient().getSession() != null) { + getGrandparent().getClient().getSession().write(messageBuilder.buildCreatorNameDelta(missionCreator)); } } @@ -215,8 +216,8 @@ public class MissionObject extends IntangibleObject implements IPersistent { this.description = missionDescription; this.descId = id; } - if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { - //getContainer().getClient().getSession().write(messageBuilder.buildMissionDescriptionDelta(missionDescription, id)); + if (getGrandparent() != null && getGrandparent().getClient() != null && getGrandparent().getClient().getSession() != null) { + getGrandparent().getClient().getSession().write(messageBuilder.buildMissionDescriptionDelta(missionDescription, id)); } } @@ -231,8 +232,8 @@ public class MissionObject extends IntangibleObject implements IPersistent { this.title = missionTitle; this.titleId = id; } - if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { - //getContainer().getClient().getSession().write(messageBuilder.buildMissionTitleDelta(missionTitle, id)); + if (getGrandparent() != null && getGrandparent().getClient() != null && getGrandparent().getClient().getSession() != null) { + getGrandparent().getClient().getSession().write(messageBuilder.buildMissionTitleDelta(missionTitle, id)); } } @@ -246,8 +247,8 @@ public class MissionObject extends IntangibleObject implements IPersistent { synchronized(objectMutex) { this.missionTargetName = missionTargetName; } - if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { - //getContainer().getClient().getSession().write(messageBuilder.buildTargetNameDelta(missionTargetName)); + if (getGrandparent() != null && getGrandparent().getClient() != null && getGrandparent().getClient().getSession() != null) { + getGrandparent().getClient().getSession().write(messageBuilder.buildTargetNameDelta(missionTargetName)); } } @@ -273,8 +274,8 @@ public class MissionObject extends IntangibleObject implements IPersistent { synchronized(objectMutex) { this.missionTemplateObject = missionTemplateObject; } - if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { - //getContainer().getClient().getSession().write(messageBuilder.buildTargetObjectIffDelta(missionTemplateObject)); + if (getGrandparent() != null && getGrandparent().getClient() != null && getGrandparent().getClient().getSession() != null) { + getGrandparent().getClient().getSession().write(messageBuilder.buildTargetObjectIffDelta(missionTemplateObject)); } } @@ -300,18 +301,9 @@ public class MissionObject extends IntangibleObject implements IPersistent { synchronized(objectMutex) { this.type = missionType; } - if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { - //getContainer().getClient().getSession().write(messageBuilder.buildMissionTypeDelta(missionType)); - } - } - - public void sendMissionDelta() { - getGrandparent().getClient().getSession().write(messageBuilder.buildMissionDelta()); - //getContainer().getClient().getSession().write(messageBuilder.buildMissionDelta()); - System.out.println("Sent delta"); - if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) { - //getContainer().getClient().getSession().write(messageBuilder.buildMissionDelta()); - //System.out.println("Sent delta"); + if (getGrandparent() != null && getGrandparent().getClient() != null && getGrandparent().getClient().getSession() != null) { + getGrandparent().getClient().getSession().write(messageBuilder.buildMissionTypeDelta(missionType)); + } } diff --git a/src/services/CharacterService.java b/src/services/CharacterService.java index 60666553..b11bd350 100644 --- a/src/services/CharacterService.java +++ b/src/services/CharacterService.java @@ -310,12 +310,11 @@ public class CharacterService implements INetworkDispatch { object._add(bank); object._add(missionBag); - /*for(int missionsAdded = 0; missionsAdded < 12; missionsAdded++) { + for(int missionsAdded = 1; missionsAdded <= 10; missionsAdded++) { MissionObject mission = (MissionObject) core.objectService.createObject("object/mission/shared_mission_object.iff", object.getPlanet()); missionBag._add(mission); - Console.println("Added empty mission " + missionsAdded); - }*/ + } // TODO: Race abilities if (client.isGM()) @@ -330,8 +329,6 @@ public class CharacterService implements INetworkDispatch { object.addObjectToEquipList(missionBag); object.addObjectToEquipList(appInventory); - core.missionService.createDefaultMissions(object); - WeaponObject defaultWeapon = (WeaponObject) core.objectService.createObject("object/weapon/creature/shared_creature_default_weapon.iff", object.getPlanet()); object.addObjectToEquipList(defaultWeapon); object._add(defaultWeapon); diff --git a/src/services/MissionService.java b/src/services/MissionService.java index 16aecee0..02b4c929 100644 --- a/src/services/MissionService.java +++ b/src/services/MissionService.java @@ -99,55 +99,10 @@ public class MissionService implements INetworkDispatch { }); } - @SuppressWarnings("unused") private void populateMissions(final SWGObject player, int type) { CreatureObject creature = (CreatureObject) player; - TangibleObject missionBag = (TangibleObject) creature.getSlottedObject("mission_bag"); - - final AtomicInteger deCount = new AtomicInteger(); - final AtomicInteger dCount = new AtomicInteger(); - //createDefaultMissions(creature); - missionBag.viewChildren(creature, true, false, new Traverser() { - @Override - public void process(SWGObject child) { - MissionObject mission = (MissionObject) child; - if (deCount.get() < 5) { - mission.setMissionType("destroy"); - mission.setMissionStart(200, 0, 200, "tatooine"); - deCount.getAndIncrement(); - Console.println("Destroy missions: " + String.valueOf(deCount.get())); - } - else if (dCount.get() < 5) { - mission.setMissionType("deliver"); - mission.setMissionStart(0, 0, 0, "tatooine"); - dCount.getAndIncrement(); - Console.println("Deliver missions: " + String.valueOf(dCount.get())); - } else { - return; - } - mission.setCreditReward(1337); - mission.setCreator("Waverunner"); - mission.setMissionLevel(5); - mission.setMissionDescription("mission/mission_destroy_neutral_hard_creature_tatooine", "m17d"); - mission.setMissionTitle("mission/mission_destroy_neutral_hard_creature_tatooine", "m17t"); - mission.setMissionDestination(400, 0, 400, "tatooine"); - mission.setMissionTemplateObject(CRC.StringtoCRC("object/tangible/lair/base/shared_objective_power_generator.iff")); - mission.setMissionTargetName("@lair_n:tatooine_giant_worrt_lair_neutral_medium"); - mission.setRepeatCount(1); - /*WaypointObject wp = new WaypointObject(); - wp.setName("@mission/mission_destroy_neutral_hard_creature_tatooine:m17t"); - wp.setColor(WaypointObject.ORANGE); - wp.setPosition(new Point3D(10, 10, 10)); - wp.setCellId(0); - wp.setPlanet(core.terrainService.getPlanetByName("tatooine"));*/ - mission.sendMissionDelta(); - - } - - }); - - //Console.println("Sent deltas"); + debugMissionDelta(creature); } // May want to create a map for the server with needed info @@ -172,33 +127,57 @@ public class MissionService implements INetworkDispatch { return 0; } - public void createDefaultMissions(CreatureObject player) { - for(int missionsAdded = 0; missionsAdded <= 10; missionsAdded++) { - MissionObject mission = (MissionObject) core.objectService.createObject("object/mission/shared_mission_object.iff", player.getPlanet()); - - mission.setMissionLevel(0); - mission.setMissionStart(0, 0, 0, null); - mission.setCreator(""); - mission.setCreditReward(0); - - mission.setMissionDestination(0, 0, 0, null); - - //mission.setMissionTemplateObject(missionTemplateObject); - mission.setMissionDescription("", ""); - mission.setMissionTitle("", ""); - - mission.setMissionType("destroy"); // 0x19C9FAC1 - - mission.setMissionTargetName(""); + public void debugMissionDelta(CreatureObject creature) { + TangibleObject missionBag = (TangibleObject) creature.getSlottedObject("mission_bag"); + final AtomicInteger count = new AtomicInteger(); + final AtomicInteger deCount = new AtomicInteger(); + final AtomicInteger dCount = new AtomicInteger(); + + count.getAndSet(1); + missionBag.viewChildren(creature, true, false, new Traverser() { - TangibleObject missionBag = (TangibleObject) player.getSlottedObject("mission_bag"); - missionBag._add(mission); - - Console.println("Added mission " + missionsAdded); - } - Console.println("Successfully created default missions"); + @Override + public void process(SWGObject child) { + + //if (count.get() > 1) + //return; + + if (child instanceof MissionObject == true) { + System.out.println(count.get() + " is a MissionObject"); + } else { + System.out.println(count.get() + " is not a MissionObject!!"); + } + + MissionObject mission = (MissionObject) child; + if (deCount.get() < 5) { + mission.setMissionType("destroy"); + deCount.getAndIncrement(); + Console.println("Destroy missions: " + String.valueOf(deCount.get())); + } + else if (dCount.get() < 5) { + mission.setMissionType("deliver"); + dCount.getAndIncrement(); + Console.println("Deliver missions: " + String.valueOf(dCount.get())); + } else { + return; + } + + mission.setMissionDescription("mission/mission_deliver_neutral_easy", "m9d"); + mission.setMissionLevel(1); + mission.setMissionStart((float) 3377.148, (float) -4753.221, (float) 0, "tatooine"); + mission.setCreator("Waverunner"); + mission.setCreditReward(69); + mission.setMissionDestination((float) 3447.129, (float) -5070.057, (float) 0, "tatooine"); + mission.setMissionTemplateObject(CRC.StringtoCRC("object/tangible/mission/shared_mission_datadisk.iff")); + mission.setMissionTitle("mission/mission_deliver_neutral_easy", "m9t"); + mission.setRepeatCount(1); + + //mission.sendMissionDelta(); + System.out.println("Object: " + count.getAndIncrement()); + } + + }); } - @Override public void shutdown() { From e9065c480f3a94b5a8722473597eddc2ea1d9d58 Mon Sep 17 00:00:00 2001 From: Waverunner Date: Mon, 21 Apr 2014 16:14:29 -0400 Subject: [PATCH 6/9] Randomize mission strings, foundation for objectives --- src/main/NGECore.java | 2 +- .../objectives/DeliveryMissionObjective.java | 53 +++++++ .../objects/mission/MissionObject.java | 15 +- src/services/mission/MissionObjective.java | 45 ++++++ .../{ => mission}/MissionService.java | 147 ++++++++++++------ 5 files changed, 212 insertions(+), 50 deletions(-) create mode 100644 src/resources/objectives/DeliveryMissionObjective.java create mode 100644 src/services/mission/MissionObjective.java rename src/services/{ => mission}/MissionService.java (55%) diff --git a/src/main/NGECore.java b/src/main/NGECore.java index f67ac8b0..8c813812 100644 --- a/src/main/NGECore.java +++ b/src/main/NGECore.java @@ -61,7 +61,6 @@ import services.housing.HousingService; import services.InstanceService; import services.LoginService; import services.LootService; -import services.MissionService; import services.PlayerService; import services.ScriptService; import services.SimulationService; @@ -83,6 +82,7 @@ import services.gcw.GCWService; import services.guild.GuildService; import services.LoginService; import services.map.MapService; +import services.mission.MissionService; import services.object.ObjectService; import services.object.UpdateService; import services.pet.MountService; diff --git a/src/resources/objectives/DeliveryMissionObjective.java b/src/resources/objectives/DeliveryMissionObjective.java new file mode 100644 index 00000000..31b1ed78 --- /dev/null +++ b/src/resources/objectives/DeliveryMissionObjective.java @@ -0,0 +1,53 @@ +/******************************************************************************* + * 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 resources.objectives; + +import resources.objects.mission.MissionObject; +import resources.objects.tangible.TangibleObject; +import services.mission.MissionObjective; + +public class DeliveryMissionObjective extends MissionObjective { + + private TangibleObject deliveryObject; + private int objectivePhase; + + public DeliveryMissionObjective(MissionObject parent) { + super(parent); + this.objectivePhase = 0; + } + + @Override + public void activate() { + } + + @Override + public void complete() { + } + + @Override + public void drop() { + } + + public TangibleObject getDeliveryObject() { return deliveryObject; } + + public int getObjectivePhase() { return objectivePhase; } +} diff --git a/src/resources/objects/mission/MissionObject.java b/src/resources/objects/mission/MissionObject.java index c5d69f0a..249d8869 100644 --- a/src/resources/objects/mission/MissionObject.java +++ b/src/resources/objects/mission/MissionObject.java @@ -28,6 +28,7 @@ import com.sleepycat.persist.model.Persistent; import resources.objects.intangible.IntangibleObject; import resources.objects.waypoint.WaypointObject; +import services.mission.MissionObjective; import engine.clients.Client; import engine.resources.objects.IPersistent; import engine.resources.scene.Planet; @@ -57,7 +58,7 @@ public class MissionObject extends IntangibleObject implements IPersistent { private String type = ""; private int missionTemplateObject = 0; private WaypointObject attachedWaypoint; - + private MissionObjective objective; @NotPersistent MissionMessageBuilder messageBuilder = new MissionMessageBuilder(this); @@ -307,6 +308,18 @@ public class MissionObject extends IntangibleObject implements IPersistent { } } + public MissionObjective getObjective() { + synchronized(objectMutex) { + return objective; + } + } + + public void setObjective(MissionObjective objective) { + synchronized(objectMutex) { + this.objective = objective; + } + } + public Transaction getTransaction() { return txn; } diff --git a/src/services/mission/MissionObjective.java b/src/services/mission/MissionObjective.java new file mode 100644 index 00000000..aa69ed08 --- /dev/null +++ b/src/services/mission/MissionObjective.java @@ -0,0 +1,45 @@ +/******************************************************************************* + * 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.mission; + +import resources.objects.mission.MissionObject; + +public abstract class MissionObjective { + + protected long startTime; + protected boolean activated; + protected MissionObject parent; + + public MissionObjective(MissionObject parent) { + this.startTime = System.currentTimeMillis(); + this.activated = false; + this.parent = parent; + } + + public abstract void activate(); + public abstract void complete(); + public abstract void drop(); + + public long getStartTime() { return startTime; } + public boolean isActivated() { return activated; } + public MissionObject getParent() { return parent; } +} diff --git a/src/services/MissionService.java b/src/services/mission/MissionService.java similarity index 55% rename from src/services/MissionService.java rename to src/services/mission/MissionService.java index 02b4c929..488f7d52 100644 --- a/src/services/MissionService.java +++ b/src/services/mission/MissionService.java @@ -19,11 +19,14 @@ * 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 services.mission; +import java.io.File; +import java.io.IOException; 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; @@ -35,14 +38,17 @@ import protocol.swg.objectControllerObjects.MissionListRequest; import resources.common.Console; import resources.common.TerminalType; import resources.common.ObjControllerOpcodes; +import resources.objectives.DeliveryMissionObjective; import resources.objects.creature.CreatureObject; import resources.objects.mission.MissionObject; import resources.objects.tangible.TangibleObject; import resources.objects.waypoint.WaypointObject; import engine.clientdata.ClientFileManager; +import engine.clientdata.StfTable; import engine.clientdata.visitors.DatatableVisitor; import engine.clients.Client; import engine.resources.common.CRC; +import engine.resources.common.NameGen; import engine.resources.container.Traverser; import engine.resources.objects.SWGObject; import engine.resources.scene.Planet; @@ -53,11 +59,20 @@ import engine.resources.service.INetworkRemoteEvent; public class MissionService implements INetworkDispatch { private NGECore core; + private NameGen nameGenerator; + // Use a HashMap for obtaining number of entries so we aren't using a visitor all the time. + private ConcurrentHashMap entryCounts = new ConcurrentHashMap(); + private Random ran = new Random(); public MissionService(NGECore core) { this.core = core; + + try { nameGenerator = new NameGen("names.txt"); } + catch (IOException e) { e.printStackTrace(); } + + populateMissionEntryCount(); } - + @Override public void insertOpcodes(Map swgOpcodes, Map objControllerOpcodes) { objControllerOpcodes.put(ObjControllerOpcodes.MISSION_LIST_REQUEST, new INetworkRemoteEvent() { @@ -105,79 +120,115 @@ public class MissionService implements INetworkDispatch { debugMissionDelta(creature); } - // 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); + private void populateMissionEntryCount() { + File missionFolder = new File("./clientdata/string/en/mission"); + File[] missionFiles = missionFolder.listFiles(); + + int missionStrings = 0; + for (int i = 0; i < missionFiles.length; i++) { + if (missionFiles[i].getName().contains("_easy") || missionFiles[i].getName().contains("_medium") || missionFiles[i].getName().contains("_hard")) { - 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; - } + String missionStf = "clientdata" + missionFiles[i].getAbsolutePath().split("clientdata")[1].replace("\\", "/"); + try { + StfTable stf = new StfTable(missionStf); + boolean gotCount = false; + + for (int s = 1; s < stf.getRowCount(); s++) { + + if (stf.getStringById(s).getKey() != null && stf.getStringById(s).getKey().equals("number_of_entries")) { + String finalStr = missionStf.split("clientdata/string/en/")[1].replace(".stf", ""); + entryCounts.put(finalStr, Integer.parseInt(stf.getStringById(s).getValue())); + gotCount = true; + } + } + if (gotCount == false) { + System.out.println("!NO ENTRY COUNT FOR " + missionStf); + continue; + } + } catch (Exception e) { e.printStackTrace(); } + missionStrings++; } } - catch (InstantiationException | IllegalAccessException e) { - e.printStackTrace(); - } - - return 0; + System.out.println("Loaded " + missionStrings + " mission entry counts."); } public void debugMissionDelta(CreatureObject creature) { TangibleObject missionBag = (TangibleObject) creature.getSlottedObject("mission_bag"); - final AtomicInteger count = new AtomicInteger(); - final AtomicInteger deCount = new AtomicInteger(); - final AtomicInteger dCount = new AtomicInteger(); - count.getAndSet(1); + final AtomicInteger destroyCount = new AtomicInteger(); + final AtomicInteger deliverCount = new AtomicInteger(); + missionBag.viewChildren(creature, true, false, new Traverser() { @Override public void process(SWGObject child) { - //if (count.get() > 1) - //return; - - if (child instanceof MissionObject == true) { - System.out.println(count.get() + " is a MissionObject"); - } else { - System.out.println(count.get() + " is not a MissionObject!!"); - } - - MissionObject mission = (MissionObject) child; - if (deCount.get() < 5) { - mission.setMissionType("destroy"); - deCount.getAndIncrement(); - Console.println("Destroy missions: " + String.valueOf(deCount.get())); - } - else if (dCount.get() < 5) { - mission.setMissionType("deliver"); - dCount.getAndIncrement(); - Console.println("Deliver missions: " + String.valueOf(dCount.get())); - } else { + if (child instanceof MissionObject == false) return; + + MissionObject mission = (MissionObject) child; + if (destroyCount.get() < 5) { + mission.setMissionType("destroy"); + + String missionStf = "mission/mission_destroy_neutral_easy_creature"; + int strId = getRandomStringEntry(missionStf); + + mission.setMissionDescription(missionStf, "m" + String.valueOf(strId) + "d"); + mission.setMissionTitle(missionStf, "m" + String.valueOf(strId) + "t"); + + destroyCount.getAndIncrement(); } + else if (deliverCount.get() < 5) { + mission.setMissionType("deliver"); + + String missionStf = "mission/mission_deliver_neutral_easy"; + int strId = getRandomStringEntry(missionStf); + + mission.setMissionDescription(missionStf, "m" + String.valueOf(strId) + "d"); + mission.setMissionTitle(missionStf, "m" + String.valueOf(strId) + "t"); + + deliverCount.getAndIncrement(); + } + else { return; } + + mission.setCreator(nameGenerator.compose(2) + " " + nameGenerator.compose(3)); - mission.setMissionDescription("mission/mission_deliver_neutral_easy", "m9d"); mission.setMissionLevel(1); mission.setMissionStart((float) 3377.148, (float) -4753.221, (float) 0, "tatooine"); - mission.setCreator("Waverunner"); mission.setCreditReward(69); mission.setMissionDestination((float) 3447.129, (float) -5070.057, (float) 0, "tatooine"); mission.setMissionTemplateObject(CRC.StringtoCRC("object/tangible/mission/shared_mission_datadisk.iff")); - mission.setMissionTitle("mission/mission_deliver_neutral_easy", "m9t"); mission.setRepeatCount(1); - //mission.sendMissionDelta(); - System.out.println("Object: " + count.getAndIncrement()); } }); } + + private int getRandomStringEntry(String missionStf) { + int ranEntryNum = 1; + + if (entryCounts.get(missionStf) != null) { ranEntryNum = ran.nextInt(entryCounts.get(missionStf)); } + else { System.out.println(missionStf + " was not found in entryCount and is using entry #1"); } + + if (ranEntryNum == 0) + return 1; + else + return ranEntryNum; + } + + private void randomDeliveryMission(MissionObject mission) { + mission.setMissionType("deliver"); + + String missionStf = "mission/mission_deliver_neutral_easy"; + int strId = getRandomStringEntry(missionStf); + + mission.setMissionDescription(missionStf, "m" + String.valueOf(strId) + "d"); + mission.setMissionTitle(missionStf, "m" + String.valueOf(strId) + "t"); + + //mission.setObjective(new DeliveryMissionObjective(mission)); + } + @Override public void shutdown() { From a00f637f13e789881e059bea56f42ab9de31112e Mon Sep 17 00:00:00 2001 From: Waverunner Date: Tue, 22 Apr 2014 17:54:05 -0400 Subject: [PATCH 7/9] More randomization's for delivery missions, more work on objectives --- .../MissionAcceptRequest.java | 62 ++++ .../MissionAcceptResponse.java} | 70 +++-- .../common/ObjControllerOpcodes.java | 1 + .../objectives/DeliveryMissionObjective.java | 1 + .../mission/MissionMessageBuilder.java | 36 ++- .../objects/mission/MissionObject.java | 103 +++---- src/services/mission/MissionObjective.java | 6 + src/services/mission/MissionService.java | 283 +++++++++++++----- 8 files changed, 374 insertions(+), 188 deletions(-) create mode 100644 src/protocol/swg/objectControllerObjects/MissionAcceptRequest.java rename src/{resources/common/TerminalType.java => protocol/swg/objectControllerObjects/MissionAcceptResponse.java} (73%) diff --git a/src/protocol/swg/objectControllerObjects/MissionAcceptRequest.java b/src/protocol/swg/objectControllerObjects/MissionAcceptRequest.java new file mode 100644 index 00000000..62a37694 --- /dev/null +++ b/src/protocol/swg/objectControllerObjects/MissionAcceptRequest.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * 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.objectControllerObjects; + +import org.apache.mina.core.buffer.IoBuffer; + +public class MissionAcceptRequest extends ObjControllerObject { + + private long missionObjId; + private long terminalObjId; + + public MissionAcceptRequest() { } + + @Override + public void deserialize(IoBuffer data) { + data.getLong(); + data.getInt(); + setMissionObjId(data.getLong()); + setTerminalObjId(data.getLong()); + } + + @Override + public IoBuffer serialize() { + return null; + } + + public long getMissionObjId() { + return missionObjId; + } + + public void setMissionObjId(long misssionObjId) { + this.missionObjId = misssionObjId; + } + + public long getTerminalObjId() { + return terminalObjId; + } + + public void setTerminalObjId(long terminalObjId) { + this.terminalObjId = terminalObjId; + } + +} diff --git a/src/resources/common/TerminalType.java b/src/protocol/swg/objectControllerObjects/MissionAcceptResponse.java similarity index 73% rename from src/resources/common/TerminalType.java rename to src/protocol/swg/objectControllerObjects/MissionAcceptResponse.java index 375d1e61..50e862e9 100644 --- a/src/resources/common/TerminalType.java +++ b/src/protocol/swg/objectControllerObjects/MissionAcceptResponse.java @@ -1,30 +1,40 @@ -/******************************************************************************* - * 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 resources.common; - -public class TerminalType { - public static int MISSION_GENERIC = 1; - public static int MISSION_BOUNTYHUNTER = 2; - public static int MISSION_ENTERTAINER = 3; - public static int MISSION_ARTISAN = 4; - public static int MISSION_EXPLORER = 5; -} +/******************************************************************************* + * 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.objectControllerObjects; + +import org.apache.mina.core.buffer.IoBuffer; + +public class MissionAcceptResponse extends ObjControllerObject { + + @Override + public void deserialize(IoBuffer data) { + // TODO Auto-generated method stub + + } + + @Override + public IoBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/src/resources/common/ObjControllerOpcodes.java b/src/resources/common/ObjControllerOpcodes.java index 8cc142fd..41db9dbd 100644 --- a/src/resources/common/ObjControllerOpcodes.java +++ b/src/resources/common/ObjControllerOpcodes.java @@ -34,6 +34,7 @@ public class ObjControllerOpcodes { public static final int BUFF_BUILDER_CHANGE = 0x5A020000; public static final int BUFF_BUILDER_END = 0x5B020000; public static final int MISSION_LIST_REQUEST = 0xF5000000; + public static final int MISSION_GENERIC_REQUEST = 0xF9000000; public static final int ChangeRoleIconChoice = 0x4D040000; public static final int IMAGE_DESIGN_CHANGE = 0x38020000; public static final int IMAGE_DESIGN_END = 0x39020000; diff --git a/src/resources/objectives/DeliveryMissionObjective.java b/src/resources/objectives/DeliveryMissionObjective.java index 31b1ed78..aa4d7a00 100644 --- a/src/resources/objectives/DeliveryMissionObjective.java +++ b/src/resources/objectives/DeliveryMissionObjective.java @@ -37,6 +37,7 @@ public class DeliveryMissionObjective extends MissionObjective { @Override public void activate() { + setActive(true); } @Override diff --git a/src/resources/objects/mission/MissionMessageBuilder.java b/src/resources/objects/mission/MissionMessageBuilder.java index c97226cd..236afe65 100644 --- a/src/resources/objects/mission/MissionMessageBuilder.java +++ b/src/resources/objects/mission/MissionMessageBuilder.java @@ -59,9 +59,15 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { buffer.putInt(mission.getMissionLevel()); - buffer.putFloat(mission.getMissionStartX()); - buffer.putFloat(mission.getMissionStartZ()); // missionStartZ - buffer.putFloat(mission.getMissionStartY()); + if (mission.getStartLocation() != null) { + buffer.putFloat(mission.getStartLocation().x); + buffer.putFloat(0); + buffer.putFloat(mission.getStartLocation().z); + } else { + buffer.putFloat(0); + buffer.putFloat(0); + buffer.putFloat(0); + } buffer.putLong(0); // Start Object ID if (mission.getMissionStartPlanet() == null) buffer.putInt(0); @@ -75,9 +81,15 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { buffer.putInt(mission.getCreditReward()); - buffer.putFloat(mission.getMissionDestinationX()); - buffer.putFloat(mission.getMissionDestinationZ()); - buffer.putFloat(mission.getMissionDestinationY()); + if (mission.getDestination() != null) { + buffer.putFloat(mission.getDestination().x); + buffer.putFloat(0); + buffer.putFloat(mission.getDestination().z); + } else { + buffer.putFloat(0); + buffer.putFloat(0); + buffer.putFloat(0); + } buffer.putLong(0); // Destination Object ID if (mission.getMissionDestinationPlanet() == null) buffer.putInt(0); @@ -207,13 +219,13 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } - public IoBuffer buildStartLocationDelta(float x, float z, float y, String planet) { + public IoBuffer buildStartLocationDelta(float x, float z, String planet) { IoBuffer buffer = IoBuffer.allocate(24, false).order(ByteOrder.LITTLE_ENDIAN); buffer.putFloat(x); + buffer.putFloat(0); buffer.putFloat(z); - buffer.putFloat(y); buffer.putLong(0); @@ -224,7 +236,7 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { } int size = buffer.position(); buffer.flip(); - buffer = createDelta("MISO", (byte) 3, (short) 1, (short) 0x06, buffer, size + 4); + buffer = createDelta("MISO", (byte) 3, (short) 1, (short) 0x09, buffer, size + 4); return buffer; } @@ -255,13 +267,13 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } - public IoBuffer buildDestinationDelta(float x, float z, float y, String planet) { + public IoBuffer buildDestinationDelta(float x, float z, String planet) { IoBuffer buffer = IoBuffer.allocate(24, false).order(ByteOrder.LITTLE_ENDIAN); buffer.putFloat(x); + buffer.putFloat(0); buffer.putFloat(z); - buffer.putFloat(y); buffer.putLong(0); // Destination Object ID @@ -273,7 +285,7 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { int size = buffer.position(); buffer.flip(); - buffer = createDelta("MISO", (byte) 3, (short) 1, (short) 0x09, buffer, size + 4); + buffer = createDelta("MISO", (byte) 3, (short) 1, (short) 0x06, buffer, size + 4); return buffer; } diff --git a/src/resources/objects/mission/MissionObject.java b/src/resources/objects/mission/MissionObject.java index 249d8869..4c6d1cd4 100644 --- a/src/resources/objects/mission/MissionObject.java +++ b/src/resources/objects/mission/MissionObject.java @@ -38,12 +38,8 @@ import engine.resources.scene.Quaternion; @Persistent(version=0) public class MissionObject extends IntangibleObject implements IPersistent { - private float destX = 0; - private float destY = 0; - private float destZ = 0; - private float startX = 0; - private float startY = 0; - private float startZ = 0; + private Point3D destination; + private Point3D startLocation; private String startPlanet = ""; private int difficultyLevel = 0; // Difficulty level displayed in details private String destinationPlanet = ""; @@ -74,66 +70,6 @@ public class MissionObject extends IntangibleObject implements IPersistent { super(objectID, planet, new Point3D(0, 0, 0), new Quaternion(1, 0, 0, 0), template); } - public float getMissionStartX() { - synchronized(objectMutex) { - return startX; - } - } - - public float getMissionStartY() { - synchronized(objectMutex) { - return startY; - } - } - - public float getMissionStartZ() { - synchronized(objectMutex) { - return startZ; - } - } - - public void setMissionStart(float x, float y, float z, String planet) { - synchronized(objectMutex) { - this.startZ = z; - this.startX = x; - this.startY = y; - this.startPlanet = planet; - } - if (getGrandparent() != null && getGrandparent().getClient() != null && getGrandparent().getClient().getSession() != null) { - getGrandparent().getClient().getSession().write(messageBuilder.buildStartLocationDelta(x, z, y, planet)); - } - } - - public float getMissionDestinationX() { - synchronized(objectMutex) { - return destX; - } - } - - public float getMissionDestinationY() { - synchronized(objectMutex) { - return destY; - } - } - - public float getMissionDestinationZ() { - synchronized(objectMutex) { - return destZ; - } - } - - public void setMissionDestination(float x, float y, float z, String planet) { - synchronized(objectMutex) { - this.destZ = z; - this.destY = y; - this.destZ = z; - this.destinationPlanet = planet; - } - if (getGrandparent() != null && getGrandparent().getClient() != null && getGrandparent().getClient().getSession() != null) { - getGrandparent().getClient().getSession().write(messageBuilder.buildDestinationDelta(x, z, y, planet)); - } - } - public String getMissionDestinationPlanet() { synchronized(objectMutex) { return destinationPlanet; @@ -304,7 +240,6 @@ public class MissionObject extends IntangibleObject implements IPersistent { } if (getGrandparent() != null && getGrandparent().getClient() != null && getGrandparent().getClient().getSession() != null) { getGrandparent().getClient().getSession().write(messageBuilder.buildMissionTypeDelta(missionType)); - } } @@ -320,6 +255,40 @@ public class MissionObject extends IntangibleObject implements IPersistent { } } + public Point3D getStartLocation() { + synchronized(objectMutex) { + return startLocation; + } + } + + public Point3D getDestination() { + synchronized(objectMutex) { + return destination; + } + } + + public void setStartLocation(Point3D startLocation, String planet) { + synchronized(objectMutex) { + this.startLocation = startLocation; + this.startPlanet = planet; + } + + if (getGrandparent() != null && getGrandparent().getClient() != null && getGrandparent().getClient().getSession() != null) { + getGrandparent().getClient().getSession().write(messageBuilder.buildStartLocationDelta(startLocation.x, startLocation.z, planet)); + } + } + + public void setDestination(Point3D destination, String planet) { + synchronized(objectMutex) { + this.destination = destination; + this.destinationPlanet = planet; + } + + if (getGrandparent() != null && getGrandparent().getClient() != null && getGrandparent().getClient().getSession() != null) { + getGrandparent().getClient().getSession().write(messageBuilder.buildDestinationDelta(destination.x, destination.z, planet)); + } + } + public Transaction getTransaction() { return txn; } diff --git a/src/services/mission/MissionObjective.java b/src/services/mission/MissionObjective.java index aa69ed08..37b7de49 100644 --- a/src/services/mission/MissionObjective.java +++ b/src/services/mission/MissionObjective.java @@ -21,14 +21,19 @@ ******************************************************************************/ package services.mission; +import com.sleepycat.persist.model.Persistent; + import resources.objects.mission.MissionObject; +@Persistent public abstract class MissionObjective { protected long startTime; protected boolean activated; protected MissionObject parent; + public MissionObjective() { } + public MissionObjective(MissionObject parent) { this.startTime = System.currentTimeMillis(); this.activated = false; @@ -41,5 +46,6 @@ public abstract class MissionObjective { public long getStartTime() { return startTime; } public boolean isActivated() { return activated; } + public void setActive(boolean isActive) { this.activated = isActive; } public MissionObject getParent() { return parent; } } diff --git a/src/services/mission/MissionService.java b/src/services/mission/MissionService.java index 488f7d52..0ed0dddd 100644 --- a/src/services/mission/MissionService.java +++ b/src/services/mission/MissionService.java @@ -27,6 +27,7 @@ import java.nio.ByteOrder; import java.util.Map; import java.util.Random; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import main.NGECore; @@ -34,24 +35,22 @@ import main.NGECore; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.session.IoSession; +import protocol.swg.objectControllerObjects.MissionAcceptRequest; +import protocol.swg.objectControllerObjects.MissionAcceptResponse; import protocol.swg.objectControllerObjects.MissionListRequest; import resources.common.Console; -import resources.common.TerminalType; +import resources.common.SpawnPoint; import resources.common.ObjControllerOpcodes; import resources.objectives.DeliveryMissionObjective; import resources.objects.creature.CreatureObject; import resources.objects.mission.MissionObject; import resources.objects.tangible.TangibleObject; -import resources.objects.waypoint.WaypointObject; -import engine.clientdata.ClientFileManager; import engine.clientdata.StfTable; -import engine.clientdata.visitors.DatatableVisitor; import engine.clients.Client; import engine.resources.common.CRC; import engine.resources.common.NameGen; import engine.resources.container.Traverser; import engine.resources.objects.SWGObject; -import engine.resources.scene.Planet; import engine.resources.scene.Point3D; import engine.resources.service.INetworkDispatch; import engine.resources.service.INetworkRemoteEvent; @@ -70,7 +69,7 @@ public class MissionService implements INetworkDispatch { try { nameGenerator = new NameGen("names.txt"); } catch (IOException e) { e.printStackTrace(); } - populateMissionEntryCount(); + loadMissionEntryCounts(); } @Override @@ -79,11 +78,6 @@ public class MissionService implements INetworkDispatch { @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(session); if(client == null || client.getSession() == null) @@ -94,17 +88,25 @@ public class MissionService implements INetworkDispatch { if(object == null) return; + data.order(ByteOrder.LITTLE_ENDIAN); + + MissionListRequest request = new MissionListRequest(); + request.deserialize(data); + SWGObject terminal = core.objectService.getObject(request.getTerminalId()); + if (terminal.getAttachment("terminalType") == null) + return; + 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) { + if (terminalType == TerminalType.GENERIC) { + handleMissionListRequest(core.objectService.getObject(request.getObjectId()), request.getTickCount(), TerminalType.GENERIC); + } else if (terminalType == TerminalType.BOUNTYHUNTER) { - } else if (terminalType == TerminalType.MISSION_ENTERTAINER) { + } else if (terminalType == TerminalType.ENTERTAINER) { - } else if (terminalType == TerminalType.MISSION_ARTISAN) { + } else if (terminalType == TerminalType.ARTISAN) { } else { Console.println("ERROR: Unsupported terminal " + terminal.getObjectId()); @@ -112,15 +114,43 @@ public class MissionService implements INetworkDispatch { } }); - } - - private void populateMissions(final SWGObject player, int type) { - CreatureObject creature = (CreatureObject) player; - debugMissionDelta(creature); + objControllerOpcodes.put(ObjControllerOpcodes.MISSION_GENERIC_REQUEST, new INetworkRemoteEvent() { + + @Override + public void handlePacket(IoSession session, IoBuffer data) throws Exception { + Client client = core.getClient(session); + + if(client == null || client.getSession() == null) + return; + + SWGObject object = client.getParent(); + + if(object == null) + return; + + CreatureObject creature = (CreatureObject) object; + + data.order(ByteOrder.LITTLE_ENDIAN); + + MissionAcceptRequest request = new MissionAcceptRequest(); + request.deserialize(data); + + MissionObject mission = (MissionObject) core.objectService.getObject(request.getMissionObjId()); + + if (mission == null) + return; + + if (handleMissionAccept(creature, mission)) { + //MissionAcceptResponse response = new MissionAcceptResponse(); + //session.write(response.serialize()); + } + } + + }); } - - private void populateMissionEntryCount() { + + private void loadMissionEntryCounts() { File missionFolder = new File("./clientdata/string/en/mission"); File[] missionFiles = missionFolder.listFiles(); @@ -152,58 +182,6 @@ public class MissionService implements INetworkDispatch { System.out.println("Loaded " + missionStrings + " mission entry counts."); } - public void debugMissionDelta(CreatureObject creature) { - TangibleObject missionBag = (TangibleObject) creature.getSlottedObject("mission_bag"); - - final AtomicInteger destroyCount = new AtomicInteger(); - final AtomicInteger deliverCount = new AtomicInteger(); - - missionBag.viewChildren(creature, true, false, new Traverser() { - - @Override - public void process(SWGObject child) { - - if (child instanceof MissionObject == false) - return; - - MissionObject mission = (MissionObject) child; - if (destroyCount.get() < 5) { - mission.setMissionType("destroy"); - - String missionStf = "mission/mission_destroy_neutral_easy_creature"; - int strId = getRandomStringEntry(missionStf); - - mission.setMissionDescription(missionStf, "m" + String.valueOf(strId) + "d"); - mission.setMissionTitle(missionStf, "m" + String.valueOf(strId) + "t"); - - destroyCount.getAndIncrement(); - } - else if (deliverCount.get() < 5) { - mission.setMissionType("deliver"); - - String missionStf = "mission/mission_deliver_neutral_easy"; - int strId = getRandomStringEntry(missionStf); - - mission.setMissionDescription(missionStf, "m" + String.valueOf(strId) + "d"); - mission.setMissionTitle(missionStf, "m" + String.valueOf(strId) + "t"); - - deliverCount.getAndIncrement(); - } - else { return; } - - mission.setCreator(nameGenerator.compose(2) + " " + nameGenerator.compose(3)); - - mission.setMissionLevel(1); - mission.setMissionStart((float) 3377.148, (float) -4753.221, (float) 0, "tatooine"); - mission.setCreditReward(69); - mission.setMissionDestination((float) 3447.129, (float) -5070.057, (float) 0, "tatooine"); - mission.setMissionTemplateObject(CRC.StringtoCRC("object/tangible/mission/shared_mission_datadisk.iff")); - mission.setRepeatCount(1); - - } - - }); - } private int getRandomStringEntry(String missionStf) { int ranEntryNum = 1; @@ -216,22 +194,169 @@ public class MissionService implements INetworkDispatch { else return ranEntryNum; } + + private void handleMissionListRequest(final SWGObject player, int requestCounter, int type) { + CreatureObject creature = (CreatureObject) player; + + TangibleObject missionBag = (TangibleObject) creature.getSlottedObject("mission_bag"); + + if (missionBag == null || creature == null) + return; + + final AtomicInteger typeOneCount = new AtomicInteger(); + final AtomicInteger typeTwoCount = new AtomicInteger(); + + missionBag.viewChildren(creature, true, false, new Traverser() { + + @Override + public void process(SWGObject obj) { + + if (obj instanceof MissionObject == false) + return; + + MissionObject mission = (MissionObject) obj; + + if (typeOneCount.get() < 4) { + + if (type == TerminalType.GENERIC) + randomDeliveryMission(player, mission); + + else if (type == TerminalType.BOUNTYHUNTER) + randomBountyMission(player, mission); + + else if (type == TerminalType.ARTISAN) + return; + + else + return; + + mission.setRepeatCount(requestCounter); + typeOneCount.incrementAndGet(); + + } else if (typeTwoCount.get() < 4) { + + if (type == TerminalType.GENERIC) + randomDestroyMission(player, mission); + + else if (type == TerminalType.BOUNTYHUNTER) + return; + + else if (type == TerminalType.ARTISAN) + return; + + else + return; + + mission.setRepeatCount(requestCounter); + typeTwoCount.incrementAndGet(); + } + } + }); + } - private void randomDeliveryMission(MissionObject mission) { + private boolean handleMissionAccept(CreatureObject creature, MissionObject mission) { + SWGObject missionBag = creature.getSlottedObject("mission_bag"); + + if (mission.getContainer() != missionBag) + return false; + + TangibleObject datapad = (TangibleObject) creature.getSlottedObject("datapad"); + + if (datapad == null) + return false; + + AtomicInteger missionCount = new AtomicInteger(); + AtomicBoolean hasBountyMission = new AtomicBoolean(false); + datapad.viewChildren(creature, true, false, new Traverser() { + + @Override + public void process(SWGObject obj) { + if (obj instanceof MissionObject) { + missionCount.incrementAndGet(); + + if (((MissionObject) obj).getMissionType().equals("bounty")) + hasBountyMission.set(true); + } + } + }); + + if (hasBountyMission.get() && mission.getMissionType().equals("bounty")) // Can only have 1 bounty mission + return false; + + System.out.println("Player has " + missionCount.get() + " missions."); + + if (missionCount.get() == 2) { + creature.sendSystemMessage("@mission/mission_generic:too_many_missions", (byte) 0); + return false; + } + if (missionBag.transferTo(creature, datapad, mission)) { + createMissionObjective(creature, mission); + return true; + } else { return false; } + } + + private void createMissionObjective(CreatureObject creature, MissionObject mission) { + String type = mission.getMissionType(); + + switch(type) { + + case "deliver": + DeliveryMissionObjective objective = new DeliveryMissionObjective(mission); + + mission.setObjective(objective); + + objective.activate(); + break; + + default: + break; + } + } + + private void randomDeliveryMission(SWGObject player, MissionObject mission) { mission.setMissionType("deliver"); - String missionStf = "mission/mission_deliver_neutral_easy"; + String[] difficulties = { "easy", "medium", "hard" }; + + String missionStf = "mission/mission_deliver_neutral_" + difficulties[ran.nextInt(difficulties.length)]; int strId = getRandomStringEntry(missionStf); mission.setMissionDescription(missionStf, "m" + String.valueOf(strId) + "d"); mission.setMissionTitle(missionStf, "m" + String.valueOf(strId) + "t"); - //mission.setObjective(new DeliveryMissionObjective(mission)); + mission.setCreator(nameGenerator.compose(2) + " " + nameGenerator.compose(3)); + + mission.setMissionLevel(5); + + Point3D startLocation = SpawnPoint.getRandomPosition(player.getPosition(), (float) 50, (float) 300, player.getPlanetId()); + Point3D destination = SpawnPoint.getRandomPosition(startLocation, (float) 50, (float) 500, player.getPlanetId()); + + mission.setStartLocation(startLocation, player.getPlanet().name); + mission.setDestination(destination, player.getPlanet().name); + + mission.setCreditReward((int) (50 * ((player.getWorldPosition().getDistance2D(destination) / 10)))); + + mission.setMissionTemplateObject(CRC.StringtoCRC("object/tangible/mission/shared_mission_datadisk.iff")); + mission.setMissionTargetName("Datadisk"); + } + + private void randomDestroyMission(SWGObject player, MissionObject mission) { + + } + + private void randomBountyMission(SWGObject player, MissionObject mission) { + + } + public enum TerminalType {; + public static final int GENERIC = 1; + public static final int BOUNTYHUNTER = 2; + public static final int ENTERTAINER = 3; + public static final int ARTISAN = 4; + public static final int EXPLORER = 5; } @Override public void shutdown() { } - } From 8e481be78358f2bd99f19940ef39b10d6b192b1a Mon Sep 17 00:00:00 2001 From: Waverunner Date: Thu, 24 Apr 2014 17:46:28 -0400 Subject: [PATCH 8/9] Added accepting for missions, added first phase for delivery missions --- scripts/conversation/missions/deliver.py | 32 ++++++++++ scripts/radial/object/conversation.py | 1 - src/protocol/swg/ObjControllerMessage.java | 1 + .../MissionAcceptRequest.java | 13 +++- .../MissionAcceptResponse.java | 31 ++++++++-- .../objectives/DeliveryMissionObjective.java | 62 +++++++++++++++++-- .../mission/MissionMessageBuilder.java | 61 ++++++++++++------ .../objects/mission/MissionObject.java | 47 +++++++------- src/services/mission/MissionObjective.java | 12 +++- src/services/mission/MissionService.java | 40 +++++++----- 10 files changed, 227 insertions(+), 73 deletions(-) create mode 100644 scripts/conversation/missions/deliver.py diff --git a/scripts/conversation/missions/deliver.py b/scripts/conversation/missions/deliver.py new file mode 100644 index 00000000..2f751818 --- /dev/null +++ b/scripts/conversation/missions/deliver.py @@ -0,0 +1,32 @@ +from resources.common import OutOfBand +from resources.common import ProsePackage +from resources.objectives import DeliveryMissionObjective +import sys + +def startConversation(core, actor, npc): + mission = npc.getAttachment('assignedMission') + + if mission is None: + return + + objective = mission.getObjective() + + if mission.getGrandparent().getObjectId() != actor.getObjectId() or objective is None: + core.conversationService.sendStopConversation(actor, npc, 'conversation/respecseller', 's_38') + return + + if objective.getObjectivePhase() == 0: + handleFirstDeliveryStage(core, actor, npc, objective, mission) + return + + #convSvc.sendConversationMessage(actor, npc, OutOfBand(ProsePackage(mission.getMissionDescription(), 'm' + str(mission.getMissionId()) + 'p'))) + return + +def endConversation(core, actor, npc): + return + +def handleFirstDeliveryStage(core, actor, npc, objective, mission): + core.conversationService.sendStopConversation(actor, npc, mission.getMissionDescription(), 'm' + str(mission.getMissionId()) + 'p') + objective.createDeliveryItem() + objective.setObjectivePhase(1) + return \ No newline at end of file diff --git a/scripts/radial/object/conversation.py b/scripts/radial/object/conversation.py index ee774b7d..0603ecb1 100644 --- a/scripts/radial/object/conversation.py +++ b/scripts/radial/object/conversation.py @@ -9,7 +9,6 @@ def createRadial(core, owner, target, radials): def handleSelection(core, owner, target, option): if option == 26 and target: - print 'test' core.conversationService.handleStartConversation(owner, target) return \ No newline at end of file diff --git a/src/protocol/swg/ObjControllerMessage.java b/src/protocol/swg/ObjControllerMessage.java index a9f541b8..2c4482d1 100644 --- a/src/protocol/swg/ObjControllerMessage.java +++ b/src/protocol/swg/ObjControllerMessage.java @@ -74,6 +74,7 @@ public class ObjControllerMessage extends SWGMessage { public static final int NEXT_CRAFTING_STAGE_RESULT = 0x01BE; public static final int DRAFT_SLOTS_QUERY_RESPONSE = 0x01BF; public static final int RESOURCE_WEIGHTS = 0x0207; + public static final int MISSION_ACCEPT_RESPONSE = 0x00FA; public ObjControllerMessage() { diff --git a/src/protocol/swg/objectControllerObjects/MissionAcceptRequest.java b/src/protocol/swg/objectControllerObjects/MissionAcceptRequest.java index 62a37694..403861d3 100644 --- a/src/protocol/swg/objectControllerObjects/MissionAcceptRequest.java +++ b/src/protocol/swg/objectControllerObjects/MissionAcceptRequest.java @@ -27,7 +27,8 @@ public class MissionAcceptRequest extends ObjControllerObject { private long missionObjId; private long terminalObjId; - + private byte terminalType; + public MissionAcceptRequest() { } @Override @@ -36,6 +37,7 @@ public class MissionAcceptRequest extends ObjControllerObject { data.getInt(); setMissionObjId(data.getLong()); setTerminalObjId(data.getLong()); + setTerminalType(data.get()); } @Override @@ -58,5 +60,12 @@ public class MissionAcceptRequest extends ObjControllerObject { public void setTerminalObjId(long terminalObjId) { this.terminalObjId = terminalObjId; } - + + public void setTerminalType(byte terminalType) { + this.terminalType = terminalType; + } + + public byte getTerminalType() { + return terminalType; + } } diff --git a/src/protocol/swg/objectControllerObjects/MissionAcceptResponse.java b/src/protocol/swg/objectControllerObjects/MissionAcceptResponse.java index 50e862e9..faad427b 100644 --- a/src/protocol/swg/objectControllerObjects/MissionAcceptResponse.java +++ b/src/protocol/swg/objectControllerObjects/MissionAcceptResponse.java @@ -21,20 +21,43 @@ ******************************************************************************/ package protocol.swg.objectControllerObjects; +import java.nio.ByteOrder; + import org.apache.mina.core.buffer.IoBuffer; +import protocol.swg.ObjControllerMessage; + public class MissionAcceptResponse extends ObjControllerObject { + private long objectId; + private long missionObjId; + private byte terminalType; + private byte flag; + + public MissionAcceptResponse(long objectId, long missionObjId, byte terminalType, byte flag) { + this.objectId = objectId; + this.missionObjId = missionObjId; + this.terminalType = terminalType; + this.flag = flag; + } + @Override public void deserialize(IoBuffer data) { - // TODO Auto-generated method stub - } @Override public IoBuffer serialize() { - // TODO Auto-generated method stub - return null; + IoBuffer buffer = IoBuffer.allocate(27).order(ByteOrder.LITTLE_ENDIAN); + + buffer.putInt(ObjControllerMessage.MISSION_ACCEPT_RESPONSE); + buffer.putLong(objectId); + buffer.putInt(0); + + buffer.putLong(missionObjId); + buffer.put(flag); + buffer.put(terminalType); + + return buffer.flip(); } } diff --git a/src/resources/objectives/DeliveryMissionObjective.java b/src/resources/objectives/DeliveryMissionObjective.java index aa4d7a00..6e478756 100644 --- a/src/resources/objectives/DeliveryMissionObjective.java +++ b/src/resources/objectives/DeliveryMissionObjective.java @@ -21,25 +21,55 @@ ******************************************************************************/ package resources.objectives; +import engine.resources.objects.SWGObject; +import engine.resources.scene.Point3D; +import main.NGECore; +import resources.objects.creature.CreatureObject; import resources.objects.mission.MissionObject; import resources.objects.tangible.TangibleObject; +import resources.objects.waypoint.WaypointObject; import services.mission.MissionObjective; public class DeliveryMissionObjective extends MissionObjective { private TangibleObject deliveryObject; - private int objectivePhase; - + private NGECore core = NGECore.getInstance(); + public DeliveryMissionObjective(MissionObject parent) { super(parent); - this.objectivePhase = 0; } @Override public void activate() { + + if (isActivated()) + return; + + String template = "object/mobile/shared_dressed_commoner_tatooine_sullustan_male_06.iff"; + Point3D startLoc = parent.getStartLocation(); + + CreatureObject missionGiver = (CreatureObject) core.staticService.spawnObject(template, parent.getPlanet().name, 0, startLoc.x, startLoc.y, startLoc.z, 0, 1); + missionGiver.setAttachment("conversationFile", "missions/deliver"); + missionGiver.setAttachment("radial_filename", "object/conversation"); + missionGiver.setAttachment("assignedMission", getMissionObject()); + missionGiver.setOptionsBitmask(264); + + if (getObjectivePhase() == 0) { + WaypointObject waypoint = (WaypointObject) core.objectService.createObject("object/waypoint/shared_waypoint.iff", parent.getPlanet()); + waypoint.setPosition(startLoc); + waypoint.setName("@mission/" + parent.getMissionTitle() + ":" + parent.getMissionId()); + waypoint.setColor(WaypointObject.ORANGE); + waypoint.setActive(true); + getMissionObject().setAttachedWaypoint(waypoint); + } + setActive(true); } + @Override + public void update() { + } + @Override public void complete() { } @@ -47,8 +77,30 @@ public class DeliveryMissionObjective extends MissionObjective { @Override public void drop() { } + + public boolean createDeliveryItem() { + SWGObject player = getMissionObject().getGrandparent(); + + if (player == null) + return false; + + TangibleObject inventory = (TangibleObject) player.getSlottedObject("inventory"); + + if (inventory == null) + return false; + + TangibleObject deliveryObject = (TangibleObject) core.objectService.createObject("object/tangible/mission/shared_mission_datadisk.iff", getMissionObject().getGrandparent().getPlanet()); + + if (deliveryObject != null && inventory.add(deliveryObject)) { + setDeliveryObject(deliveryObject); + return true; + } + else + return false; + } + public TangibleObject getDeliveryObject() { return deliveryObject; } - - public int getObjectivePhase() { return objectivePhase; } + + public void setDeliveryObject(TangibleObject object) { this.deliveryObject = object; } } diff --git a/src/resources/objects/mission/MissionMessageBuilder.java b/src/resources/objects/mission/MissionMessageBuilder.java index 236afe65..24c9aa07 100644 --- a/src/resources/objects/mission/MissionMessageBuilder.java +++ b/src/resources/objects/mission/MissionMessageBuilder.java @@ -26,6 +26,7 @@ import java.nio.ByteOrder; import org.apache.mina.core.buffer.IoBuffer; import engine.resources.common.CRC; +import engine.resources.scene.Point3D; import resources.common.Console; import resources.common.StringUtilities; import resources.objects.ObjectMessageBuilder; @@ -100,11 +101,11 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { buffer.put(getAsciiString(mission.getMissionDescription())); buffer.putInt(0); - buffer.put(getAsciiString(mission.getMissionDescId())); + buffer.put(getAsciiString("m" + mission.getMissionId() + "d")); buffer.put(getAsciiString(mission.getMissionTitle())); buffer.putInt(0); - buffer.put(getAsciiString(mission.getMissionTitleId())); + buffer.put(getAsciiString("m" + mission.getMissionId() + "t")); buffer.putInt(0); // refresh counter @@ -131,14 +132,14 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { } else { buffer.putInt(wp.getCellId()); buffer.putFloat(wp.getPosition().x); - buffer.putFloat(wp.getPosition().z); buffer.putFloat(wp.getPosition().y); + buffer.putFloat(wp.getPosition().z); buffer.putLong(0); buffer.putInt(CRC.StringtoCRC(wp.getPlanet().name)); buffer.put(getUnicodeString(wp.getName())); - buffer.putLong(mission.getObjectId() + 1); + buffer.putLong(wp.getObjectId()); buffer.put(wp.getColor()); - buffer.put((byte) 0x01); + buffer.put((byte) (wp.isActive() ? 1 : 0)); } int size = buffer.position(); @@ -219,13 +220,13 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } - public IoBuffer buildStartLocationDelta(float x, float z, String planet) { + public IoBuffer buildStartLocationDelta(Point3D startLocation, String planet) { IoBuffer buffer = IoBuffer.allocate(24, false).order(ByteOrder.LITTLE_ENDIAN); - buffer.putFloat(x); + buffer.putFloat(startLocation.x); buffer.putFloat(0); - buffer.putFloat(z); + buffer.putFloat(startLocation.z); buffer.putLong(0); @@ -236,7 +237,7 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { } int size = buffer.position(); buffer.flip(); - buffer = createDelta("MISO", (byte) 3, (short) 1, (short) 0x09, buffer, size + 4); + buffer = createDelta("MISO", (byte) 3, (short) 1, (short) 0x06, buffer, size + 4); return buffer; } @@ -267,13 +268,13 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } - public IoBuffer buildDestinationDelta(float x, float z, String planet) { + public IoBuffer buildDestinationDelta(Point3D destination, String planet) { IoBuffer buffer = IoBuffer.allocate(24, false).order(ByteOrder.LITTLE_ENDIAN); - buffer.putFloat(x); + buffer.putFloat(destination.x); buffer.putFloat(0); - buffer.putFloat(z); + buffer.putFloat(destination.z); buffer.putLong(0); // Destination Object ID @@ -285,7 +286,7 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { int size = buffer.position(); buffer.flip(); - buffer = createDelta("MISO", (byte) 3, (short) 1, (short) 0x06, buffer, size + 4); + buffer = createDelta("MISO", (byte) 3, (short) 1, (short) 0x09, buffer, size + 4); return buffer; } @@ -303,13 +304,13 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } - public IoBuffer buildMissionDescriptionDelta(String desc, String id) { + public IoBuffer buildMissionDescriptionDelta(String desc, int id) { - IoBuffer buffer = IoBuffer.allocate(8 + desc.length() + id.length(), false).order(ByteOrder.LITTLE_ENDIAN); + IoBuffer buffer = IoBuffer.allocate(12 + desc.length(), false).order(ByteOrder.LITTLE_ENDIAN); buffer.put(getAsciiString(desc)); buffer.putInt(0); - buffer.put(getAsciiString(id)); + buffer.put(getAsciiString("m" + id + "d")); int size = buffer.position(); buffer.flip(); @@ -318,13 +319,13 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } - public IoBuffer buildMissionTitleDelta(String title, String id) { + public IoBuffer buildMissionTitleDelta(String title, int id) { - IoBuffer buffer = IoBuffer.allocate(8 + title.length() + id.length(), false).order(ByteOrder.LITTLE_ENDIAN); + IoBuffer buffer = IoBuffer.allocate(12 + title.length(), false).order(ByteOrder.LITTLE_ENDIAN); buffer.put(getAsciiString(title)); buffer.putInt(0); - buffer.put(getAsciiString(id)); + buffer.put(getAsciiString("m" + id + "t")); int size = buffer.position(); buffer.flip(); @@ -371,6 +372,28 @@ public class MissionMessageBuilder extends ObjectMessageBuilder { return buffer; } + + public IoBuffer buildWaypointDelta(WaypointObject wp) { + + IoBuffer buffer = IoBuffer.allocate(44 + (2 * wp.getName().length()), false).order(ByteOrder.LITTLE_ENDIAN); + + buffer.putInt(wp.getCellId()); + buffer.putFloat(wp.getPosition().x); + buffer.putFloat(wp.getPosition().y); + buffer.putFloat(wp.getPosition().z); + buffer.putLong(0); + buffer.putInt(CRC.StringtoCRC(wp.getPlanet().name)); + buffer.put(getUnicodeString(wp.getName())); + buffer.putLong(wp.getObjectId()); + buffer.put(wp.getColor()); + buffer.put((byte) (wp.isActive() ? 1 : 0)); + + int size = buffer.position(); + buffer.flip(); + buffer = createDelta("MISO", (byte) 3, (short) 1, (short) 0x10, buffer, size + 4); + + return buffer; + } @Override public void sendListDelta(byte viewType, short updateType, IoBuffer buffer) { diff --git a/src/resources/objects/mission/MissionObject.java b/src/resources/objects/mission/MissionObject.java index 4c6d1cd4..12ed3fa8 100644 --- a/src/resources/objects/mission/MissionObject.java +++ b/src/resources/objects/mission/MissionObject.java @@ -35,7 +35,7 @@ import engine.resources.scene.Planet; import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; -@Persistent(version=0) +@Persistent(version=1) public class MissionObject extends IntangibleObject implements IPersistent { private Point3D destination; @@ -49,8 +49,7 @@ public class MissionObject extends IntangibleObject implements IPersistent { private String description = ""; private String title = ""; private String missionTargetName = ""; // Target object I guess? - private String descId = ""; - private String titleId = ""; + private int missionId = 0; private String type = ""; private int missionTemplateObject = 0; private WaypointObject attachedWaypoint; @@ -148,13 +147,12 @@ public class MissionObject extends IntangibleObject implements IPersistent { } } - public void setMissionDescription(String missionDescription, String id) { + public void setMissionDescription(String missionDescription) { synchronized(objectMutex) { this.description = missionDescription; - this.descId = id; } if (getGrandparent() != null && getGrandparent().getClient() != null && getGrandparent().getClient().getSession() != null) { - getGrandparent().getClient().getSession().write(messageBuilder.buildMissionDescriptionDelta(missionDescription, id)); + getGrandparent().getClient().getSession().write(messageBuilder.buildMissionDescriptionDelta(missionDescription, missionId)); } } @@ -164,13 +162,12 @@ public class MissionObject extends IntangibleObject implements IPersistent { } } - public void setMissionTitle(String missionTitle, String id) { + public void setMissionTitle(String missionTitle) { synchronized(objectMutex) { this.title = missionTitle; - this.titleId = id; } if (getGrandparent() != null && getGrandparent().getClient() != null && getGrandparent().getClient().getSession() != null) { - getGrandparent().getClient().getSession().write(messageBuilder.buildMissionTitleDelta(missionTitle, id)); + getGrandparent().getClient().getSession().write(messageBuilder.buildMissionTitleDelta(missionTitle, missionId)); } } @@ -195,9 +192,13 @@ public class MissionObject extends IntangibleObject implements IPersistent { } } - public void setAttachedWaypoint(WaypointObject missionAttachedWaypoint) { + public void setAttachedWaypoint(WaypointObject waypoint) { synchronized(objectMutex) { - this.attachedWaypoint = missionAttachedWaypoint; + this.attachedWaypoint = waypoint; + } + + if (getGrandparent() != null && getGrandparent().getClient() != null && getGrandparent().getClient().getSession() != null) { + getGrandparent().getClient().getSession().write(messageBuilder.buildWaypointDelta(waypoint)); } } @@ -216,18 +217,6 @@ public class MissionObject extends IntangibleObject implements IPersistent { } } - public String getMissionDescId() { - synchronized(objectMutex) { - return descId; - } - } - - public String getMissionTitleId() { - synchronized(objectMutex) { - return titleId; - } - } - public String getMissionType() { synchronized(objectMutex) { return type; @@ -274,7 +263,7 @@ public class MissionObject extends IntangibleObject implements IPersistent { } if (getGrandparent() != null && getGrandparent().getClient() != null && getGrandparent().getClient().getSession() != null) { - getGrandparent().getClient().getSession().write(messageBuilder.buildStartLocationDelta(startLocation.x, startLocation.z, planet)); + getGrandparent().getClient().getSession().write(messageBuilder.buildStartLocationDelta(startLocation, planet)); } } @@ -285,10 +274,18 @@ public class MissionObject extends IntangibleObject implements IPersistent { } if (getGrandparent() != null && getGrandparent().getClient() != null && getGrandparent().getClient().getSession() != null) { - getGrandparent().getClient().getSession().write(messageBuilder.buildDestinationDelta(destination.x, destination.z, planet)); + getGrandparent().getClient().getSession().write(messageBuilder.buildDestinationDelta(destination, planet)); } } + public int getMissionId() { + return missionId; + } + + public void setMissionId(int missionId) { + this.missionId = missionId; + } + public Transaction getTransaction() { return txn; } diff --git a/src/services/mission/MissionObjective.java b/src/services/mission/MissionObjective.java index 37b7de49..d74ef6d1 100644 --- a/src/services/mission/MissionObjective.java +++ b/src/services/mission/MissionObjective.java @@ -25,12 +25,13 @@ import com.sleepycat.persist.model.Persistent; import resources.objects.mission.MissionObject; -@Persistent +@Persistent(version=0) public abstract class MissionObjective { protected long startTime; protected boolean activated; protected MissionObject parent; + private int objectivePhase; public MissionObjective() { } @@ -38,14 +39,21 @@ public abstract class MissionObjective { this.startTime = System.currentTimeMillis(); this.activated = false; this.parent = parent; + this.objectivePhase = 0; } public abstract void activate(); public abstract void complete(); public abstract void drop(); + public abstract void update(); public long getStartTime() { return startTime; } + public boolean isActivated() { return activated; } public void setActive(boolean isActive) { this.activated = isActive; } - public MissionObject getParent() { return parent; } + + public MissionObject getMissionObject() { return parent; } + + public int getObjectivePhase() { return objectivePhase; } + public void setObjectivePhase(int phase) { this.objectivePhase = phase; } } diff --git a/src/services/mission/MissionService.java b/src/services/mission/MissionService.java index 0ed0dddd..08415813 100644 --- a/src/services/mission/MissionService.java +++ b/src/services/mission/MissionService.java @@ -35,9 +35,11 @@ import main.NGECore; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.session.IoSession; +import protocol.swg.ObjControllerMessage; import protocol.swg.objectControllerObjects.MissionAcceptRequest; import protocol.swg.objectControllerObjects.MissionAcceptResponse; import protocol.swg.objectControllerObjects.MissionListRequest; +import protocol.swg.objectControllerObjects.ObjControllerObject; import resources.common.Console; import resources.common.SpawnPoint; import resources.common.ObjControllerOpcodes; @@ -45,6 +47,7 @@ import resources.objectives.DeliveryMissionObjective; import resources.objects.creature.CreatureObject; import resources.objects.mission.MissionObject; import resources.objects.tangible.TangibleObject; +import resources.objects.waypoint.WaypointObject; import engine.clientdata.StfTable; import engine.clients.Client; import engine.resources.common.CRC; @@ -142,11 +145,13 @@ public class MissionService implements INetworkDispatch { return; if (handleMissionAccept(creature, mission)) { - //MissionAcceptResponse response = new MissionAcceptResponse(); - //session.write(response.serialize()); + MissionAcceptResponse response = new MissionAcceptResponse(object.getObjectId(), mission.getObjectId(), request.getTerminalType(), (byte) 1); + object.getClient().getSession().write(new ObjControllerMessage(0x0B, response).serialize()); + } else { + MissionAcceptResponse response = new MissionAcceptResponse(object.getObjectId(), mission.getObjectId(), request.getTerminalType(), (byte) 0); + object.getClient().getSession().write(new ObjControllerMessage(0x0B, response).serialize()); } } - }); } @@ -283,21 +288,18 @@ public class MissionService implements INetworkDispatch { if (hasBountyMission.get() && mission.getMissionType().equals("bounty")) // Can only have 1 bounty mission return false; - System.out.println("Player has " + missionCount.get() + " missions."); - if (missionCount.get() == 2) { creature.sendSystemMessage("@mission/mission_generic:too_many_missions", (byte) 0); return false; } - if (missionBag.transferTo(creature, datapad, mission)) { - createMissionObjective(creature, mission); - return true; - } else { return false; } + missionBag.transferTo(creature, datapad, mission); + createMissionObjective(creature, mission); + return true; } private void createMissionObjective(CreatureObject creature, MissionObject mission) { String type = mission.getMissionType(); - + System.out.println("Type: " + type); switch(type) { case "deliver": @@ -306,6 +308,7 @@ public class MissionService implements INetworkDispatch { mission.setObjective(objective); objective.activate(); + System.out.println("Went here!"); break; default: @@ -319,10 +322,10 @@ public class MissionService implements INetworkDispatch { String[] difficulties = { "easy", "medium", "hard" }; String missionStf = "mission/mission_deliver_neutral_" + difficulties[ran.nextInt(difficulties.length)]; - int strId = getRandomStringEntry(missionStf); - - mission.setMissionDescription(missionStf, "m" + String.valueOf(strId) + "d"); - mission.setMissionTitle(missionStf, "m" + String.valueOf(strId) + "t"); + + mission.setMissionId(getRandomStringEntry(missionStf)); + mission.setMissionDescription(missionStf); + mission.setMissionTitle(missionStf); mission.setCreator(nameGenerator.compose(2) + " " + nameGenerator.compose(3)); @@ -334,10 +337,17 @@ public class MissionService implements INetworkDispatch { mission.setStartLocation(startLocation, player.getPlanet().name); mission.setDestination(destination, player.getPlanet().name); - mission.setCreditReward((int) (50 * ((player.getWorldPosition().getDistance2D(destination) / 10)))); + mission.setCreditReward((int) (50 * ((startLocation.getDistance2D(destination) / 10)))); mission.setMissionTemplateObject(CRC.StringtoCRC("object/tangible/mission/shared_mission_datadisk.iff")); mission.setMissionTargetName("Datadisk"); + + WaypointObject waypoint = (WaypointObject) core.objectService.createObject("object/waypoint/shared_waypoint.iff", player.getPlanet()); + if (waypoint == null) + return; + + waypoint.setColor(WaypointObject.ORANGE); + } private void randomDestroyMission(SWGObject player, MissionObject mission) { From 5e240b00faf2e4cd27082d420a1c0a8bc9d8a512 Mon Sep 17 00:00:00 2001 From: Waverunner Date: Fri, 25 Apr 2014 17:26:48 -0400 Subject: [PATCH 9/9] Added aborting for missions, finished delivery missions, cleaned up code --- scripts/conversation/missions/deliver.py | 50 ++++++++-- src/protocol/swg/ObjControllerMessage.java | 1 + .../objectControllerObjects/MissionAbort.java | 61 ++++++++++++ .../common/ObjControllerOpcodes.java | 1 + .../objectives/DeliveryMissionObjective.java | 99 +++++++++++++++++-- .../objectives/DestroyMissionObjective.java | 57 +++++++++++ .../objects/creature/CreatureObject.java | 18 ++++ src/services/mission/MissionObjective.java | 2 +- src/services/mission/MissionService.java | 73 +++++++++++--- 9 files changed, 335 insertions(+), 27 deletions(-) create mode 100644 src/protocol/swg/objectControllerObjects/MissionAbort.java create mode 100644 src/resources/objectives/DestroyMissionObjective.java diff --git a/scripts/conversation/missions/deliver.py b/scripts/conversation/missions/deliver.py index 2f751818..5caef3fa 100644 --- a/scripts/conversation/missions/deliver.py +++ b/scripts/conversation/missions/deliver.py @@ -4,7 +4,12 @@ from resources.objectives import DeliveryMissionObjective import sys def startConversation(core, actor, npc): - mission = npc.getAttachment('assignedMission') + missionId = npc.getAttachment('assignedMission') + + if missionId is None: + return + + mission = core.objectService.getObject(missionId) if mission is None: return @@ -12,21 +17,54 @@ def startConversation(core, actor, npc): objective = mission.getObjective() if mission.getGrandparent().getObjectId() != actor.getObjectId() or objective is None: - core.conversationService.sendStopConversation(actor, npc, 'conversation/respecseller', 's_38') + core.conversationService.sendStopConversation(actor, npc, 'mission/mission_generic', 'npc_job_request_no_job') return if objective.getObjectivePhase() == 0: - handleFirstDeliveryStage(core, actor, npc, objective, mission) + handlePickupStage(core, actor, npc, objective, mission) return - #convSvc.sendConversationMessage(actor, npc, OutOfBand(ProsePackage(mission.getMissionDescription(), 'm' + str(mission.getMissionId()) + 'p'))) + elif objective.getObjectivePhase() == 1: + handleDeliveryStage(core, actor, npc, objective, mission) + return + + elif objective.getObjectivePhase() == 2: + handleCompletionStage(core, actor, npc, objective, mission) + return return def endConversation(core, actor, npc): + core.conversationService.sendStopConversation(actor, npc, 'mission/mission_generic', 'npc_job_request_no_job') return -def handleFirstDeliveryStage(core, actor, npc, objective, mission): +def handlePickupStage(core, actor, npc, objective, mission): + + if objective.getMissionGiver().getObjectId() != npc.getObjectId(): + endConversation(core, actor, npc) + return + core.conversationService.sendStopConversation(actor, npc, mission.getMissionDescription(), 'm' + str(mission.getMissionId()) + 'p') objective.createDeliveryItem() - objective.setObjectivePhase(1) + objective.update() + return + +def handleDeliveryStage(core, actor, npc, objective, mission): + + if objective.getDropOffNpc().getObjectId() != npc.getObjectId(): + endConversation(core, actor, npc) + return + + core.conversationService.sendStopConversation(actor, npc, mission.getMissionDescription(), 'm' + str(mission.getMissionId()) + 'r') + core.objectService.destroyObject(objective.getDeliveryObject()) + objective.update() + return + +def handleCompletionStage(core, actor, npc, objective, mission): + + if objective.getMissionGiver().getObjectId() != npc.getObjectId(): + endConversation(core, actor, npc) + return + + core.conversationService.sendStopConversation(actor, npc, mission.getMissionDescription(), 'm' + str(mission.getMissionId()) + 's') + objective.complete() return \ No newline at end of file diff --git a/src/protocol/swg/ObjControllerMessage.java b/src/protocol/swg/ObjControllerMessage.java index 2c4482d1..cb1ff04b 100644 --- a/src/protocol/swg/ObjControllerMessage.java +++ b/src/protocol/swg/ObjControllerMessage.java @@ -75,6 +75,7 @@ public class ObjControllerMessage extends SWGMessage { public static final int DRAFT_SLOTS_QUERY_RESPONSE = 0x01BF; public static final int RESOURCE_WEIGHTS = 0x0207; public static final int MISSION_ACCEPT_RESPONSE = 0x00FA; + public static final int MISSION_ABORT_RESPONSE = 0x0142; public ObjControllerMessage() { diff --git a/src/protocol/swg/objectControllerObjects/MissionAbort.java b/src/protocol/swg/objectControllerObjects/MissionAbort.java new file mode 100644 index 00000000..2195c511 --- /dev/null +++ b/src/protocol/swg/objectControllerObjects/MissionAbort.java @@ -0,0 +1,61 @@ +/******************************************************************************* + * 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.objectControllerObjects; + +import java.nio.ByteOrder; + +import org.apache.mina.core.buffer.IoBuffer; + +import protocol.swg.ObjControllerMessage; + +public class MissionAbort extends ObjControllerObject { + private long characterId; + private long missionId; + + public MissionAbort() { } + + @Override + public void deserialize(IoBuffer data) { + setCharacterId(data.getLong()); + data.getInt(); + setMissionId(data.getLong()); + } + + @Override + public IoBuffer serialize() { + IoBuffer buffer = IoBuffer.allocate(32).order(ByteOrder.LITTLE_ENDIAN); + + buffer.putInt(ObjControllerMessage.MISSION_ABORT_RESPONSE); + buffer.putLong(characterId); + buffer.putInt(0); + buffer.putLong(missionId); + return null; + } + + public long getMissionId() { return missionId; } + + public void setMissionId(long missionId) { this.missionId = missionId; } + + public long getCharacterId() { return characterId; } + + public void setCharacterId(long characterId) { this.characterId = characterId; } +} diff --git a/src/resources/common/ObjControllerOpcodes.java b/src/resources/common/ObjControllerOpcodes.java index 41db9dbd..c38a6071 100644 --- a/src/resources/common/ObjControllerOpcodes.java +++ b/src/resources/common/ObjControllerOpcodes.java @@ -35,6 +35,7 @@ public class ObjControllerOpcodes { public static final int BUFF_BUILDER_END = 0x5B020000; public static final int MISSION_LIST_REQUEST = 0xF5000000; public static final int MISSION_GENERIC_REQUEST = 0xF9000000; + public static final int MISSION_ABORT = 0x42010000; public static final int ChangeRoleIconChoice = 0x4D040000; public static final int IMAGE_DESIGN_CHANGE = 0x38020000; public static final int IMAGE_DESIGN_END = 0x39020000; diff --git a/src/resources/objectives/DeliveryMissionObjective.java b/src/resources/objectives/DeliveryMissionObjective.java index 6e478756..b5802390 100644 --- a/src/resources/objectives/DeliveryMissionObjective.java +++ b/src/resources/objectives/DeliveryMissionObjective.java @@ -24,6 +24,8 @@ package resources.objectives; import engine.resources.objects.SWGObject; import engine.resources.scene.Point3D; import main.NGECore; +import resources.common.OutOfBand; +import resources.common.ProsePackage; import resources.objects.creature.CreatureObject; import resources.objects.mission.MissionObject; import resources.objects.tangible.TangibleObject; @@ -33,6 +35,8 @@ import services.mission.MissionObjective; public class DeliveryMissionObjective extends MissionObjective { private TangibleObject deliveryObject; + private CreatureObject missionGiver; + private CreatureObject dropOffNpc; private NGECore core = NGECore.getInstance(); public DeliveryMissionObjective(MissionObject parent) { @@ -46,18 +50,44 @@ public class DeliveryMissionObjective extends MissionObjective { return; String template = "object/mobile/shared_dressed_commoner_tatooine_sullustan_male_06.iff"; + Point3D startLoc = parent.getStartLocation(); + Point3D destination = parent.getDestination(); + // TODO: Randomize this process. CreatureObject missionGiver = (CreatureObject) core.staticService.spawnObject(template, parent.getPlanet().name, 0, startLoc.x, startLoc.y, startLoc.z, 0, 1); + if (missionGiver == null) + return; + + missionGiver.setCustomName("a commoner"); missionGiver.setAttachment("conversationFile", "missions/deliver"); missionGiver.setAttachment("radial_filename", "object/conversation"); - missionGiver.setAttachment("assignedMission", getMissionObject()); + missionGiver.setAttachment("assignedMission", getMissionObject().getObjectId()); missionGiver.setOptionsBitmask(264); + setMissionGiver(missionGiver); + + CreatureObject dropOffNpc = (CreatureObject) core.staticService.spawnObject(template, parent.getPlanet().name, 0, destination.x, destination.y, destination.z, 0, 1); + if (dropOffNpc == null) + return; + + dropOffNpc.setCustomName("a commoner"); + dropOffNpc.setAttachment("conversationFile", "missions/deliver"); + dropOffNpc.setAttachment("radial_filename", "object/conversation"); + dropOffNpc.setAttachment("assignedMission", getMissionObject().getObjectId()); + dropOffNpc.setOptionsBitmask(264); + setDropOffNpc(dropOffNpc); if (getObjectivePhase() == 0) { WaypointObject waypoint = (WaypointObject) core.objectService.createObject("object/waypoint/shared_waypoint.iff", parent.getPlanet()); waypoint.setPosition(startLoc); - waypoint.setName("@mission/" + parent.getMissionTitle() + ":" + parent.getMissionId()); + waypoint.setName("@mission/" + parent.getMissionTitle() + ":" + "m" + parent.getMissionId() + "t"); + waypoint.setColor(WaypointObject.ORANGE); + waypoint.setActive(true); + getMissionObject().setAttachedWaypoint(waypoint); + } else if (getObjectivePhase() == 1) { + WaypointObject waypoint = (WaypointObject) core.objectService.createObject("object/waypoint/shared_waypoint.iff", parent.getPlanet()); + waypoint.setPosition(parent.getDestination()); + waypoint.setName("@mission/" + parent.getMissionTitle() + ":" + "m" + parent.getMissionId() + "t"); waypoint.setColor(WaypointObject.ORANGE); waypoint.setActive(true); getMissionObject().setAttachedWaypoint(waypoint); @@ -66,16 +96,62 @@ public class DeliveryMissionObjective extends MissionObjective { setActive(true); } - @Override - public void update() { - } - @Override public void complete() { + CreatureObject completer = (CreatureObject) getMissionObject().getGrandparent(); + + if (completer == null) + return; + + int reward = getMissionObject().getCreditReward(); + + completer.addBankCredits(reward); + + completer.sendSystemMessage(new OutOfBand(new ProsePackage("@mission/mission_generic:success_w_amount", reward)), (byte) 0); + + abort(); + + core.objectService.destroyObject(getMissionObject()); } @Override - public void drop() { + public void abort() { + if (deliveryObject != null) + core.objectService.destroyObject(deliveryObject.getObjectId()); + + if (missionGiver != null) + core.objectService.destroyObject(missionGiver, 360); + + if (dropOffNpc != null) + core.objectService.destroyObject(dropOffNpc, 360); + } + + @Override + public void update() { + + setObjectivePhase(getObjectivePhase() + 1); + + switch(getObjectivePhase()) { + case 1: + WaypointObject waypoint = (WaypointObject) core.objectService.createObject("object/waypoint/shared_waypoint.iff", parent.getPlanet()); + waypoint.setPosition(parent.getDestination()); + waypoint.setName("@mission/" + parent.getMissionTitle() + ":" + "m" + parent.getMissionId() + "t"); + waypoint.setColor(WaypointObject.ORANGE); + waypoint.setActive(true); + getMissionObject().setMissionTargetName("Dropoff Location"); + getMissionObject().setAttachedWaypoint(waypoint); + System.out.println("Waypoint set to " + parent.getDestination().x + " and " + parent.getDestination().z); + break; + case 2: + WaypointObject returnWp = (WaypointObject) core.objectService.createObject("object/waypoint/shared_waypoint.iff", parent.getPlanet()); + returnWp.setPosition(parent.getStartLocation()); + returnWp.setName("@mission/" + parent.getMissionTitle() + ":" + "m" + parent.getMissionId() + "t"); + returnWp.setColor(WaypointObject.ORANGE); + returnWp.setActive(true); + getMissionObject().setMissionTargetName("Return"); + getMissionObject().setAttachedWaypoint(returnWp); + break; + } } public boolean createDeliveryItem() { @@ -103,4 +179,13 @@ public class DeliveryMissionObjective extends MissionObjective { public TangibleObject getDeliveryObject() { return deliveryObject; } public void setDeliveryObject(TangibleObject object) { this.deliveryObject = object; } + + public CreatureObject getMissionGiver() { return missionGiver; } + + public void setMissionGiver(CreatureObject missionGiver) { this.missionGiver = missionGiver; } + + public CreatureObject getDropOffNpc() { return dropOffNpc; } + + public void setDropOffNpc(CreatureObject dropOffNpc) { this.dropOffNpc = dropOffNpc; } + } diff --git a/src/resources/objectives/DestroyMissionObjective.java b/src/resources/objectives/DestroyMissionObjective.java new file mode 100644 index 00000000..e4832756 --- /dev/null +++ b/src/resources/objectives/DestroyMissionObjective.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * 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 resources.objectives; + +import resources.objects.mission.MissionObject; +import services.mission.MissionObjective; + +public class DestroyMissionObjective extends MissionObjective { + + public DestroyMissionObjective(MissionObject parent) { + super(parent); + } + + @Override + public void activate() { + // TODO Auto-generated method stub + + } + + @Override + public void complete() { + // TODO Auto-generated method stub + + } + + @Override + public void abort() { + // TODO Auto-generated method stub + + } + + @Override + public void update() { + // TODO Auto-generated method stub + + } + +} diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index 7680d9bd..d6f2a861 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -251,12 +251,30 @@ public class CreatureObject extends TangibleObject implements IPersistent { getClient().getSession().write(messageBuilder.buildBankCreditsDelta(bankCredits)); } } + + public void addBankCredits(int amountToAdd) { + synchronized(objectMutex) { + this.bankCredits += amountToAdd; + } + if(getClient() != null && getClient().getSession() != null) { + getClient().getSession().write(messageBuilder.buildBankCreditsDelta(bankCredits)); + } + } public int getCashCredits() { synchronized(objectMutex) { return cashCredits; } } + + public void addCashCredits(int amountToAdd) { + synchronized(objectMutex) { + this.cashCredits += amountToAdd; + } + if(getClient() != null && getClient().getSession() != null) { + getClient().getSession().write(messageBuilder.buildCashCreditsDelta(cashCredits)); + } + } public void setCashCredits(int cashCredits) { synchronized(objectMutex) { diff --git a/src/services/mission/MissionObjective.java b/src/services/mission/MissionObjective.java index d74ef6d1..c81fcc0a 100644 --- a/src/services/mission/MissionObjective.java +++ b/src/services/mission/MissionObjective.java @@ -44,7 +44,7 @@ public abstract class MissionObjective { public abstract void activate(); public abstract void complete(); - public abstract void drop(); + public abstract void abort(); public abstract void update(); public long getStartTime() { return startTime; } diff --git a/src/services/mission/MissionService.java b/src/services/mission/MissionService.java index 08415813..40b5abf0 100644 --- a/src/services/mission/MissionService.java +++ b/src/services/mission/MissionService.java @@ -36,14 +36,14 @@ import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.session.IoSession; import protocol.swg.ObjControllerMessage; +import protocol.swg.objectControllerObjects.MissionAbort; import protocol.swg.objectControllerObjects.MissionAcceptRequest; import protocol.swg.objectControllerObjects.MissionAcceptResponse; import protocol.swg.objectControllerObjects.MissionListRequest; -import protocol.swg.objectControllerObjects.ObjControllerObject; -import resources.common.Console; import resources.common.SpawnPoint; import resources.common.ObjControllerOpcodes; import resources.objectives.DeliveryMissionObjective; +import resources.objectives.DestroyMissionObjective; import resources.objects.creature.CreatureObject; import resources.objects.mission.MissionObject; import resources.objects.tangible.TangibleObject; @@ -77,6 +77,38 @@ public class MissionService implements INetworkDispatch { @Override public void insertOpcodes(Map swgOpcodes, Map objControllerOpcodes) { + + objControllerOpcodes.put(ObjControllerOpcodes.MISSION_ABORT, new INetworkRemoteEvent() { + + @Override + public void handlePacket(IoSession session, IoBuffer data) throws Exception { + Client client = core.getClient(session); + + if(client == null || client.getSession() == null) + return; + + CreatureObject creature = (CreatureObject) client.getParent(); + + if(creature == null) + return; + + data.order(ByteOrder.LITTLE_ENDIAN); + MissionAbort abort = new MissionAbort(); + abort.deserialize(data); + + MissionObject mission = (MissionObject) core.objectService.getObject(abort.getMissionId()); + + if (mission == null) + return; + + if (mission.getGrandparent().getObjectId() != creature.getObjectId()) + return; + + handleMissionAbort(creature, mission); + } + + }); + objControllerOpcodes.put(ObjControllerOpcodes.MISSION_LIST_REQUEST, new INetworkRemoteEvent() { @Override @@ -112,7 +144,7 @@ public class MissionService implements INetworkDispatch { } else if (terminalType == TerminalType.ARTISAN) { } else { - Console.println("ERROR: Unsupported terminal " + terminal.getObjectId()); + //Console.println("ERROR: Unsupported terminal " + terminal.getObjectId()); } } @@ -155,6 +187,15 @@ public class MissionService implements INetworkDispatch { }); } + public void handleMissionAbort(CreatureObject creature, MissionObject mission) { + MissionObjective objective = mission.getObjective(); + + if (objective != null) + objective.abort(); + + core.objectService.destroyObject(mission.getObjectId()); + } + private void loadMissionEntryCounts() { File missionFolder = new File("./clientdata/string/en/mission"); File[] missionFiles = missionFolder.listFiles(); @@ -177,7 +218,7 @@ public class MissionService implements INetworkDispatch { } } if (gotCount == false) { - System.out.println("!NO ENTRY COUNT FOR " + missionStf); + //System.out.println("!NO ENTRY COUNT FOR " + missionStf); continue; } } catch (Exception e) { e.printStackTrace(); } @@ -192,7 +233,7 @@ public class MissionService implements INetworkDispatch { int ranEntryNum = 1; if (entryCounts.get(missionStf) != null) { ranEntryNum = ran.nextInt(entryCounts.get(missionStf)); } - else { System.out.println(missionStf + " was not found in entryCount and is using entry #1"); } + //else { System.out.println(missionStf + " was not found in entryCount and is using entry #1"); } if (ranEntryNum == 0) return 1; @@ -298,19 +339,23 @@ public class MissionService implements INetworkDispatch { } private void createMissionObjective(CreatureObject creature, MissionObject mission) { - String type = mission.getMissionType(); - System.out.println("Type: " + type); - switch(type) { + switch(mission.getMissionType()) { case "deliver": - DeliveryMissionObjective objective = new DeliveryMissionObjective(mission); + DeliveryMissionObjective deliveryObjective = new DeliveryMissionObjective(mission); - mission.setObjective(objective); + mission.setObjective(deliveryObjective); - objective.activate(); - System.out.println("Went here!"); + deliveryObjective.activate(); break; + case "destroy": + DestroyMissionObjective destroyObjective = new DestroyMissionObjective(mission); + + mission.setObjective(destroyObjective); + + destroyObjective.activate(); + break; default: break; } @@ -331,13 +376,14 @@ public class MissionService implements INetworkDispatch { mission.setMissionLevel(5); + // TODO: Use pre-defined commoner locations Point3D startLocation = SpawnPoint.getRandomPosition(player.getPosition(), (float) 50, (float) 300, player.getPlanetId()); Point3D destination = SpawnPoint.getRandomPosition(startLocation, (float) 50, (float) 500, player.getPlanetId()); mission.setStartLocation(startLocation, player.getPlanet().name); mission.setDestination(destination, player.getPlanet().name); - mission.setCreditReward((int) (50 * ((startLocation.getDistance2D(destination) / 10)))); + mission.setCreditReward((int) (50 + ((startLocation.getDistance2D(destination) / 10)))); mission.setMissionTemplateObject(CRC.StringtoCRC("object/tangible/mission/shared_mission_datadisk.iff")); mission.setMissionTargetName("Datadisk"); @@ -357,6 +403,7 @@ public class MissionService implements INetworkDispatch { private void randomBountyMission(SWGObject player, MissionObject mission) { } + public enum TerminalType {; public static final int GENERIC = 1; public static final int BOUNTYHUNTER = 2;