From 7eda6119c9dc2de24e2c4bceeff00771a6b13abc Mon Sep 17 00:00:00 2001 From: MCSamuel <187220916+MC-Samuel@users.noreply.github.com> Date: Thu, 2 Jul 2026 15:44:39 -0700 Subject: [PATCH 01/10] Deprecated Denizen's Sitting, Sleeping, and Sneaking traits in favor of Citizens' Sit, Sleep, and Sneak traits --- .../paper/properties/EntitySneaking.java | 30 ++-- plugin/pom.xml | 2 +- .../denizen/npc/traits/SittingTrait.java | 1 + .../denizen/npc/traits/SleepingTrait.java | 20 ++- .../denizen/npc/traits/SneakingTrait.java | 1 + .../denizenscript/denizen/objects/NPCTag.java | 17 ++- .../scripts/commands/entity/SneakCommand.java | 128 +++++++----------- .../scripts/commands/npc/SitCommand.java | 53 +++----- .../scripts/commands/npc/SleepCommand.java | 43 ++---- .../scripts/commands/npc/StandCommand.java | 43 +++--- .../scripts/commands/npc/TraitCommand.java | 103 +++++++------- .../utilities/BukkitImplDeprecations.java | 3 + .../utilities/command/NPCCommandHandler.java | 110 +++++++++++---- 13 files changed, 281 insertions(+), 273 deletions(-) diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/properties/EntitySneaking.java b/paper/src/main/java/com/denizenscript/denizen/paper/properties/EntitySneaking.java index 1a2e37c0a7..cae012fe6a 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/properties/EntitySneaking.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/properties/EntitySneaking.java @@ -6,6 +6,7 @@ import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.core.ElementTag; import net.citizensnpcs.api.npc.NPC; +import net.citizensnpcs.trait.SneakTrait; public class EntitySneaking extends EntityProperty { @@ -36,18 +37,23 @@ public boolean isDefaultValue(ElementTag value) { @Override public void setPropertyValue(ElementTag value, Mechanism mechanism) { - if (mechanism.requireBoolean()) { - boolean sneaking = value.asBoolean(); - getEntity().setSneaking(sneaking); - if (object.isCitizensNPC()) { - NPC npc = object.getDenizenNPC().getCitizen(); - if (sneaking) { - npc.getOrAddTrait(SneakingTrait.class).sneak(); - } - else if (npc.hasTrait(SneakingTrait.class)) { - npc.getTraitNullable(SneakingTrait.class).stand(); - npc.removeTrait(SneakingTrait.class); - } + if (!mechanism.requireBoolean()) { + return; + } + boolean sneaking = value.asBoolean(); + getEntity().setSneaking(sneaking); + if (object.isCitizensNPC()) { + NPC npc = object.getDenizenNPC().getCitizen(); + if (sneaking) { + npc.getOrAddTrait(SneakTrait.class).setSneaking(true); + } + else if (npc.hasTrait(SneakTrait.class)) { + npc.getOrAddTrait(SneakTrait.class).setSneaking(false); + npc.removeTrait(SneakTrait.class); + } + else if (npc.hasTrait(SneakingTrait.class)) { // backsupport + npc.getTraitNullable(SneakingTrait.class).stand(); + npc.removeTrait(SneakingTrait.class); } } } diff --git a/plugin/pom.xml b/plugin/pom.xml index b9ba8f0938..9385f4aa5a 100644 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -44,7 +44,7 @@ net.citizensnpcs citizens-main - 2.0.42-SNAPSHOT + 2.0.43-SNAPSHOT jar provided diff --git a/plugin/src/main/java/com/denizenscript/denizen/npc/traits/SittingTrait.java b/plugin/src/main/java/com/denizenscript/denizen/npc/traits/SittingTrait.java index 556c1f650c..685a144527 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/npc/traits/SittingTrait.java +++ b/plugin/src/main/java/com/denizenscript/denizen/npc/traits/SittingTrait.java @@ -28,6 +28,7 @@ import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.scheduler.BukkitRunnable; +@Deprecated(forRemoval = true) public class SittingTrait extends Trait implements Listener { @Persist("sitting") diff --git a/plugin/src/main/java/com/denizenscript/denizen/npc/traits/SleepingTrait.java b/plugin/src/main/java/com/denizenscript/denizen/npc/traits/SleepingTrait.java index 19eb4a0d9b..269e679274 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/npc/traits/SleepingTrait.java +++ b/plugin/src/main/java/com/denizenscript/denizen/npc/traits/SleepingTrait.java @@ -9,13 +9,11 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.block.data.type.Bed; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.bukkit.entity.Pose; -import org.bukkit.entity.Villager; +import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.block.BlockBreakEvent; +@Deprecated(forRemoval = true) public class SleepingTrait extends Trait { @Persist("sleeping") @@ -47,14 +45,14 @@ public void onSpawn() { } public void internalSleepNow() { - if (npc.getEntity() instanceof Villager) { - if (!((Villager) npc.getEntity()).sleep(bedLocation.clone())) { + if (npc.getEntity() instanceof Villager villager) { + if (!villager.sleep(bedLocation.clone())) { return; } } - else if (npc.getEntity() instanceof Player) { + else if (npc.getEntity() instanceof Player player) { if (bedLocation.getBlock().getBlockData() instanceof Bed) { - ((Player) npc.getEntity()).sleep(bedLocation.clone(), true); + player.sleep(bedLocation.clone(), true); } else { NMSHandler.entityHelper.setPose(npc.getEntity(), Pose.SLEEPING); @@ -115,8 +113,8 @@ public void wakeUp() { return; } sleeping = false; - if (npc.getEntity() instanceof Villager) { - ((Villager) npc.getEntity()).wakeup(); + if (npc.getEntity() instanceof Villager villager) { + villager.wakeup(); } else { if (((Player) npc.getEntity()).isSleeping()) { @@ -138,7 +136,7 @@ public boolean isSleeping() { /** * Gets the bed the NPC is sleeping on - * Returns null if the NPC isnt sleeping + * Returns null if the NPC isn't sleeping * * @return Location */ diff --git a/plugin/src/main/java/com/denizenscript/denizen/npc/traits/SneakingTrait.java b/plugin/src/main/java/com/denizenscript/denizen/npc/traits/SneakingTrait.java index 3621db922d..2b5b083bc9 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/npc/traits/SneakingTrait.java +++ b/plugin/src/main/java/com/denizenscript/denizen/npc/traits/SneakingTrait.java @@ -7,6 +7,7 @@ import org.bukkit.entity.EntityType; import org.bukkit.event.Listener; +@Deprecated(forRemoval = true) public class SneakingTrait extends Trait implements Listener { @Persist("sneaking") diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/NPCTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/NPCTag.java index a99fa9ec70..08f39c9d5e 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/NPCTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/NPCTag.java @@ -479,7 +479,8 @@ public static void register() { // --> tagProcessor.registerTag(ElementTag.class, "is_sitting", (attribute, object) -> { NPC citizen = object.getCitizen(); - return new ElementTag(citizen.hasTrait(SittingTrait.class) && citizen.getOrAddTrait(SittingTrait.class).isSitting()); + return new ElementTag((citizen.hasTrait(SitTrait.class) && citizen.getOrAddTrait(SitTrait.class).isSitting()) + || (citizen.hasTrait(SittingTrait.class) && citizen.getOrAddTrait(SittingTrait.class).isSitting())); // backsupport }); // <--[tag] @@ -490,7 +491,8 @@ public static void register() { // --> tagProcessor.registerTag(ElementTag.class, "is_sleeping", (attribute, object) -> { NPC citizen = object.getCitizen(); - return new ElementTag(citizen.hasTrait(SleepingTrait.class) && citizen.getOrAddTrait(SleepingTrait.class).isSleeping()); + return new ElementTag(citizen.hasTrait(SleepTrait.class) + || (citizen.hasTrait(SleepingTrait.class) && citizen.getOrAddTrait(SleepingTrait.class).isSleeping())); //backsupport }); // <--[tag] @@ -1821,15 +1823,16 @@ else if (npcEntity instanceof FallingBlock) { // // --> if (mechanism.matches("set_sneaking") && mechanism.requireBoolean()) { - if (!getCitizen().hasTrait(SneakingTrait.class)) { - getCitizen().addTrait(SneakingTrait.class); + if (getCitizen().hasTrait(SneakingTrait.class)) { // backsupport + getCitizen().getOrAddTrait(SneakingTrait.class).stand(); + getCitizen().removeTrait(SneakingTrait.class); } - SneakingTrait trait = getCitizen().getOrAddTrait(SneakingTrait.class); + SneakTrait trait = getCitizen().getOrAddTrait(SneakTrait.class); if (trait.isSneaking() && !mechanism.getValue().asBoolean()) { - trait.stand(); + trait.setSneaking(false); } else if (!trait.isSneaking() && mechanism.getValue().asBoolean()) { - trait.sneak(); + trait.setSneaking(true); } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/SneakCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/SneakCommand.java index d3ee04ad18..a0865fa0d2 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/SneakCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/SneakCommand.java @@ -4,14 +4,13 @@ import com.denizenscript.denizen.npc.traits.SneakingTrait; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.PlayerTag; -import com.denizenscript.denizencore.utilities.debugging.Debug; import com.denizenscript.denizen.utilities.packets.NetworkInterceptHelper; -import com.denizenscript.denizencore.exceptions.InvalidArgumentsException; -import com.denizenscript.denizencore.objects.Argument; -import com.denizenscript.denizencore.objects.core.ElementTag; -import com.denizenscript.denizencore.objects.core.ListTag; +import com.denizenscript.denizencore.exceptions.InvalidArgumentsRuntimeException; import com.denizenscript.denizencore.scripts.ScriptEntry; import com.denizenscript.denizencore.scripts.commands.AbstractCommand; +import com.denizenscript.denizencore.scripts.commands.generator.*; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.citizensnpcs.trait.SneakTrait; import org.bukkit.entity.Player; import java.util.HashMap; @@ -25,6 +24,7 @@ public SneakCommand() { setSyntax("sneak [|...] ({start}/stop) (fake/stopfake) (for:|...)"); setRequiredArguments(1, 4); isProcedural = false; + autoCompile(); } // <--[command] @@ -38,7 +38,7 @@ public SneakCommand() { // // @Description // Causes an entity to start or stop sneaking. - // If the entity is NPC, adds the SneakingTrait to apply the sneak setting persistent. + // If the entity is NPC, adds the SneakTrait to apply the sneak setting persistent. // // Can optionally use the 'fake' argument to apply a fake sneak using packets, either globally or for specific players. // Use 'stopfake' to disable faking of sneak. @@ -60,40 +60,54 @@ public SneakCommand() { // // --> - @Override - public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException { - for (Argument arg : scriptEntry) { - if (arg.matches("fake") - && !scriptEntry.hasObject("fake") - && !scriptEntry.hasObject("stopfake")) { - scriptEntry.addObject("fake", new ElementTag(true)); - } - else if (arg.matches("stopfake") - && !scriptEntry.hasObject("fake") - && !scriptEntry.hasObject("stopfake")) { - scriptEntry.addObject("stopfake", new ElementTag(true)); - } - else if ((arg.matches("start") || arg.matches("stop")) - && !scriptEntry.hasObject("mode")) { - scriptEntry.addObject("mode", arg.asElement()); + public enum SneakMode { START, STOP } + + public enum SneakFake { FAKE, STOPFAKE } + + public static void autoExecute(ScriptEntry scriptEntry, + @ArgName("entities") @ArgLinear @ArgDefaultNull List entities, + @ArgName("mode") @ArgLinear @ArgDefaultNull SneakMode mode, + @ArgName("fake") @ArgLinear @ArgDefaultNull SneakFake fake, + @ArgName("for") @ArgPrefixed @ArgDefaultNull List players) { + if (entities == null) { + throw new InvalidArgumentsRuntimeException("Missing entities argument."); + } + if (mode == null) { + mode = SneakMode.START; + } + boolean shouldSneak = mode.equals(SneakMode.START); + boolean shouldFake = fake != null && fake.equals(SneakFake.FAKE); + boolean shouldStopFake = fake != null && fake.equals(SneakFake.STOPFAKE); + for (EntityTag entity : entities) { + if (shouldFake || shouldStopFake) { + if (players == null) { + updateFakeSneak(entity.getUUID(), null, shouldSneak, shouldFake); + for (Player player : NMSHandler.entityHelper.getPlayersThatSee(entity.getBukkitEntity())) { + NMSHandler.packetHelper.sendEntityMetadataFlagsUpdate(player, entity.getBukkitEntity()); + } + } + else { + for (PlayerTag player : players) { + updateFakeSneak(entity.getUUID(), player.getUUID(), shouldSneak, shouldFake); + NMSHandler.packetHelper.sendEntityMetadataFlagsUpdate(player.getPlayerEntity(), entity.getBukkitEntity()); + } + } } - else if (arg.matchesPrefix("for") - && arg.matchesArgumentList(PlayerTag.class) - && !scriptEntry.hasObject("for_players")) { - scriptEntry.addObject("for_players", arg.asType(ListTag.class).filter(PlayerTag.class, scriptEntry)); + else if (entity.isCitizensNPC()) { + if (entity.getDenizenNPC().getCitizen().hasTrait(SneakingTrait.class)) { + entity.getDenizenNPC().getCitizen().getOrAddTrait(SneakingTrait.class).stand(); + entity.getDenizenNPC().getCitizen().removeTrait(SneakingTrait.class); + } + SneakTrait trait = entity.getDenizenNPC().getCitizen().getOrAddTrait(SneakTrait.class); + trait.setSneaking(shouldSneak); } - else if (arg.matchesArgumentList(EntityTag.class) - && !scriptEntry.hasObject("entities")) { - scriptEntry.addObject("entities", arg.asType(ListTag.class).filter(EntityTag.class, scriptEntry)); + else if (entity.isSpawned()) { + NMSHandler.entityHelper.setSneaking(entity.getBukkitEntity(), shouldSneak); } else { - arg.reportUnhandled(); + Debug.echoError("Cannot make unspawned entity sneak."); } } - if (!scriptEntry.hasObject("entities")) { - throw new InvalidArgumentsException("Missing entities argument."); - } - scriptEntry.defaultObject("mode", new ElementTag("start")); } public static HashMap> forceSetSneak = new HashMap<>(); @@ -130,50 +144,4 @@ public static Boolean shouldSneak(UUID entity, UUID player) { } return subMap.get(null); } - - @Override - public void execute(ScriptEntry scriptEntry) { - ElementTag fake = scriptEntry.getElement("fake"); - ElementTag stopfake = scriptEntry.getElement("stopfake"); - ElementTag mode = scriptEntry.getElement("mode"); - List forPlayers = (List) scriptEntry.getObject("for_players"); - List entities = (List) scriptEntry.getObject("entities"); - if (scriptEntry.dbCallShouldDebug()) { - Debug.report(scriptEntry, getName(), mode, db("entities", entities), db("for_players", forPlayers), fake, stopfake); - } - boolean shouldSneak = mode.asString().equalsIgnoreCase("start"); - boolean shouldFake = fake != null && fake.asBoolean(); - boolean shouldStopFake = stopfake != null && stopfake.asBoolean(); - for (EntityTag entity : entities) { - if (shouldFake || shouldStopFake) { - if (forPlayers == null) { - updateFakeSneak(entity.getUUID(), null, shouldSneak, shouldFake); - for (Player player : NMSHandler.entityHelper.getPlayersThatSee(entity.getBukkitEntity())) { - NMSHandler.packetHelper.sendEntityMetadataFlagsUpdate(player, entity.getBukkitEntity()); - } - } - else { - for (PlayerTag player : forPlayers) { - updateFakeSneak(entity.getUUID(), player.getUUID(), shouldSneak, shouldFake); - NMSHandler.packetHelper.sendEntityMetadataFlagsUpdate(player.getPlayerEntity(), entity.getBukkitEntity()); - } - } - } - else if (entity.isCitizensNPC()) { - SneakingTrait trait = entity.getDenizenNPC().getCitizen().getOrAddTrait(SneakingTrait.class); - if (shouldSneak) { - trait.sneak(); - } - else { - trait.stand(); - } - } - else if (entity.isSpawned()) { - NMSHandler.entityHelper.setSneaking(entity.getBukkitEntity(), shouldSneak); - } - else { - Debug.echoError("Cannot make unspawned entity sneak."); - } - } - } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SitCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SitCommand.java index 626f427b72..5bf712a665 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SitCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SitCommand.java @@ -1,15 +1,19 @@ package com.denizenscript.denizen.scripts.commands.npc; +import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.objects.NPCTag; import com.denizenscript.denizen.utilities.Utilities; -import com.denizenscript.denizencore.utilities.debugging.Debug; -import com.denizenscript.denizen.npc.traits.SittingTrait; -import com.denizenscript.denizen.objects.LocationTag; -import com.denizenscript.denizencore.exceptions.InvalidArgumentsException; -import com.denizenscript.denizencore.objects.Argument; +import com.denizenscript.denizencore.exceptions.InvalidArgumentsRuntimeException; import com.denizenscript.denizencore.scripts.ScriptEntry; import com.denizenscript.denizencore.scripts.commands.AbstractCommand; -import org.bukkit.entity.*; +import com.denizenscript.denizencore.scripts.commands.generator.ArgDefaultNull; +import com.denizenscript.denizencore.scripts.commands.generator.ArgLinear; +import com.denizenscript.denizencore.scripts.commands.generator.ArgName; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.citizensnpcs.trait.SitTrait; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Sittable; public class SitCommand extends AbstractCommand { @@ -18,6 +22,7 @@ public SitCommand() { setSyntax("sit ()"); setRequiredArguments(0, 1); isProcedural = false; + autoCompile(); } // <--[command] @@ -42,44 +47,26 @@ public SitCommand() { // // --> - @Override - public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException { - for (Argument arg : scriptEntry) { - if (arg.matchesArgumentType(LocationTag.class) - && !scriptEntry.hasObject("location")) { - scriptEntry.addObject("location", arg.asType(LocationTag.class)); - } - else { - arg.reportUnhandled(); - } - } + public static void autoExecute(ScriptEntry scriptEntry, + @ArgName("location") @ArgLinear @ArgDefaultNull LocationTag location) { if (!Utilities.entryHasNPC(scriptEntry)) { - throw new InvalidArgumentsException("This command requires a linked NPC!"); + throw new InvalidArgumentsRuntimeException("This command requires a linked NPC!"); } - } - - @Override - public void execute(ScriptEntry scriptEntry) { - LocationTag location = scriptEntry.getObjectTag("location"); NPCTag npc = Utilities.getEntryNPC(scriptEntry); if (!(npc.getEntity() instanceof Player || npc.getEntity() instanceof Sittable)) { - Debug.echoError("Entities of type " + npc.getEntityType().getName() + " cannot sit."); + Debug.echoError("Entities of type " + npc.getEntityType() + " cannot sit."); return; } - if (scriptEntry.dbCallShouldDebug()) { - Debug.report(scriptEntry, getName(), npc, location); - } - Entity entity = npc.getEntity(); - if (entity instanceof Sittable) { - ((Sittable) entity).setSitting(true); + if (npc.getEntity() instanceof Sittable sittable) { + sittable.setSitting(true); } else { - SittingTrait trait = npc.getCitizen().getOrAddTrait(SittingTrait.class); + SitTrait trait = npc.getCitizen().getOrAddTrait(SitTrait.class); if (location != null) { - trait.sit(location); + trait.setSitting(location); } else { - trait.sit(); + trait.setSitting(npc.getLocation()); } } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SleepCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SleepCommand.java index 63192107c5..878997cd41 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SleepCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SleepCommand.java @@ -1,14 +1,16 @@ package com.denizenscript.denizen.scripts.commands.npc; -import com.denizenscript.denizen.npc.traits.SleepingTrait; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.objects.NPCTag; import com.denizenscript.denizen.utilities.Utilities; -import com.denizenscript.denizencore.utilities.debugging.Debug; -import com.denizenscript.denizencore.exceptions.InvalidArgumentsException; -import com.denizenscript.denizencore.objects.Argument; +import com.denizenscript.denizencore.exceptions.InvalidArgumentsRuntimeException; import com.denizenscript.denizencore.scripts.ScriptEntry; import com.denizenscript.denizencore.scripts.commands.AbstractCommand; +import com.denizenscript.denizencore.scripts.commands.generator.ArgDefaultNull; +import com.denizenscript.denizencore.scripts.commands.generator.ArgLinear; +import com.denizenscript.denizencore.scripts.commands.generator.ArgName; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.citizensnpcs.trait.SleepTrait; import org.bukkit.entity.EntityType; import org.bukkit.entity.Villager; @@ -19,6 +21,7 @@ public SleepCommand() { setSyntax("sleep ()"); setRequiredArguments(0, 1); isProcedural = false; + autoCompile(); } // <--[command] @@ -43,42 +46,22 @@ public SleepCommand() { // // --> - @Override - public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException { - for (Argument arg : scriptEntry) { - if (arg.matchesArgumentType(LocationTag.class) - && !scriptEntry.hasObject("location")) { - scriptEntry.addObject("location", arg.asType(LocationTag.class)); - } - else { - arg.reportUnhandled(); - } - } + public static void autoExecute(ScriptEntry scriptEntry, + @ArgName("location") @ArgLinear @ArgDefaultNull LocationTag location) { if (!Utilities.entryHasNPC(scriptEntry)) { - throw new InvalidArgumentsException("This command requires a linked NPC!"); + throw new InvalidArgumentsRuntimeException("This command requires a linked NPC!"); } - } - - @Override - public void execute(ScriptEntry scriptEntry) { - LocationTag location = scriptEntry.getObjectTag("location"); NPCTag npc = Utilities.getEntryNPC(scriptEntry); if (npc.getEntityType() != EntityType.PLAYER && !(npc.getEntity() instanceof Villager)) { Debug.echoError("Only Player or villager type NPCs can sit!"); return; } - if (scriptEntry.dbCallShouldDebug()) { - Debug.report(scriptEntry, getName(), npc, location); - } - SleepingTrait trait = npc.getCitizen().getOrAddTrait(SleepingTrait.class); + SleepTrait trait = npc.getCitizen().getOrAddTrait(SleepTrait.class); if (location != null) { - trait.toSleep(location); + trait.setSleeping(location); } else { - trait.toSleep(); - } - if (!trait.isSleeping()) { - npc.getCitizen().removeTrait(SleepingTrait.class); + trait.setSleeping(npc.getLocation()); } } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/StandCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/StandCommand.java index d2da1d8169..7b78ef010c 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/StandCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/StandCommand.java @@ -1,15 +1,18 @@ package com.denizenscript.denizen.scripts.commands.npc; +import com.denizenscript.denizen.npc.traits.SittingTrait; import com.denizenscript.denizen.npc.traits.SleepingTrait; import com.denizenscript.denizen.objects.NPCTag; import com.denizenscript.denizen.utilities.Utilities; -import com.denizenscript.denizencore.utilities.debugging.Debug; -import com.denizenscript.denizen.npc.traits.SittingTrait; -import com.denizenscript.denizencore.exceptions.InvalidArgumentsException; -import com.denizenscript.denizencore.objects.Argument; +import com.denizenscript.denizencore.exceptions.InvalidArgumentsRuntimeException; import com.denizenscript.denizencore.scripts.ScriptEntry; import com.denizenscript.denizencore.scripts.commands.AbstractCommand; -import org.bukkit.entity.*; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.citizensnpcs.trait.SitTrait; +import net.citizensnpcs.trait.SleepTrait; +import org.bukkit.entity.Player; +import org.bukkit.entity.Sittable; +import org.bukkit.entity.Villager; public class StandCommand extends AbstractCommand { @@ -18,6 +21,7 @@ public StandCommand() { setSyntax("stand"); setRequiredArguments(0, 0); isProcedural = false; + autoCompile(); } // <--[command] @@ -43,30 +47,17 @@ public StandCommand() { // // --> - @Override - public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException { - //stand should have no additional arguments - for (Argument arg : scriptEntry) { - arg.reportUnhandled(); - } + public static void autoExecute(ScriptEntry scriptEntry) { if (!Utilities.entryHasNPC(scriptEntry)) { - throw new InvalidArgumentsException("This command requires a linked NPC!"); + throw new InvalidArgumentsRuntimeException("This command requires a linked NPC!"); } - } - - @Override - public void execute(ScriptEntry scriptEntry) { NPCTag npc = Utilities.getEntryNPC(scriptEntry); if (!(npc.getEntity() instanceof Player || npc.getEntity() instanceof Sittable || npc.getEntity() instanceof Villager)) { - Debug.echoError("Entities of type " + npc.getEntityType().name() + " cannot sit or sleep."); + Debug.echoError("Entities of type " + npc.getEntityType() + " cannot sit or sleep."); return; } - if (scriptEntry.dbCallShouldDebug()) { - Debug.report(scriptEntry, getName(), db("npc", Utilities.getEntryNPC(scriptEntry))); - } - Entity entity = npc.getEntity(); - if (entity instanceof Sittable) { - ((Sittable) entity).setSitting(false); + if (npc.getEntity() instanceof Sittable sittable) { + sittable.setSitting(false); } else { if (npc.getCitizen().hasTrait(SittingTrait.class)) { @@ -74,11 +65,17 @@ public void execute(ScriptEntry scriptEntry) { trait.stand(); npc.getCitizen().removeTrait(SittingTrait.class); } + if (npc.getCitizen().hasTrait(SitTrait.class)) { + npc.getCitizen().removeTrait(SitTrait.class); + } if (npc.getCitizen().hasTrait(SleepingTrait.class)) { SleepingTrait trait = npc.getCitizen().getOrAddTrait(SleepingTrait.class); trait.wakeUp(); npc.getCitizen().removeTrait(SleepingTrait.class); } + if (npc.getCitizen().hasTrait(SleepTrait.class)) { + npc.getCitizen().removeTrait(SleepTrait.class); + } } } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/TraitCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/TraitCommand.java index 0821f299a7..e2aeb13996 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/TraitCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/TraitCommand.java @@ -1,18 +1,23 @@ package com.denizenscript.denizen.scripts.commands.npc; +import com.denizenscript.denizen.npc.traits.SittingTrait; +import com.denizenscript.denizen.npc.traits.SleepingTrait; +import com.denizenscript.denizen.npc.traits.SneakingTrait; import com.denizenscript.denizen.objects.NPCTag; +import com.denizenscript.denizen.utilities.BukkitImplDeprecations; import com.denizenscript.denizen.utilities.Utilities; -import com.denizenscript.denizencore.utilities.debugging.Debug; -import com.denizenscript.denizencore.exceptions.InvalidArgumentsException; -import com.denizenscript.denizencore.objects.Argument; -import com.denizenscript.denizencore.objects.core.ElementTag; -import com.denizenscript.denizencore.objects.core.ListTag; +import com.denizenscript.denizencore.exceptions.InvalidArgumentsRuntimeException; import com.denizenscript.denizencore.scripts.ScriptEntry; import com.denizenscript.denizencore.scripts.commands.AbstractCommand; +import com.denizenscript.denizencore.scripts.commands.generator.*; +import com.denizenscript.denizencore.utilities.debugging.Debug; import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.trait.Trait; import net.citizensnpcs.api.trait.TraitInfo; +import net.citizensnpcs.trait.SitTrait; +import net.citizensnpcs.trait.SleepTrait; +import net.citizensnpcs.trait.SneakTrait; import java.util.Collections; import java.util.List; @@ -24,6 +29,7 @@ public TraitCommand() { setSyntax("trait (state:true/false/{toggle}) [] (to:|...)"); setRequiredArguments(1, 3); isProcedural = false; + autoCompile(); } // <--[command] @@ -62,7 +68,7 @@ public TraitCommand() { // // --> - private enum Toggle {TOGGLE, TRUE, FALSE, ON, OFF} + public enum Toggle {TOGGLE, TRUE, FALSE, ON, OFF} @Override public void addCustomTabCompletions(TabCompletionsBuilder tab) { @@ -71,66 +77,54 @@ public void addCustomTabCompletions(TabCompletionsBuilder tab) { } } - @Override - public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException { - for (Argument arg : scriptEntry) { - if (!scriptEntry.hasObject("state") - && arg.matchesPrefix("state", "s") - && arg.matchesEnum(Toggle.class)) { - scriptEntry.addObject("state", new ElementTag(arg.getValue().toUpperCase())); - } - else if (!scriptEntry.hasObject("trait")) { - scriptEntry.addObject("trait", new ElementTag(arg.getValue())); - } - else if (!scriptEntry.hasObject("npcs") - && arg.matchesArgumentList(NPCTag.class)) { - scriptEntry.addObject("npcs", arg.asType(ListTag.class).filter(NPCTag.class, scriptEntry)); - } - else { - arg.reportUnhandled(); - } + public static void autoExecute(ScriptEntry scriptEntry, + @ArgName("state") @ArgPrefixed @ArgDefaultNull Toggle toggle, + @ArgName("trait") @ArgLinear @ArgDefaultNull Trait traitName, + @ArgName("to") @ArgPrefixed @ArgDefaultNull List npcs) { + if (traitName == null) { + throw new InvalidArgumentsRuntimeException("Missing trait argument!"); } - if (!scriptEntry.hasObject("trait")) { - throw new InvalidArgumentsException("Missing trait argument!"); - } - if (!scriptEntry.hasObject("npcs")) { + if (npcs == null) { if (!Utilities.entryHasNPC(scriptEntry)) { - throw new InvalidArgumentsException("This command requires a linked NPC!"); + throw new InvalidArgumentsRuntimeException("This command requires a linked NPC!"); } - scriptEntry.addObject("npcs", Collections.singletonList(Utilities.getEntryNPC(scriptEntry))); + npcs = Collections.singletonList(Utilities.getEntryNPC(scriptEntry)); } - scriptEntry.defaultObject("state", new ElementTag("TOGGLE")); - } - - @Override - public void execute(ScriptEntry scriptEntry) { - ElementTag toggle = scriptEntry.getElement("state"); - ElementTag traitName = scriptEntry.getElement("trait"); - List npcs = (List) scriptEntry.getObject("npcs"); - if (scriptEntry.dbCallShouldDebug()) { - Debug.report(scriptEntry, getName(), traitName, toggle, db("npc", npcs)); + if (toggle == null) { + toggle = Toggle.TOGGLE; } - Class trait = CitizensAPI.getTraitFactory().getTraitClass(traitName.asString()); + Class trait = CitizensAPI.getTraitFactory().getTraitClass(traitName.getName()); if (trait == null) { - Debug.echoError(scriptEntry, "Trait not found: " + traitName.asString()); + Debug.echoError(scriptEntry, "Trait not found: " + traitName.getName()); return; } for (NPCTag npcTag : npcs) { NPC npc = npcTag.getCitizen(); - switch (Toggle.valueOf(toggle.asString())) { + switch (toggle) { case TRUE: case ON: if (npc.hasTrait(trait)) { - Debug.echoError(scriptEntry, "NPC already has trait '" + traitName.asString() + "'"); + Debug.echoError(scriptEntry, "NPC already has trait '" + traitName.getName() + "'"); + break; } - else { - npc.addTrait(trait); + if (trait == SittingTrait.class || trait == SleepingTrait.class || trait == SneakingTrait.class) { + BukkitImplDeprecations.citizensTraits.warn(); + if (trait == SittingTrait.class) { + trait = SitTrait.class; + } + else if (trait == SleepingTrait.class) { + trait = SleepTrait.class; + } + else { + trait = SneakTrait.class; + } } + npc.addTrait(trait); break; case FALSE: case OFF: if (!npc.hasTrait(trait)) { - Debug.echoError(scriptEntry, "NPC does not have trait '" + traitName.asString() + "'"); + Debug.echoError(scriptEntry, "NPC does not have trait '" + traitName.getName() + "'"); } else { npc.removeTrait(trait); @@ -139,10 +133,21 @@ public void execute(ScriptEntry scriptEntry) { case TOGGLE: if (npc.hasTrait(trait)) { npc.removeTrait(trait); + break; } - else { - npc.addTrait(trait); + if (trait == SittingTrait.class || trait == SleepingTrait.class || trait == SneakingTrait.class) { + BukkitImplDeprecations.citizensTraits.warn(); + if (trait == SittingTrait.class) { + trait = SitTrait.class; + } + else if (trait == SleepingTrait.class) { + trait = SleepTrait.class; + } + else { + trait = SneakTrait.class; + } } + npc.addTrait(trait); break; } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java index 19cd68ef9d..3d1869cee1 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java @@ -489,6 +489,9 @@ public class BukkitImplDeprecations { // Added 2025/09/22 public static Warning playerSteerEntityEvent = new FutureWarning("playerSteerEntityEvent", "The 'player steers ' event is deprecated in favor of the 'player input' event in MC 1.21+."); + // Added 2026/07/02 + public static Warning citizensTraits = new FutureWarning("citizensTraits", "The Denizen-native 'SittingTrait', 'SleepingTrait', and 'SneakingTrait' traits have been removed in favor of Citizens' 'SitTrait', 'SleepTrait', and 'SneakTrait' respectively."); + // ==================== PAST deprecations of things that are already gone but still have a warning left behind ==================== // Removed upstream 2025/02/15 diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/command/NPCCommandHandler.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/command/NPCCommandHandler.java index fdab9acaf0..4f9d7f0b83 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/command/NPCCommandHandler.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/command/NPCCommandHandler.java @@ -2,6 +2,7 @@ import com.denizenscript.denizen.Denizen; import com.denizenscript.denizen.npc.traits.*; +import com.denizenscript.denizen.npc.traits.MirrorTrait; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.objects.PlayerTag; import com.denizenscript.denizen.scripts.containers.core.AssignmentScriptContainer; @@ -16,7 +17,7 @@ import net.citizensnpcs.api.command.Requirements; import net.citizensnpcs.api.command.exception.CommandException; import net.citizensnpcs.api.npc.NPC; -import net.citizensnpcs.trait.Anchors; +import net.citizensnpcs.trait.*; import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; @@ -340,25 +341,36 @@ public void sitting(CommandContext args, CommandSender sender, NPC npc) throws C npc.getOrAddTrait(SneakingTrait.class).stand(); npc.removeTrait(SneakingTrait.class); } + if (npc.hasTrait(SneakTrait.class)) { + npc.getOrAddTrait(SneakTrait.class).setSneaking(false); + npc.removeTrait(SneakTrait.class); + } if (npc.hasTrait(SleepingTrait.class)) { npc.getOrAddTrait(SleepingTrait.class).wakeUp(); npc.removeTrait(SleepingTrait.class); } - SittingTrait trait = npc.getOrAddTrait(SittingTrait.class); + if (npc.hasTrait(SleepTrait.class)) { + npc.removeTrait(SleepTrait.class); + } + if (npc.hasTrait(SittingTrait.class)) { + npc.getOrAddTrait(SittingTrait.class).stand(); + npc.removeTrait(SittingTrait.class); + } + SitTrait trait = npc.getOrAddTrait(SitTrait.class); if (args.hasValueFlag("location")) { LocationTag location = LocationTag.valueOf(args.getFlag("location"), CoreUtilities.basicContext); if (location == null) { Messaging.sendError(sender, "Usage: /npc sit --location x,y,z,world"); return; } - trait.sit(location); + trait.setSitting(location); return; } else if (args.hasValueFlag("anchor")) { if (npc.hasTrait(Anchors.class)) { Anchors anchors = npc.getOrAddTrait(Anchors.class); if (anchors.getAnchor(args.getFlag("anchor")) != null) { - trait.sit(anchors.getAnchor(args.getFlag("anchor")).getLocation()); + trait.setSitting(anchors.getAnchor(args.getFlag("anchor")).getLocation()); Messaging.send(sender, npc.getName() + " is now sitting."); return; } @@ -381,7 +393,7 @@ else if (args.hasValueFlag("anchor")) { } Block block = targetLocation.getBlock(); BlockData data = block.getBlockData(); - if (data instanceof Stairs || data instanceof Bed || (data instanceof Slab && ((Slab) data).getType() == Slab.Type.BOTTOM)) { + if (data instanceof Stairs || data instanceof Bed || (data instanceof Slab slab && slab.getType() == Slab.Type.BOTTOM)) { targetLocation.setY(targetLocation.getBlockY() + 0.3); } else if (data instanceof Campfire) { @@ -393,7 +405,7 @@ else if (block.getType().name().endsWith("CARPET")) { else if (block.getType().isSolid()) { targetLocation.setY(targetLocation.getBlockY() + 0.8); } - trait.sit(targetLocation); + trait.setSitting(targetLocation); Messaging.send(sender, npc.getName() + " is now sitting."); } @@ -414,6 +426,15 @@ public void standing(CommandContext args, CommandSender sender, NPC npc) throws npc.removeTrait(SittingTrait.class); Messaging.send(sender, npc.getName() + " is now standing."); } + else if (npc.hasTrait(SitTrait.class)) { + SitTrait trait = npc.getOrAddTrait(SitTrait.class); + if (!trait.isSitting()) { + Messaging.sendError(sender, npc.getName() + " is already standing!"); + return; + } + npc.removeTrait(SitTrait.class); + Messaging.send(sender, npc.getName() + " is now standing."); + } else if (npc.hasTrait(SneakingTrait.class)) { SneakingTrait trait = npc.getOrAddTrait(SneakingTrait.class); if (!trait.isSneaking()) { @@ -425,6 +446,15 @@ else if (npc.hasTrait(SneakingTrait.class)) { npc.removeTrait(SneakingTrait.class); Messaging.send(sender, npc.getName() + " is now standing."); } + else if (npc.hasTrait(SneakTrait.class)) { + SneakTrait trait = npc.getOrAddTrait(SneakTrait.class); + if (!trait.isSneaking()) { + Messaging.sendError(sender, npc.getName() + " is already standing!"); + return; + } + trait.setSneaking(false); + Messaging.send(sender, npc.getName() + " is now standing."); + } else if (npc.hasTrait(SleepingTrait.class)) { SleepingTrait trait = npc.getOrAddTrait(SleepingTrait.class); if (!trait.isSleeping()) { @@ -436,6 +466,10 @@ else if (npc.hasTrait(SleepingTrait.class)) { npc.removeTrait(SleepingTrait.class); Messaging.send(sender, npc.getName() + " is now standing."); } + else if (npc.hasTrait(SleepTrait.class)) { + npc.removeTrait(SleepTrait.class); + Messaging.send(sender, npc.getName() + " is now standing."); + } else { Messaging.sendError(sender, npc.getName() + " is already standing!"); } @@ -451,30 +485,42 @@ public void sleeping(CommandContext args, CommandSender sender, NPC npc) throws npc.getOrAddTrait(SneakingTrait.class).stand(); npc.removeTrait(SneakingTrait.class); } + if (npc.hasTrait(SneakTrait.class)) { + npc.getOrAddTrait(SneakTrait.class).setSneaking(false); + npc.removeTrait(SneakTrait.class); + } if (npc.hasTrait(SittingTrait.class)) { npc.getOrAddTrait(SittingTrait.class).stand(); npc.removeTrait(SittingTrait.class); } - SleepingTrait trait = npc.getOrAddTrait(SleepingTrait.class); - if (trait.isSleeping()) { + if (npc.hasTrait(SitTrait.class)) { + npc.removeTrait(SitTrait.class); + } + if (npc.hasTrait(SleepingTrait.class)) { + npc.getOrAddTrait(SleepingTrait.class).wakeUp(); Messaging.send(sender, npc.getName() + " was already sleeping, and is now standing!"); - trait.wakeUp(); npc.removeTrait(SleepingTrait.class); return; } + if (npc.hasTrait(SleepTrait.class)) { + Messaging.send(sender, npc.getName() + " was already sleeping, and is now standing!"); + npc.removeTrait(SleepTrait.class); + return; + } + SleepTrait trait = npc.getOrAddTrait(SleepTrait.class); if (args.hasValueFlag("location")) { LocationTag location = LocationTag.valueOf(args.getFlag("location"), CoreUtilities.basicContext); if (location == null) { Messaging.sendError(sender, "Usage: /npc sleep --location x,y,z,world"); return; } - trait.toSleep(location); + trait.setSleeping(location); } else if (args.hasValueFlag("anchor")) { if (npc.hasTrait(Anchors.class)) { Anchors anchors = npc.getOrAddTrait(Anchors.class); if (anchors.getAnchor(args.getFlag("anchor")) != null) { - trait.toSleep(anchors.getAnchor(args.getFlag("anchor")).getLocation().clone().add(0.5, 0, 0.5)); + trait.setSleeping(anchors.getAnchor(args.getFlag("anchor")).getLocation().clone().add(0.5, 0, 0.5)); Messaging.send(sender, npc.getName() + " is now sleeping."); return; } @@ -483,10 +529,7 @@ else if (args.hasValueFlag("anchor")) { return; } else { - trait.toSleep(); - } - if (!trait.isSleeping()) { - npc.removeTrait(SleepingTrait.class); + trait.setSleeping(null); } Messaging.send(sender, npc.getName() + " is now sleeping."); } @@ -497,15 +540,18 @@ else if (args.hasValueFlag("anchor")) { min = 1, max = 1, permission = "denizen.npc.sleep") @Requirements(selected = true, ownership = true) public void wakingup(CommandContext args, CommandSender sender, NPC npc) throws CommandException { - SleepingTrait trait = npc.getOrAddTrait(SleepingTrait.class); - if (!trait.isSleeping()) { + if (npc.hasTrait(SleepingTrait.class)) { + npc.getOrAddTrait(SleepingTrait.class).wakeUp(); npc.removeTrait(SleepingTrait.class); + Messaging.send(sender, npc.getName() + " is no longer sleeping."); + } + else if (npc.hasTrait(SleepTrait.class)) { + npc.removeTrait(SleepTrait.class); + Messaging.send(sender, npc.getName() + " is no longer sleeping."); + } + else { Messaging.sendError(sender, npc.getName() + " is already awake!"); - return; } - trait.wakeUp(); - npc.removeTrait(SleepingTrait.class); - Messaging.send(sender, npc.getName() + " is no longer sleeping."); } @Command( @@ -601,21 +647,31 @@ public void sneaking(CommandContext args, CommandSender sender, NPC npc) throws npc.getOrAddTrait(SleepingTrait.class).wakeUp(); npc.removeTrait(SleepingTrait.class); } - if (npc.hasTrait(SleepingTrait.class)) { - npc.getOrAddTrait(SleepingTrait.class).wakeUp(); - npc.removeTrait(SleepingTrait.class); + if (npc.hasTrait(SleepTrait.class)) { + npc.removeTrait(SleepTrait.class); + } + if (npc.hasTrait(SittingTrait.class)) { + npc.getOrAddTrait(SittingTrait.class).stand(); + npc.removeTrait(SittingTrait.class); + } + if (npc.hasTrait(SitTrait.class)) { + npc.removeTrait(SitTrait.class); + } + if (npc.hasTrait(SneakingTrait.class)) { + npc.getOrAddTrait(SneakingTrait.class).stand(); + npc.removeTrait(SneakingTrait.class); } if (npc.getEntity().getType() != EntityType.PLAYER) { Messaging.sendError(sender, npc.getName() + " needs to be a Player type NPC to sneak!"); return; } - SneakingTrait trait = npc.getOrAddTrait(SneakingTrait.class); + SneakTrait trait = npc.getOrAddTrait(SneakTrait.class); if (trait.isSneaking()) { - trait.stand(); + trait.setSneaking(false); Messaging.send(sender, npc.getName() + " was already sneaking, and is now standing."); } else { - trait.sneak(); + trait.setSneaking(true); Messaging.send(sender, npc.getName() + " is now sneaking."); } } From 3d00d916989e241f66825259baa60a49d43f8c02 Mon Sep 17 00:00:00 2001 From: MCSamuel <187220916+MC-Samuel@users.noreply.github.com> Date: Sun, 12 Jul 2026 15:33:15 -0700 Subject: [PATCH 02/10] bug fixes and changes --- .../paper/properties/EntitySneaking.java | 1 - .../scripts/commands/entity/SneakCommand.java | 19 +++--- .../scripts/commands/npc/SitCommand.java | 1 - .../scripts/commands/npc/SleepCommand.java | 13 ++++- .../scripts/commands/npc/StandCommand.java | 24 ++++---- .../scripts/commands/npc/TraitCommand.java | 58 +++++++------------ .../utilities/BukkitImplDeprecations.java | 2 +- .../utilities/command/NPCCommandHandler.java | 21 +++---- 8 files changed, 62 insertions(+), 77 deletions(-) diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/properties/EntitySneaking.java b/paper/src/main/java/com/denizenscript/denizen/paper/properties/EntitySneaking.java index cae012fe6a..2bb362426e 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/properties/EntitySneaking.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/properties/EntitySneaking.java @@ -49,7 +49,6 @@ public void setPropertyValue(ElementTag value, Mechanism mechanism) { } else if (npc.hasTrait(SneakTrait.class)) { npc.getOrAddTrait(SneakTrait.class).setSneaking(false); - npc.removeTrait(SneakTrait.class); } else if (npc.hasTrait(SneakingTrait.class)) { // backsupport npc.getTraitNullable(SneakingTrait.class).stand(); diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/SneakCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/SneakCommand.java index a0865fa0d2..e1af656683 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/SneakCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/SneakCommand.java @@ -10,6 +10,7 @@ import com.denizenscript.denizencore.scripts.commands.AbstractCommand; import com.denizenscript.denizencore.scripts.commands.generator.*; import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.trait.SneakTrait; import org.bukkit.entity.Player; @@ -65,17 +66,14 @@ public enum SneakMode { START, STOP } public enum SneakFake { FAKE, STOPFAKE } public static void autoExecute(ScriptEntry scriptEntry, - @ArgName("entities") @ArgLinear @ArgDefaultNull List entities, + @ArgName("entities") @ArgLinear @ArgDefaultNull @ArgSubType(EntityTag.class) List entities, @ArgName("mode") @ArgLinear @ArgDefaultNull SneakMode mode, @ArgName("fake") @ArgLinear @ArgDefaultNull SneakFake fake, - @ArgName("for") @ArgPrefixed @ArgDefaultNull List players) { + @ArgName("for") @ArgPrefixed @ArgDefaultNull @ArgSubType(PlayerTag.class) List players) { if (entities == null) { throw new InvalidArgumentsRuntimeException("Missing entities argument."); } - if (mode == null) { - mode = SneakMode.START; - } - boolean shouldSneak = mode.equals(SneakMode.START); + boolean shouldSneak = mode == null || mode.equals(SneakMode.START); boolean shouldFake = fake != null && fake.equals(SneakFake.FAKE); boolean shouldStopFake = fake != null && fake.equals(SneakFake.STOPFAKE); for (EntityTag entity : entities) { @@ -94,11 +92,12 @@ public static void autoExecute(ScriptEntry scriptEntry, } } else if (entity.isCitizensNPC()) { - if (entity.getDenizenNPC().getCitizen().hasTrait(SneakingTrait.class)) { - entity.getDenizenNPC().getCitizen().getOrAddTrait(SneakingTrait.class).stand(); - entity.getDenizenNPC().getCitizen().removeTrait(SneakingTrait.class); + NPC npc = entity.getDenizenNPC().getCitizen(); + if (npc.hasTrait(SneakingTrait.class)) { + npc.getOrAddTrait(SneakingTrait.class).stand(); + npc.removeTrait(SneakingTrait.class); } - SneakTrait trait = entity.getDenizenNPC().getCitizen().getOrAddTrait(SneakTrait.class); + SneakTrait trait = npc.getOrAddTrait(SneakTrait.class); trait.setSneaking(shouldSneak); } else if (entity.isSpawned()) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SitCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SitCommand.java index 5bf712a665..e9b7c3139b 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SitCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SitCommand.java @@ -11,7 +11,6 @@ import com.denizenscript.denizencore.scripts.commands.generator.ArgName; import com.denizenscript.denizencore.utilities.debugging.Debug; import net.citizensnpcs.trait.SitTrait; -import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.entity.Sittable; diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SleepCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SleepCommand.java index 878997cd41..34e1e89125 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SleepCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SleepCommand.java @@ -1,5 +1,6 @@ package com.denizenscript.denizen.scripts.commands.npc; +import com.denizenscript.denizen.npc.traits.SittingTrait; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.objects.NPCTag; import com.denizenscript.denizen.utilities.Utilities; @@ -10,6 +11,8 @@ import com.denizenscript.denizencore.scripts.commands.generator.ArgLinear; import com.denizenscript.denizencore.scripts.commands.generator.ArgName; import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.citizensnpcs.api.npc.NPC; +import net.citizensnpcs.trait.SitTrait; import net.citizensnpcs.trait.SleepTrait; import org.bukkit.entity.EntityType; import org.bukkit.entity.Villager; @@ -56,7 +59,15 @@ public static void autoExecute(ScriptEntry scriptEntry, Debug.echoError("Only Player or villager type NPCs can sit!"); return; } - SleepTrait trait = npc.getCitizen().getOrAddTrait(SleepTrait.class); + NPC citizen = npc.getCitizen(); + if (citizen.hasTrait(SittingTrait.class)) { + citizen.getOrAddTrait(SittingTrait.class).stand(); + citizen.removeTrait(SittingTrait.class); + } + if (citizen.hasTrait(SitTrait.class)) { + citizen.getOrAddTrait(SitTrait.class).setSitting(null); + } + SleepTrait trait = citizen.getOrAddTrait(SleepTrait.class); if (location != null) { trait.setSleeping(location); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/StandCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/StandCommand.java index 7b78ef010c..58ba17ecd4 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/StandCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/StandCommand.java @@ -8,6 +8,7 @@ import com.denizenscript.denizencore.scripts.ScriptEntry; import com.denizenscript.denizencore.scripts.commands.AbstractCommand; import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.trait.SitTrait; import net.citizensnpcs.trait.SleepTrait; import org.bukkit.entity.Player; @@ -60,21 +61,20 @@ public static void autoExecute(ScriptEntry scriptEntry) { sittable.setSitting(false); } else { - if (npc.getCitizen().hasTrait(SittingTrait.class)) { - SittingTrait trait = npc.getCitizen().getOrAddTrait(SittingTrait.class); - trait.stand(); - npc.getCitizen().removeTrait(SittingTrait.class); + NPC citizen = npc.getCitizen(); + if (citizen.hasTrait(SittingTrait.class)) { + citizen.getOrAddTrait(SittingTrait.class).stand(); + citizen.removeTrait(SittingTrait.class); } - if (npc.getCitizen().hasTrait(SitTrait.class)) { - npc.getCitizen().removeTrait(SitTrait.class); + if (citizen.hasTrait(SitTrait.class)) { + citizen.getOrAddTrait(SitTrait.class).setSitting(null); } - if (npc.getCitizen().hasTrait(SleepingTrait.class)) { - SleepingTrait trait = npc.getCitizen().getOrAddTrait(SleepingTrait.class); - trait.wakeUp(); - npc.getCitizen().removeTrait(SleepingTrait.class); + if (citizen.hasTrait(SleepingTrait.class)) { + citizen.getOrAddTrait(SleepingTrait.class).wakeUp(); + citizen.removeTrait(SleepingTrait.class); } - if (npc.getCitizen().hasTrait(SleepTrait.class)) { - npc.getCitizen().removeTrait(SleepTrait.class); + if (citizen.hasTrait(SleepTrait.class)) { + citizen.getOrAddTrait(SleepTrait.class).setSleeping(null); } } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/TraitCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/TraitCommand.java index e2aeb13996..7b367107c1 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/TraitCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/TraitCommand.java @@ -79,74 +79,58 @@ public void addCustomTabCompletions(TabCompletionsBuilder tab) { public static void autoExecute(ScriptEntry scriptEntry, @ArgName("state") @ArgPrefixed @ArgDefaultNull Toggle toggle, - @ArgName("trait") @ArgLinear @ArgDefaultNull Trait traitName, - @ArgName("to") @ArgPrefixed @ArgDefaultNull List npcs) { + @ArgName("trait") @ArgLinear @ArgDefaultNull String traitName, + @ArgName("to") @ArgPrefixed @ArgDefaultNull @ArgSubType(NPCTag.class) List npcs) { if (traitName == null) { throw new InvalidArgumentsRuntimeException("Missing trait argument!"); } + Class trait = CitizensAPI.getTraitFactory().getTraitClass(traitName); + if (trait == null) { + throw new InvalidArgumentsRuntimeException("Trait not found: " + traitName); + } + if (trait == SittingTrait.class || trait == SleepingTrait.class || trait == SneakingTrait.class) { + BukkitImplDeprecations.citizensTraits.warn(); + if (trait == SittingTrait.class) { + trait = SitTrait.class; + } + else if (trait == SleepingTrait.class) { + trait = SleepTrait.class; + } + else { + trait = SneakTrait.class; + } + } if (npcs == null) { if (!Utilities.entryHasNPC(scriptEntry)) { throw new InvalidArgumentsRuntimeException("This command requires a linked NPC!"); } npcs = Collections.singletonList(Utilities.getEntryNPC(scriptEntry)); } - if (toggle == null) { - toggle = Toggle.TOGGLE; - } - Class trait = CitizensAPI.getTraitFactory().getTraitClass(traitName.getName()); - if (trait == null) { - Debug.echoError(scriptEntry, "Trait not found: " + traitName.getName()); - return; - } for (NPCTag npcTag : npcs) { NPC npc = npcTag.getCitizen(); switch (toggle) { case TRUE: case ON: if (npc.hasTrait(trait)) { - Debug.echoError(scriptEntry, "NPC already has trait '" + traitName.getName() + "'"); + Debug.echoError(scriptEntry, "NPC already has trait '" + trait.getName() + "'"); break; } - if (trait == SittingTrait.class || trait == SleepingTrait.class || trait == SneakingTrait.class) { - BukkitImplDeprecations.citizensTraits.warn(); - if (trait == SittingTrait.class) { - trait = SitTrait.class; - } - else if (trait == SleepingTrait.class) { - trait = SleepTrait.class; - } - else { - trait = SneakTrait.class; - } - } npc.addTrait(trait); break; case FALSE: case OFF: if (!npc.hasTrait(trait)) { - Debug.echoError(scriptEntry, "NPC does not have trait '" + traitName.getName() + "'"); + Debug.echoError(scriptEntry, "NPC does not have trait '" + trait.getName() + "'"); } else { npc.removeTrait(trait); } break; - case TOGGLE: + default: if (npc.hasTrait(trait)) { npc.removeTrait(trait); break; } - if (trait == SittingTrait.class || trait == SleepingTrait.class || trait == SneakingTrait.class) { - BukkitImplDeprecations.citizensTraits.warn(); - if (trait == SittingTrait.class) { - trait = SitTrait.class; - } - else if (trait == SleepingTrait.class) { - trait = SleepTrait.class; - } - else { - trait = SneakTrait.class; - } - } npc.addTrait(trait); break; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java index 3d1869cee1..0e72364d53 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java @@ -490,7 +490,7 @@ public class BukkitImplDeprecations { public static Warning playerSteerEntityEvent = new FutureWarning("playerSteerEntityEvent", "The 'player steers ' event is deprecated in favor of the 'player input' event in MC 1.21+."); // Added 2026/07/02 - public static Warning citizensTraits = new FutureWarning("citizensTraits", "The Denizen-native 'SittingTrait', 'SleepingTrait', and 'SneakingTrait' traits have been removed in favor of Citizens' 'SitTrait', 'SleepTrait', and 'SneakTrait' respectively."); + public static Warning citizensTraits = new FutureWarning("citizensTraits", "The Denizen-native 'Sitting', 'Sleeping', and 'Sneaking' traits have been removed in favor of Citizens' 'SitTrait', 'SleepTrait', and 'Sneak' traits respectively."); // ==================== PAST deprecations of things that are already gone but still have a warning left behind ==================== diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/command/NPCCommandHandler.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/command/NPCCommandHandler.java index 4f9d7f0b83..dee522ec98 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/command/NPCCommandHandler.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/command/NPCCommandHandler.java @@ -343,14 +343,13 @@ public void sitting(CommandContext args, CommandSender sender, NPC npc) throws C } if (npc.hasTrait(SneakTrait.class)) { npc.getOrAddTrait(SneakTrait.class).setSneaking(false); - npc.removeTrait(SneakTrait.class); } if (npc.hasTrait(SleepingTrait.class)) { npc.getOrAddTrait(SleepingTrait.class).wakeUp(); npc.removeTrait(SleepingTrait.class); } if (npc.hasTrait(SleepTrait.class)) { - npc.removeTrait(SleepTrait.class); + npc.getOrAddTrait(SleepTrait.class).setSleeping(null); } if (npc.hasTrait(SittingTrait.class)) { npc.getOrAddTrait(SittingTrait.class).stand(); @@ -432,7 +431,7 @@ else if (npc.hasTrait(SitTrait.class)) { Messaging.sendError(sender, npc.getName() + " is already standing!"); return; } - npc.removeTrait(SitTrait.class); + trait.setSitting(null); Messaging.send(sender, npc.getName() + " is now standing."); } else if (npc.hasTrait(SneakingTrait.class)) { @@ -467,7 +466,7 @@ else if (npc.hasTrait(SleepingTrait.class)) { Messaging.send(sender, npc.getName() + " is now standing."); } else if (npc.hasTrait(SleepTrait.class)) { - npc.removeTrait(SleepTrait.class); + npc.getOrAddTrait(SleepTrait.class).setSleeping(null); Messaging.send(sender, npc.getName() + " is now standing."); } else { @@ -487,14 +486,13 @@ public void sleeping(CommandContext args, CommandSender sender, NPC npc) throws } if (npc.hasTrait(SneakTrait.class)) { npc.getOrAddTrait(SneakTrait.class).setSneaking(false); - npc.removeTrait(SneakTrait.class); } if (npc.hasTrait(SittingTrait.class)) { npc.getOrAddTrait(SittingTrait.class).stand(); npc.removeTrait(SittingTrait.class); } if (npc.hasTrait(SitTrait.class)) { - npc.removeTrait(SitTrait.class); + npc.getOrAddTrait(SitTrait.class).setSitting(null); } if (npc.hasTrait(SleepingTrait.class)) { npc.getOrAddTrait(SleepingTrait.class).wakeUp(); @@ -502,11 +500,6 @@ public void sleeping(CommandContext args, CommandSender sender, NPC npc) throws npc.removeTrait(SleepingTrait.class); return; } - if (npc.hasTrait(SleepTrait.class)) { - Messaging.send(sender, npc.getName() + " was already sleeping, and is now standing!"); - npc.removeTrait(SleepTrait.class); - return; - } SleepTrait trait = npc.getOrAddTrait(SleepTrait.class); if (args.hasValueFlag("location")) { LocationTag location = LocationTag.valueOf(args.getFlag("location"), CoreUtilities.basicContext); @@ -546,7 +539,7 @@ public void wakingup(CommandContext args, CommandSender sender, NPC npc) throws Messaging.send(sender, npc.getName() + " is no longer sleeping."); } else if (npc.hasTrait(SleepTrait.class)) { - npc.removeTrait(SleepTrait.class); + npc.getOrAddTrait(SleepTrait.class).setSleeping(null); Messaging.send(sender, npc.getName() + " is no longer sleeping."); } else { @@ -648,14 +641,14 @@ public void sneaking(CommandContext args, CommandSender sender, NPC npc) throws npc.removeTrait(SleepingTrait.class); } if (npc.hasTrait(SleepTrait.class)) { - npc.removeTrait(SleepTrait.class); + npc.getOrAddTrait(SleepTrait.class).setSleeping(null); } if (npc.hasTrait(SittingTrait.class)) { npc.getOrAddTrait(SittingTrait.class).stand(); npc.removeTrait(SittingTrait.class); } if (npc.hasTrait(SitTrait.class)) { - npc.removeTrait(SitTrait.class); + npc.getOrAddTrait(SitTrait.class).setSitting(null); } if (npc.hasTrait(SneakingTrait.class)) { npc.getOrAddTrait(SneakingTrait.class).stand(); From dcd4f35557e95b828598e1ec9674f5affc9e41e6 Mon Sep 17 00:00:00 2001 From: MCSamuel <187220916+MC-Samuel@users.noreply.github.com> Date: Sun, 12 Jul 2026 15:50:16 -0700 Subject: [PATCH 03/10] missed edits --- .../com/denizenscript/denizen/objects/NPCTag.java | 2 +- .../utilities/command/NPCCommandHandler.java | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/NPCTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/NPCTag.java index 08f39c9d5e..2cd8fada5f 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/NPCTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/NPCTag.java @@ -491,7 +491,7 @@ public static void register() { // --> tagProcessor.registerTag(ElementTag.class, "is_sleeping", (attribute, object) -> { NPC citizen = object.getCitizen(); - return new ElementTag(citizen.hasTrait(SleepTrait.class) + return new ElementTag((citizen.hasTrait(SleepTrait.class) && citizen.getOrAddTrait(SleepTrait.class).isSleeping()) || (citizen.hasTrait(SleepingTrait.class) && citizen.getOrAddTrait(SleepingTrait.class).isSleeping())); //backsupport }); diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/command/NPCCommandHandler.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/command/NPCCommandHandler.java index dee522ec98..85bb7e026d 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/command/NPCCommandHandler.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/command/NPCCommandHandler.java @@ -466,7 +466,12 @@ else if (npc.hasTrait(SleepingTrait.class)) { Messaging.send(sender, npc.getName() + " is now standing."); } else if (npc.hasTrait(SleepTrait.class)) { - npc.getOrAddTrait(SleepTrait.class).setSleeping(null); + SleepTrait trait = npc.getOrAddTrait(SleepTrait.class); + if (!trait.isSleeping()) { + Messaging.sendError(sender, npc.getName() + " is already standing!"); + return; + } + trait.setSleeping(null); Messaging.send(sender, npc.getName() + " is now standing."); } else { @@ -501,6 +506,11 @@ public void sleeping(CommandContext args, CommandSender sender, NPC npc) throws return; } SleepTrait trait = npc.getOrAddTrait(SleepTrait.class); + if (trait.isSleeping()) { + trait.setSleeping(null); + Messaging.send(sender, npc.getName() + " was already sleeping, and is now standing!"); + return; + } if (args.hasValueFlag("location")) { LocationTag location = LocationTag.valueOf(args.getFlag("location"), CoreUtilities.basicContext); if (location == null) { @@ -538,7 +548,7 @@ public void wakingup(CommandContext args, CommandSender sender, NPC npc) throws npc.removeTrait(SleepingTrait.class); Messaging.send(sender, npc.getName() + " is no longer sleeping."); } - else if (npc.hasTrait(SleepTrait.class)) { + else if (npc.hasTrait(SleepTrait.class) && npc.getOrAddTrait(SleepTrait.class).isSleeping()) { npc.getOrAddTrait(SleepTrait.class).setSleeping(null); Messaging.send(sender, npc.getName() + " is no longer sleeping."); } From 64bfa2614b1a18814a852a8aef217174952a4499 Mon Sep 17 00:00:00 2001 From: MCSamuel <187220916+MC-Samuel@users.noreply.github.com> Date: Sun, 12 Jul 2026 17:32:22 -0700 Subject: [PATCH 04/10] missed file --- .../scripts/commands/npc/StandCommand.java | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/StandCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/StandCommand.java index 58ba17ecd4..9759faabf3 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/StandCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/StandCommand.java @@ -59,23 +59,22 @@ public static void autoExecute(ScriptEntry scriptEntry) { } if (npc.getEntity() instanceof Sittable sittable) { sittable.setSitting(false); + return; + } + NPC citizen = npc.getCitizen(); + if (citizen.hasTrait(SittingTrait.class)) { + citizen.getOrAddTrait(SittingTrait.class).stand(); + citizen.removeTrait(SittingTrait.class); + } + if (citizen.hasTrait(SitTrait.class)) { + citizen.getOrAddTrait(SitTrait.class).setSitting(null); + } + if (citizen.hasTrait(SleepingTrait.class)) { + citizen.getOrAddTrait(SleepingTrait.class).wakeUp(); + citizen.removeTrait(SleepingTrait.class); } - else { - NPC citizen = npc.getCitizen(); - if (citizen.hasTrait(SittingTrait.class)) { - citizen.getOrAddTrait(SittingTrait.class).stand(); - citizen.removeTrait(SittingTrait.class); - } - if (citizen.hasTrait(SitTrait.class)) { - citizen.getOrAddTrait(SitTrait.class).setSitting(null); - } - if (citizen.hasTrait(SleepingTrait.class)) { - citizen.getOrAddTrait(SleepingTrait.class).wakeUp(); - citizen.removeTrait(SleepingTrait.class); - } - if (citizen.hasTrait(SleepTrait.class)) { - citizen.getOrAddTrait(SleepTrait.class).setSleeping(null); - } + if (citizen.hasTrait(SleepTrait.class)) { + citizen.getOrAddTrait(SleepTrait.class).setSleeping(null); } } } From ed0b07ba4c1c5716782198e625b6898ce8b0d4de Mon Sep 17 00:00:00 2001 From: MCSamuel <187220916+MC-Samuel@users.noreply.github.com> Date: Sun, 12 Jul 2026 22:16:49 -0700 Subject: [PATCH 05/10] SleepTrait only applied on MC 1.21+ --- .../denizenscript/denizen/objects/NPCTag.java | 2 +- .../scripts/commands/npc/SleepCommand.java | 19 +++++++--- .../scripts/commands/npc/StandCommand.java | 8 +++- .../scripts/commands/npc/TraitCommand.java | 4 +- .../utilities/command/NPCCommandHandler.java | 38 +++++++++++++------ 5 files changed, 49 insertions(+), 22 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/NPCTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/NPCTag.java index 2cd8fada5f..e55766ae31 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/NPCTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/NPCTag.java @@ -491,7 +491,7 @@ public static void register() { // --> tagProcessor.registerTag(ElementTag.class, "is_sleeping", (attribute, object) -> { NPC citizen = object.getCitizen(); - return new ElementTag((citizen.hasTrait(SleepTrait.class) && citizen.getOrAddTrait(SleepTrait.class).isSleeping()) + return new ElementTag((NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && citizen.hasTrait(SleepTrait.class) && citizen.getOrAddTrait(SleepTrait.class).isSleeping()) || (citizen.hasTrait(SleepingTrait.class) && citizen.getOrAddTrait(SleepingTrait.class).isSleeping())); //backsupport }); diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SleepCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SleepCommand.java index 34e1e89125..ab8e348412 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SleepCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SleepCommand.java @@ -1,6 +1,9 @@ package com.denizenscript.denizen.scripts.commands.npc; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.npc.traits.SittingTrait; +import com.denizenscript.denizen.npc.traits.SleepingTrait; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.objects.NPCTag; import com.denizenscript.denizen.utilities.Utilities; @@ -67,12 +70,16 @@ public static void autoExecute(ScriptEntry scriptEntry, if (citizen.hasTrait(SitTrait.class)) { citizen.getOrAddTrait(SitTrait.class).setSitting(null); } - SleepTrait trait = citizen.getOrAddTrait(SleepTrait.class); - if (location != null) { - trait.setSleeping(location); - } - else { - trait.setSleeping(npc.getLocation()); + if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_20)) { // backsupport + SleepingTrait trait = citizen.getOrAddTrait(SleepingTrait.class); + if (location != null) { + trait.toSleep(location); + } + else { + trait.toSleep(); + } + return; } + citizen.getOrAddTrait(SleepTrait.class).setSleeping(location != null ? location : npc.getLocation()); } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/StandCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/StandCommand.java index 9759faabf3..ad46b1ce12 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/StandCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/StandCommand.java @@ -1,5 +1,7 @@ package com.denizenscript.denizen.scripts.commands.npc; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.npc.traits.SittingTrait; import com.denizenscript.denizen.npc.traits.SleepingTrait; import com.denizenscript.denizen.objects.NPCTag; @@ -71,9 +73,11 @@ public static void autoExecute(ScriptEntry scriptEntry) { } if (citizen.hasTrait(SleepingTrait.class)) { citizen.getOrAddTrait(SleepingTrait.class).wakeUp(); - citizen.removeTrait(SleepingTrait.class); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + citizen.removeTrait(SleepingTrait.class); + } } - if (citizen.hasTrait(SleepTrait.class)) { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && citizen.hasTrait(SleepTrait.class)) { citizen.getOrAddTrait(SleepTrait.class).setSleeping(null); } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/TraitCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/TraitCommand.java index 7b367107c1..4b1b57c4ec 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/TraitCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/TraitCommand.java @@ -1,5 +1,7 @@ package com.denizenscript.denizen.scripts.commands.npc; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.npc.traits.SittingTrait; import com.denizenscript.denizen.npc.traits.SleepingTrait; import com.denizenscript.denizen.npc.traits.SneakingTrait; @@ -88,7 +90,7 @@ public static void autoExecute(ScriptEntry scriptEntry, if (trait == null) { throw new InvalidArgumentsRuntimeException("Trait not found: " + traitName); } - if (trait == SittingTrait.class || trait == SleepingTrait.class || trait == SneakingTrait.class) { + if (trait == SittingTrait.class || (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && trait == SleepingTrait.class) || trait == SneakingTrait.class) { BukkitImplDeprecations.citizensTraits.warn(); if (trait == SittingTrait.class) { trait = SitTrait.class; diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/command/NPCCommandHandler.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/command/NPCCommandHandler.java index 85bb7e026d..bc6ae6b2c3 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/command/NPCCommandHandler.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/command/NPCCommandHandler.java @@ -1,6 +1,8 @@ package com.denizenscript.denizen.utilities.command; import com.denizenscript.denizen.Denizen; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.npc.traits.*; import com.denizenscript.denizen.npc.traits.MirrorTrait; import com.denizenscript.denizen.objects.LocationTag; @@ -346,9 +348,11 @@ public void sitting(CommandContext args, CommandSender sender, NPC npc) throws C } if (npc.hasTrait(SleepingTrait.class)) { npc.getOrAddTrait(SleepingTrait.class).wakeUp(); - npc.removeTrait(SleepingTrait.class); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + npc.removeTrait(SleepingTrait.class); + } } - if (npc.hasTrait(SleepTrait.class)) { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && npc.hasTrait(SleepTrait.class)) { npc.getOrAddTrait(SleepTrait.class).setSleeping(null); } if (npc.hasTrait(SittingTrait.class)) { @@ -457,15 +461,19 @@ else if (npc.hasTrait(SneakTrait.class)) { else if (npc.hasTrait(SleepingTrait.class)) { SleepingTrait trait = npc.getOrAddTrait(SleepingTrait.class); if (!trait.isSleeping()) { - npc.removeTrait(SleepingTrait.class); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + npc.removeTrait(SleepingTrait.class); + } Messaging.sendError(sender, npc.getName() + " is already standing!"); return; } trait.wakeUp(); - npc.removeTrait(SleepingTrait.class); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + npc.removeTrait(SleepingTrait.class); + } Messaging.send(sender, npc.getName() + " is now standing."); } - else if (npc.hasTrait(SleepTrait.class)) { + else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && npc.hasTrait(SleepTrait.class)) { SleepTrait trait = npc.getOrAddTrait(SleepTrait.class); if (!trait.isSleeping()) { Messaging.sendError(sender, npc.getName() + " is already standing!"); @@ -502,11 +510,13 @@ public void sleeping(CommandContext args, CommandSender sender, NPC npc) throws if (npc.hasTrait(SleepingTrait.class)) { npc.getOrAddTrait(SleepingTrait.class).wakeUp(); Messaging.send(sender, npc.getName() + " was already sleeping, and is now standing!"); - npc.removeTrait(SleepingTrait.class); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + npc.removeTrait(SleepingTrait.class); + } return; } SleepTrait trait = npc.getOrAddTrait(SleepTrait.class); - if (trait.isSleeping()) { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && trait.isSleeping()) { trait.setSleeping(null); Messaging.send(sender, npc.getName() + " was already sleeping, and is now standing!"); return; @@ -532,7 +542,7 @@ else if (args.hasValueFlag("anchor")) { return; } else { - trait.setSleeping(null); + trait.setSleeping(npc.getStoredLocation()); } Messaging.send(sender, npc.getName() + " is now sleeping."); } @@ -545,10 +555,12 @@ else if (args.hasValueFlag("anchor")) { public void wakingup(CommandContext args, CommandSender sender, NPC npc) throws CommandException { if (npc.hasTrait(SleepingTrait.class)) { npc.getOrAddTrait(SleepingTrait.class).wakeUp(); - npc.removeTrait(SleepingTrait.class); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + npc.removeTrait(SleepingTrait.class); + } Messaging.send(sender, npc.getName() + " is no longer sleeping."); } - else if (npc.hasTrait(SleepTrait.class) && npc.getOrAddTrait(SleepTrait.class).isSleeping()) { + else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && npc.hasTrait(SleepTrait.class) && npc.getOrAddTrait(SleepTrait.class).isSleeping()) { npc.getOrAddTrait(SleepTrait.class).setSleeping(null); Messaging.send(sender, npc.getName() + " is no longer sleeping."); } @@ -648,9 +660,11 @@ public void stopFishing(CommandContext args, CommandSender sender, NPC npc) thro public void sneaking(CommandContext args, CommandSender sender, NPC npc) throws CommandException { if (npc.hasTrait(SleepingTrait.class)) { npc.getOrAddTrait(SleepingTrait.class).wakeUp(); - npc.removeTrait(SleepingTrait.class); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + npc.removeTrait(SleepingTrait.class); + } } - if (npc.hasTrait(SleepTrait.class)) { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && npc.hasTrait(SleepTrait.class)) { npc.getOrAddTrait(SleepTrait.class).setSleeping(null); } if (npc.hasTrait(SittingTrait.class)) { From f6548ae5e14d8ba455fe48dc4eb041dfba12f6a7 Mon Sep 17 00:00:00 2001 From: MCSamuel <187220916+MC-Samuel@users.noreply.github.com> Date: Mon, 13 Jul 2026 11:54:10 -0700 Subject: [PATCH 06/10] minor change --- .../denizen/scripts/commands/npc/SitCommand.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SitCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SitCommand.java index e9b7c3139b..61fe9a74f5 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SitCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SitCommand.java @@ -52,14 +52,10 @@ public static void autoExecute(ScriptEntry scriptEntry, throw new InvalidArgumentsRuntimeException("This command requires a linked NPC!"); } NPCTag npc = Utilities.getEntryNPC(scriptEntry); - if (!(npc.getEntity() instanceof Player || npc.getEntity() instanceof Sittable)) { - Debug.echoError("Entities of type " + npc.getEntityType() + " cannot sit."); - return; - } if (npc.getEntity() instanceof Sittable sittable) { sittable.setSitting(true); } - else { + else if (npc.getEntity() instanceof Player) { SitTrait trait = npc.getCitizen().getOrAddTrait(SitTrait.class); if (location != null) { trait.setSitting(location); @@ -68,5 +64,8 @@ public static void autoExecute(ScriptEntry scriptEntry, trait.setSitting(npc.getLocation()); } } + else { + Debug.echoError("Entities of type " + npc.getEntityType() + " cannot sit."); + } } } From 4a51cff4ab3a44b24eb3c78dffa3bb8ddffa0c5f Mon Sep 17 00:00:00 2001 From: MCSamuel <187220916+MC-Samuel@users.noreply.github.com> Date: Mon, 13 Jul 2026 11:59:01 -0700 Subject: [PATCH 07/10] ternary usage added and unnecessary variable removed --- .../denizen/scripts/commands/entity/SneakCommand.java | 3 +-- .../denizen/scripts/commands/npc/SitCommand.java | 8 +------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/SneakCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/SneakCommand.java index e1af656683..e62a7fd119 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/SneakCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/SneakCommand.java @@ -97,8 +97,7 @@ else if (entity.isCitizensNPC()) { npc.getOrAddTrait(SneakingTrait.class).stand(); npc.removeTrait(SneakingTrait.class); } - SneakTrait trait = npc.getOrAddTrait(SneakTrait.class); - trait.setSneaking(shouldSneak); + npc.getOrAddTrait(SneakTrait.class).setSneaking(shouldSneak); } else if (entity.isSpawned()) { NMSHandler.entityHelper.setSneaking(entity.getBukkitEntity(), shouldSneak); diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SitCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SitCommand.java index 61fe9a74f5..9cc2934f74 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SitCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/SitCommand.java @@ -56,13 +56,7 @@ public static void autoExecute(ScriptEntry scriptEntry, sittable.setSitting(true); } else if (npc.getEntity() instanceof Player) { - SitTrait trait = npc.getCitizen().getOrAddTrait(SitTrait.class); - if (location != null) { - trait.setSitting(location); - } - else { - trait.setSitting(npc.getLocation()); - } + npc.getCitizen().getOrAddTrait(SitTrait.class).setSitting(location != null ? location : npc.getLocation()); } else { Debug.echoError("Entities of type " + npc.getEntityType() + " cannot sit."); From 17dc499c32faae9f3f8a0c2ceb16080e5b027671 Mon Sep 17 00:00:00 2001 From: MCSamuel <187220916+MC-Samuel@users.noreply.github.com> Date: Mon, 13 Jul 2026 16:56:35 -0700 Subject: [PATCH 08/10] missed version update --- paper/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paper/pom.xml b/paper/pom.xml index ce0e1978cf..5f4e8b84e7 100644 --- a/paper/pom.xml +++ b/paper/pom.xml @@ -31,7 +31,7 @@ net.citizensnpcs citizens-main - 2.0.42-SNAPSHOT + 2.0.43-SNAPSHOT jar provided From 83282afc095f8f9bef4545a10c21f32219f9c331 Mon Sep 17 00:00:00 2001 From: MCSamuel <187220916+MC-Samuel@users.noreply.github.com> Date: Wed, 15 Jul 2026 11:38:19 -0700 Subject: [PATCH 09/10] deprecated `/npc sit` --- .../denizen/utilities/BukkitImplDeprecations.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java index 0e72364d53..9a3b0f0772 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java @@ -489,8 +489,9 @@ public class BukkitImplDeprecations { // Added 2025/09/22 public static Warning playerSteerEntityEvent = new FutureWarning("playerSteerEntityEvent", "The 'player steers ' event is deprecated in favor of the 'player input' event in MC 1.21+."); - // Added 2026/07/02 + // Added 2026/07/15 public static Warning citizensTraits = new FutureWarning("citizensTraits", "The Denizen-native 'Sitting', 'Sleeping', and 'Sneaking' traits have been removed in favor of Citizens' 'SitTrait', 'SleepTrait', and 'Sneak' traits respectively."); + public static Warning npcSitCommand = new FutureWarning("npcSitCommand", "The Denizen-native '/npc sit' has been deprecated in favor of Citizens' '/npc sitting'."); // ==================== PAST deprecations of things that are already gone but still have a warning left behind ==================== From fc0f54a6721faf0267bb86ed2c5713eddc7cf94a Mon Sep 17 00:00:00 2001 From: MCSamuel <187220916+MC-Samuel@users.noreply.github.com> Date: Wed, 15 Jul 2026 11:38:45 -0700 Subject: [PATCH 10/10] -_- --- .../denizen/utilities/command/NPCCommandHandler.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/command/NPCCommandHandler.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/command/NPCCommandHandler.java index bc6ae6b2c3..b1f2d00e89 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/command/NPCCommandHandler.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/command/NPCCommandHandler.java @@ -8,6 +8,7 @@ import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.objects.PlayerTag; import com.denizenscript.denizen.scripts.containers.core.AssignmentScriptContainer; +import com.denizenscript.denizen.utilities.BukkitImplDeprecations; import com.denizenscript.denizen.utilities.command.manager.messaging.Messaging; import com.denizenscript.denizencore.objects.core.DurationTag; import com.denizenscript.denizencore.scripts.ScriptRegistry; @@ -339,6 +340,7 @@ else if (args.hasFlag('r')) { min = 1, max = 3, permission = "denizen.npc.sit") @Requirements(selected = true, ownership = true) public void sitting(CommandContext args, CommandSender sender, NPC npc) throws CommandException { + BukkitImplDeprecations.npcSitCommand.warn(); if (npc.hasTrait(SneakingTrait.class)) { npc.getOrAddTrait(SneakingTrait.class).stand(); npc.removeTrait(SneakingTrait.class);