2019-08-03 13:47:12 +02:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2018 Jitse Boonstra
|
|
|
|
*/
|
|
|
|
|
|
|
|
package net.jitse.npclib;
|
|
|
|
|
2020-04-20 21:16:24 +02:00
|
|
|
import net.jitse.npclib.NPCLibOptions.MovementHandling;
|
2019-08-03 13:47:12 +02:00
|
|
|
import net.jitse.npclib.api.NPC;
|
|
|
|
import net.jitse.npclib.api.utilities.Logger;
|
2020-04-26 17:54:56 +02:00
|
|
|
import net.jitse.npclib.listeners.*;
|
2020-04-18 13:39:10 +02:00
|
|
|
import net.jitse.npclib.metrics.NPCLibMetrics;
|
2019-08-03 13:47:12 +02:00
|
|
|
import org.bukkit.plugin.PluginManager;
|
|
|
|
import org.bukkit.plugin.java.JavaPlugin;
|
|
|
|
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
public final class NPCLib {
|
|
|
|
|
|
|
|
private final JavaPlugin plugin;
|
|
|
|
private final Logger logger;
|
|
|
|
private final Class<?> npcClass;
|
|
|
|
|
|
|
|
private double autoHideDistance = 50.0;
|
|
|
|
|
2020-04-20 21:16:24 +02:00
|
|
|
private NPCLib(JavaPlugin plugin, MovementHandling moveHandling) {
|
2019-08-03 13:47:12 +02:00
|
|
|
this.plugin = plugin;
|
|
|
|
this.logger = new Logger("NPCLib");
|
|
|
|
|
|
|
|
String versionName = plugin.getServer().getClass().getPackage().getName().split("\\.")[3];
|
|
|
|
|
|
|
|
Class<?> npcClass = null;
|
|
|
|
|
|
|
|
try {
|
|
|
|
npcClass = Class.forName("net.jitse.npclib.nms." + versionName + ".NPC_" + versionName);
|
|
|
|
} catch (ClassNotFoundException exception) {
|
|
|
|
// Version not supported, error below.
|
|
|
|
}
|
|
|
|
|
|
|
|
this.npcClass = npcClass;
|
|
|
|
|
|
|
|
if (npcClass == null) {
|
2020-02-19 14:57:07 +01:00
|
|
|
logger.severe("Failed to initiate. Your server's version (" + versionName + ") is not supported");
|
2019-08-03 13:47:12 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
PluginManager pluginManager = plugin.getServer().getPluginManager();
|
|
|
|
|
|
|
|
pluginManager.registerEvents(new PlayerListener(this), plugin);
|
|
|
|
pluginManager.registerEvents(new ChunkListener(this), plugin);
|
|
|
|
|
2020-04-20 21:16:24 +02:00
|
|
|
if (moveHandling.usePme) {
|
2020-04-26 17:54:56 +02:00
|
|
|
pluginManager.registerEvents(new PlayerMoveEventListener(), plugin);
|
2020-04-20 21:16:24 +02:00
|
|
|
} else {
|
2020-04-26 17:54:56 +02:00
|
|
|
pluginManager.registerEvents(new PeriodicMoveListener(this, moveHandling.updateInterval), plugin);
|
2020-04-20 21:16:24 +02:00
|
|
|
}
|
|
|
|
|
2019-08-03 13:47:12 +02:00
|
|
|
// Boot the according packet listener.
|
|
|
|
new PacketListener().start(this);
|
|
|
|
|
2020-04-18 13:39:10 +02:00
|
|
|
// Start the bStats metrics system and disable the silly relocate check.
|
|
|
|
System.setProperty("bstats.relocatecheck", "false");
|
|
|
|
new NPCLibMetrics(this);
|
|
|
|
|
2019-08-03 13:47:12 +02:00
|
|
|
logger.info("Enabled for Minecraft " + versionName);
|
|
|
|
}
|
|
|
|
|
2020-04-20 21:16:24 +02:00
|
|
|
public NPCLib(JavaPlugin plugin) {
|
2020-04-26 17:54:56 +02:00
|
|
|
this(plugin, MovementHandling.playerMoveEvent());
|
2020-04-20 21:16:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public NPCLib(JavaPlugin plugin, NPCLibOptions options) {
|
2020-04-26 17:54:56 +02:00
|
|
|
this(plugin, options.moveHandling);
|
2020-04-20 21:16:24 +02:00
|
|
|
}
|
|
|
|
|
2019-08-03 13:47:12 +02:00
|
|
|
/**
|
|
|
|
* @return The JavaPlugin instance.
|
|
|
|
*/
|
|
|
|
public JavaPlugin getPlugin() {
|
|
|
|
return plugin;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set a new value for the auto-hide distance.
|
|
|
|
* A recommended value (and default) is 50 blocks.
|
|
|
|
*
|
|
|
|
* @param autoHideDistance The new value.
|
|
|
|
*/
|
|
|
|
public void setAutoHideDistance(double autoHideDistance) {
|
|
|
|
this.autoHideDistance = autoHideDistance;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return The auto-hide distance.
|
|
|
|
*/
|
|
|
|
public double getAutoHideDistance() {
|
|
|
|
return autoHideDistance;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return The logger NPCLib uses.
|
|
|
|
*/
|
|
|
|
public Logger getLogger() {
|
|
|
|
return logger;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create a new non-player character (NPC).
|
|
|
|
*
|
2019-10-21 09:49:23 +02:00
|
|
|
* @param text The text you want to sendShowPackets above the NPC (null = no text).
|
2019-08-03 13:47:12 +02:00
|
|
|
* @return The NPC object you may use to sendShowPackets it to players.
|
|
|
|
*/
|
2019-10-21 09:49:23 +02:00
|
|
|
public NPC createNPC(List<String> text) {
|
2019-08-03 13:47:12 +02:00
|
|
|
try {
|
2020-11-07 16:26:49 +01:00
|
|
|
return (NPC) npcClass
|
|
|
|
.getConstructors()[0]
|
|
|
|
.newInstance(this, text);
|
2019-08-03 13:47:12 +02:00
|
|
|
} catch (Exception exception) {
|
2020-02-19 14:57:07 +01:00
|
|
|
logger.warning("Failed to create NPC. Please report the following stacktrace message", exception);
|
2019-08-03 13:47:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create a new non-player character (NPC).
|
|
|
|
*
|
|
|
|
* @return The NPC object you may use to sendShowPackets it to players.
|
|
|
|
*/
|
|
|
|
public NPC createNPC() {
|
|
|
|
return createNPC(null);
|
|
|
|
}
|
|
|
|
}
|