diff --git a/src/protocol/swg/ObjControllerMessage.java b/src/protocol/swg/ObjControllerMessage.java index 86272915..d9d66a97 100644 --- a/src/protocol/swg/ObjControllerMessage.java +++ b/src/protocol/swg/ObjControllerMessage.java @@ -79,6 +79,7 @@ public class ObjControllerMessage extends SWGMessage { public static final int MISSION_ACCEPT_RESPONSE = 0x00FA; public static final int MISSION_ABORT_RESPONSE = 0x0142; public static final int QUEST_TASK_COUNTER = 0x0441; + public static final int QUEST_TASK_TIMER = 0x0444; public static final int FORCE_ACTIVATE_QUEST = 0x04BE; public ObjControllerMessage() { diff --git a/src/protocol/swg/objectControllerObjects/QuestTaskTimerMessage.java b/src/protocol/swg/objectControllerObjects/QuestTaskTimerMessage.java new file mode 100644 index 00000000..cf7202f0 --- /dev/null +++ b/src/protocol/swg/objectControllerObjects/QuestTaskTimerMessage.java @@ -0,0 +1,66 @@ +/******************************************************************************* + * 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 QuestTaskTimerMessage extends ObjControllerObject { + + private long objectId; + private int count; + private int taskId; + private String questName; + private String stf; + + public QuestTaskTimerMessage(long objectId, String questName, String stf, int count) { + this.objectId = objectId; + this.count = count; + this.questName = questName; + this.stf = stf; + } + + @Override + public void deserialize(IoBuffer data) { } + + @Override + public IoBuffer serialize() { + byte[] nameBytes = getAsciiString(questName); + byte[] stfBytes = getUnicodeString(stf); + IoBuffer buffer = IoBuffer.allocate(24 + nameBytes.length + stfBytes.length).order(ByteOrder.LITTLE_ENDIAN); + + buffer.putInt(ObjControllerMessage.QUEST_TASK_TIMER); + buffer.putLong(objectId); + buffer.putInt(0); + + buffer.put(nameBytes); + buffer.putInt(taskId); + buffer.put(stfBytes); + buffer.putInt(count); + + return buffer.flip(); + } + +} diff --git a/src/services/quest/QuestService.java b/src/services/quest/QuestService.java index d81e26ae..fe2c9463 100644 --- a/src/services/quest/QuestService.java +++ b/src/services/quest/QuestService.java @@ -34,6 +34,7 @@ import protocol.swg.ObjControllerMessage; import protocol.swg.PlayMusicMessage; import protocol.swg.objectControllerObjects.ForceActivateQuest; import protocol.swg.objectControllerObjects.QuestTaskCounterMessage; +import protocol.swg.objectControllerObjects.QuestTaskTimerMessage; import protocol.swg.objectControllerObjects.ShowLootBox; import resources.common.ObjControllerOpcodes; import resources.common.OutOfBand; @@ -166,33 +167,39 @@ public class QuestService implements INetworkDispatch { 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()); + ObjControllerMessage itemCount = new ObjControllerMessage(11, new QuestTaskCounterMessage(quester.getObjectID(), quest.getCrcName(), "@quest/groundquests:retrieve_item_counter")); + quester.getClient().getSession().write(itemCount.serialize()); break; case "timer": + ObjControllerMessage timer = new ObjControllerMessage(11, new QuestTaskTimerMessage(quester.getObjectID(), quest.getCrcName(), "@quest/groundquests:timer_timertext", 20)); + quester.getClient().getSession().write(timer.serialize()); + System.out.println("Sent timer."); break; default: - System.out.println("Don't know what to do for quest task: " + type); + //System.out.println("Don't know what to do for quest task: " + type); break; } - //if (task.getGrantQuestOnComplete() != null && !task.getGrantQuestOnComplete().equals("")) - //activateQuest(quester, task.getGrantQuestOnComplete()); - if (activeStep + 1 >= qData.getTasks().size()) { QuestList listItem = questRewardMap.get(quest.getName()); if (listItem.isCompleteWhenTasksComplete()) - completeQuest(player, quest); // Should this be the Force Complete Quest packet sent instead? - + completeQuest(player, quest); // Force complete packet sent if the quest isn't auto completed (window shows up, typical for exclusive reward items) /*else sendQuestCompleteWindow(quester, quest.getName());*/ + + if (task.getGrantQuestOnComplete() != null && !task.getGrantQuestOnComplete().equals("")) + activateQuest(quester, task.getGrantQuestOnComplete()); + return; } + if (task.getGrantQuestOnComplete() != null && !task.getGrantQuestOnComplete().equals("")) + activateQuest(quester, task.getGrantQuestOnComplete()); + quest.incrementQuestStep(); // After handling the quest type, we can now increment the step if (!task.isVisible()) { @@ -211,9 +218,9 @@ public class QuestService implements INetworkDispatch { if (player == null) return; - QuestList info = questRewardMap.get(questString); + QuestList info = questRewardMap.get(quest.getName()); if (info == null) { - info = getQuestListDatatable(questString); + info = getQuestListDatatable(quest.getName()); } ProsePackage prose = new ProsePackage("@quest/ground/system_message:quest_received"); @@ -247,8 +254,13 @@ public class QuestService implements INetworkDispatch { if (inventory == null) return; + boolean rewardSound = false; + + PlayMusicMessage completeSound = new PlayMusicMessage("sound/ui_npe2_quest_completed.snd", creo.getObjectID(), 0, true); + creo.getClient().getSession().write(completeSound.serialize()); + // TODO: Give other awards - exclusive loots, faction points - // Recieving quest awards (faction, item, exp, credits) - http://youtu.be/-L7Rz1WpmGM?t=14m50s + // Receiving quest awards (faction, item, exp, credits) - http://youtu.be/-L7Rz1WpmGM?t=14m50s // Give quest items @@ -258,6 +270,7 @@ public class QuestService implements INetworkDispatch { recievedItems.add(rewardLoot.getObjectID()); } + // TODO: Other item awards -- put above this comment if (recievedItems.size() != 0) { for (long item : recievedItems) { @@ -266,26 +279,34 @@ public class QuestService implements INetworkDispatch { ObjControllerMessage objMessage = new ObjControllerMessage(11, new ShowLootBox(creo.getObjectID(), recievedItems)); creo.getClient().getSession().write(objMessage.serialize()); + + if (!rewardSound) { + PlayMusicMessage itemSound = new PlayMusicMessage("sound/ui_npe2_quest_reward.snd", creo.getObjectID(), 0, true); + creo.getClient().getSession().write(itemSound.serialize()); + rewardSound = true; + } } // Give credits if (info.getRewardBankCredits() != 0) { creo.addBankCredits(info.getRewardBankCredits()); creo.sendSystemMessage(OutOfBand.ProsePackage("@base_player:prose_transfer_success", "DI", info.getRewardBankCredits()), DisplayType.Broadcast); + + if (!rewardSound) { + PlayMusicMessage credSound = new PlayMusicMessage("sound/ui_npe2_quest_credits.snd", creo.getObjectID(), 0, true); + creo.getClient().getSession().write(credSound.serialize()); + rewardSound = true; + } } // Give experience - TODO: Give specific type of experience. - if (info.getRewardExperienceAmount() == 0 && info.getTier() != -1 && !(info.getTier() > 6)) { + if (info.getRewardExperienceAmount() != 0 && info.getTier() != -1 && !(info.getTier() > 6)) { int experienceAward = 0; try { - DatatableVisitor experienceVisitor = ClientFileManager.loadFile("clientdata/datatables/quest/quest_experience", DatatableVisitor.class); + DatatableVisitor experienceVisitor = ClientFileManager.loadFile("datatables/quest/quest_experience", DatatableVisitor.class); for (int r = 0; r < experienceVisitor.getRowCount(); r++) { if ((int) experienceVisitor.getObject(r, 0) == creo.getLevel()) { - - if (info.getTier() > 6 || info.getTier() == -1) - return; - experienceAward = (int) experienceVisitor.getObject(r, info.getTier()); } } @@ -295,7 +316,7 @@ public class QuestService implements INetworkDispatch { } else { core.playerService.giveExperience(creo, info.getRewardExperienceAmount()); } - + // Update quest & client quest.setRecievedAward(true); creo.getClient().getSession().write(player.getBaseline(8).createDelta(7)); @@ -336,14 +357,12 @@ public class QuestService implements INetworkDispatch { if (player == null) return; - if (!player.getQuestRetrieveItemTemplates().containsKey(target.getTemplate())) { - System.out.println("Player doesn't have the template: " + target.getTemplate()); + if (!player.getQuestRetrieveItemTemplates().containsKey(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); } @@ -366,7 +385,6 @@ public class QuestService implements INetworkDispatch { if (questRewardMap.containsKey(questName)) return questRewardMap.get(questName); else { - System.out.println("Doesn't have it. Getting it from the list..."); QuestList list = getQuestListDatatable(questName); // parsing puts it in quest map questRewardMap.put(questName, list); return list;