diff --git a/src/protocol/swg/ObjControllerMessage.java b/src/protocol/swg/ObjControllerMessage.java index 58da57eb..86272915 100644 --- a/src/protocol/swg/ObjControllerMessage.java +++ b/src/protocol/swg/ObjControllerMessage.java @@ -78,7 +78,7 @@ public class ObjControllerMessage extends SWGMessage { public static final int RESOURCE_WEIGHTS = 0x0207; public static final int MISSION_ACCEPT_RESPONSE = 0x00FA; public static final int MISSION_ABORT_RESPONSE = 0x0142; - public static final int QUEST_TASK_TIMER_MESSAGE = 0x0441; + public static final int QUEST_TASK_COUNTER = 0x0441; public static final int FORCE_ACTIVATE_QUEST = 0x04BE; public ObjControllerMessage() { diff --git a/src/protocol/swg/objectControllerObjects/QuestTaskTimerMessage.java b/src/protocol/swg/objectControllerObjects/QuestTaskCounterMessage.java similarity index 71% rename from src/protocol/swg/objectControllerObjects/QuestTaskTimerMessage.java rename to src/protocol/swg/objectControllerObjects/QuestTaskCounterMessage.java index 1d4b2a8c..421f9748 100644 --- a/src/protocol/swg/objectControllerObjects/QuestTaskTimerMessage.java +++ b/src/protocol/swg/objectControllerObjects/QuestTaskCounterMessage.java @@ -27,15 +27,16 @@ import org.apache.mina.core.buffer.IoBuffer; import protocol.swg.ObjControllerMessage; -@SuppressWarnings("unused") -public class QuestTaskTimerMessage extends ObjControllerObject { +public class QuestTaskCounterMessage extends ObjControllerObject { private long objectId; private String questName; + private String stf; - public QuestTaskTimerMessage(long objectId, String questName) { + public QuestTaskCounterMessage(long objectId, String questName, String stf) { this.objectId = objectId; this.questName = questName; + this.stf = stf; } @Override @@ -45,21 +46,22 @@ public class QuestTaskTimerMessage extends ObjControllerObject { @Override public IoBuffer serialize() { + + byte[] questNameBytes = getAsciiString(questName); + byte[] stfBytes = getUnicodeString(stf); - IoBuffer buffer = IoBuffer.allocate(16).order(ByteOrder.LITTLE_ENDIAN); - buffer.setAutoExpand(true); - buffer.putInt(ObjControllerMessage.QUEST_TASK_TIMER_MESSAGE); + IoBuffer buffer = IoBuffer.allocate(38 + questNameBytes.length + stfBytes.length).order(ByteOrder.LITTLE_ENDIAN); + + buffer.putInt(ObjControllerMessage.QUEST_TASK_COUNTER); buffer.putLong(objectId); buffer.putInt(0); - buffer.put(getAsciiString("quest/ep3_trando_hssissk_zssik_10")); - buffer.putInt(1); - buffer.put(getUnicodeString("quest/groundquests:destroy_counter")); - buffer.putInt(0); - buffer.putInt(1); - int size = buffer.position(); - buffer = IoBuffer.allocate(size).put(buffer.array(), 0, size); - + buffer.put(questNameBytes); + buffer.putInt(1); // ?? + buffer.put(stfBytes); + buffer.putInt(0); // ?? + buffer.putInt(1); // ?? + return buffer.flip(); } diff --git a/src/resources/objects/SWGList.java b/src/resources/objects/SWGList.java index 9a3a686b..44945f87 100644 --- a/src/resources/objects/SWGList.java +++ b/src/resources/objects/SWGList.java @@ -54,7 +54,6 @@ public class SWGList implements List, Serializable { private byte viewType; private short updateType; private boolean addByte; - private boolean questMethod; protected transient Object objectMutex = new Object(); private transient SWGObject object; @@ -67,14 +66,6 @@ public class SWGList implements List, Serializable { this.object = object; } - public SWGList(SWGObject object, int viewType, int updateType, boolean addByte, boolean questMethod) { - this.viewType = (byte) viewType; - this.updateType = (short) updateType; - this.addByte = addByte; - this.object = object; - this.questMethod = questMethod; - } - public void init(SWGObject object) { objectMutex = new Object(); updateCounter = 0; @@ -94,19 +85,7 @@ public class SWGList implements List, Serializable { public boolean add(E e) { synchronized(objectMutex) { if (valid(e) && list.add(e)) { - if (!questMethod) queue(item(1, list.lastIndexOf(e), Baseline.toBytes(e), true, true)); - else { - List buffer = new ArrayList(); - - int index = 0; - for (E element : list) { - buffer.add(item(1, index, Baseline.toBytes(element), true, true)); - index++; - } - queue(buffer); - - return true; - } + queue(item(1, list.lastIndexOf(e), Baseline.toBytes(e), true, true)); return true; } @@ -462,17 +441,7 @@ public class SWGList implements List, Serializable { } private byte[] item(int type, int index, byte[] data, boolean useIndex, boolean useData) { - if (questMethod) { - int size = data.length; - - IoBuffer buffer = Delta.createBuffer(size); - buffer.put(data); - buffer.flip(); - updateCounter++; - - return buffer.array(); - } - + int size = 1 + ((useIndex) ? 2 : 0) + ((useData) ? data.length : 0); IoBuffer buffer = Delta.createBuffer(size); diff --git a/src/resources/objects/player/PlayerObject.java b/src/resources/objects/player/PlayerObject.java index fa4910eb..2714bbe6 100644 --- a/src/resources/objects/player/PlayerObject.java +++ b/src/resources/objects/player/PlayerObject.java @@ -47,6 +47,7 @@ import resources.objects.waypoint.WaypointObject; import resources.quest.Quest; import services.quest.QuestItem; import engine.clients.Client; +import engine.resources.common.StringUtilities; import engine.resources.objects.Baseline; import engine.resources.scene.Planet; import engine.resources.scene.Point3D; @@ -161,7 +162,7 @@ public class PlayerObject extends IntangibleObject implements Serializable { baseline.put("currentFSQuestList", new SWGList(this, 8, 4, false)); baseline.put("completedFSQuestList", new SWGList(this, 8, 5, false)); baseline.put("activeQuest", 0); - baseline.put("questJournal", new SWGList(this, 8, 7, false, true)); + baseline.put("questJournal", new SWGMap(this, 8, 7, true)); baseline.put("professionWheelPosition", ""); return baseline; } @@ -591,8 +592,8 @@ public class PlayerObject extends IntangibleObject implements Serializable { } @SuppressWarnings("unchecked") - public SWGList getQuestJournal() { - return (SWGList) getBaseline(8).get("questJournal"); + public SWGMap getQuestJournal() { + return (SWGMap) getBaseline(8).get("questJournal"); } @SuppressWarnings("unchecked") @@ -600,11 +601,6 @@ public class PlayerObject extends IntangibleObject implements Serializable { return (TreeMap) otherVariables.get("questRetrieveItemTemplates"); } - public boolean hasRetrieveItemTemplate(String template) { - TreeMap templates = getQuestRetrieveItemTemplates(); - return templates.containsKey(template); - } - public int getActiveQuest() { return (int) getBaseline(8).get("activeQuest"); } @@ -1044,10 +1040,19 @@ public class PlayerObject extends IntangibleObject implements Serializable { getContainer().notifyObservers(getBaseline(viewType).createDelta(updateType, buffer.array()), true); } + break; + case 8: + switch (updateType) { + case 7: + IoBuffer newBuffer = getBaseline(viewType).createDelta(updateType, buffer.array()); + getContainer().getClient().getSession().write(newBuffer.array()); + break; + } break; default: if (getContainer() != null && getContainer().getClient() != null) { getContainer().getClient().getSession().write(getBaseline(viewType).createDelta(updateType, buffer.array())); + StringUtilities.printBytes(getBaseline(viewType).createDelta(updateType, buffer.array()).array()); } } } diff --git a/src/resources/quest/Quest.java b/src/resources/quest/Quest.java index 078731cf..0e49750b 100644 --- a/src/resources/quest/Quest.java +++ b/src/resources/quest/Quest.java @@ -130,11 +130,11 @@ public class Quest extends Delta implements Serializable { byte[] activeStepBytes = activeStepBitmask.toByteArray(); byte[] completedStepBytes = completedStepBitmask.toByteArray(); - IoBuffer buffer = createBuffer(23); + IoBuffer buffer = createBuffer(18); - buffer.put((byte) 0); + //buffer.put((byte) 0); - buffer.putInt(getCrc()); + //buffer.putInt(getCrc()); buffer.putLong(ownerId); // quest giver id? diff --git a/src/services/gcw/InvasionService.java b/src/services/gcw/InvasionService.java index 8f61c15d..73d0ed23 100644 --- a/src/services/gcw/InvasionService.java +++ b/src/services/gcw/InvasionService.java @@ -41,7 +41,7 @@ import protocol.swg.CommPlayerMessage; import protocol.swg.ObjControllerMessage; import protocol.swg.PlayClientEffectObjectTransformMessage; import protocol.swg.objectControllerObjects.NpcConversationMessage; -import protocol.swg.objectControllerObjects.QuestTaskTimerMessage; +import protocol.swg.objectControllerObjects.QuestTaskCounterMessage; import resources.common.OutOfBand; import resources.common.SpawnPoint; import resources.datatables.FactionStatus; diff --git a/src/services/quest/QuestService.java b/src/services/quest/QuestService.java index dbaf21d3..d81e26ae 100644 --- a/src/services/quest/QuestService.java +++ b/src/services/quest/QuestService.java @@ -33,12 +33,13 @@ import protocol.swg.CommPlayerMessage; import protocol.swg.ObjControllerMessage; import protocol.swg.PlayMusicMessage; import protocol.swg.objectControllerObjects.ForceActivateQuest; +import protocol.swg.objectControllerObjects.QuestTaskCounterMessage; import protocol.swg.objectControllerObjects.ShowLootBox; import resources.common.ObjControllerOpcodes; import resources.common.OutOfBand; import resources.common.ProsePackage; import resources.datatables.DisplayType; -import resources.objects.SWGList; +import resources.objects.SWGMap; import resources.objects.creature.CreatureObject; import resources.objects.player.PlayerObject; import resources.objects.tangible.TangibleObject; @@ -84,17 +85,12 @@ public class QuestService implements INetworkDispatch { catch (Exception e) {e.printStackTrace();} } - SWGList questJournal = ghost.getQuestJournal(); + SWGMap questJournal = ghost.getQuestJournal(); if (questJournal.size() == 0) return false; - for (Quest quest : questJournal) { - if (quest.getName().equals(questName)) - return true; - } - - return false; + return questJournal.containsKey(CRC.StringtoCRC("quest/" + questName)); } public boolean isQuestCompleted(CreatureObject creo, String questName) { @@ -105,17 +101,15 @@ public class QuestService implements INetworkDispatch { catch (Exception e) {e.printStackTrace();} } - SWGList questJournal = ghost.getQuestJournal(); + SWGMap questJournal = ghost.getQuestJournal(); if (questJournal.size() == 0) return false; - for (Quest quest : questJournal) { - if (quest.getName().equals(questName)) - return quest.isCompleted(); - } - - return false; + if (!questJournal.containsKey(CRC.StringtoCRC("quest/" + questName))) + return false; + else + return questJournal.get(CRC.StringtoCRC("quest/") + questName).isCompleted(); } public void sendQuestWindow(CreatureObject reciever, String questName) { @@ -128,13 +122,15 @@ public class QuestService implements INetworkDispatch { public void activateNextTask(CreatureObject quester, String questName) { - for (Quest quest : quester.getPlayerObject().getQuestJournal()) { - if (quest.getName().equals(questName) && !quest.isCompleted()) - activateNextTask(quester, quest); + if (quester.getPlayerObject().getQuestJournal().containsKey(CRC.StringtoCRC("quest/" + questName)) && !quester.getPlayerObject().getQuestJournal().get(CRC.StringtoCRC("quest/" + questName)).isCompleted()) { + activateNextTask(quester, quester.getPlayerObject().getQuestJournal().get(CRC.StringtoCRC("quest/" + questName))); } } public void activateNextTask(CreatureObject quester, Quest quest) { + if (quester == null || quester.getClient() == null || quester.getClient().getSession() == null) + return; + QuestData qData = getQuestData(quest.getName()); if (qData == null) @@ -167,8 +163,11 @@ public class QuestService implements INetworkDispatch { // quest.task.ground.retrieve_item case "retrieve_item": - String template = task.getServerTemplate(); - player.getQuestRetrieveItemTemplates().put(template, new QuestItem(quest.getName(), activeStep)); + player.getQuestRetrieveItemTemplates().put(task.getServerTemplate(), new QuestItem(quest.getName(), activeStep)); + + // TODO: add item count + ObjControllerMessage msg = new ObjControllerMessage(11, new QuestTaskCounterMessage(quester.getObjectID(), quest.getCrcName(), "@quest/groundquests:retrieve_item_counter")); + quester.getClient().getSession().write(msg.serialize()); break; case "timer": @@ -205,7 +204,6 @@ public class QuestService implements INetworkDispatch { } public void activateQuest(CreatureObject quester, String questString) { - System.out.println("Activating quest: " + questString); Quest quest = new Quest(questString, quester.getObjectID()); PlayerObject player = quester.getPlayerObject(); @@ -225,7 +223,7 @@ public class QuestService implements INetworkDispatch { PlayMusicMessage music = new PlayMusicMessage("sound/ui_npe2_quest_received.snd", quester.getObjectID(), 0, true); quester.getClient().getSession().write(music.serialize()); - player.getQuestJournal().add(quest); + player.getQuestJournal().put(quest.getCrc(), quest); player.setActiveQuest(quest.getCrc()); activateNextTask(quester, quest); @@ -321,7 +319,7 @@ public class QuestService implements INetworkDispatch { if (player.getQuestRetrieveItemTemplates().size() == 0) return radialName; - if (!player.hasRetrieveItemTemplate(template)) + if (!player.getQuestRetrieveItemTemplates().containsKey(template)) return radialName; QuestItem item = player.getQuestRetrieveItemTemplates().get(template); @@ -338,18 +336,16 @@ public class QuestService implements INetworkDispatch { if (player == null) return; - if (!player.hasRetrieveItemTemplate(target.getTemplate())) { + if (!player.getQuestRetrieveItemTemplates().containsKey(target.getTemplate())) { System.out.println("Player doesn't have the template: " + target.getTemplate()); return; } QuestItem item = player.getQuestRetrieveItemTemplates().get(target.getTemplate()); activateNextTask(quester, item.getQuestName()); - + System.out.println("activated next task."); player.getQuestRetrieveItemTemplates().remove(target.getTemplate(), item); - if (player.hasRetrieveItemTemplate(target.getTemplate())) - System.out.println("STILL HAS TEMPLATE!!"); } public QuestData getQuestData(String questName) {