General API for NPC support (#2320)

* prepare for a generic NpcDependency

* buildable NpcDependency

* add EntityNpcDependency

* hasNpc -> isNpc

* apply EntityNpcDependency at some places

* add FancyNpcs support

* fix null check in ZnpcsPlusDependency

* fire ZnpcsPlus interact event synchronously

* comment on why to runTask on ZnpcsPlusListener

* add kill NPC event for Citizens

* small refactor in onNpcInteract

* add LegacyZnpcsPlusDependency

* remove FancyNpcs

better make a separated addon

* remove FancyNpcs from softdepend
This commit is contained in:
Huynh Tien 2025-01-17 09:06:39 +07:00 committed by GitHub
parent d643ab1ebf
commit c52227042f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
28 changed files with 732 additions and 1245 deletions

View File

@ -47,7 +47,7 @@
<repository>
<!-- PlaceholderAPI -->
<id>papi-repo</id>
<url>https://repo.extendedclip.com/releases</url>
<url>https://repo.extendedclip.com/releases/</url>
</repository>
<repository>
<!-- Heroes, Vault -->

View File

@ -23,16 +23,7 @@ import me.pikamug.quests.convo.misc.QuestAcceptPrompt;
import me.pikamug.quests.dependencies.BukkitDenizenTrigger;
import me.pikamug.quests.dependencies.BukkitDependencies;
import me.pikamug.quests.interfaces.ReloadCallback;
import me.pikamug.quests.listeners.BukkitBlockListener;
import me.pikamug.quests.listeners.BukkitCitizensListener;
import me.pikamug.quests.listeners.BukkitCommandManager;
import me.pikamug.quests.listeners.BukkitConvoListener;
import me.pikamug.quests.listeners.BukkitItemListener;
import me.pikamug.quests.listeners.BukkitPartiesListener;
import me.pikamug.quests.listeners.BukkitPlayerListener;
import me.pikamug.quests.listeners.BukkitUniteListener;
import me.pikamug.quests.listeners.BukkitZnpcsApiListener;
import me.pikamug.quests.listeners.BukkitZnpcsListener;
import me.pikamug.quests.listeners.*;
import me.pikamug.quests.logging.BukkitQuestsLog4JFilter;
import me.pikamug.quests.module.CustomObjective;
import me.pikamug.quests.module.CustomRequirement;
@ -68,18 +59,9 @@ import org.bukkit.permissions.Permission;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.*;
import java.net.URISyntaxException;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
import java.util.*;
import java.util.concurrent.ConcurrentSkipListSet;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -111,9 +93,6 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests {
private BukkitConvoListener convoListener;
private BukkitBlockListener blockListener;
private BukkitItemListener itemListener;
private BukkitCitizensListener citizensListener;
private BukkitZnpcsListener znpcsListener;
private BukkitZnpcsApiListener znpcsPlusListener;
private BukkitPlayerListener playerListener;
private BukkitNpcEffectThread effectThread;
private BukkitPlayerMoveThread moveThread;
@ -152,9 +131,6 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests {
convoListener = new BukkitConvoListener();
blockListener = new BukkitBlockListener(this);
itemListener = new BukkitItemListener(this);
citizensListener = new BukkitCitizensListener(this);
znpcsListener = new BukkitZnpcsListener(this);
znpcsPlusListener = new BukkitZnpcsApiListener(this);
playerListener = new BukkitPlayerListener(this);
uniteListener = new BukkitUniteListener();
partiesListener = new BukkitPartiesListener();
@ -238,11 +214,6 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests {
// 11 - Register listeners
getServer().getPluginManager().registerEvents(getBlockListener(), this);
getServer().getPluginManager().registerEvents(getItemListener(), this);
depends.linkCitizens();
if (depends.getZnpcsPlus() != null) {
getServer().getPluginManager().registerEvents(getZnpcsListener(), this);
}
depends.linkZnpcsPlusApi();
getServer().getPluginManager().registerEvents(getPlayerListener(), this);
if (configSettings.getStrictPlayerMovement() > 0) {
final long ticks = configSettings.getStrictPlayerMovement() * 20L;
@ -430,10 +401,8 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests {
}
}
final BukkitQuester quester = new BukkitQuester(this, id);
if (depends.getCitizens() != null) {
if (depends.getCitizens().getNPCRegistry().getByUniqueId(id) != null) {
return quester;
}
if (depends.isNpc(id)) {
return quester;
}
final BukkitQuester q = new BukkitQuester(this, id);
questers.add(q);
@ -535,18 +504,6 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests {
return itemListener;
}
public BukkitCitizensListener getCitizensListener() {
return citizensListener;
}
public BukkitZnpcsListener getZnpcsListener() {
return znpcsListener;
}
public BukkitZnpcsApiListener getZNpcsPlusListener() {
return znpcsPlusListener;
}
public BukkitPlayerListener getPlayerListener() {
return playerListener;
}
@ -677,20 +634,6 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests {
quester.findCompassTarget();
questers.add(quester);
}
if (depends.getCitizens() != null) {
if (depends.getCitizens().getNPCRegistry() == null) {
getLogger().log(Level.SEVERE,
"Citizens was enabled but NPCRegistry was null. Disabling linkage.");
depends.unlinkCitizens();
}
}
if (depends.getZnpcsPlusApi() != null) {
if (depends.getZnpcsPlusApi().getNpcRegistry() == null) {
getLogger().log(Level.SEVERE,
"ZNPCsPlus was enabled but NpcRegistry was null. Disabling linkage.");
depends.unlinkZnpcsPlusApi();
}
}
customLoader.init();
questLoader.importQuests();
if (getConfigSettings().canDisableCommandFeedback()) {

View File

@ -10,12 +10,12 @@
package me.pikamug.quests.conditions;
import me.clip.placeholderapi.PlaceholderAPI;
import me.pikamug.quests.BukkitQuestsPlugin;
import me.pikamug.quests.player.Quester;
import me.pikamug.quests.quests.Quest;
import me.pikamug.quests.util.BukkitItemUtil;
import me.pikamug.quests.util.BukkitMiscUtil;
import me.clip.placeholderapi.PlaceholderAPI;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
@ -214,15 +214,14 @@ public class BukkitCondition implements Condition {
} else if (!npcsWhileRiding.isEmpty()) {
boolean atLeastOne = false;
for (final UUID n : npcsWhileRiding) {
if (plugin.getDependencies().getCitizens() == null) {
plugin.getLogger().warning("Citizens must be installed for condition ride NPC UUID " + n);
if (!plugin.getDependencies().hasAnyEntityNpcDependencies()) {
plugin.getLogger().warning("An Entity NPC plugin must be installed for condition ride NPC UUID " + n);
return false;
}
if (player.getVehicle() == null) {
return false;
}
if (player.getVehicle().equals(plugin.getDependencies().getCitizens().getNPCRegistry().getByUniqueId(n)
.getEntity())) {
if (player.getVehicle().equals(plugin.getDependencies().getNpcEntity(n))) {
atLeastOne = true;
break;
}

View File

@ -27,11 +27,7 @@ import org.bukkit.entity.Player;
import org.bukkit.entity.Vehicle;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
import java.util.*;
import java.util.concurrent.ConcurrentSkipListSet;
public class ConditionEntityPrompt extends ConditionsEditorNumericPrompt {
@ -101,7 +97,7 @@ public class ConditionEntityPrompt extends ConditionsEditorNumericPrompt {
return text.toString();
}
case 2:
if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null || plugin.getDependencies().getZnpcsPlusApi() != null) {
if (plugin.getDependencies().hasAnyNpcDependencies()) {
if (context.getSessionData(Key.C_WHILE_RIDING_NPC) == null) {
return ChatColor.GRAY + "(" + BukkitLang.get("noneSet") + ")";
} else {
@ -275,10 +271,7 @@ public class ConditionEntityPrompt extends ConditionsEditorNumericPrompt {
for (final String s : input.split(" ")) {
try {
final UUID uuid = UUID.fromString(s);
if (plugin.getDependencies().getNpcEntity(uuid) != null && npcs != null) {
npcs.add(uuid.toString());
} else if (plugin.getDependencies().getZnpcsPlusApi() != null && npcs!= null
&& plugin.getDependencies().getZnpcsPlusApi().getNpcRegistry().getByUuid(uuid) != null) {
if (npcs != null && plugin.getDependencies().isNpc(uuid)) {
npcs.add(uuid.toString());
} else {
context.getForWhom().sendRawMessage(ChatColor.RED + BukkitLang.get("stageEditorInvalidNPC")

View File

@ -45,11 +45,7 @@ import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentSkipListSet;
@ -108,7 +104,7 @@ public class QuestMainPrompt extends QuestsEditorNumericPrompt {
return ChatColor.GRAY;
}
case 7:
if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null || plugin.getDependencies().getZnpcsPlusApi() != null) {
if (plugin.getDependencies().hasAnyNpcDependencies()) {
return ChatColor.BLUE;
} else {
return ChatColor.GRAY;
@ -132,8 +128,7 @@ public class QuestMainPrompt extends QuestsEditorNumericPrompt {
case 3:
return ChatColor.YELLOW + BukkitLang.get("questEditorFinishMessage");
case 4:
if (context.getSessionData(Key.Q_START_NPC) == null || plugin.getDependencies().getCitizens() != null
|| plugin.getDependencies().getZnpcsPlus() != null || plugin.getDependencies().getZnpcsPlusApi() != null) {
if (context.getSessionData(Key.Q_START_NPC) == null || plugin.getDependencies().hasAnyNpcDependencies()) {
return ChatColor.YELLOW + BukkitLang.get("questEditorNPCStart");
} else {
return ChatColor.GRAY + BukkitLang.get("questEditorNPCStart");
@ -151,7 +146,7 @@ public class QuestMainPrompt extends QuestsEditorNumericPrompt {
return ChatColor.GRAY + BukkitLang.get("questWGSetRegion");
}
case 7:
if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null || plugin.getDependencies().getZnpcsPlusApi() != null) {
if (plugin.getDependencies().hasAnyNpcDependencies()) {
return ChatColor.YELLOW + BukkitLang.get("questEditorSetGUI");
} else {
return ChatColor.GRAY + BukkitLang.get("questEditorSetGUI");
@ -194,10 +189,9 @@ public class QuestMainPrompt extends QuestsEditorNumericPrompt {
return ChatColor.GRAY + "(" + ChatColor.AQUA + context.getSessionData(Key.Q_FINISH_MESSAGE)
+ ChatColor.RESET + ChatColor.GRAY + ")";
case 4:
if (context.getSessionData(Key.Q_START_NPC) == null && (plugin.getDependencies().getCitizens() != null
|| plugin.getDependencies().getZnpcsPlus() != null || plugin.getDependencies().getZnpcsPlusApi() != null)) {
if (context.getSessionData(Key.Q_START_NPC) == null && plugin.getDependencies().hasAnyNpcDependencies()) {
return ChatColor.GRAY + "(" + BukkitLang.get("noneSet") + ")";
} else if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null || plugin.getDependencies().getZnpcsPlusApi() != null) {
} else if (plugin.getDependencies().hasAnyNpcDependencies()) {
final UUID uuid = UUID.fromString((String) Objects.requireNonNull(context
.getSessionData(Key.Q_START_NPC)));
return ChatColor.GRAY + "(" + ChatColor.AQUA + plugin.getDependencies().getNpcName(uuid)
@ -227,7 +221,7 @@ public class QuestMainPrompt extends QuestsEditorNumericPrompt {
return ChatColor.GRAY + "(" + BukkitLang.get("notInstalled") + ")";
}
case 7:
if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null || plugin.getDependencies().getZnpcsPlusApi() != null) {
if (plugin.getDependencies().hasAnyNpcDependencies()) {
if (context.getSessionData(Key.Q_GUIDISPLAY) == null) {
return ChatColor.GRAY + "(" + BukkitLang.get("noneSet") + ")";
} else {
@ -271,8 +265,7 @@ public class QuestMainPrompt extends QuestsEditorNumericPrompt {
case 3:
return new QuestFinishMessagePrompt(context);
case 4:
if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null
|| plugin.getDependencies().getZnpcsPlusApi() != null) {
if (plugin.getDependencies().hasAnyNpcDependencies()) {
return new QuestNPCStartPrompt(context);
} else {
return new QuestMainPrompt(context);
@ -295,8 +288,7 @@ public class QuestMainPrompt extends QuestsEditorNumericPrompt {
return new QuestMainPrompt(context);
}
case 7:
if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null
|| plugin.getDependencies().getZnpcsPlusApi() != null) {
if (plugin.getDependencies().hasAnyNpcDependencies()) {
return new QuestGuiDisplayPrompt(context);
} else {
return new QuestMainPrompt(context);
@ -507,8 +499,7 @@ public class QuestMainPrompt extends QuestsEditorNumericPrompt {
if (!input.equalsIgnoreCase(BukkitLang.get("cmdCancel")) && !input.equalsIgnoreCase(BukkitLang.get("cmdClear"))) {
try {
final UUID uuid = UUID.fromString(input);
if (plugin.getDependencies().getNpcEntity(uuid) == null && (plugin.getDependencies().getZnpcsPlusApi() == null
|| plugin.getDependencies().getZnpcsPlusApi().getNpcRegistry().getByUuid(uuid) == null)) {
if (!plugin.getDependencies().isNpc(uuid)) {
context.getForWhom().sendRawMessage(ChatColor.RED + BukkitLang.get("stageEditorInvalidNPC")
.replace("<input>", input));
return new QuestNPCStartPrompt(context);

View File

@ -93,7 +93,7 @@ public class QuestNpcsPrompt extends QuestsEditorNumericPrompt {
public String getAdditionalText(final ConversationContext context, final int number) {
switch(number) {
case 1:
if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null || plugin.getDependencies().getZnpcsPlusApi() != null) {
if (plugin.getDependencies().hasAnyNpcDependencies()) {
if (context.getSessionData(pref + Key.S_DELIVERY_ITEMS) == null) {
return ChatColor.GRAY + "(" + BukkitLang.get("noneSet") + ")";
} else {
@ -117,7 +117,7 @@ public class QuestNpcsPrompt extends QuestsEditorNumericPrompt {
return ChatColor.GRAY + " (" + BukkitLang.get("notInstalled") + ")";
}
case 2:
if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null || plugin.getDependencies().getZnpcsPlusApi() != null) {
if (plugin.getDependencies().hasAnyNpcDependencies()) {
if (context.getSessionData(pref + Key.S_NPCS_TO_TALK_TO) == null) {
return ChatColor.GRAY + "(" + BukkitLang.get("noneSet") + ")";
} else {
@ -136,7 +136,7 @@ public class QuestNpcsPrompt extends QuestsEditorNumericPrompt {
return ChatColor.GRAY + "(" + BukkitLang.get("notInstalled") + ")";
}
case 3:
if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null || plugin.getDependencies().getZnpcsPlusApi() != null) {
if (plugin.getDependencies().hasAnyNpcDependencies()) {
if (context.getSessionData(pref + Key.S_NPCS_TO_KILL) == null) {
return ChatColor.GRAY + "(" + BukkitLang.get("noneSet") + ")";
} else {
@ -185,21 +185,21 @@ public class QuestNpcsPrompt extends QuestsEditorNumericPrompt {
protected Prompt acceptValidatedInput(final @NotNull ConversationContext context, final Number input) {
switch(input.intValue()) {
case 1:
if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null || plugin.getDependencies().getZnpcsPlusApi() != null) {
if (plugin.getDependencies().hasAnyNpcDependencies()) {
return new QuestNpcsDeliveryListPrompt(context);
} else {
context.getForWhom().sendRawMessage(ChatColor.RED + BukkitLang.get("stageEditorNoCitizens"));
return new QuestStageMainPrompt(stageNum, context);
}
case 2:
if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null || plugin.getDependencies().getZnpcsPlusApi() != null) {
if (plugin.getDependencies().hasAnyNpcDependencies()) {
return new QuestNpcsIdsToTalkToPrompt(context);
} else {
context.getForWhom().sendRawMessage(ChatColor.RED + BukkitLang.get("stageEditorNoCitizens"));
return new QuestStageMainPrompt(stageNum, context);
}
case 3:
if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null || plugin.getDependencies().getZnpcsPlusApi() != null) {
if (plugin.getDependencies().hasAnyNpcDependencies()) {
return new QuestNpcsKillListPrompt(context);
} else {
context.getForWhom().sendRawMessage(ChatColor.RED + BukkitLang.get("stageEditorNoCitizens"));
@ -453,10 +453,7 @@ public class QuestNpcsPrompt extends QuestsEditorNumericPrompt {
for (final String s : input.split(" ")) {
try {
final UUID uuid = UUID.fromString(s);
if (plugin.getDependencies().getNpcEntity(uuid) != null && npcs != null) {
npcs.add(uuid.toString());
} else if (plugin.getDependencies().getZnpcsPlusApi() != null && npcs!= null
&& plugin.getDependencies().getZnpcsPlusApi().getNpcRegistry().getByUuid(uuid) != null) {
if (npcs != null && plugin.getDependencies().isNpc(uuid)) {
npcs.add(uuid.toString());
} else {
context.getForWhom().sendRawMessage(ChatColor.RED + BukkitLang.get("stageEditorInvalidNPC")
@ -575,10 +572,7 @@ public class QuestNpcsPrompt extends QuestsEditorNumericPrompt {
for (final String s : args) {
try {
final UUID uuid = UUID.fromString(s);
if (plugin.getDependencies().getNpcEntity(uuid) != null && npcs != null) {
npcs.add(uuid.toString());
} else if (plugin.getDependencies().getZnpcsPlusApi() != null && npcs!= null
&& plugin.getDependencies().getZnpcsPlusApi().getNpcRegistry().getByUuid(uuid) != null) {
if (npcs != null && plugin.getDependencies().isNpc(uuid)) {
npcs.add(uuid.toString());
} else {
context.getForWhom().sendRawMessage(ChatColor.RED + BukkitLang.get("stageEditorInvalidNPC")
@ -658,8 +652,7 @@ public class QuestNpcsPrompt extends QuestsEditorNumericPrompt {
public String getAdditionalText(final ConversationContext context, final int number) {
switch(number) {
case 1:
if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null
|| plugin.getDependencies().getZnpcsPlusApi() != null) {
if (plugin.getDependencies().hasAnyNpcDependencies()) {
if (context.getSessionData(pref + Key.S_NPCS_TO_KILL) == null) {
return ChatColor.GRAY + "(" + BukkitLang.get("noneSet") + ")";
} else {
@ -801,10 +794,7 @@ public class QuestNpcsPrompt extends QuestsEditorNumericPrompt {
for (final String s : args) {
try {
final UUID uuid = UUID.fromString(s);
if (plugin.getDependencies().getNpcEntity(uuid) != null && npcs != null) {
npcs.add(uuid.toString());
} else if (plugin.getDependencies().getZnpcsPlusApi() != null && npcs!= null
&& plugin.getDependencies().getZnpcsPlusApi().getNpcRegistry().getByUuid(uuid) != null) {
if (npcs != null && plugin.getDependencies().isNpc(uuid)) {
npcs.add(uuid.toString());
} else {
context.getForWhom().sendRawMessage(ChatColor.RED + BukkitLang.get("stageEditorInvalidNPC")

View File

@ -11,6 +11,7 @@
package me.pikamug.quests.dependencies;
import me.pikamug.quests.BukkitQuestsPlugin;
import me.pikamug.quests.dependencies.npc.citizens.CitizensDependency;
import me.pikamug.quests.player.Quester;
import net.citizensnpcs.api.npc.NPC;
@ -28,12 +29,12 @@ public class BukkitDenizenTrigger {
return false;
}
if (plugin.getDependencies().getDenizenApi().containsScript(scriptName)) {
if (plugin.getDependencies().getCitizens() != null) {
if (plugin.getDependencies().getNpcDependency("Citizens") != null) {
if (uuid == null) {
plugin.getLogger().severe("NPC UUID was null for Denizen script named " + scriptName);
return false;
}
final NPC npc = plugin.getDependencies().getCitizens().getNPCRegistry().getByUniqueId(uuid);
final NPC npc = ((CitizensDependency) plugin.getDependencies().getNpcDependency("Citizens")).getCitizens().getNPCRegistry().getByUniqueId(uuid);
plugin.getDependencies().getDenizenApi().runTaskScript(scriptName, quester.getPlayer(), npc);
} else {
plugin.getDependencies().getDenizenApi().runTaskScript(scriptName, quester.getPlayer(), null);

View File

@ -2,9 +2,9 @@
* Copyright (c) PikaMug and contributors
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
* LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
@ -19,66 +19,60 @@ import com.gmail.nossr50.util.player.UserManager;
import com.herocraftonline.heroes.Heroes;
import com.herocraftonline.heroes.characters.Hero;
import com.herocraftonline.heroes.characters.classes.HeroClass;
import io.github.znetworkw.znpcservers.npc.NPC;
import lol.pyr.znpcsplus.ZNPCsPlus;
import lol.pyr.znpcsplus.api.NpcApi;
import lol.pyr.znpcsplus.api.NpcApiProvider;
import lol.pyr.znpcsplus.api.entity.EntityProperty;
import lol.pyr.znpcsplus.api.npc.Npc;
import me.clip.placeholderapi.PlaceholderAPIPlugin;
import me.pikamug.quests.BukkitQuestsPlugin;
import me.pikamug.quests.dependencies.npc.EntityNpcDependency;
import me.pikamug.quests.dependencies.npc.NpcDependency;
import me.pikamug.quests.dependencies.npc.citizens.CitizensDependency;
import me.pikamug.quests.dependencies.npc.znpcsplus.ZnpcsPlusDependency;
import me.pikamug.quests.dependencies.npc.znpcsplus.legacy.LegacyZnpcsPlusDependency;
import me.pikamug.quests.dependencies.reflect.denizen.DenizenAPI;
import me.pikamug.quests.dependencies.reflect.worldguard.WorldGuardAPI;
import me.pikamug.quests.listeners.BukkitCitizensListener;
import me.pikamug.quests.listeners.BukkitZnpcsApiListener;
import me.pikamug.quests.player.Quester;
import me.pikamug.quests.util.BukkitConfigUtil;
import me.pikamug.unite.api.objects.PartyProvider;
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;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import ro.niconeko.astralbooks.api.AstralBooks;
import ro.niconeko.astralbooks.api.AstralBooksAPI;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import java.util.Optional;
import java.util.stream.Collectors;
public class BukkitDependencies implements Dependencies {
private final BukkitQuestsPlugin plugin;
private static final Set<PartyProvider> partyProviders = new HashSet<>();
private static final List<NpcDependency> npcDependencies = new ArrayList<>();
public static PlaceholderAPIPlugin placeholder = null;
private static Economy economy = null;
private static Permission permission = null;
private static PartyProvider partyProvider = null;
private static final Set<PartyProvider> partyProviders = new HashSet<>();
private static WorldGuardAPI worldGuard = null;
private static mcMMO mcmmo = null;
private static Heroes heroes = null;
public static PlaceholderAPIPlugin placeholder = null;
public static CitizensPlugin citizens = null;
private static DenizenAPI denizen = null;
private static AstralBooksAPI astralBooks = null;
public static ZNPCsPlus znpcsPlusLegacy = null;
public static NpcApi znpcsPlusApi = null;
private static PartiesAPI parties = null;
private final BukkitQuestsPlugin plugin;
private int npcEffectThread = -1;
public BukkitDependencies(final BukkitQuestsPlugin plugin) {
this.plugin = plugin;
}
public Economy getVaultEconomy() {
if (economy == null && isPluginAvailable("Vault")) {
if (!setupEconomy()) {
@ -87,7 +81,7 @@ public class BukkitDependencies implements Dependencies {
}
return economy;
}
public Permission getVaultPermission() {
if (permission == null && isPluginAvailable("Vault")) {
if (!setupPermissions()) {
@ -114,14 +108,14 @@ public class BukkitDependencies implements Dependencies {
}
return partyProviders;
}
public WorldGuardAPI getWorldGuardApi() {
if (worldGuard == null && isPluginAvailable("WorldGuard")) {
worldGuard = new WorldGuardAPI(plugin.getServer().getPluginManager().getPlugin("WorldGuard"));
}
return worldGuard;
}
public mcMMO getMcmmoClassic() {
if (mcmmo == null && isPluginAvailable("mcMMO")) {
try {
@ -133,61 +127,82 @@ public class BukkitDependencies implements Dependencies {
}
return mcmmo;
}
public Heroes getHeroes() {
if (heroes == null && isPluginAvailable("Heroes")) {
heroes = (Heroes) plugin.getServer().getPluginManager().getPlugin("Heroes");
}
return heroes;
}
public PlaceholderAPIPlugin getPlaceholderApi() {
if (placeholder == null && isPluginAvailable("PlaceholderAPI")) {
placeholder = (PlaceholderAPIPlugin) plugin.getServer().getPluginManager().getPlugin("PlaceholderAPI");
}
return placeholder;
}
public CitizensPlugin getCitizens() {
if (citizens == null) {
linkCitizens();
}
return citizens;
public List<NpcDependency> getNpcDependencies() {
return npcDependencies;
}
public void linkCitizens() {
public boolean hasAnyNpcDependencies() {
return !npcDependencies.isEmpty();
}
public boolean hasAnyEntityNpcDependencies() {
for (final NpcDependency npcDependency : npcDependencies) {
if (npcDependency instanceof EntityNpcDependency) {
return true;
}
}
return false;
}
public NpcDependency getNpcDependency(final String dependencyName) {
for (final NpcDependency npcDependency : npcDependencies) {
if (npcDependency.getDependencyName().equalsIgnoreCase(dependencyName)) {
return npcDependency;
}
}
return null;
}
public void addNpcDependency(final NpcDependency npcDependency) {
npcDependencies.add(npcDependency);
plugin.getLogger().info("Successfully linked Quests with " + npcDependency.getDependencyName());
startNpcEffectThread();
}
private void initNpcDependency() {
if (isPluginAvailable("Citizens")) {
try {
citizens = (CitizensPlugin) plugin.getServer().getPluginManager().getPlugin("Citizens");
boolean found = false;
for (final RegisteredListener listener : HandlerList.getRegisteredListeners(plugin)) {
if (listener.getListener() instanceof BukkitCitizensListener) {
found = true;
}
}
if (!found) {
plugin.getServer().getPluginManager().registerEvents(plugin.getCitizensListener(), plugin);
startNpcEffectThread();
plugin.getLogger().info("Successfully linked Quests with Citizens "
+ citizens.getDescription().getVersion());
}
addNpcDependency(new CitizensDependency(plugin));
} catch (final Exception e) {
plugin.getLogger().warning("Legacy version of Citizens found. Citizens in Quests not enabled.");
}
}
if (isPluginAvailable("ZNPCsPlus")) {
try {
Class.forName("lol.pyr.znpcsplus.ZNPCsPlus"); // Check for 1.x classes
addNpcDependency(new LegacyZnpcsPlusDependency(plugin));
} catch (final Exception ignored) {
}
try {
Class.forName("lol.pyr.znpcsplus.ZNpcsPlus"); // Check for 2.x classes
addNpcDependency(new ZnpcsPlusDependency(plugin));
} catch (final Exception ignored) {
}
}
}
public void unlinkCitizens() {
citizens = null;
}
public DenizenAPI getDenizenApi() {
if (denizen == null && isPluginAvailable("Denizen")) {
denizen = new DenizenAPI();
}
return denizen;
}
public AstralBooksAPI getAstralBooksApi() {
if (astralBooks == null && isPluginAvailable("AstralBooks")) {
try {
@ -200,59 +215,6 @@ public class BukkitDependencies implements Dependencies {
return astralBooks;
}
public ZNPCsPlus getZnpcsPlus() {
if (znpcsPlusLegacy == null && isPluginAvailable("ZNPCsPlus")) {
try {
Class.forName("lol.pyr.znpcsplus.ZNPCsPlus");
znpcsPlusLegacy = (ZNPCsPlus) plugin.getServer().getPluginManager().getPlugin("ZNPCsPlus");
startNpcEffectThread();
} catch (Exception ignored) {
}
}
return znpcsPlusLegacy;
}
public NpcApi getZnpcsPlusApi() {
if (znpcsPlusApi == null) {
linkZnpcsPlusApi();
}
return znpcsPlusApi;
}
public void linkZnpcsPlusApi() {
if (isPluginAvailable("ZNPCsPlus")) {
try {
Class.forName("lol.pyr.znpcsplus.ZNpcsPlus");
znpcsPlusApi = NpcApiProvider.get();
boolean found = false;
for (final RegisteredListener listener : HandlerList.getRegisteredListeners(plugin)) {
if (listener.getListener() instanceof BukkitZnpcsApiListener) {
found = true;
}
}
if (!found) {
plugin.getServer().getPluginManager().registerEvents(plugin.getZNpcsPlusListener(), plugin);
startNpcEffectThread();
//noinspection ConstantConditions
plugin.getLogger().info("Successfully linked Quests with ZNPCsPlus " + plugin.getServer().getPluginManager().getPlugin("ZNPCsPlus").getDescription().getVersion());
}
} catch (Exception ignored) {
}
}
}
public void unlinkZnpcsPlusApi() {
znpcsPlusApi = null;
}
public Set<UUID> getZnpcsPlusUuids() {
if (znpcsPlusLegacy != null && isPluginAvailable("ZNPCsPlus")) {
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 {
@ -264,13 +226,13 @@ public class BukkitDependencies implements Dependencies {
}
return parties;
}
public boolean isPluginAvailable(final String pluginName) {
if (plugin.getServer().getPluginManager().getPlugin(pluginName) != null ) {
if (plugin.getServer().getPluginManager().getPlugin(pluginName) != null) {
try {
if (!Objects.requireNonNull(plugin.getServer().getPluginManager().getPlugin(pluginName)).isEnabled()) {
plugin.getLogger().warning(pluginName
+ " was detected, but is not enabled! Fix "+ pluginName + " to allow linkage.");
+ " was detected, but is not enabled! Fix " + pluginName + " to allow linkage.");
} else {
return true;
}
@ -317,76 +279,81 @@ public class BukkitDependencies implements Dependencies {
}
return partyProvider != null;
}
public boolean runDenizenScript(final String scriptName, final Quester quester, final UUID uuid) {
return plugin.getDenizenTrigger().runDenizenScript(scriptName, quester, uuid);
}
public @Nullable Location getNpcLocation(final UUID uuid) {
if (citizens != null && citizens.getNPCRegistry().getByUniqueId(uuid) != null) {
return citizens.getNPCRegistry().getByUniqueId(uuid).getStoredLocation();
} else if (znpcsPlusLegacy != null && getZnpcsPlusUuids().contains(uuid)) {
final Optional<NPC> opt = NPC.all().stream().filter(npc1 -> npc1.getUUID().equals(uuid)).findAny();
if (opt.isPresent()) {
return opt.get().getLocation();
Location location = null;
for (final NpcDependency npcDependency : npcDependencies) {
location = npcDependency.getLocation(uuid);
if (location != null) {
break;
}
} else if (znpcsPlusApi != null && znpcsPlusApi.getNpcRegistry().getByUuid(uuid) != null) {
Npc znpc = znpcsPlusApi.getNpcRegistry().getByUuid(uuid).getNpc();
if (znpc.getWorld() == null) return null;
return znpc.getLocation().toBukkitLocation(znpc.getWorld());
}
return null;
return location;
}
public @Nullable Entity getNpcEntity(final UUID uuid) {
if (citizens != null && citizens.getNPCRegistry().getByUniqueId(uuid) != null) {
return citizens.getNPCRegistry().getByUniqueId(uuid).getEntity();
} else if (znpcsPlusLegacy != null && getZnpcsPlusUuids().contains(uuid)) {
final Optional<NPC> opt = NPC.all().stream().filter(npc1 -> npc1.getUUID().equals(uuid)).findAny();
if (opt.isPresent()) {
return (Entity) opt.get().getBukkitEntity();
for (final NpcDependency npcDependency : npcDependencies) {
if (!(npcDependency instanceof EntityNpcDependency)) {
continue;
}
final Entity entity = ((EntityNpcDependency) npcDependency).getEntity(uuid);
if (entity != null) {
return entity;
}
}
return null;
}
public @NotNull String getNpcName(final UUID uuid) {
final Entity npc;
String name = "NPC";
if (citizens != null && citizens.getNPCRegistry().getByUniqueId(uuid) != null) {
name = citizens.getNPCRegistry().getByUniqueId(uuid).getName();
} else if (znpcsPlusLegacy != null && getZnpcsPlusUuids().contains(uuid)) {
final Optional<NPC> opt = NPC.all().stream().filter(npc1 -> npc1.getUUID().equals(uuid)).findAny();
if (opt.isPresent()) {
npc = (Entity) opt.get().getBukkitEntity();
if (npc.getCustomName() != null) {
name = npc.getCustomName();
} else {
name = opt.get().getNpcPojo().getHologramLines().get(0);
}
}
} else if (znpcsPlusApi != null && getZnpcsPlusApi().getNpcRegistry().getByUuid(uuid) != null) {
Npc znpc = getZnpcsPlusApi().getNpcRegistry().getByUuid(uuid).getNpc();
EntityProperty<String> displayNameProperty = getZnpcsPlusApi().getPropertyRegistry().getByName("display_name", String.class);
if (displayNameProperty != null && znpc.hasProperty(displayNameProperty)) {
name = znpc.getProperty(displayNameProperty);
for (final NpcDependency npcDependency : npcDependencies) {
final String npcName = npcDependency.getName(uuid);
if (npcName != null) {
name = npcName;
break;
}
}
return BukkitConfigUtil.parseString(name);
}
public @Nullable UUID getUuidFromNpc(final Entity entity) {
if (citizens != null && citizens.getNPCRegistry().isNPC(entity)) {
return citizens.getNPCRegistry().getNPC(entity).getUniqueId();
} else if (znpcsPlusLegacy != null && getZnpcsPlusUuids().contains(entity.getUniqueId())) {
final Optional<NPC> opt = NPC.all().stream().filter(npc1 -> npc1.getUUID().equals(entity.getUniqueId())).findAny();
if (opt.isPresent()) {
return opt.get().getUUID();
for (final NpcDependency npcDependency : npcDependencies) {
if (!(npcDependency instanceof EntityNpcDependency)) {
continue;
}
final UUID uuid = ((EntityNpcDependency) npcDependency).getId(entity);
if (uuid != null) {
return uuid;
}
}
return null;
}
public boolean isNpc(final UUID uuid) {
for (final NpcDependency npcDependency : npcDependencies) {
if (npcDependency.isNpc(uuid)) {
return true;
}
}
return false;
}
public boolean isNpc(final Entity entity) {
for (final NpcDependency npcDependency : npcDependencies) {
if (!(npcDependency instanceof EntityNpcDependency)) {
continue;
}
if (((EntityNpcDependency) npcDependency).isNpc(entity)) {
return true;
}
}
return false;
}
public void startNpcEffectThread() {
if (npcEffectThread == -1 && plugin.getConfigSettings().canNpcEffects()) {
npcEffectThread = plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin,
@ -402,7 +369,7 @@ public class BukkitDependencies implements Dependencies {
public SkillType getMcMMOSkill(final String s) {
return SkillType.getSkill(s);
}
public int getMcmmoSkillLevel(final SkillType st, final String player) {
final McMMOPlayer mPlayer = UserManager.getPlayer(player);
if (mPlayer == null) {
@ -445,7 +412,7 @@ public class BukkitDependencies implements Dependencies {
}
public void init() {
getCitizens();
initNpcDependency();
getWorldGuardApi();
getDenizenApi();
getMcmmoClassic();
@ -456,7 +423,5 @@ public class BukkitDependencies implements Dependencies {
getPartyProvider();
getVaultEconomy();
getVaultPermission();
getZnpcsPlus();
getZnpcsPlusApi();
}
}

View File

@ -0,0 +1,14 @@
package me.pikamug.quests.dependencies.npc;
import org.bukkit.entity.Entity;
import org.jetbrains.annotations.Nullable;
import java.util.UUID;
public interface EntityNpcDependency {
boolean isNpc(final Entity entity);
@Nullable Entity getEntity(final UUID uuid);
@Nullable UUID getId(final Entity entity);
}

View File

@ -0,0 +1,38 @@
package me.pikamug.quests.dependencies.npc;
import org.bukkit.Location;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.function.BiPredicate;
public interface NpcDependency {
@NotNull String getDependencyName();
boolean isNpc(final UUID uuid);
@Nullable String getName(final UUID uuid);
@Nullable Location getLocation(final UUID uuid);
@NotNull List<UUID> getAllNpcIds();
@NotNull Map<UUID, Location> getNpcsByLocationPredicate(final BiPredicate<UUID, Location> predicate);
default @NotNull Map<UUID, Location> getNpcsByNearbyLocation(final Location location, final double radius) {
if (location.getWorld() == null) return Collections.emptyMap();
return getNpcsByLocationPredicate((uuid, npcLocation) ->
npcLocation.getWorld().getName().equals(location.getWorld().getName()) && location.distance(npcLocation) < radius
);
}
default @NotNull Map<UUID, Location> getNpcsByNearbyLocationSquared(final Location location, final double radius) {
if (location.getWorld() == null) return Collections.emptyMap();
return getNpcsByLocationPredicate((uuid, npcLocation) ->
npcLocation.getWorld().getName().equals(location.getWorld().getName()) && location.distanceSquared(npcLocation) < radius);
}
}

View File

@ -1,24 +1,12 @@
/*
* Copyright (c) PikaMug and contributors
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
* LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package me.pikamug.quests.dependencies.npc;
package me.pikamug.quests.listeners;
import io.github.znetworkw.znpcservers.npc.NPC;
import io.github.znetworkw.znpcservers.npc.interaction.NPCInteractEvent;
import me.pikamug.quests.BukkitQuestsPlugin;
import me.pikamug.quests.enums.ObjectiveType;
import me.pikamug.quests.player.BukkitQuestProgress;
import me.pikamug.quests.player.Quester;
import me.pikamug.quests.quests.BukkitQuest;
import me.pikamug.quests.quests.components.BukkitStage;
import me.pikamug.quests.quests.Quest;
import me.pikamug.quests.quests.components.BukkitStage;
import me.pikamug.quests.util.BukkitItemUtil;
import me.pikamug.quests.util.BukkitLang;
import org.bukkit.ChatColor;
@ -27,51 +15,38 @@ import org.bukkit.conversations.Conversation;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.entity.Projectile;
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.HashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
/**
* Listener for legacy ZNPCsPlus 1.x
*/
public class BukkitZnpcsListener implements Listener {
public abstract class NpcListener implements Listener {
protected final BukkitQuestsPlugin plugin;
protected final NpcDependency npcDependency;
private final BukkitQuestsPlugin plugin;
public BukkitZnpcsListener(final BukkitQuestsPlugin plugin) {
public NpcListener(final BukkitQuestsPlugin plugin, final NpcDependency npcDependency) {
this.plugin = plugin;
this.npcDependency = npcDependency;
}
@EventHandler
public void onNPCInteract(final NPCInteractEvent event) {
if (plugin.getDependencies().getZnpcsPlus() == null) {
return;
protected void onNpcInteract(Player player, UUID npcId, ClickType clickType) {
if (plugin.getQuestFactory().getSelectingNpcs().contains(player.getUniqueId())) {
if (npcId == null || !npcDependency.isNpc(npcId)) {
plugin.getLogger().severe("NPC was null while selecting");
return;
}
player.acceptConversationInput(String.valueOf(npcId));
}
if (event.isLeftClick()) {
if (plugin.getQuestFactory().getSelectingNpcs().contains(event.getPlayer().getUniqueId())) {
if (event.getNpc() == null) {
plugin.getLogger().severe("ZNPC was null while selecting by left-click");
return;
}
event.getPlayer().acceptConversationInput(String.valueOf(event.getNpc().getUUID()));
}
} else if (event.isRightClick()) {
if (plugin.getQuestFactory().getSelectingNpcs().contains(event.getPlayer().getUniqueId())) {
if (event.getNpc() == null) {
plugin.getLogger().severe("ZNPC was null while selecting by right-click");
return;
}
event.getPlayer().acceptConversationInput(String.valueOf(event.getNpc().getUUID()));
}
if (!event.getPlayer().isConversing()) {
final Player player = event.getPlayer();
if (clickType == ClickType.RIGHT) {
if (!player.isConversing()) {
final Quester quester = plugin.getQuester(player.getUniqueId());
for (final Quest quest : quester.getCurrentQuests().keySet()) {
final BukkitStage currentStage = (BukkitStage) quester.getCurrentStage(quest);
@ -87,18 +62,17 @@ public class BukkitZnpcsListener implements Listener {
matches.add(currentIndex);
}
}
final NPC clicked = event.getNpc();
if (!matches.isEmpty()) {
for (final Integer match : matches) {
final UUID uuid = currentStage.getItemDeliveryTargets().get(match);
if (uuid.equals(clicked.getUUID())) {
if (uuid.equals(npcId)) {
quester.deliverToNPC(quest, uuid, hand);
return;
}
}
} else if (!hand.getType().equals(Material.AIR)) {
for (final UUID uuid : currentStage.getItemDeliveryTargets()) {
if (uuid.equals(clicked.getUUID())) {
if (uuid.equals(npcId)) {
String text = "";
final boolean hasMeta = hand.getItemMeta() != null;
if (hasMeta) {
@ -200,18 +174,17 @@ public class BukkitZnpcsListener implements Listener {
continue;
}
if (quester.getCurrentStage(quest).containsObjective(ObjectiveType.TALK_TO_NPC)) {
if (quester.getCurrentStage(quest).getNpcsToInteract().contains(event.getNpc().getUUID())) {
final int npcIndex = quester.getCurrentStage(quest).getNpcsToInteract().indexOf(event.getNpc()
.getUUID());
if (quester.getCurrentStage(quest).getNpcsToInteract().contains(npcId)) {
final int npcIndex = quester.getCurrentStage(quest).getNpcsToInteract().indexOf(npcId);
if (quester.getQuestProgressOrDefault(quest) != null && npcIndex > -1
&& !((BukkitQuestProgress) quester.getQuestProgressOrDefault(quest)).npcsInteracted.get(npcIndex)) {
hasObjective = true;
}
quester.interactWithNPC(quest, event.getNpc().getUUID());
quester.interactWithNPC(quest, npcId);
}
}
}
if (hasObjective || !plugin.getQuestNpcUuids().contains(event.getNpc().getUUID())) {
if (hasObjective || !plugin.getQuestNpcUuids().contains(npcId)) {
return;
}
boolean hasAtLeastOneGUI = false;
@ -221,7 +194,7 @@ public class BukkitZnpcsListener implements Listener {
if (quester.getCurrentQuests().containsKey(bukkitQuest)) {
continue;
}
if (bukkitQuest.getNpcStart() != null && bukkitQuest.getNpcStart().equals(event.getNpc().getUUID())) {
if (bukkitQuest.getNpcStart() != null && bukkitQuest.getNpcStart().equals(npcId)) {
if (plugin.getConfigSettings().canIgnoreLockedQuests()
&& (!quester.getCompletedQuests().contains(bukkitQuest)
|| bukkitQuest.getPlanner().getCooldown() > -1)) {
@ -247,7 +220,7 @@ public class BukkitZnpcsListener implements Listener {
quester.takeQuest(quest, false);
} else {
if (quest.getGUIDisplay() != null) {
quester.showGUIDisplay(event.getNpc().getUUID(), npcQuests);
quester.showGUIDisplay(npcId, npcQuests);
} else {
for (final String msg : extracted(quester).split("<br>")) {
player.sendMessage(msg);
@ -258,12 +231,12 @@ public class BukkitZnpcsListener implements Listener {
}
} else if (npcQuests.size() > 1) {
if (hasAtLeastOneGUI) {
quester.showGUIDisplay(event.getNpc().getUUID(), npcQuests);
quester.showGUIDisplay(npcId, npcQuests);
} else {
final Conversation c = plugin.getNpcConversationFactory().buildConversation(player);
c.getContext().setSessionData("npcQuests", npcQuests);
//c.getContext().setSessionData("npc", event.getNpc().getGameProfile().getName());
c.getContext().setSessionData("npc", ((Entity)event.getNpc().getBukkitEntity()).getCustomName());
c.getContext().setSessionData("npc", npcDependency.getName(npcId));
c.begin();
}
} else {
@ -273,9 +246,48 @@ public class BukkitZnpcsListener implements Listener {
}
}
protected void onNpcKill(Entity damager, UUID npcId) {
if (plugin.getDependencies().isNpc(damager)) {
return;
}
final ObjectiveType type = ObjectiveType.KILL_NPC;
final Set<String> dispatchedQuestIDs = new HashSet<>();
Player player = null;
if (damager instanceof Projectile && ((Projectile) damager).getShooter() instanceof Player) {
player = (Player) ((Projectile) damager).getShooter();
} else if (damager instanceof Player) {
player = (Player) damager;
}
if (player != null) {
final Quester quester = plugin.getQuester(player.getUniqueId());
for (final Quest quest : quester.getCurrentQuests().keySet()) {
if (!quester.meetsCondition(quest, true)) {
continue;
}
if (quester.getCurrentQuests().containsKey(quest)
&& quester.getCurrentStage(quest).containsObjective(type)) {
quester.killNPC(quest, npcId);
}
dispatchedQuestIDs.addAll(quester.dispatchMultiplayerEverything(quest, type,
(final Quester q, final Quest cq) -> {
if (!dispatchedQuestIDs.contains(cq.getId())) {
q.killNPC(cq, npcId);
}
return null;
}));
}
}
}
private String extracted(final Quester quester) {
final Quest quest = plugin.getQuestById(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());
}
public enum ClickType {
LEFT, RIGHT
}
}

View File

@ -0,0 +1,92 @@
package me.pikamug.quests.dependencies.npc.citizens;
import me.pikamug.quests.BukkitQuestsPlugin;
import me.pikamug.quests.dependencies.npc.EntityNpcDependency;
import me.pikamug.quests.dependencies.npc.NpcDependency;
import net.citizensnpcs.api.CitizensPlugin;
import net.citizensnpcs.api.npc.NPC;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
import java.util.function.BiPredicate;
public class CitizensDependency implements NpcDependency, EntityNpcDependency {
private final CitizensPlugin citizens;
public CitizensDependency(BukkitQuestsPlugin plugin) {
this.citizens = (CitizensPlugin) Bukkit.getServer().getPluginManager().getPlugin("Citizens");
plugin.getServer().getPluginManager().registerEvents(new CitizensListener(plugin, this), plugin);
}
@Override
public @NotNull String getDependencyName() {
return "Citizens";
}
@Override
public boolean isNpc(UUID uuid) {
return citizens.getNPCRegistry().getByUniqueId(uuid) != null;
}
@Override
public @Nullable String getName(UUID uuid) {
NPC npc = citizens.getNPCRegistry().getByUniqueId(uuid);
return npc != null ? npc.getName() : null;
}
@Override
public @Nullable Location getLocation(UUID uuid) {
NPC npc = citizens.getNPCRegistry().getByUniqueId(uuid);
return npc != null ? npc.getStoredLocation() : null;
}
@Override
public @NotNull List<UUID> getAllNpcIds() {
List<UUID> ids = new ArrayList<>();
for (NPC npc : citizens.getNPCRegistry()) {
ids.add(npc.getUniqueId());
}
return ids;
}
@Override
public @NotNull Map<UUID, Location> getNpcsByLocationPredicate(BiPredicate<UUID, Location> predicate) {
Map<UUID, Location> npcs = new HashMap<>();
for (NPC npc : citizens.getNPCRegistry()) {
UUID uuid = npc.getUniqueId();
Location location = npc.getStoredLocation();
if (location.getWorld() == null) {
continue;
}
if (predicate.test(uuid, location)) {
npcs.put(uuid, location);
}
}
return npcs;
}
public CitizensPlugin getCitizens() {
return citizens;
}
@Override
public boolean isNpc(Entity entity) {
return citizens.getNPCRegistry().isNPC(entity);
}
@Override
public @Nullable Entity getEntity(UUID uuid) {
NPC npc = citizens.getNPCRegistry().getByUniqueId(uuid);
return npc != null ? npc.getEntity() : null;
}
@Override
public @Nullable UUID getId(Entity entity) {
NPC npc = citizens.getNPCRegistry().getNPC(entity);
return npc != null ? npc.getUniqueId() : null;
}
}

View File

@ -0,0 +1,44 @@
package me.pikamug.quests.dependencies.npc.citizens;
import me.pikamug.quests.BukkitQuestsPlugin;
import me.pikamug.quests.dependencies.npc.NpcListener;
import net.citizensnpcs.api.event.NPCDeathEvent;
import net.citizensnpcs.api.event.NPCLeftClickEvent;
import net.citizensnpcs.api.event.NPCRightClickEvent;
import org.bukkit.entity.Entity;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import java.util.UUID;
public class CitizensListener extends NpcListener {
public CitizensListener(BukkitQuestsPlugin plugin, CitizensDependency npcDependency) {
super(plugin, npcDependency);
}
@EventHandler(priority = EventPriority.LOWEST)
public void onNPCRightClick(final NPCRightClickEvent event) {
onNpcInteract(event.getClicker(), event.getNPC() != null ? event.getNPC().getUniqueId() : null, ClickType.RIGHT);
}
@EventHandler
public void onNPCLeftClick(final NPCLeftClickEvent event) {
onNpcInteract(event.getClicker(), event.getNPC() != null ? event.getNPC().getUniqueId() : null, ClickType.LEFT);
}
@EventHandler
public void onNPCDeath(final NPCDeathEvent event) {
if (event.getNPC() == null || event.getNPC().getEntity() == null
|| event.getNPC().getEntity().getLastDamageCause() == null) {
return;
}
if (event.getNPC().getEntity().getLastDamageCause() instanceof EntityDamageByEntityEvent) {
final EntityDamageByEntityEvent damageEvent
= (EntityDamageByEntityEvent) event.getNPC().getEntity().getLastDamageCause();
final Entity damager = damageEvent.getDamager();
final UUID npcId = event.getNPC().getUniqueId();
onNpcKill(damager, npcId);
}
}
}

View File

@ -0,0 +1,86 @@
package me.pikamug.quests.dependencies.npc.znpcsplus;
import lol.pyr.znpcsplus.api.NpcApi;
import lol.pyr.znpcsplus.api.NpcApiProvider;
import lol.pyr.znpcsplus.api.entity.EntityProperty;
import lol.pyr.znpcsplus.api.npc.Npc;
import lol.pyr.znpcsplus.api.npc.NpcEntry;
import me.pikamug.quests.BukkitQuestsPlugin;
import me.pikamug.quests.dependencies.npc.NpcDependency;
import org.bukkit.Location;
import org.bukkit.World;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
import java.util.function.BiPredicate;
public class ZnpcsPlusDependency implements NpcDependency {
private final NpcApi api;
public ZnpcsPlusDependency(BukkitQuestsPlugin plugin) {
this.api = NpcApiProvider.get();
plugin.getServer().getPluginManager().registerEvents(new ZnpcsPlusListener(plugin, this), plugin);
}
@Override
public @NotNull String getDependencyName() {
return "ZNPCsPlus";
}
private @Nullable Npc getNpc(UUID uuid) {
NpcEntry npcEntry = api.getNpcRegistry().getByUuid(uuid);
return npcEntry != null ? npcEntry.getNpc() : null;
}
@Override
public boolean isNpc(UUID uuid) {
return getNpc(uuid) != null;
}
@Override
public @Nullable String getName(UUID uuid) {
Npc npc = getNpc(uuid);
if (npc == null) return null;
EntityProperty<String> displayNameProperty = api.getPropertyRegistry().getByName("display_name", String.class);
if (displayNameProperty != null && npc.hasProperty(displayNameProperty)) {
return npc.getProperty(displayNameProperty);
}
return null;
}
@Override
public @Nullable Location getLocation(UUID uuid) {
Npc npc = getNpc(uuid);
if (npc == null) return null;
World world = npc.getWorld();
if (world == null) return null;
return npc.getLocation().toBukkitLocation(world);
}
@Override
public @NotNull List<UUID> getAllNpcIds() {
List<UUID> ids = new ArrayList<>();
for (NpcEntry npcEntry : api.getNpcRegistry().getAllPlayerMade()) {
ids.add(npcEntry.getNpc().getUuid());
}
return ids;
}
@Override
public @NotNull Map<UUID, Location> getNpcsByLocationPredicate(BiPredicate<UUID, Location> predicate) {
Map<UUID, Location> npcs = new HashMap<>();
for (NpcEntry npcEntry : api.getNpcRegistry().getAllPlayerMade()) {
Npc npc = npcEntry.getNpc();
World world = npc.getWorld();
if (world == null) {
continue;
}
Location location = npc.getLocation().toBukkitLocation(world);
if (predicate.test(npc.getUuid(), location)) {
npcs.put(npc.getUuid(), location);
}
}
return npcs;
}
}

View File

@ -0,0 +1,31 @@
package me.pikamug.quests.dependencies.npc.znpcsplus;
import lol.pyr.znpcsplus.api.event.NpcInteractEvent;
import lol.pyr.znpcsplus.api.interaction.InteractionType;
import me.pikamug.quests.BukkitQuestsPlugin;
import me.pikamug.quests.dependencies.npc.NpcListener;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import java.util.UUID;
public class ZnpcsPlusListener extends NpcListener {
public ZnpcsPlusListener(BukkitQuestsPlugin plugin, ZnpcsPlusDependency npcDependency) {
super(plugin, npcDependency);
}
@EventHandler
public void onNPCInteract(final NpcInteractEvent event) {
Player player = event.getPlayer();
UUID npcUUID = event.getNpc() != null ? event.getNpc().getUuid() : null;
// Needed because the NpcInteractEvent is fired async
plugin.getServer().getScheduler().runTask(plugin, () -> {
if (event.getClickType().equals(InteractionType.LEFT_CLICK)) {
onNpcInteract(player, npcUUID, ClickType.LEFT);
} else if (event.getClickType().equals(InteractionType.RIGHT_CLICK)) {
onNpcInteract(player, npcUUID, ClickType.RIGHT);
}
});
}
}

View File

@ -0,0 +1,90 @@
package me.pikamug.quests.dependencies.npc.znpcsplus.legacy;
import io.github.znetworkw.znpcservers.npc.NPC;
import me.pikamug.quests.BukkitQuestsPlugin;
import me.pikamug.quests.dependencies.npc.EntityNpcDependency;
import me.pikamug.quests.dependencies.npc.NpcDependency;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.function.BiPredicate;
import java.util.stream.Collectors;
public class LegacyZnpcsPlusDependency implements NpcDependency, EntityNpcDependency {
public LegacyZnpcsPlusDependency(BukkitQuestsPlugin plugin) {
plugin.getServer().getPluginManager().registerEvents(new LegacyZnpcsPlusListener(plugin, this), plugin);
}
@Override
public @NotNull String getDependencyName() {
return "ZNPCsPlus-Legacy";
}
private @Nullable NPC getNpc(UUID uuid) {
return NPC.all().stream().filter(npc -> npc.getUUID().equals(uuid)).findAny().orElse(null);
}
@Override
public boolean isNpc(UUID uuid) {
return getNpc(uuid) != null;
}
@Override
public @Nullable String getName(UUID uuid) {
NPC npc = getNpc(uuid);
if (npc == null) {
return null;
}
Entity entity = (Entity) npc.getBukkitEntity();
String customName = entity.getCustomName();
if (customName == null) {
customName = npc.getNpcPojo().getHologramLines().get(0);
}
return customName;
}
@Override
public @Nullable Location getLocation(UUID uuid) {
NPC npc = getNpc(uuid);
return npc != null ? npc.getLocation() : null;
}
@Override
public @NotNull List<UUID> getAllNpcIds() {
return NPC.all().stream().map(NPC::getUUID).collect(Collectors.toList());
}
@Override
public @NotNull Map<UUID, Location> getNpcsByLocationPredicate(BiPredicate<UUID, Location> predicate) {
return NPC.all().stream()
.filter(npc -> predicate.test(npc.getUUID(), npc.getLocation()))
.collect(Collectors.toMap(NPC::getUUID, NPC::getLocation));
}
private @Nullable NPC getNpc(Entity entity) {
return NPC.all().stream().filter(npc -> npc.getUUID().equals(entity.getUniqueId())).findAny().orElse(null);
}
@Override
public boolean isNpc(Entity entity) {
return getNpc(entity) != null;
}
@Override
public @Nullable Entity getEntity(UUID uuid) {
NPC npc = getNpc(uuid);
return npc != null ? (Entity) npc.getBukkitEntity() : null;
}
@Override
public @Nullable UUID getId(Entity entity) {
NPC npc = getNpc(entity);
return npc != null ? npc.getUUID() : null;
}
}

View File

@ -0,0 +1,27 @@
package me.pikamug.quests.dependencies.npc.znpcsplus.legacy;
import io.github.znetworkw.znpcservers.npc.interaction.NPCInteractEvent;
import me.pikamug.quests.BukkitQuestsPlugin;
import me.pikamug.quests.dependencies.npc.NpcListener;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import java.util.UUID;
public class LegacyZnpcsPlusListener extends NpcListener {
public LegacyZnpcsPlusListener(BukkitQuestsPlugin plugin, LegacyZnpcsPlusDependency npcDependency) {
super(plugin, npcDependency);
}
@EventHandler
public void onNPCInteract(final NPCInteractEvent event) {
Player player = event.getPlayer();
UUID npcUUID = event.getNpc() != null ? event.getNpc().getUUID() : null;
if (event.isLeftClick()) {
onNpcInteract(player, npcUUID, ClickType.LEFT);
} else if (event.isRightClick()) {
onNpcInteract(player, npcUUID, ClickType.RIGHT);
}
}
}

View File

@ -1,340 +0,0 @@
/*
* Copyright (c) PikaMug and contributors
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
* LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package me.pikamug.quests.listeners;
import me.pikamug.quests.BukkitQuestsPlugin;
import me.pikamug.quests.enums.ObjectiveType;
import me.pikamug.quests.player.BukkitQuestProgress;
import me.pikamug.quests.player.Quester;
import me.pikamug.quests.quests.BukkitQuest;
import me.pikamug.quests.quests.components.BukkitStage;
import me.pikamug.quests.quests.Quest;
import me.pikamug.quests.util.BukkitItemUtil;
import me.pikamug.quests.util.BukkitLang;
import net.citizensnpcs.api.event.NPCDeathEvent;
import net.citizensnpcs.api.event.NPCLeftClickEvent;
import net.citizensnpcs.api.event.NPCRightClickEvent;
import net.citizensnpcs.api.npc.NPC;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.conversations.Conversation;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Map.Entry;
import java.util.Set;
import java.util.UUID;
public class BukkitCitizensListener implements Listener {
private final BukkitQuestsPlugin plugin;
public BukkitCitizensListener(final BukkitQuestsPlugin plugin) {
this.plugin = plugin;
}
@SuppressWarnings("deprecation")
@EventHandler(priority = EventPriority.LOWEST)
public void onNPCRightClick(final NPCRightClickEvent event) {
if (plugin.getDependencies().getCitizens() == null) {
return;
}
if (plugin.getQuestFactory().getSelectingNpcs().contains(event.getClicker().getUniqueId())) {
if (event.getNPC() == null) {
plugin.getLogger().severe("NPC was null while selecting by right-click");
return;
}
event.getClicker().acceptConversationInput(String.valueOf(event.getNPC().getUniqueId()));
}
if (!event.getClicker().isConversing()) {
final Player player = event.getClicker();
final Quester quester = plugin.getQuester(player.getUniqueId());
for (final Quest quest : quester.getCurrentQuests().keySet()) {
final BukkitStage currentStage = (BukkitStage) quester.getCurrentStage(quest);
if (currentStage.containsObjective(ObjectiveType.DELIVER_ITEM)) {
final ItemStack hand = player.getItemInHand();
int currentIndex = -1;
final LinkedList<Integer> matches = new LinkedList<>();
int reasonCode = 0;
for (final ItemStack is : currentStage.getItemsToDeliver()) {
currentIndex++;
reasonCode = BukkitItemUtil.compareItems(is, hand, true);
if (reasonCode == 0) {
matches.add(currentIndex);
}
}
final NPC clicked = event.getNPC();
if (!matches.isEmpty()) {
for (final Integer match : matches) {
final UUID uuid = currentStage.getItemDeliveryTargets().get(match);
if (uuid.equals(clicked.getUniqueId())) {
quester.deliverToNPC(quest, uuid, hand);
return;
}
}
} else if (!hand.getType().equals(Material.AIR)) {
for (final UUID uuid : currentStage.getItemDeliveryTargets()) {
if (uuid.equals(clicked.getUniqueId())) {
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 + "<item>" + (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.getConfigSettings().canTranslateNames() && !hasMeta
&& !hand.getItemMeta().hasDisplayName()) {
plugin.getLocaleManager().sendMessage(player, BukkitLang
.get(player, "questInvalidDeliveryItem").replace("<item>", text), hand
.getType(), hand.getDurability(), null);
} else {
player.sendMessage(BukkitLang.get(player, "questInvalidDeliveryItem")
.replace("<item>", text).replace("<item>", BukkitItemUtil.getName(hand)));
}
switch (reasonCode) {
case 1:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "one item is null"));
break;
case 0:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "ERROR"));
break;
case -1:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "name"));
break;
case -2:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "amount"));
break;
case -3:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "durability"));
break;
case -4:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "display name or lore"));
break;
case -5:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "enchantments"));
break;
case -6:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "stored enchants"));
break;
case -7:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "item flags"));
break;
case -8:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "book data"));
break;
case -9:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "potion type"));
break;
case -10:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "fish variant"));
break;
default:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "unknown"));
}
if (hasMeta) {
if (hand.getType().equals(Material.ENCHANTED_BOOK)) {
final EnchantmentStorageMeta esMeta = (EnchantmentStorageMeta) hand.getItemMeta();
if (esMeta.hasStoredEnchants()) {
for (final Entry<Enchantment, Integer> e : esMeta.getStoredEnchants()
.entrySet()) {
final HashMap<Enchantment, Integer> single = new HashMap<>();
single.put(e.getKey(), e.getValue());
plugin.getLocaleManager().sendMessage(player, ChatColor.GRAY + "\u2515 "
+ ChatColor.DARK_GREEN + "<enchantment> <level>\n", single);
}
}
}
}
break;
}
}
}
}
}
boolean hasObjective = false;
for (final Quest quest : quester.getCurrentQuests().keySet()) {
if (!quester.meetsCondition(quest, true)) {
continue;
}
if (quester.getCurrentStage(quest).containsObjective(ObjectiveType.TALK_TO_NPC)) {
if (quester.getCurrentStage(quest).getNpcsToInteract().contains(event.getNPC().getUniqueId())) {
final int npcIndex = quester.getCurrentStage(quest).getNpcsToInteract().indexOf(event.getNPC()
.getUniqueId());
if (quester.getQuestProgressOrDefault(quest) != null && npcIndex > -1) {
final LinkedList<Boolean> interacted
= ((BukkitQuestProgress) quester.getQuestProgressOrDefault(quest)).npcsInteracted;
if (interacted.size() > npcIndex && !interacted.get(npcIndex)) {
hasObjective = true;
}
}
quester.interactWithNPC(quest, event.getNPC().getUniqueId());
}
}
}
if (hasObjective || !plugin.getQuestNpcUuids().contains(event.getNPC().getUniqueId())) {
return;
}
boolean hasAtLeastOneGUI = false;
final LinkedList<Quest> npcQuests = new LinkedList<>();
for (final Quest quest : plugin.getLoadedQuests()) {
final BukkitQuest bukkitQuest = (BukkitQuest) quest;
if (quester.getCurrentQuests().containsKey(bukkitQuest)) {
continue;
}
if (bukkitQuest.getNpcStart() != null && bukkitQuest.getNpcStart().equals(event.getNPC().getUniqueId())) {
if (plugin.getConfigSettings().canIgnoreLockedQuests()
&& (!quester.getCompletedQuests().contains(bukkitQuest)
|| bukkitQuest.getPlanner().getCooldown() > -1)) {
if (bukkitQuest.testRequirements(quester)) {
npcQuests.add(bukkitQuest);
if (bukkitQuest.getGUIDisplay() != null) {
hasAtLeastOneGUI = true;
}
}
} else if (!quester.getCompletedQuests().contains(bukkitQuest) || bukkitQuest.getPlanner().getCooldown() > -1) {
npcQuests.add(bukkitQuest);
if (bukkitQuest.getGUIDisplay() != null) {
hasAtLeastOneGUI = true;
}
}
}
}
if (npcQuests.size() == 1) {
final BukkitQuest bukkitQuest = (BukkitQuest) npcQuests.get(0);
if (quester.canAcceptOffer(bukkitQuest, true)) {
quester.setQuestIdToTake(bukkitQuest.getId());
if (!plugin.getConfigSettings().canConfirmAccept()) {
quester.takeQuest(bukkitQuest, false);
} else {
if (bukkitQuest.getGUIDisplay() != null) {
quester.showGUIDisplay(event.getNPC().getUniqueId(), npcQuests);
} else {
for (final String msg : extracted(quester).split("<br>")) {
player.sendMessage(msg);
}
plugin.getConversationFactory().buildConversation(player).begin();
}
}
}
} else if (npcQuests.size() > 1) {
if (hasAtLeastOneGUI) {
quester.showGUIDisplay(event.getNPC().getUniqueId(), npcQuests);
} else {
final Conversation c = plugin.getNpcConversationFactory().buildConversation(player);
c.getContext().setSessionData("npcQuests", npcQuests);
c.getContext().setSessionData("npc", event.getNPC().getName());
c.begin();
}
} else {
BukkitLang.send(player, ChatColor.YELLOW + BukkitLang.get(player, "noMoreQuest"));
}
}
}
@EventHandler
public void onNPCLeftClick(final NPCLeftClickEvent event) {
if (plugin.getDependencies().getCitizens() == null) {
return;
}
if (plugin.getQuestFactory().getSelectingNpcs().contains(event.getClicker().getUniqueId())) {
if (event.getNPC() == null) {
plugin.getLogger().severe("NPC was null while selecting by left-click");
return;
}
event.getClicker().acceptConversationInput(String.valueOf(event.getNPC().getUniqueId()));
}
}
@EventHandler
public void onNPCDeath(final NPCDeathEvent event) {
if (plugin.getDependencies().getCitizens() == null) {
return;
}
if (event.getNPC() == null || event.getNPC().getEntity() == null
|| event.getNPC().getEntity().getLastDamageCause() == null) {
return;
}
if (event.getNPC().getEntity().getLastDamageCause() instanceof EntityDamageByEntityEvent) {
final EntityDamageByEntityEvent damageEvent
= (EntityDamageByEntityEvent) event.getNPC().getEntity().getLastDamageCause();
final Entity damager = damageEvent.getDamager();
if (plugin.getDependencies().getCitizens().getNPCRegistry().isNPC(damager)) {
return;
}
final ObjectiveType type = ObjectiveType.KILL_NPC;
final Set<String> dispatchedQuestIDs = new HashSet<>();
Player player = null;
if (damager instanceof Projectile && ((Projectile)damageEvent.getDamager()).getShooter() instanceof Player) {
player = (Player) ((Projectile)damageEvent.getDamager()).getShooter();
} else if (damager instanceof Player) {
player = (Player) damager;
}
if (player != null) {
final Quester quester = plugin.getQuester(player.getUniqueId());
for (final Quest quest : quester.getCurrentQuests().keySet()) {
if (!quester.meetsCondition(quest, true)) {
continue;
}
if (quester.getCurrentQuests().containsKey(quest)
&& quester.getCurrentStage(quest).containsObjective(type)) {
quester.killNPC(quest, event.getNPC().getUniqueId());
}
dispatchedQuestIDs.addAll(quester.dispatchMultiplayerEverything(quest, type,
(final Quester q, final Quest cq) -> {
if (!dispatchedQuestIDs.contains(cq.getId())) {
q.killNPC(cq, event.getNPC().getUniqueId());
}
return null;
}));
}
}
}
}
private String extracted(final Quester quester) {
final Quest quest = plugin.getQuestById(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());
}
}

View File

@ -27,13 +27,7 @@ import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.entity.Sheep;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.entity.Wolf;
import org.bukkit.entity.*;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@ -46,20 +40,8 @@ import org.bukkit.event.inventory.InventoryAction;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryDragEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerBucketFillEvent;
import org.bukkit.event.player.PlayerChangedWorldEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerFishEvent;
import org.bukkit.event.player.*;
import org.bukkit.event.player.PlayerFishEvent.State;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.event.player.PlayerShearEntityEvent;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;
@ -698,7 +680,7 @@ public class BukkitPlayerListener implements Listener {
return;
}
if (damager instanceof Player) {
if (plugin.getDependencies().getCitizens() != null && CitizensAPI.getNPCRegistry().isNPC(target)) {
if (!plugin.getDependencies().isNpc(target)) {
return;
}
final Quester quester = plugin.getQuester(damager.getUniqueId());
@ -792,10 +774,8 @@ public class BukkitPlayerListener implements Listener {
return;
}
if (damager instanceof Player && target instanceof Player) {
if (plugin.getDependencies().getCitizens() != null) {
if (CitizensAPI.getNPCRegistry().isNPC(damager) && CitizensAPI.getNPCRegistry().isNPC(target)) {
return;
}
if (plugin.getDependencies().isNpc(damager) && plugin.getDependencies().isNpc(target)) {
return;
}
final Quester quester = plugin.getQuester(damager.getUniqueId());
final ObjectiveType type = ObjectiveType.KILL_PLAYER;
@ -968,10 +948,8 @@ public class BukkitPlayerListener implements Listener {
if (event.getFrom().getBlock().equals(event.getTo().getBlock())) {
return;
}
if (plugin.getDependencies().getCitizens() != null) {
if (CitizensAPI.getNPCRegistry().isNPC(event.getPlayer())) {
return;
}
if (plugin.getDependencies().isNpc(event.getPlayer())) {
return;
}
playerMove(event.getPlayer().getUniqueId(), event.getTo());
}

View File

@ -1,274 +0,0 @@
package me.pikamug.quests.listeners;
import lol.pyr.znpcsplus.api.event.NpcInteractEvent;
import lol.pyr.znpcsplus.api.interaction.InteractionType;
import lol.pyr.znpcsplus.api.npc.Npc;
import me.pikamug.quests.BukkitQuestsPlugin;
import me.pikamug.quests.enums.ObjectiveType;
import me.pikamug.quests.player.BukkitQuestProgress;
import me.pikamug.quests.player.Quester;
import me.pikamug.quests.quests.BukkitQuest;
import me.pikamug.quests.quests.Quest;
import me.pikamug.quests.quests.components.BukkitStage;
import me.pikamug.quests.util.BukkitItemUtil;
import me.pikamug.quests.util.BukkitLang;
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;
/**
* Listener for ZNPCsPlus 2.x+
*/
public class BukkitZnpcsApiListener implements Listener {
private final BukkitQuestsPlugin plugin;
public BukkitZnpcsApiListener(final BukkitQuestsPlugin plugin) {
this.plugin = plugin;
}
@EventHandler
public void onNPCInteract(final NpcInteractEvent event) {
if (plugin.getDependencies().getZnpcsPlusApi() == null) {
return;
}
// Needed because the NpcInteractEvent is fired async
plugin.getServer().getScheduler().runTask(plugin, () -> {
if (event.getClickType().equals(InteractionType.LEFT_CLICK)) {
if (plugin.getQuestFactory().getSelectingNpcs().contains(event.getPlayer().getUniqueId())) {
if (event.getNpc() == null) {
plugin.getLogger().severe("ZNPCsPlus was null while selecting by left-click");
return;
}
event.getPlayer().acceptConversationInput(String.valueOf(event.getNpc().getUuid()));
}
} else if (event.getClickType().equals(InteractionType.RIGHT_CLICK)) {
if (plugin.getQuestFactory().getSelectingNpcs().contains(event.getPlayer().getUniqueId())) {
if (event.getNpc() == null) {
plugin.getLogger().severe("ZNPCsPlus was null while selecting by right-click");
return;
}
event.getPlayer().acceptConversationInput(String.valueOf(event.getNpc().getUuid()));
}
if (!event.getPlayer().isConversing()) {
final Player player = event.getPlayer();
final Quester quester = plugin.getQuester(player.getUniqueId());
for (final Quest quest : quester.getCurrentQuests().keySet()) {
final BukkitStage currentStage = (BukkitStage) quester.getCurrentStage(quest);
if (currentStage.containsObjective(ObjectiveType.DELIVER_ITEM)) {
final ItemStack hand = player.getItemInHand();
int currentIndex = -1;
final LinkedList<Integer> matches = new LinkedList<>();
int reasonCode = 0;
for (final ItemStack is : currentStage.getItemsToDeliver()) {
currentIndex++;
reasonCode = BukkitItemUtil.compareItems(is, hand, true);
if (reasonCode == 0) {
matches.add(currentIndex);
}
}
final Npc clicked = event.getNpc();
if (!matches.isEmpty()) {
for (final Integer match : matches) {
final UUID uuid = currentStage.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 : currentStage.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 + "<item>" + (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.getConfigSettings().canTranslateNames() && !hasMeta
&& !hand.getItemMeta().hasDisplayName()) {
plugin.getLocaleManager().sendMessage(player, BukkitLang
.get(player, "questInvalidDeliveryItem").replace("<item>", text), hand
.getType(), hand.getDurability(), null);
} else {
player.sendMessage(BukkitLang.get(player, "questInvalidDeliveryItem")
.replace("<item>", text).replace("<item>", BukkitItemUtil.getName(hand)));
}
switch (reasonCode) {
case 1:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "one item is null"));
break;
case 0:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "ERROR"));
break;
case -1:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "name"));
break;
case -2:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "amount"));
break;
case -3:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "durability"));
break;
case -4:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "display name or lore"));
break;
case -5:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "enchantments"));
break;
case -6:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "stored enchants"));
break;
case -7:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "item flags"));
break;
case -8:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "book data"));
break;
case -9:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "potion type"));
break;
case -10:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "fish variant"));
break;
default:
player.sendMessage(ChatColor.GRAY + BukkitLang.get(player, "difference")
.replace("<data>", "unknown"));
}
if (hasMeta) {
if (hand.getType().equals(Material.ENCHANTED_BOOK)) {
final EnchantmentStorageMeta esMeta = (EnchantmentStorageMeta) hand.getItemMeta();
if (esMeta.hasStoredEnchants()) {
for (final Map.Entry<Enchantment, Integer> e : esMeta.getStoredEnchants()
.entrySet()) {
final HashMap<Enchantment, Integer> single = new HashMap<>();
single.put(e.getKey(), e.getValue());
plugin.getLocaleManager().sendMessage(player, ChatColor.GRAY + "\u2515 "
+ ChatColor.DARK_GREEN + "<enchantment> <level>\n", single);
}
}
}
}
break;
}
}
}
}
}
boolean hasObjective = false;
for (final Quest quest : quester.getCurrentQuests().keySet()) {
if (!quester.meetsCondition(quest, true)) {
continue;
}
if (quester.getCurrentStage(quest).containsObjective(ObjectiveType.TALK_TO_NPC)) {
if (quester.getCurrentStage(quest).getNpcsToInteract().contains(event.getNpc().getUuid())) {
final int npcIndex = quester.getCurrentStage(quest).getNpcsToInteract().indexOf(event.getNpc()
.getUuid());
if (quester.getQuestProgressOrDefault(quest) != null && npcIndex > -1
&& !((BukkitQuestProgress) quester.getQuestProgressOrDefault(quest)).npcsInteracted.get(npcIndex)) {
hasObjective = true;
}
quester.interactWithNPC(quest, event.getNpc().getUuid());
}
}
}
if (hasObjective || !plugin.getQuestNpcUuids().contains(event.getNpc().getUuid())) {
return;
}
boolean hasAtLeastOneGUI = false;
final LinkedList<Quest> npcQuests = new LinkedList<>();
for (final Quest quest : plugin.getLoadedQuests()) {
final BukkitQuest bukkitQuest = (BukkitQuest) quest;
if (quester.getCurrentQuests().containsKey(bukkitQuest)) {
continue;
}
if (bukkitQuest.getNpcStart() != null && bukkitQuest.getNpcStart().equals(event.getNpc().getUuid())) {
if (plugin.getConfigSettings().canIgnoreLockedQuests()
&& (!quester.getCompletedQuests().contains(bukkitQuest)
|| bukkitQuest.getPlanner().getCooldown() > -1)) {
if (bukkitQuest.testRequirements(quester)) {
npcQuests.add(bukkitQuest);
if (bukkitQuest.getGUIDisplay() != null) {
hasAtLeastOneGUI = true;
}
}
} else if (!quester.getCompletedQuests().contains(bukkitQuest) || bukkitQuest.getPlanner().getCooldown() > -1) {
npcQuests.add(bukkitQuest);
if (bukkitQuest.getGUIDisplay() != null) {
hasAtLeastOneGUI = true;
}
}
}
}
if (npcQuests.size() == 1) {
final BukkitQuest quest = (BukkitQuest) npcQuests.get(0);
if (quester.canAcceptOffer(quest, true)) {
quester.setQuestIdToTake(quest.getId());
if (!plugin.getConfigSettings().canConfirmAccept()) {
quester.takeQuest(quest, false);
} else {
if (quest.getGUIDisplay() != null) {
quester.showGUIDisplay(event.getNpc().getUuid(), npcQuests);
} else {
for (final String msg : extracted(quester).split("<br>")) {
player.sendMessage(msg);
}
plugin.getConversationFactory().buildConversation(player).begin();
}
}
}
} else if (npcQuests.size() > 1) {
if (hasAtLeastOneGUI) {
quester.showGUIDisplay(event.getNpc().getUuid(), npcQuests);
} else {
final Conversation c = plugin.getNpcConversationFactory().buildConversation(player);
c.getContext().setSessionData("npcQuests", npcQuests);
//c.getContext().setSessionData("npc", event.getNpc().getGameProfile().getName());
c.getContext().setSessionData("npc", plugin.getDependencies().getNpcName(event.getNpc().getUuid()));
c.begin();
}
} else {
BukkitLang.send(player, ChatColor.YELLOW + BukkitLang.get(player, "noMoreQuest"));
}
}
}
});
}
private String extracted(final Quester quester) {
final Quest quest = plugin.getQuestById(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());
}
}

View File

@ -14,8 +14,6 @@ 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 lol.pyr.znpcsplus.api.npc.Npc;
import me.clip.placeholderapi.PlaceholderAPI;
import me.pikamug.localelib.LocaleManager;
import me.pikamug.quests.BukkitQuestsPlugin;
@ -24,15 +22,12 @@ import me.pikamug.quests.config.BukkitConfigSettings;
import me.pikamug.quests.config.ConfigSettings;
import me.pikamug.quests.convo.misc.QuestAbandonPrompt;
import me.pikamug.quests.dependencies.BukkitDependencies;
import me.pikamug.quests.dependencies.npc.NpcDependency;
import me.pikamug.quests.entity.BukkitCountableMob;
import me.pikamug.quests.enums.ObjectiveType;
import me.pikamug.quests.events.quest.QuestQuitEvent;
import me.pikamug.quests.events.quest.QuestTakeEvent;
import me.pikamug.quests.events.quester.BukkitQuesterPostStartQuestEvent;
import me.pikamug.quests.events.quester.BukkitQuesterPostUpdateObjectiveEvent;
import me.pikamug.quests.events.quester.BukkitQuesterPreOpenGUIEvent;
import me.pikamug.quests.events.quester.BukkitQuesterPreStartQuestEvent;
import me.pikamug.quests.events.quester.BukkitQuesterPreUpdateObjectiveEvent;
import me.pikamug.quests.events.quester.*;
import me.pikamug.quests.item.BukkitQuestJournal;
import me.pikamug.quests.module.CustomObjective;
import me.pikamug.quests.module.CustomRequirement;
@ -40,34 +35,17 @@ import me.pikamug.quests.nms.BukkitActionBarProvider;
import me.pikamug.quests.nms.BukkitTitleProvider;
import me.pikamug.quests.quests.BukkitQuest;
import me.pikamug.quests.quests.Quest;
import me.pikamug.quests.quests.components.BukkitObjective;
import me.pikamug.quests.quests.components.BukkitRequirements;
import me.pikamug.quests.quests.components.BukkitStage;
import me.pikamug.quests.quests.components.Objective;
import me.pikamug.quests.quests.components.Planner;
import me.pikamug.quests.quests.components.Stage;
import me.pikamug.quests.quests.components.*;
import me.pikamug.quests.tasks.BukkitStageTimer;
import me.pikamug.quests.util.*;
import me.pikamug.quests.util.stack.BlockItemStack;
import me.pikamug.quests.util.BukkitConfigUtil;
import me.pikamug.quests.util.BukkitInventoryUtil;
import me.pikamug.quests.util.BukkitItemUtil;
import me.pikamug.quests.util.BukkitLang;
import me.pikamug.quests.util.BukkitMiscUtil;
import me.pikamug.quests.util.RomanNumeral;
import me.pikamug.unite.api.objects.PartyProvider;
import net.citizensnpcs.api.CitizensAPI;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.DyeColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.*;
import org.bukkit.configuration.ConfigurationSection;
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;
@ -77,19 +55,8 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.Map.Entry;
import java.util.Optional;
import java.util.Random;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentSkipListSet;
import java.util.function.BiFunction;
@ -555,34 +522,15 @@ public class BukkitQuester implements Quester {
if (!plugin.getConfigSettings().canAllowCommandsForNpcQuests() && bukkitQuest.getNpcStart() != null
&& getPlayer().getLocation().getWorld() != null) {
final UUID uuid = bukkitQuest.getNpcStart();
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().getZnpcsPlus() != null
&& plugin.getDependencies().getZnpcsPlusUuids().contains(uuid)) {
final Optional<NPC> 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) {
if (giveReason) {
final String msg = BukkitLang.get(getPlayer(), "mustSpeakTo").replace("<npc>", npc.getName());
sendMessage(ChatColor.YELLOW + msg);
}
return false;
}
if (plugin.getDependencies().getZnpcsPlusApi() != null &&
plugin.getDependencies().getZnpcsPlusApi().getNpcRegistry().getByUuid(uuid) != null) {
Npc znpc = plugin.getDependencies().getZnpcsPlusApi().getNpcRegistry().getByUuid(uuid).getNpc();
if (znpc.getWorld() != null && znpc.getWorld().equals(getPlayer().getWorld()) &&
znpc.getLocation().toBukkitLocation(znpc.getWorld()).distance(getPlayer().getLocation()) > 6.0) {
for (NpcDependency npcDependency : plugin.getDependencies().getNpcDependencies()) {
Location npcLocation = npcDependency.getLocation(uuid);
if (npcLocation == null) continue;
if (npcLocation.getWorld() != null
&& npcLocation.getWorld().getName().equals(getPlayer().getLocation().getWorld().getName())
&& npcLocation.distance(getPlayer().getLocation()) > 6.0) {
if (giveReason) {
final String msg = BukkitLang.get(getPlayer(), "mustSpeakTo")
.replace("<npc>", plugin.getDependencies().getNpcName(znpc.getUuid()));
final String msg = BukkitLang.get(getPlayer(), "mustSpeakTo").replace("<npc>", plugin.getDependencies().getNpcName(uuid));
sendMessage(ChatColor.YELLOW + msg);
}
return false;
@ -1892,12 +1840,16 @@ public class BukkitQuester implements Quester {
} else if (!c.getNpcsWhileRiding().isEmpty()) {
msg.append(BukkitLang.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());
} else {
msg.append(ChatColor.AQUA).append("\n \u2515 ").append(u);
msg.append(ChatColor.AQUA).append("\n \u2515 ");
String name = u.toString();
for (NpcDependency npcDependency : plugin.getDependencies().getNpcDependencies()) {
String npcName = npcDependency.getName(u);
if (npcName != null) {
name = npcName;
break;
}
}
msg.append(name);
}
quester.sendMessage(msg.toString());
} else if (!c.getPermissions().isEmpty()) {
@ -2746,7 +2698,7 @@ public class BukkitQuester implements Quester {
final String[] message = BukkitConfigUtil.parseStringWithPossibleLineBreaks(getCurrentStage(quest)
.getDeliverMessages().get(new Random().nextInt(getCurrentStage(quest)
.getDeliverMessages().size())), getCurrentStage(quest).getItemDeliveryTargets()
.get(match), goal.getAmount() - progress);
.get(match), goal.getAmount() - progress, plugin);
player.sendMessage(message);
}
@ -4081,9 +4033,6 @@ public class BukkitQuester implements Quester {
if (npc == null || quests == null) {
return;
}
if (plugin.getDependencies().getCitizens() == null) {
return;
}
final String name = plugin.getDependencies().getNpcName(npc);
final LinkedList<BukkitQuest> qs = new LinkedList<>();
for (Quest q : quests) {

View File

@ -16,45 +16,22 @@ import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.util.player.UserManager;
import com.herocraftonline.heroes.characters.Hero;
import io.github.znetworkw.znpcservers.npc.NPC;
import lol.pyr.znpcsplus.api.npc.Npc;
import me.clip.placeholderapi.PlaceholderAPI;
import me.pikamug.quests.BukkitQuestsPlugin;
import me.pikamug.quests.actions.Action;
import me.pikamug.quests.actions.BukkitAction;
import me.pikamug.quests.dependencies.BukkitDependencies;
import me.pikamug.quests.dependencies.npc.NpcDependency;
import me.pikamug.quests.events.quest.QuestUpdateCompassEvent;
import me.pikamug.quests.events.quester.BukkitQuesterPostChangeStageEvent;
import me.pikamug.quests.events.quester.BukkitQuesterPostCompleteQuestEvent;
import me.pikamug.quests.events.quester.BukkitQuesterPostFailQuestEvent;
import me.pikamug.quests.events.quester.BukkitQuesterPreChangeStageEvent;
import me.pikamug.quests.events.quester.BukkitQuesterPreCompleteQuestEvent;
import me.pikamug.quests.events.quester.BukkitQuesterPreFailQuestEvent;
import me.pikamug.quests.events.quester.*;
import me.pikamug.quests.module.CustomRequirement;
import me.pikamug.quests.module.CustomReward;
import me.pikamug.quests.nms.BukkitTitleProvider;
import me.pikamug.quests.player.BukkitQuester;
import me.pikamug.quests.player.Quester;
import me.pikamug.quests.quests.components.BukkitOptions;
import me.pikamug.quests.quests.components.BukkitPlanner;
import me.pikamug.quests.quests.components.BukkitRequirements;
import me.pikamug.quests.quests.components.BukkitRewards;
import me.pikamug.quests.quests.components.Options;
import me.pikamug.quests.quests.components.Planner;
import me.pikamug.quests.quests.components.Requirements;
import me.pikamug.quests.quests.components.Rewards;
import me.pikamug.quests.quests.components.Stage;
import me.pikamug.quests.util.BukkitConfigUtil;
import me.pikamug.quests.util.BukkitInventoryUtil;
import me.pikamug.quests.util.BukkitItemUtil;
import me.pikamug.quests.util.BukkitMiscUtil;
import me.pikamug.quests.util.BukkitLang;
import me.pikamug.quests.util.RomanNumeral;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.DyeColor;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import me.pikamug.quests.quests.components.*;
import me.pikamug.quests.util.*;
import org.bukkit.*;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
@ -66,13 +43,8 @@ import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.Map.Entry;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentSkipListSet;
import java.util.stream.Collectors;
@ -419,23 +391,13 @@ public class BukkitQuest implements Quest {
targetLocation = (Location) stage.getLocationsToReach().getFirst();
} else if (stage.getItemDeliveryTargets() != null && stage.getItemDeliveryTargets().size() > 0) {
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().getZnpcsPlus() != null
&& plugin.getDependencies().getZnpcsPlusUuids().contains(uuid)) {
final Optional<NPC> opt = NPC.all().stream().filter(npc1 -> npc1.getUUID().equals(uuid)).findAny();
if (opt.isPresent()) {
targetLocation = opt.get().getLocation();
for (NpcDependency npcDependency : plugin.getDependencies().getNpcDependencies()) {
Location npcLocation = npcDependency.getLocation(uuid);
if (npcLocation != null) {
targetLocation = npcLocation;
break;
}
}
if (plugin.getDependencies().getZnpcsPlusApi() != null
&& plugin.getDependencies().getZnpcsPlusApi().getNpcRegistry().getByUuid(uuid) != null) {
Npc znpc = plugin.getDependencies().getZnpcsPlusApi().getNpcRegistry().getByUuid(uuid).getNpc();
targetLocation = znpc.getLocation().toBukkitLocation(znpc.getWorld());
}
} else if (stage.getPlayersToKill() != null && stage.getPlayersToKill() > 0) {
if (quester.getPlayer() == null) {
return;
@ -569,9 +531,9 @@ public class BukkitQuest implements Quest {
final Player player = quester.getPlayer();
if (quester.getCompletedQuests().contains(this)) {
meta.setDisplayName(ChatColor.DARK_PURPLE + BukkitConfigUtil.parseString(getName()
+ " " + ChatColor.GREEN + BukkitLang.get(player, "redoCompleted"), getNpcStart()));
+ " " + ChatColor.GREEN + BukkitLang.get(player, "redoCompleted"), getNpcStart(), plugin));
} else {
meta.setDisplayName(ChatColor.DARK_PURPLE + BukkitConfigUtil.parseString(getName(), getNpcStart()));
meta.setDisplayName(ChatColor.DARK_PURPLE + BukkitConfigUtil.parseString(getName(), getNpcStart(), plugin));
}
if (!meta.hasLore()) {
final LinkedList<String> lines;

View File

@ -16,18 +16,9 @@ import me.pikamug.quests.convo.quests.menu.QuestMenuPrompt;
import me.pikamug.quests.convo.quests.stages.QuestStageMenuPrompt;
import me.pikamug.quests.interfaces.ReloadCallback;
import me.pikamug.quests.module.CustomObjective;
import me.pikamug.quests.quests.components.BukkitStage;
import me.pikamug.quests.quests.components.Options;
import me.pikamug.quests.quests.components.Planner;
import me.pikamug.quests.quests.components.Requirements;
import me.pikamug.quests.quests.components.Rewards;
import me.pikamug.quests.quests.components.Stage;
import me.pikamug.quests.quests.components.*;
import me.pikamug.quests.util.*;
import me.pikamug.quests.util.stack.BlockItemStack;
import me.pikamug.quests.util.BukkitConfigUtil;
import me.pikamug.quests.util.BukkitFakeConversable;
import me.pikamug.quests.util.BukkitLang;
import me.pikamug.quests.util.BukkitMiscUtil;
import me.pikamug.quests.util.Key;
import org.bukkit.ChatColor;
import org.bukkit.DyeColor;
import org.bukkit.Location;
@ -36,12 +27,7 @@ import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.conversations.ConversationAbandonedEvent;
import org.bukkit.conversations.ConversationAbandonedListener;
import org.bukkit.conversations.ConversationContext;
import org.bukkit.conversations.ConversationFactory;
import org.bukkit.conversations.ConversationPrefix;
import org.bukkit.conversations.Prompt;
import org.bukkit.conversations.*;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
@ -50,13 +36,8 @@ import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentSkipListSet;
@ -159,9 +140,7 @@ public class BukkitQuestFactory implements QuestFactory, ConversationAbandonedLi
context.setSessionData(Key.Q_NAME, bukkitQuest.getName());
context.setSessionData(Key.Q_ASK_MESSAGE, bukkitQuest.getDescription());
context.setSessionData(Key.Q_FINISH_MESSAGE, bukkitQuest.getFinished());
if (plugin.getDependencies().getCitizens() != null
|| plugin.getDependencies().getZnpcsPlus() != null
|| plugin.getDependencies().getZnpcsPlusApi() != null) {
if (plugin.getDependencies().hasAnyNpcDependencies()) {
if (bukkitQuest.getNpcStart() != null) {
context.setSessionData(Key.Q_START_NPC, bukkitQuest.getNpcStart().toString());
}

View File

@ -20,11 +20,7 @@ import org.bukkit.inventory.ItemStack;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.*;
import java.util.logging.Level;
public class BukkitConditionYamlStorage implements ConditionStorageImpl {
@ -140,7 +136,7 @@ public class BukkitConditionYamlStorage implements ConditionStorageImpl {
// Legacy
if (BukkitConfigUtil.checkList(data.getList(conditionKey + "ride-npc"), Integer.class)) {
final LinkedList<UUID> npcList = new LinkedList<>();
if (plugin.getDependencies().getCitizens() != null) {
if (plugin.getDependencies().getNpcDependency("Citizens") != null) {
for (final int i : data.getIntegerList(conditionKey + "ride-npc")) {
final NPC npc = CitizensAPI.getNPCRegistry().getById(i);
if (npc != null) {

View File

@ -10,25 +10,16 @@ import me.pikamug.quests.exceptions.QuestFormatException;
import me.pikamug.quests.exceptions.StageFormatException;
import me.pikamug.quests.quests.BukkitQuest;
import me.pikamug.quests.quests.Quest;
import me.pikamug.quests.quests.components.BukkitRequirements;
import me.pikamug.quests.quests.components.BukkitRewards;
import me.pikamug.quests.quests.components.BukkitStage;
import me.pikamug.quests.quests.components.Options;
import me.pikamug.quests.quests.components.Planner;
import me.pikamug.quests.quests.components.*;
import me.pikamug.quests.storage.implementation.QuestStorageImpl;
import me.pikamug.quests.util.stack.BlockItemStack;
import me.pikamug.quests.util.BukkitConfigUtil;
import me.pikamug.quests.util.BukkitItemUtil;
import me.pikamug.quests.util.BukkitMiscUtil;
import me.pikamug.quests.util.BukkitLang;
import me.pikamug.quests.util.BukkitMiscUtil;
import me.pikamug.quests.util.stack.BlockItemStack;
import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.npc.NPC;
import org.bukkit.ChatColor;
import org.bukkit.Color;
import org.bukkit.DyeColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.*;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
@ -43,13 +34,7 @@ import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.AbstractMap;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
import java.util.*;
import java.util.logging.Level;
public class BukkitQuestYamlStorage implements QuestStorageImpl {
@ -177,7 +162,7 @@ public class BukkitQuestYamlStorage implements QuestStorageImpl {
final Collection<UUID> npcUuids = plugin.getQuestNpcUuids();
npcUuids.add(uuid);
plugin.setQuestNpcUuids(npcUuids);
} else if (depends.getCitizens() != null && config.contains("quests." + questId + ".npc-giver-id")) {
} else if (depends.getNpcDependency("Citizens") != null && config.contains("quests." + questId + ".npc-giver-id")) {
// Legacy
final int id = config.getInt("quests." + questId + ".npc-giver-id");
if (CitizensAPI.getNPCRegistry().getById(id) != null) {
@ -1218,7 +1203,7 @@ public class BukkitQuestYamlStorage implements QuestStorageImpl {
if (BukkitConfigUtil.checkList(config.getList(path + ".npc-ids-to-talk-to"), Integer.class)) {
npcIdsToTalkTo = config.getIntegerList(path + ".npc-ids-to-talk-to");
for (final int i : npcIdsToTalkTo) {
if (plugin.getDependencies().getCitizens() != null) {
if (plugin.getDependencies().getNpcDependency("Citizens") != null) {
final NPC npc = CitizensAPI.getNPCRegistry().getById(i);
if (npc != null) {
final UUID npcUuid = npc.getUniqueId();
@ -1285,7 +1270,7 @@ public class BukkitQuestYamlStorage implements QuestStorageImpl {
final String msg = deliveryMessages.size() > index ? deliveryMessages.get(index)
: deliveryMessages.get(deliveryMessages.size() - 1);
index++;
if (plugin.getDependencies().getCitizens() != null) {
if (plugin.getDependencies().getNpcDependency("Citizens") != null) {
final NPC npc = CitizensAPI.getNPCRegistry().getById(npcId);
if (npc != null) {
bukkitStage.addItemToDeliver(stack);
@ -1348,7 +1333,7 @@ public class BukkitQuestYamlStorage implements QuestStorageImpl {
npcIdsToKill = config.getIntegerList(path + ".npc-ids-to-kill");
npcAmountsToKill = config.getIntegerList(path + ".npc-kill-amounts");
for (final int i : npcIdsToKill) {
if (plugin.getDependencies().getCitizens() != null) {
if (plugin.getDependencies().getNpcDependency("Citizens") != null) {
final NPC npc = CitizensAPI.getNPCRegistry().getById(i);
if (npc != null) {
if (npcAmountsToKill.get(npcIdsToKill.indexOf(i)) > 0) {

View File

@ -10,18 +10,16 @@
package me.pikamug.quests.tasks;
import lol.pyr.znpcsplus.api.npc.NpcEntry;
import me.pikamug.quests.BukkitQuestsPlugin;
import me.pikamug.quests.dependencies.npc.NpcDependency;
import me.pikamug.quests.enums.BukkitPreBuiltParticle;
import me.pikamug.quests.events.quester.BukkitQuesterPostViewEffectEvent;
import me.pikamug.quests.nms.BukkitParticleProvider;
import me.pikamug.quests.player.BukkitQuester;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.UUID;
public class BukkitNpcEffectThread implements Runnable {
@ -35,47 +33,10 @@ public class BukkitNpcEffectThread implements Runnable {
@Override
public void run() {
for (final Player player : plugin.getServer().getOnlinePlayers()) {
if (plugin.getDependencies().getCitizens() != null) {
final List<Entity> nearby = player.getNearbyEntities(32.0, 16.0, 32.0);
if (!nearby.isEmpty()) {
for (final Entity entity : nearby) {
final UUID uuid = plugin.getDependencies().getUuidFromNpc(entity);
if (uuid != null) {
showConfigEffect(plugin.getQuester(player.getUniqueId()), uuid, entity.getLocation());
}
}
}
}
if (plugin.getDependencies().getZnpcsPlus() != null) {
for (io.github.znetworkw.znpcservers.npc.NPC npc : io.github.znetworkw.znpcservers.npc.NPC.all()) {
final Location location = npc.getLocation();
if (location.getWorld() == null || player.getLocation().getWorld() == null) {
return;
}
if (location.getWorld().getName().equals(player.getLocation().getWorld().getName())) {
if (location.distanceSquared(player.getLocation()) < 24) {
final UUID uuid = plugin.getDependencies().getUuidFromNpc((Entity) npc.getBukkitEntity());
if (uuid != null) {
showConfigEffect(plugin.getQuester(player.getUniqueId()), uuid, location);
}
}
}
}
}
if (plugin.getDependencies().getZnpcsPlusApi() != null) {
Collection<? extends NpcEntry> znpcs = plugin.getDependencies().getZnpcsPlusApi().getNpcRegistry()
.getAllPlayerMade();
for (NpcEntry npc : znpcs) {
if (npc.getNpc().getWorld() == null || player.getLocation().getWorld() == null) {
return;
}
if (npc.getNpc().getWorld().equals(player.getLocation().getWorld())) {
if (npc.getNpc().getLocation().toBukkitLocation(npc.getNpc().getWorld())
.distanceSquared(player.getLocation()) < 24) {
showConfigEffect(plugin.getQuester(player.getUniqueId()), npc.getNpc().getUuid(),
npc.getNpc().getLocation().toBukkitLocation(npc.getNpc().getWorld()).add(0, 2, 0));
}
}
for (NpcDependency npcDependency : plugin.getDependencies().getNpcDependencies()) {
Map<UUID, Location> npcLocations = npcDependency.getNpcsByNearbyLocationSquared(player.getLocation(), 24);
for (Map.Entry<UUID, Location> entry : npcLocations.entrySet()) {
showConfigEffect(plugin.getQuester(player.getUniqueId()), entry.getKey(), entry.getValue());
}
}
}

View File

@ -10,10 +10,9 @@
package me.pikamug.quests.tasks;
import org.bukkit.entity.Player;
import me.pikamug.quests.BukkitQuestsPlugin;
import net.citizensnpcs.api.CitizensAPI;
import me.pikamug.quests.dependencies.npc.NpcDependency;
import org.bukkit.entity.Player;
public class BukkitPlayerMoveThread implements Runnable {
@ -26,8 +25,8 @@ public class BukkitPlayerMoveThread implements Runnable {
@Override
public void run() {
for (final Player player : plugin.getServer().getOnlinePlayers()) {
if (plugin.getDependencies().getCitizens() != null) {
if (CitizensAPI.getNPCRegistry().isNPC(player)) {
for (NpcDependency npcDependency : plugin.getDependencies().getNpcDependencies()) {
if (npcDependency.isNpc(player.getUniqueId())) {
return;
}
}

View File

@ -10,22 +10,18 @@
package me.pikamug.quests.util;
import io.github.znetworkw.znpcservers.npc.NPC;
import lol.pyr.znpcsplus.api.entity.EntityProperty;
import lol.pyr.znpcsplus.api.npc.Npc;
import lol.pyr.znpcsplus.api.npc.NpcEntry;
import me.pikamug.quests.dependencies.BukkitDependencies;
import me.pikamug.quests.quests.Quest;
import me.clip.placeholderapi.PlaceholderAPI;
import me.pikamug.quests.BukkitQuestsPlugin;
import me.pikamug.quests.dependencies.BukkitDependencies;
import me.pikamug.quests.dependencies.npc.NpcDependency;
import me.pikamug.quests.quests.Quest;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -135,8 +131,8 @@ public class BukkitConfigUtil {
return parsed.split("\n");
}
public static String[] parseStringWithPossibleLineBreaks(final String s, final UUID npc, int amount) {
String parsed = parseString(s, npc);
public static String[] parseStringWithPossibleLineBreaks(final String s, final UUID npc, int amount, final BukkitQuestsPlugin plugin) {
String parsed = parseString(s, npc, plugin);
if (parsed.contains("<amount>")) {
parsed = parsed.replace("<amount>", String.valueOf(amount));
}
@ -166,38 +162,18 @@ public class BukkitConfigUtil {
return parsed;
}
public static String parseString(final String s, final UUID npc) {
public static String parseString(final String s, final UUID npc, final BukkitQuestsPlugin plugin) {
String parsed = parseString(s);
if (parsed.contains("<npc>")) {
if (BukkitDependencies.citizens != null) {
parsed = parsed.replace("<npc>", BukkitDependencies.citizens.getNPCRegistry().getByUniqueId(npc).getName());
}
if (BukkitDependencies.znpcsPlusLegacy != null) {
String name = "null";
final Optional<NPC> opt = NPC.all().stream().filter(npc1 -> npc1.getUUID().equals(npc)).findAny();
if (opt.isPresent()) {
final Entity znpc = (Entity) opt.get().getBukkitEntity();
if (znpc.getCustomName() != null) {
name = znpc.getCustomName();
} else {
name = opt.get().getNpcPojo().getHologramLines().get(0);
}
String name = "null";
for (NpcDependency npcDependency : plugin.getDependencies().getNpcDependencies()) {
String npcName = npcDependency.getName(npc);
if (npcName != null) {
name = npcName;
break;
}
parsed = parsed.replace("<npc>", name);
} else if (BukkitDependencies.znpcsPlusApi != null) {
String name = "null";
NpcEntry entry = BukkitDependencies.znpcsPlusApi.getNpcRegistry().getByUuid(npc);
if (entry != null) {
Npc znpc = entry.getNpc();
EntityProperty<String> displayNameProperty = BukkitDependencies.znpcsPlusApi.getPropertyRegistry().getByName("display_name", String.class);
if (displayNameProperty != null) {
if (znpc.hasProperty(displayNameProperty)) {
name = znpc.getProperty(displayNameProperty);
}
}
}
parsed = parsed.replace("<npc>", name);
}
parsed = parsed.replace("<npc>", name);
}
return parsed;
}