From da568bac1d60d00c54bd7a18e78f46e79a366778 Mon Sep 17 00:00:00 2001 From: Waverunner Date: Wed, 13 Aug 2014 16:21:51 -0400 Subject: [PATCH] Changed quest data to retrieve info from Datatables, Added basis for automation of QuestTask's Fixed /waypoint method for getting planet crc's Fixed quest crc's for quest scripts in children folders Fixed some admin commands not being executed (no longer case sensitive) Changed accessLevel to be gotten from database until ready to switch to client --- scripts/commands/activatequest.py | 2 +- scripts/commands/waypoint.py | 12 +- src/protocol/swg/CommPlayerMessage.java | 6 + .../objects/player/PlayerObject.java | 5 +- src/resources/quest/Quest.java | 33 ++- src/services/LoginService.java | 4 +- src/services/command/CommandService.java | 6 +- src/services/quest/QuestService.java | 196 ++++++++++++++---- src/services/quest/QuestTask.java | 106 ++++++++-- src/services/quest/SWGQuestDataHandler.java | 14 +- 10 files changed, 299 insertions(+), 85 deletions(-) diff --git a/scripts/commands/activatequest.py b/scripts/commands/activatequest.py index 5e834183..f17c5523 100644 --- a/scripts/commands/activatequest.py +++ b/scripts/commands/activatequest.py @@ -8,6 +8,6 @@ def run(core, actor, target, commandString): actor.sendSystemMessage(' \\#FE2EF7 [GM] \\#FFFFFF activateQuest: Error. You have specified an invalid quest.', 0) return - core.questService.sendQuestWindow(actor, commandString) + core.questService.sendQuestWindow(actor, actor.getPlayerObject().getQuestJournal().get(0)) actor.sendSystemMessage(' \\#FE2EF7 [GM] \\#FFFFFF activateQuest: Command completed successfully.', 0) return diff --git a/scripts/commands/waypoint.py b/scripts/commands/waypoint.py index 3790fafa..e8ce6591 100644 --- a/scripts/commands/waypoint.py +++ b/scripts/commands/waypoint.py @@ -26,7 +26,7 @@ def run(core, actor, target, commandString): waypoint.setColor(colorCheck(commandArgs[4])) name = commandString.split(" ", 5) waypoint.setName(name[5]) - waypoint.setPlanetCRC(crc.StringtoCRC(planet.getName())) + waypoint.setPlanetCrc(crc.StringtoCRC(planet.getName())) waypoint.setStringAttribute('', '') # This simply allows the attributes to display (nothing else has to be done) actorPlayer.waypointAdd(waypoint) actor.sendSystemMessage('A waypoint has been created in your datapad at the location.', 0) @@ -39,7 +39,7 @@ def run(core, actor, target, commandString): waypoint.setColor(WaypointObject.BLUE) name = commandString.split(" ", 3) waypoint.setName(name[3]) - waypoint.setPlanetCRC(crc.StringtoCRC(actor.getPlanet().getName())) + waypoint.setPlanetCrc(crc.StringtoCRC(actor.getPlanet().getName())) waypoint.setStringAttribute('', '') # This simply allows the attributes to display (nothing else has to be done) actorPlayer.waypointAdd(waypoint) actor.sendSystemMessage('A waypoint has been created in your datapad at the location.', 0) @@ -52,7 +52,7 @@ def run(core, actor, target, commandString): waypoint.setColor(WaypointObject.BLUE) name = commandString.split(" ", 2) waypoint.setName(name[2]) - waypoint.setPlanetCRC(crc.StringtoCRC(actor.getPlanet().getName())) + waypoint.setPlanetCrc(crc.StringtoCRC(actor.getPlanet().getName())) waypoint.setStringAttribute('', '') # This simply allows the attributes to display (nothing else has to be done) actorPlayer.waypointAdd(waypoint) actor.sendSystemMessage('A waypoint has been created in your datapad at the location.', 0) @@ -64,7 +64,7 @@ def run(core, actor, target, commandString): waypoint.setActive(True) waypoint.setColor(WaypointObject.BLUE) waypoint.setName("Waypoint") - waypoint.setPlanetCRC(crc.StringtoCRC(actor.getPlanet().getName())) + waypoint.setPlanetCrc(crc.StringtoCRC(actor.getPlanet().getName())) waypoint.setStringAttribute('', '') # This simply allows the attributes to display (nothing else has to be done) actorPlayer.waypointAdd(waypoint) actor.sendSystemMessage('A waypoint has been created in your datapad at the location.', 0) @@ -80,7 +80,7 @@ def run(core, actor, target, commandString): name = "Waypoint" waypoint.setName(name[4]) - waypoint.setPlanetCRC(crc.StringtoCRC(actor.getPlanet().getName())) + waypoint.setPlanetCrc(crc.StringtoCRC(actor.getPlanet().getName())) waypoint.setStringAttribute('', '') # This simply allows the attributes to display (nothing else has to be done) actorPlayer.waypointAdd(waypoint) actor.sendSystemMessage('A waypoint has been created in your datapad at the location.', 0) @@ -95,7 +95,7 @@ def run(core, actor, target, commandString): waypoint.setName(actor.getPlanet().name.capitalize()) else: waypoint.setName(commandString) - waypoint.setPlanetCRC(crc.StringtoCRC(actor.getPlanet().getName())) + waypoint.setPlanetCrc(crc.StringtoCRC(actor.getPlanet().getName())) waypoint.setStringAttribute('', '') # This simply allows the attributes to display (nothing else has to be done) actorPlayer.waypointAdd(waypoint) actor.sendSystemMessage('A waypoint has been created in your datapad at your location.', 0) diff --git a/src/protocol/swg/CommPlayerMessage.java b/src/protocol/swg/CommPlayerMessage.java index 3d0675f1..c08c6132 100644 --- a/src/protocol/swg/CommPlayerMessage.java +++ b/src/protocol/swg/CommPlayerMessage.java @@ -41,6 +41,12 @@ public class CommPlayerMessage extends SWGMessage { this.outOfBand = outOfBand; } + public CommPlayerMessage(long objectId, OutOfBand outOfBand, String model) { + this.objectId = objectId; + this.outOfBand = outOfBand; + this.model = model; + } + @Override public void deserialize(IoBuffer data) { diff --git a/src/resources/objects/player/PlayerObject.java b/src/resources/objects/player/PlayerObject.java index 8214635c..ea24c4cf 100644 --- a/src/resources/objects/player/PlayerObject.java +++ b/src/resources/objects/player/PlayerObject.java @@ -599,9 +599,10 @@ public class PlayerObject extends IntangibleObject implements Serializable { return (int) getBaseline(8).get("activeQuest"); } - public void setActiveQuest(String quest) { - getBaseline(8).set("activeQuest", CRC.StringtoCRC("quest/"+quest)); + public void setActiveQuest(int questCRC) { + getBaseline(8).set("activeQuest", questCRC); } + public String getProfessionWheelPosition() { return (String) getBaseline(8).get("professionWheelPosition"); } diff --git a/src/resources/quest/Quest.java b/src/resources/quest/Quest.java index ca2a270f..f38764f5 100644 --- a/src/resources/quest/Quest.java +++ b/src/resources/quest/Quest.java @@ -37,18 +37,26 @@ public class Quest extends Delta implements Serializable { private short completedStep; private boolean isCompleted = false; private String name; - private int crc; + private String filePath; public Quest() {} public Quest(String name, long ownerId) { this.ownerId = ownerId; - this.name = name; - if (name.endsWith(".qst")) - this.crc = CRC.StringtoCRC("quest/"+name.split(".qst")[0]); - else - this.crc = CRC.StringtoCRC("quest/"+name); + if (name.endsWith(".qst")) { + this.filePath = "quest/"+name; + this.name = name.split(".qst")[0]; + } else { + this.filePath = "quest/"+name+".qst"; + this.name = name; + } + + if (name.contains("/")) { + String[] split = name.split("/"); + this.name = split[split.length - 1]; + } + } public long getOwnerId() { @@ -87,13 +95,16 @@ public class Quest extends Delta implements Serializable { return name; } - public void setName(String name) { - this.name = name; - this.crc = CRC.StringtoCRC(name); + public String getFilePath() { + return filePath; } public int getCrc() { - return crc; + return CRC.StringtoCRC(getCrcName()); + } + + public String getCrcName() { + return "quest/" + name; } public byte[] getBytes() { @@ -101,7 +112,7 @@ public class Quest extends Delta implements Serializable { buffer.put((byte) 0); - buffer.putInt(crc); + buffer.putInt(getCrc()); buffer.putLong(ownerId); diff --git a/src/services/LoginService.java b/src/services/LoginService.java index 04f8fb97..2b3f02b5 100644 --- a/src/services/LoginService.java +++ b/src/services/LoginService.java @@ -151,8 +151,8 @@ public class LoginService implements INetworkDispatch{ client.setSessionKey(generateSessionKey()); client.setAccountId(id); client.setSession(session); - String accessLevel = core.adminService.getAccessLevelFromDB(id); - if (accessLevel != null && !accessLevel.equals("")) { client.setAccessLevel(accessLevel); } + //String accessLevel = core.adminService.getAccessLevelFromDB(id); + //if (accessLevel != null && !accessLevel.equals("")) { client.setAccessLevel(accessLevel); } core.addClient(session, client); diff --git a/src/services/command/CommandService.java b/src/services/command/CommandService.java index 20e19e6a..c3c622a8 100644 --- a/src/services/command/CommandService.java +++ b/src/services/command/CommandService.java @@ -689,9 +689,9 @@ public class CommandService implements INetworkDispatch { public void processCommand(CreatureObject actor, SWGObject target, BaseSWGCommand command, int actionCounter, String commandArgs) { if (command.getGodLevel() > 0 || command.getCommandName().equals("setgodmode")) { - String accessLevel = actor.getClient().getAccessLevel(); + String accessLevel = core.adminService.getAccessLevelFromDB(actor.getClient().getAccountId()); String filePath = "accesslevels/" + accessLevel + ".txt"; - + if(FileUtilities.doesFileExist(filePath)) { Scanner scanner; try { @@ -700,7 +700,7 @@ public class CommandService implements INetworkDispatch { while(scanner.hasNextLine()) { String commandName = scanner.nextLine(); - if(command.getCommandName().equals(commandName)) { + if(command.getCommandName().equalsIgnoreCase(commandName)) { levelHasCommand = true; break; } diff --git a/src/services/quest/QuestService.java b/src/services/quest/QuestService.java index 60461eae..243f1e54 100644 --- a/src/services/quest/QuestService.java +++ b/src/services/quest/QuestService.java @@ -21,9 +21,14 @@ ******************************************************************************/ package services.quest; +import java.io.BufferedReader; +import java.io.BufferedWriter; import java.io.File; import java.io.IOException; import java.nio.ByteOrder; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -37,6 +42,7 @@ import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.session.IoSession; import org.xml.sax.SAXException; +import protocol.swg.CommPlayerMessage; import protocol.swg.ObjControllerMessage; import protocol.swg.PlayMusicMessage; import protocol.swg.objectControllerObjects.ForceActivateQuest; @@ -47,12 +53,16 @@ import resources.datatables.DisplayType; import resources.objects.SWGList; import resources.objects.creature.CreatureObject; import resources.objects.player.PlayerObject; +import resources.objects.waypoint.WaypointObject; import resources.quest.Quest; import main.NGECore; +import engine.clientdata.ClientFileManager; +import engine.clientdata.visitors.DatatableVisitor; import engine.clients.Client; import engine.resources.common.CRC; import engine.resources.common.StringUtilities; import engine.resources.objects.SWGObject; +import engine.resources.scene.Point3D; import engine.resources.service.INetworkDispatch; import engine.resources.service.INetworkRemoteEvent; @@ -132,75 +142,181 @@ public class QuestService implements INetworkDispatch { Quest quest = new Quest(questName, creo.getObjectID()); - try { - if (!parseQuestData(questName)) - return false; - } catch (ParserConfigurationException | SAXException | IOException e) { e.printStackTrace(); } + File questXml = new File("clientdata/" + quest.getFilePath()); + if (!questXml.exists()) return false; - if (questName.endsWith(".qst")) - questName = questName.split(".qst")[0]; + QuestData questData = getQuestData(quest); - ProsePackage prose = new ProsePackage("@quest/ground/system_message:quest_received"); + if (questData == null) + return false; - // Format for stf string if quest resides in multiple folders beyond base one - if (questName.contains("/")) { - String[] split = questName.split("/"); - questName = split[split.length - 1]; - } + //ProsePackage prose = new ProsePackage("@quest/ground/system_message:quest_received"); + //prose.setToCustomString(questData.getTasks().get(0).getJournalEntryTitle()); - prose.setToCustomString("@quest/ground/" + questName + ":journal_entry_title"); - creo.sendSystemMessage(new OutOfBand(prose), DisplayType.Quest); + //creo.sendSystemMessage(new OutOfBand(prose), DisplayType.Quest); PlayMusicMessage music = new PlayMusicMessage("sound/ui_npe2_quest_received.snd", creo.getObjectID(), 0, true); creo.getClient().getSession().write(music.serialize()); - ghost.getQuestJournal().add(quest); - ghost.setActiveQuest(quest.getName()); + QuestTask activeTask = questData.getTasks().get(0); + + /*if (activeTask.createsWaypoint()) { + WaypointObject waypoint = (WaypointObject) core.objectService.createObject("object/waypoint/shared_waypoint.iff", core.terrainService.getPlanetByName(activeTask.getPlanet())); + Point3D position = new Point3D(activeTask.getLocationX(), activeTask.getLocationY(), activeTask.getLocationZ()); + waypoint.setPosition(position); + waypoint.setName(activeTask.getWaypointName()); + waypoint.setColor(WaypointObject.BLUE); + waypoint.setActive(true); + waypoint.setStringAttribute("", ""); + + ghost.getWaypoints().put(waypoint.getObjectID(), waypoint); + }*/ + + ghost.getQuestJournal().add(quest); + ghost.setActiveQuest(quest.getCrc()); + + beginNextQuestStep(creo, quest); return true; } - public void sendQuestWindow(CreatureObject reciever, String questName) { - if (questName.endsWith(".qst")) - questName = questName.split(".qst")[0]; - - if (!questName.startsWith("quest/")) - questName = "quest/" + questName; - - ObjControllerMessage objMsg = new ObjControllerMessage(11, new ForceActivateQuest(reciever.getObjectID(), CRC.StringtoCRC(questName))); + public void sendQuestWindow(CreatureObject reciever, Quest quest) { + + ObjControllerMessage objMsg = new ObjControllerMessage(11, new ForceActivateQuest(reciever.getObjectID(), CRC.StringtoCRC(quest.getCrcName()))); reciever.getClient().getSession().write(objMsg.serialize()); } - public QuestData getQuestData(String questFile) { - if (!questFile.endsWith(".qst")) - questFile = questFile + ".qst"; + public void beginNextQuestStep(CreatureObject quester, Quest quest) { + QuestData qData = getQuestData(quest); - if (questMap.containsKey(questFile)) - return questMap.get(questFile); + if (qData == null) + return; + + // TODO: Get QuestTask for the active step + QuestTask task = qData.getTasks().get(0); + + String[] splitType = task.getType().split("\\."); + String type = splitType[splitType.length - 1]; + + switch (type) { + + case "comm_player": + CommPlayerMessage message = new CommPlayerMessage(quester.getObjectID(), OutOfBand.ProsePackage(task.getCommMessageText()), task.getCommAppearanceTemplate()); + quester.getClient().getSession().write(message.serialize()); + break; + + default: + System.out.println("Don't know what to do for quest step: " + type); + break; + + } - else return null; } - private boolean parseQuestData(String questFile) throws ParserConfigurationException, SAXException, IOException { + public QuestData getQuestData(Quest quest) { - if (!questFile.endsWith(".qst")) - questFile = questFile + ".qst"; + if (questMap.containsKey(quest.getName())) + return questMap.get(quest.getName()); + else { + QuestData data = getQuestDatatable(quest); // parsing puts it in quest map + return data; + } + } + + private QuestData getQuestDatatable(Quest quest) { - if (questMap.containsKey(questFile)) return true; + QuestData data = new QuestData(quest.getFilePath()); - File questXml = new File("clientdata/quest/" + questFile); - if (!questXml.exists()) return false; + // visitor.getObjectByColumnNameAndIndex("JOURNAL_ENTRY_TITLE", r) + try { + DatatableVisitor visitor = ClientFileManager.loadFile("datatables/questtask/quest/" + quest.getName() + ".iff", DatatableVisitor.class); + + for (int r = 0; r < visitor.getRowCount(); r++) { + + // Each row is a new task. TODO: Complete + + QuestTask task = new QuestTask(); + + if (visitor.getObjectByColumnNameAndIndex("ATTACH_SCRIPT", r) != null) task.setType((String) visitor.getObjectByColumnNameAndIndex("ATTACH_SCRIPT", r)); + if (visitor.getObjectByColumnNameAndIndex("JOURNAL_ENTRY_TITLE", r) != null) task.setJournalEntryTitle((String) visitor.getObjectByColumnNameAndIndex("JOURNAL_ENTRY_TITLE", r)); + if (visitor.getObjectByColumnNameAndIndex("JOURNAL_ENTRY_DESCRIPTION", r) != null) task.setJournalEntryDescription((String) visitor.getObjectByColumnNameAndIndex("JOURNAL_ENTRY_DESCRIPTION", r)); + if (visitor.getObjectByColumnNameAndIndex("IS_VISIBLE", r) != null) task.setVisible((boolean) visitor.getObjectByColumnNameAndIndex("IS_VISIBLE", r)); + // PREREQUISTE_TASKS + // EXCLUSION_TASKS + if (visitor.getObjectByColumnNameAndIndex("ALLOW_REPEATS", r) != null) task.setAllowRepeats((boolean) visitor.getObjectByColumnNameAndIndex("ALLOW_REPEATS", r)); + if (visitor.getObjectByColumnNameAndIndex("TASKS_ON_COMPLETE", r) != null) task.setTasksOnComplete((String) visitor.getObjectByColumnNameAndIndex("TASKS_ON_COMPLETE", r)); + if (visitor.getObjectByColumnNameAndIndex("TASKS_ON_FAIL", r) != null) task.setTasksOnFail((String) visitor.getObjectByColumnNameAndIndex("TASKS_ON_FAIL", r)); + if (visitor.getObjectByColumnNameAndIndex("SHOW_SYSTEM_MESSAGES", r) != null) task.setShowSystemMessages((boolean) visitor.getObjectByColumnNameAndIndex("SHOW_SYSTEM_MESSAGES", r)); + if (visitor.getObjectByColumnNameAndIndex("MUSIC_ON_ACTIVATE", r) != null) task.setMusicOnActivate((String) visitor.getObjectByColumnNameAndIndex("MUSIC_ON_ACTIVATE", r)); + if (visitor.getObjectByColumnNameAndIndex("TARGET", r) != null) task.setTarget((String) visitor.getObjectByColumnNameAndIndex("TARGET", r)); + if (visitor.getObjectByColumnNameAndIndex("PARAMETER", r) != null) task.setParameter((String) visitor.getObjectByColumnNameAndIndex("PARAMETER", r)); + if (visitor.getObjectByColumnNameAndIndex("GRANT_QUEST_ON_COMPLETE", r) != null) task.setGrantQuestOnComplete((String) visitor.getObjectByColumnNameAndIndex("GRANT_QUEST_ON_COMPLETE", r)); + if (visitor.getObjectByColumnNameAndIndex("GRANT_QUEST_ON_FAIL", r) != null) task.setGrantQuestOnFail((String) visitor.getObjectByColumnNameAndIndex("GRANT_QUEST_ON_FAIL", r)); + if (visitor.getObjectByColumnNameAndIndex("TASK_NAME", r) != null) task.setName((String) visitor.getObjectByColumnNameAndIndex("TASK_NAME", r)); + if (visitor.getObjectByColumnNameAndIndex("MUSIC_ON_COMPLETE", r) != null) task.setMusicOnComplete((String) visitor.getObjectByColumnNameAndIndex("MUSIC_ON_COMPLETE", r)); + if (visitor.getObjectByColumnNameAndIndex("MUSIC_ON_FAILURE", r) != null) task.setMusicOnFail((String) visitor.getObjectByColumnNameAndIndex("MUSIC_ON_FAILURE", r)); + if (visitor.getObjectByColumnNameAndIndex("GRANT_QUEST_ON_FAIL_SHOW_SYSTEM_MESSAGE", r) != null) task.setGrantQuestOnFailShowSystemMessage((boolean) visitor.getObjectByColumnNameAndIndex("GRANT_QUEST_ON_FAIL_SHOW_SYSTEM_MESSAGE", r)); + if (visitor.getObjectByColumnNameAndIndex("CREATE_WAYPOINT", r) != null) task.setCreatesWaypoint((boolean) visitor.getObjectByColumnNameAndIndex("CREATE_WAYPOINT", r)); + if (visitor.getObjectByColumnNameAndIndex("PLANET_NAME", r) != null) task.setPlanet((String) visitor.getObjectByColumnNameAndIndex("PLANET_NAME", r)); + if (visitor.getObjectByColumnNameAndIndex("LOCATION_X", r) != null) task.setLocationX(Float.parseFloat((String) visitor.getObjectByColumnNameAndIndex("LOCATION_X", r))); + if (visitor.getObjectByColumnNameAndIndex("LOCATION_Y", r) != null) task.setLocationY(Float.parseFloat((String) visitor.getObjectByColumnNameAndIndex("LOCATION_Y", r))); + if (visitor.getObjectByColumnNameAndIndex("LOCATION_Z", r) != null) task.setLocationZ(Float.parseFloat((String) visitor.getObjectByColumnNameAndIndex("LOCATION_Z", r))); + if (visitor.getObjectByColumnNameAndIndex("WAYPOINT_NAME", r) != null) task.setWaypointName((String) visitor.getObjectByColumnNameAndIndex("WAYPOINT_NAME", r)); + if (visitor.getObjectByColumnNameAndIndex("GRANT_QUEST_ON_COMPLETE_SHOW_SYSTEM_MESSAGE", r) != null) task.setGrantQuestOnCompleteShowSystemMessage((boolean) visitor.getObjectByColumnNameAndIndex("GRANT_QUEST_ON_COMPLETE_SHOW_SYSTEM_MESSAGE", r)); + if (visitor.getObjectByColumnNameAndIndex("SIGNALS_ON_COMPLETE", r) != null) task.setSignalsOnComplete((String) visitor.getObjectByColumnNameAndIndex("SIGNALS_ON_COMPLETE", r)); + if (visitor.getObjectByColumnNameAndIndex("INTERIOR_WAYPOINT_APPERANCE", r) != null) task.setInteriorWaypointAppearance((String) visitor.getObjectByColumnNameAndIndex("INTERIOR_WAYPOINT_APPERANCE", r)); + if (visitor.getObjectByColumnNameAndIndex("SIGNALS_ON_FAIL", r) != null) task.setSignalsOnFail((String) visitor.getObjectByColumnNameAndIndex("SIGNALS_ON_FAIL", r)); + if (visitor.getObjectByColumnNameAndIndex("COMM_MESSAGE_TEXT", r) != null) task.setCommMessageText((String) visitor.getObjectByColumnNameAndIndex("COMM_MESSAGE_TEXT", r)); + if (visitor.getObjectByColumnNameAndIndex("NPC_APPEARANCE_SERVER_TEMPLATE", r) != null) task.setCommAppearanceTemplate(convertToSharedFile((String) visitor.getObjectByColumnNameAndIndex("NPC_APPEARANCE_SERVER_TEMPLATE", r))); + if (visitor.getObjectByColumnNameAndIndex("SERVER_TEMPLATE", r) != null) task.setServerTemplate(convertToSharedFile((String) visitor.getObjectByColumnNameAndIndex("SERVER_TEMPLATE", r))); + if (visitor.getObjectByColumnNameAndIndex("NUM_REQUIRED", r) != null) task.setNumRequired((int) visitor.getObjectByColumnNameAndIndex("NUM_REQUIRED", r)); + if (visitor.getObjectByColumnNameAndIndex("ITEM_NAME", r) != null) task.setItemName((String) visitor.getObjectByColumnNameAndIndex("ITEM_NAME", r)); + if (visitor.getObjectByColumnNameAndIndex("DROP_PERCENT", r) != null) task.setDropPercent((int) visitor.getObjectByColumnNameAndIndex("DROP_PERCENT", r)); + + data.getTasks().add(task); + } + + } catch (InstantiationException | IllegalAccessException e) { + e.printStackTrace(); + } + questMap.put(quest.getName(), data); + return data; + } + + // useful for custom quest scripts, and for the some of the datatables that are all screwed up + private QuestData parseXmlQuestData(Quest quest) { + try { + + if (questMap.containsKey(quest.getName())) return null; + + String filePath = quest.getFilePath(); + + File questXml = new File("clientdata/" + filePath); + if (!questXml.exists()) return null; + SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); - QuestData dataObj = new QuestData(questFile); + QuestData dataObj = new QuestData(filePath); SWGQuestDataHandler questHandler = new SWGQuestDataHandler(dataObj); parser.parse(questXml, questHandler); - questMap.put(questFile, dataObj); + questMap.put(quest.getName(), dataObj); - System.out.println("Loaded quest file " + questFile); - return true; + //System.out.println("Loaded quest file " + filePath); + + return dataObj; + + } catch(SAXException | ParserConfigurationException | IOException e) { } + + return null; + } + + private String convertToSharedFile(String template) { + String[] split = template.split("/"); + String file = split[split.length - 1]; + + return template.replace(file, "shared_" + file); } } diff --git a/src/services/quest/QuestTask.java b/src/services/quest/QuestTask.java index 6d885fee..1f77bb4f 100644 --- a/src/services/quest/QuestTask.java +++ b/src/services/quest/QuestTask.java @@ -27,10 +27,8 @@ public class QuestTask { private String journalEntryTitle; private String journalEntryDescription; private String planet; - // private String prerequisiteTasks; // TODO: Figure out format for multiple - // pre-req tasks - // private String exclusionTasks; // TODO: Figure out format for multiple - // exclusion tasks + // private String prerequisiteTasks; + // private String exclusionTasks; private String musicOnActivate; private String musicOnComplete; private String musicOnFail; @@ -47,18 +45,25 @@ public class QuestTask { private String waitMarkerTemplate; private String waitMarkerPlanetName; private String waitMarkerCellName; + private String commMessageText; + private String commAppearanceTemplate; // NPC Appearance Server Template + private String tasksOnComplete; + private String serverTemplate; + private String itemName; + private String tasksOnFail; - private boolean taskOnFail; private boolean visible; private boolean grantQuestOnCompleteShowSystemMessage; private boolean grantQuestOnFailShowSystemMessage; private boolean allowRepeats; + private boolean createsWaypoint; + private boolean showSystemMessages; private int id; - private int showSystemMessages; // TODO: Possibly change to boolean - private int createWaypoint; private int waitMarkerCreate; private int timeToComplete; + private int numRequired; + private int dropPercent; private long waitMarkerBuilding; @@ -71,10 +76,9 @@ public class QuestTask { public QuestTask() {} - public QuestTask(String type, int id, boolean taskOnFail) { + public QuestTask(String type, int id) { this.type = type; this.id = id; - this.taskOnFail = taskOnFail; } public String getType() { @@ -97,8 +101,8 @@ public class QuestTask { this.journalEntryDescription = journalEntryDescription; } - public boolean isTaskOnFail() { - return taskOnFail; + public String getTasksOnFail() { + return tasksOnFail; } public int getId() { @@ -249,6 +253,22 @@ public class QuestTask { this.waitMarkerCellName = waitMarkerCellName; } + public String getCommMessageText() { + return commMessageText; + } + + public void setCommMessageText(String commMessageText) { + this.commMessageText = commMessageText; + } + + public String getCommAppearanceTemplate() { + return commAppearanceTemplate; + } + + public void setCommAppearanceTemplate(String commAppearanceTemplate) { + this.commAppearanceTemplate = commAppearanceTemplate; + } + public boolean isVisible() { return visible; } @@ -283,20 +303,20 @@ public class QuestTask { this.allowRepeats = allowRepeats; } - public int getShowSystemMessages() { + public boolean showSystemMessages() { return showSystemMessages; } - public void setShowSystemMessages(int showSystemMessages) { + public void setShowSystemMessages(boolean showSystemMessages) { this.showSystemMessages = showSystemMessages; } - public int getCreateWaypoint() { - return createWaypoint; + public boolean createsWaypoint() { + return createsWaypoint; } - public void setCreateWaypoint(int createWaypoint) { - this.createWaypoint = createWaypoint; + public void setCreatesWaypoint(boolean createWaypoint) { + this.createsWaypoint = createWaypoint; } public int getWaitMarkerCreate() { @@ -370,4 +390,56 @@ public class QuestTask { public void setWaitMarkerZ(float waitMarkerZ) { this.waitMarkerZ = waitMarkerZ; } + + public void setType(String type) { + this.type = type; + } + + public void setTasksOnFail(String tasksOnFail) { + this.tasksOnFail = tasksOnFail; + } + + public void setId(int id) { + this.id = id; + } + + public String getTasksOnComplete() { + return tasksOnComplete; + } + + public void setTasksOnComplete(String tasksOnComplete) { + this.tasksOnComplete = tasksOnComplete; + } + + public String getServerTemplate() { + return serverTemplate; + } + + public void setServerTemplate(String serverTemplate) { + this.serverTemplate = serverTemplate; + } + + public int getNumRequired() { + return numRequired; + } + + public void setNumRequired(int numRequired) { + this.numRequired = numRequired; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public int getDropPercent() { + return dropPercent; + } + + public void setDropPercent(int dropPercent) { + this.dropPercent = dropPercent; + } } diff --git a/src/services/quest/SWGQuestDataHandler.java b/src/services/quest/SWGQuestDataHandler.java index 46d5447b..c2ea3d3f 100644 --- a/src/services/quest/SWGQuestDataHandler.java +++ b/src/services/quest/SWGQuestDataHandler.java @@ -49,7 +49,7 @@ public class SWGQuestDataHandler extends DefaultHandler { break; case "task": - dataObj.getTasks().add(new QuestTask(attributes.getValue("type"), Integer.parseInt(attributes.getValue("id")), Boolean.parseBoolean(attributes.getValue("taskOnFail")))); + dataObj.getTasks().add(new QuestTask(attributes.getValue("type"), Integer.parseInt(attributes.getValue("id")))); break; case "data": @@ -103,7 +103,7 @@ public class SWGQuestDataHandler extends DefaultHandler { break; case "showSystemMessages": - task.setShowSystemMessages(Integer.parseInt(attributes.getValue("value"))); + task.setShowSystemMessages(Boolean.parseBoolean(attributes.getValue("value"))); break; case "grantQuestOnComplete": @@ -123,7 +123,7 @@ public class SWGQuestDataHandler extends DefaultHandler { break; case "createWaypoint": - task.setCreateWaypoint(Integer.parseInt(attributes.getValue("value"))); + task.setCreatesWaypoint(Boolean.parseBoolean(attributes.getValue("value"))); break; case "Planet": @@ -166,6 +166,14 @@ public class SWGQuestDataHandler extends DefaultHandler { task.setSignalsOnComplete(attributes.getValue("value")); break; + case "Comm Message Text": + task.setCommMessageText(attributes.getValue("value")); + break; + + case "NPC Appearance Server Template": + task.setCommAppearanceTemplate(attributes.getValue("value")); + break; + default: break; }