From e64816eda236e6c920ef2456141270e399b1aab8 Mon Sep 17 00:00:00 2001 From: fullwall Date: Wed, 14 Jun 2023 23:45:36 +0800 Subject: [PATCH] Make triggers prompt pause the pathfinding to prevent difficult states to problem solve. Add CommandTrigger. --- .../citizensnpcs/commands/NPCCommands.java | 17 ++++++++ .../trait/versioned/CatTrait.java | 7 ++++ .../waypoint/LinearWaypointProvider.java | 6 ++- .../triggers/AnimationTriggerPrompt.java | 6 ++- .../waypoint/triggers/CommandTrigger.java | 32 ++++++++++++++ .../triggers/CommandTriggerPrompt.java | 42 +++++++++++++++++++ .../triggers/WaypointTriggerRegistry.java | 1 + .../java/net/citizensnpcs/util/Messages.java | 4 ++ .../src/main/resources/messages_en.properties | 4 ++ 9 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 main/src/main/java/net/citizensnpcs/trait/waypoint/triggers/CommandTrigger.java create mode 100644 main/src/main/java/net/citizensnpcs/trait/waypoint/triggers/CommandTriggerPrompt.java diff --git a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java index f14a7de21..29a1aecdd 100644 --- a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java +++ b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java @@ -1339,6 +1339,23 @@ public class NPCCommands { NMS.setShouldJump(npc.getEntity()); } + @Command( + aliases = { "npc" }, + usage = "knockback (--explicit true|false)", + desc = "Toggle NPC knockback", + modifiers = { "knockback" }, + min = 1, + max = 1, + permission = "citizens.npc.knockback") + public void knockback(CommandContext args, CommandSender sender, NPC npc, @Flag("explicit") Boolean explicit) { + boolean kb = !npc.data().get(NPC.Metadata.KNOCKBACK, true); + if (explicit != null) { + kb = explicit; + } + npc.data().set(NPC.Metadata.KNOCKBACK, kb); + Messaging.sendTr(sender, kb ? Messages.KNOCKBACK_SET : Messages.KNOCKBACK_UNSET, npc.getName()); + } + @Command( aliases = { "npc" }, usage = "leashable", diff --git a/main/src/main/java/net/citizensnpcs/trait/versioned/CatTrait.java b/main/src/main/java/net/citizensnpcs/trait/versioned/CatTrait.java index f382c9095..e3a4ef91f 100644 --- a/main/src/main/java/net/citizensnpcs/trait/versioned/CatTrait.java +++ b/main/src/main/java/net/citizensnpcs/trait/versioned/CatTrait.java @@ -66,10 +66,17 @@ public class CatTrait extends Trait { } public void setType(Cat.Type type) { + if (type == null) { + type = Cat.Type.BLACK; + } this.type = type; } public void setType(Type type2) { + if (type2 == null) { + this.type = Cat.Type.BLACK; + return; + } switch (type2) { case WILD_OCELOT: this.type = Cat.Type.CALICO; diff --git a/main/src/main/java/net/citizensnpcs/trait/waypoint/LinearWaypointProvider.java b/main/src/main/java/net/citizensnpcs/trait/waypoint/LinearWaypointProvider.java index 00549421a..3dc83c19b 100644 --- a/main/src/main/java/net/citizensnpcs/trait/waypoint/LinearWaypointProvider.java +++ b/main/src/main/java/net/citizensnpcs/trait/waypoint/LinearWaypointProvider.java @@ -326,7 +326,11 @@ public class LinearWaypointProvider implements EnumerableWaypointProvider { event.setCancelled(true); Bukkit.getScheduler().scheduleSyncDelayedTask(CitizensAPI.getPlugin(), () -> { conversation = TriggerEditPrompt.start(player, LinearWaypointEditor.this); - conversation.addConversationAbandonedListener(e -> conversation = null); + conversation.addConversationAbandonedListener(e -> { + setPaused(false); + conversation = null; + }); + setPaused(true); }); } else if (message.equalsIgnoreCase("clear")) { event.setCancelled(true); diff --git a/main/src/main/java/net/citizensnpcs/trait/waypoint/triggers/AnimationTriggerPrompt.java b/main/src/main/java/net/citizensnpcs/trait/waypoint/triggers/AnimationTriggerPrompt.java index a41e9504e..99742f87b 100644 --- a/main/src/main/java/net/citizensnpcs/trait/waypoint/triggers/AnimationTriggerPrompt.java +++ b/main/src/main/java/net/citizensnpcs/trait/waypoint/triggers/AnimationTriggerPrompt.java @@ -56,7 +56,11 @@ public class AnimationTriggerPrompt extends StringPrompt implements WaypointTrig @Override public WaypointTrigger createFromShortInput(ConversationContext context, String input) { - return null; + PlayerAnimation anim = Util.matchEnum(PlayerAnimation.values(), input); + if (anim == null) + return null; + + return new AnimationTrigger(Lists.newArrayList(anim), at); } @Override diff --git a/main/src/main/java/net/citizensnpcs/trait/waypoint/triggers/CommandTrigger.java b/main/src/main/java/net/citizensnpcs/trait/waypoint/triggers/CommandTrigger.java new file mode 100644 index 000000000..bf23ba9ba --- /dev/null +++ b/main/src/main/java/net/citizensnpcs/trait/waypoint/triggers/CommandTrigger.java @@ -0,0 +1,32 @@ +package net.citizensnpcs.trait.waypoint.triggers; + +import java.util.Collection; + +import org.bukkit.Location; + +import com.google.common.base.Joiner; + +import net.citizensnpcs.api.npc.NPC; +import net.citizensnpcs.api.persistence.Persist; +import net.citizensnpcs.util.Util; + +public class CommandTrigger implements WaypointTrigger { + @Persist(required = true) + private final Collection commands; + + public CommandTrigger(Collection commands) { + this.commands = commands; + } + + @Override + public String description() { + return String.format("[[Command]] running %s", Joiner.on(", ").join(commands)); + } + + @Override + public void onWaypointReached(NPC npc, Location waypoint) { + for (String command : commands) { + Util.runCommand(npc, null, command, false, false); + } + } +} diff --git a/main/src/main/java/net/citizensnpcs/trait/waypoint/triggers/CommandTriggerPrompt.java b/main/src/main/java/net/citizensnpcs/trait/waypoint/triggers/CommandTriggerPrompt.java new file mode 100644 index 000000000..7800df58e --- /dev/null +++ b/main/src/main/java/net/citizensnpcs/trait/waypoint/triggers/CommandTriggerPrompt.java @@ -0,0 +1,42 @@ +package net.citizensnpcs.trait.waypoint.triggers; + +import java.util.List; + +import org.bukkit.command.CommandSender; +import org.bukkit.conversations.ConversationContext; +import org.bukkit.conversations.Prompt; +import org.bukkit.conversations.StringPrompt; + +import com.google.common.collect.Lists; + +import net.citizensnpcs.api.util.Messaging; +import net.citizensnpcs.util.Messages; + +public class CommandTriggerPrompt extends StringPrompt implements WaypointTriggerPrompt { + private final List commands = Lists.newArrayList(); + + @Override + public Prompt acceptInput(ConversationContext context, String input) { + if (input.equalsIgnoreCase("back")) { + return (Prompt) context.getSessionData("previous"); + } + if (input.equalsIgnoreCase("finish")) { + context.setSessionData(WaypointTriggerPrompt.CREATED_TRIGGER_KEY, new CommandTrigger(commands)); + return (Prompt) context.getSessionData(WaypointTriggerPrompt.RETURN_PROMPT_KEY); + } + commands.add(input); + Messaging.sendTr((CommandSender) context.getForWhom(), Messages.COMMAND_TRIGGER_ADDED, input); + return this; + } + + @Override + public WaypointTrigger createFromShortInput(ConversationContext context, String input) { + return new CommandTrigger(Lists.newArrayList(input)); + } + + @Override + public String getPromptText(ConversationContext context) { + Messaging.sendTr((CommandSender) context.getForWhom(), Messages.COMMAND_TRIGGER_PROMPT); + return ""; + } +} diff --git a/main/src/main/java/net/citizensnpcs/trait/waypoint/triggers/WaypointTriggerRegistry.java b/main/src/main/java/net/citizensnpcs/trait/waypoint/triggers/WaypointTriggerRegistry.java index 93a115e66..978361ec3 100644 --- a/main/src/main/java/net/citizensnpcs/trait/waypoint/triggers/WaypointTriggerRegistry.java +++ b/main/src/main/java/net/citizensnpcs/trait/waypoint/triggers/WaypointTriggerRegistry.java @@ -61,6 +61,7 @@ public class WaypointTriggerRegistry implements Persister { static { addTrigger("animation", AnimationTrigger.class, AnimationTriggerPrompt.class); + addTrigger("command", AnimationTrigger.class, CommandTriggerPrompt.class); addTrigger("chat", ChatTrigger.class, ChatTriggerPrompt.class); addTrigger("delay", DelayTrigger.class, DelayTriggerPrompt.class); addTrigger("teleport", TeleportTrigger.class, TeleportTriggerPrompt.class); diff --git a/main/src/main/java/net/citizensnpcs/util/Messages.java b/main/src/main/java/net/citizensnpcs/util/Messages.java index 31cec9941..0eba25a26 100644 --- a/main/src/main/java/net/citizensnpcs/util/Messages.java +++ b/main/src/main/java/net/citizensnpcs/util/Messages.java @@ -76,6 +76,8 @@ public class Messages { public static final String COMMAND_RIGHT_HAND_HEADER = "citizens.commands.npc.command.right-hand-header"; public static final String COMMAND_SAVE_HELP = "citizens.commands.citizens.save.help"; public static final String COMMAND_TEMPORARY_PERMISSIONS_SET = "citizens.commands.npc.command.temporary-permissions-set"; + public static final String COMMAND_TRIGGER_ADDED = "citizens.editors.waypoints.triggers.command.added"; + public static final String COMMAND_TRIGGER_PROMPT = "citizens.editors.waypoints.triggers.command.prompt"; public static final String COMMAND_UNKNOWN_COMMAND_ID = "citizens.commands.npc.command.unknown-id"; public static final String COMMANDS_PERSIST_SEQUENCE_SET = "citizens.commands.npc.command.persist-sequence-set"; public static final String COMMANDS_PERSIST_SEQUENCE_UNSET = "citizens.commands.npc.command.persist-sequence-unset"; @@ -199,6 +201,8 @@ public class Messages { public static final String INVALID_TROPICALFISH_PATTERN = "citizens.commands.npc.tropicalfish.invalid-pattern"; public static final String INVALID_VILLAGER_TYPE = "citizens.commands.npc.villager.invalid-type"; public static final String ITEM_SET = "citizens.commands.npc.item.item-set"; + public static final String KNOCKBACK_SET = "citizens.commands.npc.knockback.set"; + public static final String KNOCKBACK_UNSET = "citizens.commands.npc.knockback.unset"; public static final String LEASHABLE_SET = "citizens.commands.npc.leashable.set"; public static final String LEASHABLE_STOPPED = "citizens.commands.npc.leashable.stopped"; public static final String LINEAR_WAYPOINT_EDITOR_ADDED_WAYPOINT = "citizens.editors.waypoints.linear.added-waypoint"; diff --git a/main/src/main/resources/messages_en.properties b/main/src/main/resources/messages_en.properties index 7f15b3995..cae586d5e 100644 --- a/main/src/main/resources/messages_en.properties +++ b/main/src/main/resources/messages_en.properties @@ -143,6 +143,8 @@ citizens.commands.npc.hurt.not-damageable=NPC type [[{0}]] cannot be hurt. citizens.commands.npc.hurt.protected=NPC is protected and cannot be hurt. [[Click to unprotect citizens.commands.npc.item.item-set=NPC item set to [[{0}]]. citizens.commands.npc.item.unknown-material=Unknown material given. +citizens.commands.npc.knockback.set=[[{0}]] will now take knockback. +citizens.commands.npc.knockback.unset=[[{0}]] will no longer take knockback. citizens.commands.npc.leashable.set=[[{0}]] is now leashable. citizens.commands.npc.leashable.stopped=[[{0}]] is no longer leashable. citizens.commands.npc.llama.strength-set=Llama strength set to [[{0}]]. @@ -433,6 +435,8 @@ citizens.editors.waypoints.triggers.add.prompt=Enter in a trigger name to add or citizens.editors.waypoints.triggers.animation.added=Animation [[{0}]] added. citizens.editors.waypoints.triggers.animation.at-set=Animation location set to [[{0}]]. citizens.editors.waypoints.triggers.list=Current triggers are:{0} +citizens.editors.waypoints.triggers.command.added=Command [[{0}]] added. +citizens.editors.waypoints.triggers.command.prompt=Enter one or more commands (without the leading slash). citizens.editors.waypoints.triggers.animation.prompt=Enter in animations to perform - valid animations are {0}.
[[at (x:y:z:world)]] optionally set a location to perform the animation at.
Type in [[finish]] to finish the animation trigger or [[back]] to return to the previous prompt. citizens.editors.waypoints.triggers.animation.invalid-animation=Invalid animation [[{0}]]. Valid animations are {1}. citizens.editors.waypoints.triggers.chat.invalid-radius=The radius must be a number.