From a1556032b46030fedbe866cb1a2cf15a81e8e353 Mon Sep 17 00:00:00 2001 From: Waverunner Date: Sat, 15 Feb 2014 15:00:46 -0500 Subject: [PATCH] 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);