ZNPCsPlus/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java

209 lines
9.4 KiB
Java
Raw Normal View History

2023-04-17 16:15:50 +00:00
package lol.pyr.znpcsplus;
import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.event.PacketListenerPriority;
2023-04-24 21:31:48 +00:00
import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes;
import io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder;
import lol.pyr.director.adventure.command.CommandManager;
2023-05-04 04:07:07 +00:00
import lol.pyr.director.adventure.command.MultiCommand;
2023-04-26 23:58:09 +00:00
import lol.pyr.znpcsplus.api.ZApiProvider;
2023-05-09 10:47:43 +00:00
import lol.pyr.znpcsplus.commands.*;
2023-05-08 11:17:25 +00:00
import lol.pyr.znpcsplus.entity.EntityPropertyImpl;
import lol.pyr.znpcsplus.npc.NpcTypeImpl;
import lol.pyr.znpcsplus.config.Configs;
import lol.pyr.znpcsplus.interaction.InteractionPacketListener;
2023-04-26 20:20:57 +00:00
import lol.pyr.znpcsplus.interaction.types.ConsoleCommandAction;
import lol.pyr.znpcsplus.interaction.types.MessageAction;
2023-05-04 07:25:05 +00:00
import lol.pyr.znpcsplus.npc.NpcEntryImpl;
import lol.pyr.znpcsplus.npc.NpcImpl;
import lol.pyr.znpcsplus.npc.NpcRegistryImpl;
2023-04-29 18:42:04 +00:00
import lol.pyr.znpcsplus.scheduling.FoliaScheduler;
import lol.pyr.znpcsplus.scheduling.SpigotScheduler;
import lol.pyr.znpcsplus.scheduling.TaskScheduler;
import lol.pyr.znpcsplus.skin.cache.SkinCache;
import lol.pyr.znpcsplus.skin.cache.SkinCacheCleanTask;
import lol.pyr.znpcsplus.skin.descriptor.FetchingDescriptor;
import lol.pyr.znpcsplus.skin.descriptor.MirrorDescriptor;
import lol.pyr.znpcsplus.skin.descriptor.PrefetchedDescriptor;
2023-05-04 07:25:05 +00:00
import lol.pyr.znpcsplus.tasks.NpcVisibilityTask;
import lol.pyr.znpcsplus.updater.UpdateChecker;
import lol.pyr.znpcsplus.updater.UpdateNotificationListener;
import lol.pyr.znpcsplus.user.User;
import lol.pyr.znpcsplus.user.UserListener;
2023-05-04 04:07:07 +00:00
import lol.pyr.znpcsplus.util.BungeeUtil;
2023-04-29 18:42:04 +00:00
import lol.pyr.znpcsplus.util.FoliaUtil;
2023-04-26 23:58:09 +00:00
import lol.pyr.znpcsplus.util.ZLocation;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
2023-04-26 17:50:40 +00:00
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.apache.commons.io.FileUtils;
2023-04-17 17:36:19 +00:00
import org.bstats.bukkit.Metrics;
2023-04-17 16:15:50 +00:00
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
2023-04-24 16:12:50 +00:00
import org.bukkit.World;
2023-04-17 16:15:50 +00:00
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
import java.io.IOException;
import java.util.logging.Logger;
2023-04-17 16:15:50 +00:00
public class ZNpcsPlus extends JavaPlugin {
public static Logger LOGGER;
public static File PLUGIN_FOLDER;
public static File PATH_FOLDER;
2023-04-19 16:08:30 +00:00
private static final int PLUGIN_ID = 18244;
2023-04-29 18:42:04 +00:00
public static TaskScheduler SCHEDULER;
2023-05-03 15:51:47 +00:00
public static BungeeUtil BUNGEE_UTILS;
public static BukkitAudiences ADVENTURE;
public static boolean PLACEHOLDERS_SUPPORTED;
2023-04-17 16:15:50 +00:00
private boolean enabled = false;
2023-05-09 10:47:43 +00:00
public static final String DEBUG_NPC_PREFIX = "debug_npc";
2023-04-26 17:50:40 +00:00
public static void debug(String str) {
if (!Configs.config().debugEnabled()) return;
LOGGER.info("[DEBUG] " + str);
}
@Override
public void onLoad() {
PacketEvents.setAPI(SpigotPacketEventsBuilder.build(this));
PacketEvents.getAPI().getSettings().checkForUpdates(false);
2023-04-22 19:15:00 +00:00
PacketEvents.getAPI().load();
LOGGER = getLogger();
PLUGIN_FOLDER = getDataFolder();
PATH_FOLDER = new File(PLUGIN_FOLDER, "paths");
}
private void log(String str) {
Bukkit.getConsoleSender().sendMessage(str);
}
@Override
2023-04-17 16:15:50 +00:00
public void onEnable() {
log(ChatColor.YELLOW + " ___ __ __ __");
log(ChatColor.YELLOW + " _/ |\\ | |__) | (__` " + ChatColor.GOLD + "__|__ " + ChatColor.YELLOW + getDescription().getName() + " " + ChatColor.GOLD + "v" + getDescription().getVersion());
log(ChatColor.YELLOW + " /__ | \\| | |__ .__) " + ChatColor.GOLD + " | " + ChatColor.GRAY + "Maintained with " + ChatColor.RED + "\u2764 " + ChatColor.GRAY + " by Pyr#6969");
log("");
if (Bukkit.getPluginManager().isPluginEnabled("ServersNPC")) {
log(ChatColor.DARK_RED + " * Detected old version of ZNPCs! Disabling the plugin.");
log("");
Bukkit.getPluginManager().disablePlugin(this);
return;
}
long before = System.currentTimeMillis();
File oldFolder = new File(PLUGIN_FOLDER.getParent(), "ServersNPC");
if (!PLUGIN_FOLDER.exists() && oldFolder.exists()) {
log(ChatColor.WHITE + " * Converting old ZNPCs files...");
try {
FileUtils.moveDirectory(oldFolder, PLUGIN_FOLDER);
} catch (IOException e) {
log(ChatColor.RED + " * Failed to convert old ZNPCs files" + (e.getMessage() == null ? "" : " due to " + e.getMessage()));
}
}
log(ChatColor.WHITE + " * Initializing Adventure...");
ADVENTURE = BukkitAudiences.create(this);
log(ChatColor.WHITE + " * Initializing PacketEvents...");
PacketEvents.getAPI().getEventManager().registerListener(new InteractionPacketListener(), PacketListenerPriority.MONITOR);
PacketEvents.getAPI().init();
PLACEHOLDERS_SUPPORTED = Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI");
if (PLACEHOLDERS_SUPPORTED) log(ChatColor.WHITE + " * Enabling PlaceholderAPI Support...");
PLUGIN_FOLDER.mkdirs();
PATH_FOLDER.mkdirs();
2023-04-17 16:15:50 +00:00
log(ChatColor.WHITE + " * Loading configurations...");
Configs.init(PLUGIN_FOLDER);
log(ChatColor.WHITE + " * Registering components...");
2023-04-17 16:15:50 +00:00
getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
2023-04-17 17:36:19 +00:00
new Metrics(this, PLUGIN_ID);
2023-04-29 18:42:04 +00:00
SCHEDULER = FoliaUtil.isFolia() ? new FoliaScheduler(this) : new SpigotScheduler(this);
2023-05-03 15:51:47 +00:00
BUNGEE_UTILS = new BungeeUtil(this);
Bukkit.getOnlinePlayers().forEach(User::get);
2023-05-04 04:07:07 +00:00
registerCommands();
log(ChatColor.WHITE + " * Starting tasks...");
2023-05-04 07:25:05 +00:00
new NpcVisibilityTask();
2023-04-30 13:22:48 +00:00
new SkinCacheCleanTask();
new UserListener(this);
if (Configs.config().checkForUpdates()) new UpdateNotificationListener(this, new UpdateChecker(this));
2023-05-04 07:25:05 +00:00
ZApiProvider.register(new ZNpcsApi());
enabled = true;
log(ChatColor.WHITE + " * Loading complete! (" + (System.currentTimeMillis() - before) + "ms)");
log("");
2023-04-24 16:12:50 +00:00
if (Configs.config().debugEnabled()) {
2023-04-24 16:12:50 +00:00
int wrap = 20;
int x = 0;
int z = 0;
World world = Bukkit.getWorld("world");
if (world == null) world = Bukkit.getWorlds().get(0);
2023-05-08 11:17:25 +00:00
for (NpcTypeImpl type : NpcTypeImpl.values()) {
2023-05-09 10:47:43 +00:00
NpcEntryImpl entry = NpcRegistryImpl.get().create(ZNpcsPlus.DEBUG_NPC_PREFIX + (z * wrap + x), world, type, new ZLocation(x * 3, 200, z * 3, 0, 0));
2023-05-04 04:07:07 +00:00
entry.setProcessed(true);
2023-05-04 07:25:05 +00:00
NpcImpl npc = entry.getNpc();
if (type.getType() == EntityTypes.PLAYER) {
2023-05-08 11:17:25 +00:00
SkinCache.fetchByName("Notch").thenAccept(skin -> npc.setProperty(EntityPropertyImpl.SKIN, new PrefetchedDescriptor(skin)));
npc.setProperty(EntityPropertyImpl.INVISIBLE, true);
}
2023-05-08 11:17:25 +00:00
npc.setProperty(EntityPropertyImpl.GLOW, NamedTextColor.RED);
2023-04-26 17:50:40 +00:00
// npc.setProperty(EntityProperty.FIRE, true);
npc.getHologram().addLine(Component.text("Hello, World!"));
2023-04-24 16:12:50 +00:00
if (x++ > wrap) {
x = 0;
z++;
}
}
2023-05-09 10:47:43 +00:00
NpcEntryImpl entry = NpcRegistryImpl.get().create(ZNpcsPlus.DEBUG_NPC_PREFIX + (z * wrap + x), world, NpcTypeImpl.byName("player"), new ZLocation(x * 3, 200, z * 3, 0, 0));
2023-05-04 04:07:07 +00:00
entry.setProcessed(true);
2023-05-04 07:25:05 +00:00
NpcImpl npc = entry.getNpc();
2023-05-08 11:17:25 +00:00
npc.setProperty(EntityPropertyImpl.SKIN, new FetchingDescriptor("jeb_"));
2023-04-26 20:20:57 +00:00
npc.addAction(new MessageAction(1000L, "<red>Hi, I'm jeb!"));
x++;
2023-05-09 10:47:43 +00:00
entry = NpcRegistryImpl.get().create(ZNpcsPlus.DEBUG_NPC_PREFIX + (z * wrap + x), world, NpcTypeImpl.byName("player"), new ZLocation(x * 3, 200, z * 3, 0, 0));
2023-05-04 04:07:07 +00:00
entry.setProcessed(true);
npc = entry.getNpc();
2023-05-08 11:17:25 +00:00
npc.setProperty(EntityPropertyImpl.SKIN, new MirrorDescriptor());
2023-04-26 20:20:57 +00:00
npc.addAction(new ConsoleCommandAction(1000L, "kick {player}"));
2023-04-24 16:12:50 +00:00
}
2023-04-17 16:15:50 +00:00
}
@Override
2023-04-17 16:15:50 +00:00
public void onDisable() {
if (!enabled) return;
2023-04-26 23:58:09 +00:00
ZApiProvider.unregister();
Bukkit.getOnlinePlayers().forEach(User::remove);
ADVENTURE.close();
ADVENTURE = null;
2023-04-17 16:15:50 +00:00
}
private void registerCommands() {
CommandManager manager = new CommandManager(this, ADVENTURE, context -> {});
2023-05-09 10:47:43 +00:00
manager.registerCommand("npc", new MultiCommand()
.addSubcommand("action", new ActionCommand())
.addSubcommand("conversations", new ConversationsCommand())
.addSubcommand("create", new CreateCommand())
.addSubcommand("delete", new DeleteCommand())
.addSubcommand("holo", new MultiCommand()
.addSubcommand("add", new HoloAddCommand())
.addSubcommand("delete", new HoloDeleteCommand())
.addSubcommand("info", new HoloInfoCommand())
.addSubcommand("insert", new HoloInsertCommand())
.addSubcommand("set", new HoloSetCommand())
)
.addSubcommand("list", new ListCommand())
.addSubcommand("move", new MoveCommand())
.addSubcommand("path", new PathCommand())
.addSubcommand("properties", new PropertiesCommand())
.addSubcommand("teleport", new TeleportCommand())
);
}
2023-04-17 16:15:50 +00:00
}