public QuestTask addTask(Quest quest) { QuestTask prev = quest.getTasks().size() > 0 ? quest.getTasks().get(quest.getTasks().size() - 1) : null; try { Constructor ex = clazz.getConstructor(Quest.class, String.class, String.class); QuestTask task = (QuestTask) ex.newInstance(quest, name, description); if (prev != null) { task.addRequirement(prev); } quest.getTasks().add(task); SaveHelper.add(SaveHelper.EditType.TASK_CREATE); return task; } catch (Exception e) { e.printStackTrace(); } return null; }
@Override public void write(JsonWriter out, QuestTask value) throws IOException { out.beginObject(); TaskType type = TaskType.getType(value.getClass()); out.name(TYPE).value(type.name()); if (!value.getDescription().equals(type.name)) out.name(DESCRIPTION).value(value.getDescription()); if (!value.getLongDescription().equals(type.description)) out.name(LONG_DESCRIPTION).value(value.getLongDescription()); if (value instanceof QuestTaskItems) { out.name(ITEMS).beginArray(); for (QuestTaskItems.ItemRequirement requirement : ((QuestTaskItems) value).getItems()) { ITEM_REQUIREMENT_ADAPTER.write(out, requirement); } out.endArray(); } else if (value instanceof QuestTaskDeath) { out.name(DEATHS).value(((QuestTaskDeath) value).getDeaths()); } else if (value instanceof QuestTaskLocation) { out.name(LOCATIONS).beginArray(); for (QuestTaskLocation.Location requirement : ((QuestTaskLocation) value).locations) { LOCATION_ADAPTER.write(out, requirement); } out.endArray(); } else if (value instanceof QuestTaskMob) { out.name(MOBS).beginArray(); for (QuestTaskMob.Mob requirement : ((QuestTaskMob) value).mobs) { MOB_ADAPTER.write(out, requirement); } out.endArray(); } else if (value instanceof QuestTaskReputation) { out.name(REPUTATION).beginArray(); for (QuestTaskReputation.ReputationSetting requirement : ((QuestTaskReputation) value).getSettings()) { REPUTATION_ADAPTER.write(out, requirement); } out.endArray(); if (value instanceof QuestTaskReputationKill) { out.name(KILLS).value(((QuestTaskReputationKill) value).getKills()); } } out.endObject(); }
@Override public QuestTask read(JsonReader in) throws IOException { in.beginObject(); if (!in.nextName().equalsIgnoreCase(TYPE)) { throw new IOException("Tasks *MUST* start with the type"); } String task = in.nextString(); TaskType type = TaskType.valueOf(task); if (type == null) { throw new IOException("Invalid Task Type: " + task); } TASK = type.addTask(QUEST); while (in.hasNext()) { String name = in.nextName(); if (name.equalsIgnoreCase(DESCRIPTION)) { TASK.description = in.nextString(); } else if (name.equalsIgnoreCase(LONG_DESCRIPTION)) { TASK.setLongDescription(in.nextString()); } else if (TASK instanceof QuestTaskItems && name.equalsIgnoreCase(ITEMS)) { List<QuestTaskItems.ItemRequirement> list = new ArrayList<>(); in.beginArray(); while (in.hasNext()) { QuestTaskItems.ItemRequirement entry = ITEM_REQUIREMENT_ADAPTER.read(in); if (entry != null) list.add(entry); } in.endArray(); ((QuestTaskItems) TASK) .setItems(list.toArray(new QuestTaskItems.ItemRequirement[list.size()])); } else if (TASK instanceof QuestTaskDeath && name.equalsIgnoreCase(DEATHS)) { int death = in.nextInt(); ((QuestTaskDeath) TASK).setDeaths(death); } else if (TASK instanceof QuestTaskLocation && name.equalsIgnoreCase(LOCATIONS)) { List<QuestTaskLocation.Location> list = new ArrayList<QuestTaskLocation.Location>(); in.beginArray(); while (in.hasNext()) { QuestTaskLocation.Location entry = LOCATION_ADAPTER.read(in); if (entry != null) list.add(entry); } in.endArray(); ((QuestTaskLocation) TASK).locations = list.toArray(new QuestTaskLocation.Location[list.size()]); } else if (TASK instanceof QuestTaskMob && name.equalsIgnoreCase(MOBS)) { List<QuestTaskMob.Mob> list = new ArrayList<QuestTaskMob.Mob>(); in.beginArray(); while (in.hasNext()) { QuestTaskMob.Mob entry = MOB_ADAPTER.read(in); if (entry != null) list.add(entry); } in.endArray(); ((QuestTaskMob) TASK).mobs = list.toArray(new QuestTaskMob.Mob[list.size()]); } else if (TASK instanceof QuestTaskReputation && name.equalsIgnoreCase(REPUTATION)) { List<QuestTaskReputation.ReputationSetting> list = new ArrayList<QuestTaskReputation.ReputationSetting>(); in.beginArray(); while (in.hasNext()) { list.add(REPUTATION_ADAPTER.read(in)); } in.endArray(); ReflectionHelper.setPrivateValue( QuestTaskReputation.class, (QuestTaskReputation) TASK, list.toArray(new QuestTaskReputation.ReputationSetting[list.size()]), "settings"); } else if (name.equalsIgnoreCase(KILLS) && TASK instanceof QuestTaskReputationKill) { ((QuestTaskReputationKill) TASK).setKills(in.nextInt()); } } in.endObject(); type.addTaskData(QUEST); return null; }