make load order more visible

This commit is contained in:
Pyrbu 2023-05-21 12:33:45 +01:00
parent e3ad180fa7
commit 975bae38d8
5 changed files with 100 additions and 80 deletions

@ -0,0 +1,18 @@
package lol.pyr.znpcsplus;
import lol.pyr.znpcsplus.api.ZApi;
import lol.pyr.znpcsplus.api.npc.NpcRegistry;
import lol.pyr.znpcsplus.npc.NpcRegistryImpl;
public class ZNPCsPlusApi implements ZApi {
private final NpcRegistryImpl npcRegistry;
public ZNPCsPlusApi(NpcRegistryImpl npcRegistry) {
this.npcRegistry = npcRegistry;
}
@Override
public NpcRegistry getNpcRegistry() {
return npcRegistry;
}
}

@ -12,15 +12,12 @@ import lol.pyr.director.adventure.parse.primitive.BooleanParser;
import lol.pyr.director.adventure.parse.primitive.DoubleParser; import lol.pyr.director.adventure.parse.primitive.DoubleParser;
import lol.pyr.director.adventure.parse.primitive.IntegerParser; import lol.pyr.director.adventure.parse.primitive.IntegerParser;
import lol.pyr.director.common.message.Message; import lol.pyr.director.common.message.Message;
import lol.pyr.znpcsplus.api.ZApi;
import lol.pyr.znpcsplus.api.ZApiProvider; import lol.pyr.znpcsplus.api.ZApiProvider;
import lol.pyr.znpcsplus.api.npc.NpcRegistry;
import lol.pyr.znpcsplus.commands.*; import lol.pyr.znpcsplus.commands.*;
import lol.pyr.znpcsplus.commands.action.ActionAddCommand;
import lol.pyr.znpcsplus.commands.action.ActionDeleteCommand;
import lol.pyr.znpcsplus.commands.action.ActionListCommand;
import lol.pyr.znpcsplus.commands.hologram.*; import lol.pyr.znpcsplus.commands.hologram.*;
import lol.pyr.znpcsplus.commands.parsers.EntityPropertyParser;
import lol.pyr.znpcsplus.commands.parsers.NamedTextColorParser;
import lol.pyr.znpcsplus.commands.parsers.NpcEntryParser;
import lol.pyr.znpcsplus.commands.parsers.NpcTypeParser;
import lol.pyr.znpcsplus.commands.storage.LoadAllCommand; import lol.pyr.znpcsplus.commands.storage.LoadAllCommand;
import lol.pyr.znpcsplus.commands.storage.SaveAllCommand; import lol.pyr.znpcsplus.commands.storage.SaveAllCommand;
import lol.pyr.znpcsplus.config.ConfigManager; import lol.pyr.znpcsplus.config.ConfigManager;
@ -33,6 +30,10 @@ import lol.pyr.znpcsplus.npc.NpcImpl;
import lol.pyr.znpcsplus.npc.NpcRegistryImpl; import lol.pyr.znpcsplus.npc.NpcRegistryImpl;
import lol.pyr.znpcsplus.npc.NpcTypeImpl; import lol.pyr.znpcsplus.npc.NpcTypeImpl;
import lol.pyr.znpcsplus.packets.*; import lol.pyr.znpcsplus.packets.*;
import lol.pyr.znpcsplus.parsers.EntityPropertyParser;
import lol.pyr.znpcsplus.parsers.NamedTextColorParser;
import lol.pyr.znpcsplus.parsers.NpcEntryParser;
import lol.pyr.znpcsplus.parsers.NpcTypeParser;
import lol.pyr.znpcsplus.scheduling.FoliaScheduler; import lol.pyr.znpcsplus.scheduling.FoliaScheduler;
import lol.pyr.znpcsplus.scheduling.SpigotScheduler; import lol.pyr.znpcsplus.scheduling.SpigotScheduler;
import lol.pyr.znpcsplus.scheduling.TaskScheduler; import lol.pyr.znpcsplus.scheduling.TaskScheduler;
@ -59,26 +60,20 @@ import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
public class ZNpcsPlus extends JavaPlugin implements ZApi { public class ZNpcsPlus extends JavaPlugin {
private static final int PLUGIN_ID = 18244; private static final int PLUGIN_ID = 18244;
private TaskScheduler scheduler; private PacketEventsAPI<Plugin> packetEvents;
private BukkitAudiences adventure;
private SkinCache skinCache;
private MetadataFactory metadataFactory;
private NpcRegistryImpl npcRegistry;
private UserManager userManager;
private final LegacyComponentSerializer textSerializer = LegacyComponentSerializer.builder() private final LegacyComponentSerializer textSerializer = LegacyComponentSerializer.builder()
.character('&') .character('&')
.hexCharacter('#') .hexCharacter('#')
.hexColors().build(); .hexColors().build();
private PacketEventsAPI<Plugin> packetEvents;
private final List<Runnable> shutdownTasks = new ArrayList<>();
private boolean enabled = false; private boolean enabled = false;
@Override @Override
@ -107,51 +102,49 @@ public class ZNpcsPlus extends JavaPlugin implements ZApi {
if (pluginManager.isPluginEnabled("ServersNPC")) log(ChatColor.DARK_RED + " * Old version of znpcs detected! The plugin might not work correctly!"); if (pluginManager.isPluginEnabled("ServersNPC")) log(ChatColor.DARK_RED + " * Old version of znpcs detected! The plugin might not work correctly!");
long before = System.currentTimeMillis(); long before = System.currentTimeMillis();
log(ChatColor.WHITE + " * Initializing Adventure..."); log(ChatColor.WHITE + " * Initializing libraries...");
adventure = BukkitAudiences.create(this); packetEvents.init();
BukkitAudiences adventure = BukkitAudiences.create(this);
metadataFactory = setupMetadataFactory(); log(ChatColor.WHITE + " * Initializing components...");
PacketFactory packetFactory = setupPacketFactory(); TaskScheduler scheduler = FoliaUtil.isFolia() ? new FoliaScheduler(this) : new SpigotScheduler(this);
MetadataFactory metadataFactory = setupMetadataFactory();
log(ChatColor.WHITE + " * Loading configurations..."); PacketFactory packetFactory = setupPacketFactory(scheduler, metadataFactory);
ConfigManager configManager = new ConfigManager(getDataFolder());
log(ChatColor.WHITE + " * Defining NPC types...");
NpcTypeImpl.defineTypes();
log(ChatColor.WHITE + " * Registering components...");
getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
new Metrics(this, PLUGIN_ID);
scheduler = FoliaUtil.isFolia() ? new FoliaScheduler(this) : new SpigotScheduler(this);
BungeeUtil bungeeUtil = new BungeeUtil(this); BungeeUtil bungeeUtil = new BungeeUtil(this);
userManager = new UserManager(); ConfigManager configManager = new ConfigManager(getDataFolder());
Bukkit.getOnlinePlayers().forEach(userManager::get); ActionRegistry actionRegistry = new ActionRegistry();
pluginManager.registerEvents(new UserListener(userManager), this); NpcRegistryImpl npcRegistry = new NpcRegistryImpl(configManager, this, packetFactory, actionRegistry);
UserManager userManager = new UserManager();
SkinCache skinCache = new SkinCache(configManager);
log(ChatColor.WHITE+ " * Registerring components...");
NpcTypeImpl.defineTypes(packetEvents);
actionRegistry.registerTypes(npcRegistry, scheduler, adventure, bungeeUtil, textSerializer);
packetEvents.getEventManager().registerListener(new InteractionPacketListener(userManager, npcRegistry), PacketListenerPriority.MONITOR);
new Metrics(this, PLUGIN_ID);
pluginManager.registerEvents(new UserListener(userManager), this);
getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
registerCommands(npcRegistry, skinCache, adventure, actionRegistry);
log(ChatColor.WHITE + " * Starting tasks...");
if (configManager.getConfig().checkForUpdates()) { if (configManager.getConfig().checkForUpdates()) {
UpdateChecker updateChecker = new UpdateChecker(this.getDescription()); UpdateChecker updateChecker = new UpdateChecker(this.getDescription());
scheduler.runDelayedTimerAsync(updateChecker, 5L, 6000L); scheduler.runDelayedTimerAsync(updateChecker, 5L, 6000L);
pluginManager.registerEvents(new UpdateNotificationListener(this, adventure, updateChecker), this); pluginManager.registerEvents(new UpdateNotificationListener(this, adventure, updateChecker), this);
} }
log(ChatColor.WHITE+ " * Loading NPCs...");
ActionRegistry actionRegistry = new ActionRegistry(scheduler, adventure, bungeeUtil);
npcRegistry = new NpcRegistryImpl(configManager, this, packetFactory, actionRegistry);
npcRegistry.reload();
log(ChatColor.WHITE + " * Initializing PacketEvents...");
packetEvents.getEventManager().registerListener(new InteractionPacketListener(userManager, npcRegistry), PacketListenerPriority.MONITOR);
packetEvents.init();
log(ChatColor.WHITE + " * Starting tasks...");
scheduler.runDelayedTimerAsync(new NpcVisibilityTask(npcRegistry, configManager), 60L, 10L); scheduler.runDelayedTimerAsync(new NpcVisibilityTask(npcRegistry, configManager), 60L, 10L);
skinCache = new SkinCache(configManager);
scheduler.runDelayedTimerAsync(new SkinCacheCleanTask(skinCache), 1200, 1200); scheduler.runDelayedTimerAsync(new SkinCacheCleanTask(skinCache), 1200, 1200);
log(ChatColor.WHITE + " * Registering commands..."); log(ChatColor.WHITE + " * Loading data...");
registerCommands(); npcRegistry.reload();
ZApiProvider.register(this); shutdownTasks.add(scheduler::cancelAll);
shutdownTasks.add(npcRegistry::save);
shutdownTasks.add(userManager::shutdown);
shutdownTasks.add(adventure::close);
ZApiProvider.register(new ZNPCsPlusApi(npcRegistry));
enabled = true; enabled = true;
log(ChatColor.WHITE + " * Loading complete! (" + (System.currentTimeMillis() - before) + "ms)"); log(ChatColor.WHITE + " * Loading complete! (" + (System.currentTimeMillis() - before) + "ms)");
log(""); log("");
@ -170,13 +163,20 @@ public class ZNpcsPlus extends JavaPlugin implements ZApi {
} }
} }
private PacketFactory setupPacketFactory() { @Override
public void onDisable() {
if (!enabled) return;
ZApiProvider.unregister();
for (Runnable runnable : shutdownTasks) runnable.run();
}
private PacketFactory setupPacketFactory(TaskScheduler scheduler, MetadataFactory metadataFactory) {
HashMap<ServerVersion, LazyLoader<? extends PacketFactory>> versions = new HashMap<>(); HashMap<ServerVersion, LazyLoader<? extends PacketFactory>> versions = new HashMap<>();
versions.put(ServerVersion.V_1_8, LazyLoader.of(() -> new V1_8PacketFactory(scheduler, metadataFactory))); versions.put(ServerVersion.V_1_8, LazyLoader.of(() -> new V1_8PacketFactory(scheduler, metadataFactory, packetEvents)));
versions.put(ServerVersion.V_1_9, LazyLoader.of(() -> new V1_9PacketFactory(scheduler, metadataFactory))); versions.put(ServerVersion.V_1_9, LazyLoader.of(() -> new V1_9PacketFactory(scheduler, metadataFactory, packetEvents)));
versions.put(ServerVersion.V_1_10, LazyLoader.of(() -> new V1_10PacketFactory(scheduler, metadataFactory))); versions.put(ServerVersion.V_1_10, LazyLoader.of(() -> new V1_10PacketFactory(scheduler, metadataFactory, packetEvents)));
versions.put(ServerVersion.V_1_14, LazyLoader.of(() -> new V1_14PacketFactory(scheduler, metadataFactory))); versions.put(ServerVersion.V_1_14, LazyLoader.of(() -> new V1_14PacketFactory(scheduler, metadataFactory, packetEvents)));
versions.put(ServerVersion.V_1_19, LazyLoader.of(() -> new V1_19PacketFactory(scheduler, metadataFactory))); versions.put(ServerVersion.V_1_19, LazyLoader.of(() -> new V1_19PacketFactory(scheduler, metadataFactory, packetEvents)));
ServerVersion version = packetEvents.getServerManager().getVersion(); ServerVersion version = packetEvents.getServerManager().getVersion();
if (versions.containsKey(version)) return versions.get(version).get(); if (versions.containsKey(version)) return versions.get(version).get();
@ -209,20 +209,9 @@ public class ZNpcsPlus extends JavaPlugin implements ZApi {
} }
@Override private void registerCommands(NpcRegistryImpl npcRegistry, SkinCache skinCache, BukkitAudiences adventure, ActionRegistry actionRegistry) {
public void onDisable() { // TODO: make the messages better
if (!enabled) return; Message<CommandContext> incorrectUsageMessage = context -> context.send(Component.text("Incorrect usage: /" + context.getUsage(), NamedTextColor.RED));
scheduler.cancelAll();
npcRegistry.save();
ZApiProvider.unregister();
Bukkit.getOnlinePlayers().forEach(userManager::remove);
adventure.close();
adventure = null;
}
private void registerCommands() {
// TODO: make this better
Message<CommandContext> incorrectUsageMessage = context -> context.send(Component.text("Incorrect usage: " + context.getUsage()));
CommandManager manager = new CommandManager(this, adventure, incorrectUsageMessage); CommandManager manager = new CommandManager(this, adventure, incorrectUsageMessage);
manager.registerParser(NpcTypeImpl.class, new NpcTypeParser(incorrectUsageMessage)); manager.registerParser(NpcTypeImpl.class, new NpcTypeParser(incorrectUsageMessage));
@ -234,7 +223,6 @@ public class ZNpcsPlus extends JavaPlugin implements ZApi {
manager.registerParser(NamedTextColor.class, new NamedTextColorParser(incorrectUsageMessage)); manager.registerParser(NamedTextColor.class, new NamedTextColorParser(incorrectUsageMessage));
manager.registerCommand("npc", new MultiCommand() manager.registerCommand("npc", new MultiCommand()
.addSubcommand("action", new ActionCommand())
.addSubcommand("create", new CreateCommand(npcRegistry)) .addSubcommand("create", new CreateCommand(npcRegistry))
.addSubcommand("skin", new SkinCommand(skinCache, npcRegistry)) .addSubcommand("skin", new SkinCommand(skinCache, npcRegistry))
.addSubcommand("delete", new DeleteCommand(npcRegistry, adventure)) .addSubcommand("delete", new DeleteCommand(npcRegistry, adventure))
@ -254,11 +242,10 @@ public class ZNpcsPlus extends JavaPlugin implements ZApi {
.addSubcommand("insert", new HoloInsertCommand(npcRegistry, textSerializer)) .addSubcommand("insert", new HoloInsertCommand(npcRegistry, textSerializer))
.addSubcommand("set", new HoloSetCommand(npcRegistry, textSerializer)) .addSubcommand("set", new HoloSetCommand(npcRegistry, textSerializer))
.addSubcommand("offset", new HoloOffsetCommand(npcRegistry))) .addSubcommand("offset", new HoloOffsetCommand(npcRegistry)))
.addSubcommand("action", new MultiCommand()
.addSubcommand("add", new ActionAddCommand(actionRegistry))
.addSubcommand("delete", new ActionDeleteCommand(npcRegistry))
.addSubcommand("list", new ActionListCommand()))
); );
} }
@Override
public NpcRegistry getNpcRegistry() {
return npcRegistry;
}
} }

@ -26,7 +26,7 @@ public class NpcImpl extends Viewable implements Npc {
private final HologramImpl hologram; private final HologramImpl hologram;
private final Map<EntityPropertyImpl<?>, Object> propertyMap = new HashMap<>(); private final Map<EntityPropertyImpl<?>, Object> propertyMap = new HashMap<>();
private final Set<InteractionAction> actions = new HashSet<>(); private final List<InteractionAction> actions = new ArrayList<>();
protected NpcImpl(ConfigManager configManager, World world, NpcTypeImpl type, ZLocation location, PacketFactory packetFactory) { protected NpcImpl(ConfigManager configManager, World world, NpcTypeImpl type, ZLocation location, PacketFactory packetFactory) {
this(configManager, packetFactory, world.getName(), type, location); this(configManager, packetFactory, world.getName(), type, location);
@ -135,8 +135,12 @@ public class NpcImpl extends Viewable implements Npc {
return Collections.unmodifiableSet(propertyMap.keySet()); return Collections.unmodifiableSet(propertyMap.keySet());
} }
public Collection<InteractionAction> getActions() { public List<InteractionAction> getActions() {
return Collections.unmodifiableSet(actions); return Collections.unmodifiableList(actions);
}
public void removeAction(int index) {
actions.remove(index);
} }
public void addAction(InteractionAction action) { public void addAction(InteractionAction action) {

@ -1,10 +1,12 @@
package lol.pyr.znpcsplus.npc; package lol.pyr.znpcsplus.npc;
import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.PacketEventsAPI;
import com.github.retrooper.packetevents.manager.server.ServerVersion; import com.github.retrooper.packetevents.manager.server.ServerVersion;
import com.github.retrooper.packetevents.protocol.entity.type.EntityType; import com.github.retrooper.packetevents.protocol.entity.type.EntityType;
import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes; import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes;
import lol.pyr.znpcsplus.entity.EntityPropertyImpl; import lol.pyr.znpcsplus.entity.EntityPropertyImpl;
import org.bukkit.plugin.Plugin;
import java.util.*; import java.util.*;
@ -57,10 +59,10 @@ public class NpcTypeImpl {
} }
private static boolean defined = false; private static boolean defined = false;
public static void defineTypes() { public static void defineTypes(PacketEventsAPI<Plugin> packetEvents) {
if (defined) return; if (defined) return;
defined = true; defined = true;
ServerVersion version = PacketEvents.getAPI().getServerManager().getVersion(); ServerVersion version = packetEvents.getServerManager().getVersion();
define(new Builder("player", EntityTypes.PLAYER).setHologramOffset(-0.15D) define(new Builder("player", EntityTypes.PLAYER).setHologramOffset(-0.15D)
.addProperties(EntityPropertyImpl.SKIN, EntityPropertyImpl.SKIN_LAYERS)); .addProperties(EntityPropertyImpl.SKIN, EntityPropertyImpl.SKIN_LAYERS));

@ -1,5 +1,6 @@
package lol.pyr.znpcsplus.user; package lol.pyr.znpcsplus.user;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.HashMap; import java.util.HashMap;
@ -9,6 +10,10 @@ import java.util.UUID;
public class UserManager { public class UserManager {
private final Map<UUID, User> userMap = new HashMap<>(); private final Map<UUID, User> userMap = new HashMap<>();
public UserManager() {
Bukkit.getOnlinePlayers().forEach(this::get);
}
public User get(Player player) { public User get(Player player) {
return get(player.getUniqueId()); return get(player.getUniqueId());
} }
@ -24,4 +29,8 @@ public class UserManager {
public void remove(UUID uuid) { public void remove(UUID uuid) {
userMap.remove(uuid); userMap.remove(uuid);
} }
public void shutdown() {
Bukkit.getOnlinePlayers().forEach(this::remove);
}
} }