From 0a3ab06852b1d90e943caceea8c739d92ab442e3 Mon Sep 17 00:00:00 2001
From: fullwall <fullwall25@gmail.com>
Date: Fri, 31 Jan 2025 01:48:40 +0800
Subject: [PATCH] Fix an exception with tab completion of attributes

---
 .../citizensnpcs/commands/NPCCommands.java    | 16 +++------
 .../net/citizensnpcs/trait/BoatTrait.java     | 35 -------------------
 .../net/citizensnpcs/trait/ShopTrait.java     |  2 +-
 .../trait/versioned/BoatTrait.java            | 11 ++++--
 4 files changed, 13 insertions(+), 51 deletions(-)
 delete mode 100644 main/src/main/java/net/citizensnpcs/trait/BoatTrait.java

diff --git a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java
index 462bc95c5..881fd18f3 100644
--- a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java
+++ b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java
@@ -69,7 +69,7 @@ import net.citizensnpcs.api.CitizensAPI;
 import net.citizensnpcs.api.ai.speech.SpeechContext;
 import net.citizensnpcs.api.ai.tree.StatusMapper;
 import net.citizensnpcs.api.command.Arg;
-import net.citizensnpcs.api.command.Arg.CompletionsProvider.OptionalEnumCompletions;
+import net.citizensnpcs.api.command.Arg.CompletionsProvider.OptionalKeyedCompletions;
 import net.citizensnpcs.api.command.Command;
 import net.citizensnpcs.api.command.CommandContext;
 import net.citizensnpcs.api.command.CommandMessages;
@@ -3799,17 +3799,9 @@ public class NPCCommands {
                 trait.isTamed(), trait.getCollarColor().name());
     }
 
-    public static class OptionalAttributeCompletions implements Arg.CompletionsProvider {
-        @Override
-        public Collection<String> getCompletions(CommandContext args, CommandSender sender, NPC npc) {
-            return Arrays.stream(Attribute.values()).map(attr -> attr.getKey().toString()).collect(Collectors.toList());
-        }
-    }
-
-    public static class OptionalBoatTypeCompletions extends OptionalEnumCompletions {
-        @Override
-        public String getEnumClassName() {
-            return "org.bukkit.entity.Boat.Type";
+    public static class OptionalAttributeCompletions extends OptionalKeyedCompletions {
+        public OptionalAttributeCompletions() {
+            super("org.bukkit.attribute.Attribute");
         }
     }
 
diff --git a/main/src/main/java/net/citizensnpcs/trait/BoatTrait.java b/main/src/main/java/net/citizensnpcs/trait/BoatTrait.java
deleted file mode 100644
index 3752996b8..000000000
--- a/main/src/main/java/net/citizensnpcs/trait/BoatTrait.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package net.citizensnpcs.trait;
-
-import org.bukkit.entity.Boat;
-
-import net.citizensnpcs.api.persistence.Persist;
-import net.citizensnpcs.api.trait.Trait;
-import net.citizensnpcs.api.trait.TraitName;
-
-@TraitName("boattrait")
-public class BoatTrait extends Trait {
-    @Persist
-    private Boat.Type type;
-
-    public BoatTrait() {
-        super("boattrait");
-    }
-
-    public Boat.Type getType() {
-        return type;
-    }
-
-    @Override
-    public void onSpawn() {
-        if (npc.getEntity() instanceof Boat) {
-            if (type != null) {
-                ((Boat) npc.getEntity()).setBoatType(type);
-            }
-        }
-    }
-
-    public void setType(Boat.Type type) {
-        this.type = type;
-        onSpawn();
-    }
-}
\ No newline at end of file
diff --git a/main/src/main/java/net/citizensnpcs/trait/ShopTrait.java b/main/src/main/java/net/citizensnpcs/trait/ShopTrait.java
index ec6675da9..ee1189c89 100644
--- a/main/src/main/java/net/citizensnpcs/trait/ShopTrait.java
+++ b/main/src/main/java/net/citizensnpcs/trait/ShopTrait.java
@@ -679,7 +679,7 @@ public class ShopTrait extends Trait {
                 return;
 
             InputMenus.runChatStringSetter(ctx.getMenu(), event,
-                    "Enter the new item description, currently:<br>[[" + (modified.display.getItemMeta().hasLore()
+                    "Type the new item description, currently:<br>[[" + (modified.display.getItemMeta().hasLore()
                             ? Joiner.on("<br>").skipNulls().join(modified.display.getItemMeta().getLore())
                             : "Unset"),
                     description -> {
diff --git a/main/src/main/java/net/citizensnpcs/trait/versioned/BoatTrait.java b/main/src/main/java/net/citizensnpcs/trait/versioned/BoatTrait.java
index 26a37330b..f00b32568 100644
--- a/main/src/main/java/net/citizensnpcs/trait/versioned/BoatTrait.java
+++ b/main/src/main/java/net/citizensnpcs/trait/versioned/BoatTrait.java
@@ -3,6 +3,7 @@ package net.citizensnpcs.trait.versioned;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Boat;
 
+import net.citizensnpcs.api.command.Arg.CompletionsProvider.OptionalKeyedCompletions;
 import net.citizensnpcs.api.command.Command;
 import net.citizensnpcs.api.command.CommandContext;
 import net.citizensnpcs.api.command.Flag;
@@ -14,7 +15,6 @@ import net.citizensnpcs.api.trait.Trait;
 import net.citizensnpcs.api.trait.TraitName;
 import net.citizensnpcs.api.util.Messaging;
 import net.citizensnpcs.api.util.SpigotUtil;
-import net.citizensnpcs.commands.NPCCommands.OptionalBoatTypeCompletions;
 import net.citizensnpcs.util.Messages;
 
 @TraitName("boattrait")
@@ -51,8 +51,8 @@ public class BoatTrait extends Trait {
     @Override
     public void onSpawn() {
         int[] version = SpigotUtil.getVersion();
-        if (version[1] > 21 || (version[1] == 21 && version[2] >= 2))
-            return;
+        if (version[1] >= 21)
+            return; // technically this wasn't changed until 1.21.2 but 1.21 / 1.21.1 are no longer supported
         if (npc.getEntity() instanceof Boat) {
             if (type != null) {
                 ((Boat) npc.getEntity()).setBoatType(type);
@@ -65,4 +65,9 @@ public class BoatTrait extends Trait {
         onSpawn();
     }
 
+    public static class OptionalBoatTypeCompletions extends OptionalKeyedCompletions {
+        public OptionalBoatTypeCompletions() {
+            super("org.bukkit.entity.Boat.Type");
+        }
+    }
 }
\ No newline at end of file