From 54a94e3b82aa786697819668b140f77d29434c9c Mon Sep 17 00:00:00 2001 From: Xenmai Date: Wed, 7 Feb 2018 15:46:05 +0100 Subject: [PATCH] Improve Advancements They are now built in order. It also wanrs you if they change on reload. Merged the grant and revoke commands into one. --- .../denizen2sponge/Denizen2Sponge.java | 10 +- .../Denizen2SpongeImplementation.java | 11 +- .../commands/player/AdvancementCommand.java | 82 ++++++++++++++ .../player/GrantAdvancementCommand.java | 66 ------------ .../player/RevokeAdvancementCommand.java | 66 ------------ .../spongescripts/AdvancementScript.java | 100 +++++++++++------- 6 files changed, 164 insertions(+), 171 deletions(-) create mode 100644 src/main/java/com/denizenscript/denizen2sponge/commands/player/AdvancementCommand.java delete mode 100644 src/main/java/com/denizenscript/denizen2sponge/commands/player/GrantAdvancementCommand.java delete mode 100644 src/main/java/com/denizenscript/denizen2sponge/commands/player/RevokeAdvancementCommand.java diff --git a/src/main/java/com/denizenscript/denizen2sponge/Denizen2Sponge.java b/src/main/java/com/denizenscript/denizen2sponge/Denizen2Sponge.java index 6fef9c5..20c836a 100644 --- a/src/main/java/com/denizenscript/denizen2sponge/Denizen2Sponge.java +++ b/src/main/java/com/denizenscript/denizen2sponge/Denizen2Sponge.java @@ -38,6 +38,7 @@ import org.spongepowered.api.event.Listener; import org.spongepowered.api.event.cause.Cause; import org.spongepowered.api.event.cause.EventContext; +import org.spongepowered.api.event.game.state.GamePostInitializationEvent; import org.spongepowered.api.event.game.state.GamePreInitializationEvent; import org.spongepowered.api.event.game.state.GameStoppedEvent; import org.spongepowered.api.plugin.Plugin; @@ -149,6 +150,7 @@ public void onServerStart(GamePreInitializationEvent event) { Denizen2Core.register(new RememberInventoryCommand()); // Commands: Player Denizen2Core.register(new ActionBarCommand()); + Denizen2Core.register(new AdvancementCommand()); Denizen2Core.register(new BanCommand()); Denizen2Core.register(new CooldownCommand()); Denizen2Core.register(new CreateBossBarCommand()); @@ -156,13 +158,11 @@ public void onServerStart(GamePreInitializationEvent event) { Denizen2Core.register(new FeedCommand()); Denizen2Core.register(new GamemodeCommand()); Denizen2Core.register(new GiveCommand()); - Denizen2Core.register(new GrantAdvancementCommand()); Denizen2Core.register(new HotbarCommand()); Denizen2Core.register(new KickCommand()); Denizen2Core.register(new NarrateCommand()); Denizen2Core.register(new PardonCommand()); Denizen2Core.register(new RemoveBossBarCommand()); - Denizen2Core.register(new RevokeAdvancementCommand()); Denizen2Core.register(new TabListCommand()); Denizen2Core.register(new TakeCommand()); Denizen2Core.register(new TellCommand()); @@ -285,6 +285,12 @@ public void onServerStart(GamePreInitializationEvent event) { // TODO: Config option -> readyToSpamEvents = true; } + @Listener + public void onServerStarted(GamePostInitializationEvent event) { + // Build the already loaded advancement scripts + AdvancementScript.buildAll(); + } + public File getMainDirectory() { return new File("./config/denizen/"); } diff --git a/src/main/java/com/denizenscript/denizen2sponge/Denizen2SpongeImplementation.java b/src/main/java/com/denizenscript/denizen2sponge/Denizen2SpongeImplementation.java index e85c207..e27b4b5 100644 --- a/src/main/java/com/denizenscript/denizen2sponge/Denizen2SpongeImplementation.java +++ b/src/main/java/com/denizenscript/denizen2sponge/Denizen2SpongeImplementation.java @@ -4,8 +4,9 @@ import com.denizenscript.denizen2core.commands.CommandEntry; import com.denizenscript.denizen2core.commands.CommandQueue; import com.denizenscript.denizen2core.utilities.ErrorInducedException; -import com.denizenscript.denizen2sponge.spongeevents.Denizen2SpongeReloadEvent; import com.denizenscript.denizen2core.utilities.debugging.Debug; +import com.denizenscript.denizen2sponge.spongeevents.Denizen2SpongeReloadEvent; +import com.denizenscript.denizen2sponge.spongescripts.AdvancementScript; import com.denizenscript.denizen2sponge.spongescripts.GameCommandScript; import org.spongepowered.api.Sponge; import org.spongepowered.api.text.Text; @@ -13,12 +14,15 @@ import org.spongepowered.api.text.serializer.TextSerializers; import java.io.File; +import java.util.HashSet; public class Denizen2SpongeImplementation extends Denizen2Implementation { @Override public void preReload() { GameCommandScript.clear(); + AdvancementScript.oldAdvancementScripts = new HashSet<>(AdvancementScript.currentAdvancementScripts.keySet()); + AdvancementScript.currentAdvancementScripts.clear(); } @Override @@ -28,6 +32,11 @@ public void midLoad() { @Override public void reload() { + if (!AdvancementScript.oldAdvancementScripts.equals(AdvancementScript.currentAdvancementScripts.keySet())) { + Debug.info("Advancement scripts have changed, but won't have any effect. " + + "Restart the server for the new advancements to be registered!"); + } + AdvancementScript.buildAll(); Sponge.getEventManager().post(new Denizen2SpongeReloadEvent(Denizen2Sponge.getGenericCause())); // ...? } diff --git a/src/main/java/com/denizenscript/denizen2sponge/commands/player/AdvancementCommand.java b/src/main/java/com/denizenscript/denizen2sponge/commands/player/AdvancementCommand.java new file mode 100644 index 0000000..5bd6913 --- /dev/null +++ b/src/main/java/com/denizenscript/denizen2sponge/commands/player/AdvancementCommand.java @@ -0,0 +1,82 @@ +package com.denizenscript.denizen2sponge.commands.player; + +import com.denizenscript.denizen2core.commands.AbstractCommand; +import com.denizenscript.denizen2core.commands.CommandEntry; +import com.denizenscript.denizen2core.commands.CommandQueue; +import com.denizenscript.denizen2core.tags.objects.BooleanTag; +import com.denizenscript.denizen2core.utilities.debugging.ColorSet; +import com.denizenscript.denizen2core.utilities.debugging.Debug; +import com.denizenscript.denizen2sponge.tags.objects.PlayerTag; +import com.denizenscript.denizen2sponge.utilities.Utilities; +import org.spongepowered.api.advancement.Advancement; + +public class AdvancementCommand extends AbstractCommand { + + // <--[command] + // @Since 0.4.0 + // @Name advancement + // @Arguments + // @Short manages the state of a player's advancement. + // @Updated 2018/02/06 + // @Group Player + // @Minimum 3 + // @Maximum 3 + // @Description + // Manages the state of a player's advancement. Set the state + // to true to grant the advancement, and to false to revoke it. + // @Example + // # This example grants the advancement "iron_man" to the player. + // - advancement iron_man true + // @Example + // # This example revokes the advancement "legend" from the player. + // - advancement legend false + // --> + + @Override + public String getName() { + return "advancement"; + } + + @Override + public String getArguments() { + return " "; + } + + @Override + public int getMinimumArguments() { + return 3; + } + + @Override + public int getMaximumArguments() { + return 3; + } + + @Override + public void execute(CommandQueue queue, CommandEntry entry) { + PlayerTag player = PlayerTag.getFor(queue.error, entry.getArgumentObject(queue, 0)); + String id = entry.getArgumentObject(queue, 1).toString(); + Advancement advancement = (Advancement) Utilities.getTypeWithDefaultPrefix(Advancement.class, id); + if (advancement == null) { + Debug.error("There's no registered advancement that matches the specified id!"); + return; + } + BooleanTag state = BooleanTag.getFor(queue.error, entry.getArgumentObject(queue, 2)); + if (state.getInternal()) { + player.getOnline(queue.error).getProgress(advancement).grant(); + if (queue.shouldShowGood()) { + queue.outGood("Granting advancement '" + ColorSet.emphasis + advancement.getId() + + ColorSet.good + "' to player '" + ColorSet.emphasis + player.debug() + + ColorSet.good + "'!"); + } + } + else { + player.getOnline(queue.error).getProgress(advancement).revoke(); + if (queue.shouldShowGood()) { + queue.outGood("Revoking advancement '" + ColorSet.emphasis + advancement.getId() + + ColorSet.good + "' from player '" + ColorSet.emphasis + player.debug() + + ColorSet.good + "'!"); + } + } + } +} diff --git a/src/main/java/com/denizenscript/denizen2sponge/commands/player/GrantAdvancementCommand.java b/src/main/java/com/denizenscript/denizen2sponge/commands/player/GrantAdvancementCommand.java deleted file mode 100644 index 5966bd4..0000000 --- a/src/main/java/com/denizenscript/denizen2sponge/commands/player/GrantAdvancementCommand.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.denizenscript.denizen2sponge.commands.player; - -import com.denizenscript.denizen2core.commands.AbstractCommand; -import com.denizenscript.denizen2core.commands.CommandEntry; -import com.denizenscript.denizen2core.commands.CommandQueue; -import com.denizenscript.denizen2core.utilities.debugging.ColorSet; -import com.denizenscript.denizen2core.utilities.debugging.Debug; -import com.denizenscript.denizen2sponge.tags.objects.PlayerTag; -import com.denizenscript.denizen2sponge.utilities.Utilities; -import org.spongepowered.api.advancement.Advancement; - -public class GrantAdvancementCommand extends AbstractCommand { - - // <--[command] - // @Since 0.4.0 - // @Name grantadvancement - // @Arguments - // @Short grants an advancement to a player. - // @Updated 2018/02/06 - // @Group Player - // @Minimum 2 - // @Maximum 2 - // @Description - // Grants an advancement to a player. - // @Example - // # This example grants the advancement "iron_man" to the player. - // - grantadvancement iron_man - // --> - - @Override - public String getName() { - return "grantadvancement"; - } - - @Override - public String getArguments() { - return " "; - } - - @Override - public int getMinimumArguments() { - return 2; - } - - @Override - public int getMaximumArguments() { - return 2; - } - - @Override - public void execute(CommandQueue queue, CommandEntry entry) { - PlayerTag player = PlayerTag.getFor(queue.error, entry.getArgumentObject(queue, 0)); - String id = entry.getArgumentObject(queue, 1).toString(); - Advancement advancement = (Advancement) Utilities.getTypeWithDefaultPrefix(Advancement.class, id); - if (advancement == null) { - Debug.error("There's no registered advancement that matches the specified id!"); - return; - } - player.getOnline(queue.error).getProgress(advancement).grant(); - if (queue.shouldShowGood()) { - queue.outGood("Granting advancement '" + ColorSet.emphasis + advancement.getId() - + ColorSet.good + "' to player '" + ColorSet.emphasis + player.debug() - + ColorSet.good + "'!"); - } - } -} diff --git a/src/main/java/com/denizenscript/denizen2sponge/commands/player/RevokeAdvancementCommand.java b/src/main/java/com/denizenscript/denizen2sponge/commands/player/RevokeAdvancementCommand.java deleted file mode 100644 index 92fc44f..0000000 --- a/src/main/java/com/denizenscript/denizen2sponge/commands/player/RevokeAdvancementCommand.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.denizenscript.denizen2sponge.commands.player; - -import com.denizenscript.denizen2core.commands.AbstractCommand; -import com.denizenscript.denizen2core.commands.CommandEntry; -import com.denizenscript.denizen2core.commands.CommandQueue; -import com.denizenscript.denizen2core.utilities.debugging.ColorSet; -import com.denizenscript.denizen2core.utilities.debugging.Debug; -import com.denizenscript.denizen2sponge.tags.objects.PlayerTag; -import com.denizenscript.denizen2sponge.utilities.Utilities; -import org.spongepowered.api.advancement.Advancement; - -public class RevokeAdvancementCommand extends AbstractCommand { - - // <--[command] - // @Since 0.4.0 - // @Name revokeadvancement - // @Arguments - // @Short revokes an advancement from a player. - // @Updated 2018/02/06 - // @Group Player - // @Minimum 2 - // @Maximum 2 - // @Description - // Revokes an advancement from a player. - // @Example - // # This example revokes the advancement "iron_man" from the player. - // - revokeadvancement iron_man - // --> - - @Override - public String getName() { - return "revokeadvancement"; - } - - @Override - public String getArguments() { - return " "; - } - - @Override - public int getMinimumArguments() { - return 2; - } - - @Override - public int getMaximumArguments() { - return 2; - } - - @Override - public void execute(CommandQueue queue, CommandEntry entry) { - PlayerTag player = PlayerTag.getFor(queue.error, entry.getArgumentObject(queue, 0)); - String id = entry.getArgumentObject(queue, 1).toString(); - Advancement advancement = (Advancement) Utilities.getTypeWithDefaultPrefix(Advancement.class, id); - if (advancement == null) { - Debug.error("There's no registered advancement that matches the specified id!"); - return; - } - player.getOnline(queue.error).getProgress(advancement).revoke(); - if (queue.shouldShowGood()) { - queue.outGood("Revoking advancement '" + ColorSet.emphasis + advancement.getId() - + ColorSet.good + "' from player '" + ColorSet.emphasis + player.debug() - + ColorSet.good + "'!"); - } - } -} diff --git a/src/main/java/com/denizenscript/denizen2sponge/spongescripts/AdvancementScript.java b/src/main/java/com/denizenscript/denizen2sponge/spongescripts/AdvancementScript.java index c250ef3..60de5d0 100644 --- a/src/main/java/com/denizenscript/denizen2sponge/spongescripts/AdvancementScript.java +++ b/src/main/java/com/denizenscript/denizen2sponge/spongescripts/AdvancementScript.java @@ -5,11 +5,9 @@ import com.denizenscript.denizen2core.scripts.CommandScript; import com.denizenscript.denizen2core.tags.AbstractTagObject; import com.denizenscript.denizen2core.tags.objects.BooleanTag; -import com.denizenscript.denizen2core.tags.objects.IntegerTag; import com.denizenscript.denizen2core.tags.objects.NumberTag; import com.denizenscript.denizen2core.utilities.debugging.ColorSet; import com.denizenscript.denizen2core.utilities.debugging.Debug; -import com.denizenscript.denizen2core.utilities.yaml.StringHolder; import com.denizenscript.denizen2core.utilities.yaml.YAMLConfiguration; import com.denizenscript.denizen2sponge.Denizen2Sponge; import com.denizenscript.denizen2sponge.tags.objects.FormattedTextTag; @@ -19,18 +17,21 @@ import org.spongepowered.api.Sponge; import org.spongepowered.api.advancement.*; import org.spongepowered.api.advancement.criteria.AdvancementCriterion; -import org.spongepowered.api.advancement.criteria.ScoreAdvancementCriterion; import org.spongepowered.api.event.Listener; import org.spongepowered.api.event.advancement.AdvancementTreeEvent; import org.spongepowered.api.event.game.GameRegistryEvent; import java.util.HashMap; +import java.util.HashSet; import java.util.Optional; +import java.util.Set; public class AdvancementScript extends CommandScript { public static HashMap currentAdvancementScripts = new HashMap<>(); + public static Set oldAdvancementScripts = new HashSet<>(); + // <--[explanation] // @Since 0.4.0 // @Name Advancement Scripts @@ -49,8 +50,14 @@ public class AdvancementScript extends CommandScript { public AdvancementScript(String name, YAMLConfiguration section) { super(name, section); + id = section.getString("id"); + parentId = section.getString("parent", null); } + public String id; + + public String parentId; + @Override public boolean isExecutable(String section) { return false; @@ -65,41 +72,51 @@ public boolean init() { return false; } - public Advancement advancement; + public void register() { + Sponge.getEventManager().registerListeners(Denizen2Sponge.instance, this); + if (Denizen2Core.getImplementation().generalDebug()) { + Debug.good("Registering advancement script '" + ColorSet.emphasis + id + + ColorSet.good + "' to Denizen2Sponge..."); + } + if (currentAdvancementScripts.containsKey(id)) { + Debug.error("An advancement script with id '" + ColorSet.emphasis + id + + ColorSet.good + "' has already been registered!"); + return; + } + currentAdvancementScripts.put(id, this); + } - public AdvancementTree tree = null; + public static void buildAll() { + for (AdvancementScript script : currentAdvancementScripts.values()) { + script.buildTree(); + } + } - public Vector2d position; + public Advancement advancement = null; - public void register() { - Sponge.getEventManager().registerListeners(Denizen2Sponge.instance, this); - String id = contents.getString("id"); + public void buildTree() { + if (advancement != null) { + return; + } + if (parentId != null) { + currentAdvancementScripts.get(parentId).buildTree(); + } if (Denizen2Core.getImplementation().generalDebug()) { - Debug.good("Registering advancement script " + ColorSet.emphasis + id - + ColorSet.good + " to Denizen2Sponge..."); + Debug.good("Building advancement '" + ColorSet.emphasis + id + ColorSet.good + "'..."); } + buildAdvancement(); + } + + public AdvancementTree tree = null; + + public Vector2d position; + + public void buildAdvancement() { Advancement.Builder builder = Advancement.builder().id(id); if (contents.contains("name")) { builder.name(contents.getString("name")); } - AdvancementCriterion criterion = AdvancementCriterion.EMPTY; - YAMLConfiguration criteria = contents.getConfigurationSection("criteria"); - for (StringHolder strh : criteria.getKeys(false)) { - String critNumber = strh.low; - String critName = criteria.getString(critNumber + ".name"); - AdvancementCriterion.BaseBuilder toAdd = AdvancementCriterion.builder().name(critName); - if (criteria.contains(critName + ".score")) { - boolean score = BooleanTag.getFor(Debug::error, - criteria.getString(critName + ".score")).getInternal(); - if (score) { - IntegerTag goal = IntegerTag.getFor(Debug::error, - criteria.getString(critName + ".goal")); - ((ScoreAdvancementCriterion.Builder) toAdd).goal((int) goal.getInternal()); - } - } - criterion = criterion.and(toAdd.build()); - } - builder.criterion(criterion); + builder.criterion(AdvancementCriterion.DUMMY); String typeId = contents.getString("display"); Optional type = Sponge.getRegistry().getType(AdvancementType.class, typeId); if (!type.isPresent()) { @@ -134,12 +151,15 @@ public void register() { ItemTypeTag icon = ItemTypeTag.getFor(Debug::error, contents.getString("icon")); info.icon(icon.getInternal()); builder.displayInfo(info.build()); - if (criteria.contains("parent")) { + if (contents.contains("parent")) { String parentId = contents.getString("parent"); Advancement parent = (Advancement) Utilities.getTypeWithDefaultPrefix(Advancement.class, parentId); if (parent == null) { - Debug.error("There's no registered advancement for the parent id specified!"); - return; + if (!currentAdvancementScripts.containsKey(parentId)) { + Debug.error("There's no registered advancement for the parent id specified!"); + return; + } + parent = currentAdvancementScripts.get(parentId).advancement; } builder.parent(parent); advancement = builder.build(); @@ -157,7 +177,6 @@ public void register() { treeBuilder.rootAdvancement(advancement); tree = treeBuilder.build(); } - currentAdvancementScripts.put(id, this); NumberTag x = NumberTag.getFor(Debug::error, contents.getString("x_position")); NumberTag y = NumberTag.getFor(Debug::error, contents.getString("y_position")); position = new Vector2d(x.getInternal(), y.getInternal()); @@ -171,14 +190,20 @@ public boolean isTreeRoot() { public void onRegisterAdvancementTrees(GameRegistryEvent.Register event) { if (isTreeRoot()) { event.register(tree); - Debug.good("Registering advancement tree '" + tree.getId() + "' to Sponge..."); + if (Denizen2Core.getImplementation().generalDebug()) { + Debug.good("Registering advancement tree '" + ColorSet.emphasis + tree.getId() + + ColorSet.good + "' to Sponge..."); + } } } @Listener public void onRegisterAdvancements(GameRegistryEvent.Register event) { event.register(advancement); - Debug.good("Registering advancement '" + advancement.getId() + "' to Sponge..."); + if (Denizen2Core.getImplementation().generalDebug()) { + Debug.good("Registering advancement '" + ColorSet.emphasis + advancement.getId() + + ColorSet.good + "' to Sponge..."); + } } @Listener @@ -189,7 +214,10 @@ public void onGenerateTreeLayout(AdvancementTreeEvent.GenerateLayout event) { .get(Utilities.getIdWithoutDefaultPrefix(element.getAdvancement().getId())).position; element.setPosition(pos); } - Debug.good("Updating layout for tree '" + tree.getId() + "'..."); + if (Denizen2Core.getImplementation().generalDebug()) { + Debug.good("Updating layout for tree '" + ColorSet.emphasis + + tree.getId() + ColorSet.good + "'..."); + } } } }