Revert "General API for NPC support (#2314)" (#2319)

This reverts commit 4bcbc7f3a0.
This commit is contained in:
PikaMug 2025-01-05 15:16:53 -05:00 committed by GitHub
parent 4bcbc7f3a0
commit 53513970bd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
31 changed files with 1249 additions and 853 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/content/repositories/placeholderapi/</url>
</repository>
<repository>
<!-- Heroes, Vault -->
@ -70,12 +70,6 @@
<name>Pyr's Repo</name>
<url>https://repo.pyr.lol/snapshots</url>
</repository>
<repository>
<!-- FancyNpcs -->
<id>fancyplugins-releases</id>
<name>FancyPlugins Repository</name>
<url>https://repo.fancyplugins.de/releases</url>
</repository>
</repositories>
<dependencies>
@ -130,7 +124,7 @@
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
<version>2.11.6</version>
<version>2.11.2</version>
<scope>provided</scope>
</dependency>
<dependency>
@ -163,12 +157,6 @@
<version>2.0.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>de.oliver</groupId>
<artifactId>FancyNpcs</artifactId>
<version>2.4.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.PikaMug</groupId>
<artifactId>Unite</artifactId>

View File

@ -23,7 +23,16 @@ 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.*;
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.logging.BukkitQuestsLog4JFilter;
import me.pikamug.quests.module.CustomObjective;
import me.pikamug.quests.module.CustomRequirement;
@ -42,8 +51,8 @@ import me.pikamug.quests.storage.implementation.file.BukkitQuestYamlStorage;
import me.pikamug.quests.storage.implementation.jar.BukkitModuleJarStorage;
import me.pikamug.quests.tasks.BukkitNpcEffectThread;
import me.pikamug.quests.tasks.BukkitPlayerMoveThread;
import me.pikamug.quests.util.BukkitLang;
import me.pikamug.quests.util.BukkitMiscUtil;
import me.pikamug.quests.util.BukkitLang;
import me.pikamug.quests.util.BukkitUpdateChecker;
import me.pikamug.quests.util.stack.BlockItemStacks;
import org.apache.logging.log4j.LogManager;
@ -59,9 +68,18 @@ import org.bukkit.permissions.Permission;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import java.io.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URISyntaxException;
import java.util.*;
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.concurrent.ConcurrentSkipListSet;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -93,6 +111,9 @@ 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;
@ -131,6 +152,9 @@ 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();
@ -207,6 +231,11 @@ 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;
@ -394,8 +423,10 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests {
}
}
final BukkitQuester quester = new BukkitQuester(this, id);
if (depends.isNpc(id)) {
return quester;
if (depends.getCitizens() != null) {
if (depends.getCitizens().getNPCRegistry().getByUniqueId(id) != null) {
return quester;
}
}
final BukkitQuester q = new BukkitQuester(this, id);
questers.add(q);
@ -497,6 +528,18 @@ 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;
}
@ -627,6 +670,20 @@ 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,14 +214,15 @@ public class BukkitCondition implements Condition {
} else if (!npcsWhileRiding.isEmpty()) {
boolean atLeastOne = false;
for (final UUID n : npcsWhileRiding) {
if (!plugin.getDependencies().hasAnyEntityNpcDependencies()) {
plugin.getLogger().warning("An Entity NPC plugin must be installed for condition ride NPC UUID " + n);
if (plugin.getDependencies().getCitizens() == null) {
plugin.getLogger().warning("Citizens must be installed for condition ride NPC UUID " + n);
return false;
}
if (player.getVehicle() == null) {
return false;
}
if (player.getVehicle().equals(plugin.getDependencies().getNpcEntity(n))) {
if (player.getVehicle().equals(plugin.getDependencies().getCitizens().getNPCRegistry().getByUniqueId(n)
.getEntity())) {
atLeastOne = true;
break;
}

View File

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

View File

@ -45,7 +45,11 @@ import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentSkipListSet;
@ -104,7 +108,7 @@ public class QuestMainPrompt extends QuestsEditorNumericPrompt {
return ChatColor.GRAY;
}
case 7:
if (plugin.getDependencies().hasAnyNpcDependencies()) {
if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null || plugin.getDependencies().getZnpcsPlusApi() != null) {
return ChatColor.BLUE;
} else {
return ChatColor.GRAY;
@ -128,7 +132,8 @@ 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().hasAnyNpcDependencies()) {
if (context.getSessionData(Key.Q_START_NPC) == null || plugin.getDependencies().getCitizens() != null
|| plugin.getDependencies().getZnpcsPlus() != null || plugin.getDependencies().getZnpcsPlusApi() != null) {
return ChatColor.YELLOW + BukkitLang.get("questEditorNPCStart");
} else {
return ChatColor.GRAY + BukkitLang.get("questEditorNPCStart");
@ -146,7 +151,7 @@ public class QuestMainPrompt extends QuestsEditorNumericPrompt {
return ChatColor.GRAY + BukkitLang.get("questWGSetRegion");
}
case 7:
if (plugin.getDependencies().hasAnyNpcDependencies()) {
if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null || plugin.getDependencies().getZnpcsPlusApi() != null) {
return ChatColor.YELLOW + BukkitLang.get("questEditorSetGUI");
} else {
return ChatColor.GRAY + BukkitLang.get("questEditorSetGUI");
@ -189,9 +194,10 @@ 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().hasAnyNpcDependencies()) {
if (context.getSessionData(Key.Q_START_NPC) == null && (plugin.getDependencies().getCitizens() != null
|| plugin.getDependencies().getZnpcsPlus() != null || plugin.getDependencies().getZnpcsPlusApi() != null)) {
return ChatColor.GRAY + "(" + BukkitLang.get("noneSet") + ")";
} else if (plugin.getDependencies().hasAnyNpcDependencies()) {
} else if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null || plugin.getDependencies().getZnpcsPlusApi() != null) {
final UUID uuid = UUID.fromString((String) Objects.requireNonNull(context
.getSessionData(Key.Q_START_NPC)));
return ChatColor.GRAY + "(" + ChatColor.AQUA + plugin.getDependencies().getNpcName(uuid)
@ -221,7 +227,7 @@ public class QuestMainPrompt extends QuestsEditorNumericPrompt {
return ChatColor.GRAY + "(" + BukkitLang.get("notInstalled") + ")";
}
case 7:
if (plugin.getDependencies().hasAnyNpcDependencies()) {
if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null || plugin.getDependencies().getZnpcsPlusApi() != null) {
if (context.getSessionData(Key.Q_GUIDISPLAY) == null) {
return ChatColor.GRAY + "(" + BukkitLang.get("noneSet") + ")";
} else {
@ -265,7 +271,8 @@ public class QuestMainPrompt extends QuestsEditorNumericPrompt {
case 3:
return new QuestFinishMessagePrompt(context);
case 4:
if (plugin.getDependencies().hasAnyNpcDependencies()) {
if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null
|| plugin.getDependencies().getZnpcsPlusApi() != null) {
return new QuestNPCStartPrompt(context);
} else {
return new QuestMainPrompt(context);
@ -288,7 +295,8 @@ public class QuestMainPrompt extends QuestsEditorNumericPrompt {
return new QuestMainPrompt(context);
}
case 7:
if (plugin.getDependencies().hasAnyNpcDependencies()) {
if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null
|| plugin.getDependencies().getZnpcsPlusApi() != null) {
return new QuestGuiDisplayPrompt(context);
} else {
return new QuestMainPrompt(context);
@ -499,7 +507,8 @@ 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().isNpc(uuid)) {
if (plugin.getDependencies().getNpcEntity(uuid) == null && (plugin.getDependencies().getZnpcsPlusApi() == null
|| plugin.getDependencies().getZnpcsPlusApi().getNpcRegistry().getByUuid(uuid) == null)) {
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().hasAnyNpcDependencies()) {
if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null || plugin.getDependencies().getZnpcsPlusApi() != null) {
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().hasAnyNpcDependencies()) {
if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null || plugin.getDependencies().getZnpcsPlusApi() != null) {
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().hasAnyNpcDependencies()) {
if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null || plugin.getDependencies().getZnpcsPlusApi() != null) {
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().hasAnyNpcDependencies()) {
if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null || plugin.getDependencies().getZnpcsPlusApi() != null) {
return new QuestNpcsDeliveryListPrompt(context);
} else {
context.getForWhom().sendRawMessage(ChatColor.RED + BukkitLang.get("stageEditorNoCitizens"));
return new QuestStageMainPrompt(stageNum, context);
}
case 2:
if (plugin.getDependencies().hasAnyNpcDependencies()) {
if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null || plugin.getDependencies().getZnpcsPlusApi() != null) {
return new QuestNpcsIdsToTalkToPrompt(context);
} else {
context.getForWhom().sendRawMessage(ChatColor.RED + BukkitLang.get("stageEditorNoCitizens"));
return new QuestStageMainPrompt(stageNum, context);
}
case 3:
if (plugin.getDependencies().hasAnyNpcDependencies()) {
if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null || plugin.getDependencies().getZnpcsPlusApi() != null) {
return new QuestNpcsKillListPrompt(context);
} else {
context.getForWhom().sendRawMessage(ChatColor.RED + BukkitLang.get("stageEditorNoCitizens"));
@ -453,7 +453,10 @@ public class QuestNpcsPrompt extends QuestsEditorNumericPrompt {
for (final String s : input.split(" ")) {
try {
final UUID uuid = UUID.fromString(s);
if (npcs != null && plugin.getDependencies().isNpc(uuid)) {
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) {
npcs.add(uuid.toString());
} else {
context.getForWhom().sendRawMessage(ChatColor.RED + BukkitLang.get("stageEditorInvalidNPC")
@ -572,7 +575,10 @@ public class QuestNpcsPrompt extends QuestsEditorNumericPrompt {
for (final String s : args) {
try {
final UUID uuid = UUID.fromString(s);
if (npcs != null && plugin.getDependencies().isNpc(uuid)) {
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) {
npcs.add(uuid.toString());
} else {
context.getForWhom().sendRawMessage(ChatColor.RED + BukkitLang.get("stageEditorInvalidNPC")
@ -652,7 +658,8 @@ public class QuestNpcsPrompt extends QuestsEditorNumericPrompt {
public String getAdditionalText(final ConversationContext context, final int number) {
switch(number) {
case 1:
if (plugin.getDependencies().hasAnyNpcDependencies()) {
if (plugin.getDependencies().getCitizens() != null || plugin.getDependencies().getZnpcsPlus() != null
|| plugin.getDependencies().getZnpcsPlusApi() != null) {
if (context.getSessionData(pref + Key.S_NPCS_TO_KILL) == null) {
return ChatColor.GRAY + "(" + BukkitLang.get("noneSet") + ")";
} else {
@ -794,7 +801,10 @@ public class QuestNpcsPrompt extends QuestsEditorNumericPrompt {
for (final String s : args) {
try {
final UUID uuid = UUID.fromString(s);
if (npcs != null && plugin.getDependencies().isNpc(uuid)) {
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) {
npcs.add(uuid.toString());
} else {
context.getForWhom().sendRawMessage(ChatColor.RED + BukkitLang.get("stageEditorInvalidNPC")

View File

@ -11,7 +11,6 @@
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;
@ -29,12 +28,12 @@ public class BukkitDenizenTrigger {
return false;
}
if (plugin.getDependencies().getDenizenApi().containsScript(scriptName)) {
if (plugin.getDependencies().getNpcDependency("Citizens") != null) {
if (plugin.getDependencies().getCitizens() != null) {
if (uuid == null) {
plugin.getLogger().severe("NPC UUID was null for Denizen script named " + scriptName);
return false;
}
final NPC npc = ((CitizensDependency) plugin.getDependencies().getNpcDependency("Citizens")).getCitizens().getNPCRegistry().getByUniqueId(uuid);
final NPC npc = plugin.getDependencies().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,57 +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.fancynpcs.FancyNpcsDependency;
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.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.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import java.util.*;
import java.util.stream.Collectors;
public class BukkitDependencies implements Dependencies {
private static final Set<PartyProvider> partyProviders = new HashSet<>();
private static final List<NpcDependency> npcDependencies = new ArrayList<>();
public static PlaceholderAPIPlugin placeholder = null;
private final BukkitQuestsPlugin plugin;
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()) {
@ -78,7 +81,7 @@ public class BukkitDependencies implements Dependencies {
}
return economy;
}
public Permission getVaultPermission() {
if (permission == null && isPluginAvailable("Vault")) {
if (!setupPermissions()) {
@ -105,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 {
@ -124,88 +127,61 @@ 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 List<NpcDependency> getNpcDependencies() {
return npcDependencies;
}
public boolean hasAnyNpcDependencies() {
return !npcDependencies.isEmpty();
}
public boolean hasAnyEntityNpcDependencies() {
for (final NpcDependency npcDependency : npcDependencies) {
if (npcDependency instanceof EntityNpcDependency) {
return true;
}
public CitizensPlugin getCitizens() {
if (citizens == null) {
linkCitizens();
}
return false;
return citizens;
}
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() {
public void linkCitizens() {
if (isPluginAvailable("Citizens")) {
try {
addNpcDependency(new CitizensDependency(plugin));
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());
}
} 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) {
}
}
if (isPluginAvailable("FancyNpcs")) {
try {
addNpcDependency(new FancyNpcsDependency(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 {
@ -218,6 +194,59 @@ 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 {
@ -229,13 +258,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;
}
@ -282,81 +311,75 @@ 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) {
Location location = null;
for (final NpcDependency npcDependency : npcDependencies) {
location = npcDependency.getLocation(uuid);
if (location != null) {
break;
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();
}
} 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 location;
return null;
}
public @Nullable Entity getNpcEntity(final UUID uuid) {
for (final NpcDependency npcDependency : npcDependencies) {
if (!(npcDependency instanceof EntityNpcDependency)) {
continue;
}
final Entity entity = ((EntityNpcDependency) npcDependency).getEntity(uuid);
if (entity != null) {
return entity;
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();
}
}
return null;
}
public @NotNull String getNpcName(final UUID uuid) {
String name = "NPC";
for (final NpcDependency npcDependency : npcDependencies) {
final String npcName = npcDependency.getName(uuid);
if (npcName != null) {
name = npcName;
break;
final Entity npc;
if (citizens != null && citizens.getNPCRegistry().getByUniqueId(uuid) != null) {
return 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) {
return npc.getCustomName();
} else {
return 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)) {
return znpc.getProperty(displayNameProperty);
}
}
return name;
return "NPC";
}
public @Nullable UUID getUuidFromNpc(final Entity entity) {
for (final NpcDependency npcDependency : npcDependencies) {
if (!(npcDependency instanceof EntityNpcDependency)) {
continue;
}
final UUID uuid = ((EntityNpcDependency) npcDependency).getId(entity);
if (uuid != null) {
return uuid;
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();
}
}
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,
@ -372,7 +395,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) {
@ -415,7 +438,7 @@ public class BukkitDependencies implements Dependencies {
}
public void init() {
initNpcDependency();
getCitizens();
getWorldGuardApi();
getDenizenApi();
getMcmmoClassic();
@ -426,5 +449,7 @@ public class BukkitDependencies implements Dependencies {
getPartyProvider();
getVaultEconomy();
getVaultPermission();
getZnpcsPlus();
getZnpcsPlusApi();
}
}

View File

@ -1,14 +0,0 @@
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

@ -1,38 +0,0 @@
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,92 +0,0 @@
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

@ -1,44 +0,0 @@
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

@ -1,66 +0,0 @@
package me.pikamug.quests.dependencies.npc.fancynpcs;
import de.oliver.fancynpcs.api.FancyNpcsPlugin;
import de.oliver.fancynpcs.api.Npc;
import me.pikamug.quests.BukkitQuestsPlugin;
import me.pikamug.quests.dependencies.npc.NpcDependency;
import org.bukkit.Location;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.AbstractMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.function.BiPredicate;
import java.util.stream.Collectors;
public class FancyNpcsDependency implements NpcDependency {
private final FancyNpcsPlugin api;
public FancyNpcsDependency(BukkitQuestsPlugin plugin) {
this.api = FancyNpcsPlugin.get();
plugin.getServer().getPluginManager().registerEvents(new FancyNpcsListener(plugin, this), plugin);
}
@Override
public @NotNull String getDependencyName() {
return "FancyNpcs";
}
private @Nullable Npc getNpc(UUID uuid) {
return api.getNpcManager().getNpcById(uuid.toString());
}
@Override
public boolean isNpc(UUID uuid) {
return getNpc(uuid) != null;
}
@Override
public @Nullable String getName(UUID uuid) {
Npc npc = getNpc(uuid);
return npc != null ? npc.getData().getDisplayName() : null;
}
@Override
public @Nullable Location getLocation(UUID uuid) {
Npc npc = getNpc(uuid);
return npc != null ? npc.getData().getLocation() : null;
}
@Override
public @NotNull List<UUID> getAllNpcIds() {
return api.getNpcManager().getAllNpcs().stream()
.map(npc -> UUID.fromString(npc.getData().getId()))
.collect(Collectors.toList());
}
@Override
public @NotNull Map<UUID, Location> getNpcsByLocationPredicate(BiPredicate<UUID, Location> predicate) {
return api.getNpcManager().getAllNpcs().stream()
.map(npc -> new AbstractMap.SimpleEntry<>(UUID.fromString(npc.getData().getId()), npc.getData().getLocation()))
.filter(entry -> predicate.test(entry.getKey(), entry.getValue()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}
}

View File

@ -1,29 +0,0 @@
package me.pikamug.quests.dependencies.npc.fancynpcs;
import de.oliver.fancynpcs.api.actions.ActionTrigger;
import de.oliver.fancynpcs.api.events.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 FancyNpcsListener extends NpcListener {
public FancyNpcsListener(BukkitQuestsPlugin plugin, FancyNpcsDependency npcDependency) {
super(plugin, npcDependency);
}
@EventHandler
public void onNpcInteract(NpcInteractEvent event) {
UUID uuid = UUID.fromString(event.getNpc().getData().getId());
Player player = event.getPlayer();
ActionTrigger trigger = event.getInteractionType();
if (trigger == ActionTrigger.LEFT_CLICK) {
onNpcInteract(player, uuid, ClickType.LEFT);
} else if (trigger == ActionTrigger.RIGHT_CLICK) {
onNpcInteract(player, uuid, ClickType.RIGHT);
}
}
}

View File

@ -1,86 +0,0 @@
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

@ -1,31 +0,0 @@
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

@ -1,90 +0,0 @@
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

@ -1,27 +0,0 @@
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

@ -0,0 +1,340 @@
/*
* 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,7 +27,13 @@ import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.*;
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.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@ -40,8 +46,20 @@ 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.*;
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.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;
@ -680,7 +698,7 @@ public class BukkitPlayerListener implements Listener {
return;
}
if (damager instanceof Player) {
if (!plugin.getDependencies().isNpc(target)) {
if (plugin.getDependencies().getCitizens() != null && CitizensAPI.getNPCRegistry().isNPC(target)) {
return;
}
final Quester quester = plugin.getQuester(damager.getUniqueId());
@ -774,8 +792,10 @@ public class BukkitPlayerListener implements Listener {
return;
}
if (damager instanceof Player && target instanceof Player) {
if (plugin.getDependencies().isNpc(damager) && plugin.getDependencies().isNpc(target)) {
return;
if (plugin.getDependencies().getCitizens() != null) {
if (CitizensAPI.getNPCRegistry().isNPC(damager) && CitizensAPI.getNPCRegistry().isNPC(target)) {
return;
}
}
final Quester quester = plugin.getQuester(damager.getUniqueId());
final ObjectiveType type = ObjectiveType.KILL_PLAYER;
@ -948,8 +968,10 @@ public class BukkitPlayerListener implements Listener {
if (event.getFrom().getBlock().equals(event.getTo().getBlock())) {
return;
}
if (plugin.getDependencies().isNpc(event.getPlayer())) {
return;
if (plugin.getDependencies().getCitizens() != null) {
if (CitizensAPI.getNPCRegistry().isNPC(event.getPlayer())) {
return;
}
}
playerMove(event.getPlayer().getUniqueId(), event.getTo());
}

View File

@ -0,0 +1,274 @@
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

@ -1,12 +1,24 @@
package me.pikamug.quests.dependencies.npc;
/*
* 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 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.Quest;
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 org.bukkit.ChatColor;
@ -15,38 +27,51 @@ 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.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;
public abstract class NpcListener implements Listener {
protected final BukkitQuestsPlugin plugin;
protected final NpcDependency npcDependency;
/**
* Listener for legacy ZNPCsPlus 1.x
*/
public class BukkitZnpcsListener implements Listener {
public NpcListener(final BukkitQuestsPlugin plugin, final NpcDependency npcDependency) {
private final BukkitQuestsPlugin plugin;
public BukkitZnpcsListener(final BukkitQuestsPlugin plugin) {
this.plugin = plugin;
this.npcDependency = npcDependency;
}
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));
@EventHandler
public void onNPCInteract(final NPCInteractEvent event) {
if (plugin.getDependencies().getZnpcsPlus() == null) {
return;
}
if (clickType == ClickType.RIGHT) {
if (!player.isConversing()) {
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();
final Quester quester = plugin.getQuester(player.getUniqueId());
for (final Quest quest : quester.getCurrentQuests().keySet()) {
final BukkitStage currentStage = (BukkitStage) quester.getCurrentStage(quest);
@ -62,17 +87,18 @@ public abstract class NpcListener 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(npcId)) {
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(npcId)) {
if (uuid.equals(clicked.getUUID())) {
String text = "";
final boolean hasMeta = hand.getItemMeta() != null;
if (hasMeta) {
@ -174,17 +200,18 @@ public abstract class NpcListener implements Listener {
continue;
}
if (quester.getCurrentStage(quest).containsObjective(ObjectiveType.TALK_TO_NPC)) {
if (quester.getCurrentStage(quest).getNpcsToInteract().contains(npcId)) {
final int npcIndex = quester.getCurrentStage(quest).getNpcsToInteract().indexOf(npcId);
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, npcId);
quester.interactWithNPC(quest, event.getNpc().getUUID());
}
}
}
if (hasObjective || !plugin.getQuestNpcUuids().contains(npcId)) {
if (hasObjective || !plugin.getQuestNpcUuids().contains(event.getNpc().getUUID())) {
return;
}
boolean hasAtLeastOneGUI = false;
@ -194,7 +221,7 @@ public abstract class NpcListener implements Listener {
if (quester.getCurrentQuests().containsKey(bukkitQuest)) {
continue;
}
if (bukkitQuest.getNpcStart() != null && bukkitQuest.getNpcStart().equals(npcId)) {
if (bukkitQuest.getNpcStart() != null && bukkitQuest.getNpcStart().equals(event.getNpc().getUUID())) {
if (plugin.getConfigSettings().canIgnoreLockedQuests()
&& (!quester.getCompletedQuests().contains(bukkitQuest)
|| bukkitQuest.getPlanner().getCooldown() > -1)) {
@ -220,7 +247,7 @@ public abstract class NpcListener implements Listener {
quester.takeQuest(quest, false);
} else {
if (quest.getGUIDisplay() != null) {
quester.showGUIDisplay(npcId, npcQuests);
quester.showGUIDisplay(event.getNpc().getUUID(), npcQuests);
} else {
for (final String msg : extracted(quester).split("<br>")) {
player.sendMessage(msg);
@ -231,12 +258,12 @@ public abstract class NpcListener implements Listener {
}
} else if (npcQuests.size() > 1) {
if (hasAtLeastOneGUI) {
quester.showGUIDisplay(npcId, npcQuests);
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", npcDependency.getName(npcId));
c.getContext().setSessionData("npc", ((Entity)event.getNpc().getBukkitEntity()).getCustomName());
c.begin();
}
} else {
@ -246,48 +273,9 @@ public abstract class NpcListener 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

@ -14,6 +14,8 @@ 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;
@ -22,12 +24,15 @@ 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.*;
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.item.BukkitQuestJournal;
import me.pikamug.quests.module.CustomObjective;
import me.pikamug.quests.module.CustomRequirement;
@ -35,17 +40,34 @@ 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.*;
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.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 org.bukkit.*;
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.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;
@ -55,8 +77,19 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
import org.jetbrains.annotations.NotNull;
import java.util.*;
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.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;
@ -522,15 +555,34 @@ public class BukkitQuester implements Quester {
if (!plugin.getConfigSettings().canAllowCommandsForNpcQuests() && bukkitQuest.getNpcStart() != null
&& getPlayer().getLocation().getWorld() != null) {
final UUID uuid = bukkitQuest.getNpcStart();
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) {
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) {
if (giveReason) {
final String msg = BukkitLang.get(getPlayer(), "mustSpeakTo").replace("<npc>", plugin.getDependencies().getNpcName(uuid));
final String msg = BukkitLang.get(getPlayer(), "mustSpeakTo")
.replace("<npc>", plugin.getDependencies().getNpcName(znpc.getUuid()));
sendMessage(ChatColor.YELLOW + msg);
}
return false;
@ -1828,16 +1880,12 @@ public class BukkitQuester implements Quester {
} else if (!c.getNpcsWhileRiding().isEmpty()) {
msg.append(BukkitLang.get("conditionEditorRideNPC"));
for (final UUID u : c.getNpcsWhileRiding()) {
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;
}
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(name);
}
quester.sendMessage(msg.toString());
} else if (!c.getPermissions().isEmpty()) {
@ -2686,7 +2734,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, plugin);
.get(match), goal.getAmount() - progress);
player.sendMessage(message);
}
@ -4021,6 +4069,9 @@ 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,22 +16,45 @@ 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.*;
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.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.*;
import me.pikamug.quests.util.*;
import org.bukkit.*;
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 org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
@ -43,8 +66,13 @@ import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.*;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
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;
@ -391,13 +419,23 @@ 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();
for (NpcDependency npcDependency : plugin.getDependencies().getNpcDependencies()) {
Location npcLocation = npcDependency.getLocation(uuid);
if (npcLocation != null) {
targetLocation = npcLocation;
break;
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();
}
}
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;
@ -531,9 +569,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(), plugin));
+ " " + ChatColor.GREEN + BukkitLang.get(player, "redoCompleted"), getNpcStart()));
} else {
meta.setDisplayName(ChatColor.DARK_PURPLE + BukkitConfigUtil.parseString(getName(), getNpcStart(), plugin));
meta.setDisplayName(ChatColor.DARK_PURPLE + BukkitConfigUtil.parseString(getName(), getNpcStart()));
}
if (!meta.hasLore()) {
final LinkedList<String> lines;

View File

@ -16,9 +16,18 @@ 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.*;
import me.pikamug.quests.util.*;
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.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;
@ -27,7 +36,12 @@ 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.*;
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.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
@ -36,8 +50,13 @@ import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentSkipListSet;
@ -140,7 +159,9 @@ 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().hasAnyNpcDependencies()) {
if (plugin.getDependencies().getCitizens() != null
|| plugin.getDependencies().getZnpcsPlus() != null
|| plugin.getDependencies().getZnpcsPlusApi() != null) {
if (bukkitQuest.getNpcStart() != null) {
context.setSessionData(Key.Q_START_NPC, bukkitQuest.getNpcStart().toString());
}

View File

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

View File

@ -10,16 +10,25 @@ 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.*;
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.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.BukkitLang;
import me.pikamug.quests.util.BukkitMiscUtil;
import me.pikamug.quests.util.stack.BlockItemStack;
import me.pikamug.quests.util.BukkitLang;
import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.npc.NPC;
import org.bukkit.*;
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.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
@ -34,7 +43,13 @@ import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.*;
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.logging.Level;
public class BukkitQuestYamlStorage implements QuestStorageImpl {
@ -162,7 +177,7 @@ public class BukkitQuestYamlStorage implements QuestStorageImpl {
final Collection<UUID> npcUuids = plugin.getQuestNpcUuids();
npcUuids.add(uuid);
plugin.setQuestNpcUuids(npcUuids);
} else if (depends.getNpcDependency("Citizens") != null && config.contains("quests." + questId + ".npc-giver-id")) {
} else if (depends.getCitizens() != 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) {
@ -1203,7 +1218,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().getNpcDependency("Citizens") != null) {
if (plugin.getDependencies().getCitizens() != null) {
final NPC npc = CitizensAPI.getNPCRegistry().getById(i);
if (npc != null) {
final UUID npcUuid = npc.getUniqueId();
@ -1270,7 +1285,7 @@ public class BukkitQuestYamlStorage implements QuestStorageImpl {
final String msg = deliveryMessages.size() > index ? deliveryMessages.get(index)
: deliveryMessages.get(deliveryMessages.size() - 1);
index++;
if (plugin.getDependencies().getNpcDependency("Citizens") != null) {
if (plugin.getDependencies().getCitizens() != null) {
final NPC npc = CitizensAPI.getNPCRegistry().getById(npcId);
if (npc != null) {
bukkitStage.addItemToDeliver(stack);
@ -1333,7 +1348,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().getNpcDependency("Citizens") != null) {
if (plugin.getDependencies().getCitizens() != null) {
final NPC npc = CitizensAPI.getNPCRegistry().getById(i);
if (npc != null) {
if (npcAmountsToKill.get(npcIdsToKill.indexOf(i)) > 0) {

View File

@ -10,16 +10,18 @@
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.Map;
import java.util.Collection;
import java.util.List;
import java.util.UUID;
public class BukkitNpcEffectThread implements Runnable {
@ -33,10 +35,47 @@ public class BukkitNpcEffectThread implements Runnable {
@Override
public void run() {
for (final Player player : plugin.getServer().getOnlinePlayers()) {
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());
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));
}
}
}
}
}

View File

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

View File

@ -10,18 +10,22 @@
package me.pikamug.quests.util;
import me.clip.placeholderapi.PlaceholderAPI;
import me.pikamug.quests.BukkitQuestsPlugin;
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.dependencies.npc.NpcDependency;
import me.pikamug.quests.quests.Quest;
import me.clip.placeholderapi.PlaceholderAPI;
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;
@ -131,8 +135,8 @@ public class BukkitConfigUtil {
return parsed.split("\n");
}
public static String[] parseStringWithPossibleLineBreaks(final String s, final UUID npc, int amount, final BukkitQuestsPlugin plugin) {
String parsed = parseString(s, npc, plugin);
public static String[] parseStringWithPossibleLineBreaks(final String s, final UUID npc, int amount) {
String parsed = parseString(s, npc);
if (parsed.contains("<amount>")) {
parsed = parsed.replace("<amount>", String.valueOf(amount));
}
@ -162,18 +166,38 @@ public class BukkitConfigUtil {
return parsed;
}
public static String parseString(final String s, final UUID npc, final BukkitQuestsPlugin plugin) {
public static String parseString(final String s, final UUID npc) {
String parsed = parseString(s);
if (parsed.contains("<npc>")) {
String name = "null";
for (NpcDependency npcDependency : plugin.getDependencies().getNpcDependencies()) {
String npcName = npcDependency.getName(npc);
if (npcName != null) {
name = npcName;
break;
}
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);
}
}
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;
}

View File

@ -5,7 +5,7 @@ api-version: 1.13
description: An extensive questing system.
website: https://github.com/PikaMug/Quests
author: PikaMug
softdepend: [AstralBooks, Citizens, Denizen, GPS, Heroes, mcMMO, Parties, PlaceholderAPI, Unite, Vault, WorldGuard, ZNPCsPlus, FancyNpcs]
softdepend: [AstralBooks, Citizens, Denizen, GPS, Heroes, mcMMO, Parties, PlaceholderAPI, Unite, Vault, WorldGuard, ZNPCsPlus]
permissions:
quests.*:
description: Access ALL Quests functionality