diff --git a/main/src/main/java/me/blackvein/quests/Quester.java b/main/src/main/java/me/blackvein/quests/Quester.java index 30e76a3a2..236933aec 100644 --- a/main/src/main/java/me/blackvein/quests/Quester.java +++ b/main/src/main/java/me/blackvein/quests/Quester.java @@ -72,6 +72,7 @@ import me.blackvein.quests.util.Lang; import me.blackvein.quests.util.MiscUtil; import me.blackvein.quests.util.RomanNumeral; import me.clip.placeholderapi.PlaceholderAPI; +import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.npc.NPC; public class Quester implements Comparable { @@ -612,6 +613,17 @@ public class Quester implements Comparable { msg += ChatColor.AQUA + "\n \u2515 " + e; } sendMessage(ChatColor.YELLOW + msg); + } else if (!c.getNpcsWhileRiding().isEmpty()) { + String msg = "- " + Lang.get("conditionEditorRideNPC"); + for (final int i : c.getNpcsWhileRiding()) { + if (plugin.getDependencies().getCitizens() != null) { + msg += ChatColor.AQUA + "\n \u2515 " + CitizensAPI.getNPCRegistry().getById(i) + .getName(); + } else { + msg += ChatColor.AQUA + "\n \u2515 " + i; + } + } + sendMessage(ChatColor.YELLOW + msg); } else if (!c.getPermissions().isEmpty()) { String msg = "- " + Lang.get("conditionEditorPermissions"); for (final String e : c.getPermissions()) { diff --git a/main/src/main/java/me/blackvein/quests/Quests.java b/main/src/main/java/me/blackvein/quests/Quests.java index 7c02bee72..4e18e7ad0 100644 --- a/main/src/main/java/me/blackvein/quests/Quests.java +++ b/main/src/main/java/me/blackvein/quests/Quests.java @@ -3640,6 +3640,21 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener throw new ConditionFormatException("ride-entity is not a list of entity types", conditionKey); } } + if (data.contains(conditionKey + "ride-npc")) { + if (ConfigUtil.checkList(data.getList(conditionKey + "ride-npc"), Integer.class)) { + final LinkedList npcs = new LinkedList(); + for (final int i : data.getIntegerList(conditionKey + "ride-npc")) { + if (i < 0) { + throw new ConditionFormatException("ride-npc is not a valid NPC ID", + conditionKey); + } + npcs.add(i); + } + condition.setNpcsWhileRiding(npcs); + } else { + throw new ConditionFormatException("ride-npc is not a list of NPC IDs", conditionKey); + } + } if (data.contains(conditionKey + "permission")) { if (ConfigUtil.checkList(data.getList(conditionKey + "permission"), String.class)) { final LinkedList permissions = new LinkedList(); diff --git a/main/src/main/java/me/blackvein/quests/conditions/Condition.java b/main/src/main/java/me/blackvein/quests/conditions/Condition.java index 61d0af4fb..394916645 100644 --- a/main/src/main/java/me/blackvein/quests/conditions/Condition.java +++ b/main/src/main/java/me/blackvein/quests/conditions/Condition.java @@ -30,6 +30,7 @@ public class Condition { private String name = ""; private boolean failQuest = false; private LinkedList entitiesWhileRiding = new LinkedList(); + private LinkedList npcsWhileRiding = new LinkedList(); private LinkedList permissions = new LinkedList(); private LinkedList itemsWhileHoldingMainHand = new LinkedList(); private LinkedList worldsWhileStayingWithin = new LinkedList(); @@ -66,6 +67,14 @@ public class Condition { this.entitiesWhileRiding = entitiesWhileRiding; } + public LinkedList getNpcsWhileRiding() { + return npcsWhileRiding; + } + + public void setNpcsWhileRiding(final LinkedList npcsWhileRiding) { + this.npcsWhileRiding = npcsWhileRiding; + } + public LinkedList getPermissions() { return permissions; } @@ -133,6 +142,17 @@ public class Condition { plugin.getLogger().info("DEBUG: Condition entity mismatch for " + player.getName() + ": " + e); } } + } else if (!npcsWhileRiding.isEmpty()) { + for (final int n : npcsWhileRiding) { + if (plugin.getDependencies().getCitizens() != null) { + if (player.isInsideVehicle() && player.getVehicle() + .equals(plugin.getDependencies().getCitizens().getNPCRegistry().getById(n).getEntity())) { + return true; + } else if (plugin.getSettings().getConsoleLogging() > 2) { + plugin.getLogger().info("DEBUG: Condition NPC mismatch for " + player.getName() + ": ID " + n); + } + } + } } else if (!permissions.isEmpty()) { for (final String p : permissions) { if (plugin.getDependencies().isPluginAvailable("Vault")) { diff --git a/main/src/main/java/me/blackvein/quests/conditions/ConditionFactory.java b/main/src/main/java/me/blackvein/quests/conditions/ConditionFactory.java index 5d689d285..33c0e0c62 100644 --- a/main/src/main/java/me/blackvein/quests/conditions/ConditionFactory.java +++ b/main/src/main/java/me/blackvein/quests/conditions/ConditionFactory.java @@ -92,6 +92,12 @@ public class ConditionFactory implements ConversationAbandonedListener { entities.addAll(condition.getEntitiesWhileRiding()); context.setSessionData(CK.C_WHILE_RIDING_ENTITY, entities); } + if (condition.getNpcsWhileRiding() != null + && condition.getNpcsWhileRiding().isEmpty() == false) { + final LinkedList npcs = new LinkedList(); + npcs.addAll(condition.getNpcsWhileRiding()); + context.setSessionData(CK.C_WHILE_RIDING_NPC, npcs); + } if (condition.getPermissions() != null && condition.getPermissions().isEmpty() == false) { final LinkedList permissions = new LinkedList(); @@ -141,6 +147,7 @@ public class ConditionFactory implements ConversationAbandonedListener { context.setSessionData(CK.C_NAME, null); context.setSessionData(CK.C_FAIL_QUEST, null); context.setSessionData(CK.C_WHILE_RIDING_ENTITY, null); + context.setSessionData(CK.C_WHILE_RIDING_NPC, null); context.setSessionData(CK.C_WHILE_PERMISSION, null); context.setSessionData(CK.C_WHILE_HOLDING_MAIN_HAND, null); context.setSessionData(CK.C_WHILE_WITHIN_WORLD, null); @@ -232,6 +239,10 @@ public class ConditionFactory implements ConversationAbandonedListener { section.set("ride-entity", context.getSessionData(CK.C_WHILE_RIDING_ENTITY)); } + if (context.getSessionData(CK.C_WHILE_RIDING_NPC) != null) { + section.set("ride-npc", + context.getSessionData(CK.C_WHILE_RIDING_NPC)); + } if (context.getSessionData(CK.C_WHILE_PERMISSION) != null) { section.set("permission", context.getSessionData(CK.C_WHILE_PERMISSION)); diff --git a/main/src/main/java/me/blackvein/quests/convo/conditions/tasks/EntityPrompt.java b/main/src/main/java/me/blackvein/quests/convo/conditions/tasks/EntityPrompt.java index db21f7635..a1c594587 100644 --- a/main/src/main/java/me/blackvein/quests/convo/conditions/tasks/EntityPrompt.java +++ b/main/src/main/java/me/blackvein/quests/convo/conditions/tasks/EntityPrompt.java @@ -14,13 +14,17 @@ package me.blackvein.quests.convo.conditions.tasks; import java.util.LinkedList; import java.util.List; +import java.util.Set; +import java.util.UUID; import org.bukkit.ChatColor; import org.bukkit.conversations.ConversationContext; import org.bukkit.conversations.Prompt; import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; import org.bukkit.entity.Vehicle; +import me.blackvein.quests.Quests; import me.blackvein.quests.convo.conditions.main.ConditionMainPrompt; import me.blackvein.quests.convo.quests.QuestsEditorNumericPrompt; import me.blackvein.quests.convo.quests.QuestsEditorStringPrompt; @@ -29,14 +33,18 @@ import me.blackvein.quests.events.editor.quests.QuestsEditorPostOpenStringPrompt import me.blackvein.quests.util.CK; import me.blackvein.quests.util.Lang; import me.blackvein.quests.util.MiscUtil; +import net.citizensnpcs.api.CitizensAPI; public class EntityPrompt extends QuestsEditorNumericPrompt { + private final Quests plugin; + public EntityPrompt(final ConversationContext context) { super(context); + this.plugin = (Quests)context.getPlugin(); } - private final int size = 2; + private final int size = 3; @Override public int getSize() { @@ -54,6 +62,8 @@ public class EntityPrompt extends QuestsEditorNumericPrompt { case 1: return ChatColor.BLUE; case 2: + return ChatColor.BLUE; + case 3: return ChatColor.GREEN; default: return null; @@ -66,6 +76,8 @@ public class EntityPrompt extends QuestsEditorNumericPrompt { case 1: return ChatColor.YELLOW + Lang.get("conditionEditorRideEntity"); case 2: + return ChatColor.YELLOW + Lang.get("conditionEditorRideNPC"); + case 3: return ChatColor.GREEN + Lang.get("done"); default: return null; @@ -87,6 +99,21 @@ public class EntityPrompt extends QuestsEditorNumericPrompt { return text; } case 2: + if (plugin.getDependencies().getCitizens() != null) { + if (context.getSessionData(CK.C_WHILE_RIDING_NPC) == null) { + return ChatColor.GRAY + "(" + Lang.get("noneSet") + ")"; + } else { + String text = "\n"; + for (final int i : (List) context.getSessionData(CK.C_WHILE_RIDING_NPC)) { + text += ChatColor.GRAY + " - " + ChatColor.BLUE + CitizensAPI.getNPCRegistry().getById(i) + .getName() + "\n"; + } + return text; + } + } else { + return ChatColor.GRAY + "(" + Lang.get("notInstalled") + ")"; + } + case 3: return ""; default: return null; @@ -112,6 +139,8 @@ public class EntityPrompt extends QuestsEditorNumericPrompt { case 1: return new EntitiesPrompt(context); case 2: + return new ConditionNpcsPrompt(context); + case 3: try { return new ConditionMainPrompt(context); } catch (final Exception e) { @@ -182,4 +211,70 @@ public class EntityPrompt extends QuestsEditorNumericPrompt { return new EntityPrompt(context); } } + + public class ConditionNpcsPrompt extends QuestsEditorStringPrompt { + + public ConditionNpcsPrompt(final ConversationContext context) { + super(context); + } + + @Override + public String getTitle(final ConversationContext context) { + return Lang.get("conditionEditorNpcsTitle"); + } + + @Override + public String getQueryText(final ConversationContext context) { + return Lang.get("conditionEditorNpcsPrompt"); + } + + @Override + public String getPromptText(final ConversationContext context) { + final QuestsEditorPostOpenStringPromptEvent event = new QuestsEditorPostOpenStringPromptEvent(context, this); + context.getPlugin().getServer().getPluginManager().callEvent(event); + + if (context.getForWhom() instanceof Player) { + final Set selectingNpcs = plugin.getQuestFactory().getSelectingNpcs(); + selectingNpcs.add(((Player) context.getForWhom()).getUniqueId()); + plugin.getQuestFactory().setSelectingNpcs(selectingNpcs); + return ChatColor.YELLOW + getQueryText(context) + "\n" + + ChatColor.GOLD + Lang.get("npcHint"); + } else { + return ChatColor.YELLOW + getQueryText(context); + } + } + + @Override + public Prompt acceptInput(final ConversationContext context, final String input) { + if (input.equalsIgnoreCase(Lang.get("cmdCancel")) == false) { + final LinkedList npcIds = new LinkedList(); + try { + for (final String s : input.split(" ")) { + final int i = Integer.parseInt(s); + if (i > -1) { + if (CitizensAPI.getNPCRegistry().getById(i) == null) { + context.getForWhom().sendRawMessage(ChatColor.RED + Lang.get("questEditorInvalidNPC")); + return new ConditionNpcsPrompt(context); + } + npcIds.add(i); + context.setSessionData(CK.C_WHILE_RIDING_NPC, npcIds); + } else { + context.getForWhom().sendRawMessage(ChatColor.RED + Lang.get("questEditorInvalidNPC")); + return new ConditionNpcsPrompt(context); + } + } + } catch (final NumberFormatException e) { + context.getForWhom().sendRawMessage(ChatColor.RED + + Lang.get("reqNotANumber").replace("", input)); + return new ConditionNpcsPrompt(context); + } + } + if (context.getForWhom() instanceof Player) { + final Set selectingNpcs = plugin.getQuestFactory().getSelectingNpcs(); + selectingNpcs.remove(((Player) context.getForWhom()).getUniqueId()); + plugin.getQuestFactory().setSelectingNpcs(selectingNpcs); + } + return new EntityPrompt(context); + } + } } diff --git a/main/src/main/java/me/blackvein/quests/convo/quests/main/QuestMainPrompt.java b/main/src/main/java/me/blackvein/quests/convo/quests/main/QuestMainPrompt.java index 9ef534a5d..3099f3d70 100644 --- a/main/src/main/java/me/blackvein/quests/convo/quests/main/QuestMainPrompt.java +++ b/main/src/main/java/me/blackvein/quests/convo/quests/main/QuestMainPrompt.java @@ -459,6 +459,7 @@ public class QuestMainPrompt extends QuestsEditorNumericPrompt { public String getPromptText(final ConversationContext context) { final QuestsEditorPostOpenStringPromptEvent event = new QuestsEditorPostOpenStringPromptEvent(context, this); plugin.getServer().getPluginManager().callEvent(event); + if (context.getForWhom() instanceof Player) { final Set selectingNpcs = plugin.getQuestFactory().getSelectingNpcs(); selectingNpcs.add(((Player) context.getForWhom()).getUniqueId()); diff --git a/main/src/main/java/me/blackvein/quests/util/CK.java b/main/src/main/java/me/blackvein/quests/util/CK.java index 1d767b546..4c5a8eaf0 100644 --- a/main/src/main/java/me/blackvein/quests/util/CK.java +++ b/main/src/main/java/me/blackvein/quests/util/CK.java @@ -183,6 +183,7 @@ public class CK { public static final String C_NAME = "conName"; public static final String C_FAIL_QUEST = "conFailQuest"; public static final String C_WHILE_RIDING_ENTITY = "conRidingEntity"; + public static final String C_WHILE_RIDING_NPC = "conRidingNpc"; public static final String C_WHILE_PERMISSION = "conPermission"; public static final String C_WHILE_HOLDING_MAIN_HAND = "conHoldingMainHand"; public static final String C_WHILE_WITHIN_WORLD = "conWithinWorld"; diff --git a/main/src/main/resources/strings.yml b/main/src/main/resources/strings.yml index 01d954016..1fda53e08 100644 --- a/main/src/main/resources/strings.yml +++ b/main/src/main/resources/strings.yml @@ -404,8 +404,11 @@ conditionEditorCheckPlaceholder: "Check placeholder" conditionEditorFailQuest: "Fail the quest" conditionEditorConditionCleared: "Condition cleared." conditionEditorRideEntity: "Ride entity" +conditionEditorRideNPC: "Ride NPC" conditionEditorEntitiesTitle: "- Entities -" conditionEditorEntitiesPrompt: "Enter entity names, , " +conditionEditorNpcsTitle: "- Npcs -" +conditionEditorNpcsPrompt: "Enter NPC IDs, , " conditionEditorPermissions: "Own permission" conditionEditorPermissionsPrompt: "Enter permission nodes, , " conditionEditorItemsInMainHand: "Hold in main hand"