diff --git a/main/src/main/java/net/citizensnpcs/Citizens.java b/main/src/main/java/net/citizensnpcs/Citizens.java index df0b74203..58645eac5 100644 --- a/main/src/main/java/net/citizensnpcs/Citizens.java +++ b/main/src/main/java/net/citizensnpcs/Citizens.java @@ -52,9 +52,7 @@ import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.npc.NPCDataStore; import net.citizensnpcs.api.npc.NPCRegistry; import net.citizensnpcs.api.npc.SimpleNPCDataStore; -import net.citizensnpcs.api.scripting.EventRegistrar; -import net.citizensnpcs.api.scripting.ObjectProvider; -import net.citizensnpcs.api.scripting.ScriptCompiler; +import net.citizensnpcs.api.npc.templates.TemplateRegistry; import net.citizensnpcs.api.trait.Trait; import net.citizensnpcs.api.trait.TraitFactory; import net.citizensnpcs.api.trait.TraitInfo; @@ -74,10 +72,10 @@ import net.citizensnpcs.editor.Editor; import net.citizensnpcs.npc.CitizensNPCRegistry; import net.citizensnpcs.npc.CitizensTraitFactory; import net.citizensnpcs.npc.NPCSelector; -import net.citizensnpcs.npc.Template; import net.citizensnpcs.npc.profile.ProfileFetcher; import net.citizensnpcs.npc.skin.Skin; import net.citizensnpcs.trait.ShopTrait; +import net.citizensnpcs.trait.shop.StoredShops; import net.citizensnpcs.util.Messages; import net.citizensnpcs.util.NMS; import net.citizensnpcs.util.PlayerUpdateTask; @@ -149,6 +147,7 @@ public class Citizens extends JavaPlugin implements CitizensPlugin { private NPCSelector selector; private StoredShops shops; private final Map storedRegistries = Maps.newHashMap(); + private TemplateRegistry templateRegistry; private CitizensTraitFactory traitFactory; @Override @@ -272,6 +271,10 @@ public class Citizens extends JavaPlugin implements CitizensPlugin { return shops; } + public TemplateRegistry getTemplateRegistry() { + return templateRegistry; + } + @Override public TraitFactory getTraitFactory() { return traitFactory; @@ -346,13 +349,14 @@ public class Citizens extends JavaPlugin implements CitizensPlugin { Editor.leaveAll(); despawnNPCs(saveOnDisable); HandlerList.unregisterAll(this); + + templateRegistry = null; npcRegistry = null; locationLookup = null; enabled = false; saveOnDisable = true; ProfileFetcher.shutdown(); Skin.clearCache(); - Template.shutdown(); NMS.shutdown(); CitizensAPI.shutdown(); } @@ -378,8 +382,6 @@ public class Citizens extends JavaPlugin implements CitizensPlugin { Bukkit.getPluginManager().disablePlugin(this); return; } - registerScriptHelpers(); - saves = createStorage(getDataFolder()); shops = new StoredShops(new YamlStorage(new File(getDataFolder(), "shops.yml"))); if (saves == null || !shops.loadFromDisk()) { @@ -394,6 +396,7 @@ public class Citizens extends JavaPlugin implements CitizensPlugin { traitFactory = new CitizensTraitFactory(this); traitFactory.registerTrait(TraitInfo.create(ShopTrait.class).withSupplier(() -> new ShopTrait(shops))); selector = new NPCSelector(this); + templateRegistry = new TemplateRegistry(new File(this.getDataFolder(), "templates").toPath()); Bukkit.getPluginManager().registerEvents(new EventListen(), this); Bukkit.getPluginManager().registerEvents(new Placeholders(), this); @@ -406,7 +409,6 @@ public class Citizens extends JavaPlugin implements CitizensPlugin { registerCommands(); NMS.load(commands); - Template.migrate(); Bukkit.getMessenger().registerOutgoingPluginChannel(this, "BungeeCord"); commands.registerTabCompletion(this); commands.setTranslationPrefixProvider(cmd -> "citizens.commands." + cmd.aliases()[0] @@ -446,12 +448,6 @@ public class Citizens extends JavaPlugin implements CitizensPlugin { commands.register(WaypointCommands.class); } - private void registerScriptHelpers() { - ScriptCompiler compiler = CitizensAPI.getScriptCompiler(); - compiler.registerGlobalContextProvider(new EventRegistrar(this)); - compiler.registerGlobalContextProvider(new ObjectProvider("plugin", this)); - } - public void reload() throws NPCLoadException { Editor.leaveAll(); config.reload(); @@ -461,14 +457,14 @@ public class Citizens extends JavaPlugin implements CitizensPlugin { getServer().getPluginManager().callEvent(new CitizensPreReloadEvent()); + templateRegistry = new TemplateRegistry(new File(this.getDataFolder(), "templates").toPath()); + saves.reloadFromSource(); saves.loadInto(npcRegistry); shops.loadFromDisk(); shops.load(); - Template.shutdown(); - getServer().getPluginManager().callEvent(new CitizensReloadEvent()); } diff --git a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java index f632e18b3..7c08039f9 100644 --- a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java +++ b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java @@ -9,6 +9,7 @@ import java.nio.file.Files; import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -56,7 +57,6 @@ import com.google.common.io.BaseEncoding; import net.citizensnpcs.Citizens; import net.citizensnpcs.Settings.Setting; -import net.citizensnpcs.StoredShops; import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.ai.speech.SpeechContext; import net.citizensnpcs.api.ai.tree.StatusMapper; @@ -85,6 +85,8 @@ import net.citizensnpcs.api.npc.MemoryNPCDataStore; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.npc.NPC.NPCUpdate; import net.citizensnpcs.api.npc.NPCRegistry; +import net.citizensnpcs.api.npc.templates.Template; +import net.citizensnpcs.api.npc.templates.TemplateRegistry; import net.citizensnpcs.api.trait.Trait; import net.citizensnpcs.api.trait.trait.Equipment; import net.citizensnpcs.api.trait.trait.Equipment.EquipmentSlot; @@ -105,7 +107,6 @@ import net.citizensnpcs.commands.history.RemoveNPCHistoryItem; import net.citizensnpcs.editor.Editor; import net.citizensnpcs.npc.EntityControllers; import net.citizensnpcs.npc.NPCSelector; -import net.citizensnpcs.npc.Template; import net.citizensnpcs.trait.Age; import net.citizensnpcs.trait.Anchors; import net.citizensnpcs.trait.ArmorStandTrait; @@ -150,6 +151,7 @@ import net.citizensnpcs.trait.SlimeSize; import net.citizensnpcs.trait.VillagerProfession; import net.citizensnpcs.trait.WitherTrait; import net.citizensnpcs.trait.WolfModifiers; +import net.citizensnpcs.trait.shop.StoredShops; import net.citizensnpcs.trait.waypoint.Waypoints; import net.citizensnpcs.util.Anchor; import net.citizensnpcs.util.Messages; @@ -164,11 +166,13 @@ public class NPCCommands { private final CommandHistory history; private final NPCSelector selector; private final StoredShops shops; + private final TemplateRegistry templateRegistry; private final NPCRegistry temporaryRegistry; public NPCCommands(Citizens plugin) { selector = plugin.getNPCSelector(); shops = plugin.getShops(); + templateRegistry = plugin.getTemplateRegistry(); temporaryRegistry = CitizensAPI.createCitizensBackedNPCRegistry(new MemoryNPCDataStore()); history = new CommandHistory(selector); } @@ -840,11 +844,18 @@ public class NPCCommands { Iterable parts = Splitter.on(',').trimResults().split(templateName); StringBuilder builder = new StringBuilder(); for (String part : parts) { - Template template = Template.byName(part); - if (template == null) { + if (part.contains(":")) { + Template template = templateRegistry.getTemplateByNamespacedKey(part); + if (template == null) + continue; + template.apply(npc); + builder.append(StringHelper.wrap(part) + ", "); continue; } - template.apply(npc); + Collection