diff --git a/api/pom.xml b/api/pom.xml index 9d4cf8bfd..92485167b 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -124,6 +124,12 @@ 3.1.6 provided + + com.github.gonalez + znpc-servers + 21a0650 + provided + com.github.PikaMug Unite diff --git a/api/src/main/java/me/blackvein/quests/dependencies/IDependencies.java b/api/src/main/java/me/blackvein/quests/dependencies/IDependencies.java index 58dc68b27..ff0716655 100644 --- a/api/src/main/java/me/blackvein/quests/dependencies/IDependencies.java +++ b/api/src/main/java/me/blackvein/quests/dependencies/IDependencies.java @@ -18,6 +18,7 @@ import com.gmail.nossr50.datatypes.skills.SkillType; import com.gmail.nossr50.mcMMO; import com.herocraftonline.heroes.Heroes; import com.herocraftonline.heroes.characters.Hero; +import io.github.znetworkw.znpcservers.ServersNPC; import me.blackvein.quests.player.IQuester; import me.blackvein.quests.reflect.denizen.DenizenAPI; import me.blackvein.quests.reflect.worldguard.WorldGuardAPI; @@ -61,15 +62,15 @@ public interface IDependencies { CitizensBooksAPI getCitizensBooksApi(); + ServersNPC getZnpcs(); + PartiesAPI getPartiesApi(); boolean isPluginAvailable(final String pluginName); boolean runDenizenScript(final String scriptName, final IQuester quester, final UUID uuid); - Location getNPCLocation(final int id); - - String getNPCName(final int id); + Location getNPCLocation(final UUID uuid); String getNPCName(final UUID uuid); diff --git a/api/src/main/java/me/blackvein/quests/quests/IQuest.java b/api/src/main/java/me/blackvein/quests/quests/IQuest.java index db63e8a70..24219549f 100644 --- a/api/src/main/java/me/blackvein/quests/quests/IQuest.java +++ b/api/src/main/java/me/blackvein/quests/quests/IQuest.java @@ -14,13 +14,13 @@ package me.blackvein.quests.quests; import me.blackvein.quests.actions.IAction; import me.blackvein.quests.player.IQuester; -import net.citizensnpcs.api.npc.NPC; import org.bukkit.Location; import org.bukkit.OfflinePlayer; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.Plugin; import java.util.LinkedList; +import java.util.UUID; public interface IQuest extends Comparable { Plugin getPlugin(); @@ -55,9 +55,11 @@ public interface IQuest extends Comparable { LinkedList getStages(); - NPC getNpcStart(); + UUID getNpcStart(); - void setNpcStart(final NPC npcStart); + void setNpcStart(final UUID npcStart); + + String getNpcStartName(); Location getBlockStart(); diff --git a/core/pom.xml b/core/pom.xml index 1f71bc046..c67259972 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -124,6 +124,12 @@ 3.1.6 provided + + com.github.gonalez + znpc-servers + 21a0650 + provided + com.github.PikaMug Unite diff --git a/core/src/main/java/me/blackvein/quests/Dependencies.java b/core/src/main/java/me/blackvein/quests/Dependencies.java index d5c133551..3a67c497f 100644 --- a/core/src/main/java/me/blackvein/quests/Dependencies.java +++ b/core/src/main/java/me/blackvein/quests/Dependencies.java @@ -21,8 +21,10 @@ import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.player.UserManager; import com.herocraftonline.heroes.Heroes; import com.herocraftonline.heroes.characters.Hero; +import io.github.znetworkw.znpcservers.ServersNPC; +import io.github.znetworkw.znpcservers.npc.NPC; import me.blackvein.quests.dependencies.IDependencies; -import me.blackvein.quests.listeners.NpcListener; +import me.blackvein.quests.listeners.CitizensListener; import me.blackvein.quests.player.IQuester; import me.blackvein.quests.reflect.denizen.DenizenAPI; import me.blackvein.quests.reflect.worldguard.WorldGuardAPI; @@ -32,6 +34,7 @@ import net.citizensnpcs.api.CitizensPlugin; import net.milkbowl.vault.economy.Economy; import net.milkbowl.vault.permission.Permission; import org.bukkit.Location; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.bukkit.plugin.RegisteredListener; @@ -39,10 +42,13 @@ import org.bukkit.plugin.RegisteredServiceProvider; import ro.nicuch.citizensbooks.CitizensBooksAPI; import ro.nicuch.citizensbooks.CitizensBooksPlugin; +import java.util.Collections; import java.util.HashSet; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.UUID; +import java.util.stream.Collectors; public class Dependencies implements IDependencies { @@ -59,6 +65,7 @@ public class Dependencies implements IDependencies { public static CitizensPlugin citizens = null; private static DenizenAPI denizenApi = null; private static CitizensBooksAPI citizensBooks = null; + private static ServersNPC znpcs = null; private static PartiesAPI parties = null; public Dependencies(final Quests plugin) { @@ -160,12 +167,12 @@ public class Dependencies implements IDependencies { citizens = (CitizensPlugin) plugin.getServer().getPluginManager().getPlugin("Citizens"); boolean found = false; for (final RegisteredListener listener : HandlerList.getRegisteredListeners(plugin)) { - if (listener.getListener() instanceof NpcListener) { + if (listener.getListener() instanceof CitizensListener) { found = true; } } if (!found) { - plugin.getServer().getPluginManager().registerEvents(plugin.getNpcListener(), plugin); + plugin.getServer().getPluginManager().registerEvents(plugin.getCitizensListener(), plugin); if (plugin.getSettings().canNpcEffects()) { plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, plugin.getNpcEffectThread(), 20, 20); @@ -202,6 +209,22 @@ public class Dependencies implements IDependencies { return citizensBooks; } + public ServersNPC getZnpcs() { + if (znpcs == null) { + znpcs = (ServersNPC) plugin.getServer().getPluginManager().getPlugin("ServersNPC"); + } + return znpcs; + } + + public Set getZnpcsUuids() { + if (znpcs != null && isPluginAvailable("ServersNPC")) { + // TODO - it seems ZNPCs UUIDs do not persist restart + return io.github.znetworkw.znpcservers.npc.NPC.all().stream() + .map(io.github.znetworkw.znpcservers.npc.NPC::getUUID).collect(Collectors.toSet()); + } + return Collections.emptySet(); + } + public PartiesAPI getPartiesApi() { if (parties == null && isPluginAvailable("Parties")) { try { @@ -226,7 +249,6 @@ public class Dependencies implements IDependencies { } catch (final Exception e) { e.printStackTrace(); } - } return false; } @@ -238,7 +260,7 @@ public class Dependencies implements IDependencies { if (rsp != null) { economy = rsp.getProvider(); } - return (economy != null); + return economy != null; } catch (final Exception e) { return false; } @@ -250,7 +272,7 @@ public class Dependencies implements IDependencies { if (rsp != null) { permission = rsp.getProvider(); } - return (permission != null); + return permission != null; } private boolean setupParty() { @@ -265,49 +287,41 @@ public class Dependencies implements IDependencies { } } } - return (partyProvider != null); + return partyProvider != null; } public boolean runDenizenScript(final String scriptName, final IQuester quester, final UUID uuid) { return plugin.getDenizenTrigger().runDenizenScript(scriptName, quester, uuid); } - /** - * @deprecated Use {@link #getNPCLocation(UUID)} - */ - public Location getNPCLocation(final int id) { - if (citizens != null) { - return citizens.getNPCRegistry().getById(id).getStoredLocation(); - } else { - return null; - } - } - public Location getNPCLocation(final UUID uuid) { - if (citizens != null) { + if (citizens != null && citizens.getNPCRegistry().getByUniqueId(uuid) != null) { return citizens.getNPCRegistry().getByUniqueId(uuid).getStoredLocation(); - } else { - return null; - } - } - - /** - * @deprecated Use {@link #getNPCName(UUID)} - */ - public String getNPCName(final int id) { - if (citizens != null) { - return citizens.getNPCRegistry().getById(id).getName(); - } else { - return null; + } else if (getZnpcsUuids().contains(uuid)) { + final Optional opt = NPC.all().stream().filter(npc1 -> npc1.getUUID().equals(uuid)).findAny(); + if (opt.isPresent()) { + return opt.get().getLocation(); + } } + return null; } public String getNPCName(final UUID uuid) { - if (citizens != null) { + Entity npc = null; + if (citizens != null && citizens.getNPCRegistry().getByUniqueId(uuid) != null) { return citizens.getNPCRegistry().getByUniqueId(uuid).getName(); - } else { - return null; + } else if (getZnpcsUuids().contains(uuid)) { + final Optional opt = NPC.all().stream().filter(npc1 -> npc1.getUUID().equals(uuid)).findAny(); + if (opt.isPresent()) { + npc = (Entity) opt.get().getBukkitEntity(); + if (npc.getCustomName() != null) { + return npc.getCustomName(); + } else { + return opt.get().getNpcPojo().getHologramLines().get(0); + } + } } + return "NPC"; } public int getMcmmoSkillLevel(final SkillType st, final String player) { diff --git a/core/src/main/java/me/blackvein/quests/Quest.java b/core/src/main/java/me/blackvein/quests/Quest.java index fbfc0c44b..9ffd6d10d 100644 --- a/core/src/main/java/me/blackvein/quests/Quest.java +++ b/core/src/main/java/me/blackvein/quests/Quest.java @@ -20,8 +20,9 @@ import com.codisimus.plugins.phatloots.loot.LootBundle; import com.gmail.nossr50.datatypes.skills.SkillType; import com.gmail.nossr50.util.player.UserManager; import com.herocraftonline.heroes.characters.Hero; -import me.blackvein.quests.actions.IAction; +import io.github.znetworkw.znpcservers.npc.NPC; import me.blackvein.quests.actions.Action; +import me.blackvein.quests.actions.IAction; import me.blackvein.quests.conditions.ICondition; import me.blackvein.quests.dependencies.IDependencies; import me.blackvein.quests.events.quest.QuestUpdateCompassEvent; @@ -50,8 +51,6 @@ 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; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.DyeColor; @@ -72,6 +71,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Optional; import java.util.UUID; import java.util.concurrent.CompletableFuture; @@ -189,16 +189,18 @@ public class Quest implements IQuest { } @Override - public NPC getNpcStart() { - if (plugin.getDependencies().getCitizens() != null && CitizensAPI.getNPCRegistry().getByUniqueId(npcStart) != null) { - return CitizensAPI.getNPCRegistry().getByUniqueId(npcStart); - } - return null; + public UUID getNpcStart() { + return npcStart; } @Override - public void setNpcStart(final NPC npcStart) { - this.npcStart = npcStart.getUniqueId(); + public void setNpcStart(final UUID npcStart) { + this.npcStart = npcStart; + } + + @Override + public String getNpcStartName() { + return plugin.getDependencies().getNPCName(getNpcStart()); } @Override @@ -361,8 +363,8 @@ public class Quest implements IQuest { final StringBuilder msg = new StringBuilder("- " + Lang.get("conditionEditorRideNPC")); for (final UUID u : c.getNpcsWhileRiding()) { if (plugin.getDependencies().getCitizens() != null) { - msg.append(ChatColor.AQUA).append("\n \u2515 ").append(CitizensAPI.getNPCRegistry() - .getByUniqueId(u).getName()); + msg.append(ChatColor.AQUA).append("\n \u2515 ").append(plugin.getDependencies() + .getCitizens().getNPCRegistry().getByUniqueId(u).getName()); } else { msg.append(ChatColor.AQUA).append("\n \u2515 ").append(u); } @@ -456,9 +458,19 @@ public class Quest implements IQuest { } else if (stage.getLocationsToReach() != null && stage.getLocationsToReach().size() > 0) { targetLocation = stage.getLocationsToReach().getFirst(); } else if (stage.getItemDeliveryTargets() != null && stage.getItemDeliveryTargets().size() > 0) { - final NPC npc = plugin.getDependencies().getCitizens().getNPCRegistry().getByUniqueId(stage - .getItemDeliveryTargets().getFirst()); - targetLocation = npc.getStoredLocation(); + final UUID uuid = stage.getItemDeliveryTargets().getFirst(); + if (plugin.getDependencies().getCitizens() != null + && plugin.getDependencies().getCitizens().getNPCRegistry().getByUniqueId(uuid) != null) { + targetLocation = plugin.getDependencies().getCitizens().getNPCRegistry().getByUniqueId(uuid) + .getStoredLocation(); + } + if (plugin.getDependencies().getZnpcs() != null + && plugin.getDependencies().getZnpcsUuids().contains(uuid)) { + final Optional opt = NPC.all().stream().filter(npc1 -> npc1.getUUID().equals(uuid)).findAny(); + if (opt.isPresent()) { + targetLocation = opt.get().getLocation(); + } + } } else if (stage.getPlayersToKill() != null && stage.getPlayersToKill() > 0) { if (quester.getPlayer() == null) { return; diff --git a/core/src/main/java/me/blackvein/quests/Quester.java b/core/src/main/java/me/blackvein/quests/Quester.java index 6c2539fff..041eddcd2 100644 --- a/core/src/main/java/me/blackvein/quests/Quester.java +++ b/core/src/main/java/me/blackvein/quests/Quester.java @@ -16,6 +16,7 @@ import com.alessiodp.parties.api.interfaces.Party; import com.alessiodp.parties.api.interfaces.PartyPlayer; import com.gmail.nossr50.datatypes.skills.SkillType; import com.gmail.nossr50.util.player.UserManager; +import io.github.znetworkw.znpcservers.npc.NPC; import me.blackvein.quests.conditions.ICondition; import me.blackvein.quests.config.ISettings; import me.blackvein.quests.convo.misc.QuestAbandonPrompt; @@ -62,6 +63,7 @@ import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.conversations.ConversationFactory; import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryType; @@ -83,6 +85,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Optional; import java.util.Random; import java.util.Set; import java.util.UUID; @@ -587,20 +590,29 @@ public class Quester implements IQuester { sendMessage(ChatColor.YELLOW + msg); } return false; - } else if (plugin.getDependencies().getCitizens() != null - && !plugin.getSettings().canAllowCommandsForNpcQuests() - && quest.getNpcStart() != null && quest.getNpcStart().getEntity() != null - && quest.getNpcStart().getEntity().getLocation().getWorld() != null - && getPlayer().getLocation().getWorld() != null - && quest.getNpcStart().getEntity().getLocation().getWorld().getName().equals( - getPlayer().getLocation().getWorld().getName()) - && quest.getNpcStart().getEntity().getLocation().distance(getPlayer().getLocation()) > 6.0) { + } else if (!plugin.getSettings().canAllowCommandsForNpcQuests() && quest.getNpcStart() != null + && getPlayer().getLocation().getWorld() != null) { + final UUID uuid = quest.getNpcStart(); if (giveReason) { - final String msg = Lang.get(getPlayer(), "mustSpeakTo").replace("", ChatColor.DARK_PURPLE - + quest.getNpcStart().getName() + ChatColor.YELLOW); - sendMessage(ChatColor.YELLOW + msg); + Entity npc = null; + if (plugin.getDependencies().getCitizens() != null + && plugin.getDependencies().getCitizens().getNPCRegistry().getByUniqueId(uuid) != null) { + npc = plugin.getDependencies().getCitizens().getNPCRegistry().getByUniqueId(uuid).getEntity(); + } else if (plugin.getDependencies().getZnpcs() != null + && plugin.getDependencies().getZnpcsUuids().contains(uuid)) { + final Optional opt = NPC.all().stream().filter(npc1 -> npc1.getUUID().equals(uuid)).findAny(); + if (opt.isPresent()) { + npc = (Entity) opt.get().getBukkitEntity(); + } + } + if (npc != null && npc.getLocation().getWorld() != null && npc.getLocation().getWorld().getName() + .equals(getPlayer().getLocation().getWorld().getName()) + && npc.getLocation().distance(getPlayer().getLocation()) > 6.0) { + sendMessage(ChatColor.YELLOW + Lang.get(getPlayer(), "mustSpeakTo") + .replace("", ChatColor.DARK_PURPLE + npc.getName() + ChatColor.YELLOW)); + return false; + } } - return false; } else if (quest.getBlockStart() != null) { if (giveReason) { final String msg = Lang.get(getPlayer(), "noCommandStart").replace("", ChatColor.DARK_PURPLE diff --git a/core/src/main/java/me/blackvein/quests/Quests.java b/core/src/main/java/me/blackvein/quests/Quests.java index e59568691..cb49722c3 100644 --- a/core/src/main/java/me/blackvein/quests/Quests.java +++ b/core/src/main/java/me/blackvein/quests/Quests.java @@ -40,10 +40,11 @@ import me.blackvein.quests.listeners.BlockListener; import me.blackvein.quests.listeners.CommandManager; import me.blackvein.quests.listeners.ConvoListener; import me.blackvein.quests.listeners.ItemListener; -import me.blackvein.quests.listeners.NpcListener; +import me.blackvein.quests.listeners.CitizensListener; import me.blackvein.quests.listeners.PartiesListener; import me.blackvein.quests.listeners.PlayerListener; import me.blackvein.quests.listeners.UniteListener; +import me.blackvein.quests.listeners.ZnpcsListener; import me.blackvein.quests.logging.QuestsLog4JFilter; import me.blackvein.quests.module.ICustomObjective; import me.blackvein.quests.player.IQuester; @@ -161,7 +162,8 @@ public class Quests extends JavaPlugin implements QuestsAPI { private ConvoListener convoListener; private BlockListener blockListener; private ItemListener itemListener; - private NpcListener npcListener; + private CitizensListener citizensListener; + private ZnpcsListener znpcsListener; private PlayerListener playerListener; private NpcEffectThread effectThread; private PlayerMoveThread moveThread; @@ -189,7 +191,8 @@ public class Quests extends JavaPlugin implements QuestsAPI { convoListener = new ConvoListener(); blockListener = new BlockListener(this); itemListener = new ItemListener(this); - npcListener = new NpcListener(this); + citizensListener = new CitizensListener(this); + znpcsListener = new ZnpcsListener(this); playerListener = new PlayerListener(this); uniteListener = new UniteListener(); partiesListener = new PartiesListener(); @@ -258,6 +261,9 @@ public class Quests extends JavaPlugin implements QuestsAPI { getServer().getPluginManager().registerEvents(getBlockListener(), this); getServer().getPluginManager().registerEvents(getItemListener(), this); depends.linkCitizens(); + if (depends.getZnpcs() != null) { + getServer().getPluginManager().registerEvents(getZnpcsListener(), this); + } getServer().getPluginManager().registerEvents(getPlayerListener(), this); if (settings.getStrictPlayerMovement() > 0) { final long ticks = settings.getStrictPlayerMovement() * 20L; @@ -593,8 +599,12 @@ public class Quests extends JavaPlugin implements QuestsAPI { return itemListener; } - public NpcListener getNpcListener() { - return npcListener; + public CitizensListener getCitizensListener() { + return citizensListener; + } + + public ZnpcsListener getZnpcsListener() { + return znpcsListener; } public PlayerListener getPlayerListener() { @@ -1378,7 +1388,8 @@ public class Quests extends JavaPlugin implements QuestsAPI { final int toDeliver = is.getAmount(); final UUID npc = stage.getItemDeliveryTargets().get(deliverIndex); final ChatColor color = delivered < toDeliver ? ChatColor.GREEN : ChatColor.GRAY; - String message = color + "- " + Lang.get(quester.getPlayer(), "deliver").replace("", depends.getNPCName(npc)); + String message = color + "- " + Lang.get(quester.getPlayer(), "deliver") + .replace("", depends.getNPCName(npc)); if (message.contains("")) { message = message.replace("", "" + color + delivered + "/" + toDeliver); } else { @@ -1840,21 +1851,17 @@ public class Quests extends JavaPlugin implements QuestsAPI { } else { throw new QuestFormatException("finish-message is missing", questKey); } - if (depends.getCitizens() != null && config.contains("quests." + questKey + ".npc-giver-uuid")) { + if (config.contains("quests." + questKey + ".npc-giver-uuid")) { final UUID uuid = UUID.fromString(Objects.requireNonNull(config.getString("quests." + questKey + ".npc-giver-uuid"))); - if (CitizensAPI.getNPCRegistry().getByUniqueId(uuid) != null) { - quest.setNpcStart(CitizensAPI.getNPCRegistry().getByUniqueId(uuid)); - questNpcUuids.add(uuid); - } else { - throw new QuestFormatException("npc-giver-uuid has invalid NPC UUID " + uuid, questKey); - } + quest.setNpcStart(uuid); + questNpcUuids.add(uuid); } else if (depends.getCitizens() != null && config.contains("quests." + questKey + ".npc-giver-id")) { // Legacy final int id = config.getInt("quests." + questKey + ".npc-giver-id"); if (CitizensAPI.getNPCRegistry().getById(id) != null) { final NPC npc = CitizensAPI.getNPCRegistry().getById(id); - quest.setNpcStart(npc); + quest.setNpcStart(npc.getUniqueId()); questNpcUuids.add(npc.getUniqueId()); } else { throw new QuestFormatException("npc-giver-id has invalid NPC ID " + id, questKey); @@ -2930,19 +2937,8 @@ public class Quests extends JavaPlugin implements QuestsAPI { + ".npc-uuids-to-talk-to"); for (final String s : npcUuidsToTalkTo) { final UUID uuid = UUID.fromString(s); - if (getDependencies().getCitizens() != null) { - final NPC npc = CitizensAPI.getNPCRegistry().getByUniqueId(uuid); - if (npc != null) { - oStage.addNpcToInteract(uuid); - questNpcUuids.add(uuid); - } else { - throw new StageFormatException("npc-uuids-to-talk-to has invalid NPC UUID of " - + s, quest, stageNum); - } - } else { - throw new StageFormatException("Citizens not found for npc-uuids-to-talk-to", quest, - stageNum); - } + oStage.addNpcToInteract(uuid); + questNpcUuids.add(uuid); } } else { throw new StageFormatException("npc-ids-to-talk-to is not a list of numbers", quest, stageNum); @@ -2994,20 +2990,9 @@ public class Quests extends JavaPlugin implements QuestsAPI { ? deliveryMessages.get(index) : deliveryMessages.get(deliveryMessages.size() - 1); index++; - if (getDependencies().getCitizens() != null) { - final NPC npc = CitizensAPI.getNPCRegistry().getByUniqueId(npcUuid); - if (npc != null) { - oStage.addItemToDeliver(stack); - oStage.addItemDeliveryTarget(npcUuid); - oStage.addDeliverMessage(msg); - } else { - throw new StageFormatException("npc-delivery-ids has invalid NPC " + - "UUID of " + npcUuid, quest, stageNum); - } - } else { - throw new StageFormatException( - "Citizens not found for npc-delivery-uuids", quest, stageNum); - } + oStage.addItemToDeliver(stack); + oStage.addItemDeliveryTarget(npcUuid); + oStage.addDeliverMessage(msg); } } } else { @@ -3080,18 +3065,12 @@ public class Quests extends JavaPlugin implements QuestsAPI { + stageNum + ".npc-kill-amounts"); for (final String s : npcUuidsToKill) { final UUID npcUuid = UUID.fromString(s); - final NPC npc = CitizensAPI.getNPCRegistry().getByUniqueId(npcUuid); - if (npc != null) { - if (npcAmountsToKill.get(npcUuidsToKill.indexOf(s)) > 0) { - oStage.addNpcToKill(npcUuid); - oStage.addNpcNumToKill(npcAmountsToKill.get(npcUuidsToKill.indexOf(s))); - questNpcUuids.add(npcUuid); - } else { - throw new StageFormatException("npc-kill-amounts is not a positive number", - quest, stageNum); - } + if (npcAmountsToKill.get(npcUuidsToKill.indexOf(s)) > 0) { + oStage.addNpcToKill(npcUuid); + oStage.addNpcNumToKill(npcAmountsToKill.get(npcUuidsToKill.indexOf(s))); + questNpcUuids.add(npcUuid); } else { - throw new StageFormatException("npc-uuids-to-kill has invalid NPC UUID of " + s, + throw new StageFormatException("npc-kill-amounts is not a positive number", quest, stageNum); } } @@ -3950,17 +3929,7 @@ public class Quests extends JavaPlugin implements QuestsAPI { final LinkedList npcList = new LinkedList<>(); for (final String s : data.getStringList(conditionKey + "ride-npc-uuid")) { final UUID u = UUID.fromString(s); - if (getDependencies().getCitizens() != null) { - final NPC npc = CitizensAPI.getNPCRegistry().getByUniqueId(u); - if (npc != null) { - npcList.add(u); - } else { - throw new ConditionFormatException("ride-npc-uuid is not a valid NPC UUID", - conditionKey); - } - } else { - throw new ConditionFormatException("Citizens not found for ride-npc-uuid", conditionKey); - } + npcList.add(u); } condition.setNpcsWhileRiding(npcList); } @@ -4568,7 +4537,7 @@ public class Quests extends JavaPlugin implements QuestsAPI { public boolean hasQuest(final NPC npc, final IQuester quester) { for (final IQuest q : quests) { if (q.getNpcStart() != null && !quester.getCompletedQuestsTemp().contains(q)) { - if (q.getNpcStart().getId() == npc.getId()) { + if (q.getNpcStart().equals(npc.getUniqueId())) { final boolean ignoreLockedQuests = settings.canIgnoreLockedQuests(); if (!ignoreLockedQuests || q.testRequirements(quester)) { return true; @@ -4590,7 +4559,7 @@ public class Quests extends JavaPlugin implements QuestsAPI { public boolean hasCompletedQuest(final NPC npc, final IQuester quester) { for (final IQuest q : quests) { if (q.getNpcStart() != null && quester.getCompletedQuestsTemp().contains(q)) { - if (q.getNpcStart().getId() == npc.getId()) { + if (q.getNpcStart().equals(npc.getUniqueId())) { final boolean ignoreLockedQuests = settings.canIgnoreLockedQuests(); if (!ignoreLockedQuests || q.testRequirements(quester)) { return true; @@ -4612,7 +4581,7 @@ public class Quests extends JavaPlugin implements QuestsAPI { for (final IQuest q : quests) { if (q.getNpcStart() != null && quester.getCompletedQuestsTemp().contains(q) && q.getPlanner().getCooldown() > -1) { - if (q.getNpcStart().getId() == npc.getId()) { + if (q.getNpcStart().equals(npc.getUniqueId())) { final boolean ignoreLockedQuests = settings.canIgnoreLockedQuests(); if (!ignoreLockedQuests || q.testRequirements(quester)) { return true; diff --git a/core/src/main/java/me/blackvein/quests/commands/quest/QuestCommandHandler.java b/core/src/main/java/me/blackvein/quests/commands/quest/QuestCommandHandler.java index 0fdfd1ce2..e5261c3de 100644 --- a/core/src/main/java/me/blackvein/quests/commands/quest/QuestCommandHandler.java +++ b/core/src/main/java/me/blackvein/quests/commands/quest/QuestCommandHandler.java @@ -116,7 +116,7 @@ public class QuestCommandHandler { cs.sendMessage(" "); if (q.getNpcStart() != null) { String msg = Lang.get("speakTo"); - msg = msg.replace("", q.getNpcStart().getName()); + msg = msg.replace("", q.getNpcStartName()); cs.sendMessage(ChatColor.YELLOW + msg); } else { cs.sendMessage(ChatColor.YELLOW + q.getDescription()); diff --git a/core/src/main/java/me/blackvein/quests/convo/conditions/tasks/EntityPrompt.java b/core/src/main/java/me/blackvein/quests/convo/conditions/tasks/EntityPrompt.java index 16d0f8000..83d3daf52 100644 --- a/core/src/main/java/me/blackvein/quests/convo/conditions/tasks/EntityPrompt.java +++ b/core/src/main/java/me/blackvein/quests/convo/conditions/tasks/EntityPrompt.java @@ -21,7 +21,6 @@ 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; import org.bukkit.ChatColor; import org.bukkit.conversations.ConversationContext; import org.bukkit.conversations.Prompt; @@ -104,16 +103,16 @@ public class EntityPrompt extends QuestsEditorNumericPrompt { return text.toString(); } case 2: - if (plugin.getDependencies().getCitizens() != null) { + if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcs() != null) { if (context.getSessionData(CK.C_WHILE_RIDING_NPC) == null) { return ChatColor.GRAY + "(" + Lang.get("noneSet") + ")"; } else { final StringBuilder text = new StringBuilder(); - final List whileRidingNpc = (List) context.getSessionData(CK.C_WHILE_RIDING_NPC); + final List whileRidingNpc = (List) context.getSessionData(CK.C_WHILE_RIDING_NPC); if (whileRidingNpc != null) { - for (final int i : whileRidingNpc) { + for (final UUID u : whileRidingNpc) { text.append("\n").append(ChatColor.GRAY).append(" - ").append(ChatColor.BLUE) - .append(CitizensAPI.getNPCRegistry().getById(i).getName()); + .append(plugin.getDependencies().getNPCName(u)); } } return text.toString(); @@ -278,21 +277,21 @@ public class EntityPrompt extends QuestsEditorNumericPrompt { return null; } if (!input.equalsIgnoreCase(Lang.get("cmdCancel"))) { - final LinkedList npcIds = new LinkedList<>(); + final LinkedList npcUuids = new LinkedList<>(); try { for (final String s : input.split(" ")) { - final int i = Integer.parseInt(s); - if (i > -1) { - if (CitizensAPI.getNPCRegistry().getById(i) == null) { + try { + final UUID u = UUID.fromString(s); + if (plugin.getDependencies().getNPCName(u) == 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 { + npcUuids.add(u); + context.setSessionData(CK.C_WHILE_RIDING_NPC, npcUuids); + } catch (Exception e) { context.getForWhom().sendRawMessage(ChatColor.RED + Lang.get("questEditorInvalidNPC")); - return new ConditionNpcsPrompt(context); } + return new ConditionNpcsPrompt(context); } } catch (final NumberFormatException e) { context.getForWhom().sendRawMessage(ChatColor.RED diff --git a/core/src/main/java/me/blackvein/quests/convo/quests/main/QuestMainPrompt.java b/core/src/main/java/me/blackvein/quests/convo/quests/main/QuestMainPrompt.java index fb1989942..c86f8317c 100644 --- a/core/src/main/java/me/blackvein/quests/convo/quests/main/QuestMainPrompt.java +++ b/core/src/main/java/me/blackvein/quests/convo/quests/main/QuestMainPrompt.java @@ -30,7 +30,6 @@ import me.blackvein.quests.reflect.worldguard.WorldGuardAPI; import me.blackvein.quests.util.CK; import me.blackvein.quests.util.ItemUtil; import me.blackvein.quests.util.Lang; -import net.citizensnpcs.api.CitizensAPI; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.World; @@ -108,7 +107,7 @@ public class QuestMainPrompt extends QuestsEditorNumericPrompt { return ChatColor.GRAY; } case 7: - if (plugin.getDependencies().getCitizens() != null) { + if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcs() != null) { return ChatColor.BLUE; } else { return ChatColor.GRAY; @@ -132,7 +131,8 @@ public class QuestMainPrompt extends QuestsEditorNumericPrompt { case 3: return ChatColor.YELLOW + Lang.get("questEditorFinishMessage"); case 4: - if (context.getSessionData(CK.Q_START_NPC) == null || plugin.getDependencies().getCitizens() != null) { + if (context.getSessionData(CK.Q_START_NPC) == null || plugin.getDependencies().getCitizens() != null + || plugin.getDependencies().getZnpcs() != null) { return ChatColor.YELLOW + Lang.get("questEditorNPCStart"); } else { return ChatColor.GRAY + Lang.get("questEditorNPCStart"); @@ -150,7 +150,7 @@ public class QuestMainPrompt extends QuestsEditorNumericPrompt { return ChatColor.GRAY + Lang.get("questWGSetRegion"); } case 7: - if (plugin.getDependencies().getCitizens() != null) { + if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcs() != null) { return ChatColor.YELLOW + Lang.get("questEditorSetGUI"); } else { return ChatColor.GRAY + Lang.get("questEditorSetGUI"); @@ -193,13 +193,14 @@ public class QuestMainPrompt extends QuestsEditorNumericPrompt { return ChatColor.GRAY + "(" + ChatColor.AQUA + context.getSessionData(CK.Q_FINISH_MESSAGE) + ChatColor.RESET + ChatColor.GRAY + ")"; case 4: - if (context.getSessionData(CK.Q_START_NPC) == null && plugin.getDependencies().getCitizens() - != null) { + if (context.getSessionData(CK.Q_START_NPC) == null && (plugin.getDependencies().getCitizens() != null + || plugin.getDependencies().getZnpcs() != null)) { return ChatColor.GRAY + "(" + Lang.get("noneSet") + ")"; - } else if (plugin.getDependencies().getCitizens() != null) { - final UUID uuid = UUID.fromString((String) Objects.requireNonNull(context.getSessionData(CK.Q_START_NPC))); - return ChatColor.GRAY + "(" + ChatColor.AQUA + CitizensAPI.getNPCRegistry().getByUniqueId(uuid) - .getName() + ChatColor.RESET + ChatColor.GRAY + ")"; + } else if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcs() != null) { + final UUID uuid = UUID.fromString((String) Objects.requireNonNull(context + .getSessionData(CK.Q_START_NPC))); + return ChatColor.GRAY + "(" + ChatColor.AQUA + plugin.getDependencies().getNPCName(uuid) + + ChatColor.RESET + ChatColor.GRAY + ")"; } else { return ChatColor.GRAY + "(" + Lang.get("notInstalled") + ")"; } @@ -225,7 +226,7 @@ public class QuestMainPrompt extends QuestsEditorNumericPrompt { return ChatColor.GRAY + "(" + Lang.get("notInstalled") + ")"; } case 7: - if (plugin.getDependencies().getCitizens() != null) { + if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcs() != null) { if (context.getSessionData(CK.Q_GUIDISPLAY) == null) { return ChatColor.GRAY + "(" + Lang.get("noneSet") + ")"; } else { @@ -269,7 +270,7 @@ public class QuestMainPrompt extends QuestsEditorNumericPrompt { case 3: return new QuestFinishMessagePrompt(context); case 4: - if (plugin.getDependencies().getCitizens() != null) { + if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcs() != null) { return new QuestNPCStartPrompt(context); } else { return new QuestMainPrompt(context); @@ -291,7 +292,7 @@ public class QuestMainPrompt extends QuestsEditorNumericPrompt { return new QuestMainPrompt(context); } case 7: - if (plugin.getDependencies().getCitizens() != null) { + if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcs() != null) { return new QuestGuiDisplayPrompt(context); } else { return new QuestMainPrompt(context); @@ -501,13 +502,11 @@ public class QuestMainPrompt extends QuestsEditorNumericPrompt { if (!input.equalsIgnoreCase(Lang.get("cmdCancel")) && !input.equalsIgnoreCase(Lang.get("cmdClear"))) { try { final UUID uuid = UUID.fromString(input); - if (plugin.getDependencies().getCitizens() != null) { - if (CitizensAPI.getNPCRegistry().getByUniqueId(uuid) == null) { - context.getForWhom().sendRawMessage(ChatColor.RED + Lang.get("questEditorInvalidNPC")); - return new QuestNPCStartPrompt(context); - } - context.setSessionData(CK.Q_START_NPC, uuid.toString()); + if (plugin.getDependencies().getNPCName(uuid) == null) { + context.getForWhom().sendRawMessage(ChatColor.RED + Lang.get("questEditorInvalidNPC")); + return new QuestNPCStartPrompt(context); } + context.setSessionData(CK.Q_START_NPC, uuid.toString()); if (context.getForWhom() instanceof Player) { final Set selectingNpcs = plugin.getQuestFactory().getSelectingNpcs(); selectingNpcs.remove(((Player) context.getForWhom()).getUniqueId()); diff --git a/core/src/main/java/me/blackvein/quests/convo/quests/objectives/NpcsPrompt.java b/core/src/main/java/me/blackvein/quests/convo/quests/objectives/NpcsPrompt.java index aeadf87d7..e0ffbb7c8 100644 --- a/core/src/main/java/me/blackvein/quests/convo/quests/objectives/NpcsPrompt.java +++ b/core/src/main/java/me/blackvein/quests/convo/quests/objectives/NpcsPrompt.java @@ -94,7 +94,7 @@ public class NpcsPrompt extends QuestsEditorNumericPrompt { public String getAdditionalText(final ConversationContext context, final int number) { switch(number) { case 1: - if (plugin.getDependencies().getCitizens() != null) { + if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcs() != null) { if (context.getSessionData(pref + CK.S_DELIVERY_ITEMS) == null) { return ChatColor.GRAY + "(" + Lang.get("noneSet") + ")"; } else { @@ -109,8 +109,7 @@ public class NpcsPrompt extends QuestsEditorNumericPrompt { .append(ItemUtil.getName(items.get(i))).append(ChatColor.GRAY).append(" x ") .append(ChatColor.AQUA).append(items.get(i).getAmount()).append(ChatColor.GRAY) .append(" ").append(Lang.get("to")).append(" ").append(ChatColor.BLUE) - .append(plugin.getDependencies().getCitizens().getNPCRegistry() - .getByUniqueId(UUID.fromString(npcs.get(i))).getName()); + .append(plugin.getDependencies().getNPCName(UUID.fromString(npcs.get(i)))); } } return text.toString(); @@ -119,7 +118,7 @@ public class NpcsPrompt extends QuestsEditorNumericPrompt { return ChatColor.GRAY + " (" + Lang.get("notInstalled") + ")"; } case 2: - if (plugin.getDependencies().getCitizens() != null) { + if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcs() != null) { if (context.getSessionData(pref + CK.S_NPCS_TO_TALK_TO) == null) { return ChatColor.GRAY + "(" + Lang.get("noneSet") + ")"; } else { @@ -129,8 +128,7 @@ public class NpcsPrompt extends QuestsEditorNumericPrompt { if (npcs != null) { for (final String npc : npcs) { text.append("\n").append(ChatColor.GRAY).append(" - ").append(ChatColor.BLUE) - .append(plugin.getDependencies().getCitizens().getNPCRegistry() - .getByUniqueId(UUID.fromString(npc)).getName()); + .append(plugin.getDependencies().getNPCName(UUID.fromString(npc))); } } return text.toString(); @@ -139,7 +137,7 @@ public class NpcsPrompt extends QuestsEditorNumericPrompt { return ChatColor.GRAY + "(" + Lang.get("notInstalled") + ")"; } case 3: - if (plugin.getDependencies().getCitizens() != null) { + if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcs() != null) { if (context.getSessionData(pref + CK.S_NPCS_TO_KILL) == null) { return ChatColor.GRAY + "(" + Lang.get("noneSet") + ")"; } else { @@ -151,9 +149,8 @@ public class NpcsPrompt extends QuestsEditorNumericPrompt { if (npcs != null && amounts != null) { for (int i = 0; i < npcs.size(); i++) { text.append("\n").append(ChatColor.GRAY).append(" - ").append(ChatColor.BLUE) - .append(plugin.getDependencies().getCitizens().getNPCRegistry() - .getByUniqueId(UUID.fromString(npcs.get(i))).getName()).append(ChatColor.GRAY) - .append(" x ").append(ChatColor.AQUA).append(amounts.get(i)); + .append(plugin.getDependencies().getNPCName(UUID.fromString(npcs.get(i)))) + .append(ChatColor.GRAY).append(" x ").append(ChatColor.AQUA).append(amounts.get(i)); } } return text.toString(); @@ -191,21 +188,21 @@ public class NpcsPrompt extends QuestsEditorNumericPrompt { protected Prompt acceptValidatedInput(final @NotNull ConversationContext context, final Number input) { switch(input.intValue()) { case 1: - if (plugin.getDependencies().getCitizens() != null) { + if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcs() != null) { return new NpcsDeliveryListPrompt(context); } else { context.getForWhom().sendRawMessage(ChatColor.RED + Lang.get("stageEditorNoCitizens")); return new StageMainPrompt(stageNum, context); } case 2: - if (plugin.getDependencies().getCitizens() != null) { + if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcs() != null) { return new NpcsIdsToTalkToPrompt(context); } else { context.getForWhom().sendRawMessage(ChatColor.RED + Lang.get("stageEditorNoCitizens")); return new StageMainPrompt(stageNum, context); } case 3: - if (plugin.getDependencies().getCitizens() != null) { + if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcs() != null) { return new NpcsKillListPrompt(context); } else { context.getForWhom().sendRawMessage(ChatColor.RED + Lang.get("stageEditorNoCitizens")); @@ -304,9 +301,8 @@ public class NpcsPrompt extends QuestsEditorNumericPrompt { for (final String s : deliveryNpcs) { final UUID uuid = UUID.fromString(s); text.append("\n").append(ChatColor.GRAY).append(" - ").append(ChatColor.AQUA) - .append(plugin.getDependencies().getCitizens().getNPCRegistry().getByUniqueId(uuid) - .getName()).append(ChatColor.GRAY).append(" (").append(ChatColor.BLUE).append(s) - .append(ChatColor.GRAY).append(")"); + .append(plugin.getDependencies().getNPCName(uuid)).append(ChatColor.GRAY) + .append(" (").append(ChatColor.BLUE).append(s).append(ChatColor.GRAY).append(")"); } } return text.toString(); @@ -464,8 +460,7 @@ public class NpcsPrompt extends QuestsEditorNumericPrompt { for (final String s : args) { try { final UUID uuid = UUID.fromString(s); - if (plugin.getDependencies().getCitizens().getNPCRegistry().getByUniqueId(uuid) != null - && npcs != null) { + if (plugin.getDependencies().getNPCName(uuid) != null && npcs != null) { npcs.add(uuid.toString()); } else { context.getForWhom().sendRawMessage(ChatColor.LIGHT_PURPLE + "" + uuid + ChatColor.RED + " " @@ -583,8 +578,7 @@ public class NpcsPrompt extends QuestsEditorNumericPrompt { for (final String s : args) { try { final UUID uuid = UUID.fromString(s); - if (plugin.getDependencies().getCitizens().getNPCRegistry().getByUniqueId(uuid) != null - && npcs != null) { + if (plugin.getDependencies().getNPCName(uuid) != null && npcs != null) { npcs.add(uuid.toString()); } else { context.getForWhom().sendRawMessage(ChatColor.LIGHT_PURPLE + "" + uuid + ChatColor.RED + " " @@ -664,7 +658,7 @@ public class NpcsPrompt extends QuestsEditorNumericPrompt { public String getAdditionalText(final ConversationContext context, final int number) { switch(number) { case 1: - if (plugin.getDependencies().getCitizens() != null) { + if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcs() != null) { if (context.getSessionData(pref + CK.S_NPCS_TO_KILL) == null) { return ChatColor.GRAY + "(" + Lang.get("noneSet") + ")"; } else { @@ -673,9 +667,9 @@ public class NpcsPrompt extends QuestsEditorNumericPrompt { if (npcsToKill != null) { for (final String s : npcsToKill) { text.append("\n").append(ChatColor.GRAY).append(" - ").append(ChatColor.BLUE) - .append(plugin.getDependencies().getCitizens().getNPCRegistry() - .getByUniqueId(UUID.fromString(s)).getName()).append(ChatColor.GRAY).append(" (") - .append(ChatColor.AQUA).append(s).append(ChatColor.GRAY).append(")"); + .append(plugin.getDependencies().getNPCName(UUID.fromString(s))) + .append(ChatColor.GRAY).append(" (").append(ChatColor.AQUA).append(s) + .append(ChatColor.GRAY).append(")"); } } return text.toString(); @@ -810,8 +804,7 @@ public class NpcsPrompt extends QuestsEditorNumericPrompt { for (final String s : args) { try { final UUID uuid = UUID.fromString(s); - if (plugin.getDependencies().getCitizens().getNPCRegistry().getByUniqueId(uuid) != null - && npcs != null) { + if (plugin.getDependencies().getNPCName(uuid) != null && npcs != null) { npcs.add(uuid.toString()); } else { context.getForWhom().sendRawMessage(ChatColor.LIGHT_PURPLE + "" + uuid + ChatColor.RED + " " diff --git a/core/src/main/java/me/blackvein/quests/listeners/NpcListener.java b/core/src/main/java/me/blackvein/quests/listeners/CitizensListener.java similarity index 98% rename from core/src/main/java/me/blackvein/quests/listeners/NpcListener.java rename to core/src/main/java/me/blackvein/quests/listeners/CitizensListener.java index 222affd52..9569b4b71 100644 --- a/core/src/main/java/me/blackvein/quests/listeners/NpcListener.java +++ b/core/src/main/java/me/blackvein/quests/listeners/CitizensListener.java @@ -44,11 +44,11 @@ import java.util.Map.Entry; import java.util.Set; import java.util.UUID; -public class NpcListener implements Listener { +public class CitizensListener implements Listener { private final Quests plugin; - public NpcListener(final Quests plugin) { + public CitizensListener(final Quests plugin) { this.plugin = plugin; } @@ -214,7 +214,7 @@ public class NpcListener implements Listener { if (quester.getCurrentQuestsTemp().containsKey(q)) { continue; } - if (q.getNpcStart() != null && q.getNpcStart().getId() == evt.getNPC().getId()) { + if (q.getNpcStart() != null && q.getNpcStart().equals(evt.getNPC().getUniqueId())) { if (plugin.getSettings().canIgnoreLockedQuests() && (!quester.getCompletedQuestsTemp().contains(q) || q.getPlanner().getCooldown() > -1)) { diff --git a/core/src/main/java/me/blackvein/quests/listeners/ZnpcsListener.java b/core/src/main/java/me/blackvein/quests/listeners/ZnpcsListener.java new file mode 100644 index 000000000..e4e594268 --- /dev/null +++ b/core/src/main/java/me/blackvein/quests/listeners/ZnpcsListener.java @@ -0,0 +1,264 @@ +package me.blackvein.quests.listeners; + +import io.github.znetworkw.znpcservers.npc.NPC; +import io.github.znetworkw.znpcservers.npc.event.NPCInteractEvent; +import me.blackvein.quests.Quests; +import me.blackvein.quests.enums.ObjectiveType; +import me.blackvein.quests.player.IQuester; +import me.blackvein.quests.quests.IQuest; +import me.blackvein.quests.util.ItemUtil; +import me.blackvein.quests.util.Lang; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.conversations.Conversation; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.EnchantmentStorageMeta; + +import java.text.MessageFormat; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Map; +import java.util.UUID; + +public class ZnpcsListener implements Listener { + + private final Quests plugin; + + public ZnpcsListener(final Quests plugin) { + this.plugin = plugin; + } + + @EventHandler + public void onNPCInteract(final NPCInteractEvent evt) { + if (evt.isLeftClick()) { + if (plugin.getDependencies().getZnpcs() == null) { + return; + } + if (plugin.getQuestFactory().getSelectingNpcs().contains(evt.getPlayer().getUniqueId())) { + if (evt.getNpc() == null) { + plugin.getLogger().severe("ZNPC was null while selecting by left-click"); + return; + } + evt.getPlayer().acceptConversationInput(String.valueOf(evt.getNpc().getUUID())); + } + } else if (evt.isRightClick()) { + if (plugin.getDependencies().getCitizens() == null) { + return; + } + if (plugin.getQuestFactory().getSelectingNpcs().contains(evt.getPlayer().getUniqueId())) { + if (evt.getNpc() == null) { + plugin.getLogger().severe("ZNPC was null while selecting by right-click"); + return; + } + evt.getPlayer().acceptConversationInput(String.valueOf(evt.getNpc().getUUID())); + } + if (!evt.getPlayer().isConversing()) { + final Player player = evt.getPlayer(); + final IQuester quester = plugin.getQuester(player.getUniqueId()); + for (final IQuest quest : quester.getCurrentQuestsTemp().keySet()) { + if (quester.getCurrentStage(quest).containsObjective(ObjectiveType.DELIVER_ITEM)) { + final ItemStack hand = player.getItemInHand(); + int currentIndex = -1; + final LinkedList matches = new LinkedList<>(); + int reasonCode = 0; + for (final ItemStack is : quester.getCurrentStage(quest).getItemsToDeliver()) { + currentIndex++; + reasonCode = ItemUtil.compareItems(is, hand, true); + if (reasonCode == 0) { + matches.add(currentIndex); + } + } + final NPC clicked = evt.getNpc(); + if (!matches.isEmpty()) { + for (final Integer match : matches) { + final UUID uuid = quester.getCurrentStage(quest).getItemDeliveryTargets().get(match); + if (uuid.equals(clicked.getUUID())) { + quester.deliverToNPC(quest, uuid, hand); + return; + } + } + } else if (!hand.getType().equals(Material.AIR)) { + for (final UUID uuid : quester.getCurrentStage(quest).getItemDeliveryTargets()) { + if (uuid.equals(clicked.getUUID())) { + String text = ""; + final boolean hasMeta = hand.getItemMeta() != null; + if (hasMeta) { + text += ChatColor.LIGHT_PURPLE + "" + ChatColor.ITALIC + + (hand.getItemMeta().hasDisplayName() ? hand.getItemMeta().getDisplayName() + + ChatColor.GRAY + " (" : ""); + } + text += ChatColor.AQUA + "" + (hand.getDurability() != 0 ? (":" + ChatColor.BLUE + + hand.getDurability()) : "") + ChatColor.GRAY; + if (hasMeta) { + text += (hand.getItemMeta().hasDisplayName() ? ")" : ""); + } + text += " x " + ChatColor.DARK_AQUA + hand.getAmount() + ChatColor.GRAY; + if (plugin.getSettings().canTranslateNames() && !hasMeta + && !hand.getItemMeta().hasDisplayName()) { + plugin.getLocaleManager().sendMessage(player, Lang + .get(player, "questInvalidDeliveryItem").replace("", text), hand + .getType(), hand.getDurability(), null); + } else { + player.sendMessage(Lang.get(player, "questInvalidDeliveryItem") + .replace("", text).replace("", ItemUtil.getName(hand))); + } + switch (reasonCode) { + case 1: + player.sendMessage(ChatColor.GRAY + Lang.get(player, "difference") + .replace("", "one item is null")); + break; + case 0: + player.sendMessage(ChatColor.GRAY + Lang.get(player, "difference") + .replace("", "ERROR")); + break; + case -1: + player.sendMessage(ChatColor.GRAY + Lang.get(player, "difference") + .replace("", "name")); + break; + case -2: + player.sendMessage(ChatColor.GRAY + Lang.get(player, "difference") + .replace("", "amount")); + break; + case -3: + player.sendMessage(ChatColor.GRAY + Lang.get(player, "difference") + .replace("", "durability")); + break; + case -4: + player.sendMessage(ChatColor.GRAY + Lang.get(player, "difference") + .replace("", "display name or lore")); + break; + case -5: + player.sendMessage(ChatColor.GRAY + Lang.get(player, "difference") + .replace("", "enchantments")); + break; + case -6: + player.sendMessage(ChatColor.GRAY + Lang.get(player, "difference") + .replace("", "stored enchants")); + break; + case -7: + player.sendMessage(ChatColor.GRAY + Lang.get(player, "difference") + .replace("", "item flags")); + break; + case -8: + player.sendMessage(ChatColor.GRAY + Lang.get(player, "difference") + .replace("", "book data")); + break; + case -9: + player.sendMessage(ChatColor.GRAY + Lang.get(player, "difference") + .replace("", "potion type")); + break; + case -10: + player.sendMessage(ChatColor.GRAY + Lang.get(player, "difference") + .replace("", "fish variant")); + break; + default: + player.sendMessage(ChatColor.GRAY + Lang.get(player, "difference") + .replace("", "unknown")); + } + if (hasMeta) { + if (hand.getType().equals(Material.ENCHANTED_BOOK)) { + final EnchantmentStorageMeta esMeta = (EnchantmentStorageMeta) hand.getItemMeta(); + if (esMeta.hasStoredEnchants()) { + for (final Map.Entry e : esMeta.getStoredEnchants() + .entrySet()) { + final HashMap single = new HashMap<>(); + single.put(e.getKey(), e.getValue()); + plugin.getLocaleManager().sendMessage(player, ChatColor.GRAY + "\u2515 " + + ChatColor.DARK_GREEN + " \n", single); + } + } + } + } + break; + } + } + } + } + } + boolean hasObjective = false; + for (final IQuest quest : quester.getCurrentQuestsTemp().keySet()) { + if (!quester.meetsCondition(quest, true)) { + continue; + } + if (quester.getCurrentStage(quest).containsObjective(ObjectiveType.TALK_TO_NPC)) { + if (quester.getCurrentStage(quest).getNpcsToInteract().contains(evt.getNpc().getUUID())) { + final int npcIndex = quester.getCurrentStage(quest).getNpcsToInteract().indexOf(evt.getNpc() + .getUUID()); + if (quester.getQuestData(quest) != null && npcIndex > -1 + && !quester.getQuestData(quest).npcsInteracted.get(npcIndex)) { + hasObjective = true; + } + quester.interactWithNPC(quest, evt.getNpc().getUUID()); + } + } + } + if (hasObjective || !plugin.getQuestNpcUuids().contains(evt.getNpc().getUUID())) { + return; + } + boolean hasAtLeastOneGUI = false; + final LinkedList npcQuests = new LinkedList<>(); + for (final IQuest q : plugin.getLoadedQuests()) { + if (quester.getCurrentQuestsTemp().containsKey(q)) { + continue; + } + if (q.getNpcStart() != null && q.getNpcStart().equals(evt.getNpc().getUUID())) { + if (plugin.getSettings().canIgnoreLockedQuests() + && (!quester.getCompletedQuestsTemp().contains(q) + || q.getPlanner().getCooldown() > -1)) { + if (q.testRequirements(quester)) { + npcQuests.add(q); + if (q.getGUIDisplay() != null) { + hasAtLeastOneGUI = true; + } + } + } else if (!quester.getCompletedQuestsTemp().contains(q) || q.getPlanner().getCooldown() > -1) { + npcQuests.add(q); + if (q.getGUIDisplay() != null) { + hasAtLeastOneGUI = true; + } + } + } + } + if (npcQuests.size() == 1) { + final IQuest q = npcQuests.get(0); + if (quester.canAcceptOffer(q, true)) { + quester.setQuestIdToTake(q.getId()); + if (!plugin.getSettings().canAskConfirmation()) { + quester.takeQuest(q, false); + } else { + if (q.getGUIDisplay() != null) { + quester.showGUIDisplay(evt.getNpc().getUUID(), npcQuests); + } else { + for (final String msg : extracted(quester).split("
")) { + player.sendMessage(msg); + } + plugin.getConversationFactory().buildConversation(player).begin(); + } + } + } + } else if (npcQuests.size() > 1) { + if (hasAtLeastOneGUI) { + quester.showGUIDisplay(evt.getNpc().getUUID(), npcQuests); + } else { + final Conversation c = plugin.getNpcConversationFactory().buildConversation(player); + c.getContext().setSessionData("npcQuests", npcQuests); + c.getContext().setSessionData("npc", evt.getNpc().getGameProfile().getName()); + c.begin(); + } + } else { + Lang.send(player, ChatColor.YELLOW + Lang.get(player, "noMoreQuest")); + } + } + } + } + + private String extracted(final IQuester quester) { + final IQuest quest = plugin.getQuestByIdTemp(quester.getQuestIdToTake()); + return MessageFormat.format("{0}- {1}{2}{3} -\n\n{4}{5}\n", ChatColor.GOLD, ChatColor.DARK_PURPLE, + quest.getName(), ChatColor.GOLD, ChatColor.RESET, quest.getDescription()); + } +} diff --git a/core/src/main/java/me/blackvein/quests/quests/BukkitQuestFactory.java b/core/src/main/java/me/blackvein/quests/quests/BukkitQuestFactory.java index 24afa62e5..293d77b6a 100644 --- a/core/src/main/java/me/blackvein/quests/quests/BukkitQuestFactory.java +++ b/core/src/main/java/me/blackvein/quests/quests/BukkitQuestFactory.java @@ -152,7 +152,7 @@ public class BukkitQuestFactory implements QuestFactory, ConversationAbandonedLi context.setSessionData(CK.Q_FINISH_MESSAGE, q.getFinished()); if (plugin.getDependencies().getCitizens() != null) { if (q.getNpcStart() != null) { - context.setSessionData(CK.Q_START_NPC, q.getNpcStart().getUniqueId().toString()); + context.setSessionData(CK.Q_START_NPC, q.getNpcStart().toString()); } } context.setSessionData(CK.Q_START_BLOCK, q.getBlockStart()); diff --git a/core/src/main/java/me/blackvein/quests/util/ConfigUtil.java b/core/src/main/java/me/blackvein/quests/util/ConfigUtil.java index 77d3da2f5..6354c1178 100644 --- a/core/src/main/java/me/blackvein/quests/util/ConfigUtil.java +++ b/core/src/main/java/me/blackvein/quests/util/ConfigUtil.java @@ -105,7 +105,7 @@ public class ConfigUtil { String parsed = parseString(s); if (parsed.contains("")) { if (quest.getNpcStart() != null) { - parsed = parsed.replace("", quest.getNpcStart().getName()); + parsed = parsed.replace("", quest.getNpcStartName()); } else { Bukkit.getLogger().warning(quest.getName() + " quest uses tag but doesn't have an NPC start set"); } @@ -120,7 +120,7 @@ public class ConfigUtil { String parsed = parseString(s); if (parsed.contains("")) { if (quest.getNpcStart() != null) { - parsed = parsed.replace("", quest.getNpcStart().getName()); + parsed = parsed.replace("", quest.getNpcStartName()); } else { Bukkit.getLogger().warning(quest.getName() + " quest uses tag but doesn't have an NPC start set"); } @@ -143,7 +143,7 @@ public class ConfigUtil { String parsed = parseString(s); if (parsed.contains("")) { if (quest.getNpcStart() != null) { - parsed = parsed.replace("", quest.getNpcStart().getName()); + parsed = parsed.replace("", quest.getNpcStartName()); } else { Bukkit.getLogger().warning(quest.getName() + " quest uses tag but doesn't have an NPC start set"); }