diff --git a/main/pom.xml b/main/pom.xml
index b507edd8b..edc622f30 100644
--- a/main/pom.xml
+++ b/main/pom.xml
@@ -137,7 +137,7 @@
net.kyori
adventure-platform-bukkit
- 4.3.0
+ 4.3.1
provided
diff --git a/main/src/main/java/net/citizensnpcs/Citizens.java b/main/src/main/java/net/citizensnpcs/Citizens.java
index 83d33672f..d6f1ef5c9 100644
--- a/main/src/main/java/net/citizensnpcs/Citizens.java
+++ b/main/src/main/java/net/citizensnpcs/Citizens.java
@@ -308,32 +308,32 @@ public class Citizens extends JavaPlugin implements CitizensPlugin {
.relocate("gnu{}trove", "clib{}trove").build());
lib.loadLibrary(Library.builder().groupId("net{}kyori").artifactId("adventure-text-minimessage")
.version("4.14.0").relocate("net{}kyori", "clib{}net{}kyori").build());
- lib.loadLibrary(Library.builder().groupId("net{}kyori").artifactId("adventure-platform-bukkit").version("4.3.0")
- .relocate("net{}kyori", "clib{}net{}kyori").build());
- lib.loadLibrary(Library.builder().groupId("net{}kyori").artifactId("adventure-platform-api").version("4.3.0")
- .relocate("net{}kyori", "clib{}net{}kyori").build());
- lib.loadLibrary(Library.builder().groupId("net{}kyori").artifactId("adventure-platform-facet").version("4.3.0")
- .relocate("net{}kyori", "clib{}net{}kyori").build());
- lib.loadLibrary(Library.builder().groupId("net{}kyori").artifactId("adventure-platform-viaversion")
- .version("4.3.0").relocate("net{}kyori", "clib{}net{}kyori").build());
lib.loadLibrary(Library.builder().groupId("net{}kyori").artifactId("adventure-api").version("4.14.0")
.relocate("net{}kyori", "clib{}net{}kyori").build());
- lib.loadLibrary(Library.builder().groupId("net{}kyori").artifactId("adventure-text-serializer-bungeecord")
- .version("4.3.0").relocate("net{}kyori", "clib{}net{}kyori").build());
- lib.loadLibrary(Library.builder().groupId("net{}kyori").artifactId("adventure-text-serializer-legacy")
- .version("4.13.0").relocate("net{}kyori", "clib{}net{}kyori").build());
- lib.loadLibrary(Library.builder().groupId("net{}kyori").artifactId("adventure-text-serializer-gson")
- .version("4.13.0").relocate("net{}kyori", "clib{}net{}kyori").build());
- lib.loadLibrary(Library.builder().groupId("net{}kyori").artifactId("adventure-text-serializer-gson-legacy-impl")
- .version("4.13.0").relocate("net{}kyori", "clib{}net{}kyori").build());
- lib.loadLibrary(Library.builder().groupId("net{}kyori").artifactId("adventure-nbt").version("4.13.0")
- .relocate("net{}kyori", "clib{}net{}kyori").build());
lib.loadLibrary(Library.builder().groupId("net{}kyori").artifactId("adventure-key").version("4.14.0")
.relocate("net{}kyori", "clib{}net{}kyori").build());
lib.loadLibrary(Library.builder().groupId("net{}kyori").artifactId("examination-api").version("1.3.0")
.relocate("net{}kyori", "clib{}net{}kyori").build());
lib.loadLibrary(Library.builder().groupId("net{}kyori").artifactId("examination-string").version("1.3.0")
.relocate("net{}kyori", "clib{}net{}kyori").build());
+ lib.loadLibrary(Library.builder().groupId("net{}kyori").artifactId("adventure-platform-bukkit").version("4.3.1")
+ .relocate("net{}kyori", "clib{}net{}kyori").build());
+ lib.loadLibrary(Library.builder().groupId("net{}kyori").artifactId("adventure-platform-api").version("4.3.1")
+ .relocate("net{}kyori", "clib{}net{}kyori").build());
+ lib.loadLibrary(Library.builder().groupId("net{}kyori").artifactId("adventure-text-serializer-bungeecord")
+ .version("4.3.1").relocate("net{}kyori", "clib{}net{}kyori").build());
+ lib.loadLibrary(Library.builder().groupId("net{}kyori").artifactId("adventure-text-serializer-legacy")
+ .version("4.13.1").relocate("net{}kyori", "clib{}net{}kyori").build());
+ lib.loadLibrary(Library.builder().groupId("net{}kyori").artifactId("adventure-nbt").version("4.13.1")
+ .relocate("net{}kyori", "clib{}net{}kyori").build());
+ lib.loadLibrary(Library.builder().groupId("net{}kyori").artifactId("adventure-text-serializer-gson")
+ .version("4.13.1").relocate("net{}kyori", "clib{}net{}kyori").build());
+ lib.loadLibrary(Library.builder().groupId("net{}kyori").artifactId("adventure-text-serializer-gson-legacy-impl")
+ .version("4.13.1").relocate("net{}kyori", "clib{}net{}kyori").build());
+ lib.loadLibrary(Library.builder().groupId("net{}kyori").artifactId("adventure-platform-facet").version("4.3.1")
+ .relocate("net{}kyori", "clib{}net{}kyori").build());
+ lib.loadLibrary(Library.builder().groupId("net{}kyori").artifactId("adventure-platform-viaversion")
+ .version("4.3.1").relocate("net{}kyori", "clib{}net{}kyori").build());
try {
Class.forName("org.joml.Vector3f");
} catch (Throwable t) {
diff --git a/main/src/main/java/net/citizensnpcs/EventListen.java b/main/src/main/java/net/citizensnpcs/EventListen.java
index a776147aa..676c92de7 100644
--- a/main/src/main/java/net/citizensnpcs/EventListen.java
+++ b/main/src/main/java/net/citizensnpcs/EventListen.java
@@ -59,7 +59,6 @@ import org.bukkit.event.world.EntitiesLoadEvent;
import org.bukkit.event.world.EntitiesUnloadEvent;
import org.bukkit.event.world.WorldLoadEvent;
import org.bukkit.event.world.WorldUnloadEvent;
-import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.RegisteredListener;
import org.bukkit.scheduler.BukkitRunnable;
@@ -586,14 +585,13 @@ public class EventListen implements Listener {
@EventHandler(ignoreCancelled = true)
public void onPlayerTeleport(final PlayerTeleportEvent event) {
NPC npc = CitizensAPI.getNPCRegistry().getNPC(event.getPlayer());
- if (event.getCause() == TeleportCause.PLUGIN && !event.getPlayer().hasMetadata("citizens-force-teleporting")
- && npc != null && Setting.PLAYER_TELEPORT_DELAY.asTicks() > 0) {
+ if (event.getCause() == TeleportCause.PLUGIN && npc != null && !npc.data().has("citizens-force-teleporting")
+ && Setting.PLAYER_TELEPORT_DELAY.asTicks() > 0) {
event.setCancelled(true);
Bukkit.getScheduler().scheduleSyncDelayedTask(CitizensAPI.getPlugin(), () -> {
- event.getPlayer().setMetadata("citizens-force-teleporting",
- new FixedMetadataValue(CitizensAPI.getPlugin(), true));
+ npc.data().set("citizens-force-teleporting", true);
event.getPlayer().teleport(event.getTo());
- event.getPlayer().removeMetadata("citizens-force-teleporting", CitizensAPI.getPlugin());
+ npc.data().remove("citizens-force-teleporting");
}, Setting.PLAYER_TELEPORT_DELAY.asTicks());
}
diff --git a/main/src/main/java/net/citizensnpcs/commands/EditorCommands.java b/main/src/main/java/net/citizensnpcs/commands/EditorCommands.java
index cd7734455..d9c919f81 100644
--- a/main/src/main/java/net/citizensnpcs/commands/EditorCommands.java
+++ b/main/src/main/java/net/citizensnpcs/commands/EditorCommands.java
@@ -38,6 +38,7 @@ public class EditorCommands {
public void equip(CommandContext args, Player player, NPC npc) throws CommandException {
if (!npc.isSpawned())
throw new CommandException("NPC must be spawned");
+
Editor.enterOrLeave(player, new EquipmentEditor(player, npc));
}
@@ -54,10 +55,12 @@ public class EditorCommands {
Editor editor = npc.getOrAddTrait(Waypoints.class).getEditor(player, args);
if (editor == null)
return;
+
if (player.isConversing() && args.argsLength() > 1) {
player.acceptConversationInput(args.getJoinedStrings(1));
return;
}
+
Editor.enterOrLeave(player, editor);
}
diff --git a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java
index 64a18b0ca..8b478fa0e 100644
--- a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java
+++ b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java
@@ -495,7 +495,7 @@ public class NPCCommands {
try {
int id = commands.addCommand(new NPCCommandBuilder(command, hand).addPerms(perms)
.player(args.hasFlag('p') || args.hasFlag('o')).op(args.hasFlag('o')).cooldown(cooldown)
- .globalCooldown(gcooldown).n(n).delay(Util.toTicks(delay)));
+ .globalCooldown(gcooldown).n(n).delay(delay));
Messaging.sendTr(sender, Messages.COMMAND_ADDED, command, id);
} catch (NumberFormatException ex) {
throw new CommandException(CommandMessages.INVALID_NUMBER);
@@ -733,7 +733,6 @@ public class NPCCommands {
if (args.hasFlag('t') || temporaryTicks != null) {
registry = temporaryRegistry;
}
-
if (item != null) {
ItemStack stack = Util.parseItemStack(null, item);
npc = registry.createNPCUsingItem(type, name, stack);
diff --git a/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java b/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java
index ec7350bdd..e7ae79526 100644
--- a/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java
+++ b/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java
@@ -82,30 +82,42 @@ public class CitizensNPC extends AbstractNPC {
}
return true;
}
+
NPCDespawnEvent event = new NPCDespawnEvent(this, reason);
if (reason == DespawnReason.CHUNK_UNLOAD) {
event.setCancelled(data().get(NPC.Metadata.KEEP_CHUNK_LOADED, Setting.KEEP_CHUNKS_LOADED.asBoolean()));
}
+
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled() && reason != DespawnReason.DEATH) {
Messaging.debug("Couldn't despawn", this, "due to despawn event cancellation. Will load chunk.",
getEntity().isValid(), ", DespawnReason." + reason);
return false;
}
+
boolean keepSelected = getOrAddTrait(Spawned.class).shouldSpawn();
if (!keepSelected) {
data().remove("selectors");
}
+
+ if (getEntity() != null) {
+ getEntity().removeMetadata("NPC", CitizensAPI.getPlugin());
+ getEntity().removeMetadata("NPC-ID", CitizensAPI.getPlugin());
+ }
+
if (getEntity() instanceof Player) {
PlayerUpdateTask.deregisterPlayer(getEntity());
}
+
navigator.onDespawn();
if (reason == DespawnReason.RELOAD) {
unloadEvents();
}
+
for (Trait trait : new ArrayList(traits.values())) {
trait.onDespawn(reason);
}
+
Messaging.debug("Despawned", this, "DespawnReason." + reason);
if (getEntity() instanceof SkinnableEntity) {
@@ -117,6 +129,7 @@ public class CitizensNPC extends AbstractNPC {
} else {
entityController.remove();
}
+
return true;
}
@@ -330,6 +343,7 @@ public class CitizensNPC extends AbstractNPC {
Bukkit.getPluginManager().callEvent(new NPCNeedsRespawnEvent(this, at));
return false;
}
+
// send skin packets, if applicable, before other NMS packets are sent
SkinnableEntity skinnable = getEntity() instanceof SkinnableEntity ? ((SkinnableEntity) getEntity()) : null;
if (skinnable != null) {
diff --git a/main/src/main/java/net/citizensnpcs/trait/CommandTrait.java b/main/src/main/java/net/citizensnpcs/trait/CommandTrait.java
index 1019e59a3..7fd7f6cce 100644
--- a/main/src/main/java/net/citizensnpcs/trait/CommandTrait.java
+++ b/main/src/main/java/net/citizensnpcs/trait/CommandTrait.java
@@ -682,8 +682,8 @@ public class CommandTrait extends Trait {
return this;
}
- public NPCCommandBuilder delay(int delay) {
- this.delay = delay;
+ public NPCCommandBuilder delay(Duration delay) {
+ this.delay = Util.toTicks(delay);
return this;
}
@@ -838,12 +838,12 @@ public class CommandTrait extends Trait {
commandKeys.add(commandKey);
Number number = lastUsed.get(commandKey);
if (number != null && number.longValue() + (command.cooldown != 0 ? command.cooldown
- : Setting.NPC_COMMAND_GLOBAL_COMMAND_COOLDOWN.asSeconds()) <= currentTimeSec) {
+ : Setting.NPC_COMMAND_GLOBAL_COMMAND_COOLDOWN.asSeconds()) < currentTimeSec) {
lastUsed.remove(commandKey);
}
if (globalCooldowns != null) {
number = globalCooldowns.get(commandKey);
- if (number != null && number.longValue() + command.globalCooldown <= currentTimeSec) {
+ if (number != null && number.longValue() + command.globalCooldown < currentTimeSec) {
globalCooldowns.remove(commandKey);
}
}
diff --git a/main/src/main/java/net/citizensnpcs/util/PlayerAnimation.java b/main/src/main/java/net/citizensnpcs/util/PlayerAnimation.java
index 220ee88ab..10162a318 100644
--- a/main/src/main/java/net/citizensnpcs/util/PlayerAnimation.java
+++ b/main/src/main/java/net/citizensnpcs/util/PlayerAnimation.java
@@ -112,6 +112,7 @@ public enum PlayerAnimation {
cancel();
return;
}
+
NMS.playAnimation(PlayerAnimation.STOP_USE_ITEM, player, radius);
NMS.playAnimation(PlayerAnimation.this, player, radius);
if (!player.hasMetadata("citizens-using-item-id")) {
diff --git a/main/src/main/resources/messages_en.properties b/main/src/main/resources/messages_en.properties
index d967143e3..0c5ea2cc3 100644
--- a/main/src/main/resources/messages_en.properties
+++ b/main/src/main/resources/messages_en.properties
@@ -405,7 +405,7 @@ citizens.editors.text.range-set=[[Range]] set to [[{0}]].
citizens.editors.text.delay-set=[[Delay]] set to [[{0}]] ticks.
citizens.editors.text.realistic-looking-set=[[Realistic looking]] set to [[{0}]].
citizens.editors.text.speech-bubbles-set=[[Speech bubbles]] set to [[{0}]].
-citizens.editors.text.start-prompt=Add text | default to clear)">item | range | delay
{0}talk close | {1}random | {2}speech bubbles | {3}realistic
+citizens.editors.text.start-prompt=Add text | default to clear)">item | range | delay
{0}talk close | {1}random | {2}speech bubbles | {3}realistic
citizens.editors.text.talk-item-set=[[Talk item pattern]] set to [[{0}]].
citizens.editors.text.text-list-header=Current text:
citizens.editors.waypoints.wander.editing-regions-stop=Exited the region editor.