From 9325f13d21e466cd2d1fb9fa20987991a2297610 Mon Sep 17 00:00:00 2001 From: Brando! <63469489+BreadcrumbIsTaken@users.noreply.github.com> Date: Sat, 4 May 2024 23:50:38 -0700 Subject: [PATCH 001/280] Paper only `player changes framed ` event (#2615) * `player changes framed ` event * Slightly update meta * Use `frame` variable instead of getting it from `event`. * Make fields `public` and store `ItemTag` as a field as well. * Update field * Update `ElementTag` constructor and de-cache `item` for `getContext` * Fix typo --- .../denizen/paper/PaperModule.java | 3 + .../PlayerChangesFramedItemScriptEvent.java | 97 +++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerChangesFramedItemScriptEvent.java diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java index 2877526769..3d3045b8af 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java @@ -45,6 +45,9 @@ public static void init() { ScriptEvent.registerScriptEvent(ExperienceOrbMergeScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerAbsorbsExperienceScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerBeaconEffectScriptEvent.class); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_18)) { + ScriptEvent.registerScriptEvent(PlayerChangesFramedItemScriptEvent.class); + } ScriptEvent.registerScriptEvent(PlayerChoosesArrowScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerClicksFakeEntityScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerClicksInRecipeBookScriptEvent.class); diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerChangesFramedItemScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerChangesFramedItemScriptEvent.java new file mode 100644 index 0000000000..76745156e5 --- /dev/null +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerChangesFramedItemScriptEvent.java @@ -0,0 +1,97 @@ +package com.denizenscript.denizen.paper.events; + +import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.scripts.ScriptEntryData; +import io.papermc.paper.event.player.PlayerItemFrameChangeEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class PlayerChangesFramedItemScriptEvent extends BukkitScriptEvent implements Listener { + + // <--[event] + // @Events + // player changes framed + // + // @Location true + // + // @Plugin Paper + // + // @Group Paper + // + // @Cancellable true + // + // @Triggers when a player interacts with an item frame by adding, removing, or rotating the item held in it. + // + // @Switch frame: to only process the event if the item frame entity being matches the input. + // @Switch action: to only process the event if the change matches the input. + // + // @Context + // returns the EntityTag of the item frame. + // returns the ItemTag of the item held in the item frame. + // returns the ElementTag of the action being performed, based on <@link url https://jd.papermc.io/paper/1.20/io/papermc/paper/event/player/PlayerItemFrameChangeEvent.ItemFrameChangeAction.html> + // + // @Determine + // "ITEM:" to change the item held by the item frame. If there is an item already in the frame, it will be replaced. To remove the item, set it to air. + // + // @Player Always. + // --> + + public PlayerChangesFramedItemScriptEvent() { + registerCouldMatcher("player changes framed "); + registerSwitches("frame", "action"); + this.registerDetermination("item", ItemTag.class, (evt, context, item) -> { + evt.event.setItemStack(item.getItemStack()); + }); + } + + public ItemTag item; + public EntityTag frame; + public ElementTag action; + public PlayerItemFrameChangeEvent event; + + @Override + public boolean matches(ScriptPath path) { + if (!path.tryArgObject(3, item)) { + return false; + } + if (!path.tryObjectSwitch("frame", frame)) { + return false; + } + if (!path.tryObjectSwitch("action", action)) { + return false; + } + if (!runInCheck(path, frame.getLocation())) { + return false; + } + return super.matches(path); + } + + @Override + public ObjectTag getContext(String name) { + return switch (name) { + case "frame" -> frame; + case "item" -> new ItemTag(event.getItemStack()); + case "action" -> action; + default -> super.getContext(name); + }; + } + + @Override + public ScriptEntryData getScriptEntryData() { + return new BukkitScriptEntryData(event.getPlayer()); + } + + @EventHandler + public void onPlayerChangesFramedItem(PlayerItemFrameChangeEvent event) { + item = new ItemTag(event.getItemStack()); + frame = new EntityTag(event.getItemFrame()); + action = new ElementTag(event.getAction()); + this.event = event; + fire(event); + } +} From 4f24205c198fa1616fbbbc91f0699d6a9ae75cc1 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Sun, 5 May 2024 12:11:28 +0100 Subject: [PATCH 002/280] Initial 1.20.6 support (#2616) * 1.20.5 part 1: bump version numbers * 1.20.5 part 2: bulk update revision number * 1.20.5 part 3: initial changes to make it compile * Few minor fixes * Bump paper version * Account for `ItemFlag` naming change * Compile against 1.20.4 for old version support * Bump to 1.20.6 * Bump `TODO`s as well * Compact with older versions * Remove profile handling TODO --- README.md | 2 +- paper/pom.xml | 7 +- .../EntityEntersVehicleScriptEvent.java | 1 + .../entity/EntityExitsVehicleScriptEvent.java | 1 + .../player/PlayerFishesScriptEvent.java | 4 +- .../denizen/nms/abstracts/ParticleHelper.java | 8 +- .../denizen/nms/interfaces/ItemHelper.java | 2 - .../denizen/nms/interfaces/Particle.java | 1 + .../denizen/objects/MaterialTag.java | 1 + .../denizenscript/denizen/objects/NPCTag.java | 27 ++- .../objects/properties/PropertyRegistry.java | 8 +- .../entity/EntityAreaEffectCloud.java | 1 + .../properties/entity/EntityColor.java | 18 +- .../properties/entity/EntityFirework.java | 2 +- .../entity/EntityIsShowingBottom.java | 2 +- .../properties/entity/EntityPotion.java | 12 +- .../properties/entity/EntityPumpkinHead.java | 2 +- .../properties/entity/EntityStepHeight.java | 1 + .../properties/item/ItemBaseColor.java | 9 +- .../objects/properties/item/ItemHidden.java | 11 +- .../objects/properties/item/ItemPotion.java | 1 + .../containers/core/ItemScriptHelper.java | 12 +- .../entity/AreaEffectCloudHelper.java | 2 + .../denizen/utilities/entity/Gravity.java | 10 +- .../nms/v1_17/helpers/ItemHelperImpl.java | 11 -- .../nms/v1_18/helpers/ItemHelperImpl.java | 21 --- .../nms/v1_19/helpers/ItemHelperImpl.java | 21 --- v1_20/pom.xml | 14 +- .../denizen/nms/v1_20/Handler.java | 42 ++--- .../nms/v1_20/ReflectionMappingsInfo.java | 71 +++---- .../v1_20/helpers/AdvancementHelperImpl.java | 8 +- .../v1_20/helpers/AnimationHelperImpl.java | 6 +- .../nms/v1_20/helpers/BlockHelperImpl.java | 43 ++--- .../nms/v1_20/helpers/ChunkHelperImpl.java | 9 +- .../v1_20/helpers/CustomEntityHelperImpl.java | 4 +- .../v1_20/helpers/EnchantmentHelperImpl.java | 116 ++++++------ .../nms/v1_20/helpers/EntityHelperImpl.java | 47 ++--- .../nms/v1_20/helpers/FishingHelperImpl.java | 17 +- .../nms/v1_20/helpers/ItemHelperImpl.java | 174 +++++++----------- .../nms/v1_20/helpers/PacketHelperImpl.java | 18 +- .../nms/v1_20/helpers/PlayerHelperImpl.java | 14 +- .../nms/v1_20/helpers/WorldHelperImpl.java | 2 +- .../denizen/nms/v1_20/impl/BiomeNMSImpl.java | 6 +- .../v1_20/impl/ImprovedOfflinePlayerImpl.java | 11 +- .../nms/v1_20/impl/ProfileEditorImpl.java | 4 +- .../denizen/nms/v1_20/impl/SidebarImpl.java | 7 +- .../nms/v1_20/impl/blocks/BlockLightImpl.java | 6 +- .../impl/entities/CraftFakeArrowImpl.java | 7 +- .../impl/entities/CraftFakePlayerImpl.java | 4 +- .../entities/CraftItemProjectileImpl.java | 8 +- .../impl/entities/EntityFakeArrowImpl.java | 4 +- .../impl/entities/EntityFakePlayerImpl.java | 9 +- .../entities/EntityItemProjectileImpl.java | 10 +- .../handlers/AbstractListenerPlayInImpl.java | 27 +-- .../handlers/DenizenNetworkManagerImpl.java | 54 +++--- .../handlers/DenizenPacketListenerImpl.java | 6 +- .../network/handlers/FakeBlockHelper.java | 14 +- .../packet/ActionBarEventPacketHandlers.java | 5 +- .../handlers/packet/AttachPacketHandlers.java | 6 +- .../packet/DisguisePacketHandlers.java | 4 +- .../packet/FakeBlocksPacketHandlers.java | 2 +- .../packet/FakeEquipmentPacketHandlers.java | 3 +- .../packet/HideParticlesPacketHandlers.java | 2 +- .../network/packets/PacketOutChatImpl.java | 3 +- 64 files changed, 457 insertions(+), 528 deletions(-) diff --git a/README.md b/README.md index 3752da2ca9..cb5dbb6bc8 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ The Denizen Scripting Language - Spigot Impl An implementation of the Denizen Scripting Language for Spigot servers, with strong Citizens interlinks to emphasize the power of using Denizen with NPCs! -**Version 1.3.0**: Compatible with Spigot 1.17.1, 1.18.2, 1.19.4, and 1.20.4! +**Version 1.3.0**: Compatible with Spigot 1.17.1, 1.18.2, 1.19.4, and 1.20.6! **Learn about Denizen from the Beginner's guide:** https://guide.denizenscript.com/guides/background/index.html diff --git a/paper/pom.xml b/paper/pom.xml index 4c0f10bb56..553c3bd5f0 100644 --- a/paper/pom.xml +++ b/paper/pom.xml @@ -13,6 +13,11 @@ papermc https://repo.papermc.io/repository/maven-public/ + + + sonatype-oss-snapshots1 + https://s01.oss.sonatype.org/content/repositories/snapshots/ + @@ -25,7 +30,7 @@ io.papermc.paper paper-api - 1.20.4-R0.1-SNAPSHOT + 1.20.6-R0.1-SNAPSHOT provided diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityEntersVehicleScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityEntersVehicleScriptEvent.java index 7e45b125c4..c70a6db86a 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityEntersVehicleScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityEntersVehicleScriptEvent.java @@ -43,6 +43,7 @@ public EntityEntersVehicleScriptEvent() { public EntityTag vehicle; public EntityTag entity; + // TODO: 1.20.6: EntityMountEvent changed packages, might need to register in version-specific modules? or reflection? public EntityMountEvent event; public static HashSet notRelevantEnterables = new HashSet<>(Arrays.asList("notable", "cuboid", "biome", "bed", "portal")); diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExitsVehicleScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExitsVehicleScriptEvent.java index 0670d78769..77ea1c478e 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExitsVehicleScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExitsVehicleScriptEvent.java @@ -40,6 +40,7 @@ public EntityExitsVehicleScriptEvent() { public EntityTag vehicle; public EntityTag entity; + // TODO: 1.20.6: EntityDismountEvent changed packages, might need to register in version-specific modules? or reflection? public EntityDismountEvent event; @Override diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerFishesScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerFishesScriptEvent.java index 7f490ae972..88facf69d5 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerFishesScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerFishesScriptEvent.java @@ -109,8 +109,8 @@ public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) { String determinationLower = CoreUtilities.toLowerCase(determination); if (determinationLower.startsWith("caught:")) { item = ItemTag.valueOf(determination.substring("caught:".length()), getTagContext(path)); - if (entity != null && entity.getBukkitEntityType() == EntityType.DROPPED_ITEM) { - ((Item) entity.getBukkitEntity()).setItemStack(item.getItemStack()); + if (entity != null && entity.getBukkitEntity() instanceof Item item) { + item.setItemStack(item.getItemStack()); return true; } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/abstracts/ParticleHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/abstracts/ParticleHelper.java index 771096065d..2c3b9888c6 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/abstracts/ParticleHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/abstracts/ParticleHelper.java @@ -1,5 +1,7 @@ package com.denizenscript.denizen.nms.abstracts; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.nms.interfaces.Particle; import java.util.ArrayList; @@ -13,6 +15,7 @@ public ParticleHelper() { for (org.bukkit.Particle particle : org.bukkit.Particle.values()) { register(particle.name(), new Particle(particle)); } + // TODO: 1.20.6: enum names are different now, can change to valueOf and let Spigot's runtime updating handle it register("SMOKE", new Particle(org.bukkit.Particle.SMOKE_NORMAL)); register("HUGE_EXPLOSION", new Particle(org.bukkit.Particle.EXPLOSION_HUGE)); register("LARGE_EXPLODE", new Particle(org.bukkit.Particle.EXPLOSION_LARGE)); @@ -22,7 +25,10 @@ public ParticleHelper() { register("CRIT", new Particle(org.bukkit.Particle.CRIT)); register("MAGIC_CRIT", new Particle(org.bukkit.Particle.CRIT_MAGIC)); register("MOB_SPELL", new Particle(org.bukkit.Particle.SPELL_MOB)); - register("MOB_SPELL_AMBIENT", new Particle(org.bukkit.Particle.SPELL_MOB_AMBIENT)); + // TODO: 1.20.6: this particle type was removed in favor of entity_effect now having a color option + if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_19)) { + register("MOB_SPELL_AMBIENT", new Particle(org.bukkit.Particle.SPELL_MOB_AMBIENT)); + } register("INSTANT_SPELL", new Particle(org.bukkit.Particle.SPELL_INSTANT)); register("WITCH_MAGIC", new Particle(org.bukkit.Particle.SPELL_WITCH)); register("STEP_SOUND", new Particle(org.bukkit.Particle.HEART)); diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java index 48f7d59ace..a8ff7f7bf9 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java @@ -25,8 +25,6 @@ public abstract class ItemHelper { public abstract Integer burnTime(Material material); - public abstract void clearDenizenRecipes(); - public abstract void registerStonecuttingRecipe(String keyName, String group, ItemStack result, ItemStack[] ingredient, boolean exact); public abstract void registerFurnaceRecipe(String keyName, String group, ItemStack result, ItemStack[] ingredient, float exp, int time, String type, boolean exact, String category); diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/Particle.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/Particle.java index e4bf1e3133..614e0cd10e 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/Particle.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/Particle.java @@ -17,6 +17,7 @@ public void playFor(Player player, Location location, int count, Vector offs } public boolean isVisible() { + // TODO: 1.20.6: enum names are different now, can change to valueOf and let Spigot's runtime updating handle it return particle != org.bukkit.Particle.SUSPENDED && particle != org.bukkit.Particle.SUSPENDED_DEPTH && particle != org.bukkit.Particle.WATER_BUBBLE; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/MaterialTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/MaterialTag.java index ab4fe02063..bf3503db0d 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/MaterialTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/MaterialTag.java @@ -721,6 +721,7 @@ public void adjust(Mechanism mechanism) { NMSHandler.blockHelper.setVanillaTags(material, tags); } + // TODO: 1.20.6: need an ItemTag variant providing the proper functionality, and then deprecate this // <--[mechanism] // @object MaterialTag // @name max_stack_size 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 1504f12179..7e1d1beae6 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/NPCTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/NPCTag.java @@ -1731,20 +1731,19 @@ public void adjust(Mechanism mechanism) { if (mechanism.matches("item_type") && mechanism.requireObject(ItemTag.class)) { ItemTag item = mechanism.valueAsType(ItemTag.class); Material mat = item.getMaterial().getMaterial(); - switch (getEntity().getType()) { - case DROPPED_ITEM: - ((org.bukkit.entity.Item) getEntity()).getItemStack().setType(mat); - break; - case ITEM_FRAME: - ((ItemFrame) getEntity()).getItem().setType(mat); - break; - case FALLING_BLOCK: - getCitizen().data().setPersistent(NPC.Metadata.ITEM_ID, mat.name()); - getCitizen().data().setPersistent(NPC.Metadata.ITEM_DATA, 0); - break; - default: - Debug.echoError("NPC is the not an item type!"); - break; + Entity npcEntity = getEntity(); + if (npcEntity instanceof Item droppedItem) { + droppedItem.getItemStack().setType(mat); + } + else if (npcEntity instanceof ItemFrame itemFrame) { + itemFrame.getItem().setType(mat); + } + else if (npcEntity instanceof FallingBlock) { + getCitizen().data().setPersistent(NPC.Metadata.ITEM_ID, mat.name()); + getCitizen().data().setPersistent(NPC.Metadata.ITEM_DATA, 0); + } + else { + Debug.echoError("NPC is the not an item type!"); } if (getCitizen().isSpawned()) { getCitizen().despawn(); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java index 9450b3421d..5a729130b7 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java @@ -33,7 +33,9 @@ public static void registerMainProperties() { PropertyParser.registerProperty(EntityAI.class, EntityTag.class); PropertyParser.registerProperty(EntityAnger.class, EntityTag.class); PropertyParser.registerProperty(EntityAngry.class, EntityTag.class); - PropertyParser.registerProperty(EntityAreaEffectCloud.class, EntityTag.class); + if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_19)) { + PropertyParser.registerProperty(EntityAreaEffectCloud.class, EntityTag.class); + } PropertyParser.registerProperty(EntityArmorBonus.class, EntityTag.class); PropertyParser.registerProperty(EntityArrowDamage.class, EntityTag.class); PropertyParser.registerProperty(EntityArrowPierceLevel.class, EntityTag.class); @@ -228,7 +230,9 @@ public static void registerMainProperties() { PropertyParser.registerProperty(ItemMap.class, ItemTag.class); PropertyParser.registerProperty(ItemNBT.class, ItemTag.class); PropertyParser.registerProperty(ItemPatterns.class, ItemTag.class); - PropertyParser.registerProperty(ItemPotion.class, ItemTag.class); + if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_19)) { + PropertyParser.registerProperty(ItemPotion.class, ItemTag.class); + } PropertyParser.registerProperty(ItemQuantity.class, ItemTag.class); PropertyParser.registerProperty(ItemRawNBT.class, ItemTag.class); PropertyParser.registerProperty(ItemRepairCost.class, ItemTag.class); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAreaEffectCloud.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAreaEffectCloud.java index a552c10243..b3e1e310db 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAreaEffectCloud.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAreaEffectCloud.java @@ -20,6 +20,7 @@ import java.util.List; +// TODO: 1.20.6: PotionData API public class EntityAreaEffectCloud implements Property { public static boolean describes(ObjectTag entity) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityColor.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityColor.java index 9419892999..048c7695c7 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityColor.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityColor.java @@ -11,7 +11,10 @@ import com.denizenscript.denizencore.objects.core.ListTag; import com.denizenscript.denizencore.objects.properties.PropertyParser; import com.denizenscript.denizencore.utilities.CoreUtilities; +import org.bukkit.Color; import org.bukkit.DyeColor; +import org.bukkit.NamespacedKey; +import org.bukkit.Registry; import org.bukkit.entity.*; import java.util.Arrays; @@ -27,6 +30,9 @@ public class EntityColor extends EntityProperty { // For the available color options, refer to <@link language Entity Color Types>. // --> + // TODO once 1.20 is the minimum supported version, can reference the enum directly + public static final EntityType MOOSHROOM_ENTITY_TYPE = Registry.ENTITY_TYPE.get(NamespacedKey.minecraft("mooshroom")); + public static boolean describes(EntityTag entity) { EntityType type = entity.getBukkitEntityType(); return type == EntityType.SHEEP || @@ -37,7 +43,7 @@ public static boolean describes(EntityTag entity) { type == EntityType.LLAMA || type == EntityType.PARROT || type == EntityType.SHULKER || - type == EntityType.MUSHROOM_COW || + type == MOOSHROOM_ENTITY_TYPE || type == EntityType.CAT || type == EntityType.FOX || type == EntityType.PANDA || @@ -106,7 +112,7 @@ else if (type == EntityType.PARROT && mechanism.requireEnum(Parrot.Variant.class else if (type == EntityType.SHULKER && mechanism.requireEnum(DyeColor.class)) { as(Shulker.class).setColor(color.asEnum(DyeColor.class)); } - else if (type == EntityType.MUSHROOM_COW && mechanism.requireEnum(MushroomCow.Variant.class)) { + else if (type == MOOSHROOM_ENTITY_TYPE && mechanism.requireEnum(MushroomCow.Variant.class)) { as(MushroomCow.class).setVariant(color.asEnum(MushroomCow.Variant.class)); } else if (type == EntityType.TROPICAL_FISH && mechanism.requireObject(ListTag.class)) { @@ -206,6 +212,9 @@ public String getColor(boolean includeDeprecated) { if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19) && MultiVersionHelper1_19.colorIsApplicable(type)) { return MultiVersionHelper1_19.getColor(getEntity()); } + if (getEntity() instanceof MushroomCow mushroomCow) { + return mushroomCow.getVariant().name(); + } return switch (type) { case HORSE -> { Horse horse = as(Horse.class); @@ -226,7 +235,6 @@ public String getColor(boolean includeDeprecated) { DyeColor color = as(Shulker.class).getColor(); yield color == null ? null : color.name(); } - case MUSHROOM_COW -> as(MushroomCow.class).getVariant().name(); case TROPICAL_FISH -> { TropicalFish fish = as(TropicalFish.class); yield new ListTag(Arrays.asList(fish.getPattern().name(), fish.getBodyColor().name(), fish.getPatternColor().name())).identify(); @@ -269,6 +277,9 @@ public ListTag getAllowedColors() { if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19) && MultiVersionHelper1_19.colorIsApplicable(type)) { return MultiVersionHelper1_19.getAllowedColors(type); } + if (type == MOOSHROOM_ENTITY_TYPE) { + return listForEnum(MushroomCow.Variant.values()); + } return switch (type) { case HORSE -> { ListTag horseColors = listForEnum(Horse.Color.values()); @@ -279,7 +290,6 @@ public ListTag getAllowedColors() { case RABBIT -> listForEnum(Rabbit.Type.values()); case LLAMA, TRADER_LLAMA -> listForEnum(Llama.Color.values()); case PARROT -> listForEnum(Parrot.Variant.values()); - case MUSHROOM_COW -> listForEnum(MushroomCow.Variant.values()); case TROPICAL_FISH -> { ListTag patterns = listForEnum(TropicalFish.Pattern.values()); patterns.addAll(listForEnum(DyeColor.values())); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityFirework.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityFirework.java index 5685b25928..6925a0d546 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityFirework.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityFirework.java @@ -15,7 +15,7 @@ public class EntityFirework implements Property { public static boolean describes(ObjectTag entity) { - return entity instanceof EntityTag && ((EntityTag) entity).getBukkitEntityType() == EntityType.FIREWORK; + return entity instanceof EntityTag entityTag && entityTag.getBukkitEntity() instanceof Firework; } public static EntityFirework getFrom(ObjectTag entity) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityIsShowingBottom.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityIsShowingBottom.java index 021e0865cf..f4f4297fb5 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityIsShowingBottom.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityIsShowingBottom.java @@ -12,7 +12,7 @@ public class EntityIsShowingBottom implements Property { public static boolean describes(ObjectTag entity) { - return entity instanceof EntityTag && ((EntityTag) entity).getBukkitEntityType() == EntityType.ENDER_CRYSTAL; + return entity instanceof EntityTag entityTag && entityTag.getBukkitEntity() instanceof EnderCrystal; } public static EntityIsShowingBottom getFrom(ObjectTag entity) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotion.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotion.java index 059b3b08bb..39b3fed330 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotion.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotion.java @@ -1,5 +1,7 @@ package com.denizenscript.denizen.objects.properties.entity; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizencore.objects.Mechanism; @@ -52,7 +54,10 @@ public ItemStack getPotion() { else { // Tipped arrow ItemStack refItem = new ItemStack(Material.POTION); PotionMeta meta = (PotionMeta) refItem.getItemMeta(); - meta.setBasePotionData(((Arrow) entity.getBukkitEntity()).getBasePotionData()); + // TODO: 1.20.6: PotionData API + if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_19)) { + meta.setBasePotionData(((Arrow) entity.getBukkitEntity()).getBasePotionData()); + } refItem.setItemMeta(meta); return refItem; } @@ -63,7 +68,10 @@ public void setPotion(ItemStack item) { ((ThrownPotion) entity.getBukkitEntity()).setItem(item); } else { // Tipped arrow - ((Arrow) entity.getBukkitEntity()).setBasePotionData(((PotionMeta) item.getItemMeta()).getBasePotionData()); + // TODO: 1.20.6: PotionData API + if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_19)) { + ((Arrow) entity.getBukkitEntity()).setBasePotionData(((PotionMeta) item.getItemMeta()).getBasePotionData()); + } } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPumpkinHead.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPumpkinHead.java index 9327880620..4e0fcfabe6 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPumpkinHead.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPumpkinHead.java @@ -12,7 +12,7 @@ public class EntityPumpkinHead implements Property { public static boolean describes(ObjectTag entity) { - return entity instanceof EntityTag && ((EntityTag) entity).getBukkitEntityType() == EntityType.SNOWMAN; + return entity instanceof EntityTag entityTag && entityTag.getBukkitEntity() instanceof Snowman; } public static EntityPumpkinHead getFrom(ObjectTag entity) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityStepHeight.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityStepHeight.java index 0b340bc436..6e5490cb29 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityStepHeight.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityStepHeight.java @@ -7,6 +7,7 @@ public class EntityStepHeight extends EntityProperty { + // TODO: 1.20.6: this can be controlled by an attribute now, can deprecate in favor of that & backsupport // <--[property] // @object EntityTag // @name step_height diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemBaseColor.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemBaseColor.java index 24bce734c7..a8a3b824fb 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemBaseColor.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemBaseColor.java @@ -1,5 +1,7 @@ package com.denizenscript.denizen.objects.properties.item; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.core.ElementTag; @@ -59,9 +61,11 @@ public DyeColor getBaseColor() { } return color; } - else { + else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { + // TODO: 1.20.6: Banner color has been part of the item type for a while, and Spigot removed this API return ((BannerMeta) itemMeta).getBaseColor(); } + return null; } public void setBaseColor(DyeColor color, TagContext context) { @@ -79,7 +83,8 @@ public void setBaseColor(DyeColor color, TagContext context) { banner.update(); ((BlockStateMeta) itemMeta).setBlockState(banner); } - else { + else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { + // TODO: 1.20.6: Banner color has been part of the item type for a while, and Spigot removed this API ((BannerMeta) itemMeta).setBaseColor(color); } setItemMeta(itemMeta); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemHidden.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemHidden.java index 857965c38e..efb8eb9324 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemHidden.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemHidden.java @@ -1,18 +1,21 @@ package com.denizenscript.denizen.objects.properties.item; import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizen.utilities.BukkitImplDeprecations; import com.denizenscript.denizencore.objects.Mechanism; -import com.denizenscript.denizencore.objects.core.ListTag; import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ListTag; import com.denizenscript.denizencore.objects.properties.Property; import com.denizenscript.denizencore.tags.Attribute; -import com.denizenscript.denizen.utilities.BukkitImplDeprecations; import org.bukkit.Material; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.meta.ItemMeta; public class ItemHidden implements Property { + // TODO once 1.20 is the minimum supported version, can directly reference the enum + public static final ItemFlag HIDE_ITEM_DATA_FLAG = ItemFlag.valueOf("HIDE_POTION_EFFECTS"); + public static boolean describes(ObjectTag item) { // All items can have hides return item instanceof ItemTag && ((ItemTag) item).getBukkitMaterial() != Material.AIR; @@ -54,7 +57,7 @@ public ListTag hides() { return output; } for (ItemFlag flag : item.getItemMeta().getItemFlags()) { - if (flag == ItemFlag.HIDE_POTION_EFFECTS) { + if (flag == HIDE_ITEM_DATA_FLAG) { output.add("ITEM_DATA"); } else { @@ -144,7 +147,7 @@ public void adjust(Mechanism mechanism) { meta.addItemFlags(ItemFlag.values()); } else if (str.equals("HIDE_ITEM_DATA")) { - meta.addItemFlags(ItemFlag.HIDE_POTION_EFFECTS); + meta.addItemFlags(HIDE_ITEM_DATA_FLAG); } else { meta.addItemFlags(ItemFlag.valueOf(str)); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemPotion.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemPotion.java index dc30a7404b..93bbed2f03 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemPotion.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemPotion.java @@ -26,6 +26,7 @@ import java.util.ArrayList; import java.util.List; +// TODO: 1.20.6: Spigot removed the PotionData API, can either remove relevant features on 1.20.6, or try and backsupport somehow (probably either hard-coding our own data or hacking it based on the name) public class ItemPotion extends ItemProperty { public static boolean describes(ItemTag item) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptHelper.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptHelper.java index 9c9860f247..112039e0e4 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptHelper.java @@ -25,10 +25,7 @@ import com.denizenscript.denizencore.utilities.YamlConfiguration; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.denizenscript.denizencore.utilities.text.StringHolder; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.NamespacedKey; +import org.bukkit.*; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; @@ -59,7 +56,12 @@ public static void removeDenizenRecipes() { smithingRetain.clear(); recipeCache.clear(); recipeIdToItemScript.clear(); - NMSHandler.itemHelper.clearDenizenRecipes(); + Iterator recipeIterator = Bukkit.recipeIterator(); + while (recipeIterator.hasNext()) { + if (recipeIterator.next() instanceof Keyed keyed && keyed.getKey().equals("denizen")) { + recipeIterator.remove(); + } + } PaperAPITools.instance.clearBrewingRecipes(); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/AreaEffectCloudHelper.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/AreaEffectCloudHelper.java index 8925a76881..0ee9f1855a 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/AreaEffectCloudHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/AreaEffectCloudHelper.java @@ -12,6 +12,7 @@ import java.util.List; +// TODO: 1.20.6: PotionData API public class AreaEffectCloudHelper { private AreaEffectCloud entity; @@ -23,6 +24,7 @@ public AreaEffectCloudHelper(Entity entity) { // Base Potion Data ///////// + // TODO: 1.20.6: PotionData API private PotionData getBPData() { return entity.getBasePotionData(); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/Gravity.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/Gravity.java index b5d57cb66c..525385f7e8 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/Gravity.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/Gravity.java @@ -1,17 +1,23 @@ package com.denizenscript.denizen.utilities.entity; +import org.bukkit.NamespacedKey; +import org.bukkit.Registry; import org.bukkit.entity.EntityType; public class Gravity { + // TODO once 1.20 is the minimum supported version can reference the enum directly + public static final EntityType EXPERIENCE_BOTTLE_ENTITY_TYPE = Registry.ENTITY_TYPE.get(NamespacedKey.minecraft("experience_bottle")); + public static double getGravity(EntityType entityType) { + if (entityType == EXPERIENCE_BOTTLE_ENTITY_TYPE) { + return 0.157; + } switch (entityType) { case ARROW: return 0.118; case SNOWBALL: return 0.076; - case THROWN_EXP_BOTTLE: - return 0.157; case EGG: return 0.074; default: diff --git a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/ItemHelperImpl.java b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/ItemHelperImpl.java index 0434b14704..dafb21d7d2 100644 --- a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/ItemHelperImpl.java +++ b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/ItemHelperImpl.java @@ -83,17 +83,6 @@ public Integer burnTime(Material material) { return AbstractFurnaceBlockEntity.getFuel().get(CraftMagicNumbers.getItem(material)); } - @Override - public void clearDenizenRecipes() { - for (Object2ObjectLinkedOpenHashMap> recipeMap : ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager().recipes.values()) { - for (ResourceLocation key : new ArrayList<>(recipeMap.keySet())) { - if (key.getNamespace().equalsIgnoreCase("denizen")) { - recipeMap.remove(key); - } - } - } - } - @Override public void setShapedRecipeIngredient(ShapedRecipe recipe, char c, ItemStack[] item, boolean exact) { if (item.length == 1 && item[0].getType() == Material.AIR) { diff --git a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/ItemHelperImpl.java b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/ItemHelperImpl.java index 1879feaa25..0e6075d5d1 100644 --- a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/ItemHelperImpl.java +++ b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/ItemHelperImpl.java @@ -89,27 +89,6 @@ public Integer burnTime(Material material) { public static Field RECIPE_MANAGER_BY_NAME = ReflectionHelper.getFields(RecipeManager.class).get(ReflectionMappingsInfo.RecipeManager_byName, Map.class); - @Override - public void clearDenizenRecipes() { - RecipeManager recipeManager = ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager(); - Map> byName; - try { - byName = (Map) RECIPE_MANAGER_BY_NAME.get(recipeManager); - } - catch (Throwable ex) { - Debug.echoError(ex); - return; - } - for (Object2ObjectLinkedOpenHashMap> recipeMap : recipeManager.recipes.values()) { - for (ResourceLocation key : new ArrayList<>(recipeMap.keySet())) { - if (key.getNamespace().equalsIgnoreCase("denizen")) { - recipeMap.remove(key); - byName.remove(key); - } - } - } - } - @Override public void setShapedRecipeIngredient(ShapedRecipe recipe, char c, ItemStack[] item, boolean exact) { if (item.length == 1 && item[0].getType() == Material.AIR) { diff --git a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/ItemHelperImpl.java b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/ItemHelperImpl.java index ecbed40561..9d10fe9153 100644 --- a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/ItemHelperImpl.java +++ b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/ItemHelperImpl.java @@ -90,27 +90,6 @@ public Integer burnTime(Material material) { public static Field RECIPE_MANAGER_BY_NAME = ReflectionHelper.getFields(RecipeManager.class).get(ReflectionMappingsInfo.RecipeManager_byName, Map.class); - @Override - public void clearDenizenRecipes() { - RecipeManager recipeManager = ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager(); - Map> byName; - try { - byName = (Map) RECIPE_MANAGER_BY_NAME.get(recipeManager); - } - catch (Throwable ex) { - Debug.echoError(ex); - return; - } - for (Object2ObjectLinkedOpenHashMap> recipeMap : recipeManager.recipes.values()) { - for (ResourceLocation key : new ArrayList<>(recipeMap.keySet())) { - if (key.getNamespace().equalsIgnoreCase("denizen")) { - recipeMap.remove(key); - byName.remove(key); - } - } - } - } - @Override public void setShapedRecipeIngredient(ShapedRecipe recipe, char c, ItemStack[] item, boolean exact) { if (item.length == 1 && item[0].getType() == Material.AIR) { diff --git a/v1_20/pom.xml b/v1_20/pom.xml index 3fb3c4bd2d..61654c87cf 100644 --- a/v1_20/pom.xml +++ b/v1_20/pom.xml @@ -19,13 +19,13 @@ org.spigotmc spigot-api - 1.20.4-R0.1-SNAPSHOT + 1.20.6-R0.1-SNAPSHOT provided org.spigotmc spigot - 1.20.4-R0.1-SNAPSHOT + 1.20.6-R0.1-SNAPSHOT remapped-mojang provided @@ -36,7 +36,7 @@ net.md-5 specialsource-maven-plugin - 1.2.5 + 2.0.2 package @@ -45,9 +45,9 @@ remap-obf - org.spigotmc:minecraft-server:1.20.4-R0.1-SNAPSHOT:txt:maps-mojang + org.spigotmc:minecraft-server:1.20.6-R0.1-SNAPSHOT:txt:maps-mojang true - org.spigotmc:spigot:1.20.4-R0.1-SNAPSHOT:jar:remapped-mojang + org.spigotmc:spigot:1.20.6-R0.1-SNAPSHOT:jar:remapped-mojang true remapped-obf @@ -60,8 +60,8 @@ remap-spigot ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar - org.spigotmc:minecraft-server:1.20.4-R0.1-SNAPSHOT:csrg:maps-spigot - org.spigotmc:spigot:1.20.4-R0.1-SNAPSHOT:jar:remapped-obf + org.spigotmc:minecraft-server:1.20.6-R0.1-SNAPSHOT:csrg:maps-spigot + org.spigotmc:spigot:1.20.6-R0.1-SNAPSHOT:jar:remapped-obf diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java index a81989c566..b6dc825435 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java @@ -65,19 +65,20 @@ import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.boss.BossBar; -import org.bukkit.craftbukkit.v1_20_R3.CraftServer; -import org.bukkit.craftbukkit.v1_20_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R3.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_20_R3.boss.CraftBossBar; -import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftInventory; -import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftInventoryCustom; -import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftInventoryView; -import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_20_R3.persistence.CraftPersistentDataContainer; -import org.bukkit.craftbukkit.v1_20_R3.util.CraftChatMessage; -import org.bukkit.craftbukkit.v1_20_R3.util.CraftLocation; -import org.bukkit.craftbukkit.v1_20_R3.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_20_R4.CraftRegistry; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_20_R4.boss.CraftBossBar; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftInventory; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftInventoryCustom; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftInventoryView; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R4.persistence.CraftPersistentDataContainer; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftChatMessage; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftLocation; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftMagicNumbers; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; @@ -147,7 +148,7 @@ public void undisableAsyncCatcher() { @Override public boolean isCorrectMappingsCode() { - return ((CraftMagicNumbers) CraftMagicNumbers.INSTANCE).getMappingsVersion().equals("60a2bb6bf2684dc61c56b90d7c41bddc"); + return ((CraftMagicNumbers) CraftMagicNumbers.INSTANCE).getMappingsVersion().equals("ee13f98a43b9c5abffdcc0bb24154460"); } @Override @@ -356,8 +357,9 @@ else if (contentObject instanceof Item) { if (item.getTag() != null && item.getTag().getNbt() != null) { tag.put("tag", TagParser.parseTag(item.getTag().getNbt())); } - ItemStack itemStack = ItemStack.of(tag); - return new ItemTag(CraftItemStack.asBukkitCopy(itemStack)).identify(); + // TODO: 1.20.6: use components and fallback to creating item from tag when custom NBT is specified + ItemStack nmsStack = ItemStack.parseOptional(CraftRegistry.getMinecraftRegistry(), tag); + return new ItemTag(CraftItemStack.asBukkitCopy(nmsStack)).identify(); } catch (Throwable ex) { Debug.echoError(ex); @@ -424,15 +426,13 @@ public static BaseComponent[] componentToSpigot(Component nms) { if (nms == null) { return null; } - String json = Component.Serializer.toJson(nms); - return ComponentSerializer.parse(json); + return ComponentSerializer.parse(CraftChatMessage.toJSON(nms)); } - public static MutableComponent componentToNMS(BaseComponent[] spigot) { + public static Component componentToNMS(BaseComponent[] spigot) { if (spigot == null) { return null; } - String json = FormattedTextHelper.componentToJson(spigot); - return Component.Serializer.fromJson(json); + return CraftChatMessage.fromJSONOrNull(FormattedTextHelper.componentToJson(spigot)); } } diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/ReflectionMappingsInfo.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/ReflectionMappingsInfo.java index b014845556..450cca2cd5 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/ReflectionMappingsInfo.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/ReflectionMappingsInfo.java @@ -12,34 +12,34 @@ public class ReflectionMappingsInfo { public static String MappedRegistry_unregisteredIntrusiveHolders = "m"; // net.minecraft.world.item.crafting.RecipeManager - public static String RecipeManager_byName = "d"; + public static String RecipeManager_byName = "e"; // net.minecraft.world.entity.Entity - public static String Entity_onGround = "aJ"; - public static String Entity_DATA_SHARED_FLAGS_ID = "ao"; - public static String Entity_DATA_CUSTOM_NAME = "aU"; - public static String Entity_DATA_CUSTOM_NAME_VISIBLE = "aV"; + public static String Entity_onGround = "aI"; + public static String Entity_DATA_SHARED_FLAGS_ID = "ap"; + public static String Entity_DATA_CUSTOM_NAME = "aS"; + public static String Entity_DATA_CUSTOM_NAME_VISIBLE = "aT"; // net.minecraft.world.entity.LivingEntity - public static String LivingEntity_attackStrengthTicker = "aP"; - public static String LivingEntity_autoSpinAttackTicks = "by"; + public static String LivingEntity_attackStrengthTicker = "aT"; + public static String LivingEntity_autoSpinAttackTicks = "bC"; public static String LivingEntity_setLivingEntityFlag_method = "c"; // net.minecraft.world.entity.player.Player public static String Player_DATA_PLAYER_ABSORPTION_ID = "d"; - public static String Player_DATA_PLAYER_MODE_CUSTOMISATION = "bM"; + public static String Player_DATA_PLAYER_MODE_CUSTOMISATION = "bV"; // net.minecraft.server.level.ServerPlayer - public static String ServerPlayer_respawnForced = "cW"; + public static String ServerPlayer_respawnForced = "dl"; // net.minecraft.world.entity.monster.EnderMan - public static String EnderMan_DATA_CREEPY = "bV"; + public static String EnderMan_DATA_CREEPY = "ca"; // net.minecraft.world.entity.monster.Zombie - public static String Zombie_inWaterTime = "cd"; + public static String Zombie_inWaterTime = "ci"; // net.minecraft.world.item.Item - public static String Item_maxStackSize = "d"; + public static String Item_components = "c"; // net.minecraft.world.level.Level public static String Level_isClientSide = "B"; @@ -54,7 +54,7 @@ public class ReflectionMappingsInfo { public static String ExperienceOrb_age = "g"; // net.minecraft.world.entity.item.ItemEntity - public static String ItemEntity_DATA_ITEM = "c"; + public static String ItemEntity_DATA_ITEM = "d"; // net.minecraft.world.level.biome.Biome public static String Biome_climateSettings = "i"; @@ -65,25 +65,26 @@ public class ReflectionMappingsInfo { public static String BiomeSpecialEffects_waterFogColor = "d"; // net.minecraft.network.Connection - public static String Connection_receiving = "l"; + public static String Connection_receiving = "k"; + public static String Connection_packetListener = "q"; // net.minecraft.server.network.ServerGamePacketListenerImpl - public static String ServerGamePacketListenerImpl_aboveGroundTickCount = "F"; - public static String ServerGamePacketListenerImpl_aboveGroundVehicleTickCount = "H"; - public static String ServerGamePacketListenerImpl_awaitingPositionFromClient = "B"; - public static String ServerGamePacketListenerImpl_awaitingTeleport = "C"; - public static String ServerGamePacketListenerImpl_chunkSender = "f"; + public static String ServerGamePacketListenerImpl_aboveGroundTickCount = "J"; + public static String ServerGamePacketListenerImpl_aboveGroundVehicleTickCount = "L"; + public static String ServerGamePacketListenerImpl_awaitingPositionFromClient = "F"; + public static String ServerGamePacketListenerImpl_awaitingTeleport = "G"; + public static String ServerGamePacketListenerImpl_chunkSender = "g"; // net.minecraft.server.network.ServerCommonPacketListenerImpl - public static String ServerCommonPacketListenerImpl_connection = "c"; + public static String ServerCommonPacketListenerImpl_connection = "e"; // net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket - public static String ClientboundPlayerAbilitiesPacket_walkingSpeed = "j"; + public static String ClientboundPlayerAbilitiesPacket_walkingSpeed = "k"; // net.minecraft.network.protocol.game.ClientboundSectionBlocksUpdatePacket - public static String ClientboundSectionBlocksUpdatePacket_sectionPos = "b"; - public static String ClientboundSectionBlocksUpdatePacket_positions = "c"; - public static String ClientboundSectionBlocksUpdatePacket_states = "d"; + public static String ClientboundSectionBlocksUpdatePacket_sectionPos = "c"; + public static String ClientboundSectionBlocksUpdatePacket_positions = "d"; + public static String ClientboundSectionBlocksUpdatePacket_states = "e"; // net.minecraft.network.protocol.game.ClientboundMoveEntityPacket public static String ClientboundMoveEntityPacket_xa = "b"; @@ -93,22 +94,22 @@ public class ReflectionMappingsInfo { public static String ClientboundMoveEntityPacket_xRot = "f"; // net.minecraft.network.protocol.game.ClientboundSetEntityMotionPacket - public static String ClientboundSetEntityMotionPacket_id = "a"; + public static String ClientboundSetEntityMotionPacket_id = "b"; // net.minecraft.network.protocol.game.ClientboundSetPassengersPacket - public static String ClientboundSetPassengersPacket_passengers = "b"; + public static String ClientboundSetPassengersPacket_passengers = "c"; // net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket - public static String ClientboundTeleportEntityPacket_id = "a"; - public static String ClientboundTeleportEntityPacket_x = "b"; - public static String ClientboundTeleportEntityPacket_y = "c"; - public static String ClientboundTeleportEntityPacket_z = "d"; - public static String ClientboundTeleportEntityPacket_yRot = "e"; - public static String ClientboundTeleportEntityPacket_xRot = "f"; + public static String ClientboundTeleportEntityPacket_id = "b"; + public static String ClientboundTeleportEntityPacket_x = "c"; + public static String ClientboundTeleportEntityPacket_y = "d"; + public static String ClientboundTeleportEntityPacket_z = "e"; + public static String ClientboundTeleportEntityPacket_yRot = "f"; + public static String ClientboundTeleportEntityPacket_xRot = "g"; // net.minecraft.network.protocol.game.ClientboundLevelChunkPacketData$BlockEntityInfo - public static String ClientboundLevelChunkPacketDataBlockEntityInfo_packedXZ = "a"; - public static String ClientboundLevelChunkPacketDataBlockEntityInfo_y = "b"; + public static String ClientboundLevelChunkPacketDataBlockEntityInfo_packedXZ = "c"; + public static String ClientboundLevelChunkPacketDataBlockEntityInfo_y = "d"; // net.minecraft.network.syncher.SynchedEntityData public static String SynchedEntityData_itemsById = "e"; @@ -128,5 +129,5 @@ public class ReflectionMappingsInfo { public static String HolderReference_bindTags_method = "a"; // net.minecraft.server.level.ServerLevel - public static String ServerLevel_sleepStatus = "O"; + public static String ServerLevel_sleepStatus = "P"; } diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AdvancementHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AdvancementHelperImpl.java index 373ce65bb2..3e0d4dd07f 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AdvancementHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AdvancementHelperImpl.java @@ -13,10 +13,10 @@ import net.minecraft.server.ServerAdvancementManager; import net.minecraft.server.level.ServerPlayer; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_20_R3.CraftServer; -import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_20_R3.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftNamespacedKey; import org.bukkit.entity.Player; import java.util.*; diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AnimationHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AnimationHelperImpl.java index 1248c4f3ce..e9abb1a1a3 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AnimationHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AnimationHelperImpl.java @@ -2,9 +2,9 @@ import com.denizenscript.denizen.nms.abstracts.AnimationHelper; import net.minecraft.world.entity.Entity; -import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_20_R3.entity.CraftHorse; -import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPolarBear; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftHorse; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPolarBear; import org.bukkit.entity.EntityType; import org.bukkit.entity.Horse; import org.bukkit.entity.IronGolem; diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java index 528029b1c1..496ab68789 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java @@ -26,13 +26,14 @@ import net.minecraft.util.InclusiveRange; import net.minecraft.util.random.SimpleWeightedRandomList; import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.component.ResolvableProfile; import net.minecraft.world.level.BaseSpawner; import net.minecraft.world.level.SpawnData; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.SpawnerBlockEntity; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.ChunkStatus; +import net.minecraft.world.level.chunk.status.ChunkStatus; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.PushReaction; import org.bukkit.Bukkit; @@ -43,18 +44,19 @@ import org.bukkit.block.BlockState; import org.bukkit.block.CreatureSpawner; import org.bukkit.block.Skull; -import org.bukkit.craftbukkit.v1_20_R3.CraftChunk; -import org.bukkit.craftbukkit.v1_20_R3.CraftServer; -import org.bukkit.craftbukkit.v1_20_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R3.block.CraftBlock; -import org.bukkit.craftbukkit.v1_20_R3.block.CraftBlockEntityState; -import org.bukkit.craftbukkit.v1_20_R3.block.CraftCreatureSpawner; -import org.bukkit.craftbukkit.v1_20_R3.block.CraftSkull; -import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_20_R3.tag.CraftBlockTag; -import org.bukkit.craftbukkit.v1_20_R3.util.CraftLocation; -import org.bukkit.craftbukkit.v1_20_R3.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_20_R4.CraftChunk; +import org.bukkit.craftbukkit.v1_20_R4.CraftRegistry; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.block.CraftBlock; +import org.bukkit.craftbukkit.v1_20_R4.block.CraftBlockEntityState; +import org.bukkit.craftbukkit.v1_20_R4.block.CraftCreatureSpawner; +import org.bukkit.craftbukkit.v1_20_R4.block.CraftSkull; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R4.tag.CraftBlockTag; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftLocation; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftMagicNumbers; import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; @@ -94,14 +96,13 @@ public static T getTE(CraftBlockEntityState cbs) { @Override public PlayerProfile getPlayerProfile(Skull skull) { - GameProfile profile = getTE(((CraftSkull) skull)).owner; + // TODO: 1.20.6: Seems to be a holder for data that can make the request to complete it later - do we want to do that here? + ResolvableProfile profile = getTE(((CraftSkull) skull)).owner; if (profile == null) { return null; } - String name = profile.getName(); - UUID id = profile.getId(); - com.mojang.authlib.properties.Property property = Iterables.getFirst(profile.getProperties().get("textures"), null); - return new PlayerProfile(name, id, property != null ? property.value() : null); + com.mojang.authlib.properties.Property property = Iterables.getFirst(profile.properties().get("textures"), null); + return new PlayerProfile(profile.name().orElse(null), profile.id().orElse(null), property != null ? property.value() : null); } @Override @@ -120,7 +121,7 @@ public void setPlayerProfile(Skull skull, PlayerProfile playerProfile) { public CompoundTag getNbtData(Block block) { BlockEntity te = ((CraftWorld) block.getWorld()).getHandle().getBlockEntity(new BlockPos(block.getX(), block.getY(), block.getZ()), true); if (te != null) { - net.minecraft.nbt.CompoundTag compound = te.saveWithFullMetadata(); + net.minecraft.nbt.CompoundTag compound = te.saveWithFullMetadata(CraftRegistry.getMinecraftRegistry()); return CompoundTagImpl.fromNMSTag(compound); } return null; @@ -135,7 +136,7 @@ public void setNbtData(Block block, CompoundTag ctag) { ctag = builder.build(); BlockPos blockPos = new BlockPos(block.getX(), block.getY(), block.getZ()); BlockEntity te = ((CraftWorld) block.getWorld()).getHandle().getBlockEntity(blockPos, true); - te.load(((CompoundTagImpl) ctag).toNMSTag()); + te.loadWithComponents(((CompoundTagImpl) ctag).toNMSTag(), CraftRegistry.getMinecraftRegistry()); } @Override @@ -259,7 +260,7 @@ public void setSpawnerCustomRules(CreatureSpawner spawner, int skyMin, int skyMa BaseSpawner nmsSpawner = nmsSnapshot.getSpawner(); SpawnData toSpawn = nmsSpawner.nextSpawnData; SpawnData.CustomSpawnRules rules = skyMin == -1 ? null : new SpawnData.CustomSpawnRules(new InclusiveRange<>(skyMin, skyMax), new InclusiveRange<>(blockMin, blockMax)); - nmsSpawner.nextSpawnData = new SpawnData(toSpawn.entityToSpawn(), Optional.ofNullable(rules)); + nmsSpawner.nextSpawnData = new SpawnData(toSpawn.entityToSpawn(), Optional.ofNullable(rules), toSpawn.equipment()); nmsSpawner.spawnPotentials = SimpleWeightedRandomList.empty(); } catch (Throwable ex) { diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ChunkHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ChunkHelperImpl.java index d38a0dd5db..be4c9174c5 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ChunkHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ChunkHelperImpl.java @@ -13,12 +13,15 @@ import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.chunk.*; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.LevelChunkSection; +import net.minecraft.world.level.chunk.PalettedContainer; +import net.minecraft.world.level.chunk.status.ChunkStatus; import net.minecraft.world.level.levelgen.Heightmap; import org.bukkit.World; import org.bukkit.Chunk; -import org.bukkit.craftbukkit.v1_20_R3.CraftChunk; -import org.bukkit.craftbukkit.v1_20_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.CraftChunk; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/CustomEntityHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/CustomEntityHelperImpl.java index 826bd8dfd2..34eb7509b7 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/CustomEntityHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/CustomEntityHelperImpl.java @@ -20,8 +20,8 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_20_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.scoreboard.Scoreboard; diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EnchantmentHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EnchantmentHelperImpl.java index c73011d541..d51abcde37 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EnchantmentHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EnchantmentHelperImpl.java @@ -16,17 +16,17 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.MobType; -import net.minecraft.world.item.enchantment.EnchantmentCategory; import org.bukkit.NamespacedKey; -import org.bukkit.craftbukkit.v1_20_R3.enchantments.CraftEnchantment; -import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_20_R3.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.v1_20_R4.enchantments.CraftEnchantment; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftNamespacedKey; import org.bukkit.enchantments.Enchantment; import org.bukkit.event.entity.EntityDamageEvent; +import net.minecraft.world.item.enchantment.Enchantment.EnchantmentDefinition; import java.lang.reflect.Field; import java.util.IdentityHashMap; @@ -49,44 +49,48 @@ public org.bukkit.enchantments.Enchantment registerFakeEnchantment(EnchantmentSc for (int i = 0; i < slots.length; i++) { slots[i] = EquipmentSlot.valueOf(CoreUtilities.toUpperCase(script.script.slots.get(i))); } - net.minecraft.world.item.enchantment.Enchantment nmsEnchant = new net.minecraft.world.item.enchantment.Enchantment(net.minecraft.world.item.enchantment.Enchantment.Rarity.valueOf(script.script.rarity), EnchantmentCategory.valueOf(script.script.category), slots) { - @Override - public int getMinLevel() { - return script.script.minLevel; - } - @Override - public int getMaxLevel() { - return script.script.maxLevel; - } - @Override - public int getMinCost(int level) { - return script.script.getMinCost(level); - } - @Override - public int getMaxCost(int level) { - return script.script.getMaxCost(level); - } + // TODO: 1.20.6: rarity is provided as an int, can make our own mirror enum; categories seemed to only over control #canEnchant(ItemStack), so can probably safely phase them out? + // net.minecraft.world.item.enchantment.Enchantment.Rarity.valueOf(script.script.rarity), EnchantmentCategory.valueOf(script.script.category), slots + net.minecraft.world.item.enchantment.Enchantment nmsEnchant = new net.minecraft.world.item.enchantment.Enchantment(null) { + // TODO: 1.20.6: methods are final now and the values are provided by EnchantmentDefinition - would probably need to create a new one on reload and modify the existing enchantment +// @Override +// public int getMinLevel() { +// return script.script.minLevel; +// } +// @Override +// public int getMaxLevel() { +// return script.script.maxLevel; +// } +// @Override +// public int getMinCost(int level) { +// return script.script.getMinCost(level); +// } +// @Override +// public int getMaxCost(int level) { +// return script.script.getMaxCost(level); +// } @Override public int getDamageProtection(int level, DamageSource src) { return script.script.getDamageProtection(level, src.getMsgId(), src.getEntity() == null ? null : src.getEntity().getBukkitEntity()); } - @Override - public float getDamageBonus(int level, MobType type) { - String typeName = "UNDEFINED"; - if (type == MobType.ARTHROPOD) { - typeName = "ARTHROPOD"; - } - else if (type == MobType.ILLAGER) { - typeName = "ILLAGER"; - } - else if (type == MobType.UNDEAD) { - typeName = "UNDEAD"; - } - else if (type == MobType.WATER) { - typeName = "WATER"; - } - return script.script.getDamageBonus(level, typeName); - } + // TODO: 1.20.6: Takes an EntityType now, and MobType seems to have been removed in favor of vanilla tags - can probably use these to backsupport & properly pass the entity type +// @Override +// public float getDamageBonus(int level, EntityType type) { +// String typeName = "UNDEFINED"; +// if (type == MobType.ARTHROPOD) { +// typeName = "ARTHROPOD"; +// } +// else if (type == MobType.ILLAGER) { +// typeName = "ILLAGER"; +// } +// else if (type == MobType.UNDEAD) { +// typeName = "UNDEAD"; +// } +// else if (type == MobType.WATER) { +// typeName = "WATER"; +// } +// return script.script.getDamageBonus(level, typeName); +// } @Override protected boolean checkCompatibility(net.minecraft.world.item.enchantment.Enchantment nmsEnchantment) { ResourceLocation nmsKey = BuiltInRegistries.ENCHANTMENT.getKey(nmsEnchantment); @@ -157,10 +161,11 @@ public String getName() { } } - @Override - public String getRarity(Enchantment enchantment) { - return ((CraftEnchantment) enchantment).getHandle().getRarity().name(); - } + // TODO: 1.20.6: rarity is just an int now (weight), can deprecate & backsupport by estimating it based on the weight +// @Override +// public String getRarity(Enchantment enchantment) { +// return ((CraftEnchantment) enchantment).getHandle().getRarity().name(); +// } @Override public boolean isDiscoverable(Enchantment enchantment) { @@ -192,17 +197,18 @@ public String getFullName(Enchantment enchantment, int level) { return FormattedTextHelper.stringify(Handler.componentToSpigot(((CraftEnchantment) enchantment).getHandle().getFullname(level))); } - @Override - public float getDamageBonus(Enchantment enchantment, int level, String type) { - MobType mobType = switch (type) { - case "illager" -> MobType.ILLAGER; - case "undead" -> MobType.UNDEAD; - case "water" -> MobType.WATER; - case "arthropod" -> MobType.ARTHROPOD; - default -> MobType.UNDEFINED; - }; - return ((CraftEnchantment) enchantment).getHandle().getDamageBonus(level, mobType); - } + // TODO: 1.20.6: MobType was removed in favor of using the entity type directly - deprecate + potentially backsupport with vanilla tags +// @Override +// public float getDamageBonus(Enchantment enchantment, int level, String type) { +// MobType mobType = switch (type) { +// case "illager" -> MobType.ILLAGER; +// case "undead" -> MobType.UNDEAD; +// case "water" -> MobType.WATER; +// case "arthropod" -> MobType.ARTHROPOD; +// default -> MobType.UNDEFINED; +// }; +// return ((CraftEnchantment) enchantment).getHandle().getDamageBonus(level, mobType); +// } @Override public int getDamageProtection(Enchantment enchantment, int level, EntityDamageEvent.DamageCause type, org.bukkit.entity.Entity attacker) { diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java index 5f530d5bcc..0822fa3036 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java @@ -39,7 +39,6 @@ import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.damagesource.DamageSources; import net.minecraft.world.entity.Mob; -import net.minecraft.world.entity.MobType; import net.minecraft.world.entity.MoverType; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.goal.Goal; @@ -66,14 +65,14 @@ import org.bukkit.attribute.AttributeInstance; import org.bukkit.block.CreatureSpawner; import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_20_R3.CraftServer; -import org.bukkit.craftbukkit.v1_20_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R3.block.CraftBlock; -import org.bukkit.craftbukkit.v1_20_R3.block.CraftCreatureSpawner; -import org.bukkit.craftbukkit.v1_20_R3.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_20_R3.entity.*; -import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_20_R3.util.CraftLocation; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.block.CraftBlock; +import org.bukkit.craftbukkit.v1_20_R4.block.CraftCreatureSpawner; +import org.bukkit.craftbukkit.v1_20_R4.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_20_R4.entity.*; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftLocation; import org.bukkit.entity.*; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.inventory.EquipmentSlot; @@ -110,20 +109,13 @@ public void setPose(Entity entity, Pose pose) { @Override public double getDamageTo(LivingEntity attacker, Entity target) { - MobType monsterType; - if (target instanceof LivingEntity) { - monsterType = ((CraftLivingEntity) target).getHandle().getMobType(); - } - else { - monsterType = MobType.UNDEFINED; - } double damage = 0; AttributeInstance attrib = attacker.getAttribute(Attribute.GENERIC_ATTACK_DAMAGE); if (attrib != null) { damage = attrib.getValue(); } if (attacker.getEquipment() != null) { - damage += EnchantmentHelper.getDamageBonus(CraftItemStack.asNMSCopy(attacker.getEquipment().getItemInMainHand()), monsterType); + damage += EnchantmentHelper.getDamageBonus(CraftItemStack.asNMSCopy(attacker.getEquipment().getItemInMainHand()), CraftEntityType.bukkitToMinecraft(target.getType())); } if (damage <= 0) { return 0; @@ -143,7 +135,7 @@ public double getDamageTo(LivingEntity attacker, Entity target) { if (!(nmsTarget instanceof net.minecraft.world.entity.LivingEntity livingTarget)) { return damage; } - damage = CombatRules.getDamageAfterAbsorb((float) damage, (float) livingTarget.getArmorValue(), (float) livingTarget.getAttributeValue(Attributes.ARMOR_TOUGHNESS)); + damage = CombatRules.getDamageAfterAbsorb((float) damage, source, (float) livingTarget.getArmorValue(), (float) livingTarget.getAttributeValue(Attributes.ARMOR_TOUGHNESS)); int enchantDamageModifier = EnchantmentHelper.getDamageProtection(livingTarget.getArmorSlots(), source); if (enchantDamageModifier > 0) { damage = CombatRules.getDamageAfterMagicAbsorb((float) damage, (float) enchantDamageModifier); @@ -170,8 +162,9 @@ public void setRiptide(Entity entity, boolean state) { @Override public void forceInteraction(Player player, Location location) { CraftPlayer craftPlayer = (CraftPlayer) player; - ((CraftBlock) location.getBlock()).getNMS().use(((CraftWorld) location.getWorld()).getHandle(), - craftPlayer != null ? craftPlayer.getHandle() : null, InteractionHand.MAIN_HAND, + // TODO: 1.20.6: passing a null player isn't valid (and seemingly never was) - need to require HumanEntity in the mechanism + ((CraftBlock) location.getBlock()).getNMS().useItemOn(craftPlayer.getHandle().getMainHandItem(), ((CraftWorld) location.getWorld()).getHandle(), + craftPlayer.getHandle(), InteractionHand.MAIN_HAND, new BlockHitResult(new Vec3(0, 0, 0), null, CraftLocation.toBlockPosition(location), false)); } @@ -519,7 +512,7 @@ public void fakeTeleport(Entity entity, Location location) { packetData.writeByte((byte)((int)(location.getYaw() * 256.0F / 360.0F))); packetData.writeByte((byte)((int)(location.getPitch() * 256.0F / 360.0F))); packetData.writeBoolean(entity.isOnGround()); - ClientboundTeleportEntityPacket packet = new ClientboundTeleportEntityPacket(packetData); + ClientboundTeleportEntityPacket packet = ClientboundTeleportEntityPacket.STREAM_CODEC.decode(packetData); for (Player player : getPlayersThatSee(entity)) { PacketHelperImpl.send(player, packet); } @@ -756,7 +749,7 @@ public void setUUID(Entity entity, UUID id) { nmsEntity.unsetRemoved(); nmsEntity.setUUID(id); if (nmsEntity instanceof ServerPlayer nmsPlayer) { - playerList.placeNewPlayer(DenizenNetworkManagerImpl.getConnection(nmsPlayer), nmsPlayer, new CommonListenerCookie(nmsPlayer.getGameProfile(), nmsPlayer.connection.latency(), nmsPlayer.clientInformation())); + playerList.placeNewPlayer(DenizenNetworkManagerImpl.getConnection(nmsPlayer), nmsPlayer, new CommonListenerCookie(nmsPlayer.getGameProfile(), nmsPlayer.connection.latency(), nmsPlayer.clientInformation(), nmsPlayer.connection.isTransferred())); } else { level.addFreshEntity(nmsEntity); @@ -767,16 +760,6 @@ public void setUUID(Entity entity, UUID id) { } } - @Override - public float getStepHeight(Entity entity) { - return ((CraftEntity) entity).getHandle().maxUpStep(); - } - - @Override - public void setStepHeight(Entity entity, float stepHeight) { - ((CraftEntity) entity).getHandle().setMaxUpStep(stepHeight); - } - public static final Field SynchedEntityData_itemsById = ReflectionHelper.getFields(SynchedEntityData.class).get(ReflectionMappingsInfo.SynchedEntityData_itemsById); public static Int2ObjectMap> getDataItems(Entity entity) { diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/FishingHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/FishingHelperImpl.java index c5c0a6406a..94a3c107c4 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/FishingHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/FishingHelperImpl.java @@ -5,6 +5,8 @@ import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.google.common.collect.Maps; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Mth; @@ -15,14 +17,15 @@ import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.storage.loot.BuiltInLootTables; import net.minecraft.world.level.storage.loot.LootParams; +import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.level.storage.loot.parameters.LootContextParam; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.phys.Vec3; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_20_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R3.entity.CraftFishHook; -import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftFishHook; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; import org.bukkit.entity.FishHook; import org.bukkit.entity.Player; import org.bukkit.event.entity.CreatureSpawnEvent; @@ -40,7 +43,7 @@ public org.bukkit.inventory.ItemStack getResult(FishHook fishHook, CatchType cat case DEFAULT -> { float f = ((CraftWorld) fishHook.getWorld()).getHandle().random.nextFloat(); int i = EnchantmentHelper.getMobLooting(nmsHook.getPlayerOwner()); - int j = EnchantmentHelper.getEnchantmentLevel(Enchantments.FISHING_LUCK, nmsHook.getPlayerOwner()); + int j = EnchantmentHelper.getEnchantmentLevel(Enchantments.LUCK_OF_THE_SEA, nmsHook.getPlayerOwner()); float f1 = 0.1F - (float) i * 0.025F - (float) j * 0.01F; float f2 = 0.05F + (float) i * 0.01F - (float) j * 0.01F; @@ -67,13 +70,13 @@ public org.bukkit.inventory.ItemStack getResult(FishHook fishHook, CatchType cat return result != null ? CraftItemStack.asBukkitCopy(result) : null; } - public ItemStack getRandomReward(FishingHook nmsHook, ResourceLocation key) { + public ItemStack getRandomReward(FishingHook nmsHook, ResourceKey key) { ServerLevel nmsWorld = (ServerLevel) nmsHook.level(); Map, Object> params = Maps.newIdentityHashMap(); params.put(LootContextParams.ORIGIN, new Vec3(nmsHook.getX(), nmsHook.getY(), nmsHook.getZ())); params.put(LootContextParams.TOOL, new ItemStack(Items.FISHING_ROD)); LootParams nmsLootParams = new LootParams(nmsWorld, params, Maps.newHashMap(), 0); - List nmsItems = nmsWorld.getServer().getLootData().getLootTable(key).getRandomItems(nmsLootParams); + List nmsItems = nmsHook.registryAccess().registryOrThrow(Registries.LOOT_TABLE).get(key).getRandomItems(nmsLootParams); return nmsItems.get(nmsWorld.random.nextInt(nmsItems.size())); } diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java index fad1a832c0..592e4b14f7 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java @@ -5,6 +5,7 @@ import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; import com.denizenscript.denizen.nms.util.jnbt.IntArrayTag; import com.denizenscript.denizen.nms.util.jnbt.Tag; +import com.denizenscript.denizen.nms.v1_20.Handler; import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; import com.denizenscript.denizen.nms.v1_20.impl.ProfileEditorImpl; import com.denizenscript.denizen.nms.v1_20.impl.jnbt.CompoundTagImpl; @@ -17,20 +18,23 @@ import com.google.common.collect.*; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; -import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.chat.ComponentSerializer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.NonNullList; +import net.minecraft.core.component.DataComponentMap; +import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NbtUtils; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.alchemy.PotionBrewing; +import net.minecraft.world.item.component.CustomData; +import net.minecraft.world.item.component.ItemLore; +import net.minecraft.world.item.component.ResolvableProfile; import net.minecraft.world.item.crafting.*; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; @@ -42,21 +46,23 @@ import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.MapColor; +import net.minecraft.world.level.saveddata.maps.MapId; import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_20_R3.CraftServer; -import org.bukkit.craftbukkit.v1_20_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R3.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftInventoryPlayer; -import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftRecipe; -import org.bukkit.craftbukkit.v1_20_R3.map.CraftMapView; -import org.bukkit.craftbukkit.v1_20_R3.util.CraftMagicNumbers; -import org.bukkit.craftbukkit.v1_20_R3.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.v1_20_R4.CraftRegistry; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftInventoryPlayer; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftRecipe; +import org.bukkit.craftbukkit.v1_20_R4.map.CraftMapView; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftNamespacedKey; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; @@ -72,19 +78,17 @@ public class ItemHelperImpl extends ItemHelper { public static net.minecraft.world.item.crafting.RecipeHolder getNMSRecipe(NamespacedKey key) { ResourceLocation nmsKey = CraftNamespacedKey.toMinecraft(key); - for (Object2ObjectLinkedOpenHashMap> recipeMap : ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager().recipes.values()) { - net.minecraft.world.item.crafting.RecipeHolder recipe = recipeMap.get(nmsKey); - if (recipe != null) { - return recipe; - } - } - return null; + return ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager().byKey(nmsKey).orElse(null); } + public static final Field Item_components = ReflectionHelper.getFields(Item.class).get(ReflectionMappingsInfo.Item_components, DataComponentMap.class); + public void setMaxStackSize(Material material, int size) { try { ReflectionHelper.getFinalSetter(Material.class, "maxStack").invoke(material, size); - ReflectionHelper.getFinalSetter(Item.class, ReflectionMappingsInfo.Item_maxStackSize).invoke(BuiltInRegistries.ITEM.get(CraftNamespacedKey.toMinecraft(material.getKey())), size); + Item nmsItem = BuiltInRegistries.ITEM.get(CraftNamespacedKey.toMinecraft(material.getKey())); + DataComponentMap currentComponents = nmsItem.components(); + Item_components.set(nmsItem, DataComponentMap.composite(currentComponents, DataComponentMap.builder().set(DataComponents.MAX_STACK_SIZE, size).build())); } catch (Throwable ex) { Debug.echoError(ex); @@ -96,29 +100,6 @@ public Integer burnTime(Material material) { return AbstractFurnaceBlockEntity.getFuel().get(CraftMagicNumbers.getItem(material)); } - public static Field RECIPE_MANAGER_BY_NAME = ReflectionHelper.getFields(RecipeManager.class).get(ReflectionMappingsInfo.RecipeManager_byName, Map.class); - - @Override - public void clearDenizenRecipes() { - RecipeManager recipeManager = ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager(); - Map> byName; - try { - byName = (Map) RECIPE_MANAGER_BY_NAME.get(recipeManager); - } - catch (Throwable ex) { - Debug.echoError(ex); - return; - } - for (Object2ObjectLinkedOpenHashMap> recipeMap : recipeManager.recipes.values()) { - for (ResourceLocation key : new ArrayList<>(recipeMap.keySet())) { - if (key.getNamespace().equalsIgnoreCase("denizen")) { - recipeMap.remove(key); - byName.remove(key); - } - } - } - } - @Override public void setShapedRecipeIngredient(ShapedRecipe recipe, char c, ItemStack[] item, boolean exact) { if (item.length == 1 && item[0].getType() == Material.AIR) { @@ -210,7 +191,8 @@ public String getJsonString(ItemStack itemStack) { @Override public String getRawHoverText(ItemStack itemStack) { - net.minecraft.nbt.CompoundTag tag = CraftItemStack.asNMSCopy(itemStack).getTag(); + // TODO: 1.20.6: this is relatively hot code, ideally should have some early returns before serializing the item + net.minecraft.nbt.Tag tag = CraftItemStack.asNMSCopy(itemStack).saveOptional(CraftRegistry.getMinecraftRegistry()); if (tag == null) { return null; } @@ -220,17 +202,12 @@ public String getRawHoverText(ItemStack itemStack) { @Override public PlayerProfile getSkullSkin(ItemStack is) { net.minecraft.world.item.ItemStack itemStack = CraftItemStack.asNMSCopy(is); - if (itemStack.hasTag()) { - net.minecraft.nbt.CompoundTag tag = itemStack.getTag(); - if (tag.contains("SkullOwner", 10)) { - GameProfile profile = NbtUtils.readGameProfile(tag.getCompound("SkullOwner")); - if (profile != null) { - Property property = Iterables.getFirst(profile.getProperties().get("textures"), null); - return new PlayerProfile(profile.getName(), profile.getId(), - property != null ? property.value() : null, - property != null ? property.signature() : null); - } - } + ResolvableProfile profile = itemStack.get(DataComponents.PROFILE); + if (profile != null) { + Property property = Iterables.getFirst(profile.properties().get("textures"), null); + return new PlayerProfile(profile.name().orElse(null), profile.id().orElse(null), + property != null ? property.value() : null, + property != null ? property.signature() : null); } return null; } @@ -239,34 +216,35 @@ public PlayerProfile getSkullSkin(ItemStack is) { public ItemStack setSkullSkin(ItemStack itemStack, PlayerProfile playerProfile) { GameProfile gameProfile = ProfileEditorImpl.getGameProfile(playerProfile); net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(itemStack); - net.minecraft.nbt.CompoundTag tag = nmsItemStack.hasTag() ? nmsItemStack.getTag() : new net.minecraft.nbt.CompoundTag(); - tag.put("SkullOwner", NbtUtils.writeGameProfile(new net.minecraft.nbt.CompoundTag(), gameProfile)); - nmsItemStack.setTag(tag); + nmsItemStack.set(DataComponents.PROFILE, new ResolvableProfile(gameProfile)); return CraftItemStack.asBukkitCopy(nmsItemStack); } @Override public ItemStack addNbtData(ItemStack itemStack, String key, Tag value) { net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(itemStack); - net.minecraft.nbt.CompoundTag tag = nmsItemStack.hasTag() ? nmsItemStack.getTag() : new net.minecraft.nbt.CompoundTag(); - CompoundTag compound = CompoundTagImpl.fromNMSTag(tag).createBuilder().put(key, value).build(); - nmsItemStack.setTag(((CompoundTagImpl) compound).toNMSTag()); + nmsItemStack.update(DataComponents.CUSTOM_DATA, CustomData.EMPTY, customData -> { + CompoundTag updatedTag = CompoundTagImpl.fromNMSTag(customData.getUnsafe()).createBuilder().put(key, value).build(); + return CustomData.of(((CompoundTagImpl) updatedTag).toNMSTag()); + }); return CraftItemStack.asBukkitCopy(nmsItemStack); } + // TODO: 1.20.6: this now needs to serialize components into NBT every single time, should probably only return custom NBT data with specialized methods for other usages + // TODO: 1.20.6: NBT structure is different basically everywhere, usages of this will need an update @Override public CompoundTag getNbtData(ItemStack itemStack) { net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(itemStack); - if (nmsItemStack != null && nmsItemStack.hasTag()) { - return CompoundTagImpl.fromNMSTag(nmsItemStack.getTag()); + if (nmsItemStack != null && !nmsItemStack.isEmpty()) { + return CompoundTagImpl.fromNMSTag((net.minecraft.nbt.CompoundTag) nmsItemStack.save(CraftRegistry.getMinecraftRegistry())); } return new CompoundTagImpl(new HashMap<>()); } + // TODO: 1.20.6: same as getNbtData, ideally needs to only set custom NBT data and have specialized methods for other usages @Override public ItemStack setNbtData(ItemStack itemStack, CompoundTag compoundTag) { - net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(itemStack); - nmsItemStack.setTag(((CompoundTagImpl) compoundTag).toNMSTag()); + net.minecraft.world.item.ItemStack nmsItemStack = net.minecraft.world.item.ItemStack.parseOptional(CraftRegistry.getMinecraftRegistry(), ((CompoundTagImpl) compoundTag).toNMSTag()); return CraftItemStack.asBukkitCopy(nmsItemStack); } @@ -296,15 +274,8 @@ public String getDisplayName(ItemTag item) { return null; } net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item.getItemStack()); - String jsonText = ((net.minecraft.nbt.CompoundTag) nmsItemStack.getTag().get("display")).getString("Name"); - try { - BaseComponent[] nameComponent = ComponentSerializer.parse(jsonText); - return FormattedTextHelper.stringify(nameComponent); - } - catch (Throwable ex) { - Debug.echoError(ex); - return null; - } + Component nmsDisplayName = nmsItemStack.get(DataComponents.CUSTOM_NAME); + return FormattedTextHelper.stringify(Handler.componentToSpigot(nmsDisplayName)); } @Override @@ -313,16 +284,10 @@ public List getLore(ItemTag item) { return null; } net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item.getItemStack()); - ListTag list = ((net.minecraft.nbt.CompoundTag) nmsItemStack.getTag().get("display")).getList("Lore", 8); - List outList = new ArrayList<>(); - for (int i = 0; i < list.size(); i++) { - try { - BaseComponent[] lineComponent = ComponentSerializer.parse(list.getString(i)); - outList.add(FormattedTextHelper.stringify(lineComponent)); - } - catch (Throwable ex) { - Debug.echoError(ex); - } + ItemLore nmsLore = nmsItemStack.get(DataComponents.LORE); + List outList = new ArrayList<>(nmsLore.lines().size()); + for (Component nmsLoreLine : nmsLore.lines()) { + outList.add(FormattedTextHelper.stringify(Handler.componentToSpigot(nmsLoreLine))); } return outList; } @@ -330,40 +295,27 @@ public List getLore(ItemTag item) { @Override public void setDisplayName(ItemTag item, String name) { net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item.getItemStack()); - net.minecraft.nbt.CompoundTag tag = nmsItemStack.getOrCreateTag(); - net.minecraft.nbt.CompoundTag display = tag.getCompound("display"); - if (!tag.contains("display")) { - tag.put("display", display); - } if (name == null || name.isEmpty()) { - display.put("Name", null); - return; + nmsItemStack.remove(DataComponents.CUSTOM_NAME); + } + else { + nmsItemStack.set(DataComponents.CUSTOM_NAME, Handler.componentToNMS(FormattedTextHelper.parse(name, ChatColor.WHITE))); } - BaseComponent[] components = FormattedTextHelper.parse(name, ChatColor.WHITE); - display.put("Name", net.minecraft.nbt.StringTag.valueOf(FormattedTextHelper.componentToJson(components))); item.setItemStack(CraftItemStack.asBukkitCopy(nmsItemStack)); } @Override public void setLore(ItemTag item, List lore) { net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item.getItemStack()); - net.minecraft.nbt.CompoundTag tag = nmsItemStack.getOrCreateTag(); - net.minecraft.nbt.CompoundTag display = tag.getCompound("display"); - if (!tag.contains("display")) { - tag.put("display", display); - } if (lore == null || lore.isEmpty()) { - display.remove("Lore"); - if (display.isEmpty()) { - tag.remove("display"); - } + nmsItemStack.remove(DataComponents.LORE); } else { - ListTag tagList = new ListTag(); - for (String line : lore) { - tagList.add(net.minecraft.nbt.StringTag.valueOf(FormattedTextHelper.componentToJson(FormattedTextHelper.parse(line, ChatColor.WHITE)))); + List nmsLore = new ArrayList<>(lore.size()); + for (String loreLine : lore) { + nmsLore.add(Handler.componentToNMS(FormattedTextHelper.parse(loreLine, ChatColor.WHITE))); } - display.put("Lore", tagList); + nmsItemStack.set(DataComponents.LORE, new ItemLore(nmsLore)); } item.setItemStack(CraftItemStack.asBukkitCopy(nmsItemStack)); } @@ -474,7 +426,7 @@ public static void renderFullMap(MapItemSavedData worldmap, int xMin, int zMin, @Override public boolean renderEntireMap(int mapId, int xMin, int zMin, int xMax, int zMax) { - MapItemSavedData worldmap = ((CraftServer) Bukkit.getServer()).getServer().getLevel(net.minecraft.world.level.Level.OVERWORLD).getMapData("map_" + mapId); + MapItemSavedData worldmap = ((CraftServer) Bukkit.getServer()).getServer().getLevel(net.minecraft.world.level.Level.OVERWORLD).getMapData(new MapId(mapId)); if (worldmap == null) { return false; } @@ -496,7 +448,7 @@ public BlockData getPlacedBlock(Material material) { public boolean isValidMix(ItemStack input, ItemStack ingredient) { net.minecraft.world.item.ItemStack nmsInput = CraftItemStack.asNMSCopy(input); net.minecraft.world.item.ItemStack nmsIngredient = CraftItemStack.asNMSCopy(ingredient); - return PotionBrewing.hasMix(nmsInput, nmsIngredient); + return MinecraftServer.getServer().potionBrewing().hasMix(nmsInput, nmsIngredient); } public static Class PaperPotionMix_CLASS = null; @@ -533,6 +485,6 @@ public byte[] renderMap(MapView mapView, Player player) { @Override public int getFoodPoints(Material itemType) { - return CraftMagicNumbers.getItem(itemType).getFoodProperties().getNutrition(); + return CraftMagicNumbers.getItem(itemType).components().get(DataComponents.FOOD).nutrition(); } } diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PacketHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PacketHelperImpl.java index 488846796a..9d9ce41a15 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PacketHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PacketHelperImpl.java @@ -46,14 +46,14 @@ import org.bukkit.block.Sign; import org.bukkit.block.sign.Side; import org.bukkit.block.sign.SignSide; -import org.bukkit.craftbukkit.v1_20_R3.CraftServer; -import org.bukkit.craftbukkit.v1_20_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_20_R3.map.CraftMapCanvas; -import org.bukkit.craftbukkit.v1_20_R3.map.CraftMapView; -import org.bukkit.craftbukkit.v1_20_R3.util.CraftLocation; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R4.map.CraftMapCanvas; +import org.bukkit.craftbukkit.v1_20_R4.map.CraftMapView; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftLocation; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; @@ -426,6 +426,6 @@ public static void sendAsyncSafe(Player player, Packet packet) { } public static SynchedEntityData.DataValue createEntityData(EntityDataAccessor accessor, T value) { - return new SynchedEntityData.DataValue<>(accessor.getId(), accessor.getSerializer(), value); + return new SynchedEntityData.DataValue<>(accessor.id(), accessor.serializer(), value); } } diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PlayerHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PlayerHelperImpl.java index 37522a6c55..d54ef1810c 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PlayerHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PlayerHelperImpl.java @@ -57,13 +57,13 @@ import net.minecraft.world.phys.AABB; import org.bukkit.*; import org.bukkit.boss.BossBar; -import org.bukkit.craftbukkit.v1_20_R3.CraftServer; -import org.bukkit.craftbukkit.v1_20_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R3.boss.CraftBossBar; -import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_20_R3.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.boss.CraftBossBar; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftMagicNumbers; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/WorldHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/WorldHelperImpl.java index 46ba2e1b43..7422a6e4eb 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/WorldHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/WorldHelperImpl.java @@ -16,7 +16,7 @@ import net.minecraft.world.level.storage.PrimaryLevelData; import org.bukkit.Location; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_20_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; public class WorldHelperImpl implements WorldHelper { diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/BiomeNMSImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/BiomeNMSImpl.java index c27834a8a9..d9cbb1f635 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/BiomeNMSImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/BiomeNMSImpl.java @@ -19,9 +19,9 @@ import net.minecraft.world.level.chunk.LevelChunk; import org.bukkit.Location; import org.bukkit.block.Block; -import org.bukkit.craftbukkit.v1_20_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntityType; -import org.bukkit.craftbukkit.v1_20_R3.util.CraftLocation; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntityType; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftLocation; import org.bukkit.entity.EntityType; import java.lang.invoke.MethodHandle; diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ImprovedOfflinePlayerImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ImprovedOfflinePlayerImpl.java index ab177f1c5d..2cf9cb5f33 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ImprovedOfflinePlayerImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ImprovedOfflinePlayerImpl.java @@ -13,8 +13,9 @@ import net.minecraft.world.entity.ai.attributes.DefaultAttributes; import net.minecraft.world.inventory.PlayerEnderChestContainer; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftInventory; -import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftInventoryPlayer; +import org.bukkit.craftbukkit.v1_20_R4.CraftRegistry; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftInventory; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftInventoryPlayer; import org.bukkit.entity.HumanEntity; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; @@ -77,7 +78,7 @@ public void setInventory(org.bukkit.inventory.PlayerInventory inventory) { public Inventory getEnderChest() { if (enderchest == null) { PlayerEnderChestContainer endchest = new PlayerEnderChestContainer(null); - endchest.fromTag(((CompoundTagImpl) this.compound).toNMSTag().getList("EnderItems", 10)); + endchest.fromTag(((CompoundTagImpl) this.compound).toNMSTag().getList("EnderItems", 10), CraftRegistry.getMinecraftRegistry()); enderchest = new CraftInventory(endchest); } return enderchest; @@ -86,7 +87,7 @@ public Inventory getEnderChest() { @Override public void setEnderChest(Inventory inventory) { net.minecraft.nbt.CompoundTag nbtTagCompound = ((CompoundTagImpl) compound).toNMSTag(); - nbtTagCompound.put("EnderItems", ((PlayerEnderChestContainer) ((CraftInventory) inventory).getInventory()).createTag()); + nbtTagCompound.put("EnderItems", ((PlayerEnderChestContainer) ((CraftInventory) inventory).getInventory()).createTag(CraftRegistry.getMinecraftRegistry())); this.compound = CompoundTagImpl.fromNMSTag(nbtTagCompound); markModified(); } @@ -94,7 +95,7 @@ public void setEnderChest(Inventory inventory) { @Override public double getMaxHealth() { AttributeInstance maxHealth = getAttributes().getInstance(Attributes.MAX_HEALTH); - return maxHealth == null ? Attributes.MAX_HEALTH.getDefaultValue() : maxHealth.getValue(); + return maxHealth == null ? Attributes.MAX_HEALTH.value().getDefaultValue() : maxHealth.getValue(); } @Override diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ProfileEditorImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ProfileEditorImpl.java index ec8ebca71a..22c875f555 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ProfileEditorImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ProfileEditorImpl.java @@ -19,8 +19,8 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_20_R3.CraftServer; -import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerRespawnEvent; diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/SidebarImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/SidebarImpl.java index a3dcaca518..ed33d38f76 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/SidebarImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/SidebarImpl.java @@ -23,6 +23,7 @@ import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.List; +import java.util.Optional; public class SidebarImpl extends Sidebar { @@ -47,7 +48,7 @@ public class SidebarImpl extends Sidebar { public SidebarImpl(Player player) { super(player); - MutableComponent chatComponentTitle = Handler.componentToNMS(FormattedTextHelper.parse(title, ChatColor.WHITE)); + Component chatComponentTitle = Handler.componentToNMS(FormattedTextHelper.parse(title, ChatColor.WHITE)); this.obj1 = new Objective(dummyScoreboard, "dummy_1", dummyCriteria, chatComponentTitle, ObjectiveCriteria.RenderType.INTEGER, false, StyledFormat.SIDEBAR_DEFAULT); this.obj2 = new Objective(dummyScoreboard, "dummy_2", dummyCriteria, chatComponentTitle, ObjectiveCriteria.RenderType.INTEGER, false, StyledFormat.SIDEBAR_DEFAULT); } @@ -55,7 +56,7 @@ public SidebarImpl(Player player) { @Override protected void setDisplayName(String title) { if (this.obj1 != null) { - MutableComponent chatComponentTitle = Handler.componentToNMS(FormattedTextHelper.parse(title, ChatColor.WHITE)); + Component chatComponentTitle = Handler.componentToNMS(FormattedTextHelper.parse(title, ChatColor.WHITE)); this.obj1.setDisplayName(chatComponentTitle); this.obj2.setDisplayName(chatComponentTitle); } @@ -80,7 +81,7 @@ public void sendUpdate() { team.setPlayerPrefix(Handler.componentToNMS(FormattedTextHelper.parse(line, ChatColor.WHITE))); generatedTeams.add(team); PacketHelperImpl.send(player, ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(team, true)); - PacketHelperImpl.send(player, new ClientboundSetScorePacket(lineId, obj1.getName(), this.scores[i], Component.empty(), StyledFormat.SIDEBAR_DEFAULT)); + PacketHelperImpl.send(player, new ClientboundSetScorePacket(lineId, obj1.getName(), this.scores[i], Optional.empty(), Optional.of(StyledFormat.SIDEBAR_DEFAULT))); } PacketHelperImpl.send(player, new ClientboundSetDisplayObjectivePacket(DisplaySlot.SIDEBAR, this.obj1)); PacketHelperImpl.send(player, new ClientboundSetObjectivePacket(this.obj2, 1)); diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/blocks/BlockLightImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/blocks/BlockLightImpl.java index b336f15339..912f37c5c2 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/blocks/BlockLightImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/blocks/BlockLightImpl.java @@ -14,15 +14,15 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LightLayer; import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.level.chunk.DataLayer; import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.chunk.status.ChunkStatus; import net.minecraft.world.level.lighting.LayerLightEventListener; import net.minecraft.world.level.lighting.LevelLightEngine; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_20_R3.CraftChunk; -import org.bukkit.craftbukkit.v1_20_R3.block.CraftBlock; +import org.bukkit.craftbukkit.v1_20_R4.CraftChunk; +import org.bukkit.craftbukkit.v1_20_R4.block.CraftBlock; import org.bukkit.util.Vector; import java.lang.invoke.MethodHandle; diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakeArrowImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakeArrowImpl.java index ab247cb5f6..1257f21557 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakeArrowImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakeArrowImpl.java @@ -2,10 +2,11 @@ import com.denizenscript.denizen.nms.interfaces.FakeArrow; import net.minecraft.world.entity.projectile.AbstractArrow; -import org.bukkit.craftbukkit.v1_20_R3.CraftServer; -import org.bukkit.craftbukkit.v1_20_R3.entity.CraftArrow; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftAbstractArrow; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftArrow; -public class CraftFakeArrowImpl extends CraftArrow implements FakeArrow { +public class CraftFakeArrowImpl extends CraftAbstractArrow implements FakeArrow { public CraftFakeArrowImpl(CraftServer craftServer, AbstractArrow entityArrow) { super(craftServer, entityArrow); diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakePlayerImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakePlayerImpl.java index dc76456267..284ccc5b24 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakePlayerImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakePlayerImpl.java @@ -4,8 +4,8 @@ import com.denizenscript.denizen.nms.NMSHandler; import org.bukkit.Material; import org.bukkit.block.Block; -import org.bukkit.craftbukkit.v1_20_R3.CraftServer; -import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.metadata.MetadataValue; import org.bukkit.plugin.Plugin; diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftItemProjectileImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftItemProjectileImpl.java index a574258a47..acef3db2ac 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftItemProjectileImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftItemProjectileImpl.java @@ -3,9 +3,9 @@ import com.denizenscript.denizen.nms.interfaces.ItemProjectile; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; -import org.bukkit.craftbukkit.v1_20_R3.CraftServer; -import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; import org.bukkit.projectiles.ProjectileSource; @@ -22,7 +22,7 @@ public CraftItemProjectileImpl(CraftServer server, EntityItemProjectileImpl enti MethodHandle handle = ReflectionHelper.getFinalSetterForFirstOfType(CraftEntity.class, EntityType.class); if (handle != null) { try { - handle.invoke(this, EntityType.DROPPED_ITEM); + handle.invoke(this, EntityType.ITEM); } catch (Throwable ex) { Debug.echoError(ex); diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakeArrowImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakeArrowImpl.java index 7bafe0435a..ba5f95cfb9 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakeArrowImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakeArrowImpl.java @@ -7,8 +7,8 @@ import net.minecraft.world.item.Items; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_20_R3.CraftServer; -import org.bukkit.craftbukkit.v1_20_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; import org.bukkit.event.entity.CreatureSpawnEvent; public class EntityFakeArrowImpl extends SpectralArrow { diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakePlayerImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakePlayerImpl.java index f0988a5bdf..4ce9400acf 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakePlayerImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakePlayerImpl.java @@ -3,6 +3,7 @@ import com.denizenscript.denizen.nms.v1_20.Handler; import com.denizenscript.denizen.nms.v1_20.impl.network.fakes.FakeNetworkManagerImpl; import com.denizenscript.denizen.nms.v1_20.impl.network.fakes.FakePlayerConnectionImpl; +import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; import com.mojang.authlib.GameProfile; import com.denizenscript.denizencore.utilities.debugging.Debug; import net.minecraft.network.Connection; @@ -14,7 +15,7 @@ import net.minecraft.server.network.CommonListenerCookie; import net.minecraft.world.entity.player.Player; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_20_R3.CraftServer; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; import org.bukkit.event.entity.CreatureSpawnEvent; public class EntityFakePlayerImpl extends ServerPlayer { @@ -23,13 +24,13 @@ public EntityFakePlayerImpl(MinecraftServer minecraftserver, ServerLevel worldse super(minecraftserver, worldserver, gameprofile, clientInfo); try { Handler.ENTITY_BUKKITYENTITY.set(this, new CraftFakePlayerImpl((CraftServer) Bukkit.getServer(), this)); + Connection networkManager = new FakeNetworkManagerImpl(PacketFlow.CLIENTBOUND); + connection = new FakePlayerConnectionImpl(minecraftserver, networkManager, this, new CommonListenerCookie(gameprofile, 0, clientInfo, false)); + DenizenNetworkManagerImpl.Connection_packetListener.set(networkManager, connection); } catch (Exception ex) { Debug.echoError(ex); } - Connection networkManager = new FakeNetworkManagerImpl(PacketFlow.CLIENTBOUND); - connection = new FakePlayerConnectionImpl(minecraftserver, networkManager, this, new CommonListenerCookie(gameprofile, 0, clientInfo)); - networkManager.setListener(connection); getEntityData().set(Player.DATA_PLAYER_MODE_CUSTOMISATION, (byte) 127); if (doAdd) { worldserver.addFreshEntity(this, CreatureSpawnEvent.SpawnReason.CUSTOM); diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityItemProjectileImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityItemProjectileImpl.java index 5837ead7e2..b894cd54e1 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityItemProjectileImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityItemProjectileImpl.java @@ -5,6 +5,7 @@ import com.denizenscript.denizencore.utilities.debugging.Debug; import com.google.common.base.Preconditions; import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.item.ItemEntity; @@ -13,6 +14,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_20_R4.CraftRegistry; import java.lang.invoke.MethodHandle; @@ -47,8 +49,8 @@ public EntityItemProjectileImpl(Level world, Location location, ItemStack item) } @Override - protected void defineSynchedData() { - this.getEntityData().define(ITEM, ItemStack.EMPTY); + protected void defineSynchedData(SynchedEntityData.Builder builder) { + builder.define(ITEM, ItemStack.EMPTY); } public ItemStack getItemStack() { @@ -78,7 +80,7 @@ public void onSyncedDataUpdated(EntityDataAccessor datawatcherobject) { @Override public boolean save(net.minecraft.nbt.CompoundTag nbttagcompound) { if (!this.getItemStack().isEmpty()) { - nbttagcompound.put("Item", this.getItemStack().save(new net.minecraft.nbt.CompoundTag())); + nbttagcompound.put("Item", this.getItemStack().save(CraftRegistry.getMinecraftRegistry())); } super.save(nbttagcompound); return true; @@ -87,7 +89,7 @@ public boolean save(net.minecraft.nbt.CompoundTag nbttagcompound) { @Override public void load(net.minecraft.nbt.CompoundTag nbttagcompound) { net.minecraft.nbt.CompoundTag nbttagcompound1 = nbttagcompound.getCompound("Item"); - this.setItemStack(ItemStack.of(nbttagcompound1)); + this.setItemStack(ItemStack.parseOptional(CraftRegistry.getMinecraftRegistry(), nbttagcompound1)); if (this.getItemStack().isEmpty()) { this.remove(RemovalReason.KILLED); } diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/AbstractListenerPlayInImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/AbstractListenerPlayInImpl.java index 6f6861def6..642859fac9 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/AbstractListenerPlayInImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/AbstractListenerPlayInImpl.java @@ -15,7 +15,6 @@ import net.minecraft.network.protocol.PacketFlow; import net.minecraft.network.protocol.common.*; import net.minecraft.network.protocol.game.*; -import net.minecraft.network.protocol.status.ServerboundPingRequestPacket; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.CommonListenerCookie; @@ -23,7 +22,7 @@ import net.minecraft.world.entity.RelativeMovement; import net.minecraft.world.phys.Vec3; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; import org.bukkit.event.player.PlayerTeleportEvent; import java.lang.reflect.Field; @@ -31,6 +30,7 @@ import java.util.Set; public class AbstractListenerPlayInImpl extends ServerGamePacketListenerImpl { + // TODO: 1.20.6: there are some new methods that should potentially be overriden public static final Field ServerGamePacketListenerImpl_chunkSender = ReflectionHelper.getFields(ServerGamePacketListenerImpl.class).get(ReflectionMappingsInfo.ServerGamePacketListenerImpl_chunkSender); @@ -284,18 +284,6 @@ public void handleEditBook(ServerboundEditBookPacket packet) { oldListener.handleEditBook(packet); } - @Override - public void handleEntityTagQuery(ServerboundEntityTagQuery packet) { - if (handlePacketIn(packet)) { return; } - oldListener.handleEntityTagQuery(packet); - } - - @Override - public void handleBlockEntityTagQuery(ServerboundBlockEntityTagQuery packet) { - if (handlePacketIn(packet)) { return; } - oldListener.handleBlockEntityTagQuery(packet); - } - @Override public void handleMovePlayer(ServerboundMovePlayerPacket packet) { if (handlePacketIn(packet)) { return; } @@ -424,12 +412,6 @@ public void switchToConfig() { oldListener.switchToConfig(); } - @Override - public void handlePingRequest(ServerboundPingRequestPacket packet) { - if (handlePacketIn(packet)) { return; } - oldListener.handlePingRequest(packet); - } - @Override public void handleInteract(ServerboundInteractPacket packet) { if (handlePacketIn(packet)) { return; } @@ -537,11 +519,6 @@ public ServerPlayer getPlayer() { return oldListener.getPlayer(); } - @Override - public boolean shouldPropagateHandlingExceptions() { - return oldListener.shouldPropagateHandlingExceptions(); - } - @Override public PacketFlow flow() { return oldListener == null ? PacketFlow.SERVERBOUND : oldListener.flow(); diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenNetworkManagerImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenNetworkManagerImpl.java index 8a05753d5c..c1519597d8 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenNetworkManagerImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -15,11 +15,11 @@ import io.netty.channel.ChannelPipeline; import net.minecraft.network.*; import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.PacketFlow; import net.minecraft.network.protocol.configuration.ServerConfigurationPacketListener; import net.minecraft.network.protocol.game.*; -import net.minecraft.network.protocol.handshake.ClientIntent; import net.minecraft.network.protocol.login.ClientLoginPacketListener; import net.minecraft.network.protocol.status.ClientStatusPacketListener; import net.minecraft.network.syncher.SynchedEntityData; @@ -28,11 +28,11 @@ import net.minecraft.server.network.ServerCommonPacketListenerImpl; import net.minecraft.server.network.ServerGamePacketListenerImpl; import net.minecraft.server.network.ServerPlayerConnection; -import net.minecraft.util.SampleLogger; import org.bukkit.Bukkit; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_20_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_20_R4.CraftRegistry; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; import org.bukkit.entity.Player; import javax.annotation.Nullable; @@ -49,11 +49,13 @@ import java.util.stream.Collectors; public class DenizenNetworkManagerImpl extends Connection { + // TODO: 1.20.6: there are some new methods that should potentially be overriden - public static FriendlyByteBuf copyPacket(Packet original) { + // TODO: 1.20.6: this can be cleaned up by decoding with the codec and returning the new packet + public static , B extends FriendlyByteBuf> RegistryFriendlyByteBuf copyPacket(T original, StreamCodec packetCodec) { try { - FriendlyByteBuf copier = new FriendlyByteBuf(Unpooled.buffer()); - original.write(copier); + RegistryFriendlyByteBuf copier = new RegistryFriendlyByteBuf(Unpooled.buffer(), CraftRegistry.getMinecraftRegistry()); + packetCodec.encode((B) copier, original); return copier; } catch (Throwable ex) { @@ -96,9 +98,14 @@ public DenizenNetworkManagerImpl(ServerPlayer entityPlayer, Connection oldManage } } - @Override public void setListener(PacketListener listener) { - oldManager.setListener(listener instanceof ServerConfigurationPacketListener || packetListener == null ? listener : packetListener); + try { + Connection_packetListener.set(oldManager, listener); + } + catch (IllegalAccessException e) { + Debug.echoError(e); + throw new RuntimeException("Failed to set packet listener due to reflection error", e); + } } public static Connection getConnection(ServerPlayer player) { @@ -191,16 +198,6 @@ public void exceptionCaught(ChannelHandlerContext channelhandlercontext, Throwab oldManager.exceptionCaught(channelhandlercontext, throwable); } - @Override - public void suspendInboundAfterProtocolChange() { - oldManager.suspendInboundAfterProtocolChange(); - } - - @Override - public void resumeInboundAfterProtocolChange() { - oldManager.resumeInboundAfterProtocolChange(); - } - @Override protected void channelRead0(ChannelHandlerContext channelhandlercontext, Packet packet) { if (oldManager.channel.isOpen()) { @@ -228,11 +225,6 @@ public void initiateServerboundPlayConnection(String s, int i, ClientLoginPacket oldManager.initiateServerboundPlayConnection(s, i, packetloginoutlistener); } - @Override - public void setClientboundProtocolAfterHandshake(ClientIntent clientintent) { - oldManager.setClientboundProtocolAfterHandshake(clientintent); - } - @Override public void send(Packet packet) { send(packet, null); @@ -274,7 +266,7 @@ else if (packet instanceof ClientboundAddEntityPacket) { } else if (packet instanceof ClientboundMapItemDataPacket) { ClientboundMapItemDataPacket mapPacket = (ClientboundMapItemDataPacket) packet; - doPacketOutput("Packet: ClientboundMapItemDataPacket sent to " + player.getScoreboardName() + " for map ID: " + mapPacket.getMapId() + ", scale: " + mapPacket.getScale() + ", locked: " + mapPacket.isLocked()); + doPacketOutput("Packet: ClientboundMapItemDataPacket sent to " + player.getScoreboardName() + " for map ID: " + mapPacket.mapId() + ", scale: " + mapPacket.scale() + ", locked: " + mapPacket.locked()); } else if (packet instanceof ClientboundRemoveEntitiesPacket) { ClientboundRemoveEntitiesPacket removePacket = (ClientboundRemoveEntitiesPacket) packet; @@ -319,9 +311,11 @@ public void send(Packet packet, @Nullable PacketSendListener genericfuturelis } packetsSent++; if (packet instanceof ClientboundBundlePacket bundlePacket) { - List> processedPackets = new ArrayList<>(); + List> processedPackets = new ArrayList<>(); boolean anyChange = false; - for (Packet subPacket : bundlePacket.subPackets()) { + for (Packet _subPacket : bundlePacket.subPackets()) { + // Bundle packets with non-game packets shouldn't ever be sent while the Denizen interceptor is active + Packet subPacket = (Packet) _subPacket; Packet processed = processPacketHandlersFor(subPacket); anyChange = anyChange || processed != subPacket; if (processed != null) { @@ -505,16 +499,12 @@ public float getAverageSentPackets() { return oldManager.getAverageSentPackets(); } - @Override - public void setBandwidthLogger(SampleLogger samplelogger) { - oldManager.setBandwidthLogger(samplelogger); - } - ////////////////////////////////// //// Reflection Methods/Fields /////////// private static final Field protocolDirectionField = ReflectionHelper.getFields(Connection.class).get(ReflectionMappingsInfo.Connection_receiving, PacketFlow.class); + public static final Field Connection_packetListener = ReflectionHelper.getFields(Connection.class).get(ReflectionMappingsInfo.Connection_packetListener, PacketListener.class); private static final Field ServerGamePacketListener_ConnectionField = ReflectionHelper.getFields(ServerCommonPacketListenerImpl.class).get(ReflectionMappingsInfo.ServerCommonPacketListenerImpl_connection); private static final MethodHandle ServerGamePacketListener_ConnectionSetter = ReflectionHelper.getFinalSetter(ServerCommonPacketListenerImpl.class, ReflectionMappingsInfo.ServerCommonPacketListenerImpl_connection); diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenPacketListenerImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenPacketListenerImpl.java index fbb61d0841..1a22d4ab27 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenPacketListenerImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenPacketListenerImpl.java @@ -18,7 +18,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.CommonListenerCookie; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_20_R3.block.CraftBlock; +import org.bukkit.craftbukkit.v1_20_R4.block.CraftBlock; import org.bukkit.event.block.SignChangeEvent; public class DenizenPacketListenerImpl extends AbstractListenerPlayInImpl { @@ -28,7 +28,7 @@ public class DenizenPacketListenerImpl extends AbstractListenerPlayInImpl { public BlockPos fakeSignExpected; public DenizenPacketListenerImpl(DenizenNetworkManagerImpl networkManager, ServerPlayer entityPlayer) { - super(networkManager, entityPlayer, entityPlayer.connection, new CommonListenerCookie(entityPlayer.getGameProfile(), entityPlayer.connection.latency(), entityPlayer.clientInformation())); + super(networkManager, entityPlayer, entityPlayer.connection, new CommonListenerCookie(entityPlayer.getGameProfile(), entityPlayer.connection.latency(), entityPlayer.clientInformation(), entityPlayer.connection.isTransferred())); } @Override @@ -88,7 +88,7 @@ public void handleContainerClick(ServerboundContainerClickPacket packet) { @Override public void handleCustomPayload(ServerboundCustomPayloadPacket packet) { if (NMSHandler.debugPackets) { - Debug.log("Custom packet payload: " + packet.payload().id().toString() + " sent from " + player.getScoreboardName()); + Debug.log("Custom packet payload: " + packet.payload().type().id().toString() + " sent from " + player.getScoreboardName()); } super.handleCustomPayload(packet); } diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/FakeBlockHelper.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/FakeBlockHelper.java index 7bd1998036..f52d7971f5 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/FakeBlockHelper.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/FakeBlockHelper.java @@ -11,6 +11,7 @@ import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.protocol.game.ClientboundLevelChunkPacketData; import net.minecraft.network.protocol.game.ClientboundLevelChunkWithLightPacket; import net.minecraft.world.level.biome.Biome; @@ -22,9 +23,10 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.PalettedContainer; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_20_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R3.block.CraftBlockStates; -import org.bukkit.craftbukkit.v1_20_R3.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_20_R4.CraftRegistry; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.block.CraftBlockStates; +import org.bukkit.craftbukkit.v1_20_R4.block.data.CraftBlockData; import java.lang.invoke.MethodHandle; import java.lang.reflect.Constructor; @@ -88,9 +90,9 @@ public static void copyPacketPaperPatch(ClientboundLevelChunkWithLightPacket new public static ClientboundLevelChunkWithLightPacket handleMapChunkPacket(World world, ClientboundLevelChunkWithLightPacket originalPacket, int chunkX, int chunkZ, List blocks) { try { - ClientboundLevelChunkWithLightPacket duplicateCorePacket = new ClientboundLevelChunkWithLightPacket(DenizenNetworkManagerImpl.copyPacket(originalPacket)); + ClientboundLevelChunkWithLightPacket duplicateCorePacket = ClientboundLevelChunkWithLightPacket.STREAM_CODEC.decode(DenizenNetworkManagerImpl.copyPacket(originalPacket, ClientboundLevelChunkWithLightPacket.STREAM_CODEC)); copyPacketPaperPatch(duplicateCorePacket, originalPacket); - FriendlyByteBuf copier = new FriendlyByteBuf(Unpooled.buffer()); + RegistryFriendlyByteBuf copier = new RegistryFriendlyByteBuf(Unpooled.buffer(), CraftRegistry.getMinecraftRegistry()); originalPacket.getChunkData().write(copier); ClientboundLevelChunkPacketData packet = new ClientboundLevelChunkPacketData(copier, chunkX, chunkZ); FriendlyByteBuf serial = originalPacket.getChunkData().getReadBuffer(); @@ -107,7 +109,7 @@ public static ClientboundLevelChunkWithLightPacket handleMapChunkPacket(World wo LocationTag loc = block.location; if (loc.getBlockX() == x && loc.getBlockY() == y && loc.getBlockZ() == z && block.material != null) { BlockEntity newBlockEnt = CraftBlockStates.createNewTileEntity(block.material.getMaterial()); - Object newData = CHUNKDATA_BLOCK_ENTITY_CONSTRUCTOR.invoke(xz, y, newBlockEnt.getType(), newBlockEnt.getUpdateTag()); + Object newData = CHUNKDATA_BLOCK_ENTITY_CONSTRUCTOR.invoke(xz, y, newBlockEnt.getType(), newBlockEnt.getUpdateTag(CraftRegistry.getMinecraftRegistry())); blockEntities.set(i, newData); break; } diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/ActionBarEventPacketHandlers.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/ActionBarEventPacketHandlers.java index 2861fac878..7bb358a154 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/ActionBarEventPacketHandlers.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/ActionBarEventPacketHandlers.java @@ -8,6 +8,7 @@ import com.denizenscript.denizencore.objects.core.ElementTag; import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundSetActionBarTextPacket; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftChatMessage; public class ActionBarEventPacketHandlers { @@ -21,9 +22,9 @@ public static ClientboundSetActionBarTextPacket processActionbarPacket(DenizenNe return actionbarPacket; } event.reset(); - Component actionbarText = actionbarPacket.getText(); + Component actionbarText = actionbarPacket.text(); event.message = new ElementTag(FormattedTextHelper.stringify(Handler.componentToSpigot(actionbarText)), true); - event.rawJson = new ElementTag(Component.Serializer.toJson(actionbarText), true); + event.rawJson = new ElementTag(CraftChatMessage.toJSON(actionbarText), true); event.system = new ElementTag(false); event.player = PlayerTag.mirrorBukkitPlayer(networkManager.player.getBukkitEntity()); event = (PlayerReceivesActionbarScriptEvent) event.triggerNow(); diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/AttachPacketHandlers.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/AttachPacketHandlers.java index de92f45b51..0a0aceef29 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/AttachPacketHandlers.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/AttachPacketHandlers.java @@ -11,7 +11,7 @@ import net.minecraft.network.protocol.game.*; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; -import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity; import org.bukkit.util.Vector; import java.lang.reflect.Field; @@ -181,7 +181,7 @@ public static void tryProcessVelocityPacketForAttach(DenizenNetworkManagerImpl n for (EntityAttachmentHelper.PlayerAttachMap attMap : attList.attachedToMap.values()) { EntityAttachmentHelper.AttachmentData att = attMap.getAttachment(networkManager.player.getUUID()); if (attMap.attached.isValid() && att != null) { - ClientboundSetEntityMotionPacket pNew = new ClientboundSetEntityMotionPacket(DenizenNetworkManagerImpl.copyPacket(packet)); + ClientboundSetEntityMotionPacket pNew = ClientboundSetEntityMotionPacket.STREAM_CODEC.decode(DenizenNetworkManagerImpl.copyPacket(packet, ClientboundSetEntityMotionPacket.STREAM_CODEC)); ENTITY_ID_PACKVELENT.setInt(pNew, att.attached.getBukkitEntity().getEntityId()); if (NMSHandler.debugPackets) { DenizenNetworkManagerImpl.doPacketOutput("Attach Velocity Packet: " + pNew.getClass().getCanonicalName() + " for " + att.attached.getUUID() + " sent to " + networkManager.player.getScoreboardName()); @@ -203,7 +203,7 @@ public static void tryProcessTeleportPacketForAttach(DenizenNetworkManagerImpl n for (EntityAttachmentHelper.PlayerAttachMap attMap : attList.attachedToMap.values()) { EntityAttachmentHelper.AttachmentData att = attMap.getAttachment(networkManager.player.getUUID()); if (attMap.attached.isValid() && att != null) { - ClientboundTeleportEntityPacket pNew = new ClientboundTeleportEntityPacket(DenizenNetworkManagerImpl.copyPacket(packet)); + ClientboundTeleportEntityPacket pNew = ClientboundTeleportEntityPacket.STREAM_CODEC.decode(DenizenNetworkManagerImpl.copyPacket(packet, ClientboundTeleportEntityPacket.STREAM_CODEC)); ENTITY_ID_PACKTELENT.setInt(pNew, att.attached.getBukkitEntity().getEntityId()); Vector resultPos = new Vector(POS_X_PACKTELENT.getDouble(pNew), POS_Y_PACKTELENT.getDouble(pNew), POS_Z_PACKTELENT.getDouble(pNew)).add(relative); if (att.positionalOffset != null) { diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DisguisePacketHandlers.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DisguisePacketHandlers.java index d99e38eaf2..8679efd8b8 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DisguisePacketHandlers.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DisguisePacketHandlers.java @@ -14,7 +14,7 @@ import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; -import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; @@ -114,7 +114,7 @@ public static ClientboundUpdateAttributesPacket processAttributesPacket(DenizenN public static ClientboundTeleportEntityPacket processTeleportPacket(DenizenNetworkManagerImpl networkManager, ClientboundTeleportEntityPacket teleportEntityPacket, DisguiseCommand.TrackedDisguise disguise) throws IllegalAccessException { if (disguise.as.getBukkitEntityType() == EntityType.ENDER_DRAGON) { - ClientboundTeleportEntityPacket pNew = new ClientboundTeleportEntityPacket(DenizenNetworkManagerImpl.copyPacket(teleportEntityPacket)); + ClientboundTeleportEntityPacket pNew = ClientboundTeleportEntityPacket.STREAM_CODEC.decode(DenizenNetworkManagerImpl.copyPacket(teleportEntityPacket, ClientboundTeleportEntityPacket.STREAM_CODEC)); TELEPORT_PACKET_YAW.setByte(pNew, EntityAttachmentHelper.adaptedCompressedAngle(teleportEntityPacket.getyRot(), 180)); return pNew; } diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeBlocksPacketHandlers.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeBlocksPacketHandlers.java index 51f0d65360..49b1c856f5 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeBlocksPacketHandlers.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeBlocksPacketHandlers.java @@ -60,7 +60,7 @@ else if (packet instanceof ClientboundSectionBlocksUpdatePacket) { if (!map.byChunk.containsKey(coordinateDenizen)) { return packet; } - ClientboundSectionBlocksUpdatePacket newPacket = new ClientboundSectionBlocksUpdatePacket(DenizenNetworkManagerImpl.copyPacket(packet)); + ClientboundSectionBlocksUpdatePacket newPacket = ClientboundSectionBlocksUpdatePacket.STREAM_CODEC.decode(DenizenNetworkManagerImpl.copyPacket((ClientboundSectionBlocksUpdatePacket) packet, ClientboundSectionBlocksUpdatePacket.STREAM_CODEC)); LocationTag location = new LocationTag(networkManager.player.level().getWorld(), 0, 0, 0); short[] originalOffsetArray = (short[])OFFSETARRAY_MULTIBLOCKCHANGE.get(newPacket); BlockState[] originalDataArray = (BlockState[])BLOCKARRAY_MULTIBLOCKCHANGE.get(newPacket); diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java index 79378bea3f..f81547fc93 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java @@ -12,7 +12,7 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; -import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; import java.util.ArrayList; import java.util.List; @@ -48,6 +48,7 @@ public static ClientboundSetEquipmentPacket processSetEquipmentPacket(DenizenNet case HEAD -> override.head == null ? pair.getSecond() : CraftItemStack.asNMSCopy(override.head.getItemStack()); case LEGS -> override.legs == null ? pair.getSecond() : CraftItemStack.asNMSCopy(override.legs.getItemStack()); case FEET -> override.boots == null ? pair.getSecond() : CraftItemStack.asNMSCopy(override.boots.getItemStack()); + case BODY -> pair.getSecond(); // TODO: 1.20.6: is this actually used here? do we want to allow overriding it? }; equipment.set(i, new Pair<>(pair.getFirst(), use)); } diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/HideParticlesPacketHandlers.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/HideParticlesPacketHandlers.java index b10c4c7ddc..2d6958a721 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/HideParticlesPacketHandlers.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/HideParticlesPacketHandlers.java @@ -4,7 +4,7 @@ import com.denizenscript.denizen.utilities.packets.HideParticles; import net.minecraft.network.protocol.game.ClientboundLevelParticlesPacket; import org.bukkit.Particle; -import org.bukkit.craftbukkit.v1_20_R3.CraftParticle; +import org.bukkit.craftbukkit.v1_20_R4.CraftParticle; import java.util.Set; diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketOutChatImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketOutChatImpl.java index 24456621c3..c7e2119967 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketOutChatImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketOutChatImpl.java @@ -8,6 +8,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundPlayerChatPacket; import net.minecraft.network.protocol.game.ClientboundSystemChatPacket; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftChatMessage; import java.lang.reflect.Field; @@ -23,7 +24,7 @@ public class PacketOutChatImpl extends PacketOutChat { public PacketOutChatImpl(ClientboundSystemChatPacket internal) { systemPacket = internal; - rawJson = Component.Serializer.toJson(internal.content()); + rawJson = CraftChatMessage.toJSON(internal.content()); if (rawJson == null && convertComponentToJsonString != null) { try { if (paperTextField == null) { From f511c4165ceb87398a0934edcfb802931dc4199a Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Mon, 6 May 2024 15:10:14 +0100 Subject: [PATCH 003/280] Fix NMS module loading on Paper (#2618) * Fix NMS module loading on Paper * Safer method for checking * Update for core `ReflectionHelper` changes --- .../server/InternalEventScriptEvent.java | 14 +++++------ .../denizenscript/denizen/nms/NMSHandler.java | 23 ++++++++----------- .../denizenscript/denizen/nms/NMSVersion.java | 16 +++++++++---- .../network/packets/PacketOutSetSlotImpl.java | 3 +-- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/server/InternalEventScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/server/InternalEventScriptEvent.java index d935d4fd41..94bc8e597a 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/server/InternalEventScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/server/InternalEventScriptEvent.java @@ -72,9 +72,9 @@ public ObjectTag getContext(String name) { ListTag result = new ListTag(); Class c = currentEvent.getClass(); while (c != null && c != Object.class) { - for (Map.Entry field : ReflectionHelper.getFields(c).entrySet()) { - if (!Modifier.isStatic(field.getValue().getModifiers())) { - result.addObject(new ElementTag(field.getKey(), true)); + for (Field field : ReflectionHelper.getFields(c).getAllFields()) { + if (!Modifier.isStatic(field.getModifiers())) { + result.addObject(new ElementTag(field.getName(), true)); } } c = c.getSuperclass(); @@ -89,12 +89,12 @@ public ObjectTag getContext(String name) { String fName = CoreUtilities.toLowerCase(name.substring("field_".length())); Class c = currentEvent.getClass(); while (c != null && c != Object.class) { - ReflectionHelper.CheckingFieldMap fields = ReflectionHelper.getFields(c); - for (Map.Entry field : fields.entrySet()) { - if (!Modifier.isStatic(field.getValue().getModifiers()) && CoreUtilities.toLowerCase(field.getKey()).equals(fName)) { + ReflectionHelper.FieldCache fields = ReflectionHelper.getFields(c); + for (Field field : fields.getAllFields()) { + if (!Modifier.isStatic(field.getModifiers()) && CoreUtilities.toLowerCase(field.getName()).equals(fName)) { Object val = null; try { - val = field.getValue().get(currentEvent); + val = field.get(currentEvent); } catch (Throwable ex) { Debug.echoError(ex); diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java b/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java index 2019d04727..b8bb558fa3 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java @@ -5,8 +5,8 @@ import com.denizenscript.denizen.nms.util.PlayerProfile; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; import com.denizenscript.denizen.nms.util.jnbt.Tag; -import com.denizenscript.denizencore.utilities.ReflectionHelper; import net.md_5.bungee.api.chat.HoverEvent; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.Block; @@ -33,19 +33,14 @@ public abstract class NMSHandler { public static boolean initialize(JavaPlugin plugin) { javaPlugin = plugin; - Class serverClass = javaPlugin.getServer().getClass(); - ReflectionHelper.giveReflectiveAccess(serverClass, ReflectionHelper.class); - String packageName = serverClass.getPackage().getName(); - int indexOfSubRevision = packageName.indexOf('R'); - if (indexOfSubRevision > 0) { - // "v1_14_R1" should become "v1_14" - packageName = packageName.substring(0, indexOfSubRevision - 1); - } - try { - // Check if we support this MC version - version = NMSVersion.valueOf(packageName.substring(packageName.lastIndexOf('.') + 1)); + String bukkitVersion = Bukkit.getBukkitVersion(); + for (NMSVersion potentialVersion : NMSVersion.values()) { + if (bukkitVersion.startsWith(potentialVersion.minecraftVersion)) { + version = potentialVersion; + break; + } } - catch (Exception e) { + if (version == null) { version = NMSVersion.NOT_SUPPORTED; instance = null; return false; @@ -55,7 +50,7 @@ public static boolean initialize(JavaPlugin plugin) { final Class clazz = Class.forName("com.denizenscript.denizen.nms." + version.name() + ".Handler"); if (NMSHandler.class.isAssignableFrom(clazz)) { // Found and loaded - good to go! - instance = (NMSHandler) clazz.newInstance(); + instance = (NMSHandler) clazz.getDeclaredConstructor().newInstance(); return true; } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/NMSVersion.java b/plugin/src/main/java/com/denizenscript/denizen/nms/NMSVersion.java index 84ea91fe60..1aa7a0157a 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/NMSVersion.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/NMSVersion.java @@ -2,11 +2,17 @@ public enum NMSVersion { - NOT_SUPPORTED, - v1_17, - v1_18, - v1_19, - v1_20; + NOT_SUPPORTED("not_supported"), + v1_17("1.17"), + v1_18("1.18"), + v1_19("1.19"), + v1_20("1.20"); + + final String minecraftVersion; + + NMSVersion(String minecraftVersion) { + this.minecraftVersion = minecraftVersion; + } public boolean isAtLeast(NMSVersion version) { return ordinal() >= version.ordinal(); diff --git a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/impl/network/packets/PacketOutSetSlotImpl.java b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/impl/network/packets/PacketOutSetSlotImpl.java index 2c7cc30404..b72484e4bf 100644 --- a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/impl/network/packets/PacketOutSetSlotImpl.java +++ b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/impl/network/packets/PacketOutSetSlotImpl.java @@ -44,7 +44,6 @@ public void setItemStack(org.bukkit.inventory.ItemStack itemStack) { private static final Field ITEM_STACK; static { - Map fields = ReflectionHelper.getFields(ClientboundContainerSetSlotPacket.class); - ITEM_STACK = fields.get("c"); + ITEM_STACK = ReflectionHelper.getFields(ClientboundContainerSetSlotPacket.class).get("c"); } } From 4953e9813c096826b2c42b548b6ec0d488dd853b Mon Sep 17 00:00:00 2001 From: hyper <39167664+heypr@users.noreply.github.com> Date: Thu, 9 May 2024 06:57:41 -0400 Subject: [PATCH 004/280] New `explored_locations` property for Sniffers (#2612) * Sniffer stuff, initial commit. * Should be everything for now. Meta might need some work? * Move property registration out of paper * Update meta * List tag constructor * Updated meta, property now actually sets locations * Update EntityExploredLocations.java * Updated meta --- .../objects/properties/PropertyRegistry.java | 3 ++ .../entity/EntityExploredLocations.java | 44 +++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityExploredLocations.java diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java index 5a729130b7..ac267e4f72 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java @@ -76,6 +76,9 @@ public static void registerMainProperties() { } PropertyParser.registerProperty(EntityDropsItem.class, EntityTag.class); PropertyParser.registerProperty(EntityEquipment.class, EntityTag.class); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { + PropertyParser.registerProperty(EntityExploredLocations.class, EntityTag.class); + } PropertyParser.registerProperty(EntityExplosionFire.class, EntityTag.class); PropertyParser.registerProperty(EntityExplosionRadius.class, EntityTag.class); PropertyParser.registerProperty(EntityEyeTargetLocation.class, EntityTag.class); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityExploredLocations.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityExploredLocations.java new file mode 100644 index 0000000000..20b799c6e7 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityExploredLocations.java @@ -0,0 +1,44 @@ +package com.denizenscript.denizen.objects.properties.entity; + +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.objects.LocationTag; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ListTag; +import org.bukkit.entity.Sniffer; + +public class EntityExploredLocations extends EntityProperty { + + // <--[property] + // @object EntityTag + // @name explored_locations + // @input ListTag(LocationTag) + // @description + // Controls a sniffer's explored locations. + // @mechanism + // Note that if the sniffer is not in the same world as the input LocationTag(s), then the LocationTag(s) will not be added to the list of explored locations. + // --> + + public static boolean describes(EntityTag entity) { + return entity.getBukkitEntity() instanceof Sniffer; + } + + @Override + public ListTag getPropertyValue() { + return new ListTag(as(Sniffer.class).getExploredLocations(), LocationTag::new); + } + + @Override + public void setPropertyValue(ListTag param, Mechanism mechanism) { + as(Sniffer.class).getExploredLocations().forEach(as(Sniffer.class)::removeExploredLocation); + param.filter(LocationTag.class, mechanism.context).forEach(as(Sniffer.class)::addExploredLocation); + } + + @Override + public String getPropertyId() { + return "explored_locations"; + } + + public static void register() { + autoRegister("explored_locations", EntityExploredLocations.class, ListTag.class, false); + } +} From 5ecb3886fcb4265901a839551215d524932ce56f Mon Sep 17 00:00:00 2001 From: hyper <39167664+heypr@users.noreply.github.com> Date: Thu, 16 May 2024 22:56:53 -0400 Subject: [PATCH 005/280] New `` tag for `EntityResurrect` event. (#2617) * New context * Meta addition * enum constructor thing idk * Updated meta --- .../entity/EntityResurrectScriptEvent.java | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityResurrectScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityResurrectScriptEvent.java index 35bb5df059..d08d748698 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityResurrectScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityResurrectScriptEvent.java @@ -1,9 +1,12 @@ package com.denizenscript.denizen.events.entity; +import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; -import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -25,6 +28,7 @@ public class EntityResurrectScriptEvent extends BukkitScriptEvent implements Lis // // @Context // returns the EntityTag being resurrected. + // returns which hand the totem was in during resurrection, if any. Can be either HAND or OFF_HAND. Available only on MC 1.19+. // // @Player when the entity being resurrected is a player. // @@ -55,10 +59,17 @@ public ScriptEntryData getScriptEntryData() { @Override public ObjectTag getContext(String name) { - if (name.equals("entity")) { - return entity; - } - return super.getContext(name); + return switch (name) { + case "entity" -> entity; + case "hand" -> { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { + yield event.getHand() != null ? new ElementTag(event.getHand()) : null; + } + yield null; + } + default -> super.getContext(name); + }; + } @EventHandler From d37d034eb208c9cfb3a8b8ff0ead6f397737a046 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Fri, 17 May 2024 09:25:13 +0100 Subject: [PATCH 006/280] NBT handling update: `EntityTag` & attributes (#2622) * Replace `EntityTag` nbt usage * Replace attribute NBT stuff with API * Renames * Rename x2 --- .../denizen/nms/interfaces/ItemHelper.java | 21 +++ .../denizen/nms/util/jnbt/CompoundTag.java | 8 + .../properties/item/ItemArmorPose.java | 45 ++---- .../properties/item/ItemAttributeNBT.java | 109 +++++++++++-- .../properties/item/ItemFrameInvisible.java | 46 ++---- .../utilities/BukkitImplDeprecations.java | 10 +- .../denizen/utilities/nbt/CustomNBT.java | 149 +----------------- .../nms/v1_20/helpers/ItemHelperImpl.java | 21 +++ 8 files changed, 181 insertions(+), 228 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java index a8ff7f7bf9..fb395b8cdd 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java @@ -8,6 +8,7 @@ import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.block.data.BlockData; +import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; @@ -47,6 +48,26 @@ public abstract class ItemHelper { public abstract ItemStack setNbtData(ItemStack itemStack, CompoundTag compoundTag); + public CompoundTag getEntityData(ItemStack item) { // TODO: once 1.20 is the minimum supported version, remove default impl + CompoundTag nbt = getNbtData(item); + return nbt != null && nbt.getValue().get("EntityTag") instanceof CompoundTag entityNbt ? entityNbt : null; + } + + public ItemStack setEntityData(ItemStack item, CompoundTag entityNbt, EntityType entityType) { // TODO: once 1.20 is the minimum supported version, remove default impl + boolean shouldRemove = entityNbt == null || entityNbt.isEmpty(); + CompoundTag nbt = getNbtData(item); + if (shouldRemove && !nbt.containsKey("EntityTag")) { + return item; + } + if (shouldRemove) { + nbt = nbt.createBuilder().remove("EntityTag").build(); + } + else { + nbt = nbt.createBuilder().put("EntityTag", entityNbt).build(); + } + return setNbtData(item, nbt); + } + public abstract void registerSmithingRecipe(String keyName, ItemStack result, ItemStack[] baseItem, boolean baseExact, ItemStack[] upgradeItem, boolean upgradeExact, ItemStack[] templateItem, boolean templateExact); public abstract void setInventoryItem(Inventory inventory, ItemStack item, int slot); diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/util/jnbt/CompoundTag.java b/plugin/src/main/java/com/denizenscript/denizen/nms/util/jnbt/CompoundTag.java index 3e3b1f39d6..9adc1eea15 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/util/jnbt/CompoundTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/util/jnbt/CompoundTag.java @@ -53,6 +53,14 @@ public boolean containsKey(String key) { return value.containsKey(key); } + public boolean isEmpty() { + return getValue().isEmpty(); + } + + public int size() { + return getValue().size(); + } + @Override public Map getValue() { return value; diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemArmorPose.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemArmorPose.java index cf458d15da..610b1b0645 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemArmorPose.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemArmorPose.java @@ -9,6 +9,7 @@ import com.denizenscript.denizencore.objects.core.MapTag; import com.denizenscript.denizencore.utilities.CoreUtilities; import org.bukkit.Material; +import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; import java.util.ArrayList; @@ -31,15 +32,11 @@ public static boolean describes(ItemTag item) { @Override public MapTag getPropertyValue() { - CompoundTag compoundTag = NMSHandler.itemHelper.getNbtData(getItemStack()); - if (compoundTag == null) { + CompoundTag entityNbt = NMSHandler.itemHelper.getEntityData(getItemStack()); + if (entityNbt == null) { return null; } - Tag entPart = compoundTag.getValue().get("EntityTag"); - if (!(entPart instanceof CompoundTag)) { - return null; - } - Tag posePart = ((CompoundTag) entPart).getValue().get("Pose"); + Tag posePart = entityNbt.getValue().get("Pose"); if (!(posePart instanceof CompoundTag)) { return null; } @@ -56,15 +53,10 @@ public MapTag getPropertyValue() { @Override public void setPropertyValue(MapTag param, Mechanism mechanism) { - CompoundTag compoundTag = NMSHandler.itemHelper.getNbtData(getItemStack()); - Tag entPart, posePart; + CompoundTag entityNbt = NMSHandler.itemHelper.getEntityData(getItemStack()); if (mechanism.hasValue()) { - if (compoundTag == null) { - compoundTag = new CompoundTagBuilder().build(); - } - entPart = compoundTag.getValue().get("EntityTag"); - if (!(entPart instanceof CompoundTag)) { - entPart = new CompoundTagBuilder().build(); + if (entityNbt == null) { + entityNbt = new CompoundTagBuilder().build(); } CompoundTagBuilder poseBuilder = new CompoundTagBuilder(); procMechKey(mechanism, poseBuilder, "Head", "head", param); @@ -75,33 +67,22 @@ public void setPropertyValue(MapTag param, Mechanism mechanism) { procMechKey(mechanism, poseBuilder, "RightLeg", "right_leg", param); CompoundTag pose = poseBuilder.build(); if (pose.getValue().isEmpty()) { - entPart = ((CompoundTag) entPart).createBuilder().remove("Pose").build(); + entityNbt = entityNbt.createBuilder().remove("Pose").build(); } else { - entPart = ((CompoundTag) entPart).createBuilder().put("Pose", pose).build(); + entityNbt = entityNbt.createBuilder().put("Pose", pose).build(); } } else { - if (compoundTag == null) { - return; - } - entPart = compoundTag.getValue().get("EntityTag"); - if (!(entPart instanceof CompoundTag)) { + if (entityNbt == null) { return; } - posePart = ((CompoundTag) entPart).getValue().get("Pose"); - if (!(posePart instanceof CompoundTag)) { + if (!(entityNbt.getValue().get("Pose") instanceof CompoundTag)) { return; } - entPart = ((CompoundTag) entPart).createBuilder().remove("Pose").build(); - } - if (((CompoundTag) entPart).getValue().isEmpty()) { - compoundTag = compoundTag.createBuilder().remove("EntityTag").build(); - } - else { - compoundTag = compoundTag.createBuilder().put("EntityTag", entPart).build(); + entityNbt = entityNbt.createBuilder().remove("Pose").build(); } - ItemStack result = NMSHandler.itemHelper.setNbtData(getItemStack(), compoundTag); + ItemStack result = NMSHandler.itemHelper.setEntityData(getItemStack(), entityNbt, EntityType.ARMOR_STAND); setItemStack(result); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemAttributeNBT.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemAttributeNBT.java index 17f50c3ee0..0ba85dbcc2 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemAttributeNBT.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemAttributeNBT.java @@ -1,19 +1,27 @@ package com.denizenscript.denizen.objects.properties.item; -import com.denizenscript.denizen.utilities.nbt.CustomNBT; import com.denizenscript.denizen.objects.ItemTag; -import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizen.utilities.BukkitImplDeprecations; import com.denizenscript.denizencore.objects.Mechanism; -import com.denizenscript.denizencore.objects.core.ListTag; import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.objects.core.ListTag; import com.denizenscript.denizencore.objects.properties.Property; import com.denizenscript.denizencore.tags.Attribute; import com.denizenscript.denizencore.tags.core.EscapeTagUtil; -import com.denizenscript.denizen.utilities.BukkitImplDeprecations; +import com.denizenscript.denizencore.utilities.AsciiMatcher; +import com.denizenscript.denizencore.utilities.CoreUtilities; import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.Registry; +import org.bukkit.attribute.AttributeModifier; +import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; -import java.util.List; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; @Deprecated public class ItemAttributeNBT implements Property { @@ -62,12 +70,15 @@ public ObjectTag getObjectAttribute(Attribute attribute) { public ListTag getList() { ItemStack itemStack = item.getItemStack(); - List nbtKeys = CustomNBT.getAttributes(itemStack); + ItemMeta meta = itemStack.getItemMeta(); ListTag list = new ListTag(); - if (nbtKeys != null) { - for (CustomNBT.AttributeReturn atr : nbtKeys) { - list.add(EscapeTagUtil.escape(atr.attr) + "/" + EscapeTagUtil.escape(atr.slot) + "/" + atr.op + "/" + atr.amt); - } + if (meta == null || !meta.hasAttributeModifiers()) { + return list; + } + for (Map.Entry entry : meta.getAttributeModifiers().entries()) { + AttributeModifier modifier = entry.getValue(); + String slotName = toLegacyName(modifier.getSlot() != null ? modifier.getSlot() : EquipmentSlot.HAND); + list.add(EscapeTagUtil.escape(entry.getKey().getKey().getKey()) + "/" + EscapeTagUtil.escape(slotName) + "/" + modifier.getOperation().ordinal() + "/" + modifier.getAmount()); } return list; } @@ -93,20 +104,92 @@ public void adjust(Mechanism mechanism) { } ListTag list = mechanism.valueAsType(ListTag.class); ItemStack itemStack = item.getItemStack(); - itemStack = CustomNBT.clearNBT(itemStack, CustomNBT.KEY_ATTRIBUTES); + ItemMeta meta = itemStack.getItemMeta(); + if (meta.hasAttributeModifiers()) { + meta.getAttributeModifiers().keySet().forEach(meta::removeAttributeModifier); + } for (String string : list) { String[] split = string.split("/"); if (split.length != 4) { mechanism.echoError("Invalid nbt_attributes input: must have 4 values per attribute."); continue; } - String attribute = EscapeTagUtil.unEscape(split[0]); + String attribute = fixAttributeName1_16(EscapeTagUtil.unEscape(split[0])); String slot = EscapeTagUtil.unEscape(split[1]); int op = new ElementTag(split[2]).asInt(); double amt = new ElementTag(split[3]).asDouble(); - itemStack = CustomNBT.addAttribute(itemStack, attribute, slot, op, amt); + long uuidhelp = uuidChoice(itemStack); + int attribsSize = meta.hasAttributeModifiers() ? meta.getAttributeModifiers().values().size() : 0; + UUID fullUuid = new UUID(uuidhelp + 88512 + attribsSize, uuidhelp * 2 + 1250025L + attribsSize); + meta.addAttributeModifier(Registry.ATTRIBUTE.get(NamespacedKey.minecraft(attribute)), new AttributeModifier(fullUuid, attribute, amt, AttributeModifier.Operation.values()[op], fromLegacyName(slot))); } + itemStack.setItemMeta(meta); item.setItemStack(itemStack); } } + + public static final AsciiMatcher uppercaseMatcher = new AsciiMatcher(AsciiMatcher.LETTERS_UPPER); + + public static final HashMap attributeNameUpdates = new HashMap<>(); + + static { + attributeNameUpdates.put("generic.maxHealth", "generic.max_health"); + attributeNameUpdates.put("generic.followRange", "generic.follow_range"); + attributeNameUpdates.put("generic.knockbackResistance", "generic.knockback_resistance"); + attributeNameUpdates.put("generic.movementSpeed", "generic.movement_speed"); + attributeNameUpdates.put("generic.flyingSpeed", "generic.flying_speed"); + attributeNameUpdates.put("generic.attackDamage", "generic.attack_damage"); + attributeNameUpdates.put("generic.attackKnockback", "generic.attack_knockback"); + attributeNameUpdates.put("generic.attackSpeed", "generic.attack_speed"); + attributeNameUpdates.put("generic.armorToughness", "generic.armor_toughness"); + } + + public static String fixAttributeName1_16(String input) { + if (!uppercaseMatcher.containsAnyMatch(input)) { + return input; + } + String replacement = attributeNameUpdates.get(input); + if (replacement != null) { + return replacement; + } + return CoreUtilities.toLowerCase(input); + } + + public static long uuidChoice(ItemStack its) { + String mat = CoreUtilities.toLowerCase(its.getType().name()); + if (mat.contains("boots")) { + return 1000; + } + else if (mat.contains("legging")) { + return 100000; + } + else if (mat.contains("helmet")) { + return 10000000; + } + else if (mat.contains("chestp")) { + return 1000000000; + } + else { + return 1; + } + } + + private static EquipmentSlot fromLegacyName(String name) { + return switch (name) { + case "mainhand" -> EquipmentSlot.HAND; + case "offhand" -> EquipmentSlot.OFF_HAND; + default -> { + EquipmentSlot slot = ElementTag.asEnum(EquipmentSlot.class, name); + yield slot != null ? slot : EquipmentSlot.HAND; + } + }; + } + + private static String toLegacyName(EquipmentSlot slot) { + return switch (slot) { + case HAND -> "mainhand"; + case OFF_HAND -> "offhand"; + default -> CoreUtilities.toLowerCase(slot.name()); + }; + } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFrameInvisible.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFrameInvisible.java index 6bb6c7aebd..3208081937 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFrameInvisible.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFrameInvisible.java @@ -1,9 +1,8 @@ package com.denizenscript.denizen.objects.properties.item; import com.denizenscript.denizen.nms.NMSHandler; -import com.denizenscript.denizen.nms.util.jnbt.ByteTag; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; -import com.denizenscript.denizen.nms.util.jnbt.Tag; +import com.denizenscript.denizen.nms.util.jnbt.CompoundTagBuilder; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.ObjectTag; @@ -11,9 +10,7 @@ import com.denizenscript.denizencore.objects.properties.Property; import com.denizenscript.denizencore.tags.Attribute; import org.bukkit.Material; - -import java.util.LinkedHashMap; -import java.util.Map; +import org.bukkit.entity.EntityType; public class ItemFrameInvisible implements Property { @@ -45,15 +42,11 @@ public ItemFrameInvisible(ItemTag item) { ItemTag item; public boolean isInvisible() { - CompoundTag compoundTag = NMSHandler.itemHelper.getNbtData(item.getItemStack()); - if (compoundTag == null) { - return false; - } - CompoundTag entTag = (CompoundTag) compoundTag.getValue().get("EntityTag"); - if (entTag == null) { + CompoundTag entityNbt = NMSHandler.itemHelper.getEntityData(item.getItemStack()); + if (entityNbt == null) { return false; } - byte b = entTag.getByte("Invisible"); + byte b = entityNbt.getByte("Invisible"); return b == 1; } @@ -101,30 +94,19 @@ public void adjust(Mechanism mechanism) { // // --> if (mechanism.matches("invisible") && mechanism.requireBoolean()) { - CompoundTag compoundTag = NMSHandler.itemHelper.getNbtData(item.getItemStack()); - Map result = new LinkedHashMap<>(compoundTag.getValue()); - CompoundTag entityTag = (CompoundTag) result.get("EntityTag"); - Map entMap; - if (entityTag != null) { - entMap = new LinkedHashMap<>(entityTag.getValue()); - } - else { - entMap = new LinkedHashMap<>(); - } - if (mechanism.getValue().asBoolean()) { - entMap.put("Invisible", new ByteTag((byte) 1)); - } - else { - entMap.remove("Invisible"); + CompoundTag entityNbt = NMSHandler.itemHelper.getEntityData(item.getItemStack()); + boolean invisible = mechanism.getValue().asBoolean(); + if (!invisible && entityNbt == null) { + return; } - if (entMap.isEmpty()) { - result.remove("EntityTag"); + if (invisible) { + CompoundTagBuilder builder = entityNbt != null ? entityNbt.createBuilder() : CompoundTagBuilder.create(); + entityNbt = builder.putByte("Invisible", (byte) 1).build(); } else { - result.put("EntityTag", NMSHandler.instance.createCompoundTag(entMap)); + entityNbt = entityNbt.createBuilder().remove("Invisible").build(); } - compoundTag = NMSHandler.instance.createCompoundTag(result); - item.setItemStack(NMSHandler.itemHelper.setNbtData(item.getItemStack(), compoundTag)); + item.setItemStack(NMSHandler.itemHelper.setEntityData(item.getItemStack(), entityNbt, item.getBukkitMaterial() == Material.ITEM_FRAME ? EntityType.ITEM_FRAME : EntityType.GLOW_ITEM_FRAME)); } } } 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 99a9989d10..300a878dfc 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java @@ -227,6 +227,11 @@ public class BukkitImplDeprecations { public static Warning oldStructureTypes = new SlowWarning("oldStructureTypes", "'server.structure_types' is based on outdated API and doesn't support modern datapack features. Use 'server.structures' instead."); public static Warning findStructureTags = new SlowWarning("findStructureTags", "'LocationTag.find.structure' and related tags are deprecated in favor of 'LocationTag.find_structure'."); + // Added 2021/03/29, made very-slow 2022/12/31, made slow 2024/05/09. + // 2022-year-end commonality: #7 + // 2023-year-end commonality: #31 + public static Warning legacyAttributeProperties = new SlowWarning("legacyAttributeProperties", "The 'attribute' properties are deprecated in favor of the 'attribute_modifiers' properties which more fully implement the attribute system."); + // ==================== VERY SLOW deprecations ==================== // These are only shown minimally, so server owners are aware of them but not bugged by them. Only servers with active scripters (using 'ex reload') will see them often. @@ -257,11 +262,6 @@ public class BukkitImplDeprecations { // 2022-year-end commonality: #10 public static Warning entityMechanismsFormat = new VerySlowWarning("entityMechanismsFormat", "Entity script containers previously allowed mechanisms in the script's root, however they should now be under a 'mechanisms' key."); - // Added 2021/03/29, made very-slow 2022/12/31. - // 2022-year-end commonality: #7 - // 2023-year-end commonality: #31 - public static Warning legacyAttributeProperties = new VerySlowWarning("legacyAttributeProperties", "The 'attribute' properties are deprecated in favor of the 'attribute_modifiers' properties which more fully implement the attribute system."); - // Added 2021/08/30, made very-slow 2022/12/31. // 2022-year-end commonality: #23 public static Warning takeMoney = new VerySlowWarning("takeMoney", "Using the 'take' command to take money is deprecated in favor of the 'money' command."); diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/nbt/CustomNBT.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/nbt/CustomNBT.java index 32073dd769..30155e0460 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/nbt/CustomNBT.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/nbt/CustomNBT.java @@ -1,9 +1,10 @@ package com.denizenscript.denizen.utilities.nbt; import com.denizenscript.denizen.nms.NMSHandler; -import com.denizenscript.denizen.nms.util.jnbt.*; +import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; +import com.denizenscript.denizen.nms.util.jnbt.JNBTListTag; +import com.denizenscript.denizen.nms.util.jnbt.StringTag; import com.denizenscript.denizen.objects.properties.entity.EntityDisabledSlots.Action; -import com.denizenscript.denizencore.utilities.AsciiMatcher; import com.denizenscript.denizencore.utilities.CoreUtilities; import org.bukkit.Material; import org.bukkit.entity.Entity; @@ -15,7 +16,6 @@ public class CustomNBT { public static final String KEY_DENIZEN = "Denizen NBT"; - public static final String KEY_ATTRIBUTES = "AttributeModifiers"; public static final String KEY_CAN_PLACE_ON = "CanPlaceOn"; public static final String KEY_CAN_DESTROY = "CanDestroy"; public static final String KEY_DISABLED_SLOTS = "DisabledSlots"; @@ -37,149 +37,6 @@ public class CustomNBT { * custom NBT. */ - public static class AttributeReturn { - public String attr; - public String slot; - public int op; - public double amt; - public long uuidMost; - public long uuidLeast; - } - - public static List getAttributes(ItemStack itemStack) { - if (itemStack == null || itemStack.getType() == Material.AIR) { - return null; - } - CompoundTag compoundTag = NMSHandler.itemHelper.getNbtData(itemStack); - List attribs = new ArrayList<>(); - if (compoundTag.getValue().containsKey(KEY_ATTRIBUTES)) { - List temp = (List) compoundTag.getValue().get(KEY_ATTRIBUTES).getValue(); - for (Tag tag : temp) { - attribs.add((CompoundTag) tag); - } - } - List attrs = new ArrayList<>(); - for (int i = 0; i < attribs.size(); i++) { - CompoundTag ct = attribs.get(i); - AttributeReturn atr = new AttributeReturn(); - atr.attr = (String) ct.getValue().get("Name").getValue(); - atr.slot = ct.getValue().get("Slot") == null ? "mainhand" : (String) ct.getValue().get("Slot").getValue(); - atr.op = (Integer) ct.getValue().get("Operation").getValue(); - Tag t = ct.getValue().get("Amount"); - if (t instanceof IntTag) { - atr.amt = (Integer) t.getValue(); - } - else if (t instanceof LongTag) { - atr.amt = (Long) t.getValue(); - } - else if (t instanceof DoubleTag) { - atr.amt = (Double) t.getValue(); - } - else { - /// ???? - atr.amt = 0; - } - if (ct.getValue().containsKey("UUID")) { - UUID id = NMSHandler.itemHelper.convertNbtToUuid((IntArrayTag) ct.getValue().get("UUID")); - atr.uuidLeast = id.getLeastSignificantBits(); - atr.uuidMost = id.getMostSignificantBits(); - } - else if (ct.getValue().containsKey("UUIDMost")) { - t = ct.getValue().get("UUIDMost"); - if (t instanceof LongTag) { - atr.uuidMost = (Long) t.getValue(); - } - else if (t instanceof IntTag) { - atr.uuidMost = (Integer) t.getValue(); - } - t = ct.getValue().get("UUIDLeast"); - if (t instanceof LongTag) { - atr.uuidLeast = (Long) t.getValue(); - } - else if (t instanceof IntTag) { - atr.uuidLeast = (Integer) t.getValue(); - } - } - attrs.add(atr); - } - return attrs; - } - - public static long uuidChoice(ItemStack its) { - String mat = CoreUtilities.toLowerCase(its.getType().name()); - if (mat.contains("boots")) { - return 1000; - } - else if (mat.contains("legging")) { - return 100000; - } - else if (mat.contains("helmet")) { - return 10000000; - } - else if (mat.contains("chestp")) { - return 1000000000; - } - else { - return 1; - } - } - - public static final AsciiMatcher uppercaseMatcher = new AsciiMatcher(AsciiMatcher.LETTERS_UPPER); - - public static final HashMap attributeNameUpdates = new HashMap<>(); - - static { - attributeNameUpdates.put("generic.maxHealth", "generic.max_health"); - attributeNameUpdates.put("generic.followRange", "generic.follow_range"); - attributeNameUpdates.put("generic.knockbackResistance", "generic.knockback_resistance"); - attributeNameUpdates.put("generic.movementSpeed", "generic.movement_speed"); - attributeNameUpdates.put("generic.flyingSpeed", "generic.flying_speed"); - attributeNameUpdates.put("generic.attackDamage", "generic.attack_damage"); - attributeNameUpdates.put("generic.attackKnockback", "generic.attack_knockback"); - attributeNameUpdates.put("generic.attackSpeed", "generic.attack_speed"); - attributeNameUpdates.put("generic.armorToughness", "generic.armor_toughness"); - } - - public static String fixAttributeName1_16(String input) { - if (!uppercaseMatcher.containsAnyMatch(input)) { - return input; - } - String replacement = attributeNameUpdates.get(input); - if (replacement != null) { - return replacement; - } - return CoreUtilities.toLowerCase(input); - } - - public static ItemStack addAttribute(ItemStack itemStack, String attr, String slot, int op, double amt) { - if (itemStack == null || itemStack.getType() == Material.AIR) { - return null; - } - CompoundTag compoundTag = NMSHandler.itemHelper.getNbtData(itemStack); - List attribs = new ArrayList<>(); - if (compoundTag.getValue().containsKey(KEY_ATTRIBUTES)) { - List temp = (List) compoundTag.getValue().get(KEY_ATTRIBUTES).getValue(); - for (Tag tag : temp) { - attribs.add((CompoundTag) tag); - } - } - HashMap tmap = new HashMap<>(); - attr = fixAttributeName1_16(attr); - tmap.put("AttributeName", new StringTag(attr)); - tmap.put("Name", new StringTag(attr)); - tmap.put("Slot", new StringTag(slot)); - tmap.put("Operation", new IntTag(op)); - tmap.put("Amount", new DoubleTag(amt)); - long uuidhelp = uuidChoice(itemStack); - UUID fullUuid = new UUID(uuidhelp + 88512 + attribs.size(), uuidhelp * 2 + 1250025L + attribs.size()); - tmap.put("UUID", NMSHandler.itemHelper.convertUuidToNbt(fullUuid)); - CompoundTag ct = NMSHandler.instance.createCompoundTag(tmap); - attribs.add(ct); - JNBTListTag lt = new JNBTListTag(CompoundTag.class, attribs); - compoundTag = compoundTag.createBuilder().put(KEY_ATTRIBUTES, lt).build(); - return NMSHandler.itemHelper.setNbtData(itemStack, compoundTag); - } - public static List getNBTMaterials(ItemStack itemStack, String key) { if (itemStack == null || itemStack.getType() == Material.AIR) { return null; diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java index 592e4b14f7..4ab29270e6 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java @@ -63,6 +63,7 @@ import org.bukkit.craftbukkit.v1_20_R4.map.CraftMapView; import org.bukkit.craftbukkit.v1_20_R4.util.CraftMagicNumbers; import org.bukkit.craftbukkit.v1_20_R4.util.CraftNamespacedKey; +import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; @@ -248,6 +249,26 @@ public ItemStack setNbtData(ItemStack itemStack, CompoundTag compoundTag) { return CraftItemStack.asBukkitCopy(nmsItemStack); } + @Override + public CompoundTag getEntityData(ItemStack item) { + CustomData entityData = CraftItemStack.asNMSCopy(item).get(DataComponents.ENTITY_DATA); + return entityData != null ? CompoundTagImpl.fromNMSTag(entityData.getUnsafe()) : null; + } + + public static final net.minecraft.nbt.CompoundTag EMPTY_TAG = new net.minecraft.nbt.CompoundTag(); + + @Override + public ItemStack setEntityData(ItemStack item, CompoundTag entityNbt, EntityType entityType) { + net.minecraft.nbt.CompoundTag nmsEntityNbt = EMPTY_TAG; + if (entityNbt != null && !entityNbt.isEmpty() && (!entityNbt.containsKey("id") || entityNbt.size() > 1)) { + nmsEntityNbt = ((CompoundTagImpl) entityNbt).toNMSTag(); + nmsEntityNbt.putString("id", entityType.getKey().toString()); + } + net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item); + CustomData.set(DataComponents.ENTITY_DATA, nmsItemStack, nmsEntityNbt); + return CraftItemStack.asBukkitCopy(nmsItemStack); + } + @Override public void setInventoryItem(Inventory inventory, ItemStack item, int slot) { if (inventory instanceof CraftInventoryPlayer && ((CraftInventoryPlayer) inventory).getInventory().player == null) { From e37bb4459971e53317a748562c5e9c5c4370a994 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Tue, 21 May 2024 09:40:08 -0700 Subject: [PATCH 007/280] treat Java 21 as recognized version for startup message --- plugin/src/main/java/com/denizenscript/denizen/Denizen.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/Denizen.java b/plugin/src/main/java/com/denizenscript/denizen/Denizen.java index 5a68b96155..3889f37638 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/Denizen.java +++ b/plugin/src/main/java/com/denizenscript/denizen/Denizen.java @@ -146,7 +146,10 @@ else if (javaVersion.startsWith("17")) { Debug.log("Running on fully supported Java 17."); } else if (javaVersion.startsWith("18") || javaVersion.startsWith("19")) { - getLogger().warning("Running unreliable future Java version. modern Minecraft versions are built for Java 17. Other Java versions are not guaranteed to function properly."); + getLogger().warning("Running unreliable Java version. modern Minecraft versions are built for Java 21 or 17. Other Java versions are not guaranteed to function properly."); + } + else if (javaVersion.startsWith("21")) { + Debug.log("Running on fully supported Java 21."); } else { Debug.log("Running on unrecognized (future?) Java version. May or may not work."); From b94a8f959fa524fe8c1caedef7cfb4dbbd4e0b7f Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Sat, 25 May 2024 11:02:35 -0700 Subject: [PATCH 008/280] clicks block meta --- .../denizen/events/player/PlayerClicksBlockScriptEvent.java | 1 + 1 file changed, 1 insertion(+) diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerClicksBlockScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerClicksBlockScriptEvent.java index 95448e509f..067f9630fd 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerClicksBlockScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerClicksBlockScriptEvent.java @@ -28,6 +28,7 @@ public class PlayerClicksBlockScriptEvent extends BukkitScriptEvent implements L // @Group Player // // @Warning this event may in some cases double-fire, requiring usage of the 'ratelimit' command (like 'ratelimit 1t') to prevent doubling actions. + // @Warning this sometimes fires at unexpected times, eg when dropping an item. // // @Switch with: to only process the event if a specified item was held. // @Switch using:hand/off_hand/either_hand to only process the event if the specified hand was used to click. From 50acb4c931fde05ada9b2c6988c3c87385b67c57 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Mon, 27 May 2024 22:45:37 +0100 Subject: [PATCH 009/280] Fix `ItemTag.can_destroy/place_on` properties (#2624) * Fix `ItemTag.can_destroy/place_on` properties * Imports * Newline * Newline x2 * Naming --- .../denizen/nms/interfaces/ItemHelper.java | 23 ++++++ .../properties/item/ItemCanDestroy.java | 10 +-- .../properties/item/ItemCanPlaceOn.java | 10 +-- .../nms/v1_20/ReflectionMappingsInfo.java | 3 + .../nms/v1_20/helpers/ItemHelperImpl.java | 70 ++++++++++++++++++- 5 files changed, 103 insertions(+), 13 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java index fb395b8cdd..72bc6e3e26 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java @@ -5,6 +5,7 @@ import com.denizenscript.denizen.nms.util.jnbt.IntArrayTag; import com.denizenscript.denizen.nms.util.jnbt.Tag; import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizen.utilities.nbt.CustomNBT; import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.block.data.BlockData; @@ -68,6 +69,28 @@ public ItemStack setEntityData(ItemStack item, CompoundTag entityNbt, EntityType return setNbtData(item, nbt); } + public List getCanPlaceOn(ItemStack item) { // TODO: once 1.20 is the minimum supported version, remove default impl + return CustomNBT.getNBTMaterials(item, CustomNBT.KEY_CAN_PLACE_ON); + } + + public ItemStack setCanPlaceOn(ItemStack item, List canPlaceOn) { // TODO: once 1.20 is the minimum supported version, remove default impl + if (canPlaceOn == null) { + return CustomNBT.clearNBT(item, CustomNBT.KEY_CAN_PLACE_ON); + } + return CustomNBT.setNBTMaterials(item, CustomNBT.KEY_CAN_PLACE_ON, canPlaceOn); + } + + public List getCanBreak(ItemStack item) { // TODO: once 1.20 is the minimum supported version, remove default impl + return CustomNBT.getNBTMaterials(item, CustomNBT.KEY_CAN_DESTROY); + } + + public ItemStack setCanBreak(ItemStack item, List canBreak) { // TODO: once 1.20 is the minimum supported version, remove default impl + if (canBreak == null) { + return CustomNBT.clearNBT(item, CustomNBT.KEY_CAN_DESTROY); + } + return CustomNBT.setNBTMaterials(item, CustomNBT.KEY_CAN_DESTROY, canBreak); + } + public abstract void registerSmithingRecipe(String keyName, ItemStack result, ItemStack[] baseItem, boolean baseExact, ItemStack[] upgradeItem, boolean upgradeExact, ItemStack[] templateItem, boolean templateExact); public abstract void setInventoryItem(Inventory inventory, ItemStack item, int slot); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemCanDestroy.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemCanDestroy.java index af211d340f..9873acc401 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemCanDestroy.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemCanDestroy.java @@ -1,11 +1,11 @@ package com.denizenscript.denizen.objects.properties.item; -import com.denizenscript.denizen.utilities.nbt.CustomNBT; +import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.objects.MaterialTag; import com.denizenscript.denizencore.objects.Mechanism; -import com.denizenscript.denizencore.objects.core.ListTag; import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ListTag; import com.denizenscript.denizencore.objects.properties.Property; import com.denizenscript.denizencore.tags.Attribute; import org.bukkit.Material; @@ -45,7 +45,7 @@ public ItemCanDestroy(ItemTag item) { public ListTag getMaterials() { ItemStack itemStack = item.getItemStack(); - List materials = CustomNBT.getNBTMaterials(itemStack, CustomNBT.KEY_CAN_DESTROY); + List materials = NMSHandler.itemHelper.getCanBreak(itemStack); if (materials != null && !materials.isEmpty()) { ListTag list = new ListTag(); for (Material material : materials) { @@ -116,10 +116,10 @@ public void adjust(Mechanism mechanism) { if (mechanism.hasValue()) { List materials = mechanism.valueAsType(ListTag.class).filter(MaterialTag.class, mechanism.context) .stream().map(MaterialTag::getMaterial).collect(Collectors.toList()); - itemStack = CustomNBT.setNBTMaterials(itemStack, CustomNBT.KEY_CAN_DESTROY, materials); + itemStack = NMSHandler.itemHelper.setCanBreak(itemStack, materials); } else { - itemStack = CustomNBT.clearNBT(itemStack, CustomNBT.KEY_CAN_DESTROY); + itemStack = NMSHandler.itemHelper.setCanBreak(itemStack, null); } item.setItemStack(itemStack); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemCanPlaceOn.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemCanPlaceOn.java index ca33cb88ee..8010b9c838 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemCanPlaceOn.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemCanPlaceOn.java @@ -1,11 +1,11 @@ package com.denizenscript.denizen.objects.properties.item; -import com.denizenscript.denizen.utilities.nbt.CustomNBT; +import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.objects.MaterialTag; import com.denizenscript.denizencore.objects.Mechanism; -import com.denizenscript.denizencore.objects.core.ListTag; import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ListTag; import com.denizenscript.denizencore.objects.properties.Property; import com.denizenscript.denizencore.tags.Attribute; import org.bukkit.Material; @@ -45,7 +45,7 @@ public ItemCanPlaceOn(ItemTag item) { public ListTag getMaterials() { ItemStack itemStack = item.getItemStack(); - List materials = CustomNBT.getNBTMaterials(itemStack, CustomNBT.KEY_CAN_PLACE_ON); + List materials = NMSHandler.itemHelper.getCanPlaceOn(itemStack); if (materials != null && !materials.isEmpty()) { ListTag list = new ListTag(); for (Material material : materials) { @@ -116,10 +116,10 @@ public void adjust(Mechanism mechanism) { if (mechanism.hasValue()) { List materials = mechanism.valueAsType(ListTag.class).filter(MaterialTag.class, mechanism.context) .stream().map(MaterialTag::getMaterial).collect(Collectors.toList()); - itemStack = CustomNBT.setNBTMaterials(itemStack, CustomNBT.KEY_CAN_PLACE_ON, materials); + itemStack = NMSHandler.itemHelper.setCanPlaceOn(itemStack, materials); } else { - itemStack = CustomNBT.clearNBT(itemStack, CustomNBT.KEY_CAN_PLACE_ON); + itemStack = NMSHandler.itemHelper.setCanPlaceOn(itemStack, null); } item.setItemStack(itemStack); diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/ReflectionMappingsInfo.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/ReflectionMappingsInfo.java index 450cca2cd5..397b0f80ce 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/ReflectionMappingsInfo.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/ReflectionMappingsInfo.java @@ -130,4 +130,7 @@ public class ReflectionMappingsInfo { // net.minecraft.server.level.ServerLevel public static String ServerLevel_sleepStatus = "P"; + + // net.minecraft.world.item.AdventureModePredicate + public static String AdventureModePredicate_predicates = "h"; } diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java index 4ab29270e6..f777b94d12 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java @@ -19,16 +19,17 @@ import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; import net.md_5.bungee.api.ChatColor; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.NonNullList; +import net.minecraft.advancements.critereon.BlockPredicate; +import net.minecraft.core.*; import net.minecraft.core.component.DataComponentMap; +import net.minecraft.core.component.DataComponentType; import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.NbtUtils; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; +import net.minecraft.world.item.AdventureModePredicate; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.alchemy.PotionBrewing; @@ -269,6 +270,69 @@ public ItemStack setEntityData(ItemStack item, CompoundTag entityNbt, EntityType return CraftItemStack.asBukkitCopy(nmsItemStack); } + public static final Field AdventureModePredicate_predicates = ReflectionHelper.getFields(AdventureModePredicate.class).get(ReflectionMappingsInfo.AdventureModePredicate_predicates); + + @Override + public List getCanPlaceOn(ItemStack item) { + return getAdventureModePredicateMaterials(item, DataComponents.CAN_PLACE_ON); + } + + @Override + public ItemStack setCanPlaceOn(ItemStack item, List canPlaceOn) { + return setAdventureModePredicateMaterials(item, DataComponents.CAN_PLACE_ON, canPlaceOn); + } + + @Override + public List getCanBreak(ItemStack item) { + return getAdventureModePredicateMaterials(item, DataComponents.CAN_BREAK); + } + + @Override + public ItemStack setCanBreak(ItemStack item, List canBreak) { + return setAdventureModePredicateMaterials(item, DataComponents.CAN_BREAK, canBreak); + } + + private List getAdventureModePredicateMaterials(ItemStack item, DataComponentType nmsComponent) { + AdventureModePredicate nmsAdventurePredicate = CraftItemStack.asNMSCopy(item).get(nmsComponent); + if (nmsAdventurePredicate == null) { + return null; + } + List nmsPredicates; + try { + nmsPredicates = (List) AdventureModePredicate_predicates.get(nmsAdventurePredicate); + } + catch (Throwable e) { + Debug.echoError(e); + return null; + } + List materials = new ArrayList<>(); + for (BlockPredicate nmsPredicate : nmsPredicates) { + nmsPredicate.blocks().ifPresent(nmsHolderSet -> { + for (Holder nmsHolder : nmsHolderSet) { + materials.add(CraftMagicNumbers.getMaterial(nmsHolder.value())); + } + }); + } + return materials; + } + + private ItemStack setAdventureModePredicateMaterials(ItemStack item, DataComponentType nmsComponent, List materials) { + net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item); + AdventureModePredicate nmsAdventurePredicate = nmsItemStack.get(nmsComponent); + if (materials == null) { + if (nmsAdventurePredicate == null) { + return item; + } + nmsItemStack.remove(nmsComponent); + return CraftItemStack.asBukkitCopy(nmsItemStack); + } + BlockPredicate nmsPredicate = new BlockPredicate(Optional.of( + HolderSet.direct(material -> BuiltInRegistries.BLOCK.getHolder(CraftNamespacedKey.toMinecraft(material.getKey())).orElseThrow(), materials) + ), Optional.empty(), Optional.empty()); + nmsItemStack.set(nmsComponent, new AdventureModePredicate(List.of(nmsPredicate), nmsAdventurePredicate == null || nmsAdventurePredicate.showInTooltip())); + return CraftItemStack.asBukkitCopy(nmsItemStack); + } + @Override public void setInventoryItem(Inventory inventory, ItemStack item, int slot) { if (inventory instanceof CraftInventoryPlayer && ((CraftInventoryPlayer) inventory).getInventory().player == null) { From 0758d03027ab582967bacf3a02ec555f3a237dc0 Mon Sep 17 00:00:00 2001 From: hyper <39167664+heypr@users.noreply.github.com> Date: Mon, 27 May 2024 17:49:46 -0400 Subject: [PATCH 010/280] Add the `PlayerArmorStandManipulate` event (#2601) * . * adds four switches * Update PlayerArmorStandManipulateScriptEvent.java * Update meta * fixed error o.o * Update meta yet again * Added matcher & spaces * Made matcher a switch instead * Updated event line & switches --- .../denizen/events/ScriptEventRegistry.java | 1 + ...PlayerArmorStandManipulateScriptEvent.java | 104 ++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerArmorStandManipulateScriptEvent.java diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java index 598fed0912..2cd4d49a20 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java @@ -173,6 +173,7 @@ public static void registerMainEvents() { ScriptEvent.registerScriptEvent(HotbarScrollScriptEvent.class); ScriptEvent.registerScriptEvent(ExperienceBottleBreaksScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerAnimatesScriptEvent.class); + ScriptEvent.registerScriptEvent(PlayerArmorStandManipulateScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerBreaksBlockScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerBreaksItemScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerChangesMainHandScriptEvent.class); diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerArmorStandManipulateScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerArmorStandManipulateScriptEvent.java new file mode 100644 index 0000000000..2bc876b352 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerArmorStandManipulateScriptEvent.java @@ -0,0 +1,104 @@ +package com.denizenscript.denizen.events.player; + +import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.scripts.ScriptEntryData; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerArmorStandManipulateEvent; + +public class PlayerArmorStandManipulateScriptEvent extends BukkitScriptEvent implements Listener { + + // <--[event] + // @Events + // player changes armor stand item + // + // @Group Player + // + // @Location true + // + // @Cancellable true + // + // @Triggers when a player modifies an armor stand entity. + // + // @Switch from: to only process the event if the item on the armor stand being interacted with matches the specified item matcher. + // @Switch hand: to only process the event if the player is using a specific hand to interact with the armor stand. Available only on MC versions 1.19+. + // @Switch to: to only process the event if the item held by the player matches the specified item matcher. + // @Switch slot: to only process the event if the armor stand's item slot that was interacted with is the specified slot. + // @Switch armor_stand: to only process the event if the armor stand being interacted with matches the specified entity matcher. + // + // @Context + // returns the ItemTag being interacted with on the armor stand. + // returns an EntityTag of the armor stand. + // returns an ElementTag of the hand used by the player to interact with the armor stand, can be either HAND or OFF_HAND. Available only on MC versions 1.19+. + // returns the ItemTag held by the player. + // returns an ElementTag of the armor stand's item slot that was interacted with. Valid equipment slot values can be found at <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/inventory/EquipmentSlot.html>. + // + // @Player Always. + // --> + + public PlayerArmorStandManipulateScriptEvent() { + registerCouldMatcher("player changes armor stand item"); + registerSwitches("from", "to", "hand", "slot", "armor_stand"); + } + + public PlayerArmorStandManipulateEvent event; + public EntityTag entity; + public ItemTag armorStandItem; + public ItemTag playerItem; + + @Override + public boolean matches(ScriptPath path) { + if (!runInCheck(path, event.getRightClicked().getLocation())) { + return false; + } + if (!path.tryObjectSwitch("from", armorStandItem)) { + return false; + } + if (!path.tryObjectSwitch("armor_stand", entity)) { + return false; + } + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19) && !runGenericSwitchCheck(path, "hand", event.getHand().name())) { + return false; + } + if (!path.tryObjectSwitch("to", playerItem)) { + return false; + } + if (!runGenericSwitchCheck(path, "slot", event.getSlot().name())) { + return false; + } + return super.matches(path); + } + + @Override + public ScriptEntryData getScriptEntryData() { + return new BukkitScriptEntryData(event.getPlayer()); + } + + @Override + public ObjectTag getContext(String name) { + return switch (name) { + case "armor_stand_item" -> armorStandItem; + case "entity" -> entity; + case "hand" -> NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19) ? new ElementTag(event.getHand()) : null; + case "player_item" -> playerItem; + case "slot" -> new ElementTag(event.getSlot()); + default -> super.getContext(name); + }; + } + + @EventHandler + public void onPlayerManipulatesArmorStand(PlayerArmorStandManipulateEvent event) { + this.event = event; + entity = new EntityTag(event.getRightClicked()); + playerItem = new ItemTag(event.getPlayerItem()); + armorStandItem = new ItemTag(event.getArmorStandItem()); + fire(event); + } +} From a2f6987e41115013492248ef31492c0f715cc1f2 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Sat, 1 Jun 2024 10:31:04 -0700 Subject: [PATCH 011/280] fix a few meta mistakes --- .../main/java/com/denizenscript/denizen/objects/EntityTag.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java index 8c51423ed3..8c311356c6 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java @@ -1568,7 +1568,7 @@ else if (object.getLivingEntity() instanceof Steerable) { // @description // Returns the location of the block the entity is looking at. // Optionally, specify a maximum range to find the location from (defaults to 200). - // This uses logic equivalent to <@link tag LocationTag.precise_cursor_on_block[(range)]>. + // This uses logic equivalent to <@link tag LocationTag.precise_cursor_on_block>. // Note that this will return null if there is no block in range. // This uses all blocks, ie it includes passable blocks like tall-grass and water. Use <@link tag EntityTag.cursor_on_solid> to exclude passable blocks. // Equivalent to From f5ba76d22e1a618bea3728017479bf42501c13f2 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Sun, 2 Jun 2024 13:46:12 -0700 Subject: [PATCH 012/280] cleanup pig zapped event --- .../events/entity/PigZappedScriptEvent.java | 33 +++++++++---------- .../scripts/commands/world/StrikeCommand.java | 2 +- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/PigZappedScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/PigZappedScriptEvent.java index cb5611a6d7..8d401ccf45 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/PigZappedScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/PigZappedScriptEvent.java @@ -2,7 +2,9 @@ import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.scripts.ScriptEntryData; import org.bukkit.entity.Entity; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -14,7 +16,7 @@ public class PigZappedScriptEvent extends BukkitScriptEvent implements Listener // @Events // pig zapped // - // @Regex ^on pig zapped$ + // @Synonyms pig struck by lightning, pig electrocuted, pig lightning strike, pig turns into pig zombie, pig turns into zombie pigman // // @Group Entity // @@ -32,6 +34,7 @@ public class PigZappedScriptEvent extends BukkitScriptEvent implements Listener // --> public PigZappedScriptEvent() { + registerCouldMatcher("pig zapped"); } public EntityTag pig; @@ -39,14 +42,6 @@ public PigZappedScriptEvent() { private EntityTag lightning; public PigZapEvent event; - @Override - public boolean couldMatch(ScriptPath path) { - if (!path.eventLower.equals("pig zapped")) { - return false; - } - return true; - } - @Override public boolean matches(ScriptPath path) { if (!runInCheck(path, pig.getLocation())) { @@ -57,15 +52,17 @@ public boolean matches(ScriptPath path) { @Override public ObjectTag getContext(String name) { - switch (name) { - case "pig": - return pig; - case "pig_zombie": - return pig_zombie; - case "lightning": - return lightning; - } - return super.getContext(name); + return switch (name) { + case "pig" -> pig; + case "pig_zombie" -> pig_zombie; + case "lightning" -> lightning; + default -> super.getContext(name); + }; + } + + @Override + public ScriptEntryData getScriptEntryData() { + return new BukkitScriptEntryData(pig); } @EventHandler diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/StrikeCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/StrikeCommand.java index eeb5825719..71bf85e1d3 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/StrikeCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/StrikeCommand.java @@ -23,7 +23,7 @@ public StrikeCommand() { // @Required 1 // @Maximum 3 // @Short Strikes lightning down upon the location. - // @Synonyms Lightning + // @Synonyms Lightning, Electrocute // @Group world // // @Description From 05fc1f84ed654e8592d935c2cbf7e2a5b856e1c4 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Sun, 2 Jun 2024 14:02:24 -0700 Subject: [PATCH 013/280] add Citizens repo to the Plugin pom also bump version to 34 --- paper/pom.xml | 2 +- plugin/pom.xml | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/paper/pom.xml b/paper/pom.xml index 553c3bd5f0..cc3bcbb0c3 100644 --- a/paper/pom.xml +++ b/paper/pom.xml @@ -36,7 +36,7 @@ net.citizensnpcs citizens-main - 2.0.33-SNAPSHOT + 2.0.34-SNAPSHOT jar provided diff --git a/plugin/pom.xml b/plugin/pom.xml index 53587ee87f..64affb6f66 100644 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -16,6 +16,14 @@ CUSTOM + + + + everything + https://maven.citizensnpcs.co/repo + + + @@ -36,7 +44,7 @@ net.citizensnpcs citizens-main - 2.0.33-SNAPSHOT + 2.0.34-SNAPSHOT jar provided From 949802aaa77f5a4c30a9b01a06401f7ba7b7b74f Mon Sep 17 00:00:00 2001 From: Joo200 Date: Mon, 3 Jun 2024 22:39:42 +0200 Subject: [PATCH 014/280] Add Paper Only TargetHitScriptEvent (#2604) * Add Paper Only TargetHitScriptEvent * squashme: review comments * squash: more review comments * squashme: review comments * squashme: review comments * squashme: review comments * squashme: review comments * squashme: review comments * review --- .../denizen/paper/PaperModule.java | 1 + .../events/TargetBlockHitScriptEvent.java | 83 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 paper/src/main/java/com/denizenscript/denizen/paper/events/TargetBlockHitScriptEvent.java diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java index 3d3045b8af..2f179f250c 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java @@ -83,6 +83,7 @@ public static void init() { ScriptEvent.registerScriptEvent(ServerListPingScriptEventPaperImpl.class); ScriptEvent.registerScriptEvent(ServerResourcesReloadedScriptEvent.class); ScriptEvent.registerScriptEvent(SkeletonHorseTrapScriptEvent.class); + ScriptEvent.registerScriptEvent(TargetBlockHitScriptEvent.class); if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_18)) { ScriptEvent.registerScriptEvent(TNTPrimesScriptEvent.class); } diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/TargetBlockHitScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/TargetBlockHitScriptEvent.java new file mode 100644 index 0000000000..332ac98dbf --- /dev/null +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/TargetBlockHitScriptEvent.java @@ -0,0 +1,83 @@ +package com.denizenscript.denizen.paper.events; + +import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.objects.LocationTag; +import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.scripts.ScriptEntryData; +import io.papermc.paper.event.block.TargetHitEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + + +public class TargetBlockHitScriptEvent extends BukkitScriptEvent implements Listener { + + // <--[event] + // @Events + // target block hit + // + // @Location true + // + // @Group Paper + // + // @Plugin Paper + // + // @Triggers when a target block is hit by a projectile such as an arrow. + // + // @Context + // returns an EntityTag of the projectile. + // returns a LocationTag of the block that was hit. + // returns a LocationTag vector of the hit normal (like '0,1,0' if the projectile hit the top of a block). + // returns an EntityTag of the entity that shot the projectile, if any. + // returns a ElementTag of the emitted redstone strength. + // + // @Player when the shooter is a player. + // + // @NPC when the shooter is a npc. + // --> + + public TargetBlockHitScriptEvent() { + registerCouldMatcher("target block hit"); + } + + public TargetHitEvent event; + public LocationTag hitBlock; + public EntityTag projectile; + public EntityTag shooter; + + @Override + public boolean matches(ScriptPath path) { + if (!runInCheck(path, hitBlock)) { + return false; + } + return super.matches(path); + } + + @Override + public ObjectTag getContext(String name) { + return switch (name) { + case "projectile" -> projectile.getDenizenObject(); + case "hit_block" -> hitBlock; + case "hit_face" -> event.getHitBlockFace() != null ? new LocationTag(event.getHitBlockFace().getDirection()) : null; + case "shooter" -> shooter != null ? shooter.getDenizenObject() : null; + case "strength" -> new ElementTag(event.getSignalStrength()); + default -> super.getContext(name); + }; + } + + @Override + public ScriptEntryData getScriptEntryData() { + return new BukkitScriptEntryData(shooter); + } + + @EventHandler + public void onProjectileHit(TargetHitEvent event) { + this.event = event; + projectile = new EntityTag(event.getEntity()); + hitBlock = new LocationTag(event.getHitBlock().getLocation()); + shooter = projectile.getShooter(); + fire(event); + } +} From f3dc24bab3f911253848540206f79d33eebaf33b Mon Sep 17 00:00:00 2001 From: hyper <39167664+heypr@users.noreply.github.com> Date: Mon, 3 Jun 2024 17:05:32 -0400 Subject: [PATCH 015/280] Paper-only `client_options` tag. (#2619) * New client_options tag * Update meta * Update meta * Removed nonexistent ElementTag in meta * Merged with other version check --- .../properties/PaperPlayerExtensions.java | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperPlayerExtensions.java b/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperPlayerExtensions.java index fba2df72d6..be56152901 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperPlayerExtensions.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperPlayerExtensions.java @@ -6,8 +6,12 @@ import com.denizenscript.denizen.objects.PlayerTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.ListTag; +import com.denizenscript.denizencore.objects.core.MapTag; +import com.destroystokyo.paper.ClientOption; +import com.destroystokyo.paper.SkinParts; import net.kyori.adventure.util.TriState; import org.bukkit.Material; +import org.bukkit.entity.Player; public class PaperPlayerExtensions { @@ -26,6 +30,55 @@ public static void register() { return new ElementTag(object.getPlayerEntity().getAffectsSpawning()); }); + // <--[tag] + // @attribute + // @returns MapTag + // @group paper + // @Plugin Paper + // @description + // Returns the player's client options. + // The output map contains the following keys: + // - 'allow_server_listings' (ElementTag(Boolean)): whether the player allows server listings. Available only on MC 1.19+. + // - 'chat_colors_enabled' (ElementTag(Boolean)): whether the player has chat colors enabled. + // - 'chat_visibility' (ElementTag): the player's current chat visibility option. Possible output values are: FULL, SYSTEM, HIDDEN, and UNKNOWN. + // - 'locale' (ElementTag): the player's current locale. + // - 'main_hand' (ElementTag): the player's main hand, either LEFT or RIGHT. + // - 'skin_parts' (MapTag): which skin parts the player has enabled. The output map contains the following keys: + // - 'cape' (ElementTag(Boolean)): whether the player's cape is enabled. + // - 'hat' (ElementTag(Boolean)): whether the player's hat is enabled. + // - 'jacket' (ElementTag(Boolean)): whether the player's jacket is enabled. + // - 'left_sleeve' (ElementTag(Boolean)): whether the player's left sleeve is enabled. + // - 'right_sleeve' (ElementTag(Boolean)): whether the player's right sleeve is enabled. + // - 'left_pants' (ElementTag(Boolean)): whether the player's left pants is enabled. + // - 'right_pants' (ElementTag(Boolean)): whether the player's right pants is enabled. + // - 'text_filtering_enabled' (ElementTag(Boolean)): whether the player has text filtering enabled. Available only on MC 1.19+. + // - 'view_distance' (ElementTag(Number)): the player's current view distance. + // --> + PlayerTag.registerOnlineOnlyTag(MapTag.class, "client_options", (attribute, object) -> { + MapTag map = new MapTag(); + Player player = object.getPlayerEntity(); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { + map.putObject("allow_server_listings", new ElementTag(player.getClientOption(ClientOption.ALLOW_SERVER_LISTINGS))); + map.putObject("text_filtering_enabled", new ElementTag(player.getClientOption(ClientOption.TEXT_FILTERING_ENABLED))); + } + map.putObject("chat_colors_enabled", new ElementTag(player.getClientOption(ClientOption.CHAT_COLORS_ENABLED))); + map.putObject("chat_visibility", new ElementTag(player.getClientOption(ClientOption.CHAT_VISIBILITY))); + map.putObject("locale", new ElementTag(player.getClientOption(ClientOption.LOCALE))); + map.putObject("main_hand", new ElementTag(player.getClientOption(ClientOption.MAIN_HAND))); + MapTag skinParts = new MapTag(); + SkinParts parts = player.getClientOption(ClientOption.SKIN_PARTS); + skinParts.putObject("cape", new ElementTag(parts.hasCapeEnabled())); + skinParts.putObject("hat", new ElementTag(parts.hasHatsEnabled())); + skinParts.putObject("jacket", new ElementTag(parts.hasJacketEnabled())); + skinParts.putObject("left_sleeve", new ElementTag(parts.hasLeftSleeveEnabled())); + skinParts.putObject("right_sleeve", new ElementTag(parts.hasRightSleeveEnabled())); + skinParts.putObject("left_pants", new ElementTag(parts.hasLeftPantsEnabled())); + skinParts.putObject("right_pants", new ElementTag(parts.hasRightPantsEnabled())); + map.putObject("skin_parts", skinParts); + map.putObject("view_distance", new ElementTag(player.getClientOption(ClientOption.VIEW_DISTANCE))); + return map; + }); + // <--[mechanism] // @object PlayerTag // @name affects_monster_spawning From e500786bf9b6ef43751b9a4c779df99871aa0c7c Mon Sep 17 00:00:00 2001 From: hyper <39167664+heypr@users.noreply.github.com> Date: Mon, 3 Jun 2024 17:19:47 -0400 Subject: [PATCH 016/280] New 1.19+ `MaterialTag.is_enabled` tag (#2621) * Added new 1.19+ tag * Updated meta, need thoughts * Update material_types meta * Updated incorrect meta tag link --- .../denizenscript/denizen/objects/MaterialTag.java | 14 ++++++++++++++ .../denizen/tags/core/ServerTagBase.java | 1 + 2 files changed, 15 insertions(+) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/MaterialTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/MaterialTag.java index bf3503db0d..0ae48fa488 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/MaterialTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/MaterialTag.java @@ -671,6 +671,20 @@ public static void register() { return itemType.isEdible() ? new ElementTag(NMSHandler.itemHelper.getFoodPoints(itemType)) : null; }); } + + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { + + // <--[tag] + // @attribute ]> + // @returns ElementTag(Boolean) + // @description + // Returns whether the material is enabled in the specified world. + // If experimental features are disabled in the given world, and the MaterialTag is an item or block that is only enabled by experimental features, this will return false. + // --> + tagProcessor.registerTag(ElementTag.class, WorldTag.class, "is_enabled", (attribute, object, world) -> { + return new ElementTag(object.getMaterial().isEnabledByFeature(world.getWorld())); + }); + } } public static ObjectTagProcessor tagProcessor = new ObjectTagProcessor<>(); diff --git a/plugin/src/main/java/com/denizenscript/denizen/tags/core/ServerTagBase.java b/plugin/src/main/java/com/denizenscript/denizen/tags/core/ServerTagBase.java index 2ea4214c7b..7a921ad8c3 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/tags/core/ServerTagBase.java +++ b/plugin/src/main/java/com/denizenscript/denizen/tags/core/ServerTagBase.java @@ -807,6 +807,7 @@ else if (param.shouldBeType(EntityTag.class)) { // Returns a list of all materials known to the server. // Generally used with <@link objecttype MaterialTag>. // This is only types listed in the Bukkit Material enum, as seen at <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html>. + // Note: Some materials might be disabled in specific worlds, check using <@link tag MaterialTag.is_enabled>. // --> tagProcessor.registerStaticTag(ListTag.class, "material_types", (attribute, object) -> { listDeprecateWarn(attribute); From bf9c57654485c656dc7f8be337529e741d20b275 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Mon, 10 Jun 2024 22:22:20 +0100 Subject: [PATCH 017/280] `ItemTag.custom_data`, `raw_nbt` deprecation (#2625) * Initial `ItemRawNBT` update * custom data `ItemHelper` methods * `ItemScriptHelper`: add missing null checks * `ItemTag.custom_data`, `ItemTag.raw_nbt` updates * Minor fixes + renames --- .../denizen/nms/interfaces/ItemHelper.java | 12 ++ .../objects/properties/PropertyRegistry.java | 3 + .../properties/item/ItemBaseColor.java | 2 +- .../properties/item/ItemCustomData.java | 106 +++++++++++++ .../objects/properties/item/ItemRawNBT.java | 145 +++++++++--------- .../containers/core/ItemScriptHelper.java | 10 +- .../utilities/BukkitImplDeprecations.java | 3 + .../nms/v1_20/helpers/ItemHelperImpl.java | 36 +++++ 8 files changed, 241 insertions(+), 76 deletions(-) create mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemCustomData.java diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java index 72bc6e3e26..96b63f72eb 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java @@ -49,6 +49,18 @@ public abstract class ItemHelper { public abstract ItemStack setNbtData(ItemStack itemStack, CompoundTag compoundTag); + public CompoundTag getCustomData(ItemStack item) { // TODO: once 1.20 is the minimum supported version, remove default impl + return getNbtData(item); + } + + public ItemStack setCustomData(ItemStack item, CompoundTag data) { // TODO: once 1.20 is the minimum supported version, remove default impl + throw new UnsupportedOperationException(); + } + + public ItemStack setPartialOldNbt(ItemStack item, CompoundTag oldTag) { + throw new UnsupportedOperationException(); + } + public CompoundTag getEntityData(ItemStack item) { // TODO: once 1.20 is the minimum supported version, remove default impl CompoundTag nbt = getNbtData(item); return nbt != null && nbt.getValue().get("EntityTag") instanceof CompoundTag entityNbt ? entityNbt : null; diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java index ac267e4f72..26ebc514cc 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java @@ -214,6 +214,9 @@ public static void registerMainProperties() { PropertyParser.registerProperty(ItemCanDestroy.class, ItemTag.class); PropertyParser.registerProperty(ItemCanPlaceOn.class, ItemTag.class); PropertyParser.registerProperty(ItemColor.class, ItemTag.class); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + PropertyParser.registerProperty(ItemCustomData.class, ItemTag.class); + } PropertyParser.registerProperty(ItemCustomModel.class, ItemTag.class); PropertyParser.registerProperty(ItemChargedProjectile.class, ItemTag.class); PropertyParser.registerProperty(ItemEnchantments.class, ItemTag.class); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemBaseColor.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemBaseColor.java index a8a3b824fb..a20ccc1412 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemBaseColor.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemBaseColor.java @@ -70,7 +70,7 @@ else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { public void setBaseColor(DyeColor color, TagContext context) { if (color == null && getMaterial() == Material.SHIELD) { - ItemRawNBT property = ItemRawNBT.getFrom(object); + ItemRawNBT property = new ItemRawNBT(object); MapTag nbt = property.getFullNBTMap(); nbt.putObject("BlockEntityTag", null); property.setFullNBT(object, nbt, context, false); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemCustomData.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemCustomData.java new file mode 100644 index 0000000000..4c6ec96e47 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemCustomData.java @@ -0,0 +1,106 @@ +package com.denizenscript.denizen.objects.properties.item; + +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; +import com.denizenscript.denizen.nms.util.jnbt.CompoundTagBuilder; +import com.denizenscript.denizen.nms.util.jnbt.Tag; +import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.MapTag; +import com.denizenscript.denizencore.utilities.debugging.Debug; + +public class ItemCustomData extends ItemProperty { + + // <--[property] + // @object ItemTag + // @name custom_data + // @input MapTag + // @description + // Controls an item's custom NBT data, if any. + // The map is in NBT format, see <@link language Raw NBT Encoding>. + // This does not include any normal vanilla data (enchantments, lore, etc.), just extra custom data. + // This is useful for integrating with items from external systems (such as custom items from plugins), but item flags should be preferred otherwise. + // @mechanism + // Provide no input to clear custom data. + // @tag-example + // # Use to check if an item has custom data from another plugin. + // - if <[item].custom_data.get[external_plugin_data].if_null[null]> == external_custom_item: + // - narrate "You are using an item from an external plugin!" + // --> + + // Custom data added by Denizen + public static final String[] DENIZEN_DATA = new String[] { "Denizen Item Script", "DenizenItemScript", "Denizen NBT", "Denizen" }; + + public static boolean describes(ItemTag item) { + return !item.getBukkitMaterial().isAir(); + } + + public ItemCustomData(ItemTag item) { + this.object = item; + } + + @Override + public MapTag getPropertyValue() { + CompoundTag customData = NMSHandler.itemHelper.getCustomData(getItemStack()); + if (customData == null) { + return null; + } + if (customData.isEmpty()) { + return new MapTag(); + } + MapTag dataMap = (MapTag) ItemRawNBT.jnbtTagToObject(customData); + for (String denizenKey : DENIZEN_DATA) { + dataMap.remove(denizenKey); + } + return dataMap.isEmpty() ? null : dataMap; + } + + @Override + public void setPropertyValue(MapTag value, Mechanism mechanism) { + if (value == null) { + setItemStack(NMSHandler.itemHelper.setCustomData(getItemStack(), addDenizenKeys(null))); + return; + } + CompoundTag customData; + try { + customData = (CompoundTag) ItemRawNBT.convertObjectToNbt(value.identify(), mechanism.context, "(data)"); + } + catch (Exception ex) { + mechanism.echoError("Invalid custom data specified:"); + Debug.echoError(ex); + return; + } + if (customData == null) { + mechanism.echoError("Invalid custom data specified."); + return; + } + setItemStack(NMSHandler.itemHelper.setCustomData(getItemStack(), addDenizenKeys(customData))); + } + + private CompoundTag addDenizenKeys(CompoundTag tag) { + CompoundTag currentData = NMSHandler.itemHelper.getCustomData(getItemStack()); + if (currentData == null || currentData.isEmpty()) { + return tag; + } + CompoundTagBuilder tagBuilder = null; + for (String denizenKey : DENIZEN_DATA) { + Tag denizenValue = currentData.getValue().get(denizenKey); + if (denizenValue != null) { + if (tagBuilder == null) { + tagBuilder = tag != null ? tag.createBuilder() : CompoundTagBuilder.create(); + } + tagBuilder.put(denizenKey, denizenValue); + } + } + return tagBuilder != null ? tagBuilder.build() : tag; + } + + @Override + public String getPropertyId() { + return "custom_data"; + } + + public static void register() { + autoRegisterNullable("custom_data", ItemCustomData.class, MapTag.class, false); + } +} diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRawNBT.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRawNBT.java index f4436cf8bd..bd35663dc6 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRawNBT.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRawNBT.java @@ -1,15 +1,16 @@ package com.denizenscript.denizen.objects.properties.item; import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.nms.util.jnbt.*; import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizen.utilities.BukkitImplDeprecations; import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.ListTag; import com.denizenscript.denizencore.objects.core.MapTag; -import com.denizenscript.denizencore.objects.properties.Property; -import com.denizenscript.denizencore.tags.Attribute; +import com.denizenscript.denizencore.objects.properties.PropertyParser; import com.denizenscript.denizencore.tags.TagContext; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.denizenscript.denizencore.utilities.text.StringHolder; @@ -20,32 +21,15 @@ import java.util.List; import java.util.Map; -public class ItemRawNBT implements Property { +public class ItemRawNBT extends ItemProperty { - public static boolean describes(ObjectTag item) { + public static boolean describes(ItemTag item) { // All items can have raw NBT - return item instanceof ItemTag && ((ItemTag) item).getBukkitMaterial() != Material.AIR; + return item.getBukkitMaterial() != Material.AIR; } - public static ItemRawNBT getFrom(ObjectTag _item) { - if (!describes(_item)) { - return null; - } - else { - return new ItemRawNBT((ItemTag) _item); - } - } - - public static final String[] handledTags = new String[] { - "raw_nbt", "all_raw_nbt" - }; - - public static final String[] handledMechs = new String[] { - "raw_nbt" - }; - - public ItemRawNBT(ItemTag _item) { - item = _item; + public ItemRawNBT(ItemTag item) { + this.object = item; } public static String[] defaultNbtKeys = new String[] { @@ -93,7 +77,7 @@ public MapTag getNonDefaultNBTMap() { for (String key : defaultNbtKeys) { result.remove(key); } - if (item.getBukkitMaterial() == Material.ITEM_FRAME) { + if (getMaterial() == Material.ITEM_FRAME) { MapTag entityMap = (MapTag) result.getObject("EntityTag"); if (entityMap != null) { entityMap.putObject("Invisible", null); @@ -102,7 +86,7 @@ public MapTag getNonDefaultNBTMap() { } } } - if (item.getBukkitMaterial() == Material.ARMOR_STAND) { + if (getMaterial() == Material.ARMOR_STAND) { MapTag entityMap = (MapTag) result.getObject("EntityTag"); if (entityMap != null) { entityMap.putObject("Pose", null); @@ -120,7 +104,7 @@ public MapTag getNonDefaultNBTMap() { } public MapTag getFullNBTMap() { - CompoundTag compoundTag = NMSHandler.itemHelper.getNbtData(item.getItemStack()); + CompoundTag compoundTag = NMSHandler.itemHelper.getNbtData(getItemStack()); return (MapTag) jnbtTagToObject(compoundTag); } @@ -291,27 +275,75 @@ else if (tag instanceof EndTag) { } } - ItemTag item; + @Override + public MapTag getPropertyValue() { + if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_19)) { + MapTag nonDefaultNBT = getNonDefaultNBTMap(); + return nonDefaultNBT.isEmpty() ? null : nonDefaultNBT; + } + return null; + } @Override - public ObjectTag getObjectAttribute(Attribute attribute) { + public void setPropertyValue(MapTag value, Mechanism mechanism) { + if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_19)) { + setFullNBT(object, value, mechanism.context, true); + return; + } + BukkitImplDeprecations.oldNbtProperty.warn(mechanism.context); + CompoundTag oldNbtData; + try { + oldNbtData = (CompoundTag) ItemRawNBT.convertObjectToNbt(value.identify(), mechanism.context, "(item)"); + } + catch (Exception ex) { + mechanism.echoError("Invalid NBT data specified:"); + Debug.echoError(ex); + return; + } + if (oldNbtData == null) { + mechanism.echoError("Invalid NBT data specified."); + return; + } + setItemStack(NMSHandler.itemHelper.setPartialOldNbt(getItemStack(), oldNbtData)); + } - if (attribute == null) { - return null; - } + public static void register() { // <--[tag] // @attribute // @returns MapTag // @mechanism ItemTag.raw_nbt - // @group properties + // @deprecated use 'ItemTag.custom_data' // @description // Returns a map of all non-default raw NBT on this item. // Refer to format details at <@link language Raw NBT Encoding>. + // Deprecated in favor of <@link tag ItemTag.custom_data> on MC 1.20+. // --> - if (attribute.startsWith("raw_nbt")) { - return getNonDefaultNBTMap().getObjectAttribute(attribute.fulfill(1)); - } + PropertyParser.registerTag(ItemRawNBT.class, MapTag.class, "raw_nbt", (attribute, prop) -> { + if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_19)) { + return prop.getPropertyValue(); + } + BukkitImplDeprecations.oldNbtProperty.warn(attribute.context); + return new ItemCustomData(prop.object).getPropertyValue(); + }); + + // <--[mechanism] + // @object ItemTag + // @name raw_nbt + // @input MapTag + // @deprecated use 'ItemTag.custom_data' + // @description + // Sets the given map of raw NBT keys onto this item. + // Note that the input format must be strictly perfect. + // Refer to <@link language Raw NBT Encoding> for explanation of the input format. + // Deprecated in favor of <@link property ItemTag.custom_data> on MC 1.20+. + // @tags + // + // + // --> + PropertyParser.registerMechanism(ItemRawNBT.class, MapTag.class, "raw_nbt", (prop, mechanism, value) -> { + prop.setPropertyValue(value, mechanism); + }); // <--[tag] // @attribute @@ -322,22 +354,10 @@ public ObjectTag getObjectAttribute(Attribute attribute) { // Returns a map of all raw NBT on this item, including default values. // Refer to format details at <@link language Raw NBT Encoding>. // --> - if (attribute.startsWith("all_raw_nbt")) { - return getFullNBTMap().getObjectAttribute(attribute.fulfill(1)); - } - - return null; - } - - @Override - public String getPropertyString() { - MapTag nbt = getNonDefaultNBTMap(); - if (!nbt.isEmpty()) { - return nbt.identify(); - } - else { - return null; - } + // TODO: deprecate when raw properties property is added + PropertyParser.registerTag(ItemRawNBT.class, MapTag.class, "all_raw_nbt", (attribute, prop) -> { + return prop.getFullNBTMap(); + }); } @Override @@ -364,25 +384,4 @@ public void setFullNBT(ItemTag item, MapTag input, TagContext context, boolean r compoundTag = NMSHandler.instance.createCompoundTag(result); item.setItemStack(NMSHandler.itemHelper.setNbtData(item.getItemStack(), compoundTag)); } - - @Override - public void adjust(Mechanism mechanism) { - - // <--[mechanism] - // @object ItemTag - // @name raw_nbt - // @input MapTag - // @description - // Sets the given map of raw NBT keys onto this item. - // Note that the input format must be strictly perfect. - // Refer to <@link language Raw NBT Encoding> for explanation of the input format. - // @tags - // - // - // --> - if (mechanism.matches("raw_nbt") && mechanism.requireObject(MapTag.class)) { - MapTag input = mechanism.valueAsType(MapTag.class); - setFullNBT(item, input, mechanism.context, true); - } - } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptHelper.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptHelper.java index 112039e0e4..72724c7c4f 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptHelper.java @@ -369,7 +369,10 @@ public static String getItemScriptNameText(ItemStack item) { if (item == null) { return null; } - CompoundTag tag = NMSHandler.itemHelper.getNbtData(item); + CompoundTag tag = NMSHandler.itemHelper.getCustomData(item); + if (tag == null) { + return null; + } String scriptName = tag.getString("DenizenItemScript"); if (scriptName != null && !scriptName.equals("")) { return scriptName; @@ -389,7 +392,10 @@ public static ItemScriptContainer getItemScriptContainer(ItemStack item) { if (item == null) { return null; } - CompoundTag tag = NMSHandler.itemHelper.getNbtData(item); + CompoundTag tag = NMSHandler.itemHelper.getCustomData(item); + if (tag == null) { + return null; + } String scriptName = tag.getString("DenizenItemScript"); if (scriptName != null && !scriptName.equals("")) { return item_scripts.get(scriptName); 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 300a878dfc..09eabf93a7 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java @@ -232,6 +232,9 @@ public class BukkitImplDeprecations { // 2023-year-end commonality: #31 public static Warning legacyAttributeProperties = new SlowWarning("legacyAttributeProperties", "The 'attribute' properties are deprecated in favor of the 'attribute_modifiers' properties which more fully implement the attribute system."); + // Added 2024/05/31 + public static Warning oldNbtProperty = new SlowWarning("oldNbtProperty", "'ItemTag.raw_nbt' is deprecated in favor of 'ItemTag.custom_data', as item NBT was removed by Mojang in favor of item components."); + // ==================== VERY SLOW deprecations ==================== // These are only shown minimally, so server owners are aware of them but not bugged by them. Only servers with active scripters (using 'ex reload') will see them often. diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java index f777b94d12..7fcf984016 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java @@ -18,6 +18,7 @@ import com.google.common.collect.*; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; +import com.mojang.serialization.Dynamic; import net.md_5.bungee.api.ChatColor; import net.minecraft.advancements.critereon.BlockPredicate; import net.minecraft.core.*; @@ -25,10 +26,12 @@ import net.minecraft.core.component.DataComponentType; import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.NbtUtils; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; +import net.minecraft.util.datafix.fixes.References; import net.minecraft.world.item.AdventureModePredicate; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; @@ -250,6 +253,39 @@ public ItemStack setNbtData(ItemStack itemStack, CompoundTag compoundTag) { return CraftItemStack.asBukkitCopy(nmsItemStack); } + @Override + public CompoundTag getCustomData(ItemStack item) { + CustomData customData = CraftItemStack.asNMSCopy(item).get(DataComponents.CUSTOM_DATA); + return customData != null ? CompoundTagImpl.fromNMSTag(customData.getUnsafe()) : null; + } + + @Override + public ItemStack setCustomData(ItemStack item, CompoundTag data) { + net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item); + if (data == null) { + nmsItemStack.remove(DataComponents.CUSTOM_DATA); + } + else { + nmsItemStack.set(DataComponents.CUSTOM_DATA, CustomData.of(((CompoundTagImpl) data).toNMSTag())); + } + return CraftItemStack.asBukkitCopy(nmsItemStack); + } + + public static final int DATA_VERSION_1_20_4 = 3700; + + @Override + public ItemStack setPartialOldNbt(ItemStack item, CompoundTag oldTag) { + int currentDataVersion = CraftMagicNumbers.INSTANCE.getDataVersion(); + net.minecraft.nbt.CompoundTag nmsOldTag = new net.minecraft.nbt.CompoundTag(); + nmsOldTag.putString("id", item.getType().getKey().toString()); + nmsOldTag.putByte("Count", (byte) item.getAmount()); + nmsOldTag.put("tag", ((CompoundTagImpl) oldTag).toNMSTag()); + net.minecraft.nbt.CompoundTag nmsUpdatedTag = (net.minecraft.nbt.CompoundTag) MinecraftServer.getServer().fixerUpper.update(References.ITEM_STACK, new Dynamic<>(NbtOps.INSTANCE, nmsOldTag), DATA_VERSION_1_20_4, currentDataVersion).getValue(); + net.minecraft.nbt.CompoundTag nmsCurrentTag = (net.minecraft.nbt.CompoundTag) CraftItemStack.asNMSCopy(item).save(CraftRegistry.getMinecraftRegistry()); + net.minecraft.nbt.CompoundTag nmsMergedTag = nmsCurrentTag.merge(nmsUpdatedTag); + return CraftItemStack.asBukkitCopy(net.minecraft.world.item.ItemStack.parse(CraftRegistry.getMinecraftRegistry(), nmsMergedTag).orElseThrow()); + } + @Override public CompoundTag getEntityData(ItemStack item) { CustomData entityData = CraftItemStack.asNMSCopy(item).get(DataComponents.ENTITY_DATA); From 562f269a4a5b5e4b4bbe30bc905b5cbbc9f1cea7 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Thu, 13 Jun 2024 19:06:18 +0100 Subject: [PATCH 018/280] 1.21 part 1: copy over 1.20 files --- v1_21/pom.xml | 81 ++ .../denizen/nms/v1_20/Handler.java | 438 +++++++++ .../nms/v1_20/ReflectionMappingsInfo.java | 136 +++ .../v1_20/helpers/AdvancementHelperImpl.java | 180 ++++ .../v1_20/helpers/AnimationHelperImpl.java | 47 + .../nms/v1_20/helpers/BlockHelperImpl.java | 315 +++++++ .../nms/v1_20/helpers/ChunkHelperImpl.java | 119 +++ .../v1_20/helpers/CustomEntityHelperImpl.java | 149 ++++ .../v1_20/helpers/EnchantmentHelperImpl.java | 222 +++++ .../v1_20/helpers/EntityDataNameMapper.java | 452 ++++++++++ .../nms/v1_20/helpers/EntityHelperImpl.java | 841 ++++++++++++++++++ .../nms/v1_20/helpers/FishingHelperImpl.java | 160 ++++ .../nms/v1_20/helpers/ItemHelperImpl.java | 611 +++++++++++++ .../nms/v1_20/helpers/PacketHelperImpl.java | 431 +++++++++ .../nms/v1_20/helpers/PlayerHelperImpl.java | 470 ++++++++++ .../nms/v1_20/helpers/WorldHelperImpl.java | 111 +++ .../denizen/nms/v1_20/impl/BiomeNMSImpl.java | 195 ++++ .../v1_20/impl/ImprovedOfflinePlayerImpl.java | 149 ++++ .../nms/v1_20/impl/ProfileEditorImpl.java | 135 +++ .../denizen/nms/v1_20/impl/SidebarImpl.java | 104 +++ .../nms/v1_20/impl/blocks/BlockLightImpl.java | 264 ++++++ .../impl/entities/CraftFakeArrowImpl.java | 27 + .../impl/entities/CraftFakePlayerImpl.java | 66 ++ .../entities/CraftItemProjectileImpl.java | 117 +++ .../impl/entities/EntityFakeArrowImpl.java | 43 + .../impl/entities/EntityFakePlayerImpl.java | 44 + .../entities/EntityItemProjectileImpl.java | 103 +++ .../nms/v1_20/impl/jnbt/CompoundTagImpl.java | 137 +++ .../impl/network/fakes/FakeChannelImpl.java | 80 ++ .../network/fakes/FakeNetworkManagerImpl.java | 16 + .../fakes/FakePlayerConnectionImpl.java | 20 + .../handlers/AbstractListenerPlayInImpl.java | 526 +++++++++++ .../handlers/DenizenNetworkManagerImpl.java | 555 ++++++++++++ .../handlers/DenizenPacketListenerImpl.java | 122 +++ .../network/handlers/FakeBlockHelper.java | 167 ++++ .../packet/ActionBarEventPacketHandlers.java | 39 + .../handlers/packet/AttachPacketHandlers.java | 312 +++++++ .../packet/BlockLightPacketHandlers.java | 27 + .../DenizenPacketHandlerPacketHandlers.java | 47 + .../packet/DisguisePacketHandlers.java | 146 +++ .../packet/EntityMetadataPacketHandlers.java | 92 ++ .../packet/FakeBlocksPacketHandlers.java | 112 +++ .../packet/FakeEquipmentPacketHandlers.java | 138 +++ .../packet/FakePlayerPacketHandlers.java | 29 + .../packet/HiddenEntitiesPacketHandlers.java | 67 ++ .../packet/HideParticlesPacketHandlers.java | 31 + .../PlayerHearsSoundEventPacketHandlers.java | 39 + .../TablistUpdateEventPacketHandlers.java | 129 +++ .../PacketInResourcePackStatusImpl.java | 18 + .../packets/PacketInSteerVehicleImpl.java | 33 + .../network/packets/PacketOutChatImpl.java | 70 ++ 51 files changed, 8962 insertions(+) create mode 100644 v1_21/pom.xml create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/ReflectionMappingsInfo.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AdvancementHelperImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AnimationHelperImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ChunkHelperImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/CustomEntityHelperImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EnchantmentHelperImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityDataNameMapper.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/FishingHelperImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PacketHelperImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PlayerHelperImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/WorldHelperImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/BiomeNMSImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ImprovedOfflinePlayerImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ProfileEditorImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/SidebarImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/blocks/BlockLightImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakeArrowImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakePlayerImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftItemProjectileImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakeArrowImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakePlayerImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityItemProjectileImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/jnbt/CompoundTagImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/fakes/FakeChannelImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/fakes/FakeNetworkManagerImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/fakes/FakePlayerConnectionImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/AbstractListenerPlayInImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenNetworkManagerImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenPacketListenerImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/FakeBlockHelper.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/ActionBarEventPacketHandlers.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/AttachPacketHandlers.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/BlockLightPacketHandlers.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DenizenPacketHandlerPacketHandlers.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DisguisePacketHandlers.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/EntityMetadataPacketHandlers.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeBlocksPacketHandlers.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakePlayerPacketHandlers.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/HideParticlesPacketHandlers.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/PlayerHearsSoundEventPacketHandlers.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketInResourcePackStatusImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketInSteerVehicleImpl.java create mode 100644 v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketOutChatImpl.java diff --git a/v1_21/pom.xml b/v1_21/pom.xml new file mode 100644 index 0000000000..61654c87cf --- /dev/null +++ b/v1_21/pom.xml @@ -0,0 +1,81 @@ + + + 4.0.0 + + com.denizenscript + denizen-v1_20 + 1.3.0-SNAPSHOT + + + + com.denizenscript + denizen + ${project.version} + compile + true + + + org.spigotmc + spigot-api + 1.20.6-R0.1-SNAPSHOT + provided + + + org.spigotmc + spigot + 1.20.6-R0.1-SNAPSHOT + remapped-mojang + provided + + + + + + + net.md-5 + specialsource-maven-plugin + 2.0.2 + + + package + + remap + + remap-obf + + org.spigotmc:minecraft-server:1.20.6-R0.1-SNAPSHOT:txt:maps-mojang + true + org.spigotmc:spigot:1.20.6-R0.1-SNAPSHOT:jar:remapped-mojang + true + remapped-obf + + + + package + + remap + + remap-spigot + + ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar + org.spigotmc:minecraft-server:1.20.6-R0.1-SNAPSHOT:csrg:maps-spigot + org.spigotmc:spigot:1.20.6-R0.1-SNAPSHOT:jar:remapped-obf + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.10.1 + + 16 + 16 + + + + + + diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java new file mode 100644 index 0000000000..b6dc825435 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java @@ -0,0 +1,438 @@ +package com.denizenscript.denizen.nms.v1_20; + +import com.denizenscript.denizen.Denizen; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.abstracts.*; +import com.denizenscript.denizen.nms.util.PlayerProfile; +import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; +import com.denizenscript.denizen.nms.util.jnbt.Tag; +import com.denizenscript.denizen.nms.v1_20.helpers.*; +import com.denizenscript.denizen.nms.v1_20.impl.BiomeNMSImpl; +import com.denizenscript.denizen.nms.v1_20.impl.ProfileEditorImpl; +import com.denizenscript.denizen.nms.v1_20.impl.SidebarImpl; +import com.denizenscript.denizen.nms.v1_20.impl.blocks.BlockLightImpl; +import com.denizenscript.denizen.nms.v1_20.impl.jnbt.CompoundTagImpl; +import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizen.objects.LocationTag; +import com.denizenscript.denizen.objects.MaterialTag; +import com.denizenscript.denizen.objects.properties.item.ItemRawNBT; +import com.denizenscript.denizen.utilities.FormattedTextHelper; +import com.denizenscript.denizen.utilities.PaperAPITools; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.objects.core.MapTag; +import com.denizenscript.denizencore.objects.core.QuaternionTag; +import com.denizenscript.denizencore.scripts.commands.core.ReflectionSetCommand; +import com.denizenscript.denizencore.utilities.CoreConfiguration; +import com.denizenscript.denizencore.utilities.CoreUtilities; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import com.google.common.collect.Iterables; +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.properties.Property; +import com.mojang.authlib.yggdrasil.ProfileResult; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.hover.content.Content; +import net.md_5.bungee.api.chat.hover.content.Item; +import net.md_5.bungee.api.chat.hover.content.Text; +import net.md_5.bungee.chat.ComponentSerializer; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.core.Rotations; +import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.ByteArrayTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.TagParser; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.BossEvent; +import net.minecraft.world.Container; +import net.minecraft.world.Nameable; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.state.BlockState; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.boss.BossBar; +import org.bukkit.craftbukkit.v1_20_R4.CraftRegistry; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_20_R4.boss.CraftBossBar; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftInventory; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftInventoryCustom; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftInventoryView; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R4.persistence.CraftPersistentDataContainer; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftChatMessage; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftLocation; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftMagicNumbers; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.persistence.PersistentDataContainer; +import org.joml.Quaternionf; +import org.joml.Vector3f; +import org.spigotmc.AsyncCatcher; + +import java.lang.invoke.MethodHandle; +import java.lang.reflect.Field; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.function.Function; + +public class Handler extends NMSHandler { + + public Handler() { + advancementHelper = new AdvancementHelperImpl(); + animationHelper = new AnimationHelperImpl(); + blockHelper = new BlockHelperImpl(); + chunkHelper = new ChunkHelperImpl(); + customEntityHelper = new CustomEntityHelperImpl(); + entityHelper = new EntityHelperImpl(); + fishingHelper = new FishingHelperImpl(); + itemHelper = new ItemHelperImpl(); + packetHelper = new PacketHelperImpl(); + particleHelper = new ParticleHelper(); + playerHelper = new PlayerHelperImpl(); + worldHelper = new WorldHelperImpl(); + enchantmentHelper = new EnchantmentHelperImpl(); + + registerConversion(ItemTag.class, ItemStack.class, item -> CraftItemStack.asNMSCopy(item.getItemStack())); + registerConversion(ElementTag.class, Component.class, element -> componentToNMS(FormattedTextHelper.parse(element.asString(), ChatColor.WHITE))); + registerConversion(MaterialTag.class, BlockState.class, material -> ((CraftBlockData) material.getModernData()).getState()); + registerConversion(LocationTag.class, Rotations.class, location -> new Rotations((float) location.getX(), (float) location.getY(), (float) location.getZ())); + registerConversion(LocationTag.class, BlockPos.class, CraftLocation::toBlockPosition); + registerConversion(MapTag.class, net.minecraft.nbt.CompoundTag.class, map -> + ItemRawNBT.convertObjectToNbt(map.identify(), CoreUtilities.noDebugContext, "(item).") instanceof CompoundTagImpl compoundTag ? compoundTag.toNMSTag() : null); + registerConversion(LocationTag.class, Vector3f.class, location -> new Vector3f((float) location.getX(), (float) location.getY(), (float) location.getZ())); + registerConversion(QuaternionTag.class, Quaternionf.class, quaternion -> new Quaternionf(quaternion.x, quaternion.y, quaternion.z, quaternion.w)); + } + + public static
void registerConversion(Class
denizenType, Class javaType, Function convertor) { + ReflectionSetCommand.typeConverters.put(javaType, objectTag -> { + DT denizenObject = objectTag.asType(denizenType, CoreUtilities.noDebugContext); + return denizenObject != null ? convertor.apply(denizenObject) : null; + }); + } + + private final ProfileEditor profileEditor = new ProfileEditorImpl(); + + private boolean wasAsyncCatcherEnabled; + + @Override + public void disableAsyncCatcher() { + wasAsyncCatcherEnabled = AsyncCatcher.enabled; + AsyncCatcher.enabled = false; + } + + @Override + public void undisableAsyncCatcher() { + AsyncCatcher.enabled = wasAsyncCatcherEnabled; + } + + @Override + public boolean isCorrectMappingsCode() { + return ((CraftMagicNumbers) CraftMagicNumbers.INSTANCE).getMappingsVersion().equals("ee13f98a43b9c5abffdcc0bb24154460"); + } + + @Override + public double[] getRecentTps() { + return ((CraftServer) Bukkit.getServer()).getServer().recentTps; + } + + @Override + public CompoundTag createCompoundTag(Map value) { + return new CompoundTagImpl(value); + } + + @Override + public CompoundTag parseSNBT(String snbt) { + try { + return CompoundTagImpl.fromNMSTag(TagParser.parseTag(snbt)); + } + catch (CommandSyntaxException e) { + return null; + } + } + + @Override + public Sidebar createSidebar(Player player) { + return new SidebarImpl(player); + } + + @Override + public BlockLight createBlockLight(Location location, int lightLevel, long ticks) { + return BlockLightImpl.createLight(location, lightLevel, ticks); + } + + @Override + public PlayerProfile fillPlayerProfile(PlayerProfile playerProfile) { + if (playerProfile == null) { + return null; + } + if (playerProfile.getName() == null && playerProfile.getUniqueId() == null) { + return playerProfile; // Cannot fill without lookup data + } + if (playerProfile.hasTexture() && playerProfile.hasTextureSignature() && playerProfile.getName() != null && playerProfile.getUniqueId() != null) { + return playerProfile; // Already filled + } + try { + GameProfile profile = null; + MinecraftServer minecraftServer = ((CraftServer) Bukkit.getServer()).getServer(); + if (playerProfile.getUniqueId() != null) { + profile = minecraftServer.getProfileCache().get(playerProfile.getUniqueId()).orElse(null); + } + if (profile == null && playerProfile.getName() != null) { + profile = minecraftServer.getProfileCache().get(playerProfile.getName()).orElse(null); + } + if (profile == null) { + profile = ProfileEditorImpl.getGameProfileNoProperties(playerProfile); + } + Property textures = profile.getProperties().containsKey("textures") ? Iterables.getFirst(profile.getProperties().get("textures"), null) : null; + if (textures == null || !textures.hasSignature() || profile.getName() == null || profile.getId() == null) { + ProfileResult actualProfile = minecraftServer.getSessionService().fetchProfile(profile.getId(), true); + if (actualProfile == null) { + return null; + } + profile = actualProfile.profile(); + textures = profile.getProperties().containsKey("textures") ? Iterables.getFirst(profile.getProperties().get("textures"), null) : null; + } + return new PlayerProfile(profile.getName(), profile.getId(), textures == null ? null : textures.value(), textures == null ? null : textures.signature()); + } + catch (Exception e) { + if (CoreConfiguration.debugVerbose) { + Debug.echoError(e); + } + } + return null; + } + + public static MethodHandle PAPER_INVENTORY_TITLE_GETTER; + + @Override + public String getTitle(Inventory inventory) { + Container nms = ((CraftInventory) inventory).getInventory(); + if (inventory instanceof CraftInventoryCustom && Denizen.supportsPaper) { + try { + if (PAPER_INVENTORY_TITLE_GETTER == null) { + PAPER_INVENTORY_TITLE_GETTER = ReflectionHelper.getMethodHandle(nms.getClass(), "title"); + } + return PaperAPITools.instance.parseComponent(PAPER_INVENTORY_TITLE_GETTER.invoke(nms)); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + if (nms instanceof Nameable) { + return CraftChatMessage.fromComponent(((Nameable) nms).getDisplayName()); + } + else if (MINECRAFT_INVENTORY.isInstance(nms)) { + try { + return (String) INVENTORY_TITLE.get(nms); + } + catch (IllegalAccessException e) { + Debug.echoError(e); + } + } + return "Chest"; + } + + public static MethodHandle AbstractContainerMenu_title_SETTER = ReflectionHelper.getFinalSetter(AbstractContainerMenu.class, "title"); + + @Override + public void setInventoryTitle(InventoryView view, String title) { + AbstractContainerMenu menu = ((CraftInventoryView) view).getHandle(); + try { + AbstractContainerMenu_title_SETTER.invoke(menu, componentToNMS(FormattedTextHelper.parse(title, ChatColor.DARK_GRAY))); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + public static final Class MINECRAFT_INVENTORY; + public static final Field INVENTORY_TITLE; + public static final Field ENTITY_BUKKITYENTITY = ReflectionHelper.getFields(Entity.class).get("bukkitEntity"); + + static { + Class minecraftInv = null; + Field title = null; + try { + for (Class clzz : CraftInventoryCustom.class.getDeclaredClasses()) { + if (CoreUtilities.toLowerCase(clzz.getName()).contains("minecraftinventory")) { // MinecraftInventory. + minecraftInv = clzz; + title = clzz.getDeclaredField("title"); + title.setAccessible(true); + break; + } + } + } + catch (Exception e) { + e.printStackTrace(); + } + MINECRAFT_INVENTORY = minecraftInv; + INVENTORY_TITLE = title; + } + + @Override + public PlayerProfile getPlayerProfile(Player player) { + GameProfile gameProfile = ((CraftPlayer) player).getProfile(); + Property property = Iterables.getFirst(gameProfile.getProperties().get("textures"), null); + return new PlayerProfile(gameProfile.getName(), gameProfile.getId(), + property != null ? property.value() : null, + property != null ? property.signature() : null); + } + + @Override + public ProfileEditor getProfileEditor() { + return profileEditor; + } + + @Override + public List getBiomes(World world) { + ServerLevel level = ((CraftWorld) world).getHandle(); + ArrayList output = new ArrayList<>(); + for (Map.Entry, Biome> pair : level.registryAccess().registryOrThrow(Registries.BIOME).entrySet()) { + output.add(new BiomeNMSImpl(level, pair.getKey().location().toString())); + } + return output; + } + + @Override + public BiomeNMS getBiomeNMS(World world, String name) { + BiomeNMSImpl impl = new BiomeNMSImpl(((CraftWorld) world).getHandle(), name); + if (impl.biomeHolder == null) { + return null; + } + return impl; + } + + @Override + public BiomeNMS getBiomeAt(Block block) { + // Based on CraftWorld source + ServerLevel level = ((CraftWorld) block.getWorld()).getHandle(); + Holder biome = level.getNoiseBiome(block.getX() >> 2, block.getY() >> 2, block.getZ() >> 2); + ResourceLocation key = level.registryAccess().registryOrThrow(Registries.BIOME).getKey(biome.value()); + String keyText = key.getNamespace().equals("minecraft") ? key.getPath() : key.toString(); + return new BiomeNMSImpl(level, keyText); + } + + @Override + public String stringForHover(HoverEvent hover) { + if (hover.getContents().isEmpty()) { + return ""; + } + Content contentObject = hover.getContents().get(0); + if (contentObject instanceof Text) { + Object value = ((Text) contentObject).getValue(); + if (value instanceof BaseComponent[]) { + return FormattedTextHelper.stringify((BaseComponent[]) value); + } + else { + return value.toString(); + } + } + else if (contentObject instanceof Item) { + Item item = (Item) contentObject; + try { + net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag(); + tag.putString("id", item.getId()); + tag.putByte("Count", item.getCount() == -1 ? 1 : (byte) item.getCount()); + if (item.getTag() != null && item.getTag().getNbt() != null) { + tag.put("tag", TagParser.parseTag(item.getTag().getNbt())); + } + // TODO: 1.20.6: use components and fallback to creating item from tag when custom NBT is specified + ItemStack nmsStack = ItemStack.parseOptional(CraftRegistry.getMinecraftRegistry(), tag); + return new ItemTag(CraftItemStack.asBukkitCopy(nmsStack)).identify(); + } + catch (Throwable ex) { + Debug.echoError(ex); + return null; + } + } + else if (contentObject instanceof net.md_5.bungee.api.chat.hover.content.Entity) { + net.md_5.bungee.api.chat.hover.content.Entity entity = (net.md_5.bungee.api.chat.hover.content.Entity) contentObject; + // TODO: Maybe a stabler way of doing this? + return "e@" + entity.getId(); + } + else { + throw new UnsupportedOperationException(); + } + } + + @Override + public ArrayList containerListFlags(PersistentDataContainer container, String prefix) { + prefix = "denizen:" + prefix; + ArrayList output = new ArrayList<>(); + for (String key : ((CraftPersistentDataContainer) container).getRaw().keySet()) { + if (key.startsWith(prefix)) { + output.add(key.substring(prefix.length())); + } + } + return output; + } + + @Override + public boolean containerHas(PersistentDataContainer container, String key) { + return ((CraftPersistentDataContainer) container).getRaw().containsKey(key); + } + + @Override + public String containerGetString(PersistentDataContainer container, String key) { + net.minecraft.nbt.Tag base = ((CraftPersistentDataContainer) container).getRaw().get(key); + if (base instanceof StringTag) { + return base.getAsString(); + } + else if (base instanceof ByteArrayTag) { + return new String(((ByteArrayTag) base).getAsByteArray(), StandardCharsets.UTF_8); + } + return null; + } + + @Override + public UUID getBossbarUUID(BossBar bar) { + return ((CraftBossBar) bar).getHandle().getId(); + } + + public static MethodHandle BOSSBAR_ID_SETTER = ReflectionHelper.getFinalSetterForFirstOfType(BossEvent.class, UUID.class); + + @Override + public void setBossbarUUID(BossBar bar, UUID id) { + try { + BOSSBAR_ID_SETTER.invoke(((CraftBossBar) bar).getHandle(), id); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + public static BaseComponent[] componentToSpigot(Component nms) { + if (nms == null) { + return null; + } + return ComponentSerializer.parse(CraftChatMessage.toJSON(nms)); + } + + public static Component componentToNMS(BaseComponent[] spigot) { + if (spigot == null) { + return null; + } + return CraftChatMessage.fromJSONOrNull(FormattedTextHelper.componentToJson(spigot)); + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/ReflectionMappingsInfo.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/ReflectionMappingsInfo.java new file mode 100644 index 0000000000..397b0f80ce --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/ReflectionMappingsInfo.java @@ -0,0 +1,136 @@ +package com.denizenscript.denizen.nms.v1_20; + +public class ReflectionMappingsInfo { + + // Content generated by ReflectionMappingsGenerator - https://github.com/DenizenScript/ReflectionMappingsGenerator + + // net.minecraft.world.level.block.state.BlockBehaviour + public static String BlockBehaviour_explosionResistance = "aH"; + + // net.minecraft.core.MappedRegistry + public static String MappedRegistry_frozen = "l"; + public static String MappedRegistry_unregisteredIntrusiveHolders = "m"; + + // net.minecraft.world.item.crafting.RecipeManager + public static String RecipeManager_byName = "e"; + + // net.minecraft.world.entity.Entity + public static String Entity_onGround = "aI"; + public static String Entity_DATA_SHARED_FLAGS_ID = "ap"; + public static String Entity_DATA_CUSTOM_NAME = "aS"; + public static String Entity_DATA_CUSTOM_NAME_VISIBLE = "aT"; + + // net.minecraft.world.entity.LivingEntity + public static String LivingEntity_attackStrengthTicker = "aT"; + public static String LivingEntity_autoSpinAttackTicks = "bC"; + public static String LivingEntity_setLivingEntityFlag_method = "c"; + + // net.minecraft.world.entity.player.Player + public static String Player_DATA_PLAYER_ABSORPTION_ID = "d"; + public static String Player_DATA_PLAYER_MODE_CUSTOMISATION = "bV"; + + // net.minecraft.server.level.ServerPlayer + public static String ServerPlayer_respawnForced = "dl"; + + // net.minecraft.world.entity.monster.EnderMan + public static String EnderMan_DATA_CREEPY = "ca"; + + // net.minecraft.world.entity.monster.Zombie + public static String Zombie_inWaterTime = "ci"; + + // net.minecraft.world.item.Item + public static String Item_components = "c"; + + // net.minecraft.world.level.Level + public static String Level_isClientSide = "B"; + + // net.minecraft.server.level.ThreadedLevelLightEngine + public static String ThreadedLevelLightEngine_addTask_method = "a"; + + // net.minecraft.server.level.ThreadedLevelLightEngine$TaskType + public static String ThreadedLevelLightEngineTaskType_PRE_UPDATE = "a"; + + // net.minecraft.world.entity.ExperienceOrb + public static String ExperienceOrb_age = "g"; + + // net.minecraft.world.entity.item.ItemEntity + public static String ItemEntity_DATA_ITEM = "d"; + + // net.minecraft.world.level.biome.Biome + public static String Biome_climateSettings = "i"; + + // net.minecraft.world.level.biome.BiomeSpecialEffects + public static String BiomeSpecialEffects_foliageColorOverride = "f"; + public static String BiomeSpecialEffects_fogColor = "b"; + public static String BiomeSpecialEffects_waterFogColor = "d"; + + // net.minecraft.network.Connection + public static String Connection_receiving = "k"; + public static String Connection_packetListener = "q"; + + // net.minecraft.server.network.ServerGamePacketListenerImpl + public static String ServerGamePacketListenerImpl_aboveGroundTickCount = "J"; + public static String ServerGamePacketListenerImpl_aboveGroundVehicleTickCount = "L"; + public static String ServerGamePacketListenerImpl_awaitingPositionFromClient = "F"; + public static String ServerGamePacketListenerImpl_awaitingTeleport = "G"; + public static String ServerGamePacketListenerImpl_chunkSender = "g"; + + // net.minecraft.server.network.ServerCommonPacketListenerImpl + public static String ServerCommonPacketListenerImpl_connection = "e"; + + // net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket + public static String ClientboundPlayerAbilitiesPacket_walkingSpeed = "k"; + + // net.minecraft.network.protocol.game.ClientboundSectionBlocksUpdatePacket + public static String ClientboundSectionBlocksUpdatePacket_sectionPos = "c"; + public static String ClientboundSectionBlocksUpdatePacket_positions = "d"; + public static String ClientboundSectionBlocksUpdatePacket_states = "e"; + + // net.minecraft.network.protocol.game.ClientboundMoveEntityPacket + public static String ClientboundMoveEntityPacket_xa = "b"; + public static String ClientboundMoveEntityPacket_ya = "c"; + public static String ClientboundMoveEntityPacket_za = "d"; + public static String ClientboundMoveEntityPacket_yRot = "e"; + public static String ClientboundMoveEntityPacket_xRot = "f"; + + // net.minecraft.network.protocol.game.ClientboundSetEntityMotionPacket + public static String ClientboundSetEntityMotionPacket_id = "b"; + + // net.minecraft.network.protocol.game.ClientboundSetPassengersPacket + public static String ClientboundSetPassengersPacket_passengers = "c"; + + // net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket + public static String ClientboundTeleportEntityPacket_id = "b"; + public static String ClientboundTeleportEntityPacket_x = "c"; + public static String ClientboundTeleportEntityPacket_y = "d"; + public static String ClientboundTeleportEntityPacket_z = "e"; + public static String ClientboundTeleportEntityPacket_yRot = "f"; + public static String ClientboundTeleportEntityPacket_xRot = "g"; + + // net.minecraft.network.protocol.game.ClientboundLevelChunkPacketData$BlockEntityInfo + public static String ClientboundLevelChunkPacketDataBlockEntityInfo_packedXZ = "c"; + public static String ClientboundLevelChunkPacketDataBlockEntityInfo_y = "d"; + + // net.minecraft.network.syncher.SynchedEntityData + public static String SynchedEntityData_itemsById = "e"; + + // net.minecraft.world.entity.projectile.FishingHook + public static String FishingHook_nibble = "j"; + public static String FishingHook_timeUntilLured = "k"; + public static String FishingHook_timeUntilHooked = "l"; + + // net.minecraft.tags.TagNetworkSerialization$NetworkPayload + public static String TagNetworkSerializationNetworkPayload_tags = "a"; + + // net.minecraft.core.HolderSet$Named + public static String HolderSetNamed_bind_method = "b"; + + // net.minecraft.core.Holder$Reference + public static String HolderReference_bindTags_method = "a"; + + // net.minecraft.server.level.ServerLevel + public static String ServerLevel_sleepStatus = "P"; + + // net.minecraft.world.item.AdventureModePredicate + public static String AdventureModePredicate_predicates = "h"; +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AdvancementHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AdvancementHelperImpl.java new file mode 100644 index 0000000000..3e0d4dd07f --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AdvancementHelperImpl.java @@ -0,0 +1,180 @@ +package com.denizenscript.denizen.nms.v1_20.helpers; + +import com.denizenscript.denizen.nms.interfaces.AdvancementHelper; +import com.denizenscript.denizen.nms.v1_20.Handler; +import com.denizenscript.denizen.utilities.FormattedTextHelper; +import com.google.common.collect.ImmutableMap; +import net.md_5.bungee.api.ChatColor; +import net.minecraft.advancements.*; +import net.minecraft.advancements.critereon.ImpossibleTrigger; +import net.minecraft.network.protocol.game.ClientboundUpdateAdvancementsPacket; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.PlayerAdvancements; +import net.minecraft.server.ServerAdvancementManager; +import net.minecraft.server.level.ServerPlayer; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftNamespacedKey; +import org.bukkit.entity.Player; + +import java.util.*; + +public class AdvancementHelperImpl extends AdvancementHelper { + + private static final String IMPOSSIBLE_KEY = "impossible"; + private static final Map> IMPOSSIBLE_CRITERIA = Map.of(IMPOSSIBLE_KEY, new Criterion<>(new ImpossibleTrigger(), new ImpossibleTrigger.TriggerInstance())); + private static final List> IMPOSSIBLE_REQUIREMENTS = List.of(List.of(IMPOSSIBLE_KEY)); + + public static ServerAdvancementManager getNMSAdvancementManager() { + return ((CraftServer) Bukkit.getServer()).getServer().getAdvancements(); + } + + @Override + public void register(com.denizenscript.denizen.nms.util.Advancement advancement) { + if (advancement.temporary || advancement.registered) { + return; + } + AdvancementHolder nmsAdvancementHolder = asNMSCopy(advancement); + Map nmsAdvancements = getNMSAdvancementManager().advancements; + ImmutableMap.Builder mapBuilder = ImmutableMap.builderWithExpectedSize(nmsAdvancements.size() + 1); + mapBuilder.putAll(nmsAdvancements); + mapBuilder.put(nmsAdvancementHolder.id(), nmsAdvancementHolder); + getNMSAdvancementManager().advancements = mapBuilder.build(); + + AdvancementTree tree = getNMSAdvancementManager().tree(); + tree.addAll(List.of(nmsAdvancementHolder)); + // recalculate advancement tree from this advancement's root + AdvancementNode node = tree.get(nmsAdvancementHolder.id()); + if (node != null) { + AdvancementNode root = node.root(); + if (root.holder().value().display().isPresent()) { + TreeNodePosition.run(root); + } + } + advancement.registered = true; + if (!advancement.hidden && advancement.parent != null) { + PacketHelperImpl.broadcast(new ClientboundUpdateAdvancementsPacket(false, + List.of(nmsAdvancementHolder), Set.of(), Map.of())); + } + } + + @Override + public void unregister(com.denizenscript.denizen.nms.util.Advancement advancement) { + if (advancement.temporary || !advancement.registered) { + return; + } + ResourceLocation nmsKey = CraftNamespacedKey.toMinecraft(advancement.key); + Map nmsAdvancements = getNMSAdvancementManager().advancements; + ImmutableMap.Builder mapBuilder = ImmutableMap.builderWithExpectedSize(nmsAdvancements.size() - 1); + for (Map.Entry entry : nmsAdvancements.entrySet()) { + if (!entry.getKey().equals(nmsKey)) { + mapBuilder.put(entry); + } + } + getNMSAdvancementManager().advancements = mapBuilder.build(); + getNMSAdvancementManager().tree().remove(Set.of(nmsKey)); + advancement.registered = false; + PacketHelperImpl.broadcast(new ClientboundUpdateAdvancementsPacket(false, List.of(), Set.of(nmsKey), Map.of())); + } + + @Override + public void grantPartial(com.denizenscript.denizen.nms.util.Advancement advancement, Player player, int len) { + if (advancement.length <= 1) { + grant(advancement, player); + return; + } + if (advancement.temporary) { + AdvancementHolder nmsAdvancement = asNMSCopy(advancement); + AdvancementProgress progress = new AdvancementProgress(); + progress.update(new AdvancementRequirements(IMPOSSIBLE_REQUIREMENTS)); + for (int i = 0; i < len; i++) { + progress.grantProgress(IMPOSSIBLE_KEY + i); // complete impossible criteria + } + PacketHelperImpl.send(player, new ClientboundUpdateAdvancementsPacket(false, + Collections.singleton(nmsAdvancement), + Collections.emptySet(), + Collections.singletonMap(nmsAdvancement.id(), progress))); + } + else { + AdvancementHolder nmsAdvancement = getNMSAdvancementManager().advancements.get(CraftNamespacedKey.toMinecraft(advancement.key)); + for (int i = 0; i < len; i++) { + ((CraftPlayer) player).getHandle().getAdvancements().award(nmsAdvancement, IMPOSSIBLE_KEY + i); + } + } + } + + @Override + public void grant(com.denizenscript.denizen.nms.util.Advancement advancement, Player player) { + if (advancement.length > 1) { + grantPartial(advancement, player, advancement.length); + return; + } + if (advancement.temporary) { + AdvancementHolder nmsAdvancement = asNMSCopy(advancement); + AdvancementProgress progress = new AdvancementProgress(); + progress.update(new AdvancementRequirements(IMPOSSIBLE_REQUIREMENTS)); + progress.grantProgress(IMPOSSIBLE_KEY); // complete impossible criteria + PacketHelperImpl.send(player, new ClientboundUpdateAdvancementsPacket(false, + Collections.singleton(nmsAdvancement), + Collections.emptySet(), + Collections.singletonMap(nmsAdvancement.id(), progress))); + } + else { + AdvancementHolder nmsAdvancement = getNMSAdvancementManager().advancements.get(CraftNamespacedKey.toMinecraft(advancement.key)); + ((CraftPlayer) player).getHandle().getAdvancements().award(nmsAdvancement, IMPOSSIBLE_KEY); + } + } + + @Override + public void revoke(com.denizenscript.denizen.nms.util.Advancement advancement, Player player) { + if (advancement.temporary) { + PacketHelperImpl.send(player, new ClientboundUpdateAdvancementsPacket(false, + Collections.emptySet(), + Collections.singleton(CraftNamespacedKey.toMinecraft(advancement.key)), + Collections.emptyMap())); + } + else { + AdvancementHolder nmsAdvancement = getNMSAdvancementManager().advancements.get(CraftNamespacedKey.toMinecraft(advancement.key)); + ((CraftPlayer) player).getHandle().getAdvancements().revoke(nmsAdvancement, IMPOSSIBLE_KEY); + } + } + + @Override + public void update(Player player) { + ServerPlayer nmsPlayer = ((CraftPlayer) player).getHandle(); + nmsPlayer.connection.send(new ClientboundUpdateAdvancementsPacket(true, + Collections.emptySet(), + Collections.emptySet(), + Collections.emptyMap())); + PlayerAdvancements data = nmsPlayer.getAdvancements(); + data.save(); // save progress + data.reload(getNMSAdvancementManager()); // clear progress + data.flushDirty(nmsPlayer); // load progress and update client + } + + private static AdvancementHolder asNMSCopy(com.denizenscript.denizen.nms.util.Advancement advancement) { + AdvancementHolder parent = advancement.parent != null + ? getNMSAdvancementManager().advancements.get(CraftNamespacedKey.toMinecraft(advancement.parent)) + : null; + DisplayInfo display = new DisplayInfo(CraftItemStack.asNMSCopy(advancement.icon), + Handler.componentToNMS(FormattedTextHelper.parse(advancement.title, ChatColor.WHITE)), Handler.componentToNMS(FormattedTextHelper.parse(advancement.description, ChatColor.WHITE)), + Optional.ofNullable(advancement.background).map(CraftNamespacedKey::toMinecraft), AdvancementType.valueOf(advancement.frame.name()), + advancement.toast, advancement.announceToChat, advancement.hidden); + display.setLocation(advancement.xOffset, advancement.yOffset); + Map> criteria = IMPOSSIBLE_CRITERIA; + List> requirements = IMPOSSIBLE_REQUIREMENTS; + if (advancement.length > 1) { + criteria = new HashMap<>(); + requirements = new ArrayList<>(advancement.length); + for (int i = 0; i < advancement.length; i++) { + criteria.put(IMPOSSIBLE_KEY + i, new Criterion<>(new ImpossibleTrigger(), new ImpossibleTrigger.TriggerInstance())); + requirements.set(i, List.of(IMPOSSIBLE_KEY + i)); + } + } + AdvancementRequirements reqs = new AdvancementRequirements(requirements); + Advancement adv = new Advancement(parent == null ? Optional.empty() : Optional.of(parent.id()), Optional.of(display), AdvancementRewards.EMPTY, criteria, reqs, false); // TODO: 1.20: do we want to ever enable telemetry? + return new AdvancementHolder(CraftNamespacedKey.toMinecraft(advancement.key), adv); + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AnimationHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AnimationHelperImpl.java new file mode 100644 index 0000000000..e9abb1a1a3 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AnimationHelperImpl.java @@ -0,0 +1,47 @@ +package com.denizenscript.denizen.nms.v1_20.helpers; + +import com.denizenscript.denizen.nms.abstracts.AnimationHelper; +import net.minecraft.world.entity.Entity; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftHorse; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPolarBear; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Horse; +import org.bukkit.entity.IronGolem; + +public class AnimationHelperImpl extends AnimationHelper { + + public AnimationHelperImpl() { + register("POLAR_BEAR_START_STANDING", entity -> { + if (entity.getType() == EntityType.POLAR_BEAR) { + ((CraftPolarBear) entity).getHandle().setStanding(true); + } + }); + register("POLAR_BEAR_STOP_STANDING", entity -> { + if (entity.getType() == EntityType.POLAR_BEAR) { + ((CraftPolarBear) entity).getHandle().setStanding(false); + } + }); + register("HORSE_START_STANDING", entity -> { + if (entity instanceof Horse) { + ((CraftHorse) entity).getHandle().setStanding(true); + } + }); + register("HORSE_STOP_STANDING", entity -> { + if (entity instanceof Horse) { + ((CraftHorse) entity).getHandle().setStanding(false); + } + }); + register("HORSE_BUCK", entity -> { + if (entity instanceof Horse) { + ((CraftHorse) entity).getHandle().makeMad(); + } + }); + register("IRON_GOLEM_ATTACK", entity -> { + if (entity instanceof IronGolem) { + Entity nmsEntity = ((CraftEntity) entity).getHandle(); + nmsEntity.level().broadcastEntityEvent(nmsEntity, (byte) 4); + } + }); + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java new file mode 100644 index 0000000000..496ab68789 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java @@ -0,0 +1,315 @@ +package com.denizenscript.denizen.nms.v1_20.helpers; + +import com.denizenscript.denizen.nms.interfaces.BlockHelper; +import com.denizenscript.denizen.nms.util.PlayerProfile; +import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; +import com.denizenscript.denizen.nms.util.jnbt.CompoundTagBuilder; +import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_20.impl.ProfileEditorImpl; +import com.denizenscript.denizen.nms.v1_20.impl.jnbt.CompoundTagImpl; +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.utilities.VanillaTagHelper; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import com.google.common.collect.Iterables; +import com.mojang.authlib.GameProfile; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderSet; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.protocol.common.ClientboundUpdateTagsPacket; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.TagKey; +import net.minecraft.tags.TagNetworkSerialization; +import net.minecraft.util.InclusiveRange; +import net.minecraft.util.random.SimpleWeightedRandomList; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.component.ResolvableProfile; +import net.minecraft.world.level.BaseSpawner; +import net.minecraft.world.level.SpawnData; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.SpawnerBlockEntity; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.status.ChunkStatus; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.PushReaction; +import org.bukkit.Bukkit; +import org.bukkit.Instrument; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; +import org.bukkit.block.CreatureSpawner; +import org.bukkit.block.Skull; +import org.bukkit.craftbukkit.v1_20_R4.CraftChunk; +import org.bukkit.craftbukkit.v1_20_R4.CraftRegistry; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.block.CraftBlock; +import org.bukkit.craftbukkit.v1_20_R4.block.CraftBlockEntityState; +import org.bukkit.craftbukkit.v1_20_R4.block.CraftCreatureSpawner; +import org.bukkit.craftbukkit.v1_20_R4.block.CraftSkull; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R4.tag.CraftBlockTag; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftLocation; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftMagicNumbers; + +import java.lang.invoke.MethodHandle; +import java.lang.reflect.Field; +import java.util.*; +import java.util.stream.Collectors; + +public class BlockHelperImpl implements BlockHelper { + + public static final Field craftBlockEntityState_tileEntity = ReflectionHelper.getFields(CraftBlockEntityState.class).get("tileEntity"); + public static final Field craftBlockEntityState_snapshot = ReflectionHelper.getFields(CraftBlockEntityState.class).get("snapshot"); + public static final Field craftSkull_profile = ReflectionHelper.getFields(CraftSkull.class).get("profile"); + + @Override + public void makeBlockStateRaw(BlockState state) { + try { + craftBlockEntityState_snapshot.set(state, craftBlockEntityState_tileEntity.get(state)); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + @Override + public void applyPhysics(Location location) { + ((CraftWorld) location.getWorld()).getHandle().updateNeighborsAt(CraftLocation.toBlockPosition(location), CraftMagicNumbers.getBlock(location.getBlock().getType())); + } + + public static T getTE(CraftBlockEntityState cbs) { + try { + return (T) craftBlockEntityState_tileEntity.get(cbs); + } + catch (IllegalAccessException e) { + Debug.echoError(e); + } + return null; + } + + @Override + public PlayerProfile getPlayerProfile(Skull skull) { + // TODO: 1.20.6: Seems to be a holder for data that can make the request to complete it later - do we want to do that here? + ResolvableProfile profile = getTE(((CraftSkull) skull)).owner; + if (profile == null) { + return null; + } + com.mojang.authlib.properties.Property property = Iterables.getFirst(profile.properties().get("textures"), null); + return new PlayerProfile(profile.name().orElse(null), profile.id().orElse(null), property != null ? property.value() : null); + } + + @Override + public void setPlayerProfile(Skull skull, PlayerProfile playerProfile) { + GameProfile gameProfile = ProfileEditorImpl.getGameProfile(playerProfile); + try { + craftSkull_profile.set(skull, gameProfile); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + skull.update(); + } + + @Override + public CompoundTag getNbtData(Block block) { + BlockEntity te = ((CraftWorld) block.getWorld()).getHandle().getBlockEntity(new BlockPos(block.getX(), block.getY(), block.getZ()), true); + if (te != null) { + net.minecraft.nbt.CompoundTag compound = te.saveWithFullMetadata(CraftRegistry.getMinecraftRegistry()); + return CompoundTagImpl.fromNMSTag(compound); + } + return null; + } + + @Override + public void setNbtData(Block block, CompoundTag ctag) { + CompoundTagBuilder builder = ctag.createBuilder(); + builder.putInt("x", block.getX()); + builder.putInt("y", block.getY()); + builder.putInt("z", block.getZ()); + ctag = builder.build(); + BlockPos blockPos = new BlockPos(block.getX(), block.getY(), block.getZ()); + BlockEntity te = ((CraftWorld) block.getWorld()).getHandle().getBlockEntity(blockPos, true); + te.loadWithComponents(((CompoundTagImpl) ctag).toNMSTag(), CraftRegistry.getMinecraftRegistry()); + } + + @Override + public boolean setBlockResistance(Material material, float resistance) { + net.minecraft.world.level.block.Block block = CraftMagicNumbers.getBlock(material); + if (block == null) { + return false; + } + ReflectionHelper.setFieldValue(net.minecraft.world.level.block.state.BlockBehaviour.class, ReflectionMappingsInfo.BlockBehaviour_explosionResistance, block, resistance); + return true; + } + + @Override + public float getBlockResistance(Material material) { + net.minecraft.world.level.block.Block block = CraftMagicNumbers.getBlock(material); + if (block == null) { + return 0; + } + return ReflectionHelper.getFieldValue(net.minecraft.world.level.block.state.BlockBehaviour.class, ReflectionMappingsInfo.BlockBehaviour_explosionResistance, block); + } + + public static final MethodHandle MATERIAL_PUSH_REACTION_SETTER = ReflectionHelper.getFinalSetterForFirstOfType(BlockBehaviour.BlockStateBase.class, PushReaction.class); + + public static final MethodHandle BLOCK_STRENGTH_SETTER = ReflectionHelper.getFinalSetterForFirstOfType(net.minecraft.world.level.block.state.BlockBehaviour.BlockStateBase.class, float.class); // destroySpeed + + public net.minecraft.world.level.block.state.BlockState getMaterialBlockState(Material bukkitMaterial) { + net.minecraft.world.level.block.Block nmsBlock = CraftMagicNumbers.getBlock(bukkitMaterial); + return nmsBlock != null ? nmsBlock.defaultBlockState() : null; + } + + @Override + public void setPushReaction(Material mat, PistonPushReaction reaction) { + try { + MATERIAL_PUSH_REACTION_SETTER.invoke(getMaterialBlockState(mat), PushReaction.values()[reaction.ordinal()]); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + @Override + public float getBlockStrength(Material mat) { + return getMaterialBlockState(mat).destroySpeed; + } + + @Override + public void setBlockStrength(Material mat, float strength) { + try { + BLOCK_STRENGTH_SETTER.invoke(getMaterialBlockState(mat), strength); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + @Override + public void doRandomTick(Location location) { + BlockPos pos = CraftLocation.toBlockPosition(location); + ChunkAccess nmsChunk = ((CraftChunk) location.getChunk()).getHandle(ChunkStatus.FULL); + net.minecraft.world.level.block.state.BlockState nmsBlock = nmsChunk.getBlockState(pos); + ServerLevel nmsWorld = ((CraftWorld) location.getWorld()).getHandle(); + if (nmsBlock.isRandomlyTicking()) { + nmsBlock.randomTick(nmsWorld, pos, nmsWorld.random); + } + FluidState fluid = nmsBlock.getFluidState(); + if (fluid.isRandomlyTicking()) { + fluid.animateTick(nmsWorld, pos, nmsWorld.random); + } + } + + @Override + public Instrument getInstrumentFor(Material mat) { + return Instrument.values()[getMaterialBlockState(mat).instrument().ordinal()]; + } + + @Override + public int getExpDrop(Block block, org.bukkit.inventory.ItemStack item) { + net.minecraft.world.level.block.Block blockType = CraftMagicNumbers.getBlock(block.getType()); + if (blockType == null) { + return 0; + } + return blockType.getExpDrop(((CraftBlock) block).getNMS(), ((CraftBlock) block).getCraftWorld().getHandle(), ((CraftBlock) block).getPosition(), + item == null ? null : CraftItemStack.asNMSCopy(item), true); + } + + @Override + public void setSpawnerSpawnedType(CreatureSpawner spawner, EntityTag entity) { + spawner.setSpawnedType(entity.getBukkitEntityType()); + if (entity.getWaitingMechanisms() == null || entity.getWaitingMechanisms().size() == 0) { + return; + } + try { + // Wrangle a fake entity + org.bukkit.entity.Entity bukkitEntity = ((CraftWorld) spawner.getWorld()).createEntity(spawner.getLocation(), entity.getBukkitEntityType().getEntityClass()); + Entity nmsEntity = ((CraftEntity) bukkitEntity).getHandle(); + EntityTag entityTag = new EntityTag(bukkitEntity); + entityTag.isFake = true; + entityTag.isFakeValid = true; + for (Mechanism mechanism : entity.getWaitingMechanisms()) { + entityTag.safeAdjustDuplicate(mechanism); + } + nmsEntity.unsetRemoved(); + // Store it into the spawner + CraftCreatureSpawner bukkitSpawner = (CraftCreatureSpawner) spawner; + SpawnerBlockEntity nmsSnapshot = (SpawnerBlockEntity) craftBlockEntityState_snapshot.get(bukkitSpawner); + BaseSpawner nmsSpawner = nmsSnapshot.getSpawner(); + SpawnData toSpawn = nmsSpawner.nextSpawnData; + net.minecraft.nbt.CompoundTag tag = toSpawn.getEntityToSpawn(); + nmsEntity.saveWithoutId(tag); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + @Override + public void setSpawnerCustomRules(CreatureSpawner spawner, int skyMin, int skyMax, int blockMin, int blockMax) { + try { + CraftCreatureSpawner bukkitSpawner = (CraftCreatureSpawner) spawner; + SpawnerBlockEntity nmsSnapshot = (SpawnerBlockEntity) craftBlockEntityState_snapshot.get(bukkitSpawner); + BaseSpawner nmsSpawner = nmsSnapshot.getSpawner(); + SpawnData toSpawn = nmsSpawner.nextSpawnData; + SpawnData.CustomSpawnRules rules = skyMin == -1 ? null : new SpawnData.CustomSpawnRules(new InclusiveRange<>(skyMin, skyMax), new InclusiveRange<>(blockMin, blockMax)); + nmsSpawner.nextSpawnData = new SpawnData(toSpawn.entityToSpawn(), Optional.ofNullable(rules), toSpawn.equipment()); + nmsSpawner.spawnPotentials = SimpleWeightedRandomList.empty(); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + public static final MethodHandle HOLDERSET_NAMED_BIND = ReflectionHelper.getMethodHandle(HolderSet.Named.class, ReflectionMappingsInfo.HolderSetNamed_bind_method, List.class); + public static final MethodHandle HOLDER_REFERENCE_BINDTAGS = ReflectionHelper.getMethodHandle(Holder.Reference.class, ReflectionMappingsInfo.HolderReference_bindTags_method, Collection.class); + + @Override + public void setVanillaTags(Material material, Set tags) { + Holder nmsHolder = CraftMagicNumbers.getBlock(material).builtInRegistryHolder(); + nmsHolder.tags().forEach(nmsTag -> { + HolderSet.Named nmsHolderSet = BuiltInRegistries.BLOCK.getTag(nmsTag).orElse(null); + if (nmsHolderSet == null) { + return; + } + List> nmsHolders = nmsHolderSet.stream().collect(Collectors.toCollection(ArrayList::new)); + nmsHolders.remove(nmsHolder); + try { + HOLDERSET_NAMED_BIND.invoke(nmsHolderSet, nmsHolders); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + VanillaTagHelper.updateMaterialTag(new CraftBlockTag(BuiltInRegistries.BLOCK, nmsTag)); + }); + List> newNmsTags = new ArrayList<>(); + for (String tag : tags) { + TagKey newNmsTag = TagKey.create(BuiltInRegistries.BLOCK.key(), new ResourceLocation(tag)); + HolderSet.Named nmsHolderSet = BuiltInRegistries.BLOCK.getOrCreateTag(newNmsTag); + List> nmsHolders = nmsHolderSet.stream().collect(Collectors.toCollection(ArrayList::new)); + nmsHolders.add(nmsHolder); + try { + HOLDERSET_NAMED_BIND.invoke(nmsHolderSet, nmsHolders); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + newNmsTags.add(newNmsTag); + VanillaTagHelper.addOrUpdateMaterialTag(new CraftBlockTag(BuiltInRegistries.BLOCK, newNmsTag)); + } + try { + HOLDER_REFERENCE_BINDTAGS.invoke(nmsHolder, newNmsTags); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + PacketHelperImpl.broadcast(new ClientboundUpdateTagsPacket(TagNetworkSerialization.serializeTagsToNetwork(((CraftServer) Bukkit.getServer()).getServer().registries()))); + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ChunkHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ChunkHelperImpl.java new file mode 100644 index 0000000000..be4c9174c5 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ChunkHelperImpl.java @@ -0,0 +1,119 @@ +package com.denizenscript.denizen.nms.v1_20.helpers; + +import com.denizenscript.denizen.nms.abstracts.BiomeNMS; +import com.denizenscript.denizen.nms.v1_20.impl.BiomeNMSImpl; +import com.denizenscript.denizen.nms.interfaces.ChunkHelper; +import com.denizenscript.denizencore.tags.TagManager; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.minecraft.core.Holder; +import net.minecraft.core.QuartPos; +import net.minecraft.server.level.ServerChunkCache; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.LevelChunkSection; +import net.minecraft.world.level.chunk.PalettedContainer; +import net.minecraft.world.level.chunk.status.ChunkStatus; +import net.minecraft.world.level.levelgen.Heightmap; +import org.bukkit.World; +import org.bukkit.Chunk; +import org.bukkit.craftbukkit.v1_20_R4.CraftChunk; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; + +import java.lang.invoke.MethodHandle; +import java.lang.reflect.Field; + +public class ChunkHelperImpl implements ChunkHelper { + + public final static Field chunkProviderServerThreadField; + public final static MethodHandle chunkProviderServerThreadFieldSetter; + public final static Field worldThreadField; + public final static MethodHandle worldThreadFieldSetter; + + static { + chunkProviderServerThreadField = ReflectionHelper.getFields(ServerChunkCache.class).getFirstOfType(Thread.class); + chunkProviderServerThreadFieldSetter = ReflectionHelper.getFinalSetterForFirstOfType(ServerChunkCache.class, Thread.class); + worldThreadField = ReflectionHelper.getFields(net.minecraft.world.level.Level.class).getFirstOfType(Thread.class); + worldThreadFieldSetter = ReflectionHelper.getFinalSetterForFirstOfType(net.minecraft.world.level.Level.class, Thread.class); + } + + public Thread resetServerThread; + + @Override + public void changeChunkServerThread(World world) { + if (TagManager.tagThread == null) { + return; + } + if (resetServerThread != null) { + return; + } + ServerLevel nmsWorld = ((CraftWorld) world).getHandle(); + ServerChunkCache provider = nmsWorld.getChunkSource(); + try { + resetServerThread = (Thread) chunkProviderServerThreadField.get(provider); + chunkProviderServerThreadFieldSetter.invoke(provider, Thread.currentThread()); + worldThreadFieldSetter.invoke(nmsWorld, Thread.currentThread()); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + @Override + public void restoreServerThread(World world) { + if (TagManager.tagThread == null) { + return; + } + if (resetServerThread == null) { + return; + } + ServerLevel nmsWorld = ((CraftWorld) world).getHandle(); + ServerChunkCache provider = nmsWorld.getChunkSource(); + try { + chunkProviderServerThreadFieldSetter.invoke(provider, resetServerThread); + worldThreadFieldSetter.invoke(nmsWorld, resetServerThread); + resetServerThread = null; + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + @Override + public int[] getHeightMap(Chunk chunk) { + Heightmap map = ((CraftChunk) chunk).getHandle(ChunkStatus.FEATURES).heightmaps.get(Heightmap.Types.MOTION_BLOCKING); + int[] outputMap = new int[256]; + for (int x = 0; x < 16; x++) { + for (int y = 0; y < 16; y++) { + outputMap[x * 16 + y] = map.getFirstAvailable(x, y); + } + } + return outputMap; + } + + @Override + public void setAllBiomes(Chunk chunk, BiomeNMS biome) { + Holder nmsBiome = ((BiomeNMSImpl) biome).biomeHolder; + ChunkAccess nmsChunk = ((CraftChunk) chunk).getHandle(ChunkStatus.BIOMES); + ChunkPos chunkcoordintpair = nmsChunk.getPos(); + int i = QuartPos.fromBlock(chunkcoordintpair.getMinBlockX()); + int j = QuartPos.fromBlock(chunkcoordintpair.getMinBlockZ()); + LevelHeightAccessor levelheightaccessor = nmsChunk.getHeightAccessorForGeneration(); + for(int k = levelheightaccessor.getMinSection(); k < levelheightaccessor.getMaxSection(); ++k) { + LevelChunkSection chunksection = nmsChunk.getSection(nmsChunk.getSectionIndexFromSectionY(k)); + PalettedContainer> datapaletteblock = (PalettedContainer>) chunksection.getBiomes(); + datapaletteblock.acquire(); + for(int l = 0; l < 4; ++l) { + for(int i1 = 0; i1 < 4; ++i1) { + for(int j1 = 0; j1 < 4; ++j1) { + datapaletteblock.getAndSetUnchecked(l, i1, j1, nmsBiome); + } + } + } + datapaletteblock.release(); + } + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/CustomEntityHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/CustomEntityHelperImpl.java new file mode 100644 index 0000000000..34eb7509b7 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/CustomEntityHelperImpl.java @@ -0,0 +1,149 @@ +package com.denizenscript.denizen.nms.v1_20.helpers; + +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.interfaces.CustomEntityHelper; +import com.denizenscript.denizen.nms.interfaces.FakeArrow; +import com.denizenscript.denizen.nms.interfaces.FakePlayer; +import com.denizenscript.denizen.nms.interfaces.ItemProjectile; +import com.denizenscript.denizen.nms.util.PlayerProfile; +import com.denizenscript.denizen.nms.v1_20.impl.ProfileEditorImpl; +import com.denizenscript.denizen.nms.v1_20.impl.entities.CraftFakePlayerImpl; +import com.denizenscript.denizen.nms.v1_20.impl.entities.EntityFakeArrowImpl; +import com.denizenscript.denizen.nms.v1_20.impl.entities.EntityFakePlayerImpl; +import com.denizenscript.denizen.nms.v1_20.impl.entities.EntityItemProjectileImpl; +import com.denizenscript.denizen.utilities.BukkitImplDeprecations; +import com.denizenscript.denizencore.utilities.CoreUtilities; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import com.mojang.authlib.GameProfile; +import net.minecraft.server.level.ClientInformation; +import net.minecraft.server.level.ServerLevel; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.nio.charset.StandardCharsets; +import java.util.UUID; + +public class CustomEntityHelperImpl implements CustomEntityHelper { + + @Override + public FakeArrow spawnFakeArrow(Location location) { + CraftWorld world = (CraftWorld) location.getWorld(); + EntityFakeArrowImpl arrow = new EntityFakeArrowImpl(world, location); + return arrow.getBukkitEntity(); + } + + @Override + public ItemProjectile spawnItemProjectile(Location location, ItemStack itemStack) { + CraftWorld world = (CraftWorld) location.getWorld(); + EntityItemProjectileImpl entity = new EntityItemProjectileImpl(world.getHandle(), location, CraftItemStack.asNMSCopy(itemStack)); + world.getHandle().addFreshEntity(entity, CreatureSpawnEvent.SpawnReason.CUSTOM); + return entity.getBukkitEntity(); + } + + public FakePlayer spawnFakePlayer(Location location, String name, String skin, String blob, boolean doAdd) throws IllegalArgumentException { + BukkitImplDeprecations.fakePlayer.warn(); + String fullName = name; + String prefix = null; + String suffix = null; + if (name == null) { + Debug.echoError("FAKE_PLAYER: null name, cannot spawn"); + return null; + } + else if (fullName.length() > 16) { + prefix = fullName.substring(0, 16); + if (fullName.length() > 30) { + int len = 30; + name = fullName.substring(16, 30); + if (name.matches(".*[^A-Za-z0-9_].*")) { + if (fullName.length() >= 32) { + len = 32; + name = fullName.substring(16, 32); + } + else if (fullName.length() == 31) { + len = 31; + name = fullName.substring(16, 31); + } + } + else if (name.length() > 46) { + throw new IllegalArgumentException("You must specify a name with no more than 46 characters for FAKE_PLAYER entities!"); + } + else { + name = ChatColor.RESET + name; + } + suffix = fullName.substring(len); + } + else { + name = fullName.substring(16); + if (!name.matches(".*[^A-Za-z0-9_].*")) { + name = ChatColor.RESET + name; + } + if (name.length() > 16) { + suffix = name.substring(16); + name = name.substring(0, 16); + } + } + } + if (skin != null && skin.length() > 16) { + throw new IllegalArgumentException("You must specify a name with no more than 16 characters for FAKE_PLAYER entity skins!"); + } + CraftWorld world = (CraftWorld) location.getWorld(); + ServerLevel worldServer = world.getHandle(); + PlayerProfile playerProfile = new PlayerProfile(name, null); + if (blob != null) { + int sc = blob.indexOf(';'); + if (sc != -1) { + playerProfile.setTexture(blob.substring(0, sc)); + playerProfile.setTextureSignature(blob.substring(sc + 1)); + } + } + else if (skin == null && !name.matches(".*[^A-Za-z0-9_].*")) { + playerProfile = NMSHandler.instance.fillPlayerProfile(playerProfile); + } + if (skin != null) { + PlayerProfile skinProfile = new PlayerProfile(skin, null); + skinProfile = NMSHandler.instance.fillPlayerProfile(skinProfile); + playerProfile.setTexture(skinProfile.getTexture()); + playerProfile.setTextureSignature(skinProfile.getTextureSignature()); + } + UUID uuid = UUID.randomUUID(); + playerProfile.setUniqueId(uuid); + + GameProfile gameProfile = ProfileEditorImpl.getGameProfile(playerProfile); + final EntityFakePlayerImpl fakePlayer = new EntityFakePlayerImpl(worldServer.getServer(), worldServer, gameProfile, ClientInformation.createDefault(), doAdd); + + fakePlayer.forceSetPositionRotation(location.getX(), location.getY(), location.getZ(), + location.getYaw(), location.getPitch()); + CraftFakePlayerImpl craftFakePlayer = fakePlayer.getBukkitEntity(); + craftFakePlayer.fullName = fullName; + if (prefix != null) { + Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard(); + String teamName = "FAKE_PLAYER_TEAM_" + fullName; + String hash = null; + try { + hash = CoreUtilities.hash_md5(teamName.getBytes(StandardCharsets.UTF_8)).substring(0, 16); + } + catch (Exception e) { + Debug.echoError(e); + } + if (hash != null) { + Team team = scoreboard.getTeam(hash); + if (team == null) { + team = scoreboard.registerNewTeam(hash); + team.setPrefix(prefix); + if (suffix != null) { + team.setSuffix(suffix); + } + } + team.addPlayer(craftFakePlayer); + } + } + return craftFakePlayer; + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EnchantmentHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EnchantmentHelperImpl.java new file mode 100644 index 0000000000..d51abcde37 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EnchantmentHelperImpl.java @@ -0,0 +1,222 @@ +package com.denizenscript.denizen.nms.v1_20.helpers; + +import com.denizenscript.denizen.Denizen; +import com.denizenscript.denizen.nms.interfaces.EnchantmentHelper; +import com.denizenscript.denizen.nms.v1_20.Handler; +import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; +import com.denizenscript.denizen.scripts.containers.core.EnchantmentScriptContainer; +import com.denizenscript.denizen.utilities.FormattedTextHelper; +import com.denizenscript.denizencore.utilities.CoreUtilities; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.minecraft.core.MappedRegistry; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import org.bukkit.NamespacedKey; +import org.bukkit.craftbukkit.v1_20_R4.enchantments.CraftEnchantment; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftNamespacedKey; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.event.entity.EntityDamageEvent; +import net.minecraft.world.item.enchantment.Enchantment.EnchantmentDefinition; + +import java.lang.reflect.Field; +import java.util.IdentityHashMap; +import java.util.Map; + +public class EnchantmentHelperImpl extends EnchantmentHelper { + public static final Field REGISTRY_FROZEN = ReflectionHelper.getFields(MappedRegistry.class).get(ReflectionMappingsInfo.MappedRegistry_frozen, boolean.class); + public static final Field REGISTRY_INTRUSIVE_HOLDERS = ReflectionHelper.getFields(MappedRegistry.class).get(ReflectionMappingsInfo.MappedRegistry_unregisteredIntrusiveHolders, Map.class); + + @Override + public org.bukkit.enchantments.Enchantment registerFakeEnchantment(EnchantmentScriptContainer.EnchantmentReference script) { + try { + Map holders = (Map) REGISTRY_INTRUSIVE_HOLDERS.get(BuiltInRegistries.ENCHANTMENT); + if (holders == null) { + REGISTRY_INTRUSIVE_HOLDERS.set(BuiltInRegistries.ENCHANTMENT, new IdentityHashMap()); + } + boolean wasFrozen = REGISTRY_FROZEN.getBoolean(BuiltInRegistries.ENCHANTMENT); + REGISTRY_FROZEN.setBoolean(BuiltInRegistries.ENCHANTMENT, false); + EquipmentSlot[] slots = new EquipmentSlot[script.script.slots.size()]; + for (int i = 0; i < slots.length; i++) { + slots[i] = EquipmentSlot.valueOf(CoreUtilities.toUpperCase(script.script.slots.get(i))); + } + // TODO: 1.20.6: rarity is provided as an int, can make our own mirror enum; categories seemed to only over control #canEnchant(ItemStack), so can probably safely phase them out? + // net.minecraft.world.item.enchantment.Enchantment.Rarity.valueOf(script.script.rarity), EnchantmentCategory.valueOf(script.script.category), slots + net.minecraft.world.item.enchantment.Enchantment nmsEnchant = new net.minecraft.world.item.enchantment.Enchantment(null) { + // TODO: 1.20.6: methods are final now and the values are provided by EnchantmentDefinition - would probably need to create a new one on reload and modify the existing enchantment +// @Override +// public int getMinLevel() { +// return script.script.minLevel; +// } +// @Override +// public int getMaxLevel() { +// return script.script.maxLevel; +// } +// @Override +// public int getMinCost(int level) { +// return script.script.getMinCost(level); +// } +// @Override +// public int getMaxCost(int level) { +// return script.script.getMaxCost(level); +// } + @Override + public int getDamageProtection(int level, DamageSource src) { + return script.script.getDamageProtection(level, src.getMsgId(), src.getEntity() == null ? null : src.getEntity().getBukkitEntity()); + } + // TODO: 1.20.6: Takes an EntityType now, and MobType seems to have been removed in favor of vanilla tags - can probably use these to backsupport & properly pass the entity type +// @Override +// public float getDamageBonus(int level, EntityType type) { +// String typeName = "UNDEFINED"; +// if (type == MobType.ARTHROPOD) { +// typeName = "ARTHROPOD"; +// } +// else if (type == MobType.ILLAGER) { +// typeName = "ILLAGER"; +// } +// else if (type == MobType.UNDEAD) { +// typeName = "UNDEAD"; +// } +// else if (type == MobType.WATER) { +// typeName = "WATER"; +// } +// return script.script.getDamageBonus(level, typeName); +// } + @Override + protected boolean checkCompatibility(net.minecraft.world.item.enchantment.Enchantment nmsEnchantment) { + ResourceLocation nmsKey = BuiltInRegistries.ENCHANTMENT.getKey(nmsEnchantment); + NamespacedKey bukkitKey = CraftNamespacedKey.fromMinecraft(nmsKey); + org.bukkit.enchantments.Enchantment bukkitEnchant = CraftEnchantment.getByKey(bukkitKey); + return script.script.isCompatible(bukkitEnchant); + } + @Override + protected String getOrCreateDescriptionId() { + return script.script.descriptionId; + } + @Override + public String getDescriptionId() { + return script.script.descriptionId; + } + @Override + public Component getFullname(int level) { + return Handler.componentToNMS(script.script.getFullName(level)); + } + @Override + public boolean canEnchant(net.minecraft.world.item.ItemStack var0) { + return super.canEnchant(var0) && script.script.canEnchant(CraftItemStack.asBukkitCopy(var0)); + } + @Override + public void doPostAttack(LivingEntity attacker, Entity victim, int level) { + script.script.doPostAttack(attacker.getBukkitEntity(), victim.getBukkitEntity(), level); + } + @Override + public void doPostHurt(LivingEntity victim, Entity attacker, int level) { + script.script.doPostHurt(victim.getBukkitEntity(), attacker.getBukkitEntity(), level); + } + @Override + public boolean isTreasureOnly() { + return script.script.isTreasureOnly; + } + @Override + public boolean isCurse() { + return script.script.isCurse; + } + @Override + public boolean isTradeable() { + return script.script.isTradable; + } + @Override + public boolean isDiscoverable() { + return script.script.isDiscoverable; + } + }; + NamespacedKey enchantmentKey = new NamespacedKey(Denizen.getInstance(), script.script.id); + Registry.register(BuiltInRegistries.ENCHANTMENT, enchantmentKey.toString(), nmsEnchant); + String enchName = CoreUtilities.toUpperCase(script.script.id); + CraftEnchantment ench = new CraftEnchantment(enchantmentKey, nmsEnchant) { + @Override + public String getName() { + return enchName; + } + }; + REGISTRY_INTRUSIVE_HOLDERS.set(BuiltInRegistries.ENCHANTMENT, holders); + if (wasFrozen) { + BuiltInRegistries.ENCHANTMENT.freeze(); + } + return ench; + } + catch (Throwable ex) { + Debug.echoError("Failed to register enchantment " + script.script.id); + Debug.echoError(ex); + return null; + } + } + + // TODO: 1.20.6: rarity is just an int now (weight), can deprecate & backsupport by estimating it based on the weight +// @Override +// public String getRarity(Enchantment enchantment) { +// return ((CraftEnchantment) enchantment).getHandle().getRarity().name(); +// } + + @Override + public boolean isDiscoverable(Enchantment enchantment) { + return ((CraftEnchantment) enchantment).getHandle().isDiscoverable(); + } + + @Override + public boolean isTradable(Enchantment enchantment) { + return ((CraftEnchantment) enchantment).getHandle().isTradeable(); + } + + @Override + public boolean isCurse(Enchantment enchantment) { + return ((CraftEnchantment) enchantment).getHandle().isCurse(); + } + + @Override + public int getMinCost(Enchantment enchantment, int level) { + return ((CraftEnchantment) enchantment).getHandle().getMinCost(level); + } + + @Override + public int getMaxCost(Enchantment enchantment, int level) { + return ((CraftEnchantment) enchantment).getHandle().getMaxCost(level); + } + + @Override + public String getFullName(Enchantment enchantment, int level) { + return FormattedTextHelper.stringify(Handler.componentToSpigot(((CraftEnchantment) enchantment).getHandle().getFullname(level))); + } + + // TODO: 1.20.6: MobType was removed in favor of using the entity type directly - deprecate + potentially backsupport with vanilla tags +// @Override +// public float getDamageBonus(Enchantment enchantment, int level, String type) { +// MobType mobType = switch (type) { +// case "illager" -> MobType.ILLAGER; +// case "undead" -> MobType.UNDEAD; +// case "water" -> MobType.WATER; +// case "arthropod" -> MobType.ARTHROPOD; +// default -> MobType.UNDEFINED; +// }; +// return ((CraftEnchantment) enchantment).getHandle().getDamageBonus(level, mobType); +// } + + @Override + public int getDamageProtection(Enchantment enchantment, int level, EntityDamageEvent.DamageCause type, org.bukkit.entity.Entity attacker) { + Entity nmsAttacker = attacker == null ? null : ((CraftEntity) attacker).getHandle(); + DamageSource src = EntityHelperImpl.getSourceFor(nmsAttacker, type, nmsAttacker); + if (src instanceof EntityHelperImpl.FakeDamageSrc fakeDamageSrc) { + src = fakeDamageSrc.real; + } + return ((CraftEnchantment) enchantment).getHandle().getDamageProtection(level, src); + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityDataNameMapper.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityDataNameMapper.java new file mode 100644 index 0000000000..e5d71800f6 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityDataNameMapper.java @@ -0,0 +1,452 @@ +package com.denizenscript.denizen.nms.v1_20.helpers; + + +import com.denizenscript.denizencore.objects.ArgumentHelper; +import com.denizenscript.denizencore.objects.core.ElementTag; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ambient.Bat; +import net.minecraft.world.entity.animal.*; +import net.minecraft.world.entity.animal.axolotl.Axolotl; +import net.minecraft.world.entity.animal.camel.Camel; +import net.minecraft.world.entity.animal.frog.Frog; +import net.minecraft.world.entity.animal.goat.Goat; +import net.minecraft.world.entity.animal.horse.AbstractChestedHorse; +import net.minecraft.world.entity.animal.horse.AbstractHorse; +import net.minecraft.world.entity.animal.horse.Horse; +import net.minecraft.world.entity.animal.horse.Llama; +import net.minecraft.world.entity.animal.sniffer.Sniffer; +import net.minecraft.world.entity.boss.enderdragon.EndCrystal; +import net.minecraft.world.entity.boss.enderdragon.EnderDragon; +import net.minecraft.world.entity.boss.wither.WitherBoss; +import net.minecraft.world.entity.decoration.ArmorStand; +import net.minecraft.world.entity.decoration.ItemFrame; +import net.minecraft.world.entity.decoration.Painting; +import net.minecraft.world.entity.item.PrimedTnt; +import net.minecraft.world.entity.monster.*; +import net.minecraft.world.entity.monster.hoglin.Hoglin; +import net.minecraft.world.entity.monster.piglin.AbstractPiglin; +import net.minecraft.world.entity.monster.piglin.Piglin; +import net.minecraft.world.entity.monster.warden.Warden; +import net.minecraft.world.entity.npc.AbstractVillager; +import net.minecraft.world.entity.npc.Villager; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.*; +import net.minecraft.world.entity.raid.Raider; +import net.minecraft.world.entity.vehicle.AbstractMinecart; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.entity.vehicle.MinecartCommandBlock; +import net.minecraft.world.entity.vehicle.MinecartFurnace; + +import java.util.HashMap; +import java.util.Map; + +public class EntityDataNameMapper { + + public static final Map, Map> entityDataNames = new HashMap<>(); + + public static void registerDataName(Class entityClass, int id, String name) { + entityDataNames.computeIfAbsent(entityClass, k -> new HashMap<>()).put(name, id); + } + + static { + // Entity + registerDataName(Entity.class, 0, "entity_flags"); + registerDataName(Entity.class, 1, "air_ticks"); + registerDataName(Entity.class, 2, "custom_name"); + registerDataName(Entity.class, 3, "custom_name_visible"); + registerDataName(Entity.class, 4, "silent"); + registerDataName(Entity.class, 5, "no_gravity"); + registerDataName(Entity.class, 6, "pose"); + registerDataName(Entity.class, 7, "frozen_ticks"); + + // Interaction + registerDataName(Interaction.class, 8, "width"); + registerDataName(Interaction.class, 9, "height"); + registerDataName(Interaction.class, 10, "responsive"); + + // Display + registerDataName(Display.class, 8, "transform_interpolation_start"); + registerDataName(Display.class, 9, "transform_interpolation_duration"); + registerDataName(Display.class, 10, "movement_interpolation_duration"); + registerDataName(Display.class, 11, "translation"); + registerDataName(Display.class, 12, "scale"); + registerDataName(Display.class, 13, "left_rotation"); + registerDataName(Display.class, 14, "right_rotation"); + registerDataName(Display.class, 15, "billboard"); + registerDataName(Display.class, 16, "brightness"); + registerDataName(Display.class, 17, "view_range"); + registerDataName(Display.class, 18, "shadow_radius"); + registerDataName(Display.class, 19, "shadow_strength"); + registerDataName(Display.class, 20, "width"); + registerDataName(Display.class, 21, "height"); + registerDataName(Display.class, 22, "glow_color"); + + // Block display + registerDataName(Display.BlockDisplay.class, 23, "material"); + + // Item display + registerDataName(Display.ItemDisplay.class, 23, "item"); + registerDataName(Display.ItemDisplay.class, 24, "model_transform"); + + // Text display + registerDataName(Display.TextDisplay.class, 23, "text"); + registerDataName(Display.TextDisplay.class, 24, "line_width"); + registerDataName(Display.TextDisplay.class, 25, "background_color"); + registerDataName(Display.TextDisplay.class, 26, "text_opacity"); + registerDataName(Display.TextDisplay.class, 27, "text_display_flags"); + + // Thrown item projectile + registerDataName(ThrowableProjectile.class, 8, "item"); + + // Eye of ender + registerDataName(EyeOfEnder.class, 8, "item"); + + // Falling block + registerDataName(FireworkRocketEntity.class, 8, "spawn_position"); + + // Area effect cloud + registerDataName(AreaEffectCloud.class, 8, "radius"); + registerDataName(AreaEffectCloud.class, 9, "color"); + registerDataName(AreaEffectCloud.class, 10, "waiting"); + registerDataName(AreaEffectCloud.class, 11, "particle"); + + // Fishing hook + registerDataName(FishingHook.class, 8, "hooked_entity_id"); + registerDataName(FishingHook.class, 9, "catchable"); + + // Abstract arrow + registerDataName(AbstractArrow.class, 8, "abstract_arrow_flags"); + registerDataName(AbstractArrow.class, 9, "piercing_level"); + + // Arrow + registerDataName(Arrow.class, 10, "color"); + + // Thrown trident + registerDataName(ThrownTrident.class, 10, "loyalty_level"); + registerDataName(ThrownTrident.class, 11, "enchantment_glint"); + + // Boat + registerDataName(Boat.class, 8, "shaking_ticks"); + registerDataName(Boat.class, 9, "shaking_direction"); + registerDataName(Boat.class, 10, "damage_taken"); + registerDataName(Boat.class, 11, "type"); + registerDataName(Boat.class, 12, "left_paddle_moving"); + registerDataName(Boat.class, 13, "right_paddle_moving"); + registerDataName(Boat.class, 14, "bubble_shaking_ticks"); + + // End crystal + registerDataName(EndCrystal.class, 8, "beam_target"); + registerDataName(EndCrystal.class, 9, "showing_bottom"); + + // Small fireball + registerDataName(SmallFireball.class, 8, "item"); + + // Fireball + registerDataName(Fireball.class, 8, "item"); + + // Wither skull + registerDataName(WitherSkull.class, 8, "invulnerable"); + + // Firework rocket + registerDataName(FireworkRocketEntity.class, 8, "item"); + registerDataName(FireworkRocketEntity.class, 9, "shooter_id"); + registerDataName(FireworkRocketEntity.class, 10, "shot_at_angle"); + + // Item frame + registerDataName(ItemFrame.class, 8, "item"); + registerDataName(ItemFrame.class, 9, "rotation"); + + // Painting + registerDataName(Painting.class, 8, "painting_variant"); + + // Living entity + registerDataName(LivingEntity.class, 8, "living_entity_flags"); + registerDataName(LivingEntity.class, 9, "health"); + registerDataName(LivingEntity.class, 10, "potion_effect_color"); + registerDataName(LivingEntity.class, 11, "is_potion_effect_ambient"); + registerDataName(LivingEntity.class, 12, "arrows_in_body"); + registerDataName(LivingEntity.class, 13, "bee_stingers_in_body"); + registerDataName(LivingEntity.class, 14, "bed_location"); + + // Player + registerDataName(Player.class, 15, "additional_hearts"); + registerDataName(Player.class, 16, "score"); + registerDataName(Player.class, 17, "skin_parts"); + registerDataName(Player.class, 18, "main_hand"); + registerDataName(Player.class, 19, "left_shoulder_entity"); + registerDataName(Player.class, 20, "right_shoulder_entity"); + + // Armor stand + registerDataName(ArmorStand.class, 15, "armor_stand_flags"); + registerDataName(ArmorStand.class, 16, "head_rotation"); + registerDataName(ArmorStand.class, 17, "body_rotation"); + registerDataName(ArmorStand.class, 18, "left_arm_rotation"); + registerDataName(ArmorStand.class, 19, "right_arm_rotation"); + registerDataName(ArmorStand.class, 20, "left_leg_rotation"); + registerDataName(ArmorStand.class, 21, "right_leg_rotation"); + + // Mob + registerDataName(Mob.class, 15, "mob_flags"); + + // Bat flags + registerDataName(Bat.class, 16, "bat_flags"); + + // Dolphin + registerDataName(Dolphin.class, 16, "treasure_location"); + registerDataName(Dolphin.class, 17, "has_fish"); + registerDataName(Dolphin.class, 18, "moisture_level"); + + // Abstract Fish + registerDataName(AbstractFish.class, 16, "from_bucket"); + + // PufferFish + registerDataName(Pufferfish.class, 17, "puff_state"); + + // Tropical fish + registerDataName(TropicalFish.class, 17, "variant"); + + // Ageable mob + registerDataName(AgeableMob.class, 16, "is_baby"); + + // Sniffer + registerDataName(Sniffer.class, 17, "sniffer_state"); + registerDataName(Sniffer.class, 18, "finish_dig_time"); + + // Abstract horse + registerDataName(AbstractHorse.class, 17, "horse_flags"); + + // Horse + registerDataName(Horse.class, 18, "variant"); + + // Camel + registerDataName(Camel.class, 18, "is_dashing"); + registerDataName(Camel.class, 19, "last_pose_change"); + + // Chested horse + registerDataName(AbstractChestedHorse.class, 18, "has_chest"); + + // Llama + registerDataName(Llama.class, 19, "strength"); + registerDataName(Llama.class, 20, "carpet_color"); + registerDataName(Llama.class, 21, "variant"); + + // Axolotl + registerDataName(Axolotl.class, 17, "variant"); + registerDataName(Axolotl.class, 18, "playing_dead"); + registerDataName(Axolotl.class, 19, "from_bucket"); + + // Bee + registerDataName(Bee.class, 17, "bee_flags"); + registerDataName(Bee.class, 18, "anger_time"); + + // Fox + registerDataName(Fox.class, 17, "type"); + registerDataName(Fox.class, 18, "fox_flags"); + registerDataName(Fox.class, 19, "first_trusted_uuid"); + registerDataName(Fox.class, 20, "second_trusted_uuid"); + + // Frog + registerDataName(Frog.class, 17, "variant"); + registerDataName(Frog.class, 18, "target_id"); + + // Ocelot + registerDataName(Ocelot.class, 17, "is_trusting"); + + // Panda + registerDataName(Panda.class, 17, "ask_for_bamboo_timer"); + registerDataName(Panda.class, 18, "sneeze_timer"); + registerDataName(Panda.class, 19, "eat_timer"); + registerDataName(Panda.class, 20, "main_gene"); + registerDataName(Panda.class, 21, "hidden_gene"); + registerDataName(Panda.class, 22, "panda_flags"); + + // Pig + registerDataName(Pig.class, 17, "has_saddle"); + registerDataName(Pig.class, 18, "boost_ticks"); + + // Rabbit + registerDataName(Rabbit.class, 17, "type"); + + // Turtle + registerDataName(Turtle.class, 17, "home_location"); + registerDataName(Turtle.class, 18, "has_egg"); + registerDataName(Turtle.class, 19, "laying_egg"); + registerDataName(Turtle.class, 20, "travel_location"); + registerDataName(Turtle.class, 21, "going_home"); + registerDataName(Turtle.class, 20, "traveling"); + + // Polar bear + registerDataName(PolarBear.class, 17, "standing_up"); + + // Hoglin + registerDataName(Hoglin.class, 17, "immune_to_zombification"); + + // Mooshroom + registerDataName(MushroomCow.class, 17, "variant"); + + // Sheep + registerDataName(Sheep.class, 17, "sheep_wool_flags"); + + // Strider + registerDataName(Strider.class, 17, "boost_ticks"); + registerDataName(Strider.class, 18, "shaking"); + registerDataName(Strider.class, 19, "has_saddle"); + + // Tamable animal + registerDataName(TamableAnimal.class, 17, "tamable_animal_flags"); + registerDataName(TamableAnimal.class, 18, "owner"); + + // Cat + registerDataName(Cat.class, 19, "variant"); + registerDataName(Cat.class, 20, "lying"); + registerDataName(Cat.class, 20, "relaxed"); + registerDataName(Cat.class, 21, "collar_color"); + + // Wolf + registerDataName(Wolf.class, 19, "begging"); + registerDataName(Wolf.class, 20, "collar_color"); + registerDataName(Wolf.class, 21, "anger_time"); + + // Parrot + registerDataName(Parrot.class, 19, "variant"); + + // Abstract villager + registerDataName(AbstractVillager.class, 17, "head_shake_ticks"); + + // Villager + registerDataName(Villager.class, 18, "villager_data"); + + // Iron golem + registerDataName(IronGolem.class, 16, "iron_golem_flags"); + + // Snow golem + registerDataName(SnowGolem.class, 16, "snow_golem_pumpkin_flags"); + + // Shulker + registerDataName(Shulker.class, 16, "attach_face"); + registerDataName(Shulker.class, 17, "attachment_location"); + registerDataName(Shulker.class, 18, "peek"); + registerDataName(Shulker.class, 19, "color"); + + // Base piglin + registerDataName(AbstractPiglin.class, 16, "immune_to_zombification"); + + // Piglin + registerDataName(Piglin.class, 17, "is_baby"); + registerDataName(Piglin.class, 18, "charging_crossbow"); + registerDataName(Piglin.class, 19, "dancing"); + + // Blaze + registerDataName(Blaze.class, 16, "blaze_flags"); + + // Creeper + registerDataName(Creeper.class, 16, "state"); + registerDataName(Creeper.class, 17, "charged"); + registerDataName(Creeper.class, 18, "ignited"); + + // Goat + registerDataName(Goat.class, 17, "screaming"); + registerDataName(Goat.class, 18, "has_left_horn"); + registerDataName(Goat.class, 19, "has_right_horn"); + + // Guardian + registerDataName(Guardian.class, 16, "spikes_retracted"); + registerDataName(Guardian.class, 17, "target_id"); + + // Raider + registerDataName(Raider.class, 16, "celebrating"); + + // Pillager + registerDataName(Pillager.class, 17, "charging_crossbow"); + + // Spellcaster illager + registerDataName(SpellcasterIllager.class, 17, "spell"); + + // Witch + registerDataName(Witch.class, 17, "drinking_potion"); + + // Vex + registerDataName(Vex.class, 16, "vex_flags"); + + // Spider + registerDataName(Spider.class, 16, "spider_flags"); + + // Warden + registerDataName(Warden.class, 16, "anger_level"); + + // Wither + registerDataName(WitherBoss.class, 16, "center_head_target"); + registerDataName(WitherBoss.class, 17, "left_head_target"); + registerDataName(WitherBoss.class, 18, "right_head_target"); + registerDataName(WitherBoss.class, 19, "invulnerable_time"); + + // Zoglin + registerDataName(Zoglin.class, 16, "is_baby"); + + // Zombie + registerDataName(Zombie.class, 16, "is_baby"); + registerDataName(Zombie.class, 17, "type"); // Unused + registerDataName(Zombie.class, 18, "converting_in_water"); + + // Zombie villager + registerDataName(ZombieVillager.class, 19, "is_converting"); + registerDataName(ZombieVillager.class, 20, "villager_data"); + + // Enderman + registerDataName(EnderMan.class, 16, "carried_block"); + registerDataName(EnderMan.class, 17, "screaming"); + registerDataName(EnderMan.class, 18, "staring"); + + // Ender dragon + registerDataName(EnderDragon.class, 16, "phase"); + + // Ghast + registerDataName(Ghast.class, 16, "attacking"); + + // Phantom + registerDataName(Phantom.class, 16, "size"); + + // Slime + registerDataName(Slime.class, 16, "size"); + + // Abstract minecart + registerDataName(AbstractMinecart.class, 8, "shaking_ticks"); + registerDataName(AbstractMinecart.class, 9, "shaking_direction"); + registerDataName(AbstractMinecart.class, 10, "damage_taken"); + registerDataName(AbstractMinecart.class, 11, "display_block_id"); + registerDataName(AbstractMinecart.class, 12, "display_block_y"); + registerDataName(AbstractMinecart.class, 13, "show_display_block"); + + // Minecraft furnace + registerDataName(MinecartFurnace.class, 14, "has_fuel"); + + // Minecraft command block + registerDataName(MinecartCommandBlock.class, 14, "command"); + registerDataName(MinecartCommandBlock.class, 15, "last_output"); + + // Primed TNT + registerDataName(PrimedTnt.class, 8, "fuse_ticks"); + } + + public static int getIdForName(Class entityClass, String name) { + Class currentClass = entityClass; + int id = getIdFromClass(currentClass, name); + while (id == -1) { + currentClass = currentClass.getSuperclass(); + if (currentClass == Object.class) { + break; + } + id = getIdFromClass(currentClass, name); + } + return id; + } + + private static int getIdFromClass(Class entityClass, String name) { + Map nameToId = entityDataNames.get(entityClass); + int id = nameToId != null ? nameToId.getOrDefault(name, -1) : -1; + if (id == -1 && ArgumentHelper.matchesInteger(name)) { + id = new ElementTag(name).asInt(); + } + return id; + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java new file mode 100644 index 0000000000..0822fa3036 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java @@ -0,0 +1,841 @@ +package com.denizenscript.denizen.nms.v1_20.helpers; + +import com.denizenscript.denizen.Denizen; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.interfaces.EntityHelper; +import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; +import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_20.impl.jnbt.CompoundTagImpl; +import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.utilities.Utilities; +import com.denizenscript.denizen.utilities.packets.NetworkInterceptHelper; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.MapTag; +import com.denizenscript.denizencore.scripts.commands.core.ReflectionSetCommand; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import com.denizenscript.denizencore.utilities.text.StringHolder; +import io.netty.buffer.Unpooled; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import net.minecraft.commands.arguments.EntityAnchorArgument; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.protocol.game.ClientboundMoveEntityPacket; +import net.minecraft.network.protocol.game.ClientboundPlayerLookAtPacket; +import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket; +import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.dedicated.DedicatedPlayerList; +import net.minecraft.server.level.ChunkMap; +import net.minecraft.server.level.ServerEntity; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.CommonListenerCookie; +import net.minecraft.server.players.PlayerList; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.damagesource.CombatRules; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageSources; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.MoverType; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.entity.ai.navigation.PathNavigation; +import net.minecraft.world.entity.item.FallingBlockEntity; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.item.PrimedTnt; +import net.minecraft.world.entity.monster.EnderMan; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.SpawnerBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.pathfinder.Path; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeInstance; +import org.bukkit.block.CreatureSpawner; +import org.bukkit.block.data.BlockData; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.block.CraftBlock; +import org.bukkit.craftbukkit.v1_20_R4.block.CraftCreatureSpawner; +import org.bukkit.craftbukkit.v1_20_R4.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_20_R4.entity.*; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftLocation; +import org.bukkit.entity.*; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; +import org.bukkit.util.BoundingBox; +import org.bukkit.util.Vector; + +import java.lang.invoke.MethodHandle; +import java.lang.reflect.Field; +import java.util.*; +import java.util.function.BiConsumer; + +public class EntityHelperImpl extends EntityHelper { + + public static final MethodHandle ENTITY_ONGROUND_SETTER = ReflectionHelper.getFinalSetter(net.minecraft.world.entity.Entity.class, ReflectionMappingsInfo.Entity_onGround, boolean.class); + + public static final EntityDataAccessor ENDERMAN_DATA_ACCESSOR_SCREAMING = ReflectionHelper.getFieldValue(EnderMan.class, ReflectionMappingsInfo.EnderMan_DATA_CREEPY, null); + + @Override + public void setInvisible(Entity entity, boolean invisible) { + ((CraftEntity) entity).getHandle().setInvisible(invisible); + } + + @Override + public boolean isInvisible(Entity entity) { + return ((CraftEntity) entity).getHandle().isInvisible(); + } + + @Override + public void setPose(Entity entity, Pose pose) { + ((CraftEntity) entity).getHandle().setPose(net.minecraft.world.entity.Pose.values()[pose.ordinal()]); + } + + @Override + public double getDamageTo(LivingEntity attacker, Entity target) { + double damage = 0; + AttributeInstance attrib = attacker.getAttribute(Attribute.GENERIC_ATTACK_DAMAGE); + if (attrib != null) { + damage = attrib.getValue(); + } + if (attacker.getEquipment() != null) { + damage += EnchantmentHelper.getDamageBonus(CraftItemStack.asNMSCopy(attacker.getEquipment().getItemInMainHand()), CraftEntityType.bukkitToMinecraft(target.getType())); + } + if (damage <= 0) { + return 0; + } + if (target != null) { + DamageSource source; + net.minecraft.world.entity.Entity nmsTarget = ((CraftEntity) target).getHandle(); + if (attacker instanceof CraftPlayer playerAttacker) { + source = nmsTarget.level().damageSources().playerAttack(playerAttacker.getHandle()); + } + else { + source = nmsTarget.level().damageSources().mobAttack(((CraftLivingEntity) attacker).getHandle()); + } + if (nmsTarget.isInvulnerableTo(source)) { + return 0; + } + if (!(nmsTarget instanceof net.minecraft.world.entity.LivingEntity livingTarget)) { + return damage; + } + damage = CombatRules.getDamageAfterAbsorb((float) damage, source, (float) livingTarget.getArmorValue(), (float) livingTarget.getAttributeValue(Attributes.ARMOR_TOUGHNESS)); + int enchantDamageModifier = EnchantmentHelper.getDamageProtection(livingTarget.getArmorSlots(), source); + if (enchantDamageModifier > 0) { + damage = CombatRules.getDamageAfterMagicAbsorb((float) damage, (float) enchantDamageModifier); + } + } + return damage; + } + + public static final MethodHandle LIVINGENTITY_AUTOSPINATTACK_SETTER = ReflectionHelper.getFinalSetter(net.minecraft.world.entity.LivingEntity.class, ReflectionMappingsInfo.LivingEntity_autoSpinAttackTicks); + public static final MethodHandle LIVINGENTITY_SETLIVINGENTITYFLAG = ReflectionHelper.getMethodHandle(net.minecraft.world.entity.LivingEntity.class, ReflectionMappingsInfo.LivingEntity_setLivingEntityFlag_method, int.class, boolean.class); + + @Override + public void setRiptide(Entity entity, boolean state) { + try { + net.minecraft.world.entity.LivingEntity nmsEntity = ((CraftLivingEntity) entity).getHandle(); + LIVINGENTITY_AUTOSPINATTACK_SETTER.invoke(nmsEntity, state ? 0 : 1); + LIVINGENTITY_SETLIVINGENTITYFLAG.invoke(nmsEntity, 4, true); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + @Override + public void forceInteraction(Player player, Location location) { + CraftPlayer craftPlayer = (CraftPlayer) player; + // TODO: 1.20.6: passing a null player isn't valid (and seemingly never was) - need to require HumanEntity in the mechanism + ((CraftBlock) location.getBlock()).getNMS().useItemOn(craftPlayer.getHandle().getMainHandItem(), ((CraftWorld) location.getWorld()).getHandle(), + craftPlayer.getHandle(), InteractionHand.MAIN_HAND, + new BlockHitResult(new Vec3(0, 0, 0), null, CraftLocation.toBlockPosition(location), false)); + } + + @Override + public CompoundTag getNbtData(Entity entity) { + net.minecraft.nbt.CompoundTag compound = new net.minecraft.nbt.CompoundTag(); + ((CraftEntity) entity).getHandle().saveAsPassenger(compound); + return CompoundTagImpl.fromNMSTag(compound); + } + + @Override + public void setNbtData(Entity entity, CompoundTag compoundTag) { + ((CraftEntity) entity).getHandle().load(((CompoundTagImpl) compoundTag).toNMSTag()); + } + + /* + Entity Movement + */ + + private final static Map followTasks = new HashMap<>(); + + @Override + public void stopFollowing(Entity follower) { + if (follower == null) { + return; + } + UUID uuid = follower.getUniqueId(); + if (followTasks.containsKey(uuid)) { + followTasks.get(uuid).cancel(); + } + } + + @Override + public void stopWalking(Entity entity) { + if (((CraftEntity) entity).getHandle() instanceof Mob nmsMob) { + nmsMob.getNavigation().stop(); + } + } + + @Override + public void follow(final Entity target, final Entity follower, final double speed, final double lead, + final double maxRange, final boolean allowWander, final boolean teleport) { + if (target == null || follower == null) { + return; + } + + final net.minecraft.world.entity.Entity nmsEntityFollower = ((CraftEntity) follower).getHandle(); + if (!(nmsEntityFollower instanceof Mob nmsFollower)) { + return; + } + final PathNavigation followerNavigation = nmsFollower.getNavigation(); + + UUID uuid = follower.getUniqueId(); + + if (followTasks.containsKey(uuid)) { + followTasks.get(uuid).cancel(); + } + + final int locationNearInt = (int) Math.floor(lead); + final boolean hasMax = maxRange > lead; + + followTasks.put(follower.getUniqueId(), new BukkitRunnable() { + + private boolean inRadius = false; + + public void run() { + if (!target.isValid() || !follower.isValid()) { + this.cancel(); + } + followerNavigation.setSpeedModifier(2D); + Location targetLocation = target.getLocation(); + Path path; + + if (hasMax && !Utilities.checkLocation(targetLocation, follower.getLocation(), maxRange) + && !target.isDead() && target.isOnGround()) { + if (!inRadius) { + if (teleport) { + follower.teleport(Utilities.getWalkableLocationNear(targetLocation, locationNearInt)); + } + else { + cancel(); + } + } + else { + inRadius = false; + path = followerNavigation.createPath(targetLocation.getX(), targetLocation.getY(), targetLocation.getZ(), 0); + if (path != null) { + followerNavigation.moveTo(path, 1D); + followerNavigation.setSpeedModifier(2D); + } + } + } + else if (!inRadius && !Utilities.checkLocation(targetLocation, follower.getLocation(), lead)) { + path = followerNavigation.createPath(targetLocation.getX(), targetLocation.getY(), targetLocation.getZ(), 0); + if (path != null) { + followerNavigation.moveTo(path, 1D); + followerNavigation.setSpeedModifier(2D); + } + } + else { + inRadius = true; + } + if (inRadius && !allowWander) { + followerNavigation.stop(); + } + nmsFollower.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(speed); + } + }.runTaskTimer(NMSHandler.getJavaPlugin(), 0, 10)); + } + + @Override + public void walkTo(final LivingEntity entity, Location location, Double speed, final Runnable callback) { + if (entity == null || location == null) { + return; + } + net.minecraft.world.entity.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + if (!(nmsEntity instanceof final Mob nmsMob)) { + return; + } + final PathNavigation entityNavigation = nmsMob.getNavigation(); + final Path path; + final boolean aiDisabled = !entity.hasAI(); + if (aiDisabled) { + entity.setAI(true); + try { + ENTITY_ONGROUND_SETTER.invoke(nmsMob, true); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + path = entityNavigation.createPath(location.getX(), location.getY(), location.getZ(), 1); + if (path != null) { + nmsMob.goalSelector.enableControlFlag(Goal.Flag.MOVE); + entityNavigation.moveTo(path, 1D); + final double oldSpeed = nmsMob.getAttribute(Attributes.MOVEMENT_SPEED).getBaseValue(); + if (speed != null) { + nmsMob.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(speed); + } + new BukkitRunnable() { + @Override + public void run() { + if (!entity.isValid()) { + if (callback != null) { + callback.run(); + } + cancel(); + return; + } + if (aiDisabled && entity instanceof Wolf wolf) { + wolf.setAngry(false); + } + if (entityNavigation.isDone() || path.isDone()) { + if (callback != null) { + callback.run(); + } + if (speed != null) { + nmsMob.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(oldSpeed); + } + if (aiDisabled) { + entity.setAI(false); + } + cancel(); + } + } + }.runTaskTimer(NMSHandler.getJavaPlugin(), 1, 1); + } + //if (!Utilities.checkLocation(location, entity.getLocation(), 20)) { + // TODO: generate waypoints to the target location? + else { + entity.teleport(location); + } + } + + @Override + public void sendAllUpdatePackets(Entity entity) { + ChunkMap tracker = ((ServerLevel) ((CraftEntity) entity).getHandle().level()).getChunkSource().chunkMap; + ChunkMap.TrackedEntity entityTracker = tracker.entityMap.get(entity.getEntityId()); + if (entityTracker == null) { + return; + } + try { + ServerEntity serverEntity = (ServerEntity) PacketHelperImpl.ENTITY_TRACKER_ENTRY_GETTER.get(entityTracker); + serverEntity.sendChanges(); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + /* + Hide Entity + */ + + @Override + public void sendHidePacket(Player pl, Entity entity) { + if (entity instanceof Player player) { + pl.hidePlayer(Denizen.getInstance(), player); + return; + } + ServerPlayer nmsPlayer = ((CraftPlayer) pl).getHandle(); + if (nmsPlayer.connection != null && !pl.equals(entity)) { + ChunkMap.TrackedEntity entry = nmsPlayer.serverLevel().getChunkSource().chunkMap.entityMap.get(entity.getEntityId()); + if (entry != null) { + entry.removePlayer(nmsPlayer); + } + if (Denizen.supportsPaper) { // Workaround for Paper issue + nmsPlayer.connection.send(new ClientboundRemoveEntitiesPacket(entity.getEntityId())); + } + } + } + + @Override + public void sendShowPacket(Player pl, Entity entity) { + if (entity instanceof Player player) { + pl.showPlayer(Denizen.getInstance(), player); + return; + } + ServerPlayer nmsPlayer = ((CraftPlayer) pl).getHandle(); + if (nmsPlayer.connection != null && !pl.equals(entity)) { + ChunkMap.TrackedEntity entry = nmsPlayer.serverLevel().getChunkSource().chunkMap.entityMap.get(entity.getEntityId()); + if (entry != null) { + entry.removePlayer(nmsPlayer); + entry.updatePlayer(nmsPlayer); + } + } + } + + @Override + public void rotate(Entity entity, float yaw, float pitch) { + // If this entity is a real player instead of a player type NPC, + // it will appear to be online + if (entity instanceof Player player && player.isOnline()) { + NetworkInterceptHelper.enable(); + float relYaw = (yaw - entity.getLocation().getYaw()) % 360; + if (relYaw > 180) { + relYaw -= 360; + } + final float actualRelYaw = relYaw; + float relPitch = pitch - entity.getLocation().getPitch(); + NMSHandler.packetHelper.sendRelativeLookPacket(player, actualRelYaw, relPitch); + } + else if (entity instanceof LivingEntity) { + if (entity instanceof EnderDragon) { + yaw = normalizeYaw(yaw - 180); + } + look(entity, yaw, pitch); + } + else { + net.minecraft.world.entity.Entity handle = ((CraftEntity) entity).getHandle(); + handle.setYRot(yaw - 360); + handle.setXRot(pitch); + } + } + + @Override + public float getBaseYaw(LivingEntity entity) { + return ((CraftLivingEntity) entity).getHandle().yBodyRot; + } + + @Override + public void look(Entity entity, float yaw, float pitch) { + net.minecraft.world.entity.Entity handle = ((CraftEntity) entity).getHandle(); + if (handle == null) { + Debug.echoError("Cannot set look direction for unspawned entity " + entity.getUniqueId()); + return; + } + handle.setYRot(yaw); + if (handle instanceof net.minecraft.world.entity.LivingEntity nmsLivingEntity) { + while (yaw < -180.0F) { + yaw += 360.0F; + } + while (yaw >= 180.0F) { + yaw -= 360.0F; + } + nmsLivingEntity.yBodyRotO = yaw; + if (!(handle instanceof net.minecraft.world.entity.player.Player)) { + nmsLivingEntity.setYBodyRot(yaw); + } + nmsLivingEntity.setYHeadRot(yaw); + } + handle.setXRot(pitch); + } + + private static HitResult rayTrace(World world, Vector start, Vector end) { + try { + NMSHandler.chunkHelper.changeChunkServerThread(world); + return ((CraftWorld) world).getHandle().clip(new ClipContext(new Vec3(start.getX(), start.getY(), start.getZ()), + new Vec3(end.getX(), end.getY(), end.getZ()), + ClipContext.Block.OUTLINE, ClipContext.Fluid.NONE, CollisionContext.empty())); + } + finally { + NMSHandler.chunkHelper.restoreServerThread(world); + } + } + + @Override + public boolean canTrace(World world, Vector start, Vector end) { + HitResult pos = rayTrace(world, start, end); + if (pos == null) { + return true; + } + return pos.getType() == HitResult.Type.MISS; + } + + @Override + public void snapPositionTo(Entity entity, Vector vector) { + ((CraftEntity) entity).getHandle().setPosRaw(vector.getX(), vector.getY(), vector.getZ()); + } + + @Override + public void move(Entity entity, Vector vector) { + ((CraftEntity) entity).getHandle().move(MoverType.SELF, new Vec3(vector.getX(), vector.getY(), vector.getZ())); + } + + @Override + public boolean internalLook(Player player, Location at) { + PacketHelperImpl.send(player, new ClientboundPlayerLookAtPacket(EntityAnchorArgument.Anchor.EYES, at.getX(), at.getY(), at.getZ())); + return true; + } + + public static long entityToPacket(double x) { + return Mth.lfloor(x * 4096.0D); + } + + @Override + public void fakeMove(Entity entity, Vector vector) { + long x = entityToPacket(vector.getX()); + long y = entityToPacket(vector.getY()); + long z = entityToPacket(vector.getZ()); + ClientboundMoveEntityPacket packet = new ClientboundMoveEntityPacket.Pos(entity.getEntityId(), (short) x, (short) y, (short) z, entity.isOnGround()); + for (Player player : getPlayersThatSee(entity)) { + PacketHelperImpl.send(player, packet); + } + } + + @Override + public void fakeTeleport(Entity entity, Location location) { + FriendlyByteBuf packetData = new FriendlyByteBuf(Unpooled.buffer()); + // Referenced from ClientboundTeleportEntityPacket source + packetData.writeVarInt(entity.getEntityId()); + packetData.writeDouble(location.getX()); + packetData.writeDouble(location.getY()); + packetData.writeDouble(location.getZ()); + packetData.writeByte((byte)((int)(location.getYaw() * 256.0F / 360.0F))); + packetData.writeByte((byte)((int)(location.getPitch() * 256.0F / 360.0F))); + packetData.writeBoolean(entity.isOnGround()); + ClientboundTeleportEntityPacket packet = ClientboundTeleportEntityPacket.STREAM_CODEC.decode(packetData); + for (Player player : getPlayersThatSee(entity)) { + PacketHelperImpl.send(player, packet); + } + } + + @Override + public void clientResetLoc(Entity entity) { + ClientboundTeleportEntityPacket packet = new ClientboundTeleportEntityPacket(((CraftEntity) entity).getHandle()); + for (Player player : getPlayersThatSee(entity)) { + PacketHelperImpl.send(player, packet); + } + } + + @Override + public void teleport(Entity entity, Location loc) { + net.minecraft.world.entity.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + nmsEntity.setYRot(loc.getYaw()); + nmsEntity.setXRot(loc.getPitch()); + if (nmsEntity instanceof ServerPlayer) { + nmsEntity.teleportTo(loc.getX(), loc.getY(), loc.getZ()); + } + nmsEntity.setPos(loc.getX(), loc.getY(), loc.getZ()); + } + + @Override + public void setBoundingBox(Entity entity, BoundingBox box) { + ((CraftEntity) entity).getHandle().setBoundingBox(new AABB(box.getMinX(), box.getMinY(), box.getMinZ(), box.getMaxX(), box.getMaxY(), box.getMaxZ())); + } + + public static final Field EXPERIENCE_ORB_AGE = ReflectionHelper.getFields(net.minecraft.world.entity.ExperienceOrb.class).get(ReflectionMappingsInfo.ExperienceOrb_age, int.class); + + @Override + public void setTicksLived(Entity entity, int ticks) { + // Bypass Spigot's must-be-at-least-1-tick requirement, as negative tick counts are useful + ((CraftEntity) entity).getHandle().tickCount = ticks; + if (entity instanceof CraftFallingBlock craftFallingBlock) { + craftFallingBlock.getHandle().time = ticks; + } + else if (entity instanceof CraftItem craftItem) { + ((ItemEntity) craftItem.getHandle()).age = ticks; + } + else if (entity instanceof CraftExperienceOrb craftExperienceOrb) { + try { + EXPERIENCE_ORB_AGE.setInt(craftExperienceOrb.getHandle(), ticks); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + } + + @Override + public void setHeadAngle(LivingEntity entity, float angle) { + ((CraftLivingEntity) entity).getHandle().setYHeadRot(angle); + } + + @Override + public void setEndermanAngry(Enderman enderman, boolean angry) { + ((CraftEnderman) enderman).getHandle().getEntityData().set(ENDERMAN_DATA_ACCESSOR_SCREAMING, angry); + } + + public static class FakeDamageSrc extends DamageSource { public DamageSource real; public FakeDamageSrc(DamageSource src) { super(null); real = src; } } + + public static DamageSources backupDamageSources; + + public static DamageSources getReusableDamageSources() { + if (backupDamageSources == null) { + backupDamageSources = ((CraftWorld) Bukkit.getWorlds().get(0)).getHandle().damageSources(); + } + return backupDamageSources; + } + + public static DamageSource getSourceFor(net.minecraft.world.entity.Entity nmsSource, EntityDamageEvent.DamageCause cause, net.minecraft.world.entity.Entity nmsSourceProvider) { + DamageSources sources = nmsSourceProvider == null ? getReusableDamageSources() : nmsSourceProvider.level().damageSources(); + DamageSource src = sources.generic(); + if (nmsSource != null) { + if (nmsSource instanceof net.minecraft.world.entity.player.Player nmsPlayer) { + src = nmsSource.level().damageSources().playerAttack(nmsPlayer); + } + else if (nmsSource instanceof net.minecraft.world.entity.LivingEntity nmsLivingEntity) { + src = nmsSource.level().damageSources().mobAttack(nmsLivingEntity); + } + } + if (cause == null) { + return src; + } + return switch (cause) { + case CONTACT -> sources.cactus(); + case ENTITY_ATTACK -> sources.mobAttack(nmsSource instanceof net.minecraft.world.entity.LivingEntity nmsLivingEntity ? nmsLivingEntity : null); + case ENTITY_SWEEP_ATTACK -> src != sources.generic() ? src.sweep() : src; + case PROJECTILE -> sources.thrown(nmsSource, nmsSource != null && nmsSource.getBukkitEntity() instanceof Projectile projectile + && projectile.getShooter() instanceof CraftEntity shooter ? shooter.getHandle() : null); + case SUFFOCATION -> sources.inWall(); + case FALL -> sources.fall(); + case FIRE -> sources.inFire(); + case FIRE_TICK -> sources.onFire(); + case MELTING -> sources.melting(); + case LAVA -> sources.lava(); + case DROWNING -> sources.drown(); + case BLOCK_EXPLOSION -> nmsSource instanceof PrimedTnt primedTnt ? sources.explosion(primedTnt, primedTnt.getOwner()) : sources.explosion(null); + case ENTITY_EXPLOSION -> sources.explosion(nmsSource, null); + case VOID -> sources.fellOutOfWorld(); + case LIGHTNING -> sources.lightningBolt(); + case STARVATION -> sources.starve(); + case POISON -> sources.poison(); + case MAGIC -> sources.magic(); + case WITHER -> sources.wither(); + case FALLING_BLOCK -> sources.fallingBlock(nmsSource); + case THORNS -> sources.thorns(nmsSource); + case DRAGON_BREATH -> sources.dragonBreath(); + case CUSTOM -> sources.generic(); + case FLY_INTO_WALL -> sources.flyIntoWall(); + case HOT_FLOOR -> sources.hotFloor(); + case CRAMMING -> sources.cramming(); + case DRYOUT -> sources.dryOut(); + case FREEZE -> sources.freeze(); + case SONIC_BOOM -> sources.sonicBoom(nmsSource); + case WORLD_BORDER -> sources.outOfBorder(); + case KILL -> sources.genericKill(); + case SUICIDE -> new FakeDamageSrc(src); + }; + } + + @Override + public void damage(LivingEntity target, float amount, EntityTag source, Location sourceLoc, EntityDamageEvent.DamageCause cause) { + if (target == null) { + return; + } + net.minecraft.world.entity.LivingEntity nmsTarget = ((CraftLivingEntity) target).getHandle(); + net.minecraft.world.entity.Entity nmsSource = source == null ? null : ((CraftEntity) source.getBukkitEntity()).getHandle(); + DamageSource src = getSourceFor(nmsSource, cause, nmsTarget); + if (src instanceof FakeDamageSrc fakeDamageSrc) { + src = fakeDamageSrc.real; + if (fireFakeDamageEvent(target, source, sourceLoc, cause, amount).isCancelled()) { + return; + } + } + nmsTarget.hurt(src, amount); + } + + @Override + public void setLastHurtBy(LivingEntity mob, LivingEntity damager) { + ((CraftLivingEntity) mob).getHandle().setLastHurtByMob(((CraftLivingEntity) damager).getHandle()); + } + + public static final Field FALLINGBLOCK_BLOCK_STATE = ReflectionHelper.getFields(FallingBlockEntity.class).getFirstOfType(BlockState.class); + + @Override + public void setFallingBlockType(FallingBlock fallingBlock, BlockData block) { + BlockState state = ((CraftBlockData) block).getState(); + FallingBlockEntity nmsEntity = ((CraftFallingBlock) fallingBlock).getHandle(); + try { + FALLINGBLOCK_BLOCK_STATE.set(nmsEntity, state); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + @Override + public EntityTag getMobSpawnerDisplayEntity(CreatureSpawner spawner) { + SpawnerBlockEntity nmsSpawner = BlockHelperImpl.getTE((CraftCreatureSpawner) spawner); + ServerLevel level = ((CraftWorld) spawner.getWorld()).getHandle(); + net.minecraft.world.entity.Entity nmsEntity = nmsSpawner.getSpawner().getOrCreateDisplayEntity(level, nmsSpawner.getBlockPos()); + return new EntityTag(nmsEntity.getBukkitEntity()); + } + + public static final Field ZOMBIE_INWATERTIME = ReflectionHelper.getFields(net.minecraft.world.entity.monster.Zombie.class).get(ReflectionMappingsInfo.Zombie_inWaterTime, int.class); + + @Override + public int getInWaterTime(Zombie zombie) { + try { + return ZOMBIE_INWATERTIME.getInt(((CraftZombie) zombie).getHandle()); + } + catch (Throwable ex) { + Debug.echoError(ex); + return 0; + } + } + + @Override + public void setInWaterTime(Zombie zombie, int ticks) { + try { + ZOMBIE_INWATERTIME.setInt(((CraftZombie) zombie).getHandle(), ticks); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + public static final MethodHandle TRACKING_RANGE_SETTER = ReflectionHelper.getFinalSetterForFirstOfType(ChunkMap.TrackedEntity.class, int.class); + + @Override + public void setTrackingRange(Entity entity, int range) { + try { + ChunkMap map = ((CraftWorld) entity.getWorld()).getHandle().getChunkSource().chunkMap; + ChunkMap.TrackedEntity entry = map.entityMap.get(entity.getEntityId()); + if (entry != null) { + TRACKING_RANGE_SETTER.invoke(entry, range); + } + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + @Override + public boolean isAggressive(org.bukkit.entity.Mob mob) { + return ((CraftMob) mob).getHandle().isAggressive(); + } + + @Override + public void setAggressive(org.bukkit.entity.Mob mob, boolean aggressive) { + ((CraftMob) mob).getHandle().setAggressive(aggressive); + } + + // Use reflection because Paper changes the method return type + public static final MethodHandle PLAYERLIST_REMOVE = ReflectionHelper.getMethodHandle(PlayerList.class, "remove", ServerPlayer.class); + + @Override + public void setUUID(Entity entity, UUID id) { + try { + net.minecraft.world.entity.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + nmsEntity.stopRiding(); + nmsEntity.getPassengers().forEach(net.minecraft.world.entity.Entity::stopRiding); + Level level = nmsEntity.level(); + DedicatedPlayerList playerList = ((CraftServer) Bukkit.getServer()).getHandle(); + if (nmsEntity instanceof ServerPlayer nmsPlayer) { + PLAYERLIST_REMOVE.invoke(playerList, nmsPlayer); + } + else { + nmsEntity.remove(net.minecraft.world.entity.Entity.RemovalReason.DISCARDED); + } + nmsEntity.unsetRemoved(); + nmsEntity.setUUID(id); + if (nmsEntity instanceof ServerPlayer nmsPlayer) { + playerList.placeNewPlayer(DenizenNetworkManagerImpl.getConnection(nmsPlayer), nmsPlayer, new CommonListenerCookie(nmsPlayer.getGameProfile(), nmsPlayer.connection.latency(), nmsPlayer.clientInformation(), nmsPlayer.connection.isTransferred())); + } + else { + level.addFreshEntity(nmsEntity); + } + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + public static final Field SynchedEntityData_itemsById = ReflectionHelper.getFields(SynchedEntityData.class).get(ReflectionMappingsInfo.SynchedEntityData_itemsById); + + public static Int2ObjectMap> getDataItems(Entity entity) { + try { + return (Int2ObjectMap>) SynchedEntityData_itemsById.get(((CraftEntity) entity).getHandle().getEntityData()); + } + catch (IllegalAccessException e) { + throw new RuntimeException(e); // Stop the code here to avoid NPEs down the road + } + } + + public static void convertToInternalData(Entity entity, MapTag internalData, BiConsumer, Object> processConverted) { + Int2ObjectMap> dataItemsById = getDataItems(entity); + for (Map.Entry entry : internalData.entrySet()) { + int id = EntityDataNameMapper.getIdForName(((CraftEntity) entity).getHandle().getClass(), entry.getKey().low); + if (id == -1) { + Debug.echoError("Invalid internal data key: " + entry.getKey()); + return; + } + SynchedEntityData.DataItem dataItem = dataItemsById.get(id); + if (dataItem == null) { + Debug.echoError("Invalid internal data id '" + id + "': couldn't be matched to any internal data for entity of type '" + entity.getType() + "'."); + return; + } + Object converted = ReflectionSetCommand.convertObjectTypeFor(dataItem.getValue().getClass(), entry.getValue()); + if (converted != null) { + processConverted.accept(dataItem, converted); + } + } + } + + @Override + public List convertInternalEntityDataValues(Entity entity, MapTag internalData) { + List dataValues = new ArrayList<>(internalData.size()); + convertToInternalData(entity, internalData, (dataItem, converted) -> dataValues.add(PacketHelperImpl.createEntityData(dataItem.getAccessor(), converted))); + return dataValues; + } + + @Override + public void modifyInternalEntityData(Entity entity, MapTag internalData) { + SynchedEntityData nmsEntityData = ((CraftEntity) entity).getHandle().getEntityData(); + convertToInternalData(entity, internalData, (dataItem, converted) -> nmsEntityData.set(dataItem.getAccessor(), converted)); + } + + @Override + public void startUsingItem(LivingEntity entity, EquipmentSlot hand) { + ((CraftLivingEntity) entity).getHandle().startUsingItem(hand == EquipmentSlot.HAND ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND); + } + + @Override + public void stopUsingItem(LivingEntity entity) { + ((CraftLivingEntity) entity).getHandle().stopUsingItem(); + } + + @Override + public void openHorseInventory(Player player, AbstractHorse horse) { + net.minecraft.world.entity.animal.horse.AbstractHorse nmsHorse = ((CraftAbstractHorse) horse).getHandle(); + ((CraftPlayer) player).getHandle().openHorseInventory(nmsHorse, nmsHorse.inventory); + } + + private net.minecraft.nbt.CompoundTag getRawEntityNBT(net.minecraft.world.entity.Entity entity) { + return entity.saveWithoutId(new net.minecraft.nbt.CompoundTag()); + } + + @Override + public CompoundTag getRawNBT(Entity entity) { + return CompoundTagImpl.fromNMSTag(getRawEntityNBT(((CraftEntity) entity).getHandle())); + } + + @Override + public void modifyRawNBT(Entity entity, CompoundTag tag) { + net.minecraft.world.entity.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + net.minecraft.nbt.CompoundTag nmsTag = ((CompoundTagImpl) tag).toNMSTag(); + net.minecraft.nbt.CompoundTag nmsMergedTag = getRawEntityNBT(nmsEntity).merge(nmsTag); + UUID uuid = nmsEntity.getUUID(); + nmsEntity.load(nmsMergedTag); + nmsEntity.setUUID(uuid); + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/FishingHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/FishingHelperImpl.java new file mode 100644 index 0000000000..94a3c107c4 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/FishingHelperImpl.java @@ -0,0 +1,160 @@ +package com.denizenscript.denizen.nms.v1_20.helpers; + +import com.denizenscript.denizen.nms.interfaces.FishingHelper; +import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import com.google.common.collect.Maps; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.projectile.FishingHook; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.storage.loot.BuiltInLootTables; +import net.minecraft.world.level.storage.loot.LootParams; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.parameters.LootContextParam; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.Vec3; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftFishHook; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; +import org.bukkit.entity.FishHook; +import org.bukkit.entity.Player; +import org.bukkit.event.entity.CreatureSpawnEvent; + +import java.lang.reflect.Field; +import java.util.List; +import java.util.Map; + +public class FishingHelperImpl implements FishingHelper { + + @Override + public org.bukkit.inventory.ItemStack getResult(FishHook fishHook, CatchType catchType) { + FishingHook nmsHook = ((CraftFishHook) fishHook).getHandle(); + ItemStack result = switch (catchType) { + case DEFAULT -> { + float f = ((CraftWorld) fishHook.getWorld()).getHandle().random.nextFloat(); + int i = EnchantmentHelper.getMobLooting(nmsHook.getPlayerOwner()); + int j = EnchantmentHelper.getEnchantmentLevel(Enchantments.LUCK_OF_THE_SEA, nmsHook.getPlayerOwner()); + float f1 = 0.1F - (float) i * 0.025F - (float) j * 0.01F; + float f2 = 0.05F + (float) i * 0.01F - (float) j * 0.01F; + + f1 = Mth.clamp(f1, 0.0F, 1.0F); + f2 = Mth.clamp(f2, 0.0F, 1.0F); + if (f < f1) { + yield catchRandomJunk(nmsHook); + } + else { + f -= f1; + if (f < f2) { + yield catchRandomTreasure(nmsHook); + } + else { + yield catchRandomFish(nmsHook); + } + } + } + case JUNK -> catchRandomJunk(nmsHook); + case TREASURE -> catchRandomTreasure(nmsHook); + case FISH -> catchRandomFish(nmsHook); + default -> null; + }; + return result != null ? CraftItemStack.asBukkitCopy(result) : null; + } + + public ItemStack getRandomReward(FishingHook nmsHook, ResourceKey key) { + ServerLevel nmsWorld = (ServerLevel) nmsHook.level(); + Map, Object> params = Maps.newIdentityHashMap(); + params.put(LootContextParams.ORIGIN, new Vec3(nmsHook.getX(), nmsHook.getY(), nmsHook.getZ())); + params.put(LootContextParams.TOOL, new ItemStack(Items.FISHING_ROD)); + LootParams nmsLootParams = new LootParams(nmsWorld, params, Maps.newHashMap(), 0); + List nmsItems = nmsHook.registryAccess().registryOrThrow(Registries.LOOT_TABLE).get(key).getRandomItems(nmsLootParams); + return nmsItems.get(nmsWorld.random.nextInt(nmsItems.size())); + } + + @Override + public FishHook spawnHook(Location location, Player player) { + ServerLevel nmsWorld = ((CraftWorld) location.getWorld()).getHandle(); + FishingHook hook = new FishingHook(((CraftPlayer) player).getHandle(), nmsWorld, 0, 0); + nmsWorld.addFreshEntity(hook, CreatureSpawnEvent.SpawnReason.CUSTOM); + return (FishHook) hook.getBukkitEntity(); + } + + private ItemStack catchRandomJunk(FishingHook fishHook) { + return getRandomReward(fishHook, BuiltInLootTables.FISHING_JUNK); + } + + private ItemStack catchRandomTreasure(FishingHook fishHook) { + return getRandomReward(fishHook, BuiltInLootTables.FISHING_TREASURE); + } + + private ItemStack catchRandomFish(FishingHook fishHook) { + return getRandomReward(fishHook, BuiltInLootTables.FISHING_FISH); + } + + public static final Field FISHING_HOOK_NIBBLE = ReflectionHelper.getFields(FishingHook.class).get(ReflectionMappingsInfo.FishingHook_nibble, int.class); + public static final Field FISHING_HOOK_LURE_TIME = ReflectionHelper.getFields(FishingHook.class).get(ReflectionMappingsInfo.FishingHook_timeUntilLured, int.class); + public static final Field FISHING_HOOK_HOOK_TIME = ReflectionHelper.getFields(FishingHook.class).get(ReflectionMappingsInfo.FishingHook_timeUntilHooked, int.class); + + @Override + public FishHook getHookFrom(Player player) { + FishingHook nmsHook = ((CraftPlayer) player).getHandle().fishing; + if (nmsHook == null) { + return null; + } + return (FishHook) nmsHook.getBukkitEntity(); + } + + @Override + public void setNibble(FishHook hook, int ticks) { + FishingHook nmsHook = ((CraftFishHook) hook).getHandle(); + try { + FISHING_HOOK_NIBBLE.setInt(nmsHook, ticks); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + @Override + public void setHookTime(FishHook hook, int ticks) { + FishingHook nmsHook = ((CraftFishHook) hook).getHandle(); + try { + FISHING_HOOK_HOOK_TIME.setInt(nmsHook, ticks); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + @Override + public int getLureTime(FishHook hook) { + FishingHook nmsHook = ((CraftFishHook) hook).getHandle(); + try { + return FISHING_HOOK_LURE_TIME.getInt(nmsHook); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + return -1; + } + + @Override + public void setLureTime(FishHook hook, int ticks) { + FishingHook nmsHook = ((CraftFishHook) hook).getHandle(); + try { + FISHING_HOOK_LURE_TIME.setInt(nmsHook, ticks); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java new file mode 100644 index 0000000000..7fcf984016 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java @@ -0,0 +1,611 @@ +package com.denizenscript.denizen.nms.v1_20.helpers; + +import com.denizenscript.denizen.nms.interfaces.ItemHelper; +import com.denizenscript.denizen.nms.util.PlayerProfile; +import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; +import com.denizenscript.denizen.nms.util.jnbt.IntArrayTag; +import com.denizenscript.denizen.nms.util.jnbt.Tag; +import com.denizenscript.denizen.nms.v1_20.Handler; +import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_20.impl.ProfileEditorImpl; +import com.denizenscript.denizen.nms.v1_20.impl.jnbt.CompoundTagImpl; +import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizen.utilities.FormattedTextHelper; +import com.denizenscript.denizen.utilities.PaperAPITools; +import com.denizenscript.denizencore.utilities.CoreUtilities; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import com.google.common.collect.*; +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.properties.Property; +import com.mojang.serialization.Dynamic; +import net.md_5.bungee.api.ChatColor; +import net.minecraft.advancements.critereon.BlockPredicate; +import net.minecraft.core.*; +import net.minecraft.core.component.DataComponentMap; +import net.minecraft.core.component.DataComponentType; +import net.minecraft.core.component.DataComponents; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.datafix.fixes.References; +import net.minecraft.world.item.AdventureModePredicate; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.alchemy.PotionBrewing; +import net.minecraft.world.item.component.CustomData; +import net.minecraft.world.item.component.ItemLore; +import net.minecraft.world.item.component.ResolvableProfile; +import net.minecraft.world.item.crafting.*; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.MapColor; +import net.minecraft.world.level.saveddata.maps.MapId; +import net.minecraft.world.level.saveddata.maps.MapItemSavedData; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.block.data.BlockData; +import org.bukkit.craftbukkit.v1_20_R4.CraftRegistry; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftInventoryPlayer; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftRecipe; +import org.bukkit.craftbukkit.v1_20_R4.map.CraftMapView; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftNamespacedKey; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.RecipeChoice; +import org.bukkit.inventory.ShapedRecipe; +import org.bukkit.map.MapView; + +import java.lang.reflect.Field; +import java.util.*; +import java.util.function.Predicate; + +public class ItemHelperImpl extends ItemHelper { + + public static net.minecraft.world.item.crafting.RecipeHolder getNMSRecipe(NamespacedKey key) { + ResourceLocation nmsKey = CraftNamespacedKey.toMinecraft(key); + return ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager().byKey(nmsKey).orElse(null); + } + + public static final Field Item_components = ReflectionHelper.getFields(Item.class).get(ReflectionMappingsInfo.Item_components, DataComponentMap.class); + + public void setMaxStackSize(Material material, int size) { + try { + ReflectionHelper.getFinalSetter(Material.class, "maxStack").invoke(material, size); + Item nmsItem = BuiltInRegistries.ITEM.get(CraftNamespacedKey.toMinecraft(material.getKey())); + DataComponentMap currentComponents = nmsItem.components(); + Item_components.set(nmsItem, DataComponentMap.composite(currentComponents, DataComponentMap.builder().set(DataComponents.MAX_STACK_SIZE, size).build())); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + @Override + public Integer burnTime(Material material) { + return AbstractFurnaceBlockEntity.getFuel().get(CraftMagicNumbers.getItem(material)); + } + + @Override + public void setShapedRecipeIngredient(ShapedRecipe recipe, char c, ItemStack[] item, boolean exact) { + if (item.length == 1 && item[0].getType() == Material.AIR) { + recipe.setIngredient(c, new RecipeChoice.MaterialChoice(Material.AIR)); + } + else if (exact) { + recipe.setIngredient(c, new RecipeChoice.ExactChoice(item)); + } + else { + Material[] mats = new Material[item.length]; + for (int i = 0; i < item.length; i++) { + mats[i] = item[i].getType(); + } + recipe.setIngredient(c, new RecipeChoice.MaterialChoice(mats)); + } + } + + public static Ingredient itemArrayToRecipe(ItemStack[] items, boolean exact) { + Ingredient.ItemValue[] stacks = new Ingredient.ItemValue[items.length]; + for (int i = 0; i < items.length; i++) { + stacks[i] = new Ingredient.ItemValue(CraftItemStack.asNMSCopy(items[i])); + } + Ingredient itemRecipe = new Ingredient(Arrays.stream(stacks)); + itemRecipe.exact = exact; + return itemRecipe; + } + + @Override + public void registerFurnaceRecipe(String keyName, String group, ItemStack result, ItemStack[] ingredient, float exp, int time, String type, boolean exact, String category) { + ResourceLocation key = new ResourceLocation("denizen", keyName); + Ingredient itemRecipe = itemArrayToRecipe(ingredient, exact); + AbstractCookingRecipe recipe; + CookingBookCategory categoryValue = category == null ? CookingBookCategory.MISC : CookingBookCategory.valueOf(CoreUtilities.toUpperCase(category)); + if (type.equalsIgnoreCase("smoker")) { + recipe = new SmokingRecipe(group, categoryValue, itemRecipe, CraftItemStack.asNMSCopy(result), exp, time); + } + else if (type.equalsIgnoreCase("blast")) { + recipe = new BlastingRecipe(group, categoryValue, itemRecipe, CraftItemStack.asNMSCopy(result), exp, time); + } + else if (type.equalsIgnoreCase("campfire")) { + recipe = new CampfireCookingRecipe(group, categoryValue, itemRecipe, CraftItemStack.asNMSCopy(result), exp, time); + } + else { + recipe = new SmeltingRecipe(group, categoryValue, itemRecipe, CraftItemStack.asNMSCopy(result), exp, time); + } + RecipeHolder holder = new RecipeHolder<>(key, recipe); + ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager().addRecipe(holder); + } + + @Override + public void registerStonecuttingRecipe(String keyName, String group, ItemStack result, ItemStack[] ingredient, boolean exact) { + ResourceLocation key = new ResourceLocation("denizen", keyName); + Ingredient itemRecipe = itemArrayToRecipe(ingredient, exact); + StonecutterRecipe recipe = new StonecutterRecipe(group, itemRecipe, CraftItemStack.asNMSCopy(result)); + RecipeHolder holder = new RecipeHolder<>(key, recipe); + ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager().addRecipe(holder); + } + + @Override + public void registerSmithingRecipe(String keyName, ItemStack result, ItemStack[] baseItem, boolean baseExact, ItemStack[] upgradeItem, boolean upgradeExact, ItemStack[] templateItem, boolean templateExact) { + ResourceLocation key = new ResourceLocation("denizen", keyName); + Ingredient templateItemRecipe = itemArrayToRecipe(templateItem, templateExact); + Ingredient baseItemRecipe = itemArrayToRecipe(baseItem, baseExact); + Ingredient upgradeItemRecipe = itemArrayToRecipe(upgradeItem, upgradeExact); + SmithingTransformRecipe recipe = new SmithingTransformRecipe(templateItemRecipe, baseItemRecipe, upgradeItemRecipe, CraftItemStack.asNMSCopy(result)); + RecipeHolder holder = new RecipeHolder<>(key, recipe); + ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager().addRecipe(holder); + } + + @Override + public void registerShapelessRecipe(String keyName, String group, ItemStack result, List ingredients, boolean[] exact, String category) { + ResourceLocation key = new ResourceLocation("denizen", keyName); + ArrayList ingredientList = new ArrayList<>(); + CraftingBookCategory categoryValue = category == null ? CraftingBookCategory.MISC : CraftingBookCategory.valueOf(CoreUtilities.toUpperCase(category)); + for (int i = 0; i < ingredients.size(); i++) { + ingredientList.add(itemArrayToRecipe(ingredients.get(i), exact[i])); + } + // TODO: 1.19.3: Add support for choosing a CraftingBookCategory + ShapelessRecipe recipe = new ShapelessRecipe(group, categoryValue, CraftItemStack.asNMSCopy(result), NonNullList.of(null, ingredientList.toArray(new Ingredient[0]))); + RecipeHolder holder = new RecipeHolder<>(key, recipe); + ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager().addRecipe(holder); + } + + @Override + public String getJsonString(ItemStack itemStack) { + String json = CraftItemStack.asNMSCopy(itemStack).getDisplayName().getStyle().toString().replace("\\", "\\\\").replace("\"", "\\\""); + return json.substring(176, json.length() - 185); + } + + @Override + public String getRawHoverText(ItemStack itemStack) { + // TODO: 1.20.6: this is relatively hot code, ideally should have some early returns before serializing the item + net.minecraft.nbt.Tag tag = CraftItemStack.asNMSCopy(itemStack).saveOptional(CraftRegistry.getMinecraftRegistry()); + if (tag == null) { + return null; + } + return tag.toString(); + } + + @Override + public PlayerProfile getSkullSkin(ItemStack is) { + net.minecraft.world.item.ItemStack itemStack = CraftItemStack.asNMSCopy(is); + ResolvableProfile profile = itemStack.get(DataComponents.PROFILE); + if (profile != null) { + Property property = Iterables.getFirst(profile.properties().get("textures"), null); + return new PlayerProfile(profile.name().orElse(null), profile.id().orElse(null), + property != null ? property.value() : null, + property != null ? property.signature() : null); + } + return null; + } + + @Override + public ItemStack setSkullSkin(ItemStack itemStack, PlayerProfile playerProfile) { + GameProfile gameProfile = ProfileEditorImpl.getGameProfile(playerProfile); + net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(itemStack); + nmsItemStack.set(DataComponents.PROFILE, new ResolvableProfile(gameProfile)); + return CraftItemStack.asBukkitCopy(nmsItemStack); + } + + @Override + public ItemStack addNbtData(ItemStack itemStack, String key, Tag value) { + net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(itemStack); + nmsItemStack.update(DataComponents.CUSTOM_DATA, CustomData.EMPTY, customData -> { + CompoundTag updatedTag = CompoundTagImpl.fromNMSTag(customData.getUnsafe()).createBuilder().put(key, value).build(); + return CustomData.of(((CompoundTagImpl) updatedTag).toNMSTag()); + }); + return CraftItemStack.asBukkitCopy(nmsItemStack); + } + + // TODO: 1.20.6: this now needs to serialize components into NBT every single time, should probably only return custom NBT data with specialized methods for other usages + // TODO: 1.20.6: NBT structure is different basically everywhere, usages of this will need an update + @Override + public CompoundTag getNbtData(ItemStack itemStack) { + net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(itemStack); + if (nmsItemStack != null && !nmsItemStack.isEmpty()) { + return CompoundTagImpl.fromNMSTag((net.minecraft.nbt.CompoundTag) nmsItemStack.save(CraftRegistry.getMinecraftRegistry())); + } + return new CompoundTagImpl(new HashMap<>()); + } + + // TODO: 1.20.6: same as getNbtData, ideally needs to only set custom NBT data and have specialized methods for other usages + @Override + public ItemStack setNbtData(ItemStack itemStack, CompoundTag compoundTag) { + net.minecraft.world.item.ItemStack nmsItemStack = net.minecraft.world.item.ItemStack.parseOptional(CraftRegistry.getMinecraftRegistry(), ((CompoundTagImpl) compoundTag).toNMSTag()); + return CraftItemStack.asBukkitCopy(nmsItemStack); + } + + @Override + public CompoundTag getCustomData(ItemStack item) { + CustomData customData = CraftItemStack.asNMSCopy(item).get(DataComponents.CUSTOM_DATA); + return customData != null ? CompoundTagImpl.fromNMSTag(customData.getUnsafe()) : null; + } + + @Override + public ItemStack setCustomData(ItemStack item, CompoundTag data) { + net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item); + if (data == null) { + nmsItemStack.remove(DataComponents.CUSTOM_DATA); + } + else { + nmsItemStack.set(DataComponents.CUSTOM_DATA, CustomData.of(((CompoundTagImpl) data).toNMSTag())); + } + return CraftItemStack.asBukkitCopy(nmsItemStack); + } + + public static final int DATA_VERSION_1_20_4 = 3700; + + @Override + public ItemStack setPartialOldNbt(ItemStack item, CompoundTag oldTag) { + int currentDataVersion = CraftMagicNumbers.INSTANCE.getDataVersion(); + net.minecraft.nbt.CompoundTag nmsOldTag = new net.minecraft.nbt.CompoundTag(); + nmsOldTag.putString("id", item.getType().getKey().toString()); + nmsOldTag.putByte("Count", (byte) item.getAmount()); + nmsOldTag.put("tag", ((CompoundTagImpl) oldTag).toNMSTag()); + net.minecraft.nbt.CompoundTag nmsUpdatedTag = (net.minecraft.nbt.CompoundTag) MinecraftServer.getServer().fixerUpper.update(References.ITEM_STACK, new Dynamic<>(NbtOps.INSTANCE, nmsOldTag), DATA_VERSION_1_20_4, currentDataVersion).getValue(); + net.minecraft.nbt.CompoundTag nmsCurrentTag = (net.minecraft.nbt.CompoundTag) CraftItemStack.asNMSCopy(item).save(CraftRegistry.getMinecraftRegistry()); + net.minecraft.nbt.CompoundTag nmsMergedTag = nmsCurrentTag.merge(nmsUpdatedTag); + return CraftItemStack.asBukkitCopy(net.minecraft.world.item.ItemStack.parse(CraftRegistry.getMinecraftRegistry(), nmsMergedTag).orElseThrow()); + } + + @Override + public CompoundTag getEntityData(ItemStack item) { + CustomData entityData = CraftItemStack.asNMSCopy(item).get(DataComponents.ENTITY_DATA); + return entityData != null ? CompoundTagImpl.fromNMSTag(entityData.getUnsafe()) : null; + } + + public static final net.minecraft.nbt.CompoundTag EMPTY_TAG = new net.minecraft.nbt.CompoundTag(); + + @Override + public ItemStack setEntityData(ItemStack item, CompoundTag entityNbt, EntityType entityType) { + net.minecraft.nbt.CompoundTag nmsEntityNbt = EMPTY_TAG; + if (entityNbt != null && !entityNbt.isEmpty() && (!entityNbt.containsKey("id") || entityNbt.size() > 1)) { + nmsEntityNbt = ((CompoundTagImpl) entityNbt).toNMSTag(); + nmsEntityNbt.putString("id", entityType.getKey().toString()); + } + net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item); + CustomData.set(DataComponents.ENTITY_DATA, nmsItemStack, nmsEntityNbt); + return CraftItemStack.asBukkitCopy(nmsItemStack); + } + + public static final Field AdventureModePredicate_predicates = ReflectionHelper.getFields(AdventureModePredicate.class).get(ReflectionMappingsInfo.AdventureModePredicate_predicates); + + @Override + public List getCanPlaceOn(ItemStack item) { + return getAdventureModePredicateMaterials(item, DataComponents.CAN_PLACE_ON); + } + + @Override + public ItemStack setCanPlaceOn(ItemStack item, List canPlaceOn) { + return setAdventureModePredicateMaterials(item, DataComponents.CAN_PLACE_ON, canPlaceOn); + } + + @Override + public List getCanBreak(ItemStack item) { + return getAdventureModePredicateMaterials(item, DataComponents.CAN_BREAK); + } + + @Override + public ItemStack setCanBreak(ItemStack item, List canBreak) { + return setAdventureModePredicateMaterials(item, DataComponents.CAN_BREAK, canBreak); + } + + private List getAdventureModePredicateMaterials(ItemStack item, DataComponentType nmsComponent) { + AdventureModePredicate nmsAdventurePredicate = CraftItemStack.asNMSCopy(item).get(nmsComponent); + if (nmsAdventurePredicate == null) { + return null; + } + List nmsPredicates; + try { + nmsPredicates = (List) AdventureModePredicate_predicates.get(nmsAdventurePredicate); + } + catch (Throwable e) { + Debug.echoError(e); + return null; + } + List materials = new ArrayList<>(); + for (BlockPredicate nmsPredicate : nmsPredicates) { + nmsPredicate.blocks().ifPresent(nmsHolderSet -> { + for (Holder nmsHolder : nmsHolderSet) { + materials.add(CraftMagicNumbers.getMaterial(nmsHolder.value())); + } + }); + } + return materials; + } + + private ItemStack setAdventureModePredicateMaterials(ItemStack item, DataComponentType nmsComponent, List materials) { + net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item); + AdventureModePredicate nmsAdventurePredicate = nmsItemStack.get(nmsComponent); + if (materials == null) { + if (nmsAdventurePredicate == null) { + return item; + } + nmsItemStack.remove(nmsComponent); + return CraftItemStack.asBukkitCopy(nmsItemStack); + } + BlockPredicate nmsPredicate = new BlockPredicate(Optional.of( + HolderSet.direct(material -> BuiltInRegistries.BLOCK.getHolder(CraftNamespacedKey.toMinecraft(material.getKey())).orElseThrow(), materials) + ), Optional.empty(), Optional.empty()); + nmsItemStack.set(nmsComponent, new AdventureModePredicate(List.of(nmsPredicate), nmsAdventurePredicate == null || nmsAdventurePredicate.showInTooltip())); + return CraftItemStack.asBukkitCopy(nmsItemStack); + } + + @Override + public void setInventoryItem(Inventory inventory, ItemStack item, int slot) { + if (inventory instanceof CraftInventoryPlayer && ((CraftInventoryPlayer) inventory).getInventory().player == null) { + ((CraftInventoryPlayer) inventory).getInventory().setItem(slot, CraftItemStack.asNMSCopy(item)); + } + else { + inventory.setItem(slot, item); + } + } + + @Override + public IntArrayTag convertUuidToNbt(UUID id) { + return new IntArrayTag(NbtUtils.createUUID(id).getAsIntArray()); + } + + @Override + public UUID convertNbtToUuid(IntArrayTag id) { + return NbtUtils.loadUUID(new net.minecraft.nbt.IntArrayTag(id.getValue())); + } + + @Override + public String getDisplayName(ItemTag item) { + if (!item.getItemMeta().hasDisplayName()) { + return null; + } + net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item.getItemStack()); + Component nmsDisplayName = nmsItemStack.get(DataComponents.CUSTOM_NAME); + return FormattedTextHelper.stringify(Handler.componentToSpigot(nmsDisplayName)); + } + + @Override + public List getLore(ItemTag item) { + if (!item.getItemMeta().hasLore()) { + return null; + } + net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item.getItemStack()); + ItemLore nmsLore = nmsItemStack.get(DataComponents.LORE); + List outList = new ArrayList<>(nmsLore.lines().size()); + for (Component nmsLoreLine : nmsLore.lines()) { + outList.add(FormattedTextHelper.stringify(Handler.componentToSpigot(nmsLoreLine))); + } + return outList; + } + + @Override + public void setDisplayName(ItemTag item, String name) { + net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item.getItemStack()); + if (name == null || name.isEmpty()) { + nmsItemStack.remove(DataComponents.CUSTOM_NAME); + } + else { + nmsItemStack.set(DataComponents.CUSTOM_NAME, Handler.componentToNMS(FormattedTextHelper.parse(name, ChatColor.WHITE))); + } + item.setItemStack(CraftItemStack.asBukkitCopy(nmsItemStack)); + } + + @Override + public void setLore(ItemTag item, List lore) { + net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item.getItemStack()); + if (lore == null || lore.isEmpty()) { + nmsItemStack.remove(DataComponents.LORE); + } + else { + List nmsLore = new ArrayList<>(lore.size()); + for (String loreLine : lore) { + nmsLore.add(Handler.componentToNMS(FormattedTextHelper.parse(loreLine, ChatColor.WHITE))); + } + nmsItemStack.set(DataComponents.LORE, new ItemLore(nmsLore)); + } + item.setItemStack(CraftItemStack.asBukkitCopy(nmsItemStack)); + } + + /** + * Copied from MapItem.getCorrectStateForFluidBlock. + */ + public static BlockState getCorrectStateForFluidBlock(Level world, BlockState blockState, BlockPos blockPos) { + FluidState fluid = blockState.getFluidState(); + return !fluid.isEmpty() && !blockState.isFaceSturdy(world, blockPos, Direction.UP) ? fluid.createLegacyBlock() : blockState; + } + + /** + * Copied from MapItem.update, redesigned slightly to render totally rather than just relative to a player. + * Some variables manually renamed for readability. + */ + public static void renderFullMap(MapItemSavedData worldmap, int xMin, int zMin, int xMax, int zMax) { + Level world = ((CraftWorld) worldmap.mapView.getWorld()).getHandle(); + int scale = 1 << worldmap.scale; + int mapX = worldmap.centerX; + int mapZ = worldmap.centerZ; + for (int x = xMin; x < xMax; x++) { + double d0 = 0.0D; + for (int z = zMin; z < zMax; z++) { + int k2 = (mapX / scale + x - 64) * scale; + int l2 = (mapZ / scale + z - 64) * scale; + Multiset multiset = LinkedHashMultiset.create(); + LevelChunk chunk = world.getChunkAt(new BlockPos(k2, 0, l2)); + if (!chunk.isEmpty()) { + ChunkPos chunkcoordintpair = chunk.getPos(); + int i3 = k2 & 15; + int j3 = l2 & 15; + int k3 = 0; + double d1 = 0.0D; + if (world.dimensionType().hasCeiling()) { + int l3 = k2 + l2 * 231871; + l3 = l3 * l3 * 31287121 + l3 * 11; + if ((l3 >> 20 & 1) == 0) { + multiset.add(Blocks.DIRT.defaultBlockState().getMapColor(world, BlockPos.ZERO), 10); + } + else { + multiset.add(Blocks.STONE.defaultBlockState().getMapColor(world, BlockPos.ZERO), 100); + } + + d1 = 100.0D; + } + else { + BlockPos.MutableBlockPos blockposition_mutableblockposition = new BlockPos.MutableBlockPos(); + BlockPos.MutableBlockPos blockposition_mutableblockposition1 = new BlockPos.MutableBlockPos(); + for (int i4 = 0; i4 < scale; ++i4) { + for (int j4 = 0; j4 < scale; ++j4) { + int k4 = chunk.getHeight(Heightmap.Types.WORLD_SURFACE, i4 + i3, j4 + j3) + 1; + BlockState iblockdata; + if (k4 <= world.getMinBuildHeight() + 1) { + iblockdata = Blocks.BEDROCK.defaultBlockState(); + } + else { + do { + --k4; + blockposition_mutableblockposition.set(chunkcoordintpair.getMinBlockX() + i4 + i3, k4, chunkcoordintpair.getMinBlockZ() + j4 + j3); + iblockdata = chunk.getBlockState(blockposition_mutableblockposition); + } while (iblockdata.getMapColor(world, blockposition_mutableblockposition) == MapColor.NONE && k4 > world.getMinBuildHeight()); + if (k4 > world.getMinBuildHeight() && !iblockdata.getFluidState().isEmpty()) { + int l4 = k4 - 1; + blockposition_mutableblockposition1.set(blockposition_mutableblockposition); + + BlockState iblockdata1; + do { + blockposition_mutableblockposition1.setY(l4--); + iblockdata1 = chunk.getBlockState(blockposition_mutableblockposition1); + k3++; + } while (l4 > world.getMinBuildHeight() && !iblockdata1.getFluidState().isEmpty()); + iblockdata = getCorrectStateForFluidBlock(world, iblockdata, blockposition_mutableblockposition); + } + } + worldmap.checkBanners(world, chunkcoordintpair.getMinBlockX() + i4 + i3, chunkcoordintpair.getMinBlockZ() + j4 + j3); + d1 += (double) k4 / (double) (scale * scale); + multiset.add(iblockdata.getMapColor(world, blockposition_mutableblockposition)); + } + } + } + k3 /= scale * scale; + double d2 = (d1 - d0) * 4.0D / (double) (scale + 4) + ((double) (x + z & 1) - 0.5D) * 0.4D; + byte b0 = 1; + if (d2 > 0.6D) { + b0 = 2; + } + if (d2 < -0.6D) { + b0 = 0; + } + MapColor materialmapcolor = Iterables.getFirst(Multisets.copyHighestCountFirst(multiset), MapColor.NONE); + if (materialmapcolor == MapColor.WATER) { + d2 = (double) k3 * 0.1D + (double) (x + z & 1) * 0.2D; + b0 = 1; + if (d2 < 0.5D) { + b0 = 2; + } + if (d2 > 0.9D) { + b0 = 0; + } + } + d0 = d1; + worldmap.updateColor(x, z, (byte) (materialmapcolor.id * 4 + b0)); + } + } + } + } + + @Override + public boolean renderEntireMap(int mapId, int xMin, int zMin, int xMax, int zMax) { + MapItemSavedData worldmap = ((CraftServer) Bukkit.getServer()).getServer().getLevel(net.minecraft.world.level.Level.OVERWORLD).getMapData(new MapId(mapId)); + if (worldmap == null) { + return false; + } + renderFullMap(worldmap, xMin, zMin, xMax, zMax); + return true; + } + + @Override + public BlockData getPlacedBlock(Material material) { + Item nmsItem = BuiltInRegistries.ITEM.getOptional(CraftNamespacedKey.toMinecraft(material.getKey())).orElse(null); + if (nmsItem instanceof BlockItem) { + Block block = ((BlockItem) nmsItem).getBlock(); + return CraftBlockData.fromData(block.defaultBlockState()); + } + return null; + } + + @Override + public boolean isValidMix(ItemStack input, ItemStack ingredient) { + net.minecraft.world.item.ItemStack nmsInput = CraftItemStack.asNMSCopy(input); + net.minecraft.world.item.ItemStack nmsIngredient = CraftItemStack.asNMSCopy(ingredient); + return MinecraftServer.getServer().potionBrewing().hasMix(nmsInput, nmsIngredient); + } + + public static Class PaperPotionMix_CLASS = null; + public static Map customBrewingRecipes = null; + + @Override + public Map getCustomBrewingRecipes() { + if (customBrewingRecipes == null) { + customBrewingRecipes = Maps.transformValues((Map) ReflectionHelper.getFieldValue(PotionBrewing.class, "CUSTOM_MIXES", null), paperMix -> { + if (PaperPotionMix_CLASS == null) { + PaperPotionMix_CLASS = paperMix.getClass(); + } + RecipeChoice ingredient = convertChoice(ReflectionHelper.getFieldValue(PaperPotionMix_CLASS, "ingredient", paperMix)); + RecipeChoice input = convertChoice(ReflectionHelper.getFieldValue(PaperPotionMix_CLASS, "input", paperMix)); + ItemStack result = CraftItemStack.asBukkitCopy(ReflectionHelper.getFieldValue(PaperPotionMix_CLASS, "result", paperMix)); + return new BrewingRecipe(input, ingredient, result); + }); + } + return customBrewingRecipes; + } + + private RecipeChoice convertChoice(Predicate nmsPredicate) { + // Not an instance of net.minecraft.world.item.crafting.Ingredient = a predicate recipe choice + if (nmsPredicate instanceof Ingredient ingredient) { + return CraftRecipe.toBukkit(ingredient); + } + return PaperAPITools.instance.createPredicateRecipeChoice(item -> nmsPredicate.test(CraftItemStack.asNMSCopy(item))); + } + + @Override + public byte[] renderMap(MapView mapView, Player player) { + return ((CraftMapView) mapView).render((CraftPlayer) player).buffer; + } + + @Override + public int getFoodPoints(Material itemType) { + return CraftMagicNumbers.getItem(itemType).components().get(DataComponents.FOOD).nutrition(); + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PacketHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PacketHelperImpl.java new file mode 100644 index 0000000000..9d9ce41a15 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PacketHelperImpl.java @@ -0,0 +1,431 @@ +package com.denizenscript.denizen.nms.v1_20.helpers; + +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.interfaces.PacketHelper; +import com.denizenscript.denizen.nms.v1_20.Handler; +import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_20.impl.SidebarImpl; +import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.scripts.commands.entity.TeleportCommand; +import com.denizenscript.denizen.utilities.FormattedTextHelper; +import com.denizenscript.denizen.utilities.Utilities; +import com.denizenscript.denizen.utilities.maps.MapImage; +import com.denizenscript.denizen.utilities.packets.NetworkInterceptHelper; +import com.denizenscript.denizencore.objects.core.ColorTag; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.md_5.bungee.api.ChatColor; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket; +import net.minecraft.network.protocol.common.custom.BrandPayload; +import net.minecraft.network.protocol.common.custom.GameTestAddMarkerDebugPayload; +import net.minecraft.network.protocol.common.custom.GameTestClearMarkersDebugPayload; +import net.minecraft.network.protocol.game.*; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ChunkMap; +import net.minecraft.server.level.ServerEntity; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.RelativeMovement; +import net.minecraft.world.entity.ai.attributes.AttributeInstance; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.monster.CaveSpider; +import net.minecraft.world.entity.monster.Creeper; +import net.minecraft.world.entity.monster.EnderMan; +import net.minecraft.world.entity.monster.Spider; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.saveddata.maps.MapItemSavedData; +import net.minecraft.world.scores.PlayerTeam; +import net.minecraft.world.scores.Team; +import org.bukkit.Bukkit; +import org.bukkit.EntityEffect; +import org.bukkit.Location; +import org.bukkit.block.Sign; +import org.bukkit.block.sign.Side; +import org.bukkit.block.sign.SignSide; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R4.map.CraftMapCanvas; +import org.bukkit.craftbukkit.v1_20_R4.map.CraftMapView; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftLocation; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.map.MapCanvas; +import org.bukkit.map.MapPalette; + +import java.lang.invoke.MethodHandle; +import java.lang.reflect.Field; +import java.util.*; + +public class PacketHelperImpl implements PacketHelper { + + public static final EntityDataAccessor PLAYER_DATA_ACCESSOR_ABSORPTION = ReflectionHelper.getFieldValue(net.minecraft.world.entity.player.Player.class, ReflectionMappingsInfo.Player_DATA_PLAYER_ABSORPTION_ID, null); + + public static final EntityDataAccessor ENTITY_DATA_ACCESSOR_FLAGS = ReflectionHelper.getFieldValue(net.minecraft.world.entity.Entity.class, ReflectionMappingsInfo.Entity_DATA_SHARED_FLAGS_ID, null); + + public static final MethodHandle ABILITIES_PACKET_FOV_SETTER = ReflectionHelper.getFinalSetter(ClientboundPlayerAbilitiesPacket.class, ReflectionMappingsInfo.ClientboundPlayerAbilitiesPacket_walkingSpeed); + + public static final Field ENTITY_TRACKER_ENTRY_GETTER = ReflectionHelper.getFields(ChunkMap.TrackedEntity.class).getFirstOfType(ServerEntity.class); + + public static final MethodHandle CANVAS_GET_BUFFER = ReflectionHelper.getMethodHandle(CraftMapCanvas.class, "getBuffer"); + public static final Field MAPVIEW_WORLDMAP = ReflectionHelper.getFields(CraftMapView.class).get("worldMap"); + + public static final EntityDataAccessor> ENTITY_DATA_ACCESSOR_CUSTOM_NAME = ReflectionHelper.getFieldValue(net.minecraft.world.entity.Entity.class, ReflectionMappingsInfo.Entity_DATA_CUSTOM_NAME, null); + public static final EntityDataAccessor ENTITY_DATA_ACCESSOR_CUSTOM_NAME_VISIBLE = ReflectionHelper.getFieldValue(net.minecraft.world.entity.Entity.class, ReflectionMappingsInfo.Entity_DATA_CUSTOM_NAME_VISIBLE, null); + + @Override + public void setFakeAbsorption(Player player, float value) { + send(player, new ClientboundSetEntityDataPacket(player.getEntityId(), List.of(createEntityData(PLAYER_DATA_ACCESSOR_ABSORPTION, value)))); + } + + @Override + public void setSlot(Player player, int slot, ItemStack itemStack, boolean playerOnly) { + AbstractContainerMenu menu = ((CraftPlayer) player).getHandle().containerMenu; + int windowId = playerOnly ? 0 : menu.containerId; + send(player, new ClientboundContainerSetSlotPacket(windowId, menu.incrementStateId(), slot, CraftItemStack.asNMSCopy(itemStack))); + } + + @Override + public void setFieldOfView(Player player, float fov) { + ClientboundPlayerAbilitiesPacket packet = new ClientboundPlayerAbilitiesPacket(((CraftPlayer) player).getHandle().getAbilities()); + if (!Float.isNaN(fov)) { + try { + ABILITIES_PACKET_FOV_SETTER.invoke(packet, fov); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + send(player, packet); + } + + @Override + public void respawn(Player player) { + ((CraftPlayer) player).getHandle().connection.handleClientCommand(new ServerboundClientCommandPacket(ServerboundClientCommandPacket.Action.PERFORM_RESPAWN)); + } + + @Override + public void setVision(Player player, EntityType entityType) { + final net.minecraft.world.entity.LivingEntity entity; + if (entityType == EntityType.CREEPER) { + entity = new Creeper(net.minecraft.world.entity.EntityType.CREEPER, ((CraftWorld) player.getWorld()).getHandle()); + } + else if (entityType == EntityType.SPIDER) { + entity = new Spider(net.minecraft.world.entity.EntityType.SPIDER, ((CraftWorld) player.getWorld()).getHandle()); + } + else if (entityType == EntityType.CAVE_SPIDER) { + entity = new CaveSpider(net.minecraft.world.entity.EntityType.CAVE_SPIDER, ((CraftWorld) player.getWorld()).getHandle()); + } + else if (entityType == EntityType.ENDERMAN) { + entity = new EnderMan(net.minecraft.world.entity.EntityType.ENDERMAN, ((CraftWorld) player.getWorld()).getHandle()); + } + else { + return; + } + + // Spectating an entity then immediately respawning the player prevents a client shader update, + // allowing the player to retain whatever vision the mob they spectated had. + send(player, new ClientboundAddEntityPacket(entity)); + send(player, new ClientboundSetCameraPacket(entity)); + NMSHandler.playerHelper.refreshPlayer(player); + } + + @Override + public void showBlockAction(Player player, Location location, int action, int state) { + BlockPos position = CraftLocation.toBlockPosition(location); + Block block = ((CraftWorld) location.getWorld()).getHandle().getBlockState(position).getBlock(); + send(player, new ClientboundBlockEventPacket(position, block, action, state)); + } + + @Override + public void showTabListHeaderFooter(Player player, String header, String footer) { + Component cHeader = Handler.componentToNMS(FormattedTextHelper.parse(header, ChatColor.WHITE)); + Component cFooter = Handler.componentToNMS(FormattedTextHelper.parse(footer, ChatColor.WHITE)); + send(player, new ClientboundTabListPacket(cHeader, cFooter)); + } + + @Override + public void showTitle(Player player, String title, String subtitle, int fadeInTicks, int stayTicks, int fadeOutTicks) { + send(player, new ClientboundSetTitlesAnimationPacket(fadeInTicks, stayTicks, fadeOutTicks)); + if (title != null) { + send(player, new ClientboundSetTitleTextPacket(Handler.componentToNMS(FormattedTextHelper.parse(title, ChatColor.WHITE)))); + } + if (subtitle != null) { + send(player, new ClientboundSetSubtitleTextPacket(Handler.componentToNMS(FormattedTextHelper.parse(subtitle, ChatColor.WHITE)))); + } + } + + @Override + public void showMobHealth(Player player, LivingEntity mob, double health, double maxHealth) { + AttributeInstance attr = new AttributeInstance(Attributes.MAX_HEALTH, (a) -> {}); + attr.setBaseValue(maxHealth); + send(player, new ClientboundUpdateAttributesPacket(mob.getEntityId(), List.of(attr))); + send(player, new ClientboundSetEntityDataPacket(mob.getEntityId(), List.of(createEntityData(net.minecraft.world.entity.LivingEntity.DATA_HEALTH_ID, (float) health)))); + } + + @Override + public void showSignEditor(Player player, Location location) { + NetworkInterceptHelper.enable(); + Sign sign = null; + BlockPos toOpen = null; + // It actually allows 8 blocks of distance, but we limit to 7 because the client doesn't properly round down + for (int i = 0; i < 8; i++) { + Location toCheck = player.getLocation(); + toCheck.setY(toCheck.getY() - i); + if (toCheck.getBlock().getState() instanceof Sign foundSign) { + sign = foundSign; + } + else { + sign = null; + toOpen = CraftLocation.toBlockPosition(toCheck); + break; + } + } + if (sign != null) { + toOpen = CraftLocation.toBlockPosition(sign.getLocation()); + SignSide front = sign.getSide(Side.FRONT); + for (int line = 0; line < 4; line++) { + front.setLine(line, ""); + } + player.sendBlockUpdate(sign.getLocation(), sign); + } + DenizenNetworkManagerImpl.getNetworkManager(player).packetListener.fakeSignExpected = toOpen; + send(player, new ClientboundOpenSignEditorPacket(toOpen, true)); + } + + @Override + public void forceSpectate(Player player, Entity entity) { + send(player, new ClientboundSetCameraPacket(((CraftEntity) entity).getHandle())); + } + + public static void forceRespawnPlayerEntity(Entity entity, Player viewer) { + ChunkMap tracker = ((ServerLevel) ((CraftEntity) entity).getHandle().level()).getChunkSource().chunkMap; + ChunkMap.TrackedEntity entityTracker = tracker.entityMap.get(entity.getEntityId()); + if (entityTracker != null) { + try { + ServerEntity entry = (ServerEntity) ENTITY_TRACKER_ENTRY_GETTER.get(entityTracker); + if (entry != null) { + entry.removePairing(((CraftPlayer) viewer).getHandle()); + entry.addPairing(((CraftPlayer) viewer).getHandle()); + } + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + } + + @Override + public void sendRename(Player player, Entity entity, String name, boolean listMode) { + try { + if (entity.getType() == EntityType.PLAYER) { + if (listMode) { + send(player, new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME, ((CraftPlayer) player).getHandle())); + } + else { + // For player entities, force a respawn packet and let the dynamic intercept correct the details + forceRespawnPlayerEntity(entity, player); + } + return; + } + List> list = List.of( + createEntityData(ENTITY_DATA_ACCESSOR_CUSTOM_NAME, Optional.of(Handler.componentToNMS(FormattedTextHelper.parse(name, ChatColor.WHITE)))), + createEntityData(ENTITY_DATA_ACCESSOR_CUSTOM_NAME_VISIBLE, true) + ); + send(player, new ClientboundSetEntityDataPacket(entity.getEntityId(), list)); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + public static HashMap> noCollideTeamMap = new HashMap<>(); + + @Override + public void generateNoCollideTeam(Player player, UUID noCollide) { + removeNoCollideTeam(player, noCollide); + PlayerTeam team = new PlayerTeam(SidebarImpl.dummyScoreboard, Utilities.generateRandomColors(8)); + team.getPlayers().add(noCollide.toString()); + team.setCollisionRule(Team.CollisionRule.NEVER); + HashMap map = noCollideTeamMap.computeIfAbsent(player.getUniqueId(), k -> new HashMap<>()); + map.put(noCollide, team); + send(player, ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(team, true)); + } + + @Override + public void removeNoCollideTeam(Player player, UUID noCollide) { + if (noCollide == null || !player.isOnline()) { + noCollideTeamMap.remove(player.getUniqueId()); + return; + } + HashMap map = noCollideTeamMap.get(player.getUniqueId()); + if (map == null) { + return; + } + PlayerTeam team = map.remove(noCollide); + if (team != null) { + send(player, ClientboundSetPlayerTeamPacket.createRemovePacket(team)); + } + if (map.isEmpty()) { + noCollideTeamMap.remove(player.getUniqueId()); + } + } + + @Override + public void sendEntityMetadataFlagsUpdate(Player player, Entity entity) { + byte flags = ((CraftEntity) entity).getHandle().getEntityData().get(ENTITY_DATA_ACCESSOR_FLAGS); + send(player, new ClientboundSetEntityDataPacket(entity.getEntityId(), List.of(createEntityData(ENTITY_DATA_ACCESSOR_FLAGS, flags)))); + } + + @Override + public void sendEntityEffect(Player player, Entity entity, EntityEffect effect) { + send(player, new ClientboundEntityEventPacket(((CraftEntity) entity).getHandle(), effect.getData())); + } + + @Override + public int getPacketStats(Player player, boolean sent) { + DenizenNetworkManagerImpl netMan = DenizenNetworkManagerImpl.getNetworkManager(player); + return sent ? netMan.packetsSent : netMan.packetsReceived; + } + + @Override + public void setMapData(MapCanvas canvas, byte[] bytes, int x, int y, MapImage image) { + if (x > 127 || y > 127) { + return; + } + int width = Math.min(image.width, 128 - x), + height = Math.min(image.height, 128 - y); + if (x + width <= 0 || y + height <= 0) { + return; + } + try { + boolean anyChanged = false; + byte[] buffer = (byte[]) CANVAS_GET_BUFFER.invoke(canvas); + for (int x2 = x < 0 ? -x : 0; x2 < width; ++x2) { + for (int y2 = y < 0 ? -y : 0; y2 < height; ++y2) { + byte p = bytes[y2 * image.width + x2]; + if (p != MapPalette.TRANSPARENT) { + int index = (y2 + y) * 128 + (x2 + x); + if (buffer[index] != p) { + buffer[index] = p; + anyChanged = true; + } + } + } + } + if (anyChanged) { + // Flag the whole image as dirty + MapItemSavedData map = (MapItemSavedData) MAPVIEW_WORLDMAP.get(canvas.getMapView()); + map.setColorsDirty(Math.max(x, 0), Math.max(y, 0)); + map.setColorsDirty(width + x - 1, height + y - 1); + } + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + @Override + public void setNetworkManagerFor(Player player) { + DenizenNetworkManagerImpl.setNetworkManager(player); + } + + @Override + public void enableNetworkManager() { + DenizenNetworkManagerImpl.enableNetworkManager(); + } + + @Override + public void showDebugTestMarker(Player player, Location location, ColorTag color, String name, int time) { + int colorInt = color.blue | (color.green << 8) | (color.red << 16) | (color.alpha << 24); + GameTestAddMarkerDebugPayload payload = new GameTestAddMarkerDebugPayload(CraftLocation.toBlockPosition(location), colorInt, name, time); + send(player, new ClientboundCustomPayloadPacket(payload)); + } + + @Override + public void clearDebugTestMarker(Player player) { + GameTestClearMarkersDebugPayload payload = new GameTestClearMarkersDebugPayload(); + send(player, new ClientboundCustomPayloadPacket(payload)); + } + + @Override + public void sendBrand(Player player, String brand) { + BrandPayload payload = new BrandPayload(brand); + send(player, new ClientboundCustomPayloadPacket(payload)); + } + + @Override + public void sendCollectItemEntity(Player player, Entity taker, Entity item, int amount) { + send(player, new ClientboundTakeItemEntityPacket(item.getEntityId(), taker.getEntityId(), amount)); + } + + public RelativeMovement toNmsRelativeMovement(TeleportCommand.Relative relative) { + return switch (relative) { + case X -> RelativeMovement.X; + case Y -> RelativeMovement.Y; + case Z -> RelativeMovement.Z; + case YAW -> RelativeMovement.Y_ROT; + case PITCH -> RelativeMovement.X_ROT; + }; + } + + @Override + public void sendRelativePositionPacket(Player player, double x, double y, double z, float yaw, float pitch, List relativeAxis) { + Set relativeMovements; + if (relativeAxis == null) { + relativeMovements = RelativeMovement.ALL; + } + else { + relativeMovements = EnumSet.noneOf(RelativeMovement.class); + for (TeleportCommand.Relative relative : relativeAxis) { + relativeMovements.add(toNmsRelativeMovement(relative)); + } + } + ClientboundPlayerPositionPacket packet = new ClientboundPlayerPositionPacket(x, y, z, yaw, pitch, relativeMovements, 0); + sendAsyncSafe(player, packet); + } + + @Override + public void sendRelativeLookPacket(Player player, float yaw, float pitch) { + sendRelativePositionPacket(player, 0, 0, 0, yaw, pitch, null); + } + + @Override + public void sendEntityDataPacket(List players, Entity entity, List data) { + ClientboundSetEntityDataPacket setEntityDataPacket = new ClientboundSetEntityDataPacket(entity.getEntityId(), (List>) (Object) data); + Iterator playerIterator = players.iterator(); + while (playerIterator.hasNext()) { + Player player = playerIterator.next(); + if (!DenizenNetworkManagerImpl.getConnection(player).isConnected()) { + playerIterator.remove(); + continue; + } + sendAsyncSafe(player, setEntityDataPacket); + } + } + + public static void send(Player player, Packet packet) { + ((CraftPlayer) player).getHandle().connection.send(packet); + } + + public static void broadcast(Packet packet) { + ((CraftServer) Bukkit.getServer()).getHandle().broadcastAll(packet); + } + + public static void sendAsyncSafe(Player player, Packet packet) { + DenizenNetworkManagerImpl.getConnection(player).channel.writeAndFlush(packet); + } + + public static SynchedEntityData.DataValue createEntityData(EntityDataAccessor accessor, T value) { + return new SynchedEntityData.DataValue<>(accessor.id(), accessor.serializer(), value); + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PlayerHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PlayerHelperImpl.java new file mode 100644 index 0000000000..d54ef1810c --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PlayerHelperImpl.java @@ -0,0 +1,470 @@ +package com.denizenscript.denizen.nms.v1_20.helpers; + +import com.denizenscript.denizen.Denizen; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.abstracts.ImprovedOfflinePlayer; +import com.denizenscript.denizen.nms.enums.CustomEntityType; +import com.denizenscript.denizen.nms.interfaces.PlayerHelper; +import com.denizenscript.denizen.nms.v1_20.Handler; +import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_20.impl.ImprovedOfflinePlayerImpl; +import com.denizenscript.denizen.nms.v1_20.impl.ProfileEditorImpl; +import com.denizenscript.denizen.nms.v1_20.impl.entities.CraftFakePlayerImpl; +import com.denizenscript.denizen.nms.v1_20.impl.entities.EntityItemProjectileImpl; +import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.AbstractListenerPlayInImpl; +import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizen.objects.LocationTag; +import com.denizenscript.denizen.objects.PlayerTag; +import com.denizenscript.denizen.utilities.FormattedTextHelper; +import com.denizenscript.denizen.utilities.entity.DenizenEntityType; +import com.denizenscript.denizen.utilities.entity.FakeEntity; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.properties.Property; +import it.unimi.dsi.fastutil.ints.IntList; +import net.md_5.bungee.api.ChatColor; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.protocol.common.ClientboundUpdateTagsPacket; +import net.minecraft.network.protocol.game.*; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ChunkMap; +import net.minecraft.server.level.ServerEntity; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.ServerGamePacketListenerImpl; +import net.minecraft.server.players.ServerOpList; +import net.minecraft.server.players.ServerOpListEntry; +import net.minecraft.stats.ServerRecipeBook; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.TagNetworkSerialization; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemCooldowns; +import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.GameType; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; +import org.bukkit.*; +import org.bukkit.boss.BossBar; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.boss.CraftBossBar; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftMagicNumbers; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; + +import java.lang.invoke.MethodHandle; +import java.lang.reflect.Field; +import java.util.*; + +public class PlayerHelperImpl extends PlayerHelper { + + public static final Field ATTACK_COOLDOWN_TICKS = ReflectionHelper.getFields(LivingEntity.class).get(ReflectionMappingsInfo.LivingEntity_attackStrengthTicker, int.class); + + public static final Field FLY_TICKS = ReflectionHelper.getFields(ServerGamePacketListenerImpl.class).get(ReflectionMappingsInfo.ServerGamePacketListenerImpl_aboveGroundTickCount, int.class); + public static final Field VEHICLE_FLY_TICKS = ReflectionHelper.getFields(ServerGamePacketListenerImpl.class).get(ReflectionMappingsInfo.ServerGamePacketListenerImpl_aboveGroundVehicleTickCount, int.class); + public static final Field PASSENGERS_PACKET_PASSENGERS = ReflectionHelper.getFields(ClientboundSetPassengersPacket.class).get(ReflectionMappingsInfo.ClientboundSetPassengersPacket_passengers, int[].class); + public static final MethodHandle PLAYER_RESPAWNFORCED_SETTER = ReflectionHelper.getFinalSetter(ServerPlayer.class, ReflectionMappingsInfo.ServerPlayer_respawnForced, boolean.class); + + public static final EntityDataAccessor PLAYER_DATA_ACCESSOR_SKINLAYERS = ReflectionHelper.getFieldValue(net.minecraft.world.entity.player.Player.class, ReflectionMappingsInfo.Player_DATA_PLAYER_MODE_CUSTOMISATION, null); + + @Override + public void stopSound(Player player, String sound, SoundCategory category) { + ((CraftPlayer) player).getHandle().connection.send(new ClientboundStopSoundPacket(sound == null ? null : new ResourceLocation(sound), null)); + } + + @Override + public void deTrackEntity(Player player, Entity entity) { + ServerPlayer nmsPlayer = ((CraftPlayer) player).getHandle(); + ChunkMap.TrackedEntity tracker = nmsPlayer.serverLevel().getChunkSource().chunkMap.entityMap.get(entity.getEntityId()); + if (tracker == null) { + if (NMSHandler.debugPackets) { + DenizenNetworkManagerImpl.doPacketOutput("Failed to de-track entity " + entity.getEntityId() + " for " + player.getName() + ": tracker null"); + } + return; + } + sendEntityDestroy(player, entity); + tracker.removePlayer(nmsPlayer); + } + + public record TrackerData(PlayerTag player, ServerEntity tracker) {} + + @Override + public void addFakePassenger(List players, Entity vehicle, FakeEntity fakePassenger) { + ClientboundSetPassengersPacket packet = new ClientboundSetPassengersPacket(((CraftEntity) vehicle).getHandle()); + int[] newPassengers = Arrays.copyOf(packet.getPassengers(), packet.getPassengers().length + 1); + newPassengers[packet.getPassengers().length] = fakePassenger.id; + try { + PASSENGERS_PACKET_PASSENGERS.set(packet, newPassengers); + } + catch (IllegalAccessException e) { + Debug.echoError(e); + } + for (PlayerTag player : players) { + PacketHelperImpl.send(player.getPlayerEntity(), packet); + } + } + + @Override + public FakeEntity sendEntitySpawn(List players, DenizenEntityType entityType, LocationTag location, ArrayList mechanisms, int customId, UUID customUUID, boolean autoTrack) { + CraftWorld world = ((CraftWorld) location.getWorld()); + net.minecraft.world.entity.Entity nmsEntity; + if (entityType.isCustom()) { + if (entityType.customEntityType == CustomEntityType.ITEM_PROJECTILE) { + ItemStack itemStack = new ItemStack(Material.STONE); + for (Mechanism mechanism : mechanisms) { + if (mechanism.matches("item") && mechanism.requireObject(ItemTag.class)) { + itemStack = mechanism.valueAsType(ItemTag.class).getItemStack(); + } + } + nmsEntity = new EntityItemProjectileImpl(world.getHandle(), location, CraftItemStack.asNMSCopy(itemStack)); + } + else if (entityType.customEntityType == CustomEntityType.FAKE_PLAYER) { + String name = null; + String skin = null; + String blob = null; + for (Mechanism mechanism : new ArrayList<>(mechanisms)) { + if (mechanism.matches("name")) { + name = mechanism.getValue().asString(); + mechanisms.remove(mechanism); + } + else if (mechanism.matches("skin")) { + skin = mechanism.getValue().asString(); + mechanisms.remove(mechanism); + } + else if (mechanism.matches("skin_blob")) { + blob = mechanism.getValue().asString(); + mechanisms.remove(mechanism); + } + if (name != null && (skin != null || blob != null)) { + break; + } + } + nmsEntity = ((CraftFakePlayerImpl) NMSHandler.customEntityHelper.spawnFakePlayer(location, name, skin, blob, false)).getHandle(); + } + else { + throw new IllegalArgumentException("entityType"); + } + } + else { + org.bukkit.entity.Entity entity = world.createEntity(location, entityType.getBukkitEntityType().getEntityClass()); + nmsEntity = ((CraftEntity) entity).getHandle(); + } + if (customUUID != null) { + nmsEntity.setId(customId); + nmsEntity.setUUID(customUUID); + } + EntityTag entity = new EntityTag(nmsEntity.getBukkitEntity()); + entity.isFake = true; + entity.isFakeValid = true; + for (Mechanism mechanism : mechanisms) { + entity.safeAdjustDuplicate(mechanism); + } + nmsEntity.unsetRemoved(); + FakeEntity fake = new FakeEntity(players, location, entity.getBukkitEntity().getEntityId()); + fake.entity = new EntityTag(entity.getBukkitEntity()); + fake.entity.isFake = true; + fake.entity.isFakeValid = true; + List trackers = new ArrayList<>(); + fake.triggerSpawnPacket = (player) -> { + ServerPlayer nmsPlayer = ((CraftPlayer) player.getPlayerEntity()).getHandle(); + ServerGamePacketListenerImpl conn = nmsPlayer.connection; + final ServerEntity tracker = new ServerEntity(world.getHandle(), nmsEntity, 1, true, conn::send, Collections.singleton(nmsPlayer.connection)); + tracker.addPairing(nmsPlayer); + final TrackerData data = new TrackerData(player, tracker); + trackers.add(data); + if (autoTrack) { + new BukkitRunnable() { + boolean wasOnline = true; + @Override + public void run() { + if (!fake.entity.isFakeValid) { + cancel(); + return; + } + if (player.isOnline()) { + if (!wasOnline) { + tracker.addPairing(((CraftPlayer) player.getPlayerEntity()).getHandle()); + wasOnline = true; + } + tracker.sendChanges(); + } + else if (wasOnline) { + wasOnline = false; + } + } + }.runTaskTimer(Denizen.getInstance(), 1, 1); + } + }; + for (PlayerTag player : players) { + fake.triggerSpawnPacket.accept(player); + } + fake.triggerUpdatePacket = () -> { + for (TrackerData tracker : trackers) { + if (tracker.player.isOnline()) { + tracker.tracker.sendChanges(); + } + } + }; + fake.triggerDestroyPacket = () -> { + for (TrackerData tracker : trackers) { + if (tracker.player.isOnline()) { + tracker.tracker.removePairing(((CraftPlayer) tracker.player.getPlayerEntity()).getHandle()); + } + } + trackers.clear(); + }; + return fake; + } + + @Override + public void sendEntityDestroy(Player player, Entity entity) { + ((CraftPlayer) player).getHandle().connection.send(new ClientboundRemoveEntitiesPacket(entity.getEntityId())); + } + + @Override + public int getFlyKickCooldown(Player player) { + ServerGamePacketListenerImpl conn = ((CraftPlayer) player).getHandle().connection; + if (conn instanceof AbstractListenerPlayInImpl denizenListener) { + conn = denizenListener.oldListener; + } + try { + return Math.max(80 - Math.max(FLY_TICKS.getInt(conn), VEHICLE_FLY_TICKS.getInt(conn)), 0); + } + catch (IllegalAccessException e) { + Debug.echoError(e); + } + return 80; + } + + @Override + public void setFlyKickCooldown(Player player, int ticks) { + ticks = 80 - ticks; + ServerGamePacketListenerImpl conn = ((CraftPlayer) player).getHandle().connection; + if (conn instanceof AbstractListenerPlayInImpl denizenListener) { + conn = denizenListener.oldListener; + } + try { + FLY_TICKS.setInt(conn, ticks); + VEHICLE_FLY_TICKS.setInt(conn, ticks); + } + catch (IllegalAccessException e) { + Debug.echoError(e); + } + } + + @Override + public int ticksPassedDuringCooldown(Player player) { + try { + return ATTACK_COOLDOWN_TICKS.getInt(((CraftPlayer) player).getHandle()); + } + catch (IllegalAccessException e) { + Debug.echoError(e); + } + return -1; + } + + @Override + public float getMaxAttackCooldownTicks(Player player) { + return ((CraftPlayer) player).getHandle().getCurrentItemAttackStrengthDelay() + 3; + } + + @Override + public void setAttackCooldown(Player player, int ticks) { + try { + ATTACK_COOLDOWN_TICKS.setInt(((CraftPlayer) player).getHandle(), ticks); + } + catch (IllegalAccessException e) { + Debug.echoError(e); + } + + } + + @Override + public boolean hasChunkLoaded(Player player, Chunk chunk) { + return ((CraftWorld) chunk.getWorld()).getHandle().getChunkSource().chunkMap + .getPlayers(new ChunkPos(chunk.getX(), chunk.getZ()), false).stream() + .anyMatch(entityPlayer -> entityPlayer.getUUID().equals(player.getUniqueId())); + } + + @Override + public void setTemporaryOp(Player player, boolean op) { + MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer(); + GameProfile profile = ((CraftPlayer) player).getProfile(); + ServerOpList opList = server.getPlayerList().getOps(); + if (op) { + opList.add(new ServerOpListEntry(profile, server.getOperatorUserPermissionLevel(), opList.canBypassPlayerLimit(profile))); + } + else { + opList.remove(profile); + } + player.recalculatePermissions(); + } + + @Override + public void showEndCredits(Player player) { + ((CraftPlayer) player).getHandle().wonGame = true; + ((CraftPlayer) player).getHandle().connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.WIN_GAME, 1f)); + } + + @Override + public ImprovedOfflinePlayer getOfflineData(UUID uuid) { + return new ImprovedOfflinePlayerImpl(uuid); + } + + @Override + public void resendRecipeDetails(Player player) { + Collection> recipes = ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager().getRecipes(); + ClientboundUpdateRecipesPacket updatePacket = new ClientboundUpdateRecipesPacket(recipes); + ((CraftPlayer) player).getHandle().connection.send(updatePacket); + } + + @Override + public void resendDiscoveredRecipes(Player player) { + ServerRecipeBook recipeBook = ((CraftPlayer) player).getHandle().getRecipeBook(); + recipeBook.sendInitialRecipeBook(((CraftPlayer) player).getHandle()); + } + + @Override + public void quietlyAddRecipe(Player player, NamespacedKey key) { + ServerRecipeBook recipeBook = ((CraftPlayer) player).getHandle().getRecipeBook(); + RecipeHolder recipe = ItemHelperImpl.getNMSRecipe(key); + if (recipe == null) { + Debug.echoError("Cannot add recipe '" + key + "': it does not exist."); + return; + } + recipeBook.add(recipe); + recipeBook.addHighlight(recipe); + } + + @Override + public byte getSkinLayers(Player player) { + return ((CraftPlayer) player).getHandle().getEntityData().get(PLAYER_DATA_ACCESSOR_SKINLAYERS); + } + + @Override + public void setSkinLayers(Player player, byte flags) { + ((CraftPlayer) player).getHandle().getEntityData().set(PLAYER_DATA_ACCESSOR_SKINLAYERS, flags); + } + + @Override + public void setBossBarTitle(BossBar bar, String title) { + ((CraftBossBar) bar).getHandle().name = Handler.componentToNMS(FormattedTextHelper.parse(title, ChatColor.WHITE)); + ((CraftBossBar) bar).getHandle().broadcast(ClientboundBossEventPacket::createUpdateNamePacket); + } + + @Override + public boolean getSpawnForced(Player player) { + return ((CraftPlayer) player).getHandle().isRespawnForced(); + } + + @Override + public void setSpawnForced(Player player, boolean forced) { + ServerPlayer nmsPlayer = ((CraftPlayer) player).getHandle(); + try { + PLAYER_RESPAWNFORCED_SETTER.invoke(nmsPlayer, forced); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + @Override + public Location getBedSpawnLocation(Player player) { + ServerPlayer nmsPlayer = ((CraftPlayer) player).getHandle(); + BlockPos spawnPosition = nmsPlayer.getRespawnPosition(); + if (spawnPosition == null) { + return null; + } + Level nmsWorld = MinecraftServer.getServer().getLevel(nmsPlayer.getRespawnDimension()); + if (nmsWorld == null) { + return null; + } + return new Location(nmsWorld.getWorld(), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ(), nmsPlayer.getRespawnAngle(), 0); + } + + @Override + public long getLastActionTime(Player player) { + return ((CraftPlayer) player).getHandle().getLastActionTime(); + } + + @Override + public void sendPlayerInfoAddPacket(Player player, EnumSet editModes, String name, String display, UUID id, String texture, String signature, int latency, GameMode gameMode, boolean listed) { + EnumSet actions = EnumSet.noneOf(ClientboundPlayerInfoUpdatePacket.Action.class); + for (ProfileEditMode editMode : editModes) { + actions.add(switch (editMode) { + case ADD -> ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER; + case UPDATE_DISPLAY -> ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME; + case UPDATE_LATENCY -> ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LATENCY; + case UPDATE_GAME_MODE -> ClientboundPlayerInfoUpdatePacket.Action.UPDATE_GAME_MODE; + case UPDATE_LISTED -> ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LISTED; + }); + } + GameProfile profile = new GameProfile(id, name != null ? name : ProfileEditorImpl.EMPTY_NAME); + if (texture != null) { + profile.getProperties().put("textures", new Property("textures", texture, signature)); + } + ClientboundPlayerInfoUpdatePacket.Entry entry = new ClientboundPlayerInfoUpdatePacket.Entry(id, profile, listed, latency, gameMode == null ? null : GameType.byId(gameMode.getValue()), display == null ? null : Handler.componentToNMS(FormattedTextHelper.parse(display, ChatColor.WHITE)), null); + PacketHelperImpl.send(player, ProfileEditorImpl.createInfoPacket(actions, List.of(entry))); + } + + @Override + public void sendPlayerInfoRemovePacket(Player player, UUID id) { + PacketHelperImpl.send(player, new ClientboundPlayerInfoRemovePacket(List.of(id))); + } + + @Override + public void sendClimbableMaterials(Player player, List materials) { + Map>, TagNetworkSerialization.NetworkPayload> packetInput = TagNetworkSerialization.serializeTagsToNetwork(((CraftServer) Bukkit.getServer()).getServer().registries()); + Map tags = ReflectionHelper.getFieldValue(TagNetworkSerialization.NetworkPayload.class, ReflectionMappingsInfo.TagNetworkSerializationNetworkPayload_tags, packetInput.get(BuiltInRegistries.BLOCK.key())); + IntList climbableBlocks = tags.get(BlockTags.CLIMBABLE.location()); + climbableBlocks.clear(); + for (Material material : materials) { + climbableBlocks.add(BuiltInRegistries.BLOCK.getId(CraftMagicNumbers.getBlock(material))); + } + PacketHelperImpl.send(player, new ClientboundUpdateTagsPacket(packetInput)); + } + + @Override + public void refreshPlayer(Player player) { + ServerPlayer nmsPlayer = ((CraftPlayer) player).getHandle(); + ServerLevel nmsWorld = (ServerLevel) nmsPlayer.level(); + nmsPlayer.connection.send(new ClientboundRespawnPacket(nmsPlayer.createCommonSpawnInfo(nmsWorld), ClientboundRespawnPacket.KEEP_ALL_DATA)); + nmsPlayer.connection.teleport(player.getLocation()); + if (nmsPlayer.isPassenger()) { + nmsPlayer.connection.send(new ClientboundSetPassengersPacket(nmsPlayer.getVehicle())); + } + if (nmsPlayer.isVehicle()) { + nmsPlayer.connection.send(new ClientboundSetPassengersPacket(nmsPlayer)); + } + AABB boundingBox = new AABB(nmsPlayer.position(), nmsPlayer.position()).inflate(10); + for (Mob nmsMob : nmsWorld.getEntitiesOfClass(Mob.class, boundingBox, nmsMob -> nmsPlayer.equals(nmsMob.getLeashHolder()))) { + nmsPlayer.connection.send(new ClientboundSetEntityLinkPacket(nmsMob, nmsPlayer)); + } + if (!nmsPlayer.getCooldowns().cooldowns.isEmpty()) { + int tickCount = nmsPlayer.getCooldowns().tickCount; + for (Map.Entry entry : nmsPlayer.getCooldowns().cooldowns.entrySet()) { + nmsPlayer.connection.send(new ClientboundCooldownPacket(entry.getKey(), entry.getValue().endTime - tickCount)); + } + } + nmsPlayer.onUpdateAbilities(); + nmsPlayer.server.getPlayerList().sendAllPlayerInfo(nmsPlayer); + nmsPlayer.server.getPlayerList().sendPlayerPermissionLevel(nmsPlayer); + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/WorldHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/WorldHelperImpl.java new file mode 100644 index 0000000000..7422a6e4eb --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/WorldHelperImpl.java @@ -0,0 +1,111 @@ +package com.denizenscript.denizen.nms.v1_20.helpers; + +import com.denizenscript.denizen.nms.interfaces.WorldHelper; +import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_20.impl.BiomeNMSImpl; +import com.denizenscript.denizen.objects.BiomeTag; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.mojang.datafixers.util.Pair; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.players.SleepStatus; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.storage.PrimaryLevelData; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; + +public class WorldHelperImpl implements WorldHelper { + + @Override + public boolean isStatic(World world) { + return ((CraftWorld) world).getHandle().isClientSide; + } + + @Override + public void setStatic(World world, boolean isStatic) { + ServerLevel worldServer = ((CraftWorld) world).getHandle(); + ReflectionHelper.setFieldValue(net.minecraft.world.level.Level.class, ReflectionMappingsInfo.Level_isClientSide, worldServer, isStatic); + } + + @Override + public float getLocalDifficulty(Location location) { + BlockPos pos = new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()); + DifficultyInstance scaler = ((CraftWorld) location.getWorld()).getHandle().getCurrentDifficultyAt(pos); + return scaler.getEffectiveDifficulty(); + } + + @Override + public Location getNearestBiomeLocation(Location start, BiomeTag biome) { + Pair> result = ((CraftWorld) start.getWorld()).getHandle() + .findClosestBiome3d(b -> b.is(((BiomeNMSImpl) biome.getBiome()).biomeHolder.unwrapKey().get()), new BlockPos(start.getBlockX(), start.getBlockY(), start.getBlockZ()), 6400, 32, 64); + if (result == null || result.getFirst() == null) { + return null; + } + return new Location(start.getWorld(), result.getFirst().getX(), result.getFirst().getY(), result.getFirst().getZ()); + } + + @Override + public boolean areEnoughSleeping(World world, int percentage) { + SleepStatus status = ReflectionHelper.getFieldValue(ServerLevel.class, ReflectionMappingsInfo.ServerLevel_sleepStatus, ((CraftWorld) world).getHandle()); + return status.areEnoughSleeping(percentage); + } + + @Override + public boolean areEnoughDeepSleeping(World world, int percentage) { + ServerLevel level = ((CraftWorld) world).getHandle(); + SleepStatus status = ReflectionHelper.getFieldValue(ServerLevel.class, ReflectionMappingsInfo.ServerLevel_sleepStatus, level); + return status.areEnoughDeepSleeping(percentage, level.players()); + } + + @Override + public int getSkyDarken(World world) { + return ((CraftWorld) world).getHandle().getSkyDarken(); + } + + @Override + public boolean isDay(World world) { + return ((CraftWorld) world).getHandle().isDay(); + } + + @Override + public boolean isNight(World world) { + return ((CraftWorld) world).getHandle().isNight(); + } + + @Override + public void setDayTime(World world, long time) { + ((CraftWorld) world).getHandle().setDayTime(time); + } + + @Override + public void setGameTime(World world, long time) { + ((PrimaryLevelData) ((CraftWorld) world).getHandle().levelData).setGameTime(time); + } + + // net.minecraft.server.level.ServerLevel#wakeUpAllPlayers() + @Override + public void wakeUpAllPlayers(World world) { + ServerLevel nmsWorld = ((CraftWorld) world).getHandle(); + SleepStatus status = ReflectionHelper.getFieldValue(ServerLevel.class, ReflectionMappingsInfo.ServerLevel_sleepStatus, nmsWorld); + status.removeAllSleepers(); + nmsWorld.getPlayers(LivingEntity::isSleeping).forEach((player) -> player.stopSleepInBed(false, false)); + } + + // net.minecraft.server.level.ServerLevel#resetWeatherCycle() + @Override + public void clearWeather(World world) { + PrimaryLevelData data = ((CraftWorld) world).getHandle().K; + data.setRaining(false); + if (!data.isRaining()) { + data.setRainTime(0); + } + data.setThundering(false); + if (!data.isThundering()) { + data.setThunderTime(0); + } + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/BiomeNMSImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/BiomeNMSImpl.java new file mode 100644 index 0000000000..d9cbb1f635 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/BiomeNMSImpl.java @@ -0,0 +1,195 @@ +package com.denizenscript.denizen.nms.v1_20.impl; + +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.abstracts.BiomeNMS; +import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.random.WeightedRandomList; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSpecialEffects; +import net.minecraft.world.level.biome.MobSpawnSettings; +import net.minecraft.world.level.chunk.LevelChunk; +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntityType; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftLocation; +import org.bukkit.entity.EntityType; + +import java.lang.invoke.MethodHandle; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class BiomeNMSImpl extends BiomeNMS { + + public static final MethodHandle BIOME_CLIMATESETTINGS_CONSTRUCTOR = ReflectionHelper.getConstructor(Biome.ClimateSettings.class, boolean.class, float.class, Biome.TemperatureModifier.class, float.class); + + public Holder biomeHolder; + public ServerLevel world; + + public BiomeNMSImpl(ServerLevel world, String name) { + super(world.getWorld(), name); + this.world = world; + biomeHolder = world.registryAccess().registryOrThrow(Registries.BIOME).getHolder(ResourceKey.create(Registries.BIOME, new ResourceLocation(name))).orElse(null); + } + + @Override + public DownfallType getDownfallTypeAt(Location location) { + Biome.Precipitation precipitation = biomeHolder.value().getPrecipitationAt(CraftLocation.toBlockPosition(location)); + return switch (precipitation) { + case RAIN -> DownfallType.RAIN; + case SNOW -> DownfallType.SNOW; + case NONE -> DownfallType.NONE; + }; + } + + @Override + public float getHumidity() { + return biomeHolder.value().climateSettings.downfall(); + } + + @Override + public float getBaseTemperature() { + return biomeHolder.value().getBaseTemperature(); + } + + @Override + public float getTemperatureAt(Location location) { + return biomeHolder.value().getTemperature(CraftLocation.toBlockPosition(location)); + } + + @Override + public boolean hasDownfall() { + return biomeHolder.value().hasPrecipitation(); + } + + @Override + public List getAmbientEntities() { + return getSpawnableEntities(MobCategory.AMBIENT); + } + + @Override + public List getCreatureEntities() { + return getSpawnableEntities(MobCategory.CREATURE); + } + + @Override + public List getMonsterEntities() { + return getSpawnableEntities(MobCategory.MONSTER); + } + + @Override + public List getWaterEntities() { + return getSpawnableEntities(MobCategory.WATER_CREATURE); + } + + @Override + public int getFoliageColor() { + // Check if the biome already has a default color + if (biomeHolder.value().getFoliageColor() != 0) { + return biomeHolder.value().getFoliageColor(); + } + // Based on net.minecraft.world.level.biome.Biome#getFoliageColorFromTexture() + float temperature = clampColor(getBaseTemperature()); + float humidity = clampColor(getHumidity()); + // Based on net.minecraft.world.level.FoliageColor#get() + humidity *= temperature; + int humidityValue = (int)((1.0f - humidity) * 255.0f); + int temperatureValue = (int)((1.0f - temperature) * 255.0f); + int index = temperatureValue << 8 | humidityValue; + return index >= 65536 ? 4764952 : getColor(index / 256, index % 256).asRGB(); + } + + public void setClimate(boolean hasPrecipitation, float temperature, Biome.TemperatureModifier temperatureModifier, float downfall) { + try { + Object newClimate = BIOME_CLIMATESETTINGS_CONSTRUCTOR.invoke(hasPrecipitation, temperature, temperatureModifier, downfall); + ReflectionHelper.setFieldValue(Biome.class, ReflectionMappingsInfo.Biome_climateSettings, biomeHolder.value(), newClimate); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + @Override + public void setHumidity(float humidity) { + setClimate(hasDownfall(), getBaseTemperature(), getTemperatureModifier(), humidity); + } + + @Override + public void setBaseTemperature(float baseTemperature) { + setClimate(hasDownfall(), baseTemperature, getTemperatureModifier(), getHumidity()); + } + + @Override + public void setHasDownfall(boolean hasDownfall) { + setClimate(hasDownfall, getBaseTemperature(), getTemperatureModifier(), getHumidity()); + } + + @Override + public void setFoliageColor(int color) { + ReflectionHelper.setFieldValue(BiomeSpecialEffects.class, ReflectionMappingsInfo.BiomeSpecialEffects_foliageColorOverride, biomeHolder.value().getSpecialEffects(), Optional.of(color)); + } + + @Override + public int getFogColor() { + return biomeHolder.value().getFogColor(); + } + + @Override + public void setFogColor(int color) { + ReflectionHelper.setFieldValue(BiomeSpecialEffects.class, ReflectionMappingsInfo.BiomeSpecialEffects_fogColor, biomeHolder.value().getSpecialEffects(), color); + } + + @Override + public int getWaterFogColor() { + return biomeHolder.value().getWaterFogColor(); + } + + @Override + public void setWaterFogColor(int color) { + ReflectionHelper.setFieldValue(BiomeSpecialEffects.class, ReflectionMappingsInfo.BiomeSpecialEffects_waterFogColor, biomeHolder.value().getSpecialEffects(), color); + } + + private List getSpawnableEntities(MobCategory creatureType) { + MobSpawnSettings mobs = biomeHolder.value().getMobSettings(); + WeightedRandomList typeSettingList = mobs.getMobs(creatureType); + List entityTypes = new ArrayList<>(); + if (typeSettingList == null) { + return entityTypes; + } + for (MobSpawnSettings.SpawnerData meta : typeSettingList.unwrap()) { + entityTypes.add(CraftEntityType.minecraftToBukkit(meta.type)); + } + return entityTypes; + } + + @Override + public void setTo(Block block) { + if (((CraftWorld) block.getWorld()).getHandle() != this.world) { + NMSHandler.instance.getBiomeNMS(block.getWorld(), getName()).setTo(block); + return; + } + // Based on CraftWorld source + BlockPos pos = new BlockPos(block.getX(), 0, block.getZ()); + if (world.hasChunkAt(pos)) { + LevelChunk chunk = world.getChunkAt(pos); + if (chunk != null) { + chunk.setBiome(block.getX() >> 2, block.getY() >> 2, block.getZ() >> 2, biomeHolder); + chunk.setUnsaved(true); + } + } + } + + public Biome.TemperatureModifier getTemperatureModifier() { + return biomeHolder.value().climateSettings.temperatureModifier(); + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ImprovedOfflinePlayerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ImprovedOfflinePlayerImpl.java new file mode 100644 index 0000000000..2cf9cb5f33 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ImprovedOfflinePlayerImpl.java @@ -0,0 +1,149 @@ +package com.denizenscript.denizen.nms.v1_20.impl; + +import com.denizenscript.denizen.nms.abstracts.ImprovedOfflinePlayer; +import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; +import com.denizenscript.denizen.nms.v1_20.impl.jnbt.CompoundTagImpl; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.NbtAccounter; +import net.minecraft.nbt.NbtIo; +import net.minecraft.world.entity.ai.attributes.AttributeInstance; +import net.minecraft.world.entity.ai.attributes.AttributeMap; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.attributes.DefaultAttributes; +import net.minecraft.world.inventory.PlayerEnderChestContainer; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_20_R4.CraftRegistry; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftInventory; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftInventoryPlayer; +import org.bukkit.entity.HumanEntity; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.util.UUID; + +public class ImprovedOfflinePlayerImpl extends ImprovedOfflinePlayer { + + public ImprovedOfflinePlayerImpl(UUID playeruuid) { + super(playeruuid); + } + + public static class OfflinePlayerInventory extends net.minecraft.world.entity.player.Inventory { + + public OfflinePlayerInventory(net.minecraft.world.entity.player.Player entityhuman) { + super(entityhuman); + } + + @Override + public InventoryHolder getOwner() { + return null; + } + } + + public static class OfflineCraftInventoryPlayer extends CraftInventoryPlayer { + + public OfflineCraftInventoryPlayer(net.minecraft.world.entity.player.Inventory inventory) { + super(inventory); + } + + @Override + public HumanEntity getHolder() { + return null; + } + } + + @Override + public org.bukkit.inventory.PlayerInventory getInventory() { + if (inventory == null) { + net.minecraft.world.entity.player.Inventory newInv = new OfflinePlayerInventory(null); + newInv.load(((CompoundTagImpl) this.compound).toNMSTag().getList("Inventory", 10)); + inventory = new OfflineCraftInventoryPlayer(newInv); + } + return inventory; + } + + @Override + public void setInventory(org.bukkit.inventory.PlayerInventory inventory) { + CraftInventoryPlayer inv = (CraftInventoryPlayer) inventory; + net.minecraft.nbt.CompoundTag nbtTagCompound = ((CompoundTagImpl) compound).toNMSTag(); + nbtTagCompound.put("Inventory", inv.getInventory().save(new ListTag())); + this.compound = CompoundTagImpl.fromNMSTag(nbtTagCompound); + markModified(); + } + + @Override + public Inventory getEnderChest() { + if (enderchest == null) { + PlayerEnderChestContainer endchest = new PlayerEnderChestContainer(null); + endchest.fromTag(((CompoundTagImpl) this.compound).toNMSTag().getList("EnderItems", 10), CraftRegistry.getMinecraftRegistry()); + enderchest = new CraftInventory(endchest); + } + return enderchest; + } + + @Override + public void setEnderChest(Inventory inventory) { + net.minecraft.nbt.CompoundTag nbtTagCompound = ((CompoundTagImpl) compound).toNMSTag(); + nbtTagCompound.put("EnderItems", ((PlayerEnderChestContainer) ((CraftInventory) inventory).getInventory()).createTag(CraftRegistry.getMinecraftRegistry())); + this.compound = CompoundTagImpl.fromNMSTag(nbtTagCompound); + markModified(); + } + + @Override + public double getMaxHealth() { + AttributeInstance maxHealth = getAttributes().getInstance(Attributes.MAX_HEALTH); + return maxHealth == null ? Attributes.MAX_HEALTH.value().getDefaultValue() : maxHealth.getValue(); + } + + @Override + public void setMaxHealth(double input) { + AttributeMap attributes = getAttributes(); + AttributeInstance maxHealth = attributes.getInstance(Attributes.MAX_HEALTH); + maxHealth.setBaseValue(input); + setAttributes(attributes); + } + + private AttributeMap getAttributes() { + AttributeMap amb = new AttributeMap(DefaultAttributes.getSupplier(net.minecraft.world.entity.EntityType.PLAYER)); + amb.load(((CompoundTagImpl) this.compound).toNMSTag().getList("Attributes", 10)); + return amb; + } + + public void setAttributes(AttributeMap attributes) { + net.minecraft.nbt.CompoundTag nbtTagCompound = ((CompoundTagImpl) compound).toNMSTag(); + nbtTagCompound.put("Attributes", attributes.save()); + this.compound = CompoundTagImpl.fromNMSTag(nbtTagCompound); + markModified(); + } + + @Override + protected boolean loadPlayerData(UUID uuid) { + try { + this.player = uuid; + for (org.bukkit.World w : Bukkit.getWorlds()) { + this.file = new File(w.getWorldFolder(), "playerdata" + File.separator + this.player + ".dat"); + if (this.file.exists()) { + this.compound = CompoundTagImpl.fromNMSTag(NbtIo.readCompressed(new FileInputStream(this.file), NbtAccounter.unlimitedHeap())); + return true; + } + } + } + catch (Exception e) { + Debug.echoError(e); + } + return false; + } + + @Override + public void saveInternal(CompoundTag compound) { + try { + NbtIo.writeCompressed(((CompoundTagImpl) compound).toNMSTag(), new FileOutputStream(this.file)); + } + catch (Exception e) { + Debug.echoError(e); + } + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ProfileEditorImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ProfileEditorImpl.java new file mode 100644 index 0000000000..22c875f555 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ProfileEditorImpl.java @@ -0,0 +1,135 @@ +package com.denizenscript.denizen.nms.v1_20.impl; + +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.abstracts.ProfileEditor; +import com.denizenscript.denizen.nms.util.PlayerProfile; +import com.denizenscript.denizen.nms.v1_20.Handler; +import com.denizenscript.denizen.nms.v1_20.helpers.PacketHelperImpl; +import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.scripts.commands.entity.RenameCommand; +import com.denizenscript.denizen.utilities.FormattedTextHelper; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.properties.Property; +import net.md_5.bungee.api.ChatColor; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.game.ClientboundPlayerInfoRemovePacket; +import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerRespawnEvent; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; +import java.util.UUID; + +public class ProfileEditorImpl extends ProfileEditor { + + public static final String EMPTY_NAME = ""; + public static final UUID NIL_UUID = new UUID(0L, 0L); + + @Override + protected void updatePlayer(final Player player, final boolean isSkinChanging) { + final ServerPlayer nmsPlayer = ((CraftPlayer) player).getHandle(); + final UUID uuid = player.getUniqueId(); + ClientboundPlayerInfoRemovePacket removePlayerInfoPacket = new ClientboundPlayerInfoRemovePacket(List.of(uuid)); + ClientboundPlayerInfoUpdatePacket addPlayerInfoPacket = ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(nmsPlayer)); + for (Player otherPlayer : Bukkit.getServer().getOnlinePlayers()) { + PacketHelperImpl.send(otherPlayer, removePlayerInfoPacket); + PacketHelperImpl.send(otherPlayer, addPlayerInfoPacket); + } + for (Player otherPlayer : NMSHandler.entityHelper.getPlayersThatSee(player)) { + if (!otherPlayer.getUniqueId().equals(uuid)) { + PacketHelperImpl.forceRespawnPlayerEntity(player, otherPlayer); + } + } + if (isSkinChanging) { + ((CraftServer) Bukkit.getServer()).getHandle().respawn(nmsPlayer, (ServerLevel) nmsPlayer.level(), true, player.getLocation(), false, PlayerRespawnEvent.RespawnReason.PLUGIN); + } + player.updateInventory(); + } + + public static void registerHandlers() { + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundPlayerInfoUpdatePacket.class, ProfileEditorImpl::processPlayerInfoUpdatePacket); + } + + public static ClientboundPlayerInfoUpdatePacket processPlayerInfoUpdatePacket(DenizenNetworkManagerImpl networkManager, ClientboundPlayerInfoUpdatePacket playerInfoUpdatePacket) { + if (ProfileEditor.mirrorUUIDs.isEmpty() && !RenameCommand.hasAnyDynamicRenames() && fakeProfiles.isEmpty()) { + return playerInfoUpdatePacket; + } + EnumSet actions = playerInfoUpdatePacket.actions(); + if (!actions.contains(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER) && !actions.contains(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME)) { + return playerInfoUpdatePacket; + } + boolean any = false; + for (ClientboundPlayerInfoUpdatePacket.Entry entry : playerInfoUpdatePacket.entries()) { + if (shouldChange(entry)) { + any = true; + break; + } + } + if (!any) { + return playerInfoUpdatePacket; + } + GameProfile ownProfile = networkManager.player.getGameProfile(); + List modifiedEntries = new ArrayList<>(playerInfoUpdatePacket.entries().size()); + for (ClientboundPlayerInfoUpdatePacket.Entry entry : playerInfoUpdatePacket.entries()) { + if (!shouldChange(entry)) { + modifiedEntries.add(entry); + continue; + } + String rename = RenameCommand.getCustomNameFor(entry.profileId(), networkManager.player.getBukkitEntity(), false); + GameProfile baseProfile = fakeProfiles.containsKey(entry.profileId()) ? getGameProfile(fakeProfiles.get(entry.profileId())) : entry.profile(); + GameProfile modifiedProfile = new GameProfile(baseProfile.getId(), rename != null ? (rename.length() > 16 ? rename.substring(0, 16) : rename) : baseProfile.getName()); + if (ProfileEditor.mirrorUUIDs.contains(entry.profileId())) { + modifiedProfile.getProperties().putAll(ownProfile.getProperties()); + } + else { + modifiedProfile.getProperties().putAll(baseProfile.getProperties()); + } + String listRename = RenameCommand.getCustomNameFor(entry.profileId(), networkManager.player.getBukkitEntity(), true); + Component displayName = listRename != null ? Handler.componentToNMS(FormattedTextHelper.parse(listRename, ChatColor.WHITE)) : entry.displayName(); + ClientboundPlayerInfoUpdatePacket.Entry modifiedEntry = new ClientboundPlayerInfoUpdatePacket.Entry(entry.profileId(), modifiedProfile, entry.listed(), entry.latency(), entry.gameMode(), displayName, entry.chatSession()); + modifiedEntries.add(modifiedEntry); + } + return createInfoPacket(actions, modifiedEntries); + } + + public static boolean shouldChange(ClientboundPlayerInfoUpdatePacket.Entry entry) { + return ProfileEditor.mirrorUUIDs.contains(entry.profileId()) || RenameCommand.customNames.containsKey(entry.profileId()) || fakeProfiles.containsKey(entry.profileId()); + } + + public static final Field ClientboundPlayerInfoUpdatePacket_entries = ReflectionHelper.getFields(ClientboundPlayerInfoUpdatePacket.class).getFirstOfType(List.class); + + public static ClientboundPlayerInfoUpdatePacket createInfoPacket(EnumSet actions, List entries) { + ClientboundPlayerInfoUpdatePacket playerInfoUpdatePacket = new ClientboundPlayerInfoUpdatePacket(actions, List.of()); + try { + ClientboundPlayerInfoUpdatePacket_entries.set(playerInfoUpdatePacket, entries); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + return playerInfoUpdatePacket; + } + + public static GameProfile getGameProfileNoProperties(PlayerProfile playerProfile) { + UUID uuid = playerProfile.getUniqueId(); + String name = playerProfile.getName(); + return new GameProfile(uuid != null ? uuid : NIL_UUID, name != null ? name : EMPTY_NAME); + } + + public static GameProfile getGameProfile(PlayerProfile playerProfile) { + GameProfile gameProfile = getGameProfileNoProperties(playerProfile); + if (playerProfile.hasTexture()) { + gameProfile.getProperties().put("textures", new Property("textures", playerProfile.getTexture(), playerProfile.getTextureSignature())); + } + return gameProfile; + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/SidebarImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/SidebarImpl.java new file mode 100644 index 0000000000..ed33d38f76 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/SidebarImpl.java @@ -0,0 +1,104 @@ +package com.denizenscript.denizen.nms.v1_20.impl; + +import com.denizenscript.denizen.nms.abstracts.Sidebar; +import com.denizenscript.denizen.nms.v1_20.Handler; +import com.denizenscript.denizen.nms.v1_20.helpers.PacketHelperImpl; +import com.denizenscript.denizen.utilities.FormattedTextHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.md_5.bungee.api.ChatColor; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.numbers.StyledFormat; +import net.minecraft.network.protocol.game.ClientboundSetDisplayObjectivePacket; +import net.minecraft.network.protocol.game.ClientboundSetObjectivePacket; +import net.minecraft.network.protocol.game.ClientboundSetPlayerTeamPacket; +import net.minecraft.network.protocol.game.ClientboundSetScorePacket; +import net.minecraft.world.scores.DisplaySlot; +import net.minecraft.world.scores.Objective; +import net.minecraft.world.scores.PlayerTeam; +import net.minecraft.world.scores.Scoreboard; +import net.minecraft.world.scores.criteria.ObjectiveCriteria; +import org.bukkit.entity.Player; + +import java.lang.reflect.Constructor; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class SidebarImpl extends Sidebar { + + // TODO: 1.20.3: the scoreboard system saw significant changes, there is likely a better way to do this now + + public static Scoreboard dummyScoreboard = new Scoreboard(); + public static ObjectiveCriteria dummyCriteria; + + static { + try { + Constructor constructor = ObjectiveCriteria.class.getDeclaredConstructor(String.class); + constructor.setAccessible(true); + dummyCriteria = constructor.newInstance("dummy"); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + public Objective obj1; + public Objective obj2; + + public SidebarImpl(Player player) { + super(player); + Component chatComponentTitle = Handler.componentToNMS(FormattedTextHelper.parse(title, ChatColor.WHITE)); + this.obj1 = new Objective(dummyScoreboard, "dummy_1", dummyCriteria, chatComponentTitle, ObjectiveCriteria.RenderType.INTEGER, false, StyledFormat.SIDEBAR_DEFAULT); + this.obj2 = new Objective(dummyScoreboard, "dummy_2", dummyCriteria, chatComponentTitle, ObjectiveCriteria.RenderType.INTEGER, false, StyledFormat.SIDEBAR_DEFAULT); + } + + @Override + protected void setDisplayName(String title) { + if (this.obj1 != null) { + Component chatComponentTitle = Handler.componentToNMS(FormattedTextHelper.parse(title, ChatColor.WHITE)); + this.obj1.setDisplayName(chatComponentTitle); + this.obj2.setDisplayName(chatComponentTitle); + } + } + + public List generatedTeams = new ArrayList<>(); + + @Override + public void sendUpdate() { + List oldTeams = generatedTeams; + generatedTeams = new ArrayList<>(); + PacketHelperImpl.send(player, new ClientboundSetObjectivePacket(this.obj1, 0)); + String[] ids = getIds(); + for (int i = 0; i < this.lines.length; i++) { + String line = this.lines[i]; + if (line == null) { + break; + } + String lineId = ids[i]; + PlayerTeam team = new PlayerTeam(dummyScoreboard, lineId); + team.getPlayers().add(lineId); + team.setPlayerPrefix(Handler.componentToNMS(FormattedTextHelper.parse(line, ChatColor.WHITE))); + generatedTeams.add(team); + PacketHelperImpl.send(player, ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(team, true)); + PacketHelperImpl.send(player, new ClientboundSetScorePacket(lineId, obj1.getName(), this.scores[i], Optional.empty(), Optional.of(StyledFormat.SIDEBAR_DEFAULT))); + } + PacketHelperImpl.send(player, new ClientboundSetDisplayObjectivePacket(DisplaySlot.SIDEBAR, this.obj1)); + PacketHelperImpl.send(player, new ClientboundSetObjectivePacket(this.obj2, 1)); + Objective temp = this.obj2; + this.obj2 = this.obj1; + this.obj1 = temp; + for (PlayerTeam team : oldTeams) { + PacketHelperImpl.send(player, ClientboundSetPlayerTeamPacket.createRemovePacket(team)); + } + } + + @Override + public void remove() { + for (PlayerTeam team : generatedTeams) { + PacketHelperImpl.send(player, ClientboundSetPlayerTeamPacket.createRemovePacket(team)); + } + generatedTeams.clear(); + PacketHelperImpl.send(player, new ClientboundSetObjectivePacket(this.obj2, 1)); + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/blocks/BlockLightImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/blocks/BlockLightImpl.java new file mode 100644 index 0000000000..912f37c5c2 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/blocks/BlockLightImpl.java @@ -0,0 +1,264 @@ +package com.denizenscript.denizen.nms.v1_20.impl.blocks; + +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.abstracts.BlockLight; +import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; +import com.denizenscript.denizen.utilities.blocks.ChunkCoordinate; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.minecraft.core.BlockPos; +import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket; +import net.minecraft.network.protocol.game.ClientboundLightUpdatePacket; +import net.minecraft.server.level.ThreadedLevelLightEngine; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LightLayer; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.DataLayer; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.chunk.status.ChunkStatus; +import net.minecraft.world.level.lighting.LayerLightEventListener; +import net.minecraft.world.level.lighting.LevelLightEngine; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_20_R4.CraftChunk; +import org.bukkit.craftbukkit.v1_20_R4.block.CraftBlock; +import org.bukkit.util.Vector; + +import java.lang.invoke.MethodHandle; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.BitSet; +import java.util.List; + +public class BlockLightImpl extends BlockLight { + + public static final Class LIGHTENGINETHREADED_TASKTYPE = Arrays.stream(ThreadedLevelLightEngine.class.getDeclaredClasses()).filter(c -> c.isEnum()).findFirst().get(); // TaskType + public static final Object LIGHTENGINETHREADED_TASKTYPE_PRE; + + static { + Object preObj = null; + try { + preObj = ReflectionHelper.getFields(LIGHTENGINETHREADED_TASKTYPE).get(ReflectionMappingsInfo.ThreadedLevelLightEngineTaskType_PRE_UPDATE).get(null); + } + catch (Throwable ex) { + ex.printStackTrace(); + } + LIGHTENGINETHREADED_TASKTYPE_PRE = preObj; + } + + public static final MethodHandle LIGHTENGINETHREADED_QUEUERUNNABLE = ReflectionHelper.getMethodHandle(ThreadedLevelLightEngine.class, ReflectionMappingsInfo.ThreadedLevelLightEngine_addTask_method, + int.class, int.class, LIGHTENGINETHREADED_TASKTYPE, Runnable.class); + + public static void enqueueRunnable(LevelChunk chunk, Runnable runnable) { + LevelLightEngine lightEngine = chunk.getLevel().getChunkSource().getLightEngine(); + if (lightEngine instanceof ThreadedLevelLightEngine) { + ChunkPos coord = chunk.getPos(); + try { + LIGHTENGINETHREADED_QUEUERUNNABLE.invoke(lightEngine, coord.x, coord.z, LIGHTENGINETHREADED_TASKTYPE_PRE, runnable); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + else { + runnable.run(); + } + } + + private BlockLightImpl(Location location, long ticks) { + super(location, ticks); + } + + public static BlockLight createLight(Location location, int lightLevel, long ticks) { + location = location.getBlock().getLocation(); + BlockLight blockLight; + if (lightsByLocation.containsKey(location)) { + blockLight = lightsByLocation.get(location); + if (blockLight.removeTask != null) { + blockLight.removeTask.cancel(); + blockLight.removeTask = null; + } + if (blockLight.updateTask != null) { + blockLight.updateTask.cancel(); + blockLight.updateTask = null; + } + blockLight.removeLater(ticks); + } + else { + blockLight = new BlockLightImpl(location, ticks); + lightsByLocation.put(location, blockLight); + if (!lightsByChunk.containsKey(blockLight.chunkCoord)) { + lightsByChunk.put(blockLight.chunkCoord, new ArrayList<>()); + } + lightsByChunk.get(blockLight.chunkCoord).add(blockLight); + } + blockLight.intendedLevel = lightLevel; + blockLight.update(lightLevel, true); + return blockLight; + } + + public static void checkIfLightsBrokenByPacket(ClientboundBlockUpdatePacket packet, Level world) { + try { + BlockPos pos = packet.getPos(); + int chunkX = pos.getX() >> 4; + int chunkZ = pos.getZ() >> 4; + Bukkit.getScheduler().scheduleSyncDelayedTask(NMSHandler.getJavaPlugin(), () -> { + LevelChunk chunk = world.getChunk(chunkX, chunkZ); + boolean any = false; + for (Vector vec : RELATIVE_CHUNKS) { + ChunkAccess other = world.getChunk(chunkX + vec.getBlockX(), chunkZ + vec.getBlockZ(), ChunkStatus.FULL, false); + if (other instanceof LevelChunk) { + List lights = lightsByChunk.get(new ChunkCoordinate(new CraftChunk((LevelChunk) other))); + if (lights != null) { + any = true; + for (BlockLight light : lights) { + Bukkit.getScheduler().scheduleSyncDelayedTask(NMSHandler.getJavaPlugin(), () -> light.update(light.intendedLevel, false), 1); + } + } + } + } + if (any) { + Bukkit.getScheduler().scheduleSyncDelayedTask(NMSHandler.getJavaPlugin(), () -> sendNearbyChunkUpdates(chunk), 3); + } + }, 1); + } + catch (Exception ex) { + Debug.echoError(ex); + } + } + + public static void checkIfLightsBrokenByPacket(ClientboundLightUpdatePacket packet, Level world) { + if (doNotCheck) { + return; + } + try { + int cX = packet.getX(); + int cZ = packet.getZ(); + BitSet bitMask = packet.getLightData().getBlockYMask(); + List blockData = packet.getLightData().getBlockUpdates(); + Bukkit.getScheduler().scheduleSyncDelayedTask(NMSHandler.getJavaPlugin(), () -> { + ChunkAccess chk = world.getChunk(cX, cZ, ChunkStatus.FULL, false); + if (!(chk instanceof LevelChunk)) { + return; + } + List lights = lightsByChunk.get(new ChunkCoordinate(new CraftChunk((LevelChunk) chk))); + if (lights == null) { + return; + } + boolean any = false; + for (BlockLight light : lights) { + if (((BlockLightImpl) light).checkIfChangedBy(bitMask, blockData)) { + Bukkit.getScheduler().scheduleSyncDelayedTask(NMSHandler.getJavaPlugin(), () -> light.update(light.intendedLevel, false), 1); + any = true; + } + } + if (any) { + Bukkit.getScheduler().scheduleSyncDelayedTask(NMSHandler.getJavaPlugin(), () -> sendNearbyChunkUpdates((LevelChunk) chk), 3); + } + }, 1); + } + catch (Exception ex) { + Debug.echoError(ex); + } + } + + public static boolean doNotCheck = false; + + public boolean checkIfChangedBy(BitSet bitmask, List data) { + Location blockLoc = block.getLocation(); + int layer = (blockLoc.getBlockY() >> 4) + 1; + if (!bitmask.get(layer)) { + return false; + } + int found = 0; + for (int i = 0; i < 16; i++) { + if (bitmask.get(i)) { + if (i == layer) { + byte[] blocks = data.get(found); + DataLayer arr = new DataLayer(blocks); + int x = blockLoc.getBlockX() - (chunkCoord.x << 4); + int y = blockLoc.getBlockY() % 16; + int z = blockLoc.getBlockZ() - (chunkCoord.z << 4); + int level = arr.get(x, y, z); + return intendedLevel != level; + } + found++; + } + } + return false; + } + + public static void runResetFor(final LevelChunk chunk, final BlockPos pos) { + Runnable runnable = () -> { + LevelLightEngine lightEngine = chunk.getLevel().getChunkSource().getLightEngine(); + LayerLightEventListener engineBlock = lightEngine.getLayerListener(LightLayer.BLOCK); + engineBlock.checkBlock(pos); + }; + enqueueRunnable(chunk, runnable); + } + + public static void runSetFor(final LevelChunk chunk, final BlockPos pos, final int level) { + Runnable runnable = () -> { + LevelLightEngine lightEngine = chunk.getLevel().getChunkSource().getLightEngine(); + LayerLightEventListener engineBlock = lightEngine.getLayerListener(LightLayer.BLOCK); + // engineBlock.onBlockEmissionIncrease(pos, level); // TODO: 1.20: ? + }; + enqueueRunnable(chunk, runnable); + } + + @Override + public void reset(boolean updateChunk) { + runResetFor((LevelChunk) ((CraftChunk) getChunk()).getHandle(ChunkStatus.FULL), ((CraftBlock) block).getPosition()); + if (updateChunk) { + // This runnable cast is necessary despite what your IDE may claim + updateTask = Bukkit.getScheduler().runTaskLater(NMSHandler.getJavaPlugin(), (Runnable) this::sendNearbyChunkUpdates, 1); + } + } + + @Override + public void update(int lightLevel, boolean updateChunk) { + runResetFor((LevelChunk) ((CraftChunk) getChunk()).getHandle(ChunkStatus.FULL), ((CraftBlock) block).getPosition()); + updateTask = Bukkit.getScheduler().runTaskLater(NMSHandler.getJavaPlugin(), () -> { + updateTask = null; + runSetFor((LevelChunk) ((CraftChunk) chunk).getHandle(ChunkStatus.FULL), ((CraftBlock) block).getPosition(), lightLevel); + if (updateChunk) { + // This runnable cast is necessary despite what your IDE may claim + updateTask = Bukkit.getScheduler().runTaskLater(NMSHandler.getJavaPlugin(), (Runnable) this::sendNearbyChunkUpdates, 1); + } + }, 1); + } + + public static final Vector[] RELATIVE_CHUNKS = new Vector[] { + new Vector(0, 0, 0), + new Vector(-1, 0, 0), new Vector(1, 0, 0), new Vector(0, 0, -1), new Vector(0, 0, 1), + new Vector(-1, 0, -1), new Vector(-1, 0, 1), new Vector(1, 0, -1), new Vector(1, 0, 1) + }; + + public void sendNearbyChunkUpdates() { + sendNearbyChunkUpdates((LevelChunk) ((CraftChunk) getChunk()).getHandle(ChunkStatus.FULL)); + } + + public static void sendNearbyChunkUpdates(LevelChunk chunk) { + ChunkPos pos = chunk.getPos(); + for (Vector vec : RELATIVE_CHUNKS) { + ChunkAccess other = chunk.getLevel().getChunk(pos.x + vec.getBlockX(), pos.z + vec.getBlockZ(), ChunkStatus.FULL, false); + if (other instanceof LevelChunk) { + sendSingleChunkUpdate((LevelChunk) other); + } + } + } + + public static void sendSingleChunkUpdate(LevelChunk chunk) { + // TODO: 1.20: ? + /* + doNotCheck = true; + LevelLightEngine lightEngine = chunk.getLevel().getChunkSource().getLightEngine(); + ChunkPos pos = chunk.getPos(); + //ClientboundLightUpdatePacket packet = new ClientboundLightUpdatePacket(pos, lightEngine, null, null, true); // TODO: 1.16: should 'trust edges' be true here? + ((ServerChunkCache) chunk.getLevel().getChunkSource()).chunkMap.getPlayers(pos, false).forEach((player) -> { + player.connection.send(packet); + }); + doNotCheck = false;*/ + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakeArrowImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakeArrowImpl.java new file mode 100644 index 0000000000..1257f21557 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakeArrowImpl.java @@ -0,0 +1,27 @@ +package com.denizenscript.denizen.nms.v1_20.impl.entities; + +import com.denizenscript.denizen.nms.interfaces.FakeArrow; +import net.minecraft.world.entity.projectile.AbstractArrow; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftAbstractArrow; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftArrow; + +public class CraftFakeArrowImpl extends CraftAbstractArrow implements FakeArrow { + + public CraftFakeArrowImpl(CraftServer craftServer, AbstractArrow entityArrow) { + super(craftServer, entityArrow); + } + + @Override + public void remove() { + if (getPassenger() != null) { + return; + } + super.remove(); + } + + @Override + public String getEntityTypeName() { + return "FAKE_ARROW"; + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakePlayerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakePlayerImpl.java new file mode 100644 index 0000000000..284ccc5b24 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakePlayerImpl.java @@ -0,0 +1,66 @@ +package com.denizenscript.denizen.nms.v1_20.impl.entities; + +import com.denizenscript.denizen.nms.interfaces.FakePlayer; +import com.denizenscript.denizen.nms.NMSHandler; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.metadata.MetadataValue; +import org.bukkit.plugin.Plugin; + +import java.util.List; +import java.util.Set; + +public class CraftFakePlayerImpl extends CraftPlayer implements FakePlayer { + + private final CraftServer server; + public String fullName; + + public CraftFakePlayerImpl(CraftServer server, EntityFakePlayerImpl entity) { + super(server, entity); + this.server = server; + setMetadata("NPC", new FixedMetadataValue(NMSHandler.getJavaPlugin(), true)); + } + + @Override + public void setMetadata(String metadataKey, MetadataValue newMetadataValue) { + this.server.getEntityMetadata().setMetadata(this, metadataKey, newMetadataValue); + } + + @Override + public List getMetadata(String metadataKey) { + return this.server.getEntityMetadata().getMetadata(this, metadataKey); + } + + @Override + public boolean hasMetadata(String metadataKey) { + return this.server.getEntityMetadata().hasMetadata(this, metadataKey); + } + + @Override + public void removeMetadata(String metadataKey, Plugin owningPlugin) { + this.server.getEntityMetadata().removeMetadata(this, metadataKey, owningPlugin); + } + + @Override + public String getEntityTypeName() { + return "FAKE_PLAYER"; + } + + @Override + public String getFullName() { + return fullName; + } + + @Override + public Block getTargetBlock(Set transparent, int maxDistance) { + return null; + } + + @Override + public List getLastTwoTargetBlocks(Set transparent, int maxDistance) { + return null; + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftItemProjectileImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftItemProjectileImpl.java new file mode 100644 index 0000000000..acef3db2ac --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftItemProjectileImpl.java @@ -0,0 +1,117 @@ +package com.denizenscript.denizen.nms.v1_20.impl.entities; + +import com.denizenscript.denizen.nms.interfaces.ItemProjectile; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; +import org.bukkit.projectiles.ProjectileSource; + +import java.lang.invoke.MethodHandle; +import java.util.UUID; + +public class CraftItemProjectileImpl extends CraftEntity implements ItemProjectile { + + private boolean doesBounce; + + public CraftItemProjectileImpl(CraftServer server, EntityItemProjectileImpl entity) { + super(server, entity); + MethodHandle handle = ReflectionHelper.getFinalSetterForFirstOfType(CraftEntity.class, EntityType.class); + if (handle != null) { + try { + handle.invoke(this, EntityType.ITEM); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + } + + @Override + public EntityItemProjectileImpl getHandle() { + return (EntityItemProjectileImpl) super.getHandle(); + } + + @Override + public String getEntityTypeName() { + return getType().name(); + } + + @Override + public ItemStack getItemStack() { + return CraftItemStack.asBukkitCopy(getHandle().getItemStack()); + } + + @Override + public void setItemStack(ItemStack itemStack) { + getHandle().setItemStack(CraftItemStack.asNMSCopy(itemStack)); + } + + @Override + public int getPickupDelay() { + return 0; + } + + @Override + public void setPickupDelay(int i) { + // Do nothing + } + + @Override + public void setUnlimitedLifetime(boolean b) { + // Do nothing + } + + @Override + public boolean isUnlimitedLifetime() { + return false; + } + + @Override + public void setOwner(UUID uuid) { + // Do nothing + } + + @Override + public UUID getOwner() { + return null; + } + + @Override + public void setThrower(UUID uuid) { + // Do nothing + } + + @Override + public UUID getThrower() { + return null; + } + + @Override + public ProjectileSource getShooter() { + return getHandle().projectileSource; + } + + @Override + public void setShooter(ProjectileSource projectileSource) { + if (projectileSource instanceof CraftEntity) { + getHandle().setOwner(((CraftEntity) projectileSource).getHandle()); + } + else { + getHandle().projectileSource = projectileSource; + } + } + + @Override + public boolean doesBounce() { + return doesBounce; + } + + @Override + public void setBounce(boolean doesBounce) { + this.doesBounce = doesBounce; + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakeArrowImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakeArrowImpl.java new file mode 100644 index 0000000000..ba5f95cfb9 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakeArrowImpl.java @@ -0,0 +1,43 @@ +package com.denizenscript.denizen.nms.v1_20.impl.entities; + +import com.denizenscript.denizen.nms.v1_20.Handler; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.minecraft.world.entity.projectile.SpectralArrow; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.event.entity.CreatureSpawnEvent; + +public class EntityFakeArrowImpl extends SpectralArrow { + + public EntityFakeArrowImpl(CraftWorld craftWorld, Location location) { + super(net.minecraft.world.entity.EntityType.SPECTRAL_ARROW, craftWorld.getHandle()); + try { + Handler.ENTITY_BUKKITYENTITY.set(this, new CraftFakeArrowImpl((CraftServer) Bukkit.getServer(), this)); + } + catch (Exception ex) { + Debug.echoError(ex); + } + setPosRaw(location.getX(), location.getY(), location.getZ()); + setRot(location.getYaw(), location.getPitch()); + level().addFreshEntity(this, CreatureSpawnEvent.SpawnReason.CUSTOM); + } + + @Override + public void tick() { + // Do nothing + } + + @Override + protected ItemStack getPickupItem() { + return new ItemStack(Items.ARROW); + } + + @Override + public CraftFakeArrowImpl getBukkitEntity() { + return (CraftFakeArrowImpl) super.getBukkitEntity(); + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakePlayerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakePlayerImpl.java new file mode 100644 index 0000000000..4ce9400acf --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakePlayerImpl.java @@ -0,0 +1,44 @@ +package com.denizenscript.denizen.nms.v1_20.impl.entities; + +import com.denizenscript.denizen.nms.v1_20.Handler; +import com.denizenscript.denizen.nms.v1_20.impl.network.fakes.FakeNetworkManagerImpl; +import com.denizenscript.denizen.nms.v1_20.impl.network.fakes.FakePlayerConnectionImpl; +import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.mojang.authlib.GameProfile; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.minecraft.network.Connection; +import net.minecraft.network.protocol.PacketFlow; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ClientInformation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.network.CommonListenerCookie; +import net.minecraft.world.entity.player.Player; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.event.entity.CreatureSpawnEvent; + +public class EntityFakePlayerImpl extends ServerPlayer { + + public EntityFakePlayerImpl(MinecraftServer minecraftserver, ServerLevel worldserver, GameProfile gameprofile, ClientInformation clientInfo, boolean doAdd) { + super(minecraftserver, worldserver, gameprofile, clientInfo); + try { + Handler.ENTITY_BUKKITYENTITY.set(this, new CraftFakePlayerImpl((CraftServer) Bukkit.getServer(), this)); + Connection networkManager = new FakeNetworkManagerImpl(PacketFlow.CLIENTBOUND); + connection = new FakePlayerConnectionImpl(minecraftserver, networkManager, this, new CommonListenerCookie(gameprofile, 0, clientInfo, false)); + DenizenNetworkManagerImpl.Connection_packetListener.set(networkManager, connection); + } + catch (Exception ex) { + Debug.echoError(ex); + } + getEntityData().set(Player.DATA_PLAYER_MODE_CUSTOMISATION, (byte) 127); + if (doAdd) { + worldserver.addFreshEntity(this, CreatureSpawnEvent.SpawnReason.CUSTOM); + } + } + + @Override + public CraftFakePlayerImpl getBukkitEntity() { + return (CraftFakePlayerImpl) super.getBukkitEntity(); + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityItemProjectileImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityItemProjectileImpl.java new file mode 100644 index 0000000000..b894cd54e1 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityItemProjectileImpl.java @@ -0,0 +1,103 @@ +package com.denizenscript.denizen.nms.v1_20.impl.entities; + +import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import com.google.common.base.Preconditions; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.projectile.ThrowableProjectile; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_20_R4.CraftRegistry; + +import java.lang.invoke.MethodHandle; + +public class EntityItemProjectileImpl extends ThrowableProjectile { + + public static MethodHandle setBukkitEntityMethod = ReflectionHelper.getFinalSetter(Entity.class, "bukkitEntity"); + + public static final EntityDataAccessor ITEM; + + static { + EntityDataAccessor watcher = null; + try { + watcher = (EntityDataAccessor) ReflectionHelper.getFields(ItemEntity.class).get(ReflectionMappingsInfo.ItemEntity_DATA_ITEM).get(null); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + ITEM = watcher; + } + + public EntityItemProjectileImpl(Level world, Location location, ItemStack item) { + super((net.minecraft.world.entity.EntityType) net.minecraft.world.entity.EntityType.ITEM, world); + try { + setBukkitEntityMethod.invoke(this, new CraftItemProjectileImpl(((ServerLevel) world).getServer().server, this)); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + setPosRaw(location.getX(), location.getY(), location.getZ()); + setRot(location.getYaw(), location.getPitch()); + setItemStack(item); + } + + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + builder.define(ITEM, ItemStack.EMPTY); + } + + public ItemStack getItemStack() { + return this.getEntityData().get(ITEM); + } + + public void setItemStack(ItemStack itemstack) { + Preconditions.checkArgument(!itemstack.isEmpty(), "Cannot drop air"); + this.getEntityData().set(ITEM, itemstack); + this.getEntityData().markDirty(ITEM); + } + + @Override + protected void onHitBlock(BlockHitResult movingobjectpositionblock) { + super.onHitBlock(movingobjectpositionblock); + remove(RemovalReason.KILLED); + } + + @Override + public void onSyncedDataUpdated(EntityDataAccessor datawatcherobject) { + super.onSyncedDataUpdated(datawatcherobject); + if (ITEM.equals(datawatcherobject)) { + this.getItemStack().setEntityRepresentation(this); + } + } + + @Override + public boolean save(net.minecraft.nbt.CompoundTag nbttagcompound) { + if (!this.getItemStack().isEmpty()) { + nbttagcompound.put("Item", this.getItemStack().save(CraftRegistry.getMinecraftRegistry())); + } + super.save(nbttagcompound); + return true; + } + + @Override + public void load(net.minecraft.nbt.CompoundTag nbttagcompound) { + net.minecraft.nbt.CompoundTag nbttagcompound1 = nbttagcompound.getCompound("Item"); + this.setItemStack(ItemStack.parseOptional(CraftRegistry.getMinecraftRegistry(), nbttagcompound1)); + if (this.getItemStack().isEmpty()) { + this.remove(RemovalReason.KILLED); + } + super.load(nbttagcompound); + } + + @Override + public CraftItemProjectileImpl getBukkitEntity() { + return (CraftItemProjectileImpl) super.getBukkitEntity(); + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/jnbt/CompoundTagImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/jnbt/CompoundTagImpl.java new file mode 100644 index 0000000000..492d506d60 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/jnbt/CompoundTagImpl.java @@ -0,0 +1,137 @@ +package com.denizenscript.denizen.nms.v1_20.impl.jnbt; + +import com.denizenscript.denizen.nms.util.jnbt.*; +import com.denizenscript.denizen.nms.util.jnbt.ByteArrayTag; +import com.denizenscript.denizen.nms.util.jnbt.ByteTag; +import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; +import com.denizenscript.denizen.nms.util.jnbt.DoubleTag; +import com.denizenscript.denizen.nms.util.jnbt.EndTag; +import com.denizenscript.denizen.nms.util.jnbt.FloatTag; +import com.denizenscript.denizen.nms.util.jnbt.IntArrayTag; +import com.denizenscript.denizen.nms.util.jnbt.IntTag; +import com.denizenscript.denizen.nms.util.jnbt.LongTag; +import com.denizenscript.denizen.nms.util.jnbt.ShortTag; +import com.denizenscript.denizen.nms.util.jnbt.StringTag; +import com.denizenscript.denizen.nms.util.jnbt.Tag; +import net.minecraft.nbt.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class CompoundTagImpl extends CompoundTag { + + /** + * Creates the tag with an empty name. + * + * @param value the value of the tag + */ + public CompoundTagImpl(Map value) { + super(value); + } + + public net.minecraft.nbt.CompoundTag toNMSTag() { + net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag(); + for (Map.Entry entry : value.entrySet()) { + if (entry.getValue() instanceof IntTag) { + tag.putInt(entry.getKey(), ((IntTag) entry.getValue()).getValue()); + } + else if (entry.getValue() instanceof ByteTag) { + tag.putByte(entry.getKey(), ((ByteTag) entry.getValue()).getValue()); + } + else if (entry.getValue() instanceof ByteArrayTag) { + tag.putByteArray(entry.getKey(), ((ByteArrayTag) entry.getValue()).getValue()); + } + else if (entry.getValue() instanceof CompoundTag) { + tag.put(entry.getKey(), ((CompoundTagImpl) entry.getValue()).toNMSTag()); + } + else if (entry.getValue() instanceof DoubleTag) { + tag.putDouble(entry.getKey(), ((DoubleTag) entry.getValue()).getValue()); + } + else if (entry.getValue() instanceof FloatTag) { + tag.putFloat(entry.getKey(), ((FloatTag) entry.getValue()).getValue()); + } + else if (entry.getValue() instanceof IntArrayTag) { + tag.putIntArray(entry.getKey(), ((IntArrayTag) entry.getValue()).getValue()); + } + else if (entry.getValue() instanceof JNBTListTag) { + List list = new ListTag(); + List tags = ((JNBTListTag) entry.getValue()).getValue(); + for (Tag btag : tags) { + HashMap btags = new HashMap<>(); + btags.put("test", btag); + CompoundTagImpl comp = new CompoundTagImpl(btags); + list.add(comp.toNMSTag().get("test")); + } + tag.put(entry.getKey(), (ListTag) list); + } + else if (entry.getValue() instanceof LongTag) { + tag.putLong(entry.getKey(), ((LongTag) entry.getValue()).getValue()); + } + else if (entry.getValue() instanceof ShortTag) { + tag.putShort(entry.getKey(), ((ShortTag) entry.getValue()).getValue()); + } + else if (entry.getValue() instanceof StringTag) { + tag.putString(entry.getKey(), ((StringTag) entry.getValue()).getValue()); + } + } + return tag; + } + + public static CompoundTag fromNMSTag(net.minecraft.nbt.CompoundTag tag) { + HashMap tags = new HashMap<>(); + for (String key : tag.getAllKeys()) { + net.minecraft.nbt.Tag base = tag.get(key); + if (base instanceof net.minecraft.nbt.IntTag) { + tags.put(key, new IntTag(((net.minecraft.nbt.IntTag) base).getAsInt())); + } + else if (base instanceof net.minecraft.nbt.ByteTag) { + tags.put(key, new ByteTag(((net.minecraft.nbt.ByteTag) base).getAsByte())); + } + else if (base instanceof net.minecraft.nbt.FloatTag) { + tags.put(key, new FloatTag(((net.minecraft.nbt.FloatTag) base).getAsFloat())); + } + else if (base instanceof net.minecraft.nbt.DoubleTag) { + tags.put(key, new DoubleTag(((net.minecraft.nbt.DoubleTag) base).getAsDouble())); + } + else if (base instanceof net.minecraft.nbt.ByteArrayTag) { + tags.put(key, new ByteArrayTag(((net.minecraft.nbt.ByteArrayTag) base).getAsByteArray())); + } + else if (base instanceof net.minecraft.nbt.IntArrayTag) { + tags.put(key, new IntArrayTag(((net.minecraft.nbt.IntArrayTag) base).getAsIntArray())); + } + else if (base instanceof net.minecraft.nbt.CompoundTag) { + tags.put(key, fromNMSTag(((net.minecraft.nbt.CompoundTag) base))); + } + else if (base instanceof net.minecraft.nbt.EndTag) { + tags.put(key, new EndTag()); + } + else if (base instanceof net.minecraft.nbt.LongTag) { + tags.put(key, new LongTag(((net.minecraft.nbt.LongTag) base).getAsLong())); + } + else if (base instanceof net.minecraft.nbt.ShortTag) { + tags.put(key, new ShortTag(((net.minecraft.nbt.ShortTag) base).getAsShort())); + } + else if (base instanceof net.minecraft.nbt.StringTag) { + tags.put(key, new StringTag(base.getAsString())); + } + else if (base instanceof ListTag) { + List list = (List) base; + if (list.size() > 0) { + net.minecraft.nbt.Tag nbase = list.get(0); + net.minecraft.nbt.CompoundTag comp = new net.minecraft.nbt.CompoundTag(); + comp.put("test", nbase); + ListTagBuilder ltb = new ListTagBuilder(fromNMSTag(comp).getValue().get("test").getClass()); + for (int i = 0; i < list.size(); i++) { + net.minecraft.nbt.Tag nbase2 = list.get(i); + net.minecraft.nbt.CompoundTag comp2 = new net.minecraft.nbt.CompoundTag(); + comp2.put("test", nbase2); + ltb.add(fromNMSTag(comp2).getValue().get("test")); + } + tags.put(key, ltb.build()); + } + } + } + return new CompoundTagImpl(tags); + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/fakes/FakeChannelImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/fakes/FakeChannelImpl.java new file mode 100644 index 0000000000..9fb1fb3fa1 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/fakes/FakeChannelImpl.java @@ -0,0 +1,80 @@ +package com.denizenscript.denizen.nms.v1_20.impl.network.fakes; + +import io.netty.channel.*; + +import java.net.SocketAddress; + +public class FakeChannelImpl extends AbstractChannel { + + private final ChannelConfig config = new DefaultChannelConfig(this); + + protected FakeChannelImpl(Channel parent) { + super(parent); + } + + @Override + public ChannelConfig config() { + config.setAutoRead(true); + return config; + } + + @Override + protected AbstractUnsafe newUnsafe() { + return null; + } + + @Override + protected boolean isCompatible(EventLoop eventLoop) { + return false; + } + + @Override + protected SocketAddress localAddress0() { + return null; + } + + @Override + protected SocketAddress remoteAddress0() { + return null; + } + + @Override + protected void doBind(SocketAddress socketAddress) throws Exception { + + } + + @Override + protected void doDisconnect() throws Exception { + + } + + @Override + protected void doClose() throws Exception { + + } + + @Override + protected void doBeginRead() throws Exception { + + } + + @Override + protected void doWrite(ChannelOutboundBuffer channelOutboundBuffer) throws Exception { + + } + + @Override + public boolean isOpen() { + return false; + } + + @Override + public boolean isActive() { + return false; + } + + @Override + public ChannelMetadata metadata() { + return new ChannelMetadata(true); + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/fakes/FakeNetworkManagerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/fakes/FakeNetworkManagerImpl.java new file mode 100644 index 0000000000..050f5cc033 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/fakes/FakeNetworkManagerImpl.java @@ -0,0 +1,16 @@ +package com.denizenscript.denizen.nms.v1_20.impl.network.fakes; + +import net.minecraft.network.Connection; +import net.minecraft.network.protocol.PacketFlow; + +import java.net.SocketAddress; + +public class FakeNetworkManagerImpl extends Connection { + + public FakeNetworkManagerImpl(PacketFlow enumprotocoldirection) { + super(enumprotocoldirection); + channel = new FakeChannelImpl(null); + address = new SocketAddress() { + }; + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/fakes/FakePlayerConnectionImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/fakes/FakePlayerConnectionImpl.java new file mode 100644 index 0000000000..dcc1321dee --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/fakes/FakePlayerConnectionImpl.java @@ -0,0 +1,20 @@ +package com.denizenscript.denizen.nms.v1_20.impl.network.fakes; + +import net.minecraft.network.Connection; +import net.minecraft.network.protocol.Packet; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.CommonListenerCookie; +import net.minecraft.server.network.ServerGamePacketListenerImpl; + +public class FakePlayerConnectionImpl extends ServerGamePacketListenerImpl { + + public FakePlayerConnectionImpl(MinecraftServer minecraftserver, Connection networkmanager, ServerPlayer entityplayer, CommonListenerCookie cookie) { + super(minecraftserver, networkmanager, entityplayer, cookie); + } + + @Override + public void send(Packet packet) { + // Do nothing + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/AbstractListenerPlayInImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/AbstractListenerPlayInImpl.java new file mode 100644 index 0000000000..642859fac9 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/AbstractListenerPlayInImpl.java @@ -0,0 +1,526 @@ +package com.denizenscript.denizen.nms.v1_20.impl.network.handlers; + +import com.denizenscript.denizen.events.player.PlayerSendPacketScriptEvent; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import com.mojang.authlib.GameProfile; +import net.minecraft.network.ConnectionProtocol; +import net.minecraft.network.PacketSendListener; +import net.minecraft.network.chat.ChatType; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.PlayerChatMessage; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.PacketFlow; +import net.minecraft.network.protocol.common.*; +import net.minecraft.network.protocol.game.*; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.CommonListenerCookie; +import net.minecraft.server.network.ServerGamePacketListenerImpl; +import net.minecraft.world.entity.RelativeMovement; +import net.minecraft.world.phys.Vec3; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; +import org.bukkit.event.player.PlayerTeleportEvent; + +import java.lang.reflect.Field; +import java.net.SocketAddress; +import java.util.Set; + +public class AbstractListenerPlayInImpl extends ServerGamePacketListenerImpl { + // TODO: 1.20.6: there are some new methods that should potentially be overriden + + public static final Field ServerGamePacketListenerImpl_chunkSender = ReflectionHelper.getFields(ServerGamePacketListenerImpl.class).get(ReflectionMappingsInfo.ServerGamePacketListenerImpl_chunkSender); + + public final ServerGamePacketListenerImpl oldListener; + public final DenizenNetworkManagerImpl denizenNetworkManager; + + public AbstractListenerPlayInImpl(DenizenNetworkManagerImpl networkManager, ServerPlayer entityPlayer, ServerGamePacketListenerImpl oldListener, CommonListenerCookie cookie) { + super(MinecraftServer.getServer(), networkManager, entityPlayer, cookie); + this.oldListener = oldListener; + this.denizenNetworkManager = networkManager; + try { + ServerGamePacketListenerImpl_chunkSender.set(this, oldListener.chunkSender); + } + catch (IllegalAccessException e) { + Debug.echoError(e); + } + } + + @Override + public void disconnect(Component ichatbasecomponent) { + oldListener.disconnect(ichatbasecomponent); + } + + @Override + public void disconnect(String s) { + oldListener.disconnect(s); + } + + @Override + public void teleport(double d0, double d1, double d2, float f, float f1) { + oldListener.teleport(d0, d1, d2, f, f1); + } + + @Override + public void teleport(double d0, double d1, double d2, float f, float f1, PlayerTeleportEvent.TeleportCause cause) { + oldListener.teleport(d0, d1, d2, f, f1, cause); + } + + @Override + public void teleport(double d0, double d1, double d2, float f, float f1, Set set) { + oldListener.teleport(d0, d1, d2, f, f1, set); + } + + @Override + public boolean teleport(double d0, double d1, double d2, float f, float f1, Set set, PlayerTeleportEvent.TeleportCause cause) { + return oldListener.teleport(d0, d1, d2, f, f1, set, cause); + } + + @Override + public void teleport(Location dest) { + oldListener.teleport(dest); + } + + @Override + public CraftPlayer getCraftPlayer() { + return oldListener.getCraftPlayer(); + } + + @Override + public void tick() { + oldListener.tick(); + } + + @Override + public void resetPosition() { + oldListener.resetPosition(); + } + + @Override + public boolean isAcceptingMessages() { + return oldListener.isAcceptingMessages(); + } + + @Override + public GameProfile getOwner() { + return oldListener.getOwner(); + } + + @Override + public int latency() { + return oldListener.latency(); + } + + @Override + public void onDisconnect(Component ichatbasecomponent) { + oldListener.onDisconnect(ichatbasecomponent); + } + + @Override + public void ackBlockChangesUpTo(int i) { + oldListener.ackBlockChangesUpTo(i); + } + + @Override + public void send(Packet packet) { + oldListener.send(packet); + } + + @Override + public void send(Packet packet, PacketSendListener listener) { + oldListener.send(packet, listener); + } + + public static Field AWAITING_POS_FIELD = ReflectionHelper.getFields(ServerGamePacketListenerImpl.class).get(ReflectionMappingsInfo.ServerGamePacketListenerImpl_awaitingPositionFromClient, Vec3.class); + public static Field AWAITING_TELEPORT_FIELD = ReflectionHelper.getFields(ServerGamePacketListenerImpl.class).get(ReflectionMappingsInfo.ServerGamePacketListenerImpl_awaitingTeleport, int.class); + + public void debugPacketOutput(Packet packet) { + try { + if (packet instanceof ServerboundMovePlayerPacket) { + ServerboundMovePlayerPacket movePacket = (ServerboundMovePlayerPacket) packet; + DenizenNetworkManagerImpl.doPacketOutput("Packet ServerboundMovePlayerPacket sent from " + player.getScoreboardName() + " with XYZ=" + + movePacket.x + ", " + movePacket.y + ", " + movePacket.z + ", yRot=" + movePacket.yRot + ", xRot=" + movePacket.xRot + + ", onGround=" + movePacket.isOnGround() + ", hasPos=" + movePacket.hasPos + ", hasRot=" + movePacket.hasRot); + } + else if (packet instanceof ServerboundAcceptTeleportationPacket) { + Vec3 awaitPos = (Vec3) AWAITING_POS_FIELD.get(oldListener); + int awaitTeleportId = AWAITING_TELEPORT_FIELD.getInt(oldListener); + ServerboundAcceptTeleportationPacket acceptPacket = (ServerboundAcceptTeleportationPacket) packet; + DenizenNetworkManagerImpl.doPacketOutput("Packet ServerboundAcceptTeleportationPacket sent from " + player.getScoreboardName() + + " with ID=" + acceptPacket.getId() + ", awaitingTeleport=" + awaitTeleportId + ", awaitPos=" + awaitPos); + } + else { + DenizenNetworkManagerImpl.doPacketOutput("Packet: " + packet.getClass().getCanonicalName() + " sent from " + player.getScoreboardName()); + } + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + public boolean handlePacketIn(Packet packet) { + denizenNetworkManager.packetsReceived++; + if (NMSHandler.debugPackets) { + debugPacketOutput(packet); + } + if (PlayerSendPacketScriptEvent.instance.eventData.isEnabled) { + if (PlayerSendPacketScriptEvent.fireFor(player.getBukkitEntity(), packet)) { + if (NMSHandler.debugPackets) { + DenizenNetworkManagerImpl.doPacketOutput("Denied packet-in " + packet.getClass().getCanonicalName() + " from " + player.getScoreboardName() + " due to event"); + } + return true; + } + } + return false; + } + + @Override + public void handleChatAck(ServerboundChatAckPacket serverboundchatackpacket) { + oldListener.handleChatAck(serverboundchatackpacket); + } + + @Override + public void handlePlayerInput(ServerboundPlayerInputPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handlePlayerInput(packet); + } + + @Override + public void handleMoveVehicle(ServerboundMoveVehiclePacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleMoveVehicle(packet); + } + + @Override + public void handleAcceptTeleportPacket(ServerboundAcceptTeleportationPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleAcceptTeleportPacket(packet); + } + + @Override + public void handleRecipeBookSeenRecipePacket(ServerboundRecipeBookSeenRecipePacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleRecipeBookSeenRecipePacket(packet); + } + + @Override + public void handleRecipeBookChangeSettingsPacket(ServerboundRecipeBookChangeSettingsPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleRecipeBookChangeSettingsPacket(packet); + } + + @Override + public void handleSeenAdvancements(ServerboundSeenAdvancementsPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleSeenAdvancements(packet); + } + + @Override + public void handleCustomCommandSuggestions(ServerboundCommandSuggestionPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleCustomCommandSuggestions(packet); + } + + @Override + public void handleSetCommandBlock(ServerboundSetCommandBlockPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleSetCommandBlock(packet); + } + + @Override + public void handleSetCommandMinecart(ServerboundSetCommandMinecartPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleSetCommandMinecart(packet); + } + + @Override + public void handlePickItem(ServerboundPickItemPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handlePickItem(packet); + } + + @Override + public void handleRenameItem(ServerboundRenameItemPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleRenameItem(packet); + } + + @Override + public void handleSetBeaconPacket(ServerboundSetBeaconPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleSetBeaconPacket(packet); + } + + @Override + public void handleSetStructureBlock(ServerboundSetStructureBlockPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleSetStructureBlock(packet); + } + + @Override + public void handleSetJigsawBlock(ServerboundSetJigsawBlockPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleSetJigsawBlock(packet); + } + + @Override + public void handleJigsawGenerate(ServerboundJigsawGeneratePacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleJigsawGenerate(packet); + } + + @Override + public void handleSelectTrade(ServerboundSelectTradePacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleSelectTrade(packet); + } + + @Override + public void handleEditBook(ServerboundEditBookPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleEditBook(packet); + } + + @Override + public void handleMovePlayer(ServerboundMovePlayerPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleMovePlayer(packet); + } + + @Override + public void handlePlayerAction(ServerboundPlayerActionPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handlePlayerAction(packet); + } + + @Override + public void handleUseItemOn(ServerboundUseItemOnPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleUseItemOn(packet); + } + + @Override + public void handleUseItem(ServerboundUseItemPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleUseItem(packet); + } + + @Override + public void handleTeleportToEntityPacket(ServerboundTeleportToEntityPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleTeleportToEntityPacket(packet); + } + + @Override + public void handleResourcePackResponse(ServerboundResourcePackPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleResourcePackResponse(packet); + } + + @Override + public void suspendFlushing() { + oldListener.suspendFlushing(); + } + + @Override + public void resumeFlushing() { + oldListener.resumeFlushing(); + } + + @Override + public void handlePaddleBoat(ServerboundPaddleBoatPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handlePaddleBoat(packet); + } + + @Override + public void handlePong(ServerboundPongPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handlePong(packet); + } + + @Override + public void handleSetCarriedItem(ServerboundSetCarriedItemPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleSetCarriedItem(packet); + } + + @Override + public void handleChat(ServerboundChatPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleChat(packet); + } + + @Override + public void handleChatCommand(ServerboundChatCommandPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleChatCommand(packet); + } + + @Override + public void chat(String s, PlayerChatMessage original, boolean async) { + oldListener.chat(s, original, async); + } + + @Override + public ConnectionProtocol protocol() { + return oldListener == null ? ConnectionProtocol.PLAY : oldListener.protocol(); + } + + @Override + public void handleAnimate(ServerboundSwingPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleAnimate(packet); + } + + @Override + public void handlePlayerCommand(ServerboundPlayerCommandPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handlePlayerCommand(packet); + } + + @Override + public void addPendingMessage(PlayerChatMessage playerchatmessage) { + oldListener.addPendingMessage(playerchatmessage); + } + + @Override + public void sendPlayerChatMessage(PlayerChatMessage playerchatmessage, ChatType.Bound chatmessagetype_a) { + oldListener.sendPlayerChatMessage(playerchatmessage, chatmessagetype_a); + } + + @Override + public void sendDisguisedChatMessage(Component ichatbasecomponent, ChatType.Bound chatmessagetype_a) { + oldListener.sendDisguisedChatMessage(ichatbasecomponent, chatmessagetype_a); + } + + @Override + public SocketAddress getRemoteAddress() { + return oldListener.getRemoteAddress(); + } + + @Override + public SocketAddress getRawAddress() { + return oldListener.getRawAddress(); + } + + @Override + public void switchToConfig() { + oldListener.switchToConfig(); + } + + @Override + public void handleInteract(ServerboundInteractPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleInteract(packet); + } + + @Override + public void handleClientCommand(ServerboundClientCommandPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleClientCommand(packet); + } + + @Override + public void handleContainerClose(ServerboundContainerClosePacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleContainerClose(packet); + } + + @Override + public void handleContainerClick(ServerboundContainerClickPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleContainerClick(packet); + } + + @Override + public void handlePlaceRecipe(ServerboundPlaceRecipePacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handlePlaceRecipe(packet); + } + + @Override + public void handleContainerButtonClick(ServerboundContainerButtonClickPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleContainerButtonClick(packet); + } + + @Override + public void handleSetCreativeModeSlot(ServerboundSetCreativeModeSlotPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleSetCreativeModeSlot(packet); + } + + @Override + public void handleSignUpdate(ServerboundSignUpdatePacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleSignUpdate(packet); + } + + @Override + public void handleKeepAlive(ServerboundKeepAlivePacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleKeepAlive(packet); + } + + @Override + public void handlePlayerAbilities(ServerboundPlayerAbilitiesPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handlePlayerAbilities(packet); + } + + @Override + public void handleClientInformation(ServerboundClientInformationPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleClientInformation(packet); + } + + @Override + public void handleCustomPayload(ServerboundCustomPayloadPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleCustomPayload(packet); + } + + @Override + public void handleChangeDifficulty(ServerboundChangeDifficultyPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleChangeDifficulty(packet); + } + + @Override + public void handleLockDifficulty(ServerboundLockDifficultyPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleLockDifficulty(packet); + } + + @Override + public void handleChatSessionUpdate(ServerboundChatSessionUpdatePacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleChatSessionUpdate(packet); + } + + @Override + public void handleConfigurationAcknowledged(ServerboundConfigurationAcknowledgedPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleConfigurationAcknowledged(packet); + } + + @Override + public void handleChunkBatchReceived(ServerboundChunkBatchReceivedPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleChunkBatchReceived(packet); + } + + @Override + public ServerPlayer getPlayer() { + return oldListener.getPlayer(); + } + + @Override + public PacketFlow flow() { + return oldListener == null ? PacketFlow.SERVERBOUND : oldListener.flow(); + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenNetworkManagerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenNetworkManagerImpl.java new file mode 100644 index 0000000000..c1519597d8 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -0,0 +1,555 @@ +package com.denizenscript.denizen.nms.v1_20.impl.network.handlers; + +import com.denizenscript.denizen.events.player.PlayerReceivesPacketScriptEvent; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_20.impl.ProfileEditorImpl; +import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet.*; +import com.denizenscript.denizen.utilities.Settings; +import com.denizenscript.denizen.utilities.packets.NetworkInterceptCodeGen; +import com.denizenscript.denizencore.utilities.CoreUtilities; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelPipeline; +import net.minecraft.network.*; +import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.PacketFlow; +import net.minecraft.network.protocol.configuration.ServerConfigurationPacketListener; +import net.minecraft.network.protocol.game.*; +import net.minecraft.network.protocol.login.ClientLoginPacketListener; +import net.minecraft.network.protocol.status.ClientStatusPacketListener; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ChunkMap; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.ServerCommonPacketListenerImpl; +import net.minecraft.server.network.ServerGamePacketListenerImpl; +import net.minecraft.server.network.ServerPlayerConnection; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_20_R4.CraftRegistry; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; +import org.bukkit.entity.Player; + +import javax.annotation.Nullable; +import javax.crypto.Cipher; +import java.lang.invoke.MethodHandle; +import java.lang.reflect.Field; +import java.net.SocketAddress; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +public class DenizenNetworkManagerImpl extends Connection { + // TODO: 1.20.6: there are some new methods that should potentially be overriden + + // TODO: 1.20.6: this can be cleaned up by decoding with the codec and returning the new packet + public static , B extends FriendlyByteBuf> RegistryFriendlyByteBuf copyPacket(T original, StreamCodec packetCodec) { + try { + RegistryFriendlyByteBuf copier = new RegistryFriendlyByteBuf(Unpooled.buffer(), CraftRegistry.getMinecraftRegistry()); + packetCodec.encode((B) copier, original); + return copier; + } + catch (Throwable ex) { + Debug.echoError(ex); + return null; + } + } + + @FunctionalInterface + public interface PacketHandler> { + Packet handlePacket(DenizenNetworkManagerImpl networkManager, T packet) throws Exception; + } + + public static final Map>, List>> packetHandlers = new HashMap<>(); + + public static > void registerPacketHandler(Class packetClass, PacketHandler handler) { + packetHandlers.computeIfAbsent(packetClass, k -> new ArrayList<>()).add(handler); + } + + public static > void registerPacketHandler(Class packetClass, BiConsumer handler) { + registerPacketHandler(packetClass, (networkManager, packet) -> { + handler.accept(networkManager, packet); + return packet; + }); + } + + public final Connection oldManager; + public final DenizenPacketListenerImpl packetListener; + public final ServerPlayer player; + public int packetsSent, packetsReceived; + + public DenizenNetworkManagerImpl(ServerPlayer entityPlayer, Connection oldManager) { + super(getProtocolDirection(oldManager)); + this.oldManager = oldManager; + this.channel = oldManager.channel; + this.player = entityPlayer; + packetListener = (DenizenPacketListenerImpl) NetworkInterceptCodeGen.generateAppropriateInterceptor(this, entityPlayer, DenizenPacketListenerImpl.class, AbstractListenerPlayInImpl.class, ServerGamePacketListenerImpl.class); + if (!(oldManager.getPacketListener() instanceof ServerConfigurationPacketListener)) { + setListener(packetListener); + } + } + + public void setListener(PacketListener listener) { + try { + Connection_packetListener.set(oldManager, listener); + } + catch (IllegalAccessException e) { + Debug.echoError(e); + throw new RuntimeException("Failed to set packet listener due to reflection error", e); + } + } + + public static Connection getConnection(ServerPlayer player) { + try { + return (Connection) ServerGamePacketListener_ConnectionField.get(player.connection); + } + catch (Throwable ex) { + Debug.echoError(ex); + throw new RuntimeException("Failed to get connection from player due to reflection error", ex); + } + } + + public static Connection getConnection(Player player) { + return getConnection(((CraftPlayer) player).getHandle()); + } + + public static DenizenNetworkManagerImpl getNetworkManager(ServerPlayer player) { + return (DenizenNetworkManagerImpl) getConnection(player); + } + + public static DenizenNetworkManagerImpl getNetworkManager(Player player) { + return getNetworkManager(((CraftPlayer) player).getHandle()); + } + + public static void setNetworkManager(Player player) { + ServerPlayer entityPlayer = ((CraftPlayer) player).getHandle(); + ServerGamePacketListenerImpl playerConnection = entityPlayer.connection; + setNetworkManager(playerConnection, new DenizenNetworkManagerImpl(entityPlayer, getConnection(entityPlayer))); + } + + public static void enableNetworkManager() { + for (World w : Bukkit.getWorlds()) { + for (ChunkMap.TrackedEntity tracker : ((CraftWorld) w).getHandle().getChunkSource().chunkMap.entityMap.values()) { + ArrayList connections = new ArrayList<>(tracker.seenBy); + tracker.seenBy.clear(); + for (ServerPlayerConnection connection : connections) { + tracker.seenBy.add(connection.getPlayer().connection); + } + } + } + } + + @Override + public int hashCode() { + return oldManager.hashCode(); + } + + @Override + public boolean equals(Object c2) { + return oldManager.equals(c2); + } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) throws Exception { + oldManager.channelRegistered(ctx); + } + + @Override + public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { + oldManager.channelUnregistered(ctx); + } + + @Override + public void channelActive(ChannelHandlerContext channelhandlercontext) throws Exception { + oldManager.channelActive(channelhandlercontext); + } + + @Override + public void channelInactive(ChannelHandlerContext channelhandlercontext) { + oldManager.channelInactive(channelhandlercontext); + } + + @Override + public boolean isSharable() { + return oldManager.isSharable(); + } + + @Override + public void handlerAdded(ChannelHandlerContext ctx) throws Exception { + oldManager.handlerAdded(ctx); + } + + @Override + public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { + oldManager.handlerRemoved(ctx); + } + + @Override + public void exceptionCaught(ChannelHandlerContext channelhandlercontext, Throwable throwable) { + oldManager.exceptionCaught(channelhandlercontext, throwable); + } + + @Override + protected void channelRead0(ChannelHandlerContext channelhandlercontext, Packet packet) { + if (oldManager.channel.isOpen()) { + try { + packet.handle(this.packetListener); + } + catch (Exception e) { + // Do nothing + } + } + } + + @Override + public void setListenerForServerboundHandshake(PacketListener packetlistener) { + oldManager.setListenerForServerboundHandshake(packetlistener); + } + + @Override + public void initiateServerboundStatusConnection(String s, int i, ClientStatusPacketListener packetstatusoutlistener) { + oldManager.initiateServerboundStatusConnection(s, i, packetstatusoutlistener); + } + + @Override + public void initiateServerboundPlayConnection(String s, int i, ClientLoginPacketListener packetloginoutlistener) { + oldManager.initiateServerboundPlayConnection(s, i, packetloginoutlistener); + } + + @Override + public void send(Packet packet) { + send(packet, null); + } + + public static void doPacketOutput(String text) { + if (!NMSHandler.debugPackets) { + return; + } + if (NMSHandler.debugPacketFilter == null || NMSHandler.debugPacketFilter.trim().isEmpty() + || CoreUtilities.toLowerCase(text).contains(NMSHandler.debugPacketFilter)) { + Debug.log(text); + } + } + + public void debugOutputPacket(Packet packet) { + if (packet instanceof ClientboundSetEntityDataPacket) { + StringBuilder output = new StringBuilder(128); + output.append("Packet: ClientboundSetEntityDataPacket sent to ").append(player.getScoreboardName()).append(" for entity ID: ").append(((ClientboundSetEntityDataPacket) packet).id()).append(": "); + List> list = ((ClientboundSetEntityDataPacket) packet).packedItems(); + if (list == null) { + output.append("None"); + } + else { + for (SynchedEntityData.DataValue data : list) { + output.append('[').append(data.id()).append(": ").append(data.value()).append("], "); + } + } + doPacketOutput(output.toString()); + } + else if (packet instanceof ClientboundSetEntityMotionPacket) { + ClientboundSetEntityMotionPacket velPacket = (ClientboundSetEntityMotionPacket) packet; + doPacketOutput("Packet: ClientboundSetEntityMotionPacket sent to " + player.getScoreboardName() + " for entity ID: " + velPacket.getId() + ": " + velPacket.getXa() + "," + velPacket.getYa() + "," + velPacket.getZa()); + } + else if (packet instanceof ClientboundAddEntityPacket) { + ClientboundAddEntityPacket addEntityPacket = (ClientboundAddEntityPacket) packet; + doPacketOutput("Packet: ClientboundAddEntityPacket sent to " + player.getScoreboardName() + " for entity ID: " + addEntityPacket.getId() + ": " + "uuid: " + addEntityPacket.getUUID() + + ", type: " + addEntityPacket.getType() + ", at: " + addEntityPacket.getX() + "," + addEntityPacket.getY() + "," + addEntityPacket.getZ() + ", data: " + addEntityPacket.getData()); + } + else if (packet instanceof ClientboundMapItemDataPacket) { + ClientboundMapItemDataPacket mapPacket = (ClientboundMapItemDataPacket) packet; + doPacketOutput("Packet: ClientboundMapItemDataPacket sent to " + player.getScoreboardName() + " for map ID: " + mapPacket.mapId() + ", scale: " + mapPacket.scale() + ", locked: " + mapPacket.locked()); + } + else if (packet instanceof ClientboundRemoveEntitiesPacket) { + ClientboundRemoveEntitiesPacket removePacket = (ClientboundRemoveEntitiesPacket) packet; + doPacketOutput("Packet: ClientboundRemoveEntitiesPacket sent to " + player.getScoreboardName() + " for entities: " + removePacket.getEntityIds().stream().map(Object::toString).collect(Collectors.joining(", "))); + } + else if (packet instanceof ClientboundPlayerInfoUpdatePacket) { + ClientboundPlayerInfoUpdatePacket playerInfoPacket = (ClientboundPlayerInfoUpdatePacket) packet; + doPacketOutput("Packet: ClientboundPlayerInfoPacket sent to " + player.getScoreboardName() + " of types " + playerInfoPacket.actions() + " for player profiles: " + + playerInfoPacket.entries().stream().map(p -> "mode=" + p.gameMode() + "/latency=" + p.latency() + "/display=" + p.displayName() + "/name=" + p.profile().getName() + "/id=" + p.profile().getId() + "/" + + p.profile().getProperties().asMap().entrySet().stream().map(e -> e.getKey() + "=" + e.getValue().stream().map(v -> v.value() + ";" + v.signature()).collect(Collectors.joining(";;;"))).collect(Collectors.joining("/"))).collect(Collectors.joining(", "))); + } + else { + doPacketOutput("Packet: " + packet.getClass().getCanonicalName() + " sent to " + player.getScoreboardName()); + } + } + + @Override + public void send(Packet packet, PacketSendListener genericfuturelistener) { + send(packet, genericfuturelistener, true); + } + + @Override + public void send(Packet packet, @Nullable PacketSendListener genericfuturelistener, boolean flush) { + if (!Bukkit.isPrimaryThread()) { + if (Settings.cache_warnOnAsyncPackets + && !(packet instanceof ClientboundSystemChatPacket) && !(packet instanceof ClientboundPlayerChatPacket) // Vanilla supports an async chat system, though it's normally disabled, some plugins use this as justification for sending messages async + && !(packet instanceof ClientboundCommandSuggestionsPacket)) { // Async tab complete is wholly unsupported in Spigot (and will cause an exception), however Paper explicitly adds async support (for unclear reasons), so let it through too + Debug.echoError("Warning: packet sent off main thread! This is completely unsupported behavior! Denizen network interceptor ignoring packet to avoid crash. Packet class: " + + packet.getClass().getCanonicalName() + " sent to " + player.getScoreboardName() + " identify the sender of the packet from the stack trace:"); + try { + throw new RuntimeException("Trace"); + } + catch (Exception ex) { + Debug.echoError(ex); + } + } + oldManager.send(packet, genericfuturelistener, flush); + return; + } + if (NMSHandler.debugPackets) { + debugOutputPacket(packet); + } + packetsSent++; + if (packet instanceof ClientboundBundlePacket bundlePacket) { + List> processedPackets = new ArrayList<>(); + boolean anyChange = false; + for (Packet _subPacket : bundlePacket.subPackets()) { + // Bundle packets with non-game packets shouldn't ever be sent while the Denizen interceptor is active + Packet subPacket = (Packet) _subPacket; + Packet processed = processPacketHandlersFor(subPacket); + anyChange = anyChange || processed != subPacket; + if (processed != null) { + processedPackets.add(processed); + } + } + if (processedPackets.isEmpty()) { + return; + } + if (anyChange) { + packet = new ClientboundBundlePacket(processedPackets); + } + } + else { + Packet processed = processPacketHandlersFor((Packet) packet); + if (processed == null) { + return; + } + packet = processed; + } + oldManager.send(packet, genericfuturelistener, flush); + } + + @Override + public void runOnceConnected(Consumer consumer) { + oldManager.runOnceConnected(consumer); + } + + @Override + public void flushChannel() { + oldManager.flushChannel(); + } + + public Packet processPacketHandlersFor(Packet packet) { + if (packet == null) { + return null; + } + List> packetHandlers = DenizenNetworkManagerImpl.packetHandlers.get(packet.getClass()); + if (packetHandlers != null) { + for (PacketHandler _packetHandler : packetHandlers) { + PacketHandler> packetHandler = (PacketHandler>) _packetHandler; + Packet processed; + try { + processed = packetHandler.handlePacket(this, packet); + } + catch (Exception ex) { + Debug.echoError("Packet handler for " + packet.getClass().getCanonicalName() + " threw an exception:"); + Debug.echoError(ex); + continue; + } + if (processed == null) { + if (NMSHandler.debugPackets) { + doPacketOutput("DENIED PACKET - " + packet.getClass().getCanonicalName() + " DENIED FROM SEND TO " + player.getScoreboardName()); + } + return null; + } + packet = processed; + } + } + if (PlayerReceivesPacketScriptEvent.instance.eventData.isEnabled & PlayerReceivesPacketScriptEvent.fireFor(player.getBukkitEntity(), packet)) { + if (NMSHandler.debugPackets) { + doPacketOutput("DENIED PACKET - " + packet.getClass().getCanonicalName() + " DENIED FROM SEND TO " + player.getScoreboardName() + " due to event"); + } + return null; + } + return packet; + } + + static { + ActionBarEventPacketHandlers.registerHandlers(); + AttachPacketHandlers.registerHandlers(); + BlockLightPacketHandlers.registerHandlers(); + DenizenPacketHandlerPacketHandlers.registerHandlers(); + EntityMetadataPacketHandlers.registerHandlers(); + DisguisePacketHandlers.registerHandlers(); + FakeBlocksPacketHandlers.registerHandlers(); + FakeEquipmentPacketHandlers.registerHandlers(); + FakePlayerPacketHandlers.registerHandlers(); + HiddenEntitiesPacketHandlers.registerHandlers(); + HideParticlesPacketHandlers.registerHandlers(); + PlayerHearsSoundEventPacketHandlers.registerHandlers(); + ProfileEditorImpl.registerHandlers(); + TablistUpdateEventPacketHandlers.registerHandlers(); + } + + @Override + public void tick() { + oldManager.tick(); + } + + @Override + public SocketAddress getRemoteAddress() { + return oldManager.getRemoteAddress(); + } + + @Override + public String getLoggableAddress(boolean flag) { + return oldManager.getLoggableAddress(flag); + } + + @Override + public void disconnect(Component ichatbasecomponent) { + if (!player.getBukkitEntity().isOnline()) { // Workaround Paper duplicate quit event issue + return; + } + oldManager.disconnect(ichatbasecomponent); + } + + @Override + public boolean isMemoryConnection() { + return oldManager != null && oldManager.isMemoryConnection(); + } + + @Override + public PacketFlow getReceiving() { + return oldManager.getReceiving(); + } + + @Override + public PacketFlow getSending() { + return oldManager.getSending(); + } + + @Override + public void configurePacketHandler(ChannelPipeline channelpipeline) { + oldManager.configurePacketHandler(channelpipeline); + } + + @Override + public void setEncryptionKey(Cipher cipher, Cipher cipher1) { + oldManager.setEncryptionKey(cipher, cipher1); + } + + @Override + public boolean isEncrypted() { + return oldManager.isEncrypted(); + } + + @Override + public boolean isConnected() { + return oldManager.isConnected(); + } + + @Override + public boolean isConnecting() { + return oldManager.isConnecting(); + } + + @Override + public PacketListener getPacketListener() { + return oldManager.getPacketListener(); + } + + @Override + public Component getDisconnectedReason() { + return oldManager.getDisconnectedReason(); + } + + @Override + public void setReadOnly() { + oldManager.setReadOnly(); + } + + @Override + public void setupCompression(int i, boolean b) { + oldManager.setupCompression(i, b); + } + + @Override + public void handleDisconnection() { + oldManager.handleDisconnection(); + } + + @Override + public float getAverageReceivedPackets() { + return oldManager.getAverageReceivedPackets(); + } + + @Override + public float getAverageSentPackets() { + return oldManager.getAverageSentPackets(); + } + + ////////////////////////////////// + //// Reflection Methods/Fields + /////////// + + private static final Field protocolDirectionField = ReflectionHelper.getFields(Connection.class).get(ReflectionMappingsInfo.Connection_receiving, PacketFlow.class); + public static final Field Connection_packetListener = ReflectionHelper.getFields(Connection.class).get(ReflectionMappingsInfo.Connection_packetListener, PacketListener.class); + private static final Field ServerGamePacketListener_ConnectionField = ReflectionHelper.getFields(ServerCommonPacketListenerImpl.class).get(ReflectionMappingsInfo.ServerCommonPacketListenerImpl_connection); + private static final MethodHandle ServerGamePacketListener_ConnectionSetter = ReflectionHelper.getFinalSetter(ServerCommonPacketListenerImpl.class, ReflectionMappingsInfo.ServerCommonPacketListenerImpl_connection); + + private static PacketFlow getProtocolDirection(Connection networkManager) { + PacketFlow direction = null; + try { + direction = (PacketFlow) protocolDirectionField.get(networkManager); + } + catch (Exception e) { + Debug.echoError(e); + } + return direction; + } + + private static void setNetworkManager(ServerGamePacketListenerImpl playerConnection, Connection networkManager) { + try { + ServerGamePacketListener_ConnectionSetter.invoke(playerConnection, networkManager); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + @Override + public boolean acceptInboundMessage(Object msg) throws Exception { + return oldManager.acceptInboundMessage(msg); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + oldManager.channelRead(ctx, msg); + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + oldManager.channelReadComplete(ctx); + } + + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { + oldManager.userEventTriggered(ctx, evt); + } + + @Override + public void channelWritabilityChanged(ChannelHandlerContext ctx) throws Exception { + oldManager.channelWritabilityChanged(ctx); + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenPacketListenerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenPacketListenerImpl.java new file mode 100644 index 0000000000..1a22d4ab27 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenPacketListenerImpl.java @@ -0,0 +1,122 @@ +package com.denizenscript.denizen.nms.v1_20.impl.network.handlers; + +import com.denizenscript.denizen.events.player.PlayerChangesSignScriptEvent; +import com.denizenscript.denizen.events.player.PlayerSteersEntityScriptEvent; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.v1_20.impl.network.packets.PacketInResourcePackStatusImpl; +import com.denizenscript.denizen.nms.v1_20.impl.network.packets.PacketInSteerVehicleImpl; +import com.denizenscript.denizen.objects.LocationTag; +import com.denizenscript.denizen.objects.MaterialTag; +import com.denizenscript.denizen.scripts.commands.entity.FakeEquipCommand; +import com.denizenscript.denizen.utilities.packets.DenizenPacketHandler; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.minecraft.core.BlockPos; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.common.ServerboundCustomPayloadPacket; +import net.minecraft.network.protocol.common.ServerboundResourcePackPacket; +import net.minecraft.network.protocol.game.*; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.CommonListenerCookie; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_20_R4.block.CraftBlock; +import org.bukkit.event.block.SignChangeEvent; + +public class DenizenPacketListenerImpl extends AbstractListenerPlayInImpl { + + public String brand = "unknown"; + + public BlockPos fakeSignExpected; + + public DenizenPacketListenerImpl(DenizenNetworkManagerImpl networkManager, ServerPlayer entityPlayer) { + super(networkManager, entityPlayer, entityPlayer.connection, new CommonListenerCookie(entityPlayer.getGameProfile(), entityPlayer.connection.latency(), entityPlayer.clientInformation(), entityPlayer.connection.isTransferred())); + } + + @Override + public void handlePlayerInput(final ServerboundPlayerInputPacket packet) { + if (!PlayerSteersEntityScriptEvent.instance.eventData.isEnabled) { + super.handlePlayerInput(packet); + return; + } + DenizenPacketHandler.instance.receivePacket(player.getBukkitEntity(), new PacketInSteerVehicleImpl(packet), () -> super.handlePlayerInput(packet)); + } + + @Override + public void handleResourcePackResponse(ServerboundResourcePackPacket packet) { + DenizenPacketHandler.instance.receivePacket(player.getBukkitEntity(), new PacketInResourcePackStatusImpl(packet)); + super.handleResourcePackResponse(packet); + } + + @Override + public void handleUseItem(ServerboundUseItemPacket packet) { + DenizenPacketHandler.instance.receivePlacePacket(player.getBukkitEntity()); + super.handleUseItem(packet); + } + + @Override + public void handlePlayerAction(ServerboundPlayerActionPacket packet) { + DenizenPacketHandler.instance.receiveDigPacket(player.getBukkitEntity()); + super.handlePlayerAction(packet); + } + + @Override + public void handleAnimate(ServerboundSwingPacket packet) { + FakeEquipCommand.EquipmentOverride override = FakeEquipCommand.getOverrideFor(player.getUUID(), getCraftPlayer()); + if (override != null && (override.hand != null || override.offhand != null)) { + player.getBukkitEntity().updateInventory(); + } + super.handleAnimate(packet); + } + + @Override + public void handleSetCarriedItem(ServerboundSetCarriedItemPacket packet) { + FakeEquipCommand.EquipmentOverride override = FakeEquipCommand.getOverrideFor(player.getUUID(), getCraftPlayer()); + if (override != null && override.hand != null) { + Bukkit.getScheduler().runTaskLater(NMSHandler.getJavaPlugin(), player.getBukkitEntity()::updateInventory, 2); + } + super.handleSetCarriedItem(packet); + } + + @Override + public void handleContainerClick(ServerboundContainerClickPacket packet) { + FakeEquipCommand.EquipmentOverride override = FakeEquipCommand.getOverrideFor(player.getUUID(), getCraftPlayer()); + if (override != null && packet.getContainerId() == 0) { + Bukkit.getScheduler().runTaskLater(NMSHandler.getJavaPlugin(), player.getBukkitEntity()::updateInventory, 1); + } + super.handleContainerClick(packet); + } + + @Override + public void handleCustomPayload(ServerboundCustomPayloadPacket packet) { + if (NMSHandler.debugPackets) { + Debug.log("Custom packet payload: " + packet.payload().type().id().toString() + " sent from " + player.getScoreboardName()); + } + super.handleCustomPayload(packet); + } + + @Override + public void handleSignUpdate(ServerboundSignUpdatePacket packet) { + if (fakeSignExpected != null && packet.getPos().equals(fakeSignExpected)) { + PlayerChangesSignScriptEvent evt = (PlayerChangesSignScriptEvent) PlayerChangesSignScriptEvent.instance.clone(); + evt.material = new MaterialTag(org.bukkit.Material.OAK_WALL_SIGN); + evt.location = new LocationTag(player.getBukkitEntity().getLocation()); + evt.event = new SignChangeEvent(CraftBlock.at(player.level(), fakeSignExpected), player.getBukkitEntity(), packet.getLines()); + fakeSignExpected = null; + evt.fire(evt.event); + } + super.handleSignUpdate(packet); + } + + @Override + public void handleMovePlayer(ServerboundMovePlayerPacket packet) { + if (DenizenPacketHandler.forceNoclip.contains(player.getUUID())) { + player.noPhysics = true; + } + super.handleMovePlayer(packet); + } + + // For compatibility with other plugins using Reflection weirdly... + @Override + public void send(Packet packet) { + super.send(packet); + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/FakeBlockHelper.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/FakeBlockHelper.java new file mode 100644 index 0000000000..f52d7971f5 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/FakeBlockHelper.java @@ -0,0 +1,167 @@ +package com.denizenscript.denizen.nms.v1_20.impl.network.handlers; + +import com.denizenscript.denizen.Denizen; +import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; +import com.denizenscript.denizen.objects.LocationTag; +import com.denizenscript.denizen.utilities.blocks.FakeBlock; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import io.netty.buffer.Unpooled; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.protocol.game.ClientboundLevelChunkPacketData; +import net.minecraft.network.protocol.game.ClientboundLevelChunkWithLightPacket; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biomes; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.PalettedContainer; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_20_R4.CraftRegistry; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.block.CraftBlockStates; +import org.bukkit.craftbukkit.v1_20_R4.block.data.CraftBlockData; + +import java.lang.invoke.MethodHandle; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class FakeBlockHelper { + + public static Field CHUNKDATA_BLOCK_ENTITIES = ReflectionHelper.getFields(ClientboundLevelChunkPacketData.class).getFirstOfType(List.class); + public static MethodHandle CHUNKDATA_BLOCK_ENTITY_CONSTRUCTOR = ReflectionHelper.getConstructor(ClientboundLevelChunkPacketData.class.getDeclaredClasses()[0], int.class, int.class, BlockEntityType.class, CompoundTag.class); + public static MethodHandle CHUNKDATA_BUFFER_SETTER = ReflectionHelper.getFinalSetterForFirstOfType(ClientboundLevelChunkPacketData.class, byte[].class); + public static Class CHUNKDATA_BLOCKENTITYINFO_CLASS = ClientboundLevelChunkPacketData.class.getDeclaredClasses()[0]; + public static Field CHUNKDATA_BLOCKENTITYINFO_PACKEDXZ = ReflectionHelper.getFields(CHUNKDATA_BLOCKENTITYINFO_CLASS).get(ReflectionMappingsInfo.ClientboundLevelChunkPacketDataBlockEntityInfo_packedXZ); + public static Field CHUNKDATA_BLOCKENTITYINFO_Y = ReflectionHelper.getFields(CHUNKDATA_BLOCKENTITYINFO_CLASS).get(ReflectionMappingsInfo.ClientboundLevelChunkPacketDataBlockEntityInfo_y); + public static MethodHandle CHUNKPACKET_CHUNKDATA_SETTER = ReflectionHelper.getFinalSetterForFirstOfType(ClientboundLevelChunkWithLightPacket.class, ClientboundLevelChunkPacketData.class); + public static Constructor PALETTEDCONTAINER_CTOR = Arrays.stream(PalettedContainer.class.getConstructors()).filter(c -> c.getParameterCount() == 3).findFirst().get(); + + public static BlockState getNMSState(FakeBlock block) { + return ((CraftBlockData) block.material.getModernData()).getState(); + } + + public static boolean anyBlocksInSection(List blocks, int y) { + int minY = y << 4; + int maxY = (y << 4) + 16; + for (FakeBlock block : blocks) { + int blockY = block.location.getBlockY(); + if (blockY >= minY && blockY < maxY) { + return true; + } + } + return false; + } + + public static Field PAPER_CHUNK_READY; + public static boolean tryPaperPatch = true; + + public static void copyPacketPaperPatch(ClientboundLevelChunkWithLightPacket newPacket, ClientboundLevelChunkWithLightPacket oldPacket) { + if (!Denizen.supportsPaper || !tryPaperPatch) { + return; + } + try { + if (PAPER_CHUNK_READY == null) { + PAPER_CHUNK_READY = ReflectionHelper.getFields(ClientboundLevelChunkWithLightPacket.class).get("ready"); + } + } + catch (Throwable ex) { + tryPaperPatch = false; + Debug.echoError("Paper packet patch failed:"); + Debug.echoError(ex); + return; + } + try { + PAPER_CHUNK_READY.setBoolean(newPacket, true); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + public static ClientboundLevelChunkWithLightPacket handleMapChunkPacket(World world, ClientboundLevelChunkWithLightPacket originalPacket, int chunkX, int chunkZ, List blocks) { + try { + ClientboundLevelChunkWithLightPacket duplicateCorePacket = ClientboundLevelChunkWithLightPacket.STREAM_CODEC.decode(DenizenNetworkManagerImpl.copyPacket(originalPacket, ClientboundLevelChunkWithLightPacket.STREAM_CODEC)); + copyPacketPaperPatch(duplicateCorePacket, originalPacket); + RegistryFriendlyByteBuf copier = new RegistryFriendlyByteBuf(Unpooled.buffer(), CraftRegistry.getMinecraftRegistry()); + originalPacket.getChunkData().write(copier); + ClientboundLevelChunkPacketData packet = new ClientboundLevelChunkPacketData(copier, chunkX, chunkZ); + FriendlyByteBuf serial = originalPacket.getChunkData().getReadBuffer(); + FriendlyByteBuf outputSerial = new FriendlyByteBuf(Unpooled.buffer(serial.readableBytes())); + List blockEntities = new ArrayList((List) CHUNKDATA_BLOCK_ENTITIES.get(originalPacket.getChunkData())); + CHUNKDATA_BLOCK_ENTITIES.set(packet, blockEntities); + for (int i = 0; i < blockEntities.size(); i++) { + Object blockEnt = blockEntities.get(i); + int xz = CHUNKDATA_BLOCKENTITYINFO_PACKEDXZ.getInt(blockEnt); + int y = CHUNKDATA_BLOCKENTITYINFO_Y.getInt(blockEnt); + int x = (chunkX << 4) + ((xz >> 4) & 15); + int z = (chunkZ << 4) + (xz & 15); + for (FakeBlock block : blocks) { + LocationTag loc = block.location; + if (loc.getBlockX() == x && loc.getBlockY() == y && loc.getBlockZ() == z && block.material != null) { + BlockEntity newBlockEnt = CraftBlockStates.createNewTileEntity(block.material.getMaterial()); + Object newData = CHUNKDATA_BLOCK_ENTITY_CONSTRUCTOR.invoke(xz, y, newBlockEnt.getType(), newBlockEnt.getUpdateTag(CraftRegistry.getMinecraftRegistry())); + blockEntities.set(i, newData); + break; + } + } + } + int worldMinY = world.getMinHeight(); + int worldMaxY = world.getMaxHeight(); + int minChunkY = worldMinY >> 4; + int maxChunkY = worldMaxY >> 4; + Registry biomeRegistry = ((CraftWorld) world).getHandle().registryAccess().registryOrThrow(Registries.BIOME); + for (int y = minChunkY; y < maxChunkY; y++) { + int blockCount = serial.readShort(); + // reflected constructors as workaround for spigot remapper bug - Mojang "IdMap" became Spigot "IRegistry" but should be "Registry" + PalettedContainer states = (PalettedContainer) PALETTEDCONTAINER_CTOR.newInstance(Block.BLOCK_STATE_REGISTRY, Blocks.AIR.defaultBlockState(), PalettedContainer.Strategy.SECTION_STATES); + states.read(serial); + PalettedContainer biomes = (PalettedContainer) PALETTEDCONTAINER_CTOR.newInstance(biomeRegistry, biomeRegistry.getOrThrow(Biomes.PLAINS), PalettedContainer.Strategy.SECTION_BIOMES); + biomes.read(serial); + if (anyBlocksInSection(blocks, y)) { + int minY = y << 4; + int maxY = (y << 4) + 16; + for (FakeBlock block : blocks) { + int blockY = block.location.getBlockY(); + if (blockY >= minY && blockY < maxY && block.material != null) { + int blockX = block.location.getBlockX(); + int blockZ = block.location.getBlockZ(); + blockX -= (blockX >> 4) * 16; + blockY -= (blockY >> 4) * 16; + blockZ -= (blockZ >> 4) * 16; + BlockState oldState = states.get(blockX, blockY, blockZ); + BlockState newState = getNMSState(block); + if (oldState.isAir() && !newState.isAir()) { + blockCount++; + } + else if (newState.isAir() && !oldState.isAir()) { + blockCount--; + } + states.set(blockX, blockY, blockZ, newState); + } + } + } + outputSerial.writeShort(blockCount); + states.write(outputSerial); + biomes.write(outputSerial); + } + byte[] outputBytes = outputSerial.array(); + CHUNKDATA_BUFFER_SETTER.invoke(packet, outputBytes); + CHUNKPACKET_CHUNKDATA_SETTER.invoke(duplicateCorePacket, packet); + return duplicateCorePacket; + } + catch (Throwable ex) { + Debug.echoError(ex); + } + return null; + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/ActionBarEventPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/ActionBarEventPacketHandlers.java new file mode 100644 index 0000000000..7bb358a154 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/ActionBarEventPacketHandlers.java @@ -0,0 +1,39 @@ +package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; + +import com.denizenscript.denizen.events.player.PlayerReceivesActionbarScriptEvent; +import com.denizenscript.denizen.nms.v1_20.Handler; +import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.objects.PlayerTag; +import com.denizenscript.denizen.utilities.FormattedTextHelper; +import com.denizenscript.denizencore.objects.core.ElementTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.game.ClientboundSetActionBarTextPacket; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftChatMessage; + +public class ActionBarEventPacketHandlers { + + public static void registerHandlers() { + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundSetActionBarTextPacket.class, ActionBarEventPacketHandlers::processActionbarPacket); + } + + public static ClientboundSetActionBarTextPacket processActionbarPacket(DenizenNetworkManagerImpl networkManager, ClientboundSetActionBarTextPacket actionbarPacket) { + PlayerReceivesActionbarScriptEvent event = PlayerReceivesActionbarScriptEvent.instance; + if (!event.loaded) { + return actionbarPacket; + } + event.reset(); + Component actionbarText = actionbarPacket.text(); + event.message = new ElementTag(FormattedTextHelper.stringify(Handler.componentToSpigot(actionbarText)), true); + event.rawJson = new ElementTag(CraftChatMessage.toJSON(actionbarText), true); + event.system = new ElementTag(false); + event.player = PlayerTag.mirrorBukkitPlayer(networkManager.player.getBukkitEntity()); + event = (PlayerReceivesActionbarScriptEvent) event.triggerNow(); + if (event.cancelled) { + return null; + } + if (event.modified) { + return new ClientboundSetActionBarTextPacket(Handler.componentToNMS(event.altMessageDetermination)); + } + return actionbarPacket; + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/AttachPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/AttachPacketHandlers.java new file mode 100644 index 0000000000..0a0aceef29 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/AttachPacketHandlers.java @@ -0,0 +1,312 @@ +package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; + +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.utilities.entity.EntityAttachmentHelper; +import com.denizenscript.denizencore.utilities.CoreConfiguration; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.*; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity; +import org.bukkit.util.Vector; + +import java.lang.reflect.Field; + +public class AttachPacketHandlers { + + public static void registerHandlers() { + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundMoveEntityPacket.class, AttachPacketHandlers::processAttachToForPacket); + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundRotateHeadPacket.class, AttachPacketHandlers::processAttachToForPacket); + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundSetEntityMotionPacket.class, AttachPacketHandlers::processAttachToForPacket); + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundTeleportEntityPacket.class, AttachPacketHandlers::processAttachToForPacket); + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundRemoveEntitiesPacket.class, AttachPacketHandlers::processAttachToForPacket); + } + + public static Field POS_X_PACKENT = ReflectionHelper.getFields(ClientboundMoveEntityPacket.class).get(ReflectionMappingsInfo.ClientboundMoveEntityPacket_xa, short.class); + public static Field POS_Y_PACKENT = ReflectionHelper.getFields(ClientboundMoveEntityPacket.class).get(ReflectionMappingsInfo.ClientboundMoveEntityPacket_ya, short.class); + public static Field POS_Z_PACKENT = ReflectionHelper.getFields(ClientboundMoveEntityPacket.class).get(ReflectionMappingsInfo.ClientboundMoveEntityPacket_za, short.class); + public static Field YAW_PACKENT = ReflectionHelper.getFields(ClientboundMoveEntityPacket.class).get(ReflectionMappingsInfo.ClientboundMoveEntityPacket_yRot, byte.class); + public static Field PITCH_PACKENT = ReflectionHelper.getFields(ClientboundMoveEntityPacket.class).get(ReflectionMappingsInfo.ClientboundMoveEntityPacket_xRot, byte.class); + public static Field ENTITY_ID_PACKTELENT = ReflectionHelper.getFields(ClientboundTeleportEntityPacket.class).get(ReflectionMappingsInfo.ClientboundTeleportEntityPacket_id, int.class); + public static Field POS_X_PACKTELENT = ReflectionHelper.getFields(ClientboundTeleportEntityPacket.class).get(ReflectionMappingsInfo.ClientboundTeleportEntityPacket_x, double.class); + public static Field POS_Y_PACKTELENT = ReflectionHelper.getFields(ClientboundTeleportEntityPacket.class).get(ReflectionMappingsInfo.ClientboundTeleportEntityPacket_y, double.class); + public static Field POS_Z_PACKTELENT = ReflectionHelper.getFields(ClientboundTeleportEntityPacket.class).get(ReflectionMappingsInfo.ClientboundTeleportEntityPacket_z, double.class); + public static Field YAW_PACKTELENT = ReflectionHelper.getFields(ClientboundTeleportEntityPacket.class).get(ReflectionMappingsInfo.ClientboundTeleportEntityPacket_yRot, byte.class); + public static Field PITCH_PACKTELENT = ReflectionHelper.getFields(ClientboundTeleportEntityPacket.class).get(ReflectionMappingsInfo.ClientboundTeleportEntityPacket_xRot, byte.class); + public static Field ENTITY_ID_PACKVELENT = ReflectionHelper.getFields(ClientboundSetEntityMotionPacket.class).get(ReflectionMappingsInfo.ClientboundSetEntityMotionPacket_id, int.class); + + public static Vector VECTOR_ZERO = new Vector(0, 0, 0); + + public static void tryProcessMovePacketForAttach(DenizenNetworkManagerImpl networkManager, ClientboundMoveEntityPacket packet, Entity e) throws IllegalAccessException { + EntityAttachmentHelper.EntityAttachedToMap attList = EntityAttachmentHelper.toEntityToData.get(e.getUUID()); + if (attList != null) { + for (EntityAttachmentHelper.PlayerAttachMap attMap : attList.attachedToMap.values()) { + EntityAttachmentHelper.AttachmentData att = attMap.getAttachment(networkManager.player.getUUID()); + if (attMap.attached.isValid() && att != null) { + ClientboundMoveEntityPacket pNew; + int newId = att.attached.getBukkitEntity().getEntityId(); + if (packet instanceof ClientboundMoveEntityPacket.Pos) { + pNew = new ClientboundMoveEntityPacket.Pos(newId, packet.getXa(), packet.getYa(), packet.getZa(), packet.isOnGround()); + } + else if (packet instanceof ClientboundMoveEntityPacket.Rot) { + pNew = new ClientboundMoveEntityPacket.Rot(newId, packet.getyRot(), packet.getxRot(), packet.isOnGround()); + } + else if (packet instanceof ClientboundMoveEntityPacket.PosRot) { + pNew = new ClientboundMoveEntityPacket.PosRot(newId, packet.getXa(), packet.getYa(), packet.getZa(), packet.getyRot(), packet.getxRot(), packet.isOnGround()); + } + else { + if (CoreConfiguration.debugVerbose) { + Debug.echoError("Impossible move-entity packet class: " + packet.getClass().getCanonicalName()); + } + return; + } + if (att.positionalOffset != null) { + boolean isRotate = packet instanceof ClientboundMoveEntityPacket.PosRot || packet instanceof ClientboundMoveEntityPacket.Rot; + byte yaw, pitch; + if (att.noRotate) { + Entity attachedEntity = ((CraftEntity) att.attached.getBukkitEntity()).getHandle(); + yaw = EntityAttachmentHelper.compressAngle(attachedEntity.getYRot()); + pitch = EntityAttachmentHelper.compressAngle(attachedEntity.getXRot()); + } + else if (isRotate) { + yaw = packet.getyRot(); + pitch = packet.getxRot(); + } + else { + yaw = EntityAttachmentHelper.compressAngle(e.getYRot()); + pitch = EntityAttachmentHelper.compressAngle(e.getXRot()); + } + if (att.noPitch) { + Entity attachedEntity = ((CraftEntity) att.attached.getBukkitEntity()).getHandle(); + pitch = EntityAttachmentHelper.compressAngle(attachedEntity.getXRot()); + } + byte newYaw = yaw; + if (isRotate) { + newYaw = EntityAttachmentHelper.adaptedCompressedAngle(newYaw, att.positionalOffset.getYaw()); + pitch = EntityAttachmentHelper.adaptedCompressedAngle(pitch, att.positionalOffset.getPitch()); + } + Vector goalPosition = att.fixedForOffset(new Vector(e.getX(), e.getY(), e.getZ()), e.getYRot(), e.getXRot()); + Vector oldPos = att.visiblePositions.get(networkManager.player.getUUID()); + boolean forceTele = false; + if (oldPos == null) { + oldPos = att.attached.getLocation().toVector(); + forceTele = true; + } + Vector moveNeeded = goalPosition.clone().subtract(oldPos); + att.visiblePositions.put(networkManager.player.getUUID(), goalPosition.clone()); + int offX = (int) (moveNeeded.getX() * (32 * 128)); + int offY = (int) (moveNeeded.getY() * (32 * 128)); + int offZ = (int) (moveNeeded.getZ() * (32 * 128)); + if ((isRotate && att.offsetRelative) || forceTele || offX < Short.MIN_VALUE || offX > Short.MAX_VALUE + || offY < Short.MIN_VALUE || offY > Short.MAX_VALUE + || offZ < Short.MIN_VALUE || offZ > Short.MAX_VALUE) { + ClientboundTeleportEntityPacket newTeleportPacket = new ClientboundTeleportEntityPacket(e); + ENTITY_ID_PACKTELENT.setInt(newTeleportPacket, att.attached.getBukkitEntity().getEntityId()); + POS_X_PACKTELENT.setDouble(newTeleportPacket, goalPosition.getX()); + POS_Y_PACKTELENT.setDouble(newTeleportPacket, goalPosition.getY()); + POS_Z_PACKTELENT.setDouble(newTeleportPacket, goalPosition.getZ()); + YAW_PACKTELENT.setByte(newTeleportPacket, newYaw); + PITCH_PACKTELENT.setByte(newTeleportPacket, pitch); + if (NMSHandler.debugPackets) { + DenizenNetworkManagerImpl.doPacketOutput("Attach Move-Tele Packet: " + newTeleportPacket.getClass().getCanonicalName() + " for " + att.attached.getUUID() + " sent to " + networkManager.player.getScoreboardName() + " with original yaw " + yaw + " adapted to " + newYaw); + } + networkManager.oldManager.send(newTeleportPacket); + } + else { + POS_X_PACKENT.setShort(pNew, (short) Mth.clamp(offX, Short.MIN_VALUE, Short.MAX_VALUE)); + POS_Y_PACKENT.setShort(pNew, (short) Mth.clamp(offY, Short.MIN_VALUE, Short.MAX_VALUE)); + POS_Z_PACKENT.setShort(pNew, (short) Mth.clamp(offZ, Short.MIN_VALUE, Short.MAX_VALUE)); + if (isRotate) { + YAW_PACKENT.setByte(pNew, yaw); + PITCH_PACKENT.setByte(pNew, pitch); + } + if (NMSHandler.debugPackets) { + DenizenNetworkManagerImpl.doPacketOutput("Attach Move Packet: " + pNew.getClass().getCanonicalName() + " for " + att.attached.getUUID() + " sent to " + networkManager.player.getScoreboardName() + " with original yaw " + yaw + " adapted to " + newYaw); + } + networkManager.oldManager.send(pNew); + } + } + else { + if (NMSHandler.debugPackets) { + DenizenNetworkManagerImpl.doPacketOutput("Attach Replica-Move Packet: " + pNew.getClass().getCanonicalName() + " for " + att.attached.getUUID() + " sent to " + networkManager.player.getScoreboardName()); + } + networkManager.oldManager.send(pNew); + } + } + } + } + if (e.passengers != null && !e.passengers.isEmpty()) { + for (Entity ent : e.passengers) { + tryProcessMovePacketForAttach(networkManager, packet, ent); + } + } + } + + public static void tryProcessRotateHeadPacketForAttach(DenizenNetworkManagerImpl networkManager, ClientboundRotateHeadPacket packet, Entity e) throws IllegalAccessException { + EntityAttachmentHelper.EntityAttachedToMap attList = EntityAttachmentHelper.toEntityToData.get(e.getUUID()); + if (attList != null) { + for (EntityAttachmentHelper.PlayerAttachMap attMap : attList.attachedToMap.values()) { + EntityAttachmentHelper.AttachmentData att = attMap.getAttachment(networkManager.player.getUUID()); + if (attMap.attached.isValid() && att != null) { + byte yaw = packet.getYHeadRot(); + Entity attachedEntity = ((CraftEntity) att.attached.getBukkitEntity()).getHandle(); + if (att.positionalOffset != null) { + if (att.noRotate) { + yaw = EntityAttachmentHelper.compressAngle(attachedEntity.getYRot()); + } + yaw = EntityAttachmentHelper.adaptedCompressedAngle(yaw, att.positionalOffset.getYaw()); + } + ClientboundRotateHeadPacket pNew = new ClientboundRotateHeadPacket(attachedEntity, yaw); + if (NMSHandler.debugPackets) { + DenizenNetworkManagerImpl.doPacketOutput("Head Rotation Packet: " + pNew.getClass().getCanonicalName() + " for " + att.attached.getUUID() + " sent to " + networkManager.player.getScoreboardName()); + } + networkManager.oldManager.send(pNew); + } + } + } + if (e.passengers != null && !e.passengers.isEmpty()) { + for (Entity ent : e.passengers) { + tryProcessRotateHeadPacketForAttach(networkManager, packet, ent); + } + } + } + + public static void tryProcessVelocityPacketForAttach(DenizenNetworkManagerImpl networkManager, ClientboundSetEntityMotionPacket packet, Entity e) throws IllegalAccessException { + EntityAttachmentHelper.EntityAttachedToMap attList = EntityAttachmentHelper.toEntityToData.get(e.getUUID()); + if (attList != null) { + for (EntityAttachmentHelper.PlayerAttachMap attMap : attList.attachedToMap.values()) { + EntityAttachmentHelper.AttachmentData att = attMap.getAttachment(networkManager.player.getUUID()); + if (attMap.attached.isValid() && att != null) { + ClientboundSetEntityMotionPacket pNew = ClientboundSetEntityMotionPacket.STREAM_CODEC.decode(DenizenNetworkManagerImpl.copyPacket(packet, ClientboundSetEntityMotionPacket.STREAM_CODEC)); + ENTITY_ID_PACKVELENT.setInt(pNew, att.attached.getBukkitEntity().getEntityId()); + if (NMSHandler.debugPackets) { + DenizenNetworkManagerImpl.doPacketOutput("Attach Velocity Packet: " + pNew.getClass().getCanonicalName() + " for " + att.attached.getUUID() + " sent to " + networkManager.player.getScoreboardName()); + } + networkManager.oldManager.send(pNew); + } + } + } + if (e.passengers != null && !e.passengers.isEmpty()) { + for (Entity ent : e.passengers) { + tryProcessVelocityPacketForAttach(networkManager, packet, ent); + } + } + } + + public static void tryProcessTeleportPacketForAttach(DenizenNetworkManagerImpl networkManager, ClientboundTeleportEntityPacket packet, Entity e, Vector relative) throws IllegalAccessException { + EntityAttachmentHelper.EntityAttachedToMap attList = EntityAttachmentHelper.toEntityToData.get(e.getUUID()); + if (attList != null) { + for (EntityAttachmentHelper.PlayerAttachMap attMap : attList.attachedToMap.values()) { + EntityAttachmentHelper.AttachmentData att = attMap.getAttachment(networkManager.player.getUUID()); + if (attMap.attached.isValid() && att != null) { + ClientboundTeleportEntityPacket pNew = ClientboundTeleportEntityPacket.STREAM_CODEC.decode(DenizenNetworkManagerImpl.copyPacket(packet, ClientboundTeleportEntityPacket.STREAM_CODEC)); + ENTITY_ID_PACKTELENT.setInt(pNew, att.attached.getBukkitEntity().getEntityId()); + Vector resultPos = new Vector(POS_X_PACKTELENT.getDouble(pNew), POS_Y_PACKTELENT.getDouble(pNew), POS_Z_PACKTELENT.getDouble(pNew)).add(relative); + if (att.positionalOffset != null) { + resultPos = att.fixedForOffset(resultPos, e.getYRot(), e.getXRot()); + byte yaw, pitch; + if (att.noRotate) { + Entity attachedEntity = ((CraftEntity) att.attached.getBukkitEntity()).getHandle(); + yaw = EntityAttachmentHelper.compressAngle(attachedEntity.getYRot()); + pitch = EntityAttachmentHelper.compressAngle(attachedEntity.getXRot()); + } + else { + yaw = packet.getyRot(); + pitch = packet.getxRot(); + } + if (att.noPitch) { + Entity attachedEntity = ((CraftEntity) att.attached.getBukkitEntity()).getHandle(); + pitch = EntityAttachmentHelper.compressAngle(attachedEntity.getXRot()); + } + byte newYaw = EntityAttachmentHelper.adaptedCompressedAngle(yaw, att.positionalOffset.getYaw()); + pitch = EntityAttachmentHelper.adaptedCompressedAngle(pitch, att.positionalOffset.getPitch()); + POS_X_PACKTELENT.setDouble(pNew, resultPos.getX()); + POS_Y_PACKTELENT.setDouble(pNew, resultPos.getY()); + POS_Z_PACKTELENT.setDouble(pNew, resultPos.getZ()); + YAW_PACKTELENT.setByte(pNew, newYaw); + PITCH_PACKTELENT.setByte(pNew, pitch); + if (NMSHandler.debugPackets) { + DenizenNetworkManagerImpl.doPacketOutput("Attach Teleport Packet: " + pNew.getClass().getCanonicalName() + " for " + att.attached.getUUID() + + " sent to " + networkManager.player.getScoreboardName() + " with raw yaw " + yaw + " adapted to " + newYaw); + } + } + att.visiblePositions.put(networkManager.player.getUUID(), resultPos.clone()); + networkManager.oldManager.send(pNew); + } + } + } + if (e.passengers != null && !e.passengers.isEmpty()) { + for (Entity ent : e.passengers) { + tryProcessTeleportPacketForAttach(networkManager, packet, ent, new Vector(ent.getX() - e.getX(), ent.getY() - e.getY(), ent.getZ() - e.getZ())); + } + } + } + + public static Packet processAttachToForPacket(DenizenNetworkManagerImpl networkManager, Packet packet) { + if (EntityAttachmentHelper.toEntityToData.isEmpty()) { + return packet; + } + try { + if (packet instanceof ClientboundMoveEntityPacket moveEntityPacket) { + Entity e = moveEntityPacket.getEntity(networkManager.player.level()); + if (e == null) { + return packet; + } + if (!e.isPassenger()) { + tryProcessMovePacketForAttach(networkManager, moveEntityPacket, e); + } + return EntityAttachmentHelper.denyOriginalPacketSend(networkManager.player.getUUID(), e.getUUID()) ? null : packet; + } + else if (packet instanceof ClientboundRotateHeadPacket rotateHeadPacket) { + Entity e = rotateHeadPacket.getEntity(networkManager.player.level()); + if (e == null) { + return packet; + } + tryProcessRotateHeadPacketForAttach(networkManager, rotateHeadPacket, e); + return EntityAttachmentHelper.denyOriginalPacketSend(networkManager.player.getUUID(), e.getUUID()) ? null : packet; + } + else if (packet instanceof ClientboundSetEntityMotionPacket setEntityMotionPacket) { + int ider = setEntityMotionPacket.getId(); + Entity e = networkManager.player.level().getEntity(ider); + if (e == null) { + return packet; + } + tryProcessVelocityPacketForAttach(networkManager, setEntityMotionPacket, e); + return EntityAttachmentHelper.denyOriginalPacketSend(networkManager.player.getUUID(), e.getUUID()) ? null : packet; + } + else if (packet instanceof ClientboundTeleportEntityPacket teleportEntityPacket) { + int ider = teleportEntityPacket.getId(); + Entity e = networkManager.player.level().getEntity(ider); + if (e == null) { + return packet; + } + tryProcessTeleportPacketForAttach(networkManager, teleportEntityPacket, e, VECTOR_ZERO); + return EntityAttachmentHelper.denyOriginalPacketSend(networkManager.player.getUUID(), e.getUUID()) ? null : packet; + } + else if (packet instanceof ClientboundRemoveEntitiesPacket removeEntitiesPacket) { + for (int id : removeEntitiesPacket.getEntityIds()) { + Entity e = networkManager.player.level().getEntity(id); + if (e != null) { + EntityAttachmentHelper.EntityAttachedToMap attList = EntityAttachmentHelper.toEntityToData.get(e.getUUID()); + if (attList != null) { + for (EntityAttachmentHelper.PlayerAttachMap attMap : attList.attachedToMap.values()) { + EntityAttachmentHelper.AttachmentData att = attMap.getAttachment(networkManager.player.getUUID()); + if (attMap.attached.isValid() && att != null) { + att.visiblePositions.remove(networkManager.player.getUUID()); + } + } + } + } + } + } + } + catch (Exception ex) { + Debug.echoError(ex); + } + return packet; + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/BlockLightPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/BlockLightPacketHandlers.java new file mode 100644 index 0000000000..9534c9a786 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/BlockLightPacketHandlers.java @@ -0,0 +1,27 @@ +package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; + +import com.denizenscript.denizen.nms.abstracts.BlockLight; +import com.denizenscript.denizen.nms.v1_20.impl.blocks.BlockLightImpl; +import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket; +import net.minecraft.network.protocol.game.ClientboundLightUpdatePacket; + +public class BlockLightPacketHandlers { + + public static void registerHandlers() { + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundLightUpdatePacket.class, BlockLightPacketHandlers::processLightUpdatePacket); + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundBlockUpdatePacket.class, BlockLightPacketHandlers::processBlockUpdatePacket); + } + + public static void processLightUpdatePacket(DenizenNetworkManagerImpl networkManager, ClientboundLightUpdatePacket lightUpdatePacket) { + if (!BlockLight.lightsByChunk.isEmpty()) { + BlockLightImpl.checkIfLightsBrokenByPacket(lightUpdatePacket, networkManager.player.level()); + } + } + + public static void processBlockUpdatePacket(DenizenNetworkManagerImpl networkManager, ClientboundBlockUpdatePacket blockUpdatePacket) { + if (!BlockLight.lightsByChunk.isEmpty()) { + BlockLightImpl.checkIfLightsBrokenByPacket(blockUpdatePacket, networkManager.player.level()); + } + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DenizenPacketHandlerPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DenizenPacketHandlerPacketHandlers.java new file mode 100644 index 0000000000..bf1b80eb75 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DenizenPacketHandlerPacketHandlers.java @@ -0,0 +1,47 @@ +package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; + +import com.denizenscript.denizen.events.player.PlayerReceivesMessageScriptEvent; +import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v1_20.impl.network.packets.PacketOutChatImpl; +import com.denizenscript.denizen.utilities.packets.DenizenPacketHandler; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundPlayerChatPacket; +import net.minecraft.network.protocol.game.ClientboundSystemChatPacket; + +public class DenizenPacketHandlerPacketHandlers { + + public static void registerHandlers() { + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundSystemChatPacket.class, DenizenPacketHandlerPacketHandlers::processPacketHandlerForPacket); + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundPlayerChatPacket.class, DenizenPacketHandlerPacketHandlers::processPacketHandlerForPacket); + } + + public static Packet processPacketHandlerForPacket(DenizenNetworkManagerImpl networkManager, Packet packet) { + if (DenizenPacketHandler.instance.shouldInterceptChatPacket()) { + PacketOutChatImpl packetHelper = null; + boolean isActionbar = false; + if (packet instanceof ClientboundSystemChatPacket chatPacket) { + isActionbar = chatPacket.overlay(); + packetHelper = new PacketOutChatImpl(chatPacket); + if (packetHelper.rawJson == null) { // Makes no sense but this can be null in weird edge cases + return packet; + } + } + else if (packet instanceof ClientboundPlayerChatPacket playerChatPacket) { + packetHelper = new PacketOutChatImpl(playerChatPacket); + } + if (packetHelper != null) { + PlayerReceivesMessageScriptEvent result = DenizenPacketHandler.instance.sendPacket(networkManager.player.getBukkitEntity(), packetHelper); + if (result != null) { + if (result.cancelled) { + return null; + } + if (result.modified) { + return new ClientboundSystemChatPacket(result.altMessageDetermination, isActionbar); + } + } + } + } + return packet; + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DisguisePacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DisguisePacketHandlers.java new file mode 100644 index 0000000000..8679efd8b8 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DisguisePacketHandlers.java @@ -0,0 +1,146 @@ +package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; + +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_20.helpers.PacketHelperImpl; +import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.objects.PlayerTag; +import com.denizenscript.denizen.scripts.commands.player.DisguiseCommand; +import com.denizenscript.denizen.utilities.entity.EntityAttachmentHelper; +import com.denizenscript.denizen.utilities.entity.FakeEntity; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.*; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.function.BiFunction; +import java.util.function.ToIntFunction; + +public class DisguisePacketHandlers { + + public static void registerHandlers() { + registerPacketHandler(ClientboundSetEntityDataPacket.class, ClientboundSetEntityDataPacket::id, DisguisePacketHandlers::processEntityDataPacket); + registerPacketHandler(ClientboundUpdateAttributesPacket.class, ClientboundUpdateAttributesPacket::getEntityId, DisguisePacketHandlers::processAttributesPacket); + registerPacketHandler(ClientboundAddEntityPacket.class, ClientboundAddEntityPacket::getId, DisguisePacketHandlers::sendDisguiseForPacket); + registerPacketHandler(ClientboundTeleportEntityPacket.class, ClientboundTeleportEntityPacket::getId, DisguisePacketHandlers::processTeleportPacket); + registerPacketHandler(ClientboundMoveEntityPacket.Rot.class, ClientboundMoveEntityPacket::getEntity, DisguisePacketHandlers::processMoveEntityRotPacket); + registerPacketHandler(ClientboundMoveEntityPacket.PosRot.class, ClientboundMoveEntityPacket::getEntity, DisguisePacketHandlers::processMoveEntityPosRotPacket); + } + + public static final Field TELEPORT_PACKET_YAW = ReflectionHelper.getFields(ClientboundTeleportEntityPacket.class).get(ReflectionMappingsInfo.ClientboundTeleportEntityPacket_yRot, byte.class); + + private static boolean antiDuplicate = false; + + public static > void registerPacketHandler(Class packetType, ToIntFunction idGetter, DisguisePacketHandler handler) { + registerPacketHandler(packetType, (packet, level) -> level.getEntity(idGetter.applyAsInt(packet)), handler); + } + + public static > void registerPacketHandler(Class packetType, BiFunction entityGetter, DisguisePacketHandler handler) { + DenizenNetworkManagerImpl.registerPacketHandler(packetType, (networkManager, packet) -> { + if (DisguiseCommand.disguises.isEmpty() || antiDuplicate) { + return packet; + } + Entity entity = entityGetter.apply(packet, networkManager.player.level()); + if (entity == null) { + return packet; + } + Map playerMap = DisguiseCommand.disguises.get(entity.getUUID()); + if (playerMap == null) { + return packet; + } + DisguiseCommand.TrackedDisguise disguise = playerMap.get(networkManager.player.getUUID()); + if (disguise == null) { + disguise = playerMap.get(null); + } + if (disguise == null || !disguise.isActive) { + return packet; + } + if (NMSHandler.debugPackets) { + DenizenNetworkManagerImpl.doPacketOutput("DISGUISED packet " + packet.getClass().getName() + " for entity " + entity.getId() + " to player " + networkManager.player.getScoreboardName()); + } + try { + return handler.handle(networkManager, packet, disguise); + } + catch (Exception e) { + antiDuplicate = false; + throw e; // "pass it" to the generic exception handling + } + }); + } + + @FunctionalInterface + public interface DisguisePacketHandler> { + + T handle(DenizenNetworkManagerImpl networkManager, T packet, DisguiseCommand.TrackedDisguise disguise) throws Exception; + } + + public static ClientboundSetEntityDataPacket processEntityDataPacket(DenizenNetworkManagerImpl networkManager, ClientboundSetEntityDataPacket entityDataPacket, DisguiseCommand.TrackedDisguise disguise) { + if (entityDataPacket.id() == networkManager.player.getId()) { + if (!disguise.shouldFake) { + return entityDataPacket; + } + for (SynchedEntityData.DataValue dataValue : entityDataPacket.packedItems()) { + if (dataValue.id() == 0) { // Entity flags + List> newData = new ArrayList<>(entityDataPacket.packedItems()); + newData.remove(dataValue); + byte flags = (byte) dataValue.value(); + flags |= 0x20; // Invisible flag + newData.add(PacketHelperImpl.createEntityData(PacketHelperImpl.ENTITY_DATA_ACCESSOR_FLAGS, flags)); + return new ClientboundSetEntityDataPacket(entityDataPacket.id(), newData); + } + } + } + else { + List> data = ((CraftEntity) disguise.toOthers.entity.entity).getHandle().getEntityData().getNonDefaultValues(); + return data != null ? new ClientboundSetEntityDataPacket(entityDataPacket.id(), data) : null; + } + return entityDataPacket; + } + + public static ClientboundUpdateAttributesPacket processAttributesPacket(DenizenNetworkManagerImpl networkManager, ClientboundUpdateAttributesPacket attributesPacket, DisguiseCommand.TrackedDisguise disguise) { + FakeEntity fake = attributesPacket.getEntityId() == networkManager.player.getId() ? disguise.fakeToSelf : disguise.toOthers; + return fake == null || fake.entity.entity instanceof LivingEntity ? attributesPacket : null; // Non-living entities don't have attributes + } + + public static ClientboundTeleportEntityPacket processTeleportPacket(DenizenNetworkManagerImpl networkManager, ClientboundTeleportEntityPacket teleportEntityPacket, DisguiseCommand.TrackedDisguise disguise) throws IllegalAccessException { + if (disguise.as.getBukkitEntityType() == EntityType.ENDER_DRAGON) { + ClientboundTeleportEntityPacket pNew = ClientboundTeleportEntityPacket.STREAM_CODEC.decode(DenizenNetworkManagerImpl.copyPacket(teleportEntityPacket, ClientboundTeleportEntityPacket.STREAM_CODEC)); + TELEPORT_PACKET_YAW.setByte(pNew, EntityAttachmentHelper.adaptedCompressedAngle(teleportEntityPacket.getyRot(), 180)); + return pNew; + } + return sendDisguiseForPacket(networkManager, teleportEntityPacket, disguise); + } + + + public static ClientboundMoveEntityPacket.Rot processMoveEntityRotPacket(DenizenNetworkManagerImpl networkManager, ClientboundMoveEntityPacket.Rot rotPacket, DisguiseCommand.TrackedDisguise disguise) { + if (disguise.as.getBukkitEntityType() == EntityType.ENDER_DRAGON) { + return new ClientboundMoveEntityPacket.Rot(disguise.entity.getBukkitEntity().getEntityId(), EntityAttachmentHelper.adaptedCompressedAngle(rotPacket.getyRot(), 180), rotPacket.getxRot(), rotPacket.isOnGround()); + } + return sendDisguiseForPacket(networkManager, rotPacket, disguise); + } + + + public static ClientboundMoveEntityPacket.PosRot processMoveEntityPosRotPacket(DenizenNetworkManagerImpl networkManager, ClientboundMoveEntityPacket.PosRot posRotPacket, DisguiseCommand.TrackedDisguise disguise) { + if (disguise.as.getBukkitEntityType() == EntityType.ENDER_DRAGON) { + return new ClientboundMoveEntityPacket.PosRot(disguise.entity.getBukkitEntity().getEntityId(), posRotPacket.getXa(), posRotPacket.getYa(), posRotPacket.getZa(), EntityAttachmentHelper.adaptedCompressedAngle(posRotPacket.getyRot(), 180), posRotPacket.getxRot(), posRotPacket.isOnGround()); + } + return sendDisguiseForPacket(networkManager, posRotPacket, disguise); + } + + public static > T sendDisguiseForPacket(DenizenNetworkManagerImpl networkManager, T packet, DisguiseCommand.TrackedDisguise disguise) { + antiDuplicate = true; + disguise.sendTo(List.of(new PlayerTag(networkManager.player.getUUID()))); + antiDuplicate = false; + return null; + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/EntityMetadataPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/EntityMetadataPacketHandlers.java new file mode 100644 index 0000000000..40cf0c42af --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/EntityMetadataPacketHandlers.java @@ -0,0 +1,92 @@ +package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; + +import com.denizenscript.denizen.nms.v1_20.Handler; +import com.denizenscript.denizen.nms.v1_20.helpers.PacketHelperImpl; +import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.scripts.commands.entity.GlowCommand; +import com.denizenscript.denizen.scripts.commands.entity.InvisibleCommand; +import com.denizenscript.denizen.scripts.commands.entity.RenameCommand; +import com.denizenscript.denizen.scripts.commands.entity.SneakCommand; +import com.denizenscript.denizen.utilities.FormattedTextHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.md_5.bungee.api.ChatColor; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.world.entity.Entity; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class EntityMetadataPacketHandlers { + + public static void registerHandlers() { + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundSetEntityDataPacket.class, EntityMetadataPacketHandlers::processMetadataChangesForPacket); + } + + public static ClientboundSetEntityDataPacket getModifiedMetadataFor(DenizenNetworkManagerImpl networkManager, ClientboundSetEntityDataPacket metadataPacket) { + if (!RenameCommand.hasAnyDynamicRenames() && SneakCommand.forceSetSneak.isEmpty() && InvisibleCommand.helper.noOverrides() && GlowCommand.helper.noOverrides()) { + return null; + } + try { + Entity entity = networkManager.player.level().getEntity(metadataPacket.id()); + if (entity == null) { + return null; // If it doesn't exist on-server, it's definitely not relevant, so move on + } + String nameToApply = RenameCommand.getCustomNameFor(entity.getUUID(), networkManager.player.getBukkitEntity(), false); + Boolean forceSneak = SneakCommand.shouldSneak(entity.getUUID(), networkManager.player.getUUID()); + Boolean isInvisible = InvisibleCommand.helper.getState(entity.getBukkitEntity(), networkManager.player.getUUID(), true); + Boolean isGlowing = GlowCommand.helper.getState(entity.getBukkitEntity(), networkManager.player.getUUID(), true); + boolean shouldModifyFlags = isInvisible != null || forceSneak != null || isGlowing != null; + if (nameToApply == null && !shouldModifyFlags) { + return null; + } + List> data = new ArrayList<>(metadataPacket.packedItems().size()); + Byte currentFlags = null; + for (SynchedEntityData.DataValue dataValue : metadataPacket.packedItems()) { + if (dataValue.id() == 0 && shouldModifyFlags) { // 0: Entity Flags + currentFlags = (Byte) dataValue.value(); + } + else if (nameToApply == null || (dataValue.id() != 2 && dataValue.id() != 3)) { // 2 and 3: Custom name and custom name visible + data.add(dataValue); + } + } + if (shouldModifyFlags) { + byte flags = currentFlags == null ? entity.getEntityData().get(PacketHelperImpl.ENTITY_DATA_ACCESSOR_FLAGS) : currentFlags; + flags = applyEntityDataFlag(flags, forceSneak, 0x02); + flags = applyEntityDataFlag(flags, isInvisible, 0x20); + flags = applyEntityDataFlag(flags, isGlowing, 0x40); + data.add(SynchedEntityData.DataValue.create(PacketHelperImpl.ENTITY_DATA_ACCESSOR_FLAGS, flags)); + } + if (nameToApply != null) { + data.add(SynchedEntityData.DataValue.create(PacketHelperImpl.ENTITY_DATA_ACCESSOR_CUSTOM_NAME, Optional.of(Handler.componentToNMS(FormattedTextHelper.parse(nameToApply, ChatColor.WHITE))))); + data.add(SynchedEntityData.DataValue.create(PacketHelperImpl.ENTITY_DATA_ACCESSOR_CUSTOM_NAME_VISIBLE, true)); + } + return new ClientboundSetEntityDataPacket(metadataPacket.id(), data); + } + catch (Throwable ex) { + Debug.echoError(ex); + return null; + } + } + + public static byte applyEntityDataFlag(byte currentFlags, Boolean value, int flag) { + if (value == null) { + return currentFlags; + } + return (byte) (value ? currentFlags | flag : currentFlags & ~flag); + } + + public static Packet processMetadataChangesForPacket(DenizenNetworkManagerImpl networkManager, Packet packet) { + if (!(packet instanceof ClientboundSetEntityDataPacket entityDataPacket)) { + return packet; + } + ClientboundSetEntityDataPacket altPacket = getModifiedMetadataFor(networkManager, entityDataPacket); + if (altPacket == null) { + return packet; + } + return altPacket; + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeBlocksPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeBlocksPacketHandlers.java new file mode 100644 index 0000000000..49b1c856f5 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeBlocksPacketHandlers.java @@ -0,0 +1,112 @@ +package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; + +import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.FakeBlockHelper; +import com.denizenscript.denizen.objects.LocationTag; +import com.denizenscript.denizen.utilities.blocks.ChunkCoordinate; +import com.denizenscript.denizen.utilities.blocks.FakeBlock; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.*; +import net.minecraft.world.level.block.state.BlockState; + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.List; + +public class FakeBlocksPacketHandlers { + + public static void registerHandlers() { + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundLevelChunkWithLightPacket.class, FakeBlocksPacketHandlers::processShowFakeForPacket); + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundSectionBlocksUpdatePacket.class, FakeBlocksPacketHandlers::processShowFakeForPacket); + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundBlockUpdatePacket.class, FakeBlocksPacketHandlers::processShowFakeForPacket); + } + + public static Field SECTIONPOS_MULTIBLOCKCHANGE = ReflectionHelper.getFields(ClientboundSectionBlocksUpdatePacket.class).get(ReflectionMappingsInfo.ClientboundSectionBlocksUpdatePacket_sectionPos, SectionPos.class); + public static Field OFFSETARRAY_MULTIBLOCKCHANGE = ReflectionHelper.getFields(ClientboundSectionBlocksUpdatePacket.class).get(ReflectionMappingsInfo.ClientboundSectionBlocksUpdatePacket_positions, short[].class); + public static Field BLOCKARRAY_MULTIBLOCKCHANGE = ReflectionHelper.getFields(ClientboundSectionBlocksUpdatePacket.class).get(ReflectionMappingsInfo.ClientboundSectionBlocksUpdatePacket_states, BlockState[].class); + + public static Packet processShowFakeForPacket(DenizenNetworkManagerImpl networkManager, Packet packet) { + if (FakeBlock.blocks.isEmpty()) { + return packet; + } + try { + if (packet instanceof ClientboundLevelChunkWithLightPacket) { + FakeBlock.FakeBlockMap map = FakeBlock.blocks.get(networkManager.player.getUUID()); + if (map == null) { + return packet; + } + int chunkX = ((ClientboundLevelChunkWithLightPacket) packet).getX(); + int chunkZ = ((ClientboundLevelChunkWithLightPacket) packet).getZ(); + ChunkCoordinate chunkCoord = new ChunkCoordinate(chunkX, chunkZ, networkManager.player.level().getWorld().getName()); + List blocks = FakeBlock.getFakeBlocksFor(networkManager.player.getUUID(), chunkCoord); + if (blocks == null || blocks.isEmpty()) { + return packet; + } + ClientboundLevelChunkWithLightPacket newPacket = FakeBlockHelper.handleMapChunkPacket(networkManager.player.getBukkitEntity().getWorld(), (ClientboundLevelChunkWithLightPacket) packet, chunkX, chunkZ, blocks); + return newPacket; + } + else if (packet instanceof ClientboundSectionBlocksUpdatePacket) { + FakeBlock.FakeBlockMap map = FakeBlock.blocks.get(networkManager.player.getUUID()); + if (map == null) { + return packet; + } + SectionPos coord = (SectionPos) SECTIONPOS_MULTIBLOCKCHANGE.get(packet); + ChunkCoordinate coordinateDenizen = new ChunkCoordinate(coord.getX(), coord.getZ(), networkManager.player.level().getWorld().getName()); + if (!map.byChunk.containsKey(coordinateDenizen)) { + return packet; + } + ClientboundSectionBlocksUpdatePacket newPacket = ClientboundSectionBlocksUpdatePacket.STREAM_CODEC.decode(DenizenNetworkManagerImpl.copyPacket((ClientboundSectionBlocksUpdatePacket) packet, ClientboundSectionBlocksUpdatePacket.STREAM_CODEC)); + LocationTag location = new LocationTag(networkManager.player.level().getWorld(), 0, 0, 0); + short[] originalOffsetArray = (short[])OFFSETARRAY_MULTIBLOCKCHANGE.get(newPacket); + BlockState[] originalDataArray = (BlockState[])BLOCKARRAY_MULTIBLOCKCHANGE.get(newPacket); + short[] offsetArray = Arrays.copyOf(originalOffsetArray, originalOffsetArray.length); + BlockState[] dataArray = Arrays.copyOf(originalDataArray, originalDataArray.length); + OFFSETARRAY_MULTIBLOCKCHANGE.set(newPacket, offsetArray); + BLOCKARRAY_MULTIBLOCKCHANGE.set(newPacket, dataArray); + for (int i = 0; i < offsetArray.length; i++) { + short offset = offsetArray[i]; + BlockPos pos = coord.relativeToBlockPos(offset); + location.setX(pos.getX()); + location.setY(pos.getY()); + location.setZ(pos.getZ()); + FakeBlock block = map.byLocation.get(location); + if (block != null) { + dataArray[i] = FakeBlockHelper.getNMSState(block); + } + } + return newPacket; + } + else if (packet instanceof ClientboundBlockUpdatePacket) { + BlockPos pos = ((ClientboundBlockUpdatePacket) packet).getPos(); + LocationTag loc = new LocationTag(networkManager.player.level().getWorld(), pos.getX(), pos.getY(), pos.getZ()); + FakeBlock block = FakeBlock.getFakeBlockFor(networkManager.player.getUUID(), loc); + if (block != null) { + ClientboundBlockUpdatePacket newPacket = new ClientboundBlockUpdatePacket(((ClientboundBlockUpdatePacket) packet).getPos(), FakeBlockHelper.getNMSState(block)); + return newPacket; + } + } + else if (packet instanceof ClientboundBlockChangedAckPacket) { + // TODO: 1.19: Can no longer determine what block this packet is for. Would have to track separately? Possibly from the inbound packet rather than the outbound one. + /* + ClientboundBlockChangedAckPacket origPack = (ClientboundBlockChangedAckPacket) packet; + BlockPos pos = origPack.pos(); + LocationTag loc = new LocationTag(player.getLevel().getWorld(), pos.getX(), pos.getY(), pos.getZ()); + FakeBlock block = FakeBlock.getFakeBlockFor(player.getUUID(), loc); + if (block != null) { + ClientboundBlockChangedAckPacket newPacket = new ClientboundBlockChangedAckPacket(origPack.pos(), FakeBlockHelper.getNMSState(block), origPack.action(), false); + oldManager.send(newPacket, genericfuturelistener); + return true; + }*/ + } + } + catch (Throwable ex) { + Debug.echoError(ex); + } + return packet; + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java new file mode 100644 index 0000000000..f81547fc93 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java @@ -0,0 +1,138 @@ +package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; + +import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizen.scripts.commands.entity.FakeEquipCommand; +import com.mojang.datafixers.util.Pair; +import net.minecraft.core.NonNullList; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.*; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class FakeEquipmentPacketHandlers { + + public static void registerHandlers() { + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundSetEquipmentPacket.class, FakeEquipmentPacketHandlers::processSetEquipmentPacket); + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundEntityEventPacket.class, FakeEquipmentPacketHandlers::processEntityEventPacket); + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundContainerSetContentPacket.class, FakeEquipmentPacketHandlers::processContainerSetContentPacket); + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundContainerSetSlotPacket.class, FakeEquipmentPacketHandlers::processContainerSetSlotPacket); + } + + public static ClientboundSetEquipmentPacket processSetEquipmentPacket(DenizenNetworkManagerImpl networkManager, ClientboundSetEquipmentPacket setEquipmentPacket) { + if (FakeEquipCommand.overrides.isEmpty()) { + return setEquipmentPacket; + } + Entity entity = networkManager.player.level().getEntity(setEquipmentPacket.getEntity()); + if (entity == null) { + return setEquipmentPacket; + } + FakeEquipCommand.EquipmentOverride override = FakeEquipCommand.getOverrideFor(entity.getUUID(), networkManager.player.getBukkitEntity()); + if (override == null) { + return setEquipmentPacket; + } + List> equipment = new ArrayList<>(setEquipmentPacket.getSlots()); + for (int i = 0; i < equipment.size(); i++) { + Pair pair = equipment.get(i); + ItemStack use = switch (pair.getFirst()) { + case MAINHAND -> override.hand == null ? pair.getSecond() : CraftItemStack.asNMSCopy(override.hand.getItemStack()); + case OFFHAND -> override.offhand == null ? pair.getSecond() : CraftItemStack.asNMSCopy(override.offhand.getItemStack()); + case CHEST -> override.chest == null ? pair.getSecond() : CraftItemStack.asNMSCopy(override.chest.getItemStack()); + case HEAD -> override.head == null ? pair.getSecond() : CraftItemStack.asNMSCopy(override.head.getItemStack()); + case LEGS -> override.legs == null ? pair.getSecond() : CraftItemStack.asNMSCopy(override.legs.getItemStack()); + case FEET -> override.boots == null ? pair.getSecond() : CraftItemStack.asNMSCopy(override.boots.getItemStack()); + case BODY -> pair.getSecond(); // TODO: 1.20.6: is this actually used here? do we want to allow overriding it? + }; + equipment.set(i, new Pair<>(pair.getFirst(), use)); + } + return new ClientboundSetEquipmentPacket(setEquipmentPacket.getEntity(), equipment); + } + + public static Packet processEntityEventPacket(DenizenNetworkManagerImpl networkManager, ClientboundEntityEventPacket entityEventPacket) { + if (FakeEquipCommand.overrides.isEmpty()) { + return entityEventPacket; + } + if (entityEventPacket.getEventId() != 55) { + return entityEventPacket; + } + if (!(entityEventPacket.getEntity(networkManager.player.level()) instanceof LivingEntity livingEntity)) { + return entityEventPacket; + } + FakeEquipCommand.EquipmentOverride override = FakeEquipCommand.getOverrideFor(livingEntity.getUUID(), networkManager.player.getBukkitEntity()); + if (override == null || (override.hand == null && override.offhand == null)) { + return entityEventPacket; + } + ItemStack hand = override.hand != null ? CraftItemStack.asNMSCopy(override.hand.getItemStack()) : livingEntity.getMainHandItem(); + ItemStack offhand = override.offhand != null ? CraftItemStack.asNMSCopy(override.offhand.getItemStack()) : livingEntity.getOffhandItem(); + return new ClientboundSetEquipmentPacket(livingEntity.getId(), List.of(new Pair<>(EquipmentSlot.MAINHAND, hand), new Pair<>(EquipmentSlot.OFFHAND, offhand))); + } + + public static ClientboundContainerSetContentPacket processContainerSetContentPacket(DenizenNetworkManagerImpl networkManager, ClientboundContainerSetContentPacket setContentPacket) { + if (FakeEquipCommand.overrides.isEmpty()) { + return setContentPacket; + } + if (setContentPacket.getContainerId() != 0) { + return setContentPacket; + } + FakeEquipCommand.EquipmentOverride override = FakeEquipCommand.getOverrideFor(networkManager.player.getUUID(), networkManager.player.getBukkitEntity()); + if (override == null) { + return setContentPacket; + } + NonNullList items = (NonNullList) setContentPacket.getItems(); + if (override.head != null) { + items.set(5, CraftItemStack.asNMSCopy(override.head.getItemStack())); + } + if (override.chest != null) { + items.set(6, CraftItemStack.asNMSCopy(override.chest.getItemStack())); + } + if (override.legs != null) { + items.set(7, CraftItemStack.asNMSCopy(override.legs.getItemStack())); + } + if (override.boots != null) { + items.set(8, CraftItemStack.asNMSCopy(override.boots.getItemStack())); + } + if (override.offhand != null) { + items.set(45, CraftItemStack.asNMSCopy(override.offhand.getItemStack())); + } + if (override.hand != null) { + items.set(getMainHandSlot(networkManager.player), CraftItemStack.asNMSCopy(override.hand.getItemStack())); + } + return new ClientboundContainerSetContentPacket(setContentPacket.getContainerId(), setContentPacket.getStateId(), items, setContentPacket.getCarriedItem()); + } + + public static ClientboundContainerSetSlotPacket processContainerSetSlotPacket(DenizenNetworkManagerImpl networkManager, ClientboundContainerSetSlotPacket setSlotPacket) { + if (FakeEquipCommand.overrides.isEmpty()) { + return setSlotPacket; + } + if (setSlotPacket.getContainerId() != 0) { + return setSlotPacket; + } + FakeEquipCommand.EquipmentOverride override = FakeEquipCommand.getOverrideFor(networkManager.player.getUUID(), networkManager.player.getBukkitEntity()); + if (override == null) { + return setSlotPacket; + } + ItemTag item = switch (setSlotPacket.getSlot()) { + case 5 -> override.head; + case 6 -> override.chest; + case 7 -> override.legs; + case 8 -> override.boots; + case 45 -> override.offhand; + default -> setSlotPacket.getSlot() == getMainHandSlot(networkManager.player) ? override.hand : null; + }; + if (item == null) { + return setSlotPacket; + } + return new ClientboundContainerSetSlotPacket(setSlotPacket.getContainerId(), setSlotPacket.getStateId(), setSlotPacket.getSlot(), CraftItemStack.asNMSCopy(item.getItemStack())); + } + + public static int getMainHandSlot(ServerPlayer player) { + return player.getInventory().selected + 36; + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakePlayerPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakePlayerPacketHandlers.java new file mode 100644 index 0000000000..9414abf8e5 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakePlayerPacketHandlers.java @@ -0,0 +1,29 @@ +package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; + +/* +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.v1_20.impl.entities.EntityFakePlayerImpl; +import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import net.minecraft.network.protocol.game.ClientboundPlayerInfoRemovePacket; +import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket; +import org.bukkit.Bukkit; + +import java.util.List; +*/ + +public class FakePlayerPacketHandlers { + + public static void registerHandlers() { + // TODO: 1.20.2: Replace this. + //DenizenNetworkManagerImpl.registerPacketHandler(ClientboundAddPlayerPacket.class, FakePlayerPacketHandlers::processAddPlayerPacket); + } + + /* + public static void processAddPlayerPacket(DenizenNetworkManagerImpl networkManager, ClientboundAddPlayerPacket addPlayerPacket) { + if (networkManager.player.level().getEntity(addPlayerPacket.getEntityId()) instanceof EntityFakePlayerImpl fakePlayer) { + networkManager.send(new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER, fakePlayer)); + Bukkit.getScheduler().runTaskLater(NMSHandler.getJavaPlugin(), + () -> networkManager.send(new ClientboundPlayerInfoRemovePacket(List.of(fakePlayer.getUUID()))), 5); + } + }*/ +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java new file mode 100644 index 0000000000..2a36b36903 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java @@ -0,0 +1,67 @@ +package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; + +import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.utilities.entity.HideEntitiesHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.*; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; + +public class HiddenEntitiesPacketHandlers { + + public static void registerHandlers() { + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundAddEntityPacket.class, HiddenEntitiesPacketHandlers::processHiddenEntitiesForPacket); + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundAddExperienceOrbPacket.class, HiddenEntitiesPacketHandlers::processHiddenEntitiesForPacket); + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundMoveEntityPacket.Rot.class, HiddenEntitiesPacketHandlers::processHiddenEntitiesForPacket); + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundMoveEntityPacket.Pos.class, HiddenEntitiesPacketHandlers::processHiddenEntitiesForPacket); + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundMoveEntityPacket.PosRot.class, HiddenEntitiesPacketHandlers::processHiddenEntitiesForPacket); + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundSetEntityDataPacket.class, HiddenEntitiesPacketHandlers::processHiddenEntitiesForPacket); + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundSetEntityMotionPacket.class, HiddenEntitiesPacketHandlers::processHiddenEntitiesForPacket); + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundTeleportEntityPacket.class, HiddenEntitiesPacketHandlers::processHiddenEntitiesForPacket); + } + + public static boolean isHidden(ServerPlayer player, Entity entity) { + return entity != null && HideEntitiesHelper.playerShouldHide(player.getBukkitEntity().getUniqueId(), entity.getBukkitEntity()); + } + + public static Packet processHiddenEntitiesForPacket(DenizenNetworkManagerImpl networkManager, Packet packet) { + if (!HideEntitiesHelper.hasAnyHides()) { + return packet; + } + try { + int ider = -1; + Entity e = null; + if (packet instanceof ClientboundAddEntityPacket) { + ider = ((ClientboundAddEntityPacket) packet).getId(); + } + else if (packet instanceof ClientboundAddExperienceOrbPacket) { + ider = ((ClientboundAddExperienceOrbPacket) packet).getId(); + } + else if (packet instanceof ClientboundMoveEntityPacket) { + e = ((ClientboundMoveEntityPacket) packet).getEntity(networkManager.player.level()); + } + else if (packet instanceof ClientboundSetEntityDataPacket) { + ider = ((ClientboundSetEntityDataPacket) packet).id(); + } + else if (packet instanceof ClientboundSetEntityMotionPacket) { + ider = ((ClientboundSetEntityMotionPacket) packet).getId(); + } + else if (packet instanceof ClientboundTeleportEntityPacket) { + ider = ((ClientboundTeleportEntityPacket) packet).getId(); + } + if (e == null && ider != -1) { + e = networkManager.player.level().getEntity(ider); + } + if (e != null) { + if (isHidden(networkManager.player, e)) { + return null; + } + } + } + catch (Exception ex) { + Debug.echoError(ex); + } + return packet; + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/HideParticlesPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/HideParticlesPacketHandlers.java new file mode 100644 index 0000000000..2d6958a721 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/HideParticlesPacketHandlers.java @@ -0,0 +1,31 @@ +package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; + +import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.utilities.packets.HideParticles; +import net.minecraft.network.protocol.game.ClientboundLevelParticlesPacket; +import org.bukkit.Particle; +import org.bukkit.craftbukkit.v1_20_R4.CraftParticle; + +import java.util.Set; + +public class HideParticlesPacketHandlers { + + public static void registerHandlers() { + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundLevelParticlesPacket.class, HideParticlesPacketHandlers::processParticlesPacket); + } + + public static ClientboundLevelParticlesPacket processParticlesPacket(DenizenNetworkManagerImpl networkManager, ClientboundLevelParticlesPacket particlesPacket) { + if (HideParticles.hidden.isEmpty()) { + return particlesPacket; + } + Set hidden = HideParticles.hidden.get(networkManager.player.getUUID()); + if (hidden == null) { + return particlesPacket; + } + Particle bukkitParticle = CraftParticle.minecraftToBukkit(particlesPacket.getParticle().getType()); + if (hidden.contains(bukkitParticle)) { + return null; + } + return particlesPacket; + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/PlayerHearsSoundEventPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/PlayerHearsSoundEventPacketHandlers.java new file mode 100644 index 0000000000..ed19ea10fb --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/PlayerHearsSoundEventPacketHandlers.java @@ -0,0 +1,39 @@ +package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; + +import com.denizenscript.denizen.events.player.PlayerHearsSoundScriptEvent; +import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundSoundEntityPacket; +import net.minecraft.network.protocol.game.ClientboundSoundPacket; +import net.minecraft.world.entity.Entity; +import org.bukkit.Location; + +public class PlayerHearsSoundEventPacketHandlers { + + public static void registerHandlers() { + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundSoundPacket.class, PlayerHearsSoundEventPacketHandlers::processSoundPacket); + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundSoundEntityPacket.class, PlayerHearsSoundEventPacketHandlers::processSoundPacket); + } + + public static Packet processSoundPacket(DenizenNetworkManagerImpl networkManager, Packet packet) { + if (!PlayerHearsSoundScriptEvent.instance.eventData.isEnabled) { + return packet; + } + if (packet instanceof ClientboundSoundPacket) { + ClientboundSoundPacket spacket = (ClientboundSoundPacket) packet; + return PlayerHearsSoundScriptEvent.instance.run(networkManager.player.getBukkitEntity(), spacket.getSound().value().getLocation().getPath(), spacket.getSource().name(), + false, null, new Location(networkManager.player.getBukkitEntity().getWorld(), spacket.getX(), spacket.getY(), spacket.getZ()), spacket.getVolume(), spacket.getPitch()) ? null : packet; + } + else if (packet instanceof ClientboundSoundEntityPacket) { + ClientboundSoundEntityPacket spacket = (ClientboundSoundEntityPacket) packet; + Entity entity = networkManager.player.level().getEntity(spacket.getId()); + if (entity == null) { + return packet; + } + return PlayerHearsSoundScriptEvent.instance.run(networkManager.player.getBukkitEntity(), spacket.getSound().value().getLocation().getPath(), spacket.getSource().name(), + false, entity.getBukkitEntity(), null, spacket.getVolume(), spacket.getPitch()) ? null : packet; + } + return packet; + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java new file mode 100644 index 0000000000..41695a47a6 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java @@ -0,0 +1,129 @@ +package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; + +import com.denizenscript.denizen.events.player.PlayerReceivesTablistUpdateScriptEvent; +import com.denizenscript.denizen.nms.v1_20.Handler; +import com.denizenscript.denizen.nms.v1_20.impl.ProfileEditorImpl; +import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.utilities.FormattedTextHelper; +import com.denizenscript.denizencore.utilities.CoreUtilities; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import com.google.common.base.Joiner; +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.properties.Property; +import net.md_5.bungee.api.ChatColor; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundPlayerInfoRemovePacket; +import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket; +import net.minecraft.world.level.GameType; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.UUID; + +public class TablistUpdateEventPacketHandlers { + + public static void registerHandlers() { + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundPlayerInfoUpdatePacket.class, TablistUpdateEventPacketHandlers::processTablistPacket); + DenizenNetworkManagerImpl.registerPacketHandler(ClientboundPlayerInfoRemovePacket.class, TablistUpdateEventPacketHandlers::processTablistPacket); + } + + public static boolean tablistBreakOnlyOnce = false; + + // TODO: properly rebundle the packet instead of splitting it up + public static Packet processTablistPacket(DenizenNetworkManagerImpl networkManager, Packet packet) { + if (!PlayerReceivesTablistUpdateScriptEvent.instance.eventData.isEnabled) { + return packet; + } + if (packet instanceof ClientboundPlayerInfoUpdatePacket) { + ClientboundPlayerInfoUpdatePacket infoPacket = (ClientboundPlayerInfoUpdatePacket) packet; + String mode = ""; + for (ClientboundPlayerInfoUpdatePacket.Action action : infoPacket.actions()) { + switch (action) { + case ADD_PLAYER: + mode = "add"; + break; + case UPDATE_LATENCY: + mode = mode.isEmpty() ? "update_latency" : mode + "|update_latency"; + break; + case UPDATE_GAME_MODE: + mode = mode.isEmpty() ? "update_gamemode" : mode + "|update_gamemode"; + break; + case UPDATE_DISPLAY_NAME: + mode = mode.isEmpty() ? "update_display" : mode + "|update_display"; + break; + case UPDATE_LISTED: + mode = mode.isEmpty() ? "update_listed" : mode + "|update_listed"; + break; + case INITIALIZE_CHAT: + mode = mode.isEmpty() ? "initialize_chat" : mode + "|initialize_chat"; + default: + break; + } + } + if (mode.isEmpty()) { + if (!tablistBreakOnlyOnce) { + tablistBreakOnlyOnce = true; + Debug.echoError("Tablist packet processing failed: unknown action " + Joiner.on(", ").join(infoPacket.actions())); + } + return packet; + } + boolean isOverriding = false; + for (ClientboundPlayerInfoUpdatePacket.Entry update : infoPacket.entries()) { + GameProfile profile = update.profile(); + String texture = null, signature = null; + if (profile.getProperties().containsKey("textures")) { + Property property = profile.getProperties().get("textures").stream().findFirst().get(); + texture = property.value(); + signature = property.signature(); + } + String modeText = update.gameMode() == null ? null : update.gameMode().name(); + PlayerReceivesTablistUpdateScriptEvent.TabPacketData data = new PlayerReceivesTablistUpdateScriptEvent.TabPacketData(mode, profile.getId(), update.listed(), profile.getName(), + update.displayName() == null ? null : FormattedTextHelper.stringify(Handler.componentToSpigot(update.displayName())), modeText, texture, signature, update.latency()); + PlayerReceivesTablistUpdateScriptEvent.fire(networkManager.player.getBukkitEntity(), data); + if (data.modified) { + if (!isOverriding) { + isOverriding = true; + for (ClientboundPlayerInfoUpdatePacket.Entry priorUpdate : infoPacket.entries()) { + if (priorUpdate == update) { + break; + } + networkManager.oldManager.send(ProfileEditorImpl.createInfoPacket(infoPacket.actions(), Collections.singletonList(priorUpdate))); + } + } + if (!data.cancelled) { + GameProfile newProfile = new GameProfile(data.id, data.name); + if (data.texture != null) { + newProfile.getProperties().put("textures", new Property("textures", data.texture, data.signature)); + } + ClientboundPlayerInfoUpdatePacket.Entry entry = new ClientboundPlayerInfoUpdatePacket.Entry(newProfile.getId(), newProfile, data.isListed, data.latency, data.gamemode == null ? null : GameType.byName(CoreUtilities.toLowerCase(data.gamemode)), + data.display == null ? null : Handler.componentToNMS(FormattedTextHelper.parse(data.display, ChatColor.WHITE)), update.chatSession()); + networkManager.oldManager.send(ProfileEditorImpl.createInfoPacket(infoPacket.actions(), Collections.singletonList(entry))); + } + } + else if (isOverriding) { + networkManager.oldManager.send(ProfileEditorImpl.createInfoPacket(infoPacket.actions(), Collections.singletonList(update))); + } + } + return isOverriding ? null : packet; + } + else if (packet instanceof ClientboundPlayerInfoRemovePacket) { + ClientboundPlayerInfoRemovePacket removePacket = (ClientboundPlayerInfoRemovePacket) packet; + boolean modified = false; + List altIds = new ArrayList<>(((ClientboundPlayerInfoRemovePacket) packet).profileIds()); + for (UUID id : ((ClientboundPlayerInfoRemovePacket) packet).profileIds()) { + PlayerReceivesTablistUpdateScriptEvent.TabPacketData data = new PlayerReceivesTablistUpdateScriptEvent.TabPacketData("remove", id, false, null, null, null, null, null, 0); + PlayerReceivesTablistUpdateScriptEvent.fire(networkManager.player.getBukkitEntity(), data); + if (data.modified && data.cancelled) { + modified = true; + altIds.remove(id); + } + } + if (modified) { + return new ClientboundPlayerInfoRemovePacket(altIds); + } + } + return packet; + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketInResourcePackStatusImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketInResourcePackStatusImpl.java new file mode 100644 index 0000000000..1cfdc67205 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketInResourcePackStatusImpl.java @@ -0,0 +1,18 @@ +package com.denizenscript.denizen.nms.v1_20.impl.network.packets; + +import com.denizenscript.denizen.nms.interfaces.packets.PacketInResourcePackStatus; +import net.minecraft.network.protocol.common.ServerboundResourcePackPacket; + +public class PacketInResourcePackStatusImpl implements PacketInResourcePackStatus { + + private ServerboundResourcePackPacket internal; + + public PacketInResourcePackStatusImpl(ServerboundResourcePackPacket internal) { + this.internal = internal; + } + + @Override + public String getStatus() { + return internal.action().name(); + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketInSteerVehicleImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketInSteerVehicleImpl.java new file mode 100644 index 0000000000..c5d73c5375 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketInSteerVehicleImpl.java @@ -0,0 +1,33 @@ +package com.denizenscript.denizen.nms.v1_20.impl.network.packets; + +import com.denizenscript.denizen.nms.interfaces.packets.PacketInSteerVehicle; +import net.minecraft.network.protocol.game.ServerboundPlayerInputPacket; + +public class PacketInSteerVehicleImpl implements PacketInSteerVehicle { + + private ServerboundPlayerInputPacket internal; + + public PacketInSteerVehicleImpl(ServerboundPlayerInputPacket internal) { + this.internal = internal; + } + + @Override + public float getLeftwardInput() { + return internal.getXxa(); + } + + @Override + public float getForwardInput() { + return internal.getZza(); + } + + @Override + public boolean getJumpInput() { + return internal.isJumping(); + } + + @Override + public boolean getDismountInput() { + return internal.isShiftKeyDown(); + } +} diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketOutChatImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketOutChatImpl.java new file mode 100644 index 0000000000..c7e2119967 --- /dev/null +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketOutChatImpl.java @@ -0,0 +1,70 @@ +package com.denizenscript.denizen.nms.v1_20.impl.network.packets; + +import com.denizenscript.denizen.nms.interfaces.packets.PacketOutChat; +import com.denizenscript.denizen.utilities.FormattedTextHelper; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.md_5.bungee.chat.ComponentSerializer; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.game.ClientboundPlayerChatPacket; +import net.minecraft.network.protocol.game.ClientboundSystemChatPacket; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftChatMessage; + +import java.lang.reflect.Field; + +public class PacketOutChatImpl extends PacketOutChat { + + public ClientboundPlayerChatPacket playerPacket; + public ClientboundSystemChatPacket systemPacket; + public String message; + public String rawJson; + public boolean isOverlayActionbar; + + public static Field paperTextField; + + public PacketOutChatImpl(ClientboundSystemChatPacket internal) { + systemPacket = internal; + rawJson = CraftChatMessage.toJSON(internal.content()); + if (rawJson == null && convertComponentToJsonString != null) { + try { + if (paperTextField == null) { + paperTextField = ReflectionHelper.getFields(ClientboundSystemChatPacket.class).get("adventure$content"); + } + if (paperTextField != null) { + rawJson = convertComponentToJsonString.apply(paperTextField.get(internal)); + } + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + message = FormattedTextHelper.stringify(ComponentSerializer.parse(rawJson)); + isOverlayActionbar = internal.overlay(); + } + + public PacketOutChatImpl(ClientboundPlayerChatPacket internal) { + playerPacket = internal; + rawJson = ComponentSerializer.toString(internal.body().content()); + message = FormattedTextHelper.stringify(ComponentSerializer.parse(rawJson)); + } + + @Override + public boolean isSystem() { + return systemPacket != null; + } + + @Override + public boolean isActionbar() { + return isOverlayActionbar; + } + + @Override + public String getMessage() { + return message; + } + + @Override + public String getRawJson() { + return rawJson; + } +} From d67ef64701049447ceeb8d53fe4344ab75c91dce Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Thu, 13 Jun 2024 19:12:52 +0100 Subject: [PATCH 019/280] 1.21 part 2: bump versions --- dist/pom.xml | 6 ++++++ pom.xml | 1 + v1_21/pom.xml | 14 +++++++------- .../denizenscript/denizen/nms/v1_20/Handler.java | 2 +- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/dist/pom.xml b/dist/pom.xml index 5baf74c6b5..9a538d33d3 100644 --- a/dist/pom.xml +++ b/dist/pom.xml @@ -54,6 +54,12 @@ ${project.parent.version} compile + + com.denizenscript + denizen-v1_21 + ${project.parent.version} + compile + com.denizenscript denizen-paper diff --git a/pom.xml b/pom.xml index 1696fb9888..9e568106d6 100644 --- a/pom.xml +++ b/pom.xml @@ -18,6 +18,7 @@ plugin paper + v1_21 v1_20 v1_19 v1_18 diff --git a/v1_21/pom.xml b/v1_21/pom.xml index 61654c87cf..88a4daac96 100644 --- a/v1_21/pom.xml +++ b/v1_21/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.denizenscript - denizen-v1_20 + denizen-v1_21 1.3.0-SNAPSHOT @@ -19,13 +19,13 @@ org.spigotmc spigot-api - 1.20.6-R0.1-SNAPSHOT + 1.21-R0.1-SNAPSHOT provided org.spigotmc spigot - 1.20.6-R0.1-SNAPSHOT + 1.21-R0.1-SNAPSHOT remapped-mojang provided @@ -45,9 +45,9 @@ remap-obf - org.spigotmc:minecraft-server:1.20.6-R0.1-SNAPSHOT:txt:maps-mojang + org.spigotmc:minecraft-server:1.21-R0.1-SNAPSHOT:txt:maps-mojang true - org.spigotmc:spigot:1.20.6-R0.1-SNAPSHOT:jar:remapped-mojang + org.spigotmc:spigot:1.21-R0.1-SNAPSHOT:jar:remapped-mojang true remapped-obf @@ -60,8 +60,8 @@ remap-spigot ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar - org.spigotmc:minecraft-server:1.20.6-R0.1-SNAPSHOT:csrg:maps-spigot - org.spigotmc:spigot:1.20.6-R0.1-SNAPSHOT:jar:remapped-obf + org.spigotmc:minecraft-server:1.21-R0.1-SNAPSHOT:csrg:maps-spigot + org.spigotmc:spigot:1.21-R0.1-SNAPSHOT:jar:remapped-obf diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java index b6dc825435..a97e9c3b56 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java @@ -148,7 +148,7 @@ public void undisableAsyncCatcher() { @Override public boolean isCorrectMappingsCode() { - return ((CraftMagicNumbers) CraftMagicNumbers.INSTANCE).getMappingsVersion().equals("ee13f98a43b9c5abffdcc0bb24154460"); + return ((CraftMagicNumbers) CraftMagicNumbers.INSTANCE).getMappingsVersion().equals("229d7afc75b70a6c388337687ac4da1f"); } @Override From 1b4f7d924f382f497f803695eabd2d64de4f1efc Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Thu, 13 Jun 2024 19:15:09 +0100 Subject: [PATCH 020/280] 1.21 part 3: bump import revision numbers --- .../denizen/nms/v1_20/Handler.java | 29 +++++++++---------- .../v1_20/helpers/AdvancementHelperImpl.java | 8 ++--- .../v1_20/helpers/AnimationHelperImpl.java | 6 ++-- .../nms/v1_20/helpers/BlockHelperImpl.java | 26 ++++++++--------- .../nms/v1_20/helpers/ChunkHelperImpl.java | 4 +-- .../v1_20/helpers/CustomEntityHelperImpl.java | 4 +-- .../v1_20/helpers/EnchantmentHelperImpl.java | 8 ++--- .../nms/v1_20/helpers/EntityHelperImpl.java | 16 +++++----- .../nms/v1_20/helpers/FishingHelperImpl.java | 8 ++--- .../nms/v1_20/helpers/ItemHelperImpl.java | 22 +++++++------- .../nms/v1_20/helpers/PacketHelperImpl.java | 16 +++++----- .../nms/v1_20/helpers/PlayerHelperImpl.java | 14 ++++----- .../nms/v1_20/helpers/WorldHelperImpl.java | 2 +- .../denizen/nms/v1_20/impl/BiomeNMSImpl.java | 6 ++-- .../v1_20/impl/ImprovedOfflinePlayerImpl.java | 6 ++-- .../nms/v1_20/impl/ProfileEditorImpl.java | 4 +-- .../nms/v1_20/impl/blocks/BlockLightImpl.java | 4 +-- .../impl/entities/CraftFakeArrowImpl.java | 6 ++-- .../impl/entities/CraftFakePlayerImpl.java | 4 +-- .../entities/CraftItemProjectileImpl.java | 6 ++-- .../impl/entities/EntityFakeArrowImpl.java | 4 +-- .../impl/entities/EntityFakePlayerImpl.java | 2 +- .../entities/EntityItemProjectileImpl.java | 2 +- .../handlers/AbstractListenerPlayInImpl.java | 2 +- .../handlers/DenizenNetworkManagerImpl.java | 6 ++-- .../handlers/DenizenPacketListenerImpl.java | 2 +- .../network/handlers/FakeBlockHelper.java | 8 ++--- .../packet/ActionBarEventPacketHandlers.java | 2 +- .../handlers/packet/AttachPacketHandlers.java | 2 +- .../packet/DisguisePacketHandlers.java | 2 +- .../packet/FakeEquipmentPacketHandlers.java | 2 +- .../packet/HideParticlesPacketHandlers.java | 2 +- .../network/packets/PacketOutChatImpl.java | 2 +- 33 files changed, 118 insertions(+), 119 deletions(-) diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java index a97e9c3b56..e5b934aec9 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java @@ -47,7 +47,6 @@ import net.minecraft.nbt.StringTag; import net.minecraft.nbt.TagParser; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; @@ -65,20 +64,20 @@ import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.boss.BossBar; -import org.bukkit.craftbukkit.v1_20_R4.CraftRegistry; -import org.bukkit.craftbukkit.v1_20_R4.CraftServer; -import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R4.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_20_R4.boss.CraftBossBar; -import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftInventory; -import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftInventoryCustom; -import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftInventoryView; -import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_20_R4.persistence.CraftPersistentDataContainer; -import org.bukkit.craftbukkit.v1_20_R4.util.CraftChatMessage; -import org.bukkit.craftbukkit.v1_20_R4.util.CraftLocation; -import org.bukkit.craftbukkit.v1_20_R4.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_21_R1.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R1.CraftServer; +import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R1.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_21_R1.boss.CraftBossBar; +import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftInventory; +import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftInventoryCustom; +import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftInventoryView; +import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R1.persistence.CraftPersistentDataContainer; +import org.bukkit.craftbukkit.v1_21_R1.util.CraftChatMessage; +import org.bukkit.craftbukkit.v1_21_R1.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R1.util.CraftMagicNumbers; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AdvancementHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AdvancementHelperImpl.java index 3e0d4dd07f..a33986fcda 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AdvancementHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AdvancementHelperImpl.java @@ -13,10 +13,10 @@ import net.minecraft.server.ServerAdvancementManager; import net.minecraft.server.level.ServerPlayer; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_20_R4.CraftServer; -import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_20_R4.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.v1_21_R1.CraftServer; +import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R1.util.CraftNamespacedKey; import org.bukkit.entity.Player; import java.util.*; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AnimationHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AnimationHelperImpl.java index e9abb1a1a3..7684a4205d 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AnimationHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AnimationHelperImpl.java @@ -2,9 +2,9 @@ import com.denizenscript.denizen.nms.abstracts.AnimationHelper; import net.minecraft.world.entity.Entity; -import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_20_R4.entity.CraftHorse; -import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPolarBear; +import org.bukkit.craftbukkit.v1_21_R1.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R1.entity.CraftHorse; +import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPolarBear; import org.bukkit.entity.EntityType; import org.bukkit.entity.Horse; import org.bukkit.entity.IronGolem; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java index 496ab68789..0aed7c40d6 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java @@ -44,19 +44,19 @@ import org.bukkit.block.BlockState; import org.bukkit.block.CreatureSpawner; import org.bukkit.block.Skull; -import org.bukkit.craftbukkit.v1_20_R4.CraftChunk; -import org.bukkit.craftbukkit.v1_20_R4.CraftRegistry; -import org.bukkit.craftbukkit.v1_20_R4.CraftServer; -import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R4.block.CraftBlock; -import org.bukkit.craftbukkit.v1_20_R4.block.CraftBlockEntityState; -import org.bukkit.craftbukkit.v1_20_R4.block.CraftCreatureSpawner; -import org.bukkit.craftbukkit.v1_20_R4.block.CraftSkull; -import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_20_R4.tag.CraftBlockTag; -import org.bukkit.craftbukkit.v1_20_R4.util.CraftLocation; -import org.bukkit.craftbukkit.v1_20_R4.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_21_R1.CraftChunk; +import org.bukkit.craftbukkit.v1_21_R1.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R1.CraftServer; +import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R1.block.CraftBlock; +import org.bukkit.craftbukkit.v1_21_R1.block.CraftBlockEntityState; +import org.bukkit.craftbukkit.v1_21_R1.block.CraftCreatureSpawner; +import org.bukkit.craftbukkit.v1_21_R1.block.CraftSkull; +import org.bukkit.craftbukkit.v1_21_R1.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R1.tag.CraftBlockTag; +import org.bukkit.craftbukkit.v1_21_R1.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R1.util.CraftMagicNumbers; import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ChunkHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ChunkHelperImpl.java index be4c9174c5..66b25f6fc6 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ChunkHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ChunkHelperImpl.java @@ -20,8 +20,8 @@ import net.minecraft.world.level.levelgen.Heightmap; import org.bukkit.World; import org.bukkit.Chunk; -import org.bukkit.craftbukkit.v1_20_R4.CraftChunk; -import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R1.CraftChunk; +import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/CustomEntityHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/CustomEntityHelperImpl.java index 34eb7509b7..a714c77b49 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/CustomEntityHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/CustomEntityHelperImpl.java @@ -20,8 +20,8 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.scoreboard.Scoreboard; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EnchantmentHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EnchantmentHelperImpl.java index d51abcde37..e114c87b4e 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EnchantmentHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EnchantmentHelperImpl.java @@ -20,10 +20,10 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import org.bukkit.NamespacedKey; -import org.bukkit.craftbukkit.v1_20_R4.enchantments.CraftEnchantment; -import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_20_R4.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.v1_21_R1.enchantments.CraftEnchantment; +import org.bukkit.craftbukkit.v1_21_R1.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R1.util.CraftNamespacedKey; import org.bukkit.enchantments.Enchantment; import org.bukkit.event.entity.EntityDamageEvent; import net.minecraft.world.item.enchantment.Enchantment.EnchantmentDefinition; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java index 0822fa3036..7b9f5d9f9f 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java @@ -65,14 +65,14 @@ import org.bukkit.attribute.AttributeInstance; import org.bukkit.block.CreatureSpawner; import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_20_R4.CraftServer; -import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R4.block.CraftBlock; -import org.bukkit.craftbukkit.v1_20_R4.block.CraftCreatureSpawner; -import org.bukkit.craftbukkit.v1_20_R4.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_20_R4.entity.*; -import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_20_R4.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R1.CraftServer; +import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R1.block.CraftBlock; +import org.bukkit.craftbukkit.v1_21_R1.block.CraftCreatureSpawner; +import org.bukkit.craftbukkit.v1_21_R1.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_21_R1.entity.*; +import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R1.util.CraftLocation; import org.bukkit.entity.*; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.inventory.EquipmentSlot; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/FishingHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/FishingHelperImpl.java index 94a3c107c4..5324a7024f 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/FishingHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/FishingHelperImpl.java @@ -22,10 +22,10 @@ import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.phys.Vec3; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R4.entity.CraftFishHook; -import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R1.entity.CraftFishHook; +import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; import org.bukkit.entity.FishHook; import org.bukkit.entity.Player; import org.bukkit.event.entity.CreatureSpawnEvent; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java index 7fcf984016..0f433bd893 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java @@ -56,17 +56,17 @@ import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_20_R4.CraftRegistry; -import org.bukkit.craftbukkit.v1_20_R4.CraftServer; -import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R4.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftInventoryPlayer; -import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftRecipe; -import org.bukkit.craftbukkit.v1_20_R4.map.CraftMapView; -import org.bukkit.craftbukkit.v1_20_R4.util.CraftMagicNumbers; -import org.bukkit.craftbukkit.v1_20_R4.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.v1_21_R1.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R1.CraftServer; +import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R1.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftInventoryPlayer; +import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftRecipe; +import org.bukkit.craftbukkit.v1_21_R1.map.CraftMapView; +import org.bukkit.craftbukkit.v1_21_R1.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_21_R1.util.CraftNamespacedKey; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PacketHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PacketHelperImpl.java index 9d9ce41a15..e222bcbdf0 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PacketHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PacketHelperImpl.java @@ -46,14 +46,14 @@ import org.bukkit.block.Sign; import org.bukkit.block.sign.Side; import org.bukkit.block.sign.SignSide; -import org.bukkit.craftbukkit.v1_20_R4.CraftServer; -import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_20_R4.map.CraftMapCanvas; -import org.bukkit.craftbukkit.v1_20_R4.map.CraftMapView; -import org.bukkit.craftbukkit.v1_20_R4.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R1.CraftServer; +import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R1.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R1.map.CraftMapCanvas; +import org.bukkit.craftbukkit.v1_21_R1.map.CraftMapView; +import org.bukkit.craftbukkit.v1_21_R1.util.CraftLocation; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PlayerHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PlayerHelperImpl.java index d54ef1810c..85a8cb5d6f 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PlayerHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PlayerHelperImpl.java @@ -57,13 +57,13 @@ import net.minecraft.world.phys.AABB; import org.bukkit.*; import org.bukkit.boss.BossBar; -import org.bukkit.craftbukkit.v1_20_R4.CraftServer; -import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R4.boss.CraftBossBar; -import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_20_R4.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_21_R1.CraftServer; +import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R1.boss.CraftBossBar; +import org.bukkit.craftbukkit.v1_21_R1.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R1.util.CraftMagicNumbers; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/WorldHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/WorldHelperImpl.java index 7422a6e4eb..7bb65da8be 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/WorldHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/WorldHelperImpl.java @@ -16,7 +16,7 @@ import net.minecraft.world.level.storage.PrimaryLevelData; import org.bukkit.Location; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; public class WorldHelperImpl implements WorldHelper { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/BiomeNMSImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/BiomeNMSImpl.java index d9cbb1f635..6fc7adb7c3 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/BiomeNMSImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/BiomeNMSImpl.java @@ -19,9 +19,9 @@ import net.minecraft.world.level.chunk.LevelChunk; import org.bukkit.Location; import org.bukkit.block.Block; -import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntityType; -import org.bukkit.craftbukkit.v1_20_R4.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R1.entity.CraftEntityType; +import org.bukkit.craftbukkit.v1_21_R1.util.CraftLocation; import org.bukkit.entity.EntityType; import java.lang.invoke.MethodHandle; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ImprovedOfflinePlayerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ImprovedOfflinePlayerImpl.java index 2cf9cb5f33..d313cfb817 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ImprovedOfflinePlayerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ImprovedOfflinePlayerImpl.java @@ -13,9 +13,9 @@ import net.minecraft.world.entity.ai.attributes.DefaultAttributes; import net.minecraft.world.inventory.PlayerEnderChestContainer; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_20_R4.CraftRegistry; -import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftInventory; -import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftInventoryPlayer; +import org.bukkit.craftbukkit.v1_21_R1.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftInventory; +import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftInventoryPlayer; import org.bukkit.entity.HumanEntity; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ProfileEditorImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ProfileEditorImpl.java index 22c875f555..e6336353c9 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ProfileEditorImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ProfileEditorImpl.java @@ -19,8 +19,8 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_20_R4.CraftServer; -import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R1.CraftServer; +import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerRespawnEvent; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/blocks/BlockLightImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/blocks/BlockLightImpl.java index 912f37c5c2..3e71a51048 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/blocks/BlockLightImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/blocks/BlockLightImpl.java @@ -21,8 +21,8 @@ import net.minecraft.world.level.lighting.LevelLightEngine; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_20_R4.CraftChunk; -import org.bukkit.craftbukkit.v1_20_R4.block.CraftBlock; +import org.bukkit.craftbukkit.v1_21_R1.CraftChunk; +import org.bukkit.craftbukkit.v1_21_R1.block.CraftBlock; import org.bukkit.util.Vector; import java.lang.invoke.MethodHandle; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakeArrowImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakeArrowImpl.java index 1257f21557..a8289e9946 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakeArrowImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakeArrowImpl.java @@ -2,9 +2,9 @@ import com.denizenscript.denizen.nms.interfaces.FakeArrow; import net.minecraft.world.entity.projectile.AbstractArrow; -import org.bukkit.craftbukkit.v1_20_R4.CraftServer; -import org.bukkit.craftbukkit.v1_20_R4.entity.CraftAbstractArrow; -import org.bukkit.craftbukkit.v1_20_R4.entity.CraftArrow; +import org.bukkit.craftbukkit.v1_21_R1.CraftServer; +import org.bukkit.craftbukkit.v1_21_R1.entity.CraftAbstractArrow; +import org.bukkit.craftbukkit.v1_21_R1.entity.CraftArrow; public class CraftFakeArrowImpl extends CraftAbstractArrow implements FakeArrow { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakePlayerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakePlayerImpl.java index 284ccc5b24..af6bf19f8e 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakePlayerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakePlayerImpl.java @@ -4,8 +4,8 @@ import com.denizenscript.denizen.nms.NMSHandler; import org.bukkit.Material; import org.bukkit.block.Block; -import org.bukkit.craftbukkit.v1_20_R4.CraftServer; -import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R1.CraftServer; +import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.metadata.MetadataValue; import org.bukkit.plugin.Plugin; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftItemProjectileImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftItemProjectileImpl.java index acef3db2ac..d7caef22b4 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftItemProjectileImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftItemProjectileImpl.java @@ -3,9 +3,9 @@ import com.denizenscript.denizen.nms.interfaces.ItemProjectile; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; -import org.bukkit.craftbukkit.v1_20_R4.CraftServer; -import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R1.CraftServer; +import org.bukkit.craftbukkit.v1_21_R1.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; import org.bukkit.projectiles.ProjectileSource; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakeArrowImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakeArrowImpl.java index ba5f95cfb9..76b87ffbff 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakeArrowImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakeArrowImpl.java @@ -7,8 +7,8 @@ import net.minecraft.world.item.Items; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_20_R4.CraftServer; -import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R1.CraftServer; +import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; import org.bukkit.event.entity.CreatureSpawnEvent; public class EntityFakeArrowImpl extends SpectralArrow { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakePlayerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakePlayerImpl.java index 4ce9400acf..0e109ab146 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakePlayerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakePlayerImpl.java @@ -15,7 +15,7 @@ import net.minecraft.server.network.CommonListenerCookie; import net.minecraft.world.entity.player.Player; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_20_R4.CraftServer; +import org.bukkit.craftbukkit.v1_21_R1.CraftServer; import org.bukkit.event.entity.CreatureSpawnEvent; public class EntityFakePlayerImpl extends ServerPlayer { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityItemProjectileImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityItemProjectileImpl.java index b894cd54e1..6f7e71237d 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityItemProjectileImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityItemProjectileImpl.java @@ -14,7 +14,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_20_R4.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R1.CraftRegistry; import java.lang.invoke.MethodHandle; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/AbstractListenerPlayInImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/AbstractListenerPlayInImpl.java index 642859fac9..1520de9621 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/AbstractListenerPlayInImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/AbstractListenerPlayInImpl.java @@ -22,7 +22,7 @@ import net.minecraft.world.entity.RelativeMovement; import net.minecraft.world.phys.Vec3; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer; import org.bukkit.event.player.PlayerTeleportEvent; import java.lang.reflect.Field; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenNetworkManagerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenNetworkManagerImpl.java index c1519597d8..f744ee4fdd 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenNetworkManagerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -30,9 +30,9 @@ import net.minecraft.server.network.ServerPlayerConnection; import org.bukkit.Bukkit; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_20_R4.CraftRegistry; -import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R1.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer; import org.bukkit.entity.Player; import javax.annotation.Nullable; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenPacketListenerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenPacketListenerImpl.java index 1a22d4ab27..e387808535 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenPacketListenerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenPacketListenerImpl.java @@ -18,7 +18,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.CommonListenerCookie; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_20_R4.block.CraftBlock; +import org.bukkit.craftbukkit.v1_21_R1.block.CraftBlock; import org.bukkit.event.block.SignChangeEvent; public class DenizenPacketListenerImpl extends AbstractListenerPlayInImpl { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/FakeBlockHelper.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/FakeBlockHelper.java index f52d7971f5..08bb2a8721 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/FakeBlockHelper.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/FakeBlockHelper.java @@ -23,10 +23,10 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.PalettedContainer; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_20_R4.CraftRegistry; -import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R4.block.CraftBlockStates; -import org.bukkit.craftbukkit.v1_20_R4.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_21_R1.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R1.block.CraftBlockStates; +import org.bukkit.craftbukkit.v1_21_R1.block.data.CraftBlockData; import java.lang.invoke.MethodHandle; import java.lang.reflect.Constructor; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/ActionBarEventPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/ActionBarEventPacketHandlers.java index 7bb358a154..f2e3d6197c 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/ActionBarEventPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/ActionBarEventPacketHandlers.java @@ -8,7 +8,7 @@ import com.denizenscript.denizencore.objects.core.ElementTag; import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundSetActionBarTextPacket; -import org.bukkit.craftbukkit.v1_20_R4.util.CraftChatMessage; +import org.bukkit.craftbukkit.v1_21_R1.util.CraftChatMessage; public class ActionBarEventPacketHandlers { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/AttachPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/AttachPacketHandlers.java index 0a0aceef29..a11018b2c1 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/AttachPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/AttachPacketHandlers.java @@ -11,7 +11,7 @@ import net.minecraft.network.protocol.game.*; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; -import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R1.entity.CraftEntity; import org.bukkit.util.Vector; import java.lang.reflect.Field; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DisguisePacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DisguisePacketHandlers.java index 8679efd8b8..9b69e18f98 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DisguisePacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DisguisePacketHandlers.java @@ -14,7 +14,7 @@ import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; -import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R1.entity.CraftEntity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java index f81547fc93..1853bdcd67 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java @@ -12,7 +12,7 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; -import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; import java.util.ArrayList; import java.util.List; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/HideParticlesPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/HideParticlesPacketHandlers.java index 2d6958a721..581d2916e6 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/HideParticlesPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/HideParticlesPacketHandlers.java @@ -4,7 +4,7 @@ import com.denizenscript.denizen.utilities.packets.HideParticles; import net.minecraft.network.protocol.game.ClientboundLevelParticlesPacket; import org.bukkit.Particle; -import org.bukkit.craftbukkit.v1_20_R4.CraftParticle; +import org.bukkit.craftbukkit.v1_21_R1.CraftParticle; import java.util.Set; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketOutChatImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketOutChatImpl.java index c7e2119967..8f188b6939 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketOutChatImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketOutChatImpl.java @@ -8,7 +8,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundPlayerChatPacket; import net.minecraft.network.protocol.game.ClientboundSystemChatPacket; -import org.bukkit.craftbukkit.v1_20_R4.util.CraftChatMessage; +import org.bukkit.craftbukkit.v1_21_R1.util.CraftChatMessage; import java.lang.reflect.Field; From 6483a1438620b33f6a4adfc5ae49f8dfe8dcc201 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Thu, 13 Jun 2024 20:25:37 +0100 Subject: [PATCH 021/280] 1.21 part 4: Initial code updates --- .../denizenscript/denizen/nms/NMSVersion.java | 3 +- .../nms/v1_20/helpers/BlockHelperImpl.java | 2 +- .../v1_20/helpers/EnchantmentHelperImpl.java | 101 +++++++++--------- .../nms/v1_20/helpers/EntityHelperImpl.java | 33 +++--- .../nms/v1_20/helpers/FishingHelperImpl.java | 12 ++- .../nms/v1_20/helpers/ItemHelperImpl.java | 8 +- .../nms/v1_20/helpers/PacketHelperImpl.java | 2 +- .../nms/v1_20/helpers/PlayerHelperImpl.java | 2 +- .../denizen/nms/v1_20/impl/BiomeNMSImpl.java | 2 +- .../nms/v1_20/impl/ProfileEditorImpl.java | 3 +- .../handlers/AbstractListenerPlayInImpl.java | 14 +-- .../handlers/DenizenNetworkManagerImpl.java | 4 +- 12 files changed, 97 insertions(+), 89 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/NMSVersion.java b/plugin/src/main/java/com/denizenscript/denizen/nms/NMSVersion.java index 1aa7a0157a..8b75de4b81 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/NMSVersion.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/NMSVersion.java @@ -6,7 +6,8 @@ public enum NMSVersion { v1_17("1.17"), v1_18("1.18"), v1_19("1.19"), - v1_20("1.20"); + v1_20("1.20"), + v1_21("1.21"); final String minecraftVersion; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java index 0aed7c40d6..d5841098f9 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java @@ -291,7 +291,7 @@ public void setVanillaTags(Material material, Set tags) { }); List> newNmsTags = new ArrayList<>(); for (String tag : tags) { - TagKey newNmsTag = TagKey.create(BuiltInRegistries.BLOCK.key(), new ResourceLocation(tag)); + TagKey newNmsTag = TagKey.create(BuiltInRegistries.BLOCK.key(), ResourceLocation.withDefaultNamespace(tag)); HolderSet.Named nmsHolderSet = BuiltInRegistries.BLOCK.getOrCreateTag(newNmsTag); List> nmsHolders = nmsHolderSet.stream().collect(Collectors.toCollection(ArrayList::new)); nmsHolders.add(nmsHolder); diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EnchantmentHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EnchantmentHelperImpl.java index e114c87b4e..660dbc5476 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EnchantmentHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EnchantmentHelperImpl.java @@ -33,6 +33,8 @@ import java.util.Map; public class EnchantmentHelperImpl extends EnchantmentHelper { + // TODO: 1.21: Enchantments were entirely reworked, need to update this + /* public static final Field REGISTRY_FROZEN = ReflectionHelper.getFields(MappedRegistry.class).get(ReflectionMappingsInfo.MappedRegistry_frozen, boolean.class); public static final Field REGISTRY_INTRUSIVE_HOLDERS = ReflectionHelper.getFields(MappedRegistry.class).get(ReflectionMappingsInfo.MappedRegistry_unregisteredIntrusiveHolders, Map.class); @@ -50,47 +52,47 @@ public org.bukkit.enchantments.Enchantment registerFakeEnchantment(EnchantmentSc slots[i] = EquipmentSlot.valueOf(CoreUtilities.toUpperCase(script.script.slots.get(i))); } // TODO: 1.20.6: rarity is provided as an int, can make our own mirror enum; categories seemed to only over control #canEnchant(ItemStack), so can probably safely phase them out? - // net.minecraft.world.item.enchantment.Enchantment.Rarity.valueOf(script.script.rarity), EnchantmentCategory.valueOf(script.script.category), slots + net.minecraft.world.item.enchantment.Enchantment.Rarity.valueOf(script.script.rarity), EnchantmentCategory.valueOf(script.script.category), slots net.minecraft.world.item.enchantment.Enchantment nmsEnchant = new net.minecraft.world.item.enchantment.Enchantment(null) { // TODO: 1.20.6: methods are final now and the values are provided by EnchantmentDefinition - would probably need to create a new one on reload and modify the existing enchantment -// @Override -// public int getMinLevel() { -// return script.script.minLevel; -// } -// @Override -// public int getMaxLevel() { -// return script.script.maxLevel; -// } -// @Override -// public int getMinCost(int level) { -// return script.script.getMinCost(level); -// } -// @Override -// public int getMaxCost(int level) { -// return script.script.getMaxCost(level); -// } + @Override + public int getMinLevel() { + return script.script.minLevel; + } + @Override + public int getMaxLevel() { + return script.script.maxLevel; + } + @Override + public int getMinCost(int level) { + return script.script.getMinCost(level); + } + @Override + public int getMaxCost(int level) { + return script.script.getMaxCost(level); + } @Override public int getDamageProtection(int level, DamageSource src) { return script.script.getDamageProtection(level, src.getMsgId(), src.getEntity() == null ? null : src.getEntity().getBukkitEntity()); } // TODO: 1.20.6: Takes an EntityType now, and MobType seems to have been removed in favor of vanilla tags - can probably use these to backsupport & properly pass the entity type -// @Override -// public float getDamageBonus(int level, EntityType type) { -// String typeName = "UNDEFINED"; -// if (type == MobType.ARTHROPOD) { -// typeName = "ARTHROPOD"; -// } -// else if (type == MobType.ILLAGER) { -// typeName = "ILLAGER"; -// } -// else if (type == MobType.UNDEAD) { -// typeName = "UNDEAD"; -// } -// else if (type == MobType.WATER) { -// typeName = "WATER"; -// } -// return script.script.getDamageBonus(level, typeName); -// } + @Override + public float getDamageBonus(int level, EntityType type) { + String typeName = "UNDEFINED"; + if (type == MobType.ARTHROPOD) { + typeName = "ARTHROPOD"; + } + else if (type == MobType.ILLAGER) { + typeName = "ILLAGER"; + } + else if (type == MobType.UNDEAD) { + typeName = "UNDEAD"; + } + else if (type == MobType.WATER) { + typeName = "WATER"; + } + return script.script.getDamageBonus(level, typeName); + } @Override protected boolean checkCompatibility(net.minecraft.world.item.enchantment.Enchantment nmsEnchantment) { ResourceLocation nmsKey = BuiltInRegistries.ENCHANTMENT.getKey(nmsEnchantment); @@ -162,10 +164,10 @@ public String getName() { } // TODO: 1.20.6: rarity is just an int now (weight), can deprecate & backsupport by estimating it based on the weight -// @Override -// public String getRarity(Enchantment enchantment) { -// return ((CraftEnchantment) enchantment).getHandle().getRarity().name(); -// } + @Override + public String getRarity(Enchantment enchantment) { + return ((CraftEnchantment) enchantment).getHandle().getRarity().name(); + } @Override public boolean isDiscoverable(Enchantment enchantment) { @@ -198,17 +200,17 @@ public String getFullName(Enchantment enchantment, int level) { } // TODO: 1.20.6: MobType was removed in favor of using the entity type directly - deprecate + potentially backsupport with vanilla tags -// @Override -// public float getDamageBonus(Enchantment enchantment, int level, String type) { -// MobType mobType = switch (type) { -// case "illager" -> MobType.ILLAGER; -// case "undead" -> MobType.UNDEAD; -// case "water" -> MobType.WATER; -// case "arthropod" -> MobType.ARTHROPOD; -// default -> MobType.UNDEFINED; -// }; -// return ((CraftEnchantment) enchantment).getHandle().getDamageBonus(level, mobType); -// } + @Override + public float getDamageBonus(Enchantment enchantment, int level, String type) { + MobType mobType = switch (type) { + case "illager" -> MobType.ILLAGER; + case "undead" -> MobType.UNDEAD; + case "water" -> MobType.WATER; + case "arthropod" -> MobType.ARTHROPOD; + default -> MobType.UNDEFINED; + }; + return ((CraftEnchantment) enchantment).getHandle().getDamageBonus(level, mobType); + } @Override public int getDamageProtection(Enchantment enchantment, int level, EntityDamageEvent.DamageCause type, org.bukkit.entity.Entity attacker) { @@ -219,4 +221,5 @@ public int getDamageProtection(Enchantment enchantment, int level, EntityDamageE } return ((CraftEnchantment) enchantment).getHandle().getDamageProtection(level, src); } + */ } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java index 7b9f5d9f9f..cf35f22ff7 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java @@ -114,31 +114,36 @@ public double getDamageTo(LivingEntity attacker, Entity target) { if (attrib != null) { damage = attrib.getValue(); } - if (attacker.getEquipment() != null) { - damage += EnchantmentHelper.getDamageBonus(CraftItemStack.asNMSCopy(attacker.getEquipment().getItemInMainHand()), CraftEntityType.bukkitToMinecraft(target.getType())); + net.minecraft.world.entity.Entity nmsTarget = target != null ? ((CraftEntity) target).getHandle() : null; + ServerLevel nmsWorld = ((CraftWorld) attacker.getWorld()).getHandle(); + DamageSource nmsSource = null; + if (nmsTarget != null) { + if (attacker instanceof CraftPlayer playerAttacker) { + nmsSource = nmsTarget.level().damageSources().playerAttack(playerAttacker.getHandle()); + } + else { + nmsSource = nmsTarget.level().damageSources().mobAttack(((CraftLivingEntity) attacker).getHandle()); + } + } + // TODO: 1.21: Target entity is required now, might need to change how the tag works? + if (nmsTarget != null && attacker.getEquipment() != null) { + damage = EnchantmentHelper.modifyDamage(nmsWorld, CraftItemStack.asNMSCopy(attacker.getEquipment().getItemInMainHand()), + ((CraftEntity) target).getHandle(), nmsSource, (float) damage); } if (damage <= 0) { return 0; } if (target != null) { - DamageSource source; - net.minecraft.world.entity.Entity nmsTarget = ((CraftEntity) target).getHandle(); - if (attacker instanceof CraftPlayer playerAttacker) { - source = nmsTarget.level().damageSources().playerAttack(playerAttacker.getHandle()); - } - else { - source = nmsTarget.level().damageSources().mobAttack(((CraftLivingEntity) attacker).getHandle()); - } - if (nmsTarget.isInvulnerableTo(source)) { + if (nmsTarget.isInvulnerableTo(nmsSource)) { return 0; } if (!(nmsTarget instanceof net.minecraft.world.entity.LivingEntity livingTarget)) { return damage; } - damage = CombatRules.getDamageAfterAbsorb((float) damage, source, (float) livingTarget.getArmorValue(), (float) livingTarget.getAttributeValue(Attributes.ARMOR_TOUGHNESS)); - int enchantDamageModifier = EnchantmentHelper.getDamageProtection(livingTarget.getArmorSlots(), source); + damage = CombatRules.getDamageAfterAbsorb(livingTarget, (float) damage, nmsSource, (float) livingTarget.getArmorValue(), (float) livingTarget.getAttributeValue(Attributes.ARMOR_TOUGHNESS)); + float enchantDamageModifier = EnchantmentHelper.getDamageProtection(nmsWorld, livingTarget, nmsSource); if (enchantDamageModifier > 0) { - damage = CombatRules.getDamageAfterMagicAbsorb((float) damage, (float) enchantDamageModifier); + damage = CombatRules.getDamageAfterMagicAbsorb((float) damage, enchantDamageModifier); } } return damage; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/FishingHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/FishingHelperImpl.java index 5324a7024f..b9e031e05c 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/FishingHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/FishingHelperImpl.java @@ -41,11 +41,13 @@ public org.bukkit.inventory.ItemStack getResult(FishHook fishHook, CatchType cat FishingHook nmsHook = ((CraftFishHook) fishHook).getHandle(); ItemStack result = switch (catchType) { case DEFAULT -> { - float f = ((CraftWorld) fishHook.getWorld()).getHandle().random.nextFloat(); - int i = EnchantmentHelper.getMobLooting(nmsHook.getPlayerOwner()); - int j = EnchantmentHelper.getEnchantmentLevel(Enchantments.LUCK_OF_THE_SEA, nmsHook.getPlayerOwner()); - float f1 = 0.1F - (float) i * 0.025F - (float) j * 0.01F; - float f2 = 0.05F + (float) i * 0.01F - (float) j * 0.01F; + ServerLevel nmsWorld = ((CraftWorld) fishHook.getWorld()).getHandle(); + ItemStack nmsFishingRod = nmsHook.getPlayerOwner().getMainHandItem(); + float f = nmsWorld.random.nextFloat(); + float i = EnchantmentHelper.getFishingTimeReduction(nmsWorld, nmsFishingRod, nmsHook.getPlayerOwner()); + int j = EnchantmentHelper.getFishingLuckBonus(nmsWorld, nmsFishingRod, nmsHook.getPlayerOwner()); + float f1 = 0.1F - i * 0.025F - (float) j * 0.01F; + float f2 = 0.05F + i * 0.01F - (float) j * 0.01F; f1 = Mth.clamp(f1, 0.0F, 1.0F); f2 = Mth.clamp(f2, 0.0F, 1.0F); diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java index 0f433bd893..49ea0e901a 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java @@ -134,7 +134,7 @@ public static Ingredient itemArrayToRecipe(ItemStack[] items, boolean exact) { @Override public void registerFurnaceRecipe(String keyName, String group, ItemStack result, ItemStack[] ingredient, float exp, int time, String type, boolean exact, String category) { - ResourceLocation key = new ResourceLocation("denizen", keyName); + ResourceLocation key = ResourceLocation.fromNamespaceAndPath("denizen", keyName); Ingredient itemRecipe = itemArrayToRecipe(ingredient, exact); AbstractCookingRecipe recipe; CookingBookCategory categoryValue = category == null ? CookingBookCategory.MISC : CookingBookCategory.valueOf(CoreUtilities.toUpperCase(category)); @@ -156,7 +156,7 @@ else if (type.equalsIgnoreCase("campfire")) { @Override public void registerStonecuttingRecipe(String keyName, String group, ItemStack result, ItemStack[] ingredient, boolean exact) { - ResourceLocation key = new ResourceLocation("denizen", keyName); + ResourceLocation key = ResourceLocation.fromNamespaceAndPath("denizen", keyName); Ingredient itemRecipe = itemArrayToRecipe(ingredient, exact); StonecutterRecipe recipe = new StonecutterRecipe(group, itemRecipe, CraftItemStack.asNMSCopy(result)); RecipeHolder holder = new RecipeHolder<>(key, recipe); @@ -165,7 +165,7 @@ public void registerStonecuttingRecipe(String keyName, String group, ItemStack r @Override public void registerSmithingRecipe(String keyName, ItemStack result, ItemStack[] baseItem, boolean baseExact, ItemStack[] upgradeItem, boolean upgradeExact, ItemStack[] templateItem, boolean templateExact) { - ResourceLocation key = new ResourceLocation("denizen", keyName); + ResourceLocation key = ResourceLocation.fromNamespaceAndPath("denizen", keyName); Ingredient templateItemRecipe = itemArrayToRecipe(templateItem, templateExact); Ingredient baseItemRecipe = itemArrayToRecipe(baseItem, baseExact); Ingredient upgradeItemRecipe = itemArrayToRecipe(upgradeItem, upgradeExact); @@ -176,7 +176,7 @@ public void registerSmithingRecipe(String keyName, ItemStack result, ItemStack[] @Override public void registerShapelessRecipe(String keyName, String group, ItemStack result, List ingredients, boolean[] exact, String category) { - ResourceLocation key = new ResourceLocation("denizen", keyName); + ResourceLocation key = ResourceLocation.fromNamespaceAndPath("denizen", keyName); ArrayList ingredientList = new ArrayList<>(); CraftingBookCategory categoryValue = category == null ? CraftingBookCategory.MISC : CraftingBookCategory.valueOf(CoreUtilities.toUpperCase(category)); for (int i = 0; i < ingredients.size(); i++) { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PacketHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PacketHelperImpl.java index e222bcbdf0..f13a4ac0f3 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PacketHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PacketHelperImpl.java @@ -134,7 +134,7 @@ else if (entityType == EntityType.ENDERMAN) { // Spectating an entity then immediately respawning the player prevents a client shader update, // allowing the player to retain whatever vision the mob they spectated had. - send(player, new ClientboundAddEntityPacket(entity)); + send(player, new ClientboundAddEntityPacket(entity, 0, BlockPos.ZERO)); send(player, new ClientboundSetCameraPacket(entity)); NMSHandler.playerHelper.refreshPlayer(player); } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PlayerHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PlayerHelperImpl.java index 85a8cb5d6f..e570a6c7f4 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PlayerHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PlayerHelperImpl.java @@ -86,7 +86,7 @@ public class PlayerHelperImpl extends PlayerHelper { @Override public void stopSound(Player player, String sound, SoundCategory category) { - ((CraftPlayer) player).getHandle().connection.send(new ClientboundStopSoundPacket(sound == null ? null : new ResourceLocation(sound), null)); + ((CraftPlayer) player).getHandle().connection.send(new ClientboundStopSoundPacket(sound == null ? null : ResourceLocation.withDefaultNamespace(sound), null)); } @Override diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/BiomeNMSImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/BiomeNMSImpl.java index 6fc7adb7c3..cb03d01abb 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/BiomeNMSImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/BiomeNMSImpl.java @@ -39,7 +39,7 @@ public class BiomeNMSImpl extends BiomeNMS { public BiomeNMSImpl(ServerLevel world, String name) { super(world.getWorld(), name); this.world = world; - biomeHolder = world.registryAccess().registryOrThrow(Registries.BIOME).getHolder(ResourceKey.create(Registries.BIOME, new ResourceLocation(name))).orElse(null); + biomeHolder = world.registryAccess().registryOrThrow(Registries.BIOME).getHolder(ResourceKey.create(Registries.BIOME, ResourceLocation.withDefaultNamespace(name))).orElse(null); } @Override diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ProfileEditorImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ProfileEditorImpl.java index e6336353c9..3a7504730a 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ProfileEditorImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ProfileEditorImpl.java @@ -18,6 +18,7 @@ import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_21_R1.CraftServer; import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer; @@ -51,7 +52,7 @@ protected void updatePlayer(final Player player, final boolean isSkinChanging) { } } if (isSkinChanging) { - ((CraftServer) Bukkit.getServer()).getHandle().respawn(nmsPlayer, (ServerLevel) nmsPlayer.level(), true, player.getLocation(), false, PlayerRespawnEvent.RespawnReason.PLUGIN); + ((CraftServer) Bukkit.getServer()).getHandle().respawn(nmsPlayer, true, Entity.RemovalReason.CHANGED_DIMENSION, PlayerRespawnEvent.RespawnReason.PLUGIN); } player.updateInventory(); } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/AbstractListenerPlayInImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/AbstractListenerPlayInImpl.java index 1520de9621..9bdd4fe5e0 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/AbstractListenerPlayInImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/AbstractListenerPlayInImpl.java @@ -7,6 +7,7 @@ import com.denizenscript.denizencore.utilities.debugging.Debug; import com.mojang.authlib.GameProfile; import net.minecraft.network.ConnectionProtocol; +import net.minecraft.network.DisconnectionDetails; import net.minecraft.network.PacketSendListener; import net.minecraft.network.chat.ChatType; import net.minecraft.network.chat.Component; @@ -54,19 +55,14 @@ public void disconnect(Component ichatbasecomponent) { oldListener.disconnect(ichatbasecomponent); } - @Override - public void disconnect(String s) { - oldListener.disconnect(s); - } - @Override public void teleport(double d0, double d1, double d2, float f, float f1) { oldListener.teleport(d0, d1, d2, f, f1); } @Override - public void teleport(double d0, double d1, double d2, float f, float f1, PlayerTeleportEvent.TeleportCause cause) { - oldListener.teleport(d0, d1, d2, f, f1, cause); + public boolean teleport(double d0, double d1, double d2, float f, float f1, PlayerTeleportEvent.TeleportCause cause) { + return oldListener.teleport(d0, d1, d2, f, f1, cause); } @Override @@ -115,8 +111,8 @@ public int latency() { } @Override - public void onDisconnect(Component ichatbasecomponent) { - oldListener.onDisconnect(ichatbasecomponent); + public void onDisconnect(DisconnectionDetails disconnectionDetails) { + oldListener.onDisconnect(disconnectionDetails); } @Override diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenNetworkManagerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenNetworkManagerImpl.java index f744ee4fdd..22002c63e2 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenNetworkManagerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -470,8 +470,8 @@ public PacketListener getPacketListener() { } @Override - public Component getDisconnectedReason() { - return oldManager.getDisconnectedReason(); + public DisconnectionDetails getDisconnectionDetails() { + return oldManager.getDisconnectionDetails(); } @Override From 8ca7584488725f406eb119ef9f1188988a07f661 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Thu, 13 Jun 2024 20:29:08 +0100 Subject: [PATCH 022/280] 1.21 part 5: rename package, oops --- .../denizen/nms/{v1_20 => v1_21}/Handler.java | 14 ++++---- .../ReflectionMappingsInfo.java | 2 +- .../helpers/AdvancementHelperImpl.java | 4 +-- .../helpers/AnimationHelperImpl.java | 2 +- .../helpers/BlockHelperImpl.java | 8 ++--- .../helpers/ChunkHelperImpl.java | 4 +-- .../helpers/CustomEntityHelperImpl.java | 12 +++---- .../helpers/EnchantmentHelperImpl.java | 32 +------------------ .../helpers/EntityDataNameMapper.java | 2 +- .../helpers/EntityHelperImpl.java | 8 ++--- .../helpers/FishingHelperImpl.java | 6 ++-- .../helpers/ItemHelperImpl.java | 10 +++--- .../helpers/PacketHelperImpl.java | 10 +++--- .../helpers/PlayerHelperImpl.java | 18 +++++------ .../helpers/WorldHelperImpl.java | 6 ++-- .../{v1_20 => v1_21}/impl/BiomeNMSImpl.java | 4 +-- .../impl/ImprovedOfflinePlayerImpl.java | 4 +-- .../impl/ProfileEditorImpl.java | 9 +++--- .../{v1_20 => v1_21}/impl/SidebarImpl.java | 7 ++-- .../impl/blocks/BlockLightImpl.java | 4 +-- .../impl/entities/CraftFakeArrowImpl.java | 2 +- .../impl/entities/CraftFakePlayerImpl.java | 2 +- .../entities/CraftItemProjectileImpl.java | 2 +- .../impl/entities/EntityFakeArrowImpl.java | 4 +-- .../impl/entities/EntityFakePlayerImpl.java | 10 +++--- .../entities/EntityItemProjectileImpl.java | 4 +-- .../impl/jnbt/CompoundTagImpl.java | 2 +- .../impl/network/fakes/FakeChannelImpl.java | 2 +- .../network/fakes/FakeNetworkManagerImpl.java | 2 +- .../fakes/FakePlayerConnectionImpl.java | 2 +- .../handlers/AbstractListenerPlayInImpl.java | 4 +-- .../handlers/DenizenNetworkManagerImpl.java | 8 ++--- .../handlers/DenizenPacketListenerImpl.java | 6 ++-- .../network/handlers/FakeBlockHelper.java | 4 +-- .../packet/ActionBarEventPacketHandlers.java | 6 ++-- .../handlers/packet/AttachPacketHandlers.java | 6 ++-- .../packet/BlockLightPacketHandlers.java | 6 ++-- .../DenizenPacketHandlerPacketHandlers.java | 6 ++-- .../packet/DisguisePacketHandlers.java | 8 ++--- .../packet/EntityMetadataPacketHandlers.java | 8 ++--- .../packet/FakeBlocksPacketHandlers.java | 8 ++--- .../packet/FakeEquipmentPacketHandlers.java | 4 +-- .../packet/FakePlayerPacketHandlers.java | 2 +- .../packet/HiddenEntitiesPacketHandlers.java | 4 +-- .../packet/HideParticlesPacketHandlers.java | 4 +-- .../PlayerHearsSoundEventPacketHandlers.java | 4 +-- .../TablistUpdateEventPacketHandlers.java | 8 ++--- .../PacketInResourcePackStatusImpl.java | 2 +- .../packets/PacketInSteerVehicleImpl.java | 2 +- .../network/packets/PacketOutChatImpl.java | 2 +- 50 files changed, 133 insertions(+), 167 deletions(-) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/Handler.java (95%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/ReflectionMappingsInfo.java (97%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/helpers/AdvancementHelperImpl.java (97%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/helpers/AnimationHelperImpl.java (94%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/helpers/BlockHelperImpl.java (96%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/helpers/ChunkHelperImpl.java (95%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/helpers/CustomEntityHelperImpl.java (92%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/helpers/EnchantmentHelperImpl.java (84%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/helpers/EntityDataNameMapper.java (99%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/helpers/EntityHelperImpl.java (97%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/helpers/FishingHelperImpl.java (94%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/helpers/ItemHelperImpl.java (97%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/helpers/PacketHelperImpl.java (96%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/helpers/PlayerHelperImpl.java (95%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/helpers/WorldHelperImpl.java (93%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/BiomeNMSImpl.java (96%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/ImprovedOfflinePlayerImpl.java (95%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/ProfileEditorImpl.java (94%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/SidebarImpl.java (93%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/blocks/BlockLightImpl.java (96%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/entities/CraftFakeArrowImpl.java (89%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/entities/CraftFakePlayerImpl.java (93%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/entities/CraftItemProjectileImpl.java (94%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/entities/EntityFakeArrowImpl.java (89%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/entities/EntityFakePlayerImpl.java (84%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/entities/EntityItemProjectileImpl.java (94%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/jnbt/CompoundTagImpl.java (97%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/network/fakes/FakeChannelImpl.java (90%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/network/fakes/FakeNetworkManagerImpl.java (83%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/network/fakes/FakePlayerConnectionImpl.java (89%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/network/handlers/AbstractListenerPlayInImpl.java (96%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/network/handlers/DenizenNetworkManagerImpl.java (96%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/network/handlers/DenizenPacketListenerImpl.java (94%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/network/handlers/FakeBlockHelper.java (96%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/network/handlers/packet/ActionBarEventPacketHandlers.java (91%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/network/handlers/packet/AttachPacketHandlers.java (99%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/network/handlers/packet/BlockLightPacketHandlers.java (86%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/network/handlers/packet/DenizenPacketHandlerPacketHandlers.java (92%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/network/handlers/packet/DisguisePacketHandlers.java (97%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/network/handlers/packet/EntityMetadataPacketHandlers.java (95%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/network/handlers/packet/FakeBlocksPacketHandlers.java (96%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java (98%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/network/handlers/packet/FakePlayerPacketHandlers.java (95%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java (96%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/network/handlers/packet/HideParticlesPacketHandlers.java (90%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/network/handlers/packet/PlayerHearsSoundEventPacketHandlers.java (94%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java (96%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/network/packets/PacketInResourcePackStatusImpl.java (86%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/network/packets/PacketInSteerVehicleImpl.java (88%) rename v1_21/src/main/java/com/denizenscript/denizen/nms/{v1_20 => v1_21}/impl/network/packets/PacketOutChatImpl.java (94%) diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java similarity index 95% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java index e5b934aec9..361575f396 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_20; +package com.denizenscript.denizen.nms.v1_21; import com.denizenscript.denizen.Denizen; import com.denizenscript.denizen.nms.NMSHandler; @@ -6,12 +6,12 @@ import com.denizenscript.denizen.nms.util.PlayerProfile; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; import com.denizenscript.denizen.nms.util.jnbt.Tag; -import com.denizenscript.denizen.nms.v1_20.helpers.*; -import com.denizenscript.denizen.nms.v1_20.impl.BiomeNMSImpl; -import com.denizenscript.denizen.nms.v1_20.impl.ProfileEditorImpl; -import com.denizenscript.denizen.nms.v1_20.impl.SidebarImpl; -import com.denizenscript.denizen.nms.v1_20.impl.blocks.BlockLightImpl; -import com.denizenscript.denizen.nms.v1_20.impl.jnbt.CompoundTagImpl; +import com.denizenscript.denizen.nms.v1_21.helpers.*; +import com.denizenscript.denizen.nms.v1_21.impl.BiomeNMSImpl; +import com.denizenscript.denizen.nms.v1_21.impl.ProfileEditorImpl; +import com.denizenscript.denizen.nms.v1_21.impl.SidebarImpl; +import com.denizenscript.denizen.nms.v1_21.impl.blocks.BlockLightImpl; +import com.denizenscript.denizen.nms.v1_21.impl.jnbt.CompoundTagImpl; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.objects.MaterialTag; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/ReflectionMappingsInfo.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java similarity index 97% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/ReflectionMappingsInfo.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java index 397b0f80ce..bab8615d9f 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/ReflectionMappingsInfo.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_20; +package com.denizenscript.denizen.nms.v1_21; public class ReflectionMappingsInfo { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AdvancementHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java similarity index 97% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AdvancementHelperImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java index a33986fcda..f40b5cb5ce 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AdvancementHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java @@ -1,7 +1,7 @@ -package com.denizenscript.denizen.nms.v1_20.helpers; +package com.denizenscript.denizen.nms.v1_21.helpers; import com.denizenscript.denizen.nms.interfaces.AdvancementHelper; -import com.denizenscript.denizen.nms.v1_20.Handler; +import com.denizenscript.denizen.nms.v1_21.Handler; import com.denizenscript.denizen.utilities.FormattedTextHelper; import com.google.common.collect.ImmutableMap; import net.md_5.bungee.api.ChatColor; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AnimationHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AnimationHelperImpl.java similarity index 94% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AnimationHelperImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AnimationHelperImpl.java index 7684a4205d..3faa480465 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AnimationHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AnimationHelperImpl.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_20.helpers; +package com.denizenscript.denizen.nms.v1_21.helpers; import com.denizenscript.denizen.nms.abstracts.AnimationHelper; import net.minecraft.world.entity.Entity; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java similarity index 96% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java index d5841098f9..2691d73f16 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java @@ -1,12 +1,12 @@ -package com.denizenscript.denizen.nms.v1_20.helpers; +package com.denizenscript.denizen.nms.v1_21.helpers; import com.denizenscript.denizen.nms.interfaces.BlockHelper; import com.denizenscript.denizen.nms.util.PlayerProfile; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; import com.denizenscript.denizen.nms.util.jnbt.CompoundTagBuilder; -import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; -import com.denizenscript.denizen.nms.v1_20.impl.ProfileEditorImpl; -import com.denizenscript.denizen.nms.v1_20.impl.jnbt.CompoundTagImpl; +import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_21.impl.ProfileEditorImpl; +import com.denizenscript.denizen.nms.v1_21.impl.jnbt.CompoundTagImpl; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.utilities.VanillaTagHelper; import com.denizenscript.denizencore.objects.Mechanism; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ChunkHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ChunkHelperImpl.java similarity index 95% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ChunkHelperImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ChunkHelperImpl.java index 66b25f6fc6..35628afb8e 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ChunkHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ChunkHelperImpl.java @@ -1,7 +1,7 @@ -package com.denizenscript.denizen.nms.v1_20.helpers; +package com.denizenscript.denizen.nms.v1_21.helpers; import com.denizenscript.denizen.nms.abstracts.BiomeNMS; -import com.denizenscript.denizen.nms.v1_20.impl.BiomeNMSImpl; +import com.denizenscript.denizen.nms.v1_21.impl.BiomeNMSImpl; import com.denizenscript.denizen.nms.interfaces.ChunkHelper; import com.denizenscript.denizencore.tags.TagManager; import com.denizenscript.denizencore.utilities.ReflectionHelper; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/CustomEntityHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/CustomEntityHelperImpl.java similarity index 92% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/CustomEntityHelperImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/CustomEntityHelperImpl.java index a714c77b49..c449df8ca7 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/CustomEntityHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/CustomEntityHelperImpl.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_20.helpers; +package com.denizenscript.denizen.nms.v1_21.helpers; import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.interfaces.CustomEntityHelper; @@ -6,11 +6,11 @@ import com.denizenscript.denizen.nms.interfaces.FakePlayer; import com.denizenscript.denizen.nms.interfaces.ItemProjectile; import com.denizenscript.denizen.nms.util.PlayerProfile; -import com.denizenscript.denizen.nms.v1_20.impl.ProfileEditorImpl; -import com.denizenscript.denizen.nms.v1_20.impl.entities.CraftFakePlayerImpl; -import com.denizenscript.denizen.nms.v1_20.impl.entities.EntityFakeArrowImpl; -import com.denizenscript.denizen.nms.v1_20.impl.entities.EntityFakePlayerImpl; -import com.denizenscript.denizen.nms.v1_20.impl.entities.EntityItemProjectileImpl; +import com.denizenscript.denizen.nms.v1_21.impl.ProfileEditorImpl; +import com.denizenscript.denizen.nms.v1_21.impl.entities.CraftFakePlayerImpl; +import com.denizenscript.denizen.nms.v1_21.impl.entities.EntityFakeArrowImpl; +import com.denizenscript.denizen.nms.v1_21.impl.entities.EntityFakePlayerImpl; +import com.denizenscript.denizen.nms.v1_21.impl.entities.EntityItemProjectileImpl; import com.denizenscript.denizen.utilities.BukkitImplDeprecations; import com.denizenscript.denizencore.utilities.CoreUtilities; import com.denizenscript.denizencore.utilities.debugging.Debug; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EnchantmentHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EnchantmentHelperImpl.java similarity index 84% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EnchantmentHelperImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EnchantmentHelperImpl.java index 660dbc5476..ba72802159 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EnchantmentHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EnchantmentHelperImpl.java @@ -1,36 +1,6 @@ -package com.denizenscript.denizen.nms.v1_20.helpers; +package com.denizenscript.denizen.nms.v1_21.helpers; -import com.denizenscript.denizen.Denizen; import com.denizenscript.denizen.nms.interfaces.EnchantmentHelper; -import com.denizenscript.denizen.nms.v1_20.Handler; -import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; -import com.denizenscript.denizen.scripts.containers.core.EnchantmentScriptContainer; -import com.denizenscript.denizen.utilities.FormattedTextHelper; -import com.denizenscript.denizencore.utilities.CoreUtilities; -import com.denizenscript.denizencore.utilities.ReflectionHelper; -import com.denizenscript.denizencore.utilities.debugging.Debug; -import net.minecraft.core.MappedRegistry; -import net.minecraft.core.Registry; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.LivingEntity; -import org.bukkit.NamespacedKey; -import org.bukkit.craftbukkit.v1_21_R1.enchantments.CraftEnchantment; -import org.bukkit.craftbukkit.v1_21_R1.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R1.util.CraftNamespacedKey; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.event.entity.EntityDamageEvent; -import net.minecraft.world.item.enchantment.Enchantment.EnchantmentDefinition; - -import java.lang.reflect.Field; -import java.util.IdentityHashMap; -import java.util.Map; public class EnchantmentHelperImpl extends EnchantmentHelper { // TODO: 1.21: Enchantments were entirely reworked, need to update this diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityDataNameMapper.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityDataNameMapper.java similarity index 99% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityDataNameMapper.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityDataNameMapper.java index e5d71800f6..e0f4a7ac40 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityDataNameMapper.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityDataNameMapper.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_20.helpers; +package com.denizenscript.denizen.nms.v1_21.helpers; import com.denizenscript.denizencore.objects.ArgumentHelper; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java similarity index 97% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java index cf35f22ff7..dc3833030d 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java @@ -1,12 +1,12 @@ -package com.denizenscript.denizen.nms.v1_20.helpers; +package com.denizenscript.denizen.nms.v1_21.helpers; import com.denizenscript.denizen.Denizen; import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.interfaces.EntityHelper; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; -import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; -import com.denizenscript.denizen.nms.v1_20.impl.jnbt.CompoundTagImpl; -import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_21.impl.jnbt.CompoundTagImpl; +import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizen.utilities.packets.NetworkInterceptHelper; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/FishingHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java similarity index 94% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/FishingHelperImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java index b9e031e05c..5186b6695e 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/FishingHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java @@ -1,20 +1,18 @@ -package com.denizenscript.denizen.nms.v1_20.helpers; +package com.denizenscript.denizen.nms.v1_21.helpers; import com.denizenscript.denizen.nms.interfaces.FishingHelper; -import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.google.common.collect.Maps; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Mth; import net.minecraft.world.entity.projectile.FishingHook; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.storage.loot.BuiltInLootTables; import net.minecraft.world.level.storage.loot.LootParams; import net.minecraft.world.level.storage.loot.LootTable; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java similarity index 97% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java index 49ea0e901a..d6b3a20f23 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java @@ -1,14 +1,14 @@ -package com.denizenscript.denizen.nms.v1_20.helpers; +package com.denizenscript.denizen.nms.v1_21.helpers; import com.denizenscript.denizen.nms.interfaces.ItemHelper; import com.denizenscript.denizen.nms.util.PlayerProfile; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; import com.denizenscript.denizen.nms.util.jnbt.IntArrayTag; import com.denizenscript.denizen.nms.util.jnbt.Tag; -import com.denizenscript.denizen.nms.v1_20.Handler; -import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; -import com.denizenscript.denizen.nms.v1_20.impl.ProfileEditorImpl; -import com.denizenscript.denizen.nms.v1_20.impl.jnbt.CompoundTagImpl; +import com.denizenscript.denizen.nms.v1_21.Handler; +import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_21.impl.ProfileEditorImpl; +import com.denizenscript.denizen.nms.v1_21.impl.jnbt.CompoundTagImpl; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.utilities.FormattedTextHelper; import com.denizenscript.denizen.utilities.PaperAPITools; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PacketHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java similarity index 96% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PacketHelperImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java index f13a4ac0f3..a22795c98f 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PacketHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java @@ -1,11 +1,11 @@ -package com.denizenscript.denizen.nms.v1_20.helpers; +package com.denizenscript.denizen.nms.v1_21.helpers; import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.interfaces.PacketHelper; -import com.denizenscript.denizen.nms.v1_20.Handler; -import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; -import com.denizenscript.denizen.nms.v1_20.impl.SidebarImpl; -import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v1_21.Handler; +import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_21.impl.SidebarImpl; +import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.scripts.commands.entity.TeleportCommand; import com.denizenscript.denizen.utilities.FormattedTextHelper; import com.denizenscript.denizen.utilities.Utilities; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PlayerHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java similarity index 95% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PlayerHelperImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java index e570a6c7f4..b787b672ed 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PlayerHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java @@ -1,18 +1,18 @@ -package com.denizenscript.denizen.nms.v1_20.helpers; +package com.denizenscript.denizen.nms.v1_21.helpers; import com.denizenscript.denizen.Denizen; import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.abstracts.ImprovedOfflinePlayer; import com.denizenscript.denizen.nms.enums.CustomEntityType; import com.denizenscript.denizen.nms.interfaces.PlayerHelper; -import com.denizenscript.denizen.nms.v1_20.Handler; -import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; -import com.denizenscript.denizen.nms.v1_20.impl.ImprovedOfflinePlayerImpl; -import com.denizenscript.denizen.nms.v1_20.impl.ProfileEditorImpl; -import com.denizenscript.denizen.nms.v1_20.impl.entities.CraftFakePlayerImpl; -import com.denizenscript.denizen.nms.v1_20.impl.entities.EntityItemProjectileImpl; -import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.AbstractListenerPlayInImpl; -import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v1_21.Handler; +import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_21.impl.ImprovedOfflinePlayerImpl; +import com.denizenscript.denizen.nms.v1_21.impl.ProfileEditorImpl; +import com.denizenscript.denizen.nms.v1_21.impl.entities.CraftFakePlayerImpl; +import com.denizenscript.denizen.nms.v1_21.impl.entities.EntityItemProjectileImpl; +import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.AbstractListenerPlayInImpl; +import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.objects.LocationTag; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/WorldHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java similarity index 93% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/WorldHelperImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java index 7bb65da8be..eb5b0e3486 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/WorldHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java @@ -1,8 +1,8 @@ -package com.denizenscript.denizen.nms.v1_20.helpers; +package com.denizenscript.denizen.nms.v1_21.helpers; import com.denizenscript.denizen.nms.interfaces.WorldHelper; -import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; -import com.denizenscript.denizen.nms.v1_20.impl.BiomeNMSImpl; +import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_21.impl.BiomeNMSImpl; import com.denizenscript.denizen.objects.BiomeTag; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.mojang.datafixers.util.Pair; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/BiomeNMSImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java similarity index 96% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/BiomeNMSImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java index cb03d01abb..62194f31cc 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/BiomeNMSImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java @@ -1,8 +1,8 @@ -package com.denizenscript.denizen.nms.v1_20.impl; +package com.denizenscript.denizen.nms.v1_21.impl; import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.abstracts.BiomeNMS; -import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import net.minecraft.core.BlockPos; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ImprovedOfflinePlayerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java similarity index 95% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ImprovedOfflinePlayerImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java index d313cfb817..fc51727c5c 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ImprovedOfflinePlayerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java @@ -1,8 +1,8 @@ -package com.denizenscript.denizen.nms.v1_20.impl; +package com.denizenscript.denizen.nms.v1_21.impl; import com.denizenscript.denizen.nms.abstracts.ImprovedOfflinePlayer; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; -import com.denizenscript.denizen.nms.v1_20.impl.jnbt.CompoundTagImpl; +import com.denizenscript.denizen.nms.v1_21.impl.jnbt.CompoundTagImpl; import com.denizenscript.denizencore.utilities.debugging.Debug; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NbtAccounter; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ProfileEditorImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java similarity index 94% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ProfileEditorImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java index 3a7504730a..72561f5743 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/ProfileEditorImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java @@ -1,11 +1,11 @@ -package com.denizenscript.denizen.nms.v1_20.impl; +package com.denizenscript.denizen.nms.v1_21.impl; import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.abstracts.ProfileEditor; import com.denizenscript.denizen.nms.util.PlayerProfile; -import com.denizenscript.denizen.nms.v1_20.Handler; -import com.denizenscript.denizen.nms.v1_20.helpers.PacketHelperImpl; -import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v1_21.Handler; +import com.denizenscript.denizen.nms.v1_21.helpers.PacketHelperImpl; +import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.scripts.commands.entity.RenameCommand; import com.denizenscript.denizen.utilities.FormattedTextHelper; import com.denizenscript.denizencore.utilities.ReflectionHelper; @@ -16,7 +16,6 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundPlayerInfoRemovePacket; import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket; -import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import org.bukkit.Bukkit; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/SidebarImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/SidebarImpl.java similarity index 93% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/SidebarImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/SidebarImpl.java index ed33d38f76..e765aa1487 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/SidebarImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/SidebarImpl.java @@ -1,13 +1,12 @@ -package com.denizenscript.denizen.nms.v1_20.impl; +package com.denizenscript.denizen.nms.v1_21.impl; import com.denizenscript.denizen.nms.abstracts.Sidebar; -import com.denizenscript.denizen.nms.v1_20.Handler; -import com.denizenscript.denizen.nms.v1_20.helpers.PacketHelperImpl; +import com.denizenscript.denizen.nms.v1_21.Handler; +import com.denizenscript.denizen.nms.v1_21.helpers.PacketHelperImpl; import com.denizenscript.denizen.utilities.FormattedTextHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import net.md_5.bungee.api.ChatColor; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.numbers.StyledFormat; import net.minecraft.network.protocol.game.ClientboundSetDisplayObjectivePacket; import net.minecraft.network.protocol.game.ClientboundSetObjectivePacket; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/blocks/BlockLightImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/blocks/BlockLightImpl.java similarity index 96% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/blocks/BlockLightImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/blocks/BlockLightImpl.java index 3e71a51048..4e687e70e2 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/blocks/BlockLightImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/blocks/BlockLightImpl.java @@ -1,8 +1,8 @@ -package com.denizenscript.denizen.nms.v1_20.impl.blocks; +package com.denizenscript.denizen.nms.v1_21.impl.blocks; import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.abstracts.BlockLight; -import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; import com.denizenscript.denizen.utilities.blocks.ChunkCoordinate; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakeArrowImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakeArrowImpl.java similarity index 89% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakeArrowImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakeArrowImpl.java index a8289e9946..08bafa205d 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakeArrowImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakeArrowImpl.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_20.impl.entities; +package com.denizenscript.denizen.nms.v1_21.impl.entities; import com.denizenscript.denizen.nms.interfaces.FakeArrow; import net.minecraft.world.entity.projectile.AbstractArrow; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakePlayerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakePlayerImpl.java similarity index 93% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakePlayerImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakePlayerImpl.java index af6bf19f8e..0d622fc3ca 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakePlayerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakePlayerImpl.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_20.impl.entities; +package com.denizenscript.denizen.nms.v1_21.impl.entities; import com.denizenscript.denizen.nms.interfaces.FakePlayer; import com.denizenscript.denizen.nms.NMSHandler; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftItemProjectileImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftItemProjectileImpl.java similarity index 94% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftItemProjectileImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftItemProjectileImpl.java index d7caef22b4..02cf1c6013 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftItemProjectileImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftItemProjectileImpl.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_20.impl.entities; +package com.denizenscript.denizen.nms.v1_21.impl.entities; import com.denizenscript.denizen.nms.interfaces.ItemProjectile; import com.denizenscript.denizencore.utilities.ReflectionHelper; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakeArrowImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakeArrowImpl.java similarity index 89% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakeArrowImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakeArrowImpl.java index 76b87ffbff..8d34b29cdc 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakeArrowImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakeArrowImpl.java @@ -1,6 +1,6 @@ -package com.denizenscript.denizen.nms.v1_20.impl.entities; +package com.denizenscript.denizen.nms.v1_21.impl.entities; -import com.denizenscript.denizen.nms.v1_20.Handler; +import com.denizenscript.denizen.nms.v1_21.Handler; import com.denizenscript.denizencore.utilities.debugging.Debug; import net.minecraft.world.entity.projectile.SpectralArrow; import net.minecraft.world.item.ItemStack; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakePlayerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakePlayerImpl.java similarity index 84% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakePlayerImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakePlayerImpl.java index 0e109ab146..fe5641ea0f 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityFakePlayerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakePlayerImpl.java @@ -1,9 +1,9 @@ -package com.denizenscript.denizen.nms.v1_20.impl.entities; +package com.denizenscript.denizen.nms.v1_21.impl.entities; -import com.denizenscript.denizen.nms.v1_20.Handler; -import com.denizenscript.denizen.nms.v1_20.impl.network.fakes.FakeNetworkManagerImpl; -import com.denizenscript.denizen.nms.v1_20.impl.network.fakes.FakePlayerConnectionImpl; -import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v1_21.Handler; +import com.denizenscript.denizen.nms.v1_21.impl.network.fakes.FakeNetworkManagerImpl; +import com.denizenscript.denizen.nms.v1_21.impl.network.fakes.FakePlayerConnectionImpl; +import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; import com.mojang.authlib.GameProfile; import com.denizenscript.denizencore.utilities.debugging.Debug; import net.minecraft.network.Connection; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityItemProjectileImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java similarity index 94% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityItemProjectileImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java index 6f7e71237d..215a9667d9 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/EntityItemProjectileImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java @@ -1,6 +1,6 @@ -package com.denizenscript.denizen.nms.v1_20.impl.entities; +package com.denizenscript.denizen.nms.v1_21.impl.entities; -import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.google.common.base.Preconditions; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/jnbt/CompoundTagImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/jnbt/CompoundTagImpl.java similarity index 97% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/jnbt/CompoundTagImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/jnbt/CompoundTagImpl.java index 492d506d60..9344210285 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/jnbt/CompoundTagImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/jnbt/CompoundTagImpl.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_20.impl.jnbt; +package com.denizenscript.denizen.nms.v1_21.impl.jnbt; import com.denizenscript.denizen.nms.util.jnbt.*; import com.denizenscript.denizen.nms.util.jnbt.ByteArrayTag; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/fakes/FakeChannelImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/fakes/FakeChannelImpl.java similarity index 90% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/fakes/FakeChannelImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/fakes/FakeChannelImpl.java index 9fb1fb3fa1..f3b1953ca3 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/fakes/FakeChannelImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/fakes/FakeChannelImpl.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_20.impl.network.fakes; +package com.denizenscript.denizen.nms.v1_21.impl.network.fakes; import io.netty.channel.*; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/fakes/FakeNetworkManagerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/fakes/FakeNetworkManagerImpl.java similarity index 83% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/fakes/FakeNetworkManagerImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/fakes/FakeNetworkManagerImpl.java index 050f5cc033..ca0c9e0f7f 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/fakes/FakeNetworkManagerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/fakes/FakeNetworkManagerImpl.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_20.impl.network.fakes; +package com.denizenscript.denizen.nms.v1_21.impl.network.fakes; import net.minecraft.network.Connection; import net.minecraft.network.protocol.PacketFlow; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/fakes/FakePlayerConnectionImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/fakes/FakePlayerConnectionImpl.java similarity index 89% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/fakes/FakePlayerConnectionImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/fakes/FakePlayerConnectionImpl.java index dcc1321dee..4c4d11ac3c 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/fakes/FakePlayerConnectionImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/fakes/FakePlayerConnectionImpl.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_20.impl.network.fakes; +package com.denizenscript.denizen.nms.v1_21.impl.network.fakes; import net.minecraft.network.Connection; import net.minecraft.network.protocol.Packet; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/AbstractListenerPlayInImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java similarity index 96% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/AbstractListenerPlayInImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java index 9bdd4fe5e0..0479d09dc4 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/AbstractListenerPlayInImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java @@ -1,8 +1,8 @@ -package com.denizenscript.denizen.nms.v1_20.impl.network.handlers; +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers; import com.denizenscript.denizen.events.player.PlayerSendPacketScriptEvent; import com.denizenscript.denizen.nms.NMSHandler; -import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.mojang.authlib.GameProfile; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenNetworkManagerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java similarity index 96% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenNetworkManagerImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java index 22002c63e2..315941cac0 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenNetworkManagerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -1,10 +1,10 @@ -package com.denizenscript.denizen.nms.v1_20.impl.network.handlers; +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers; import com.denizenscript.denizen.events.player.PlayerReceivesPacketScriptEvent; import com.denizenscript.denizen.nms.NMSHandler; -import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; -import com.denizenscript.denizen.nms.v1_20.impl.ProfileEditorImpl; -import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet.*; +import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_21.impl.ProfileEditorImpl; +import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet.*; import com.denizenscript.denizen.utilities.Settings; import com.denizenscript.denizen.utilities.packets.NetworkInterceptCodeGen; import com.denizenscript.denizencore.utilities.CoreUtilities; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenPacketListenerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java similarity index 94% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenPacketListenerImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java index e387808535..f02f49a307 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenPacketListenerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java @@ -1,10 +1,10 @@ -package com.denizenscript.denizen.nms.v1_20.impl.network.handlers; +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers; import com.denizenscript.denizen.events.player.PlayerChangesSignScriptEvent; import com.denizenscript.denizen.events.player.PlayerSteersEntityScriptEvent; import com.denizenscript.denizen.nms.NMSHandler; -import com.denizenscript.denizen.nms.v1_20.impl.network.packets.PacketInResourcePackStatusImpl; -import com.denizenscript.denizen.nms.v1_20.impl.network.packets.PacketInSteerVehicleImpl; +import com.denizenscript.denizen.nms.v1_21.impl.network.packets.PacketInResourcePackStatusImpl; +import com.denizenscript.denizen.nms.v1_21.impl.network.packets.PacketInSteerVehicleImpl; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.objects.MaterialTag; import com.denizenscript.denizen.scripts.commands.entity.FakeEquipCommand; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/FakeBlockHelper.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java similarity index 96% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/FakeBlockHelper.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java index 08bb2a8721..3c67cb7901 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/FakeBlockHelper.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java @@ -1,7 +1,7 @@ -package com.denizenscript.denizen.nms.v1_20.impl.network.handlers; +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers; import com.denizenscript.denizen.Denizen; -import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.utilities.blocks.FakeBlock; import com.denizenscript.denizencore.utilities.debugging.Debug; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/ActionBarEventPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/ActionBarEventPacketHandlers.java similarity index 91% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/ActionBarEventPacketHandlers.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/ActionBarEventPacketHandlers.java index f2e3d6197c..92a520a679 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/ActionBarEventPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/ActionBarEventPacketHandlers.java @@ -1,8 +1,8 @@ -package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; import com.denizenscript.denizen.events.player.PlayerReceivesActionbarScriptEvent; -import com.denizenscript.denizen.nms.v1_20.Handler; -import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v1_21.Handler; +import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.objects.PlayerTag; import com.denizenscript.denizen.utilities.FormattedTextHelper; import com.denizenscript.denizencore.objects.core.ElementTag; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/AttachPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java similarity index 99% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/AttachPacketHandlers.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java index a11018b2c1..5535b73298 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/AttachPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java @@ -1,8 +1,8 @@ -package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; import com.denizenscript.denizen.nms.NMSHandler; -import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; -import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.utilities.entity.EntityAttachmentHelper; import com.denizenscript.denizencore.utilities.CoreConfiguration; import com.denizenscript.denizencore.utilities.ReflectionHelper; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/BlockLightPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/BlockLightPacketHandlers.java similarity index 86% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/BlockLightPacketHandlers.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/BlockLightPacketHandlers.java index 9534c9a786..2e53cedab2 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/BlockLightPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/BlockLightPacketHandlers.java @@ -1,8 +1,8 @@ -package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; import com.denizenscript.denizen.nms.abstracts.BlockLight; -import com.denizenscript.denizen.nms.v1_20.impl.blocks.BlockLightImpl; -import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v1_21.impl.blocks.BlockLightImpl; +import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket; import net.minecraft.network.protocol.game.ClientboundLightUpdatePacket; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DenizenPacketHandlerPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DenizenPacketHandlerPacketHandlers.java similarity index 92% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DenizenPacketHandlerPacketHandlers.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DenizenPacketHandlerPacketHandlers.java index bf1b80eb75..cd8abd286c 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DenizenPacketHandlerPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DenizenPacketHandlerPacketHandlers.java @@ -1,8 +1,8 @@ -package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; import com.denizenscript.denizen.events.player.PlayerReceivesMessageScriptEvent; -import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; -import com.denizenscript.denizen.nms.v1_20.impl.network.packets.PacketOutChatImpl; +import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v1_21.impl.network.packets.PacketOutChatImpl; import com.denizenscript.denizen.utilities.packets.DenizenPacketHandler; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DisguisePacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java similarity index 97% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DisguisePacketHandlers.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java index 9b69e18f98..ccee457bd2 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DisguisePacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java @@ -1,9 +1,9 @@ -package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; import com.denizenscript.denizen.nms.NMSHandler; -import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; -import com.denizenscript.denizen.nms.v1_20.helpers.PacketHelperImpl; -import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_21.helpers.PacketHelperImpl; +import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.objects.PlayerTag; import com.denizenscript.denizen.scripts.commands.player.DisguiseCommand; import com.denizenscript.denizen.utilities.entity.EntityAttachmentHelper; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/EntityMetadataPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/EntityMetadataPacketHandlers.java similarity index 95% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/EntityMetadataPacketHandlers.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/EntityMetadataPacketHandlers.java index 40cf0c42af..ee538c2b83 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/EntityMetadataPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/EntityMetadataPacketHandlers.java @@ -1,8 +1,8 @@ -package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; -import com.denizenscript.denizen.nms.v1_20.Handler; -import com.denizenscript.denizen.nms.v1_20.helpers.PacketHelperImpl; -import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v1_21.Handler; +import com.denizenscript.denizen.nms.v1_21.helpers.PacketHelperImpl; +import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.scripts.commands.entity.GlowCommand; import com.denizenscript.denizen.scripts.commands.entity.InvisibleCommand; import com.denizenscript.denizen.scripts.commands.entity.RenameCommand; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeBlocksPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeBlocksPacketHandlers.java similarity index 96% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeBlocksPacketHandlers.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeBlocksPacketHandlers.java index 49b1c856f5..ae32c92202 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeBlocksPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeBlocksPacketHandlers.java @@ -1,8 +1,8 @@ -package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; -import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo; -import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; -import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.FakeBlockHelper; +import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.FakeBlockHelper; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.utilities.blocks.ChunkCoordinate; import com.denizenscript.denizen.utilities.blocks.FakeBlock; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java similarity index 98% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java index 1853bdcd67..461d454bf6 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java @@ -1,6 +1,6 @@ -package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; -import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.scripts.commands.entity.FakeEquipCommand; import com.mojang.datafixers.util.Pair; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakePlayerPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakePlayerPacketHandlers.java similarity index 95% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakePlayerPacketHandlers.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakePlayerPacketHandlers.java index 9414abf8e5..dff04ee9a5 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakePlayerPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakePlayerPacketHandlers.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; /* import com.denizenscript.denizen.nms.NMSHandler; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java similarity index 96% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java index 2a36b36903..ecf90285ad 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java @@ -1,6 +1,6 @@ -package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; -import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.utilities.entity.HideEntitiesHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import net.minecraft.network.protocol.Packet; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/HideParticlesPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HideParticlesPacketHandlers.java similarity index 90% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/HideParticlesPacketHandlers.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HideParticlesPacketHandlers.java index 581d2916e6..f63494f896 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/HideParticlesPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HideParticlesPacketHandlers.java @@ -1,6 +1,6 @@ -package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; -import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.utilities.packets.HideParticles; import net.minecraft.network.protocol.game.ClientboundLevelParticlesPacket; import org.bukkit.Particle; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/PlayerHearsSoundEventPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/PlayerHearsSoundEventPacketHandlers.java similarity index 94% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/PlayerHearsSoundEventPacketHandlers.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/PlayerHearsSoundEventPacketHandlers.java index ed19ea10fb..041bf5ece1 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/PlayerHearsSoundEventPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/PlayerHearsSoundEventPacketHandlers.java @@ -1,7 +1,7 @@ -package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; import com.denizenscript.denizen.events.player.PlayerHearsSoundScriptEvent; -import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.protocol.game.ClientboundSoundEntityPacket; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java similarity index 96% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java index 41695a47a6..6164da7775 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java @@ -1,9 +1,9 @@ -package com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; import com.denizenscript.denizen.events.player.PlayerReceivesTablistUpdateScriptEvent; -import com.denizenscript.denizen.nms.v1_20.Handler; -import com.denizenscript.denizen.nms.v1_20.impl.ProfileEditorImpl; -import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v1_21.Handler; +import com.denizenscript.denizen.nms.v1_21.impl.ProfileEditorImpl; +import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.utilities.FormattedTextHelper; import com.denizenscript.denizencore.utilities.CoreUtilities; import com.denizenscript.denizencore.utilities.debugging.Debug; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketInResourcePackStatusImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketInResourcePackStatusImpl.java similarity index 86% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketInResourcePackStatusImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketInResourcePackStatusImpl.java index 1cfdc67205..9069658423 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketInResourcePackStatusImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketInResourcePackStatusImpl.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_20.impl.network.packets; +package com.denizenscript.denizen.nms.v1_21.impl.network.packets; import com.denizenscript.denizen.nms.interfaces.packets.PacketInResourcePackStatus; import net.minecraft.network.protocol.common.ServerboundResourcePackPacket; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketInSteerVehicleImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketInSteerVehicleImpl.java similarity index 88% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketInSteerVehicleImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketInSteerVehicleImpl.java index c5d73c5375..bbbb63ee6f 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketInSteerVehicleImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketInSteerVehicleImpl.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_20.impl.network.packets; +package com.denizenscript.denizen.nms.v1_21.impl.network.packets; import com.denizenscript.denizen.nms.interfaces.packets.PacketInSteerVehicle; import net.minecraft.network.protocol.game.ServerboundPlayerInputPacket; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketOutChatImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java similarity index 94% rename from v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketOutChatImpl.java rename to v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java index 8f188b6939..22f5d271c9 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketOutChatImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_20.impl.network.packets; +package com.denizenscript.denizen.nms.v1_21.impl.network.packets; import com.denizenscript.denizen.nms.interfaces.packets.PacketOutChat; import com.denizenscript.denizen.utilities.FormattedTextHelper; From d6e18431f7fca49d4d9fc2b92298461b69d4b5e2 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Thu, 13 Jun 2024 20:33:20 +0100 Subject: [PATCH 023/280] 1.21 part 6: Reflection mappings update --- .../denizen/nms/v1_21/ReflectionMappingsInfo.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java index bab8615d9f..058d4be58c 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java @@ -15,10 +15,10 @@ public class ReflectionMappingsInfo { public static String RecipeManager_byName = "e"; // net.minecraft.world.entity.Entity - public static String Entity_onGround = "aI"; + public static String Entity_onGround = "aG"; public static String Entity_DATA_SHARED_FLAGS_ID = "ap"; - public static String Entity_DATA_CUSTOM_NAME = "aS"; - public static String Entity_DATA_CUSTOM_NAME_VISIBLE = "aT"; + public static String Entity_DATA_CUSTOM_NAME = "aQ"; + public static String Entity_DATA_CUSTOM_NAME_VISIBLE = "aR"; // net.minecraft.world.entity.LivingEntity public static String LivingEntity_attackStrengthTicker = "aT"; @@ -26,17 +26,17 @@ public class ReflectionMappingsInfo { public static String LivingEntity_setLivingEntityFlag_method = "c"; // net.minecraft.world.entity.player.Player - public static String Player_DATA_PLAYER_ABSORPTION_ID = "d"; - public static String Player_DATA_PLAYER_MODE_CUSTOMISATION = "bV"; + public static String Player_DATA_PLAYER_ABSORPTION_ID = "e"; + public static String Player_DATA_PLAYER_MODE_CUSTOMISATION = "bX"; // net.minecraft.server.level.ServerPlayer public static String ServerPlayer_respawnForced = "dl"; // net.minecraft.world.entity.monster.EnderMan - public static String EnderMan_DATA_CREEPY = "ca"; + public static String EnderMan_DATA_CREEPY = "ce"; // net.minecraft.world.entity.monster.Zombie - public static String Zombie_inWaterTime = "ci"; + public static String Zombie_inWaterTime = "cq"; // net.minecraft.world.item.Item public static String Item_components = "c"; From 21d32845297cd7bd7cc92c85d64e6d50891e8c09 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Thu, 13 Jun 2024 20:48:43 +0100 Subject: [PATCH 024/280] 1.21 part 7: Fixes from testing --- .../denizen/nms/v1_21/helpers/PlayerHelperImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java index b787b672ed..55e625472d 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java @@ -464,7 +464,8 @@ public void refreshPlayer(Player player) { } } nmsPlayer.onUpdateAbilities(); - nmsPlayer.server.getPlayerList().sendAllPlayerInfo(nmsPlayer); nmsPlayer.server.getPlayerList().sendPlayerPermissionLevel(nmsPlayer); + nmsPlayer.server.getPlayerList().sendLevelInfo(nmsPlayer, nmsWorld); + nmsPlayer.server.getPlayerList().sendAllPlayerInfo(nmsPlayer); } } From 29d9eda9b8efadd9b4b84223c209093ae12badd6 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Fri, 14 Jun 2024 00:56:09 +0100 Subject: [PATCH 025/280] Cleanup `EntityHelper#getDamageTo` diff --- .../nms/v1_21/helpers/EntityHelperImpl.java | 35 +++++++++---------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java index dc3833030d..6cc795044d 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java @@ -114,34 +114,31 @@ public double getDamageTo(LivingEntity attacker, Entity target) { if (attrib != null) { damage = attrib.getValue(); } - net.minecraft.world.entity.Entity nmsTarget = target != null ? ((CraftEntity) target).getHandle() : null; - ServerLevel nmsWorld = ((CraftWorld) attacker.getWorld()).getHandle(); - DamageSource nmsSource = null; - if (nmsTarget != null) { - if (attacker instanceof CraftPlayer playerAttacker) { - nmsSource = nmsTarget.level().damageSources().playerAttack(playerAttacker.getHandle()); - } - else { - nmsSource = nmsTarget.level().damageSources().mobAttack(((CraftLivingEntity) attacker).getHandle()); - } - } - // TODO: 1.21: Target entity is required now, might need to change how the tag works? - if (nmsTarget != null && attacker.getEquipment() != null) { - damage = EnchantmentHelper.modifyDamage(nmsWorld, CraftItemStack.asNMSCopy(attacker.getEquipment().getItemInMainHand()), - ((CraftEntity) target).getHandle(), nmsSource, (float) damage); - } if (damage <= 0) { return 0; } if (target != null) { - if (nmsTarget.isInvulnerableTo(nmsSource)) { + DamageSource source; + net.minecraft.world.entity.Entity nmsTarget = ((CraftEntity) target).getHandle(); + ServerLevel nmsWorld = ((CraftWorld) attacker.getWorld()).getHandle(); + if (attacker instanceof CraftPlayer playerAttacker) { + source = nmsTarget.level().damageSources().playerAttack(playerAttacker.getHandle()); + } + else { + source = nmsTarget.level().damageSources().mobAttack(((CraftLivingEntity) attacker).getHandle()); + } + if (nmsTarget.isInvulnerableTo(source)) { return 0; } + // TODO: 1.21: Target entity is required now, might need to change how the tag works? + if (attacker.getEquipment() != null) { + damage = EnchantmentHelper.modifyDamage(nmsWorld, CraftItemStack.asNMSCopy(attacker.getEquipment().getItemInMainHand()), nmsTarget, source, (float) damage); + } if (!(nmsTarget instanceof net.minecraft.world.entity.LivingEntity livingTarget)) { return damage; } - damage = CombatRules.getDamageAfterAbsorb(livingTarget, (float) damage, nmsSource, (float) livingTarget.getArmorValue(), (float) livingTarget.getAttributeValue(Attributes.ARMOR_TOUGHNESS)); - float enchantDamageModifier = EnchantmentHelper.getDamageProtection(nmsWorld, livingTarget, nmsSource); + damage = CombatRules.getDamageAfterAbsorb(livingTarget, (float) damage, source, (float) livingTarget.getArmorValue(), (float) livingTarget.getAttributeValue(Attributes.ARMOR_TOUGHNESS)); + float enchantDamageModifier = EnchantmentHelper.getDamageProtection(nmsWorld, livingTarget, source); if (enchantDamageModifier > 0) { damage = CombatRules.getDamageAfterMagicAbsorb((float) damage, enchantDamageModifier); } From 0fb11b15711e5621317c174686a1dec3d40bbc0c Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Fri, 14 Jun 2024 02:03:23 -0700 Subject: [PATCH 026/280] some fixes for 1.21 --- .../denizen/objects/EntityTag.java | 10 ++-- .../nms/v1_21/helpers/EntityHelperImpl.java | 53 ++++++++++--------- .../handlers/AbstractListenerPlayInImpl.java | 24 ++++++++- .../handlers/DenizenNetworkManagerImpl.java | 27 +++++++++- 4 files changed, 82 insertions(+), 32 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java index 8c311356c6..7994f5a654 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java @@ -2488,10 +2488,8 @@ else if (object.getBukkitEntity() instanceof Hanging hanging) { // @group properties // @description // Returns the amount of damage the entity will do based on its held item. - // Optionally, specify a target entity to test how much damage will be done to that specific target - // (modified based on enchantments and that entity's armor/status/etc). - // Note that the result will not always be completely exact, as it doesn't take into account some specific factors - // (eg sweeping vs single-hit, etc). + // Optionally, specify a target entity to test how much damage will be done to that specific target (modified based on enchantments and that entity's armor/status/etc). + // Note that the result will not always be completely exact, as it doesn't take into account some specific factors (eg sweeping vs single-hit, etc). // --> registerSpawnedOnlyTag(ElementTag.class, "weapon_damage", (attribute, object) -> { Entity target = null; @@ -3893,6 +3891,10 @@ public void adjust(Mechanism mechanism) { // Makes a player-type entity interact with a block. // --> if (mechanism.matches("interact_with") && mechanism.requireObject(LocationTag.class)) { + if (!isPlayer()) { + mechanism.echoError("Only player-type entities can interact with blocks!"); + return; + } LocationTag interactLocation = mechanism.valueAsType(LocationTag.class); NMSHandler.entityHelper.forceInteraction(getPlayer(), interactLocation); } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java index 6cc795044d..20c341cf9e 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java @@ -117,31 +117,32 @@ public double getDamageTo(LivingEntity attacker, Entity target) { if (damage <= 0) { return 0; } - if (target != null) { - DamageSource source; - net.minecraft.world.entity.Entity nmsTarget = ((CraftEntity) target).getHandle(); - ServerLevel nmsWorld = ((CraftWorld) attacker.getWorld()).getHandle(); - if (attacker instanceof CraftPlayer playerAttacker) { - source = nmsTarget.level().damageSources().playerAttack(playerAttacker.getHandle()); - } - else { - source = nmsTarget.level().damageSources().mobAttack(((CraftLivingEntity) attacker).getHandle()); - } - if (nmsTarget.isInvulnerableTo(source)) { - return 0; - } - // TODO: 1.21: Target entity is required now, might need to change how the tag works? - if (attacker.getEquipment() != null) { - damage = EnchantmentHelper.modifyDamage(nmsWorld, CraftItemStack.asNMSCopy(attacker.getEquipment().getItemInMainHand()), nmsTarget, source, (float) damage); - } - if (!(nmsTarget instanceof net.minecraft.world.entity.LivingEntity livingTarget)) { - return damage; - } - damage = CombatRules.getDamageAfterAbsorb(livingTarget, (float) damage, source, (float) livingTarget.getArmorValue(), (float) livingTarget.getAttributeValue(Attributes.ARMOR_TOUGHNESS)); - float enchantDamageModifier = EnchantmentHelper.getDamageProtection(nmsWorld, livingTarget, source); - if (enchantDamageModifier > 0) { - damage = CombatRules.getDamageAfterMagicAbsorb((float) damage, enchantDamageModifier); - } + if (target == null) { + // Target is required as of MC 1.21, so if unspecified just assume target is equivalent to attacker + target = attacker; + } + DamageSource source; + net.minecraft.world.entity.Entity nmsTarget = ((CraftEntity) target).getHandle(); + ServerLevel nmsWorld = ((CraftWorld) attacker.getWorld()).getHandle(); + if (attacker instanceof CraftPlayer playerAttacker) { + source = nmsTarget.level().damageSources().playerAttack(playerAttacker.getHandle()); + } + else { + source = nmsTarget.level().damageSources().mobAttack(((CraftLivingEntity) attacker).getHandle()); + } + if (nmsTarget.isInvulnerableTo(source)) { + return 0; + } + if (attacker.getEquipment() != null) { + damage = EnchantmentHelper.modifyDamage(nmsWorld, CraftItemStack.asNMSCopy(attacker.getEquipment().getItemInMainHand()), nmsTarget, source, (float) damage); + } + if (!(nmsTarget instanceof net.minecraft.world.entity.LivingEntity livingTarget)) { + return damage; + } + damage = CombatRules.getDamageAfterAbsorb(livingTarget, (float) damage, source, (float) livingTarget.getArmorValue(), (float) livingTarget.getAttributeValue(Attributes.ARMOR_TOUGHNESS)); + float enchantDamageModifier = EnchantmentHelper.getDamageProtection(nmsWorld, livingTarget, source); + if (enchantDamageModifier > 0) { + damage = CombatRules.getDamageAfterMagicAbsorb((float) damage, enchantDamageModifier); } return damage; } @@ -164,7 +165,6 @@ public void setRiptide(Entity entity, boolean state) { @Override public void forceInteraction(Player player, Location location) { CraftPlayer craftPlayer = (CraftPlayer) player; - // TODO: 1.20.6: passing a null player isn't valid (and seemingly never was) - need to require HumanEntity in the mechanism ((CraftBlock) location.getBlock()).getNMS().useItemOn(craftPlayer.getHandle().getMainHandItem(), ((CraftWorld) location.getWorld()).getHandle(), craftPlayer.getHandle(), InteractionHand.MAIN_HAND, new BlockHitResult(new Vec3(0, 0, 0), null, CraftLocation.toBlockPosition(location), false)); @@ -628,6 +628,7 @@ else if (nmsSource instanceof net.minecraft.world.entity.LivingEntity nmsLivingE case CUSTOM -> sources.generic(); case FLY_INTO_WALL -> sources.flyIntoWall(); case HOT_FLOOR -> sources.hotFloor(); + case CAMPFIRE -> sources.campfire(); case CRAMMING -> sources.cramming(); case DRYOUT -> sources.dryOut(); case FREEZE -> sources.freeze(); diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java index 0479d09dc4..ccda64f0f3 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java @@ -6,6 +6,9 @@ import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.mojang.authlib.GameProfile; +import net.minecraft.CrashReport; +import net.minecraft.CrashReportCategory; +import net.minecraft.ReportedException; import net.minecraft.network.ConnectionProtocol; import net.minecraft.network.DisconnectionDetails; import net.minecraft.network.PacketSendListener; @@ -31,7 +34,6 @@ import java.util.Set; public class AbstractListenerPlayInImpl extends ServerGamePacketListenerImpl { - // TODO: 1.20.6: there are some new methods that should potentially be overriden public static final Field ServerGamePacketListenerImpl_chunkSender = ReflectionHelper.getFields(ServerGamePacketListenerImpl.class).get(ReflectionMappingsInfo.ServerGamePacketListenerImpl_chunkSender); @@ -100,6 +102,16 @@ public boolean isAcceptingMessages() { return oldListener.isAcceptingMessages(); } + @Override + public void fillCrashReport(CrashReport var0) { + oldListener.fillCrashReport(var0); + } + + @Override + public void fillListenerSpecificCrashDetails(CrashReport var0, CrashReportCategory var1) { + oldListener.fillListenerSpecificCrashDetails(var0, var1); + } + @Override public GameProfile getOwner() { return oldListener.getOwner(); @@ -519,4 +531,14 @@ public ServerPlayer getPlayer() { public PacketFlow flow() { return oldListener == null ? PacketFlow.SERVERBOUND : oldListener.flow(); } + + @Override + public void onPacketError(Packet var0, Exception var1) throws ReportedException { + oldListener.onPacketError(var0, var1); + } + + @Override + public DisconnectionDetails createDisconnectionInfo(Component var0, Throwable var1) { + return oldListener.createDisconnectionInfo(var0, var1); + } } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java index 315941cac0..36db992cc6 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -28,6 +28,7 @@ import net.minecraft.server.network.ServerCommonPacketListenerImpl; import net.minecraft.server.network.ServerGamePacketListenerImpl; import net.minecraft.server.network.ServerPlayerConnection; +import net.minecraft.util.debugchart.LocalSampleLogger; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.craftbukkit.v1_21_R1.CraftRegistry; @@ -49,7 +50,6 @@ import java.util.stream.Collectors; public class DenizenNetworkManagerImpl extends Connection { - // TODO: 1.20.6: there are some new methods that should potentially be overriden // TODO: 1.20.6: this can be cleaned up by decoding with the codec and returning the new packet public static , B extends FriendlyByteBuf> RegistryFriendlyByteBuf copyPacket(T original, StreamCodec packetCodec) { @@ -198,6 +198,16 @@ public void exceptionCaught(ChannelHandlerContext channelhandlercontext, Throwab oldManager.exceptionCaught(channelhandlercontext, throwable); } + @Override + public void setupInboundProtocol(ProtocolInfo protocolinfo, T t0) { + oldManager.setupInboundProtocol(protocolinfo, t0); + } + + @Override + public void setupOutboundProtocol(ProtocolInfo protocolinfo) { + oldManager.setupOutboundProtocol(protocolinfo); + } + @Override protected void channelRead0(ChannelHandlerContext channelhandlercontext, Packet packet) { if (oldManager.channel.isOpen()) { @@ -225,6 +235,11 @@ public void initiateServerboundPlayConnection(String s, int i, ClientLoginPacket oldManager.initiateServerboundPlayConnection(s, i, packetloginoutlistener); } + @Override + public void initiateServerboundPlayConnection(String s, int i, ProtocolInfo protocolinfo, ProtocolInfo protocolinfo1, C c0, boolean flag) { + oldManager.initiateServerboundPlayConnection(s, i, protocolinfo, protocolinfo1, c0, flag); + } + @Override public void send(Packet packet) { send(packet, null); @@ -424,6 +439,11 @@ public void disconnect(Component ichatbasecomponent) { oldManager.disconnect(ichatbasecomponent); } + @Override + public void disconnect(DisconnectionDetails disconnectiondetails) { + oldManager.disconnect(disconnectiondetails); + } + @Override public boolean isMemoryConnection() { return oldManager != null && oldManager.isMemoryConnection(); @@ -499,6 +519,11 @@ public float getAverageSentPackets() { return oldManager.getAverageSentPackets(); } + @Override + public void setBandwidthLogger(LocalSampleLogger localsamplelogger) { + oldManager.setBandwidthLogger(localsamplelogger); + } + ////////////////////////////////// //// Reflection Methods/Fields /////////// From dfcbad8b50d78b085ff5e54067d0fac7b590da2d Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Fri, 14 Jun 2024 02:06:46 -0700 Subject: [PATCH 027/280] mark version 1.3.1 and update readme version list --- README.md | 4 ++-- dist/pom.xml | 2 +- paper/pom.xml | 2 +- plugin/pom.xml | 2 +- pom.xml | 4 ++-- v1_17/pom.xml | 2 +- v1_18/pom.xml | 2 +- v1_19/pom.xml | 2 +- v1_20/pom.xml | 2 +- v1_21/pom.xml | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index cb5dbb6bc8..20c2ae65b2 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ The Denizen Scripting Language - Spigot Impl An implementation of the Denizen Scripting Language for Spigot servers, with strong Citizens interlinks to emphasize the power of using Denizen with NPCs! -**Version 1.3.0**: Compatible with Spigot 1.17.1, 1.18.2, 1.19.4, and 1.20.6! +**Version 1.3.1**: Compatible with Spigot 1.17.1, 1.18.2, 1.19.4, 1.20.6, and 1.21! **Learn about Denizen from the Beginner's guide:** https://guide.denizenscript.com/guides/background/index.html @@ -45,7 +45,7 @@ An implementation of the Denizen Scripting Language for Spigot servers, with str com.denizenscript denizen - 1.3.0-SNAPSHOT + 1.3.1-SNAPSHOT jar provided diff --git a/dist/pom.xml b/dist/pom.xml index 9a538d33d3..0ce5cb5745 100644 --- a/dist/pom.xml +++ b/dist/pom.xml @@ -5,7 +5,7 @@ com.denizenscript denizen-parent - 1.3.0-SNAPSHOT + 1.3.1-SNAPSHOT 4.0.0 diff --git a/paper/pom.xml b/paper/pom.xml index cc3bcbb0c3..9709d4f683 100644 --- a/paper/pom.xml +++ b/paper/pom.xml @@ -6,7 +6,7 @@ com.denizenscript denizen-paper - 1.3.0-SNAPSHOT + 1.3.1-SNAPSHOT diff --git a/plugin/pom.xml b/plugin/pom.xml index 64affb6f66..59645cda8a 100644 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -5,7 +5,7 @@ com.denizenscript denizen - 1.3.0-SNAPSHOT + 1.3.1-SNAPSHOT Denizen Scriptable Minecraft and Citizens2 diff --git a/pom.xml b/pom.xml index 9e568106d6..a5c28e2ada 100644 --- a/pom.xml +++ b/pom.xml @@ -6,13 +6,13 @@ com.denizenscript denizen-parent pom - 1.3.0-SNAPSHOT + 1.3.1-SNAPSHOT UTF-8 Unknown CUSTOM - 1.3.0 + 1.3.1 diff --git a/v1_17/pom.xml b/v1_17/pom.xml index 6f5030c4e3..36caa23f16 100644 --- a/v1_17/pom.xml +++ b/v1_17/pom.xml @@ -6,7 +6,7 @@ com.denizenscript denizen-v1_17 - 1.3.0-SNAPSHOT + 1.3.1-SNAPSHOT diff --git a/v1_18/pom.xml b/v1_18/pom.xml index 2a227d0ea4..bda527e371 100644 --- a/v1_18/pom.xml +++ b/v1_18/pom.xml @@ -6,7 +6,7 @@ com.denizenscript denizen-v1_18 - 1.3.0-SNAPSHOT + 1.3.1-SNAPSHOT diff --git a/v1_19/pom.xml b/v1_19/pom.xml index 1cd2bd799c..71d0daf7c3 100644 --- a/v1_19/pom.xml +++ b/v1_19/pom.xml @@ -6,7 +6,7 @@ com.denizenscript denizen-v1_19 - 1.3.0-SNAPSHOT + 1.3.1-SNAPSHOT diff --git a/v1_20/pom.xml b/v1_20/pom.xml index 61654c87cf..50b8cebb62 100644 --- a/v1_20/pom.xml +++ b/v1_20/pom.xml @@ -6,7 +6,7 @@ com.denizenscript denizen-v1_20 - 1.3.0-SNAPSHOT + 1.3.1-SNAPSHOT diff --git a/v1_21/pom.xml b/v1_21/pom.xml index 88a4daac96..6bb5c3eb84 100644 --- a/v1_21/pom.xml +++ b/v1_21/pom.xml @@ -6,7 +6,7 @@ com.denizenscript denizen-v1_21 - 1.3.0-SNAPSHOT + 1.3.1-SNAPSHOT From d5ee973b13302eb005862925b546cb8ccd68aa0a Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Fri, 14 Jun 2024 02:21:20 -0700 Subject: [PATCH 028/280] output new potion_effect_types names with consistent format --- .../com/denizenscript/denizen/tags/core/ServerTagBase.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/tags/core/ServerTagBase.java b/plugin/src/main/java/com/denizenscript/denizen/tags/core/ServerTagBase.java index 7a921ad8c3..d7448206c1 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/tags/core/ServerTagBase.java +++ b/plugin/src/main/java/com/denizenscript/denizen/tags/core/ServerTagBase.java @@ -874,7 +874,11 @@ else if (param.shouldBeType(EntityTag.class)) { ListTag potionEffects = new ListTag(); for (PotionEffectType potionEffect : PotionEffectType.values()) { if (potionEffect != null) { - potionEffects.add(potionEffect.getName()); + String name = potionEffect.getName(); + if (name.startsWith("minecraft:")) { + name = CoreUtilities.toUpperCase(name.substring("minecraft:".length())); + } + potionEffects.add(name); } } return potionEffects; From b4bdbb8123ff49a14a8b836b54b0459031a2ec25 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Sun, 16 Jun 2024 09:58:06 +0100 Subject: [PATCH 029/280] Fix Denizen recipe removal --- .../denizen/scripts/containers/core/ItemScriptHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptHelper.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptHelper.java index 72724c7c4f..77b01dd291 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptHelper.java @@ -58,7 +58,7 @@ public static void removeDenizenRecipes() { recipeIdToItemScript.clear(); Iterator recipeIterator = Bukkit.recipeIterator(); while (recipeIterator.hasNext()) { - if (recipeIterator.next() instanceof Keyed keyed && keyed.getKey().equals("denizen")) { + if (recipeIterator.next() instanceof Keyed keyed && keyed.getKey().getNamespace().equals("denizen")) { recipeIterator.remove(); } } From a72cadcdc35c57a5782a6b77eeea694d9a4eead1 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Wed, 19 Jun 2024 10:04:54 +0100 Subject: [PATCH 030/280] `CustomNBT`: more 1.20.6 updates (#2627) * `CustomNBT` handling fixes * `CompoundTag#getCompound` * Revert redundant change --- .../denizen/nms/interfaces/ItemHelper.java | 2 +- .../denizen/nms/util/jnbt/CompoundTag.java | 4 + .../nms/util/jnbt/CompoundTagBuilder.java | 4 + .../denizen/utilities/nbt/CustomNBT.java | 110 ++++++------------ 4 files changed, 46 insertions(+), 74 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java index 96b63f72eb..4e017b2099 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java @@ -54,7 +54,7 @@ public CompoundTag getCustomData(ItemStack item) { // TODO: once 1.20 is the min } public ItemStack setCustomData(ItemStack item, CompoundTag data) { // TODO: once 1.20 is the minimum supported version, remove default impl - throw new UnsupportedOperationException(); + return setNbtData(item, data); } public ItemStack setPartialOldNbt(ItemStack item, CompoundTag oldTag) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/util/jnbt/CompoundTag.java b/plugin/src/main/java/com/denizenscript/denizen/nms/util/jnbt/CompoundTag.java index 9adc1eea15..a78fb158ff 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/util/jnbt/CompoundTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/util/jnbt/CompoundTag.java @@ -85,6 +85,10 @@ public CompoundTagBuilder createBuilder() { return new CompoundTagBuilder(new HashMap<>(value)); } + public CompoundTag getCompound(String key) { + return value.get(key) instanceof CompoundTag compoundTag ? compoundTag : null; + } + /** * Get a byte array named with the given key. *

diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/util/jnbt/CompoundTagBuilder.java b/plugin/src/main/java/com/denizenscript/denizen/nms/util/jnbt/CompoundTagBuilder.java index 1e0ef99a22..dadb75f56b 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/util/jnbt/CompoundTagBuilder.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/util/jnbt/CompoundTagBuilder.java @@ -210,6 +210,10 @@ public static CompoundTagBuilder create() { return new CompoundTagBuilder(); } + public static CompoundTagBuilder create(CompoundTag tag) { + return tag == null ? new CompoundTagBuilder() : tag.createBuilder(); + } + private static void checkNotNull(Object object) { if (object == null) { throw new NullPointerException(); diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/nbt/CustomNBT.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/nbt/CustomNBT.java index 30155e0460..6106a4423b 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/nbt/CustomNBT.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/nbt/CustomNBT.java @@ -2,6 +2,7 @@ import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; +import com.denizenscript.denizen.nms.util.jnbt.CompoundTagBuilder; import com.denizenscript.denizen.nms.util.jnbt.JNBTListTag; import com.denizenscript.denizen.nms.util.jnbt.StringTag; import com.denizenscript.denizen.objects.properties.entity.EntityDisabledSlots.Action; @@ -74,19 +75,11 @@ public static ItemStack addCustomNBT(ItemStack itemStack, String key, String val if (itemStack == null || itemStack.getType() == Material.AIR) { return null; } - CompoundTag compoundTag = NMSHandler.itemHelper.getNbtData(itemStack); - CompoundTag denizenTag; - if (compoundTag.getValue().containsKey(basekey)) { - denizenTag = (CompoundTag) compoundTag.getValue().get(basekey); - } - else { - denizenTag = NMSHandler.instance.createCompoundTag(new HashMap<>()); - } - // Add custom NBT - denizenTag = denizenTag.createBuilder().putString(CoreUtilities.toLowerCase(key), value).build(); - compoundTag = compoundTag.createBuilder().put(basekey, denizenTag).build(); - // Write tag back - return NMSHandler.itemHelper.setNbtData(itemStack, compoundTag); + CompoundTag customData = NMSHandler.itemHelper.getCustomData(itemStack); + CompoundTagBuilder denizenDataBuilder = CompoundTagBuilder.create(customData != null ? customData.getCompound(basekey) : null); + CompoundTag denizenData = denizenDataBuilder.putString(CoreUtilities.toLowerCase(key), value).build(); + customData = CompoundTagBuilder.create(customData).put(basekey, denizenData).build(); + return NMSHandler.itemHelper.setCustomData(itemStack, customData); } public static ItemStack clearNBT(ItemStack itemStack, String key) { @@ -103,54 +96,50 @@ public static ItemStack removeCustomNBT(ItemStack itemStack, String key, String if (itemStack == null || itemStack.getType() == Material.AIR) { return null; } - CompoundTag compoundTag = NMSHandler.itemHelper.getNbtData(itemStack); - CompoundTag denizenTag; - if (compoundTag.getValue().containsKey(basekey)) { - denizenTag = (CompoundTag) compoundTag.getValue().get(basekey); + CompoundTag customData = NMSHandler.itemHelper.getCustomData(itemStack); + if (customData == null) { + return itemStack; } - else { + CompoundTag denizenData = customData.getCompound(basekey); + if (denizenData == null) { return itemStack; } - // Remove custom NBT - denizenTag = denizenTag.createBuilder().remove(CoreUtilities.toLowerCase(key)).build(); - if (denizenTag.getValue().isEmpty()) { - compoundTag = compoundTag.createBuilder().remove(basekey).build(); + denizenData = denizenData.createBuilder().remove(CoreUtilities.toLowerCase(key)).build(); + if (denizenData.isEmpty()) { + customData = customData.createBuilder().remove(basekey).build(); } else { - compoundTag = compoundTag.createBuilder().put(basekey, denizenTag).build(); + customData = customData.createBuilder().put(basekey, denizenData).build(); } - // Write tag back - return NMSHandler.itemHelper.setNbtData(itemStack, compoundTag); + return NMSHandler.itemHelper.setCustomData(itemStack, customData.isEmpty() ? null : customData); } public static boolean hasCustomNBT(ItemStack itemStack, String key, String basekey) { if (itemStack == null || itemStack.getType() == Material.AIR) { return false; } - CompoundTag compoundTag = NMSHandler.itemHelper.getNbtData(itemStack); - CompoundTag denizenTag; - if (compoundTag.getValue().containsKey(basekey)) { - denizenTag = (CompoundTag) compoundTag.getValue().get(basekey); - } - else { + CompoundTag customData = NMSHandler.itemHelper.getCustomData(itemStack); + if (customData == null) { return false; } - return denizenTag.getValue().containsKey(CoreUtilities.toLowerCase(key)); + CompoundTag denizenData = customData.getCompound(basekey); + return denizenData != null && denizenData.containsKey(CoreUtilities.toLowerCase(key)); } public static String getCustomNBT(ItemStack itemStack, String key, String basekey) { if (itemStack == null || itemStack.getType() == Material.AIR || key == null) { return null; } - CompoundTag compoundTag = NMSHandler.itemHelper.getNbtData(itemStack); - if (compoundTag.getValue().containsKey(basekey)) { - CompoundTag denizenTag = (CompoundTag) compoundTag.getValue().get(basekey); - String lowerKey = CoreUtilities.toLowerCase(key); - if (denizenTag.containsKey(lowerKey)) { - return denizenTag.getString(lowerKey); - } + CompoundTag customData = NMSHandler.itemHelper.getCustomData(itemStack); + if (customData == null) { + return null; + } + CompoundTag denizenData = customData.getCompound(basekey); + if (denizenData == null) { + return null; } - return null; + String lowerKey = CoreUtilities.toLowerCase(key); + return denizenData.containsKey(lowerKey) ? denizenData.getString(lowerKey) : null; } public static List listNBT(ItemStack itemStack, String basekey) { @@ -158,23 +147,16 @@ public static List listNBT(ItemStack itemStack, String basekey) { if (itemStack == null || itemStack.getType() == Material.AIR) { return nbt; } - CompoundTag compoundTag = NMSHandler.itemHelper.getNbtData(itemStack); - if (compoundTag.getValue().containsKey(basekey)) { - CompoundTag denizenTag = (CompoundTag) compoundTag.getValue().get(basekey); - nbt.addAll(denizenTag.getValue().keySet()); + CompoundTag customData = NMSHandler.itemHelper.getCustomData(itemStack); + if (customData == null) { + return nbt; } - return nbt; - } - - public static void addCustomNBT(Entity entity, String key, String value) { - if (entity == null) { - return; + CompoundTag denizenData = customData.getCompound(basekey); + if (denizenData == null) { + return nbt; } - CompoundTag compoundTag = NMSHandler.entityHelper.getNbtData(entity); - // Add custom NBT - compoundTag = compoundTag.createBuilder().putString(key, value).build(); - // Write tag back - NMSHandler.entityHelper.setNbtData(entity, compoundTag); + nbt.addAll(denizenData.getValue().keySet()); + return nbt; } public static void addCustomNBT(Entity entity, String key, int value) { @@ -199,24 +181,6 @@ public static void removeCustomNBT(Entity entity, String key) { NMSHandler.entityHelper.setNbtData(entity, compoundTag); } - public static boolean hasCustomNBT(Entity entity, String key) { - if (entity == null) { - return false; - } - CompoundTag compoundTag = NMSHandler.entityHelper.getNbtData(entity); - // Check for key - return compoundTag.getValue().containsKey(key); - } - - public static String getCustomNBT(Entity entity, String key) { - if (entity == null) { - return null; - } - CompoundTag compoundTag = NMSHandler.entityHelper.getNbtData(entity); - // Return contents of the tag - return compoundTag.getString(key); - } - public static int getCustomIntNBT(Entity entity, String key) { if (entity == null) { return 0; From 7364c0fafe5ac4b983c446f0d4d29c87fd25b67d Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Thu, 20 Jun 2024 10:00:03 +0100 Subject: [PATCH 031/280] Fix getting custom brewing recipes on 1.20.6+ --- .../denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java | 2 +- .../denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java index 7fcf984016..5c45a910ed 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java @@ -578,7 +578,7 @@ public boolean isValidMix(ItemStack input, ItemStack ingredient) { @Override public Map getCustomBrewingRecipes() { if (customBrewingRecipes == null) { - customBrewingRecipes = Maps.transformValues((Map) ReflectionHelper.getFieldValue(PotionBrewing.class, "CUSTOM_MIXES", null), paperMix -> { + customBrewingRecipes = Maps.transformValues((Map) ReflectionHelper.getFieldValue(PotionBrewing.class, "customMixes", MinecraftServer.getServer().potionBrewing()), paperMix -> { if (PaperPotionMix_CLASS == null) { PaperPotionMix_CLASS = paperMix.getClass(); } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java index d6b3a20f23..a651ee2c5b 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java @@ -578,7 +578,7 @@ public boolean isValidMix(ItemStack input, ItemStack ingredient) { @Override public Map getCustomBrewingRecipes() { if (customBrewingRecipes == null) { - customBrewingRecipes = Maps.transformValues((Map) ReflectionHelper.getFieldValue(PotionBrewing.class, "CUSTOM_MIXES", null), paperMix -> { + customBrewingRecipes = Maps.transformValues((Map) ReflectionHelper.getFieldValue(PotionBrewing.class, "customMixes", MinecraftServer.getServer().potionBrewing()), paperMix -> { if (PaperPotionMix_CLASS == null) { PaperPotionMix_CLASS = paperMix.getClass(); } From 2131db797d436e7188b081a7404b4fce95a19dda Mon Sep 17 00:00:00 2001 From: hyper <39167664+heypr@users.noreply.github.com> Date: Mon, 24 Jun 2024 06:24:25 -0400 Subject: [PATCH 032/280] `EntityTag.equipment_drop_chance` property (#2614) * Initial commit. * Update EntityEquipmentDropChance.java * Update meta * Fixed meta, removed checks, added mob check * Remove unneeded check * Java naming stuff, remove unneeded check, changed meta * Updated key names * Update property key names too * Update names (again) * Updated meta * Added maptag explanation & tag example --- .../objects/properties/PropertyRegistry.java | 1 + .../entity/EntityEquipmentDropChance.java | 85 +++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityEquipmentDropChance.java diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java index 26ebc514cc..dbcb0e6043 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java @@ -76,6 +76,7 @@ public static void registerMainProperties() { } PropertyParser.registerProperty(EntityDropsItem.class, EntityTag.class); PropertyParser.registerProperty(EntityEquipment.class, EntityTag.class); + PropertyParser.registerProperty(EntityEquipmentDropChance.class, EntityTag.class); if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { PropertyParser.registerProperty(EntityExploredLocations.class, EntityTag.class); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityEquipmentDropChance.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityEquipmentDropChance.java new file mode 100644 index 0000000000..02cf2c3efe --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityEquipmentDropChance.java @@ -0,0 +1,85 @@ +package com.denizenscript.denizen.objects.properties.entity; + +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.objects.core.MapTag; +import org.bukkit.entity.Mob; +import org.bukkit.inventory.EntityEquipment; + +public class EntityEquipmentDropChance extends EntityProperty { + + // <--[property] + // @object EntityTag + // @name equipment_drop_chance + // @input MapTag + // @description + // Controls the chance of each piece of equipment dropping when the entity dies. + // A drop chance of 0 will prevent the item from dropping, a drop chance of 1 will always drop the item if killed by a player, and a drop chance of higher than 1 will always drop the item no matter what the entity was killed by. + // A map of equipment slots to drop chances, with keys "head", "chest", "legs", "feet", "hand", and "off_hand". + // + // @tag-example + // # Use to narrate the drop chances of a zombie's equipment: + // - narrate <[zombie].equipment_drop_chance> + // + // @mechanism-example + // # Use to prevent a zombie from dropping any of its equipped items, no matter what: + // - adjust <[zombie]> equipment_drop_chance:[head=0;chest=0;legs=0;feet=0;hand=0;off_hand=0] + // + // --> + + public static boolean describes(EntityTag entity) { + return entity.getBukkitEntity() instanceof Mob; + } + + @Override + public MapTag getPropertyValue() { + EntityEquipment equipment = getLivingEntity().getEquipment(); + MapTag map = new MapTag(); + map.putObject("head", new ElementTag(equipment.getHelmetDropChance())); + map.putObject("chest", new ElementTag(equipment.getChestplateDropChance())); + map.putObject("legs", new ElementTag(equipment.getLeggingsDropChance())); + map.putObject("feet", new ElementTag(equipment.getBootsDropChance())); + map.putObject("hand", new ElementTag(equipment.getItemInMainHandDropChance())); + map.putObject("off_hand", new ElementTag(equipment.getItemInOffHandDropChance())); + return map; + } + + @Override + public void setPropertyValue(MapTag map, Mechanism mechanism) { + EntityEquipment equipment = getLivingEntity().getEquipment(); + ElementTag head = map.getElement("head"); + ElementTag chest = map.getElement("chest"); + ElementTag legs = map.getElement("legs"); + ElementTag feet = map.getElement("feet"); + ElementTag hand = map.getElement("hand"); + ElementTag offHand = map.getElement("off_hand"); + if (head != null) { + equipment.setHelmetDropChance(head.asFloat()); + } + if (chest != null) { + equipment.setChestplateDropChance(chest.asFloat()); + } + if (legs != null) { + equipment.setLeggingsDropChance(legs.asFloat()); + } + if (feet != null) { + equipment.setBootsDropChance(feet.asFloat()); + } + if (hand != null) { + equipment.setItemInMainHandDropChance(hand.asFloat()); + } + if (offHand != null) { + equipment.setItemInOffHandDropChance(offHand.asFloat()); + } + } + + @Override + public String getPropertyId() { + return "equipment_drop_chance"; + } + + public static void register() { + autoRegister("equipment_drop_chance", EntityEquipmentDropChance.class, MapTag.class, false); + } +} From a4e70e5fdfaa7c43820e8b45312dfa2bfaa846e5 Mon Sep 17 00:00:00 2001 From: Brando! <63469489+BreadcrumbIsTaken@users.noreply.github.com> Date: Mon, 24 Jun 2024 03:35:16 -0700 Subject: [PATCH 033/280] Add plaintext "gui" inventory matchable. (#2628) --- .../com/denizenscript/denizen/events/BukkitScriptEvent.java | 2 +- .../java/com/denizenscript/denizen/objects/InventoryTag.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/BukkitScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/BukkitScriptEvent.java index 601a52da4a..6fbccb3db7 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/BukkitScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/BukkitScriptEvent.java @@ -162,7 +162,7 @@ public static boolean couldMatchEnum(String text, final Enum[] enumVals) { return false; } - public static HashSet inventoryCouldMatchableText = new HashSet<>(List.of("inventory", "notable", "note")); + public static HashSet inventoryCouldMatchableText = new HashSet<>(List.of("inventory", "notable", "note", "gui")); public static HashSet inventoryCouldMatchPrefixes = new HashSet<>(List.of("inventory_flagged")); public static boolean couldMatchInventory(String text) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/InventoryTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/InventoryTag.java index 96fcb6ede7..f1aeb69a61 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/InventoryTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/InventoryTag.java @@ -88,6 +88,7 @@ public class InventoryTag implements ObjectTag, Notable, Adjustable, FlaggableOb // Inventory note name: matches if the inventory is noted with the given name, using advanced matchers. // Inventory type: matches if the inventory is of a given type, using advanced matchers. // "inventory_flagged:": a Flag Matchable for InventoryTag flags. + // "gui" plaintext: matches if the inventory is a GUI (see <@link language inventory script containers>). // // --> @@ -2593,6 +2594,9 @@ public boolean advancedMatches(String comparedto) { if (matcherLow.startsWith("inventory_flagged:")) { return flagTracker != null && BukkitScriptEvent.coreFlaggedCheck(comparedto.substring("inventory_flagged:".length()), flagTracker); } + if (matcherLow.equals("gui")) { + return InventoryScriptHelper.isGUI(getInventory()); + } ScriptEvent.MatchHelper matcher = BukkitScriptEvent.createMatcher(comparedto); return compareInventoryToMatch(matcher); } From dc127eb0396ded66dc4f8d93c5c65c2210698426 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Mon, 24 Jun 2024 14:15:04 +0100 Subject: [PATCH 034/280] Fix vehicle events --- paper/pom.xml | 5 ---- .../denizen/events/BukkitScriptEvent.java | 8 ++--- .../denizen/events/ScriptEventRegistry.java | 4 +-- .../EntityEntersVehicleScriptEvent.java | 16 ++++------ .../entity/EntityExitsVehicleScriptEvent.java | 16 ++++------ .../denizen/nms/interfaces/EntityHelper.java | 29 +++++++++++++++++-- .../nms/v1_17/helpers/EntityHelperImpl.java | 28 ++++++++++++++++++ .../nms/v1_18/helpers/EntityHelperImpl.java | 28 ++++++++++++++++++ .../nms/v1_19/helpers/EntityHelperImpl.java | 28 ++++++++++++++++++ 9 files changed, 128 insertions(+), 34 deletions(-) diff --git a/paper/pom.xml b/paper/pom.xml index 9709d4f683..dc4f11db93 100644 --- a/paper/pom.xml +++ b/paper/pom.xml @@ -13,11 +13,6 @@ papermc https://repo.papermc.io/repository/maven-public/ - - - sonatype-oss-snapshots1 - https://s01.oss.sonatype.org/content/repositories/snapshots/ - diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/BukkitScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/BukkitScriptEvent.java index 6fbccb3db7..e5fc88d214 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/BukkitScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/BukkitScriptEvent.java @@ -559,10 +559,10 @@ public void fire(Event event) { @Override public ObjectTag getContext(String name) { - switch (name) { - case "reflect_event": return currentEvent == null ? null : new JavaReflectedObjectTag(currentEvent); - } - return super.getContext(name); + return switch (name) { + case "reflect_event" -> currentEvent == null ? null : new JavaReflectedObjectTag(currentEvent); + default -> super.getContext(name); + }; } @Override diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java index 2cd4d49a20..c9d12c3897 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java @@ -113,9 +113,9 @@ public static void registerMainEvents() { ScriptEvent.registerScriptEvent(EntityDespawnScriptEvent.class); ScriptEvent.registerScriptEvent(EntityDropsItemScriptEvent.class); ScriptEvent.registerScriptEvent(EntityEntersPortalScriptEvent.class); - ScriptEvent.registerScriptEvent(EntityEntersVehicleScriptEvent.class); + ScriptEvent.registerScriptEvent(NMSHandler.entityHelper.getEntersVehicleEventImpl()); ScriptEvent.registerScriptEvent(EntityExitsPortalScriptEvent.class); - ScriptEvent.registerScriptEvent(EntityExitsVehicleScriptEvent.class); + ScriptEvent.registerScriptEvent(NMSHandler.entityHelper.getExistsVehicleEventImpl()); ScriptEvent.registerScriptEvent(EntityExplodesScriptEvent.class); ScriptEvent.registerScriptEvent(EntityExplosionPrimesScriptEvent.class); ScriptEvent.registerScriptEvent(EntityFoodLevelChangeScriptEvent.class); diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityEntersVehicleScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityEntersVehicleScriptEvent.java index c70a6db86a..ed998cd18c 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityEntersVehicleScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityEntersVehicleScriptEvent.java @@ -1,13 +1,13 @@ package com.denizenscript.denizen.events.entity; +import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; -import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; -import org.bukkit.event.EventHandler; +import org.bukkit.entity.Entity; import org.bukkit.event.Listener; -import org.spigotmc.event.entity.EntityMountEvent; +import org.bukkit.event.entity.EntityEvent; import java.util.Arrays; import java.util.HashSet; @@ -43,8 +43,6 @@ public EntityEntersVehicleScriptEvent() { public EntityTag vehicle; public EntityTag entity; - // TODO: 1.20.6: EntityMountEvent changed packages, might need to register in version-specific modules? or reflection? - public EntityMountEvent event; public static HashSet notRelevantEnterables = new HashSet<>(Arrays.asList("notable", "cuboid", "biome", "bed", "portal")); @@ -90,11 +88,9 @@ else if (name.equals("entity")) { return super.getContext(name); } - @EventHandler - public void onEntityEntersVehicle(EntityMountEvent event) { - vehicle = new EntityTag(event.getMount()); - entity = new EntityTag(event.getEntity()); - this.event = event; + public void fire(EntityEvent event, Entity vehicle) { + this.entity = new EntityTag(event.getEntity()); + this.vehicle = new EntityTag(vehicle); fire(event); } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExitsVehicleScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExitsVehicleScriptEvent.java index 77ea1c478e..d5c34c2de0 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExitsVehicleScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExitsVehicleScriptEvent.java @@ -1,13 +1,13 @@ package com.denizenscript.denizen.events.entity; +import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; -import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; -import org.bukkit.event.EventHandler; +import org.bukkit.entity.Entity; import org.bukkit.event.Listener; -import org.spigotmc.event.entity.EntityDismountEvent; +import org.bukkit.event.entity.EntityEvent; public class EntityExitsVehicleScriptEvent extends BukkitScriptEvent implements Listener { @@ -40,8 +40,6 @@ public EntityExitsVehicleScriptEvent() { public EntityTag vehicle; public EntityTag entity; - // TODO: 1.20.6: EntityDismountEvent changed packages, might need to register in version-specific modules? or reflection? - public EntityDismountEvent event; @Override public boolean matches(ScriptPath path) { @@ -74,11 +72,9 @@ else if (name.equals("entity")) { return super.getContext(name); } - @EventHandler - public void onEntityExitsVehicle(EntityDismountEvent event) { - vehicle = new EntityTag(event.getDismounted()); - entity = new EntityTag(event.getEntity()); - this.event = event; + public void fire(EntityEvent event, Entity vehicle) { + this.entity = new EntityTag(event.getEntity()); + this.vehicle = new EntityTag(vehicle); fire(event); } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java index 832baea5a4..07f22c088e 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java @@ -1,5 +1,7 @@ package com.denizenscript.denizen.nms.interfaces; +import com.denizenscript.denizen.events.entity.EntityEntersVehicleScriptEvent; +import com.denizenscript.denizen.events.entity.EntityExitsVehicleScriptEvent; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.LocationTag; @@ -13,9 +15,8 @@ import org.bukkit.block.CreatureSpawner; import org.bukkit.block.data.BlockData; import org.bukkit.entity.*; -import org.bukkit.event.entity.EntityDamageByBlockEvent; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.*; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.meta.MapMeta; import org.bukkit.util.BoundingBox; @@ -476,4 +477,26 @@ public CompoundTag getRawNBT(Entity entity) { public void modifyRawNBT(Entity entity, CompoundTag tag) { throw new UnsupportedOperationException(); } + + public static class EntityEntersVehicleScriptEventImpl extends EntityEntersVehicleScriptEvent { + @EventHandler + public void onEntityMount(EntityMountEvent event) { + fire(event, event.getMount()); + } + } + + public Class getEntersVehicleEventImpl() { // TODO: once 1.20 is the minimum supported version, implement in the ScriptEvent class as usual + return EntityEntersVehicleScriptEventImpl.class; + } + + public static class EntityExistsVehicleScriptEventImpl extends EntityExitsVehicleScriptEvent { + @EventHandler + public void onEntityMount(EntityDismountEvent event) { + fire(event, event.getDismounted()); + } + } + + public Class getExistsVehicleEventImpl() { // TODO: once 1.20 is the minimum supported version, implement in the ScriptEvent class as usual + return EntityExistsVehicleScriptEventImpl.class; + } } diff --git a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/EntityHelperImpl.java b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/EntityHelperImpl.java index 4b7fbc345c..4454a61160 100644 --- a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/EntityHelperImpl.java +++ b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/EntityHelperImpl.java @@ -1,6 +1,8 @@ package com.denizenscript.denizen.nms.v1_17.helpers; import com.denizenscript.denizen.Denizen; +import com.denizenscript.denizen.events.entity.EntityEntersVehicleScriptEvent; +import com.denizenscript.denizen.events.entity.EntityExitsVehicleScriptEvent; import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.interfaces.EntityHelper; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; @@ -52,11 +54,14 @@ import org.bukkit.craftbukkit.v1_17_R1.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack; import org.bukkit.entity.*; +import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; import org.bukkit.util.BoundingBox; import org.bukkit.util.Vector; +import org.spigotmc.event.entity.EntityDismountEvent; +import org.spigotmc.event.entity.EntityMountEvent; import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; @@ -700,4 +705,27 @@ public void openHorseInventory(Player player, AbstractHorse horse) { net.minecraft.world.entity.animal.horse.AbstractHorse nmsHorse = ((CraftAbstractHorse) horse).getHandle(); ((CraftPlayer) player).getHandle().openHorseInventory(nmsHorse, nmsHorse.inventory); } + + public static class EntityEntersVehicleScriptEventImpl extends EntityEntersVehicleScriptEvent { + @EventHandler + public void onEntityMount(EntityMountEvent event) { + fire(event, event.getMount()); + } + } + + @Override + public Class getEntersVehicleEventImpl() { + return EntityEntersVehicleScriptEventImpl.class; + } + + public static class EntityExistsVehicleScriptEventImpl extends EntityExitsVehicleScriptEvent { + @EventHandler + public void onEntityMount(EntityDismountEvent event) { + fire(event, event.getDismounted()); + } + } + + public Class getExistsVehicleEventImpl() { + return EntityExistsVehicleScriptEventImpl.class; + } } diff --git a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/EntityHelperImpl.java b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/EntityHelperImpl.java index 66cac00e2a..7c344352ec 100644 --- a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/EntityHelperImpl.java +++ b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/EntityHelperImpl.java @@ -1,6 +1,8 @@ package com.denizenscript.denizen.nms.v1_18.helpers; import com.denizenscript.denizen.Denizen; +import com.denizenscript.denizen.events.entity.EntityEntersVehicleScriptEvent; +import com.denizenscript.denizen.events.entity.EntityExitsVehicleScriptEvent; import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.interfaces.EntityHelper; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; @@ -59,11 +61,14 @@ import org.bukkit.craftbukkit.v1_18_R2.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack; import org.bukkit.entity.*; +import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; import org.bukkit.util.BoundingBox; import org.bukkit.util.Vector; +import org.spigotmc.event.entity.EntityDismountEvent; +import org.spigotmc.event.entity.EntityMountEvent; import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; @@ -777,4 +782,27 @@ public void openHorseInventory(Player player, AbstractHorse horse) { net.minecraft.world.entity.animal.horse.AbstractHorse nmsHorse = ((CraftAbstractHorse) horse).getHandle(); ((CraftPlayer) player).getHandle().openHorseInventory(nmsHorse, nmsHorse.inventory); } + + public static class EntityEntersVehicleScriptEventImpl extends EntityEntersVehicleScriptEvent { + @EventHandler + public void onEntityMount(EntityMountEvent event) { + fire(event, event.getMount()); + } + } + + @Override + public Class getEntersVehicleEventImpl() { + return EntityEntersVehicleScriptEventImpl.class; + } + + public static class EntityExistsVehicleScriptEventImpl extends EntityExitsVehicleScriptEvent { + @EventHandler + public void onEntityMount(EntityDismountEvent event) { + fire(event, event.getDismounted()); + } + } + + public Class getExistsVehicleEventImpl() { + return EntityExistsVehicleScriptEventImpl.class; + } } diff --git a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/EntityHelperImpl.java b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/EntityHelperImpl.java index f63f60eaa1..ebf83548ad 100644 --- a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/EntityHelperImpl.java +++ b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/EntityHelperImpl.java @@ -1,6 +1,8 @@ package com.denizenscript.denizen.nms.v1_19.helpers; import com.denizenscript.denizen.Denizen; +import com.denizenscript.denizen.events.entity.EntityEntersVehicleScriptEvent; +import com.denizenscript.denizen.events.entity.EntityExitsVehicleScriptEvent; import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.interfaces.EntityHelper; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; @@ -68,11 +70,14 @@ import org.bukkit.craftbukkit.v1_19_R3.event.CraftEventFactory; import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack; import org.bukkit.entity.*; +import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; import org.bukkit.util.BoundingBox; import org.bukkit.util.Vector; +import org.spigotmc.event.entity.EntityDismountEvent; +import org.spigotmc.event.entity.EntityMountEvent; import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; @@ -830,4 +835,27 @@ public void openHorseInventory(Player player, AbstractHorse horse) { net.minecraft.world.entity.animal.horse.AbstractHorse nmsHorse = ((CraftAbstractHorse) horse).getHandle(); ((CraftPlayer) player).getHandle().openHorseInventory(nmsHorse, nmsHorse.inventory); } + + public static class EntityEntersVehicleScriptEventImpl extends EntityEntersVehicleScriptEvent { + @EventHandler + public void onEntityMount(EntityMountEvent event) { + fire(event, event.getMount()); + } + } + + @Override + public Class getEntersVehicleEventImpl() { + return EntityEntersVehicleScriptEventImpl.class; + } + + public static class EntityExistsVehicleScriptEventImpl extends EntityExitsVehicleScriptEvent { + @EventHandler + public void onEntityMount(EntityDismountEvent event) { + fire(event, event.getDismounted()); + } + } + + public Class getExistsVehicleEventImpl() { + return EntityExistsVehicleScriptEventImpl.class; + } } From 17efc4f1bdbbab2616ce199698868aa64e4c919e Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Mon, 24 Jun 2024 14:40:54 +0100 Subject: [PATCH 035/280] Fix Event naming --- .../events/entity/EntityEntersVehicleScriptEvent.java | 5 +++++ .../denizen/events/entity/EntityExitsVehicleScriptEvent.java | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityEntersVehicleScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityEntersVehicleScriptEvent.java index ed998cd18c..6a055bb01c 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityEntersVehicleScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityEntersVehicleScriptEvent.java @@ -88,6 +88,11 @@ else if (name.equals("entity")) { return super.getContext(name); } + @Override + public String getName() { // TODO: once 1.20 is the minimum supported version, remove + return "EntityEntersVehicleScriptEvent"; + } + public void fire(EntityEvent event, Entity vehicle) { this.entity = new EntityTag(event.getEntity()); this.vehicle = new EntityTag(vehicle); diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExitsVehicleScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExitsVehicleScriptEvent.java index d5c34c2de0..e8b150b821 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExitsVehicleScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExitsVehicleScriptEvent.java @@ -72,6 +72,11 @@ else if (name.equals("entity")) { return super.getContext(name); } + @Override + public String getName() { // TODO: once 1.20 is the minimum supported version, remove + return "EntityExitsVehicleScriptEvent"; + } + public void fire(EntityEvent event, Entity vehicle) { this.entity = new EntityTag(event.getEntity()); this.vehicle = new EntityTag(vehicle); From d12030df4476db6ccc7f40c4406d051661cb20a1 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Mon, 24 Jun 2024 14:48:09 +0100 Subject: [PATCH 036/280] Extra fix event names --- .../denizen/events/entity/EntityEntersVehicleScriptEvent.java | 2 +- .../denizen/events/entity/EntityExitsVehicleScriptEvent.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityEntersVehicleScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityEntersVehicleScriptEvent.java index 6a055bb01c..b6db4c0487 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityEntersVehicleScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityEntersVehicleScriptEvent.java @@ -90,7 +90,7 @@ else if (name.equals("entity")) { @Override public String getName() { // TODO: once 1.20 is the minimum supported version, remove - return "EntityEntersVehicleScriptEvent"; + return "EntityEntersVehicle"; } public void fire(EntityEvent event, Entity vehicle) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExitsVehicleScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExitsVehicleScriptEvent.java index e8b150b821..223d15f122 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExitsVehicleScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExitsVehicleScriptEvent.java @@ -74,7 +74,7 @@ else if (name.equals("entity")) { @Override public String getName() { // TODO: once 1.20 is the minimum supported version, remove - return "EntityExitsVehicleScriptEvent"; + return "EntityExitsVehicle"; } public void fire(EntityEvent event, Entity vehicle) { From 03e8daa9643d74e23ac331e0d0ba5904045b2bd9 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Mon, 24 Jun 2024 22:31:38 +0100 Subject: [PATCH 037/280] Spell the misspelled part --- .../denizenscript/denizen/events/ScriptEventRegistry.java | 2 +- .../denizenscript/denizen/nms/interfaces/EntityHelper.java | 6 +++--- .../denizen/nms/v1_17/helpers/EntityHelperImpl.java | 6 +++--- .../denizen/nms/v1_18/helpers/EntityHelperImpl.java | 6 +++--- .../denizen/nms/v1_19/helpers/EntityHelperImpl.java | 6 +++--- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java index c9d12c3897..f124f602b1 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java @@ -115,7 +115,7 @@ public static void registerMainEvents() { ScriptEvent.registerScriptEvent(EntityEntersPortalScriptEvent.class); ScriptEvent.registerScriptEvent(NMSHandler.entityHelper.getEntersVehicleEventImpl()); ScriptEvent.registerScriptEvent(EntityExitsPortalScriptEvent.class); - ScriptEvent.registerScriptEvent(NMSHandler.entityHelper.getExistsVehicleEventImpl()); + ScriptEvent.registerScriptEvent(NMSHandler.entityHelper.getExitsVehicleEventImpl()); ScriptEvent.registerScriptEvent(EntityExplodesScriptEvent.class); ScriptEvent.registerScriptEvent(EntityExplosionPrimesScriptEvent.class); ScriptEvent.registerScriptEvent(EntityFoodLevelChangeScriptEvent.class); diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java index 07f22c088e..a39d9b8813 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java @@ -489,14 +489,14 @@ public Class getEntersVehicleEventImpl return EntityEntersVehicleScriptEventImpl.class; } - public static class EntityExistsVehicleScriptEventImpl extends EntityExitsVehicleScriptEvent { + public static class EntityExitsVehicleScriptEventImpl extends EntityExitsVehicleScriptEvent { @EventHandler public void onEntityMount(EntityDismountEvent event) { fire(event, event.getDismounted()); } } - public Class getExistsVehicleEventImpl() { // TODO: once 1.20 is the minimum supported version, implement in the ScriptEvent class as usual - return EntityExistsVehicleScriptEventImpl.class; + public Class getExitsVehicleEventImpl() { // TODO: once 1.20 is the minimum supported version, implement in the ScriptEvent class as usual + return EntityExitsVehicleScriptEventImpl.class; } } diff --git a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/EntityHelperImpl.java b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/EntityHelperImpl.java index 4454a61160..76dd4081bc 100644 --- a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/EntityHelperImpl.java +++ b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/EntityHelperImpl.java @@ -718,14 +718,14 @@ public Class getEntersVehicleEventImpl return EntityEntersVehicleScriptEventImpl.class; } - public static class EntityExistsVehicleScriptEventImpl extends EntityExitsVehicleScriptEvent { + public static class EntityExitsVehicleScriptEventImpl extends EntityExitsVehicleScriptEvent { @EventHandler public void onEntityMount(EntityDismountEvent event) { fire(event, event.getDismounted()); } } - public Class getExistsVehicleEventImpl() { - return EntityExistsVehicleScriptEventImpl.class; + public Class getExitsVehicleEventImpl() { + return EntityExitsVehicleScriptEventImpl.class; } } diff --git a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/EntityHelperImpl.java b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/EntityHelperImpl.java index 7c344352ec..4668d1b31a 100644 --- a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/EntityHelperImpl.java +++ b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/EntityHelperImpl.java @@ -795,14 +795,14 @@ public Class getEntersVehicleEventImpl return EntityEntersVehicleScriptEventImpl.class; } - public static class EntityExistsVehicleScriptEventImpl extends EntityExitsVehicleScriptEvent { + public static class EntityExitsVehicleScriptEventImpl extends EntityExitsVehicleScriptEvent { @EventHandler public void onEntityMount(EntityDismountEvent event) { fire(event, event.getDismounted()); } } - public Class getExistsVehicleEventImpl() { - return EntityExistsVehicleScriptEventImpl.class; + public Class getExitsVehicleEventImpl() { + return EntityExitsVehicleScriptEventImpl.class; } } diff --git a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/EntityHelperImpl.java b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/EntityHelperImpl.java index ebf83548ad..3269e40f9f 100644 --- a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/EntityHelperImpl.java +++ b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/EntityHelperImpl.java @@ -848,14 +848,14 @@ public Class getEntersVehicleEventImpl return EntityEntersVehicleScriptEventImpl.class; } - public static class EntityExistsVehicleScriptEventImpl extends EntityExitsVehicleScriptEvent { + public static class EntityExitsVehicleScriptEventImpl extends EntityExitsVehicleScriptEvent { @EventHandler public void onEntityMount(EntityDismountEvent event) { fire(event, event.getDismounted()); } } - public Class getExistsVehicleEventImpl() { - return EntityExistsVehicleScriptEventImpl.class; + public Class getExitsVehicleEventImpl() { + return EntityExitsVehicleScriptEventImpl.class; } } From f6c3bac34fd666baaaa44f90940f9cb6ce6299de Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Tue, 25 Jun 2024 08:27:58 +0100 Subject: [PATCH 038/280] `playeffect`: legacy names handling (#2629) * `playeffect`: legacy names handling * Remove particle wrapper + renames * Unrelated small meta fixes --- .../entity/EntityTargetsScriptEvent.java | 4 +- .../denizenscript/denizen/nms/NMSHandler.java | 1 - .../denizen/nms/abstracts/ParticleHelper.java | 65 --------------- .../denizen/nms/interfaces/Particle.java | 36 -------- .../commands/world/PlayEffectCommand.java | 83 +++++++++++-------- .../utilities/BukkitImplDeprecations.java | 4 + .../denizen/utilities/LegacyNamingHelper.java | 39 +++++++++ .../utilities/LegacyParticleNaming.java | 43 ++++++++++ .../denizen/nms/v1_17/Handler.java | 1 - .../nms/v1_17/helpers/ParticleHelperImpl.java | 13 --- .../denizen/nms/v1_17/impl/ParticleImpl.java | 26 ------ .../denizen/nms/v1_18/Handler.java | 1 - .../denizen/nms/v1_19/Handler.java | 1 - .../denizen/nms/v1_20/Handler.java | 1 - .../denizen/nms/v1_21/Handler.java | 1 - 15 files changed, 138 insertions(+), 181 deletions(-) delete mode 100644 plugin/src/main/java/com/denizenscript/denizen/nms/abstracts/ParticleHelper.java delete mode 100644 plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/Particle.java create mode 100644 plugin/src/main/java/com/denizenscript/denizen/utilities/LegacyNamingHelper.java create mode 100644 plugin/src/main/java/com/denizenscript/denizen/utilities/LegacyParticleNaming.java delete mode 100644 v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/ParticleHelperImpl.java delete mode 100644 v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/impl/ParticleImpl.java diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityTargetsScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityTargetsScriptEvent.java index baa019d83a..c5b0412b33 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityTargetsScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityTargetsScriptEvent.java @@ -23,12 +23,12 @@ public class EntityTargetsScriptEvent extends BukkitScriptEvent implements Liste // // @Cancellable true // - // @Triggers when an entity targets a new entity - usually a hostile mob preparing to attack something. + // @Triggers when an entity targets a new entity (usually a hostile mob preparing to attack something), or un-targets one. // // @Context // returns the targeting entity. // returns the reason the entity changed targets. Refer to <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/event/entity/EntityTargetEvent.TargetReason.html>. - // returns the targeted entity. + // returns the targeted entity, if any. // // @Determine // EntityTag to make the entity target a different entity instead. diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java b/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java index b8bb558fa3..19a8def9e6 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java @@ -84,7 +84,6 @@ public static JavaPlugin getJavaPlugin() { public static FishingHelper fishingHelper; public static ItemHelper itemHelper; public static PacketHelper packetHelper; - public static ParticleHelper particleHelper; public static PlayerHelper playerHelper; public static WorldHelper worldHelper; public static EnchantmentHelper enchantmentHelper; diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/abstracts/ParticleHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/abstracts/ParticleHelper.java deleted file mode 100644 index 2c3b9888c6..0000000000 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/abstracts/ParticleHelper.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.denizenscript.denizen.nms.abstracts; - -import com.denizenscript.denizen.nms.NMSHandler; -import com.denizenscript.denizen.nms.NMSVersion; -import com.denizenscript.denizen.nms.interfaces.Particle; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class ParticleHelper { - - public ParticleHelper() { - for (org.bukkit.Particle particle : org.bukkit.Particle.values()) { - register(particle.name(), new Particle(particle)); - } - // TODO: 1.20.6: enum names are different now, can change to valueOf and let Spigot's runtime updating handle it - register("SMOKE", new Particle(org.bukkit.Particle.SMOKE_NORMAL)); - register("HUGE_EXPLOSION", new Particle(org.bukkit.Particle.EXPLOSION_HUGE)); - register("LARGE_EXPLODE", new Particle(org.bukkit.Particle.EXPLOSION_LARGE)); - register("BUBBLE", new Particle(org.bukkit.Particle.WATER_BUBBLE)); - register("SUSPEND", new Particle(org.bukkit.Particle.SUSPENDED)); - register("DEPTH_SUSPEND", new Particle(org.bukkit.Particle.SUSPENDED_DEPTH)); - register("CRIT", new Particle(org.bukkit.Particle.CRIT)); - register("MAGIC_CRIT", new Particle(org.bukkit.Particle.CRIT_MAGIC)); - register("MOB_SPELL", new Particle(org.bukkit.Particle.SPELL_MOB)); - // TODO: 1.20.6: this particle type was removed in favor of entity_effect now having a color option - if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_19)) { - register("MOB_SPELL_AMBIENT", new Particle(org.bukkit.Particle.SPELL_MOB_AMBIENT)); - } - register("INSTANT_SPELL", new Particle(org.bukkit.Particle.SPELL_INSTANT)); - register("WITCH_MAGIC", new Particle(org.bukkit.Particle.SPELL_WITCH)); - register("STEP_SOUND", new Particle(org.bukkit.Particle.HEART)); - register("EXPLODE", new Particle(org.bukkit.Particle.EXPLOSION_NORMAL)); - register("SPLASH", new Particle(org.bukkit.Particle.WATER_SPLASH)); - register("LARGE_SMOKE", new Particle(org.bukkit.Particle.SMOKE_LARGE)); - register("RED_DUST", new Particle(org.bukkit.Particle.REDSTONE)); - register("SNOWBALL_POOF", new Particle(org.bukkit.Particle.SNOWBALL)); - register("ANGRY_VILLAGER", new Particle(org.bukkit.Particle.VILLAGER_ANGRY)); - register("HAPPY_VILLAGER", new Particle(org.bukkit.Particle.VILLAGER_HAPPY)); - } - - public final Map particles = new HashMap<>(); - public final List visibleParticles = new ArrayList<>(); - - public void register(String name, Particle particle) { - particles.put(name.toUpperCase(), particle); - if (particle.isVisible()) { - visibleParticles.add(particle); - } - } - - public boolean hasParticle(String name) { - return particles.containsKey(name.toUpperCase()); - } - - public Particle getParticle(String name) { - return particles.get(name.toUpperCase()); - } - - public List getVisibleParticles() { - return visibleParticles; - } -} diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/Particle.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/Particle.java deleted file mode 100644 index 614e0cd10e..0000000000 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/Particle.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.denizenscript.denizen.nms.interfaces; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.util.Vector; - -public class Particle { - - public org.bukkit.Particle particle; - - public Particle(org.bukkit.Particle particle) { - this.particle = particle; - } - - public void playFor(Player player, Location location, int count, Vector offset, double extra, T data) { - player.spawnParticle(particle, location, count, offset.getX(), offset.getY(), offset.getZ(), extra, data); - } - - public boolean isVisible() { - // TODO: 1.20.6: enum names are different now, can change to valueOf and let Spigot's runtime updating handle it - return particle != org.bukkit.Particle.SUSPENDED && particle != org.bukkit.Particle.SUSPENDED_DEPTH - && particle != org.bukkit.Particle.WATER_BUBBLE; - } - - public String getName() { - return particle.name(); - } - - public Class neededData() { - Class clazz = particle.getDataType(); - if (clazz == Void.class) { - return null; - } - return clazz; - } -} diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/PlayEffectCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/PlayEffectCommand.java index 3c685c6eaf..11620e9fb5 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/PlayEffectCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/PlayEffectCommand.java @@ -1,33 +1,44 @@ package com.denizenscript.denizen.scripts.commands.world; +import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.*; import com.denizenscript.denizen.objects.properties.bukkit.BukkitColorExtensions; +import com.denizenscript.denizen.utilities.BukkitImplDeprecations; +import com.denizenscript.denizen.utilities.LegacyNamingHelper; +import com.denizenscript.denizen.utilities.LegacyParticleNaming; +import com.denizenscript.denizencore.exceptions.InvalidArgumentsException; +import com.denizenscript.denizencore.objects.Argument; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ColorTag; import com.denizenscript.denizencore.objects.core.DurationTag; -import com.denizenscript.denizencore.utilities.debugging.Debug; -import com.denizenscript.denizen.nms.NMSHandler; -import com.denizenscript.denizen.nms.interfaces.Particle; -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.scripts.ScriptEntry; import com.denizenscript.denizencore.scripts.commands.AbstractCommand; import com.denizenscript.denizencore.utilities.CoreUtilities; -import com.denizenscript.denizen.utilities.BukkitImplDeprecations; +import com.denizenscript.denizencore.utilities.debugging.Debug; import org.bukkit.Effect; +import org.bukkit.Particle; import org.bukkit.Vibration; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.bukkit.util.Vector; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Random; public class PlayEffectCommand extends AbstractCommand { + public static final LegacyNamingHelper PARTICLE_NAMING = new LegacyNamingHelper<>(Particle.class); + public static final List VISIBLE_PARTICLES = new ArrayList<>(Arrays.asList(Particle.values())); + + static { + VISIBLE_PARTICLES.removeAll(List.of(Particle.valueOf("SUSPENDED"), Particle.valueOf("SUSPENDED_DEPTH"), Particle.valueOf("WATER_BUBBLE"))); + } + public PlayEffectCommand() { setName("playeffect"); setSyntax("playeffect [effect:] [at:|...] (data:<#.#>) (special_data:) (visibility:<#.#>) (quantity:<#>) (offset:<#.#>,<#.#>,<#.#>) (targets:|...) (velocity:)"); @@ -39,7 +50,7 @@ public PlayEffectCommand() { // @name Particle Effects // @group Useful Lists // @description - // All of the effects listed here can be used by <@link command PlayEffect> to display visual effects or play sounds + // All the effects listed here can be used by <@link command PlayEffect> to display visual effects or play sounds // // Effects: // - Everything on <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Particle.html> @@ -98,7 +109,7 @@ public PlayEffectCommand() { @Override public void addCustomTabCompletions(TabCompletionsBuilder tab) { - tab.addWithPrefix("effect:", NMSHandler.particleHelper.particles.keySet()); + tab.addWithPrefix("effect:", Particle.values()); tab.addWithPrefix("effect:", Effect.values()); } @@ -117,19 +128,26 @@ public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException else if (!scriptEntry.hasObject("effect") && !scriptEntry.hasObject("particleeffect") && !scriptEntry.hasObject("iconcrack")) { - if (NMSHandler.particleHelper.hasParticle(arg.getValue())) { - scriptEntry.addObject("particleeffect", NMSHandler.particleHelper.getParticle(arg.getValue())); + String particleName = CoreUtilities.toUpperCase(arg.getValue()); + Particle particle = PARTICLE_NAMING.fromName(particleName, scriptEntry.getContext()); + if (particle != null) { + scriptEntry.addObject("particleeffect", particle); + continue; + } + particle = LegacyParticleNaming.legacyParticleNames.get(particleName); + if (particle != null) { + BukkitImplDeprecations.oldSpigotNames.warn(scriptEntry); + scriptEntry.addObject("particleeffect", particle); continue; } - else if (arg.matches("barrier") && NMSHandler.getVersion().isAtLeast(NMSVersion.v1_18)) { - scriptEntry.addObject("particleeffect", NMSHandler.particleHelper.getParticle("block_marker")); + if (arg.matches("barrier") && NMSHandler.getVersion().isAtLeast(NMSVersion.v1_18)) { + scriptEntry.addObject("particleeffect", Particle.BLOCK_MARKER); scriptEntry.addObject("special_data", new ElementTag("barrier")); continue; } else if (arg.matches("random")) { // Get another effect if "RANDOM" is used - List visible = NMSHandler.particleHelper.getVisibleParticles(); - scriptEntry.addObject("particleeffect", visible.get(CoreUtilities.getRandom().nextInt(visible.size()))); + scriptEntry.addObject("particleeffect", VISIBLE_PARTICLES.get(CoreUtilities.getRandom().nextInt(VISIBLE_PARTICLES.size()))); continue; } else if (arg.startsWith("iconcrack_")) { @@ -227,7 +245,7 @@ public void execute(ScriptEntry scriptEntry) { ElementTag special_data = scriptEntry.getElement("special_data"); LocationTag velocity = scriptEntry.getObjectTag("velocity"); if (scriptEntry.dbCallShouldDebug()) { - Debug.report(scriptEntry, getName(), (effect != null ? db("effect", effect.name()) : particleEffect != null ? db("special effect", particleEffect.getName()) : iconcrack), + Debug.report(scriptEntry, getName(), (effect != null ? db("effect", effect.name()) : particleEffect != null ? db("special effect", particleEffect.name()) : iconcrack), db("locations", locations), db("targets", targets), radius, data, quantity, offset, special_data, velocity, (should_offset ? db("note", "Location will be offset 1 block-height upward (see documentation)") : "")); } for (LocationTag location : locations) { @@ -268,23 +286,23 @@ else if (particleEffect != null) { } } } - Class clazz = particleEffect.neededData(); + Class clazz = particleEffect.getDataType() == Void.class ? null : particleEffect.getDataType(); Object dataObject = null; if (clazz != null) { if (special_data == null) { - Debug.echoError("Missing required special data for particle: " + particleEffect.getName()); + Debug.echoError("Missing required special data for particle: " + particleEffect.name()); return; } - else if (clazz == org.bukkit.Particle.DustOptions.class) { + else if (clazz == Particle.DustOptions.class) { ListTag dataList = ListTag.valueOf(special_data.asString(), scriptEntry.getContext()); if (dataList.size() != 2) { - Debug.echoError("DustOptions special_data must have 2 list entries for particle: " + particleEffect.getName()); + Debug.echoError("DustOptions special_data must have 2 list entries for particle: " + particleEffect.name()); return; } else { float size = Float.parseFloat(dataList.get(0)); ColorTag color = ColorTag.valueOf(dataList.get(1), scriptEntry.context); - dataObject = new org.bukkit.Particle.DustOptions(BukkitColorExtensions.getColor(color), size); + dataObject = new Particle.DustOptions(BukkitColorExtensions.getColor(color), size); } } else if (clazz == BlockData.class) { @@ -295,23 +313,23 @@ else if (clazz == ItemStack.class) { ItemTag itemType = ItemTag.valueOf(special_data.asString(), scriptEntry.getContext()); dataObject = itemType.getItemStack(); } - else if (clazz == org.bukkit.Particle.DustTransition.class) { + else if (clazz == Particle.DustTransition.class) { ListTag dataList = ListTag.valueOf(special_data.asString(), scriptEntry.getContext()); if (dataList.size() != 3) { - Debug.echoError("DustTransition special_data must have 3 list entries for particle: " + particleEffect.getName()); + Debug.echoError("DustTransition special_data must have 3 list entries for particle: " + particleEffect.name()); return; } else { float size = Float.parseFloat(dataList.get(0)); ColorTag fromColor = ColorTag.valueOf(dataList.get(1), scriptEntry.context); ColorTag toColor = ColorTag.valueOf(dataList.get(2), scriptEntry.context); - dataObject = new org.bukkit.Particle.DustTransition(BukkitColorExtensions.getColor(fromColor), BukkitColorExtensions.getColor(toColor), size); + dataObject = new Particle.DustTransition(BukkitColorExtensions.getColor(fromColor), BukkitColorExtensions.getColor(toColor), size); } } else if (clazz == Vibration.class) { ListTag dataList = ListTag.valueOf(special_data.asString(), scriptEntry.getContext()); if (dataList.size() != 3) { - Debug.echoError("Vibration special_data must have 3 list entries for particle: " + particleEffect.getName()); + Debug.echoError("Vibration special_data must have 3 list entries for particle: " + particleEffect.name()); return; } else { @@ -329,27 +347,26 @@ else if (clazz == Vibration.class) { } } else { - Debug.echoError("Unknown particle data type: " + clazz.getCanonicalName() + " for particle: " + particleEffect.getName()); + Debug.echoError("Unknown particle data type: " + clazz.getCanonicalName() + " for particle: " + particleEffect.name()); return; } } else if (special_data != null) { - Debug.echoError("Particles of type '" + particleEffect.getName() + "' cannot take special_data as input."); + Debug.echoError("Particles of type '" + particleEffect.name() + "' cannot take special_data as input."); return; } Random random = CoreUtilities.getRandom(); int quantityInt = quantity.asInt(); for (Player player : players) { if (velocity == null) { - particleEffect.playFor(player, location, quantityInt, offset.toVector(), data.asDouble(), dataObject); + player.spawnParticle(particleEffect, location, quantityInt, offset.getX(), offset.getY(), offset.getZ(), data.asDouble(), dataObject); } else { - Vector velocityVector = velocity.toVector(); for (int i = 0; i < quantityInt; i++) { LocationTag singleLocation = location.clone().add((random.nextDouble() - 0.5) * offset.getX(), (random.nextDouble() - 0.5) * offset.getY(), (random.nextDouble() - 0.5) * offset.getZ()); - particleEffect.playFor(player, singleLocation, 0, velocityVector, 1f, dataObject); + player.spawnParticle(particleEffect, singleLocation, 0, velocity.getX(), velocity.getY(), velocity.getZ(), 1, dataObject); } } } @@ -374,9 +391,9 @@ else if (special_data != null) { } if (iconcrack != null) { ItemStack itemStack = iconcrack.getItemStack(); - Particle particle = NMSHandler.particleHelper.getParticle("ITEM_CRACK"); + Particle particle = Particle.valueOf("ITEM_CRACK"); for (Player player : players) { - particle.playFor(player, location, quantity.asInt(), offset.toVector(), data.asFloat(), itemStack); + player.spawnParticle(particle, location, quantity.asInt(), offset.getX(), offset.getY(), offset.getZ(), data.asFloat(), itemStack); } } } 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 09eabf93a7..9be448ff50 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java @@ -306,6 +306,10 @@ public class BukkitImplDeprecations { // 2023-year-end commonality: #30 public static Warning debugBlockAlpha = new VerySlowWarning("debugBlockAlpha", "The 'alpha' argument for the 'debugblock' command is deprecated: put the alpha in the color input instead."); + // Added 2024/6/17 + // Good candidate for SlowWarning, due to ease of update and the newer names already being more "normal"/well-known + public static Warning oldSpigotNames = new VerySlowWarning("oldSpigotNames", "Several features (particles, entities, etc.) had alternative naming added by Spigot, which is now deprecated in favor of the official Minecraft naming; see relevant feature's meta docs for more information."); + // ==================== FUTURE deprecations ==================== // Added 2023/01/15, deprecate officially by 2026 diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/LegacyNamingHelper.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/LegacyNamingHelper.java new file mode 100644 index 0000000000..5ccbd016b9 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/LegacyNamingHelper.java @@ -0,0 +1,39 @@ +package com.denizenscript.denizen.utilities; + +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; +import com.denizenscript.denizencore.tags.TagContext; +import com.denizenscript.denizencore.utilities.CoreUtilities; + +import java.util.HashSet; +import java.util.Set; + +public class LegacyNamingHelper> { + + private final Set modernNames; + private final Class enumType; + + public LegacyNamingHelper(Class enumType) { + this.enumType = enumType; + T[] enumConstants = enumType.getEnumConstants(); + modernNames = new HashSet<>(enumConstants.length); + for (T enumConstant : enumConstants) { + modernNames.add(enumConstant.name()); + } + } + + public T fromName(String name, TagContext context) { + String nameUpper = CoreUtilities.toUpperCase(name); + T value; + try { + value = Enum.valueOf(enumType, nameUpper); + } + catch (IllegalArgumentException ignored) { + return null; + } + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20) && !modernNames.contains(nameUpper)) { + BukkitImplDeprecations.oldSpigotNames.warn(context); + } + return value; + } +} diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/LegacyParticleNaming.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/LegacyParticleNaming.java new file mode 100644 index 0000000000..cd8e779b92 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/LegacyParticleNaming.java @@ -0,0 +1,43 @@ +package com.denizenscript.denizen.utilities; + + +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; +import org.bukkit.Particle; + +import java.util.HashMap; +import java.util.Map; + +public class LegacyParticleNaming { + + public static final Map legacyParticleNames = new HashMap<>(); + + public static void registerLegacyName(String name, String particle) { + legacyParticleNames.put(name, Particle.valueOf(particle)); + } + + static { + registerLegacyName("SMOKE", "SMOKE_NORMAL"); + registerLegacyName("HUGE_EXPLOSION", "EXPLOSION_HUGE"); + registerLegacyName("LARGE_EXPLODE", "EXPLOSION_LARGE"); + registerLegacyName("BUBBLE", "WATER_BUBBLE"); + registerLegacyName("SUSPEND", "SUSPENDED"); + registerLegacyName("DEPTH_SUSPEND", "SUSPENDED_DEPTH"); + registerLegacyName("CRIT", "CRIT"); + registerLegacyName("MAGIC_CRIT", "CRIT_MAGIC"); + registerLegacyName("MOB_SPELL", "SPELL_MOB"); + if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_19)) { + registerLegacyName("MOB_SPELL_AMBIENT", "SPELL_MOB_AMBIENT"); + } + registerLegacyName("INSTANT_SPELL", "SPELL_INSTANT"); + registerLegacyName("WITCH_MAGIC", "SPELL_WITCH"); + registerLegacyName("STEP_SOUND", "HEART"); + registerLegacyName("EXPLODE", "EXPLOSION_NORMAL"); + registerLegacyName("SPLASH", "WATER_SPLASH"); + registerLegacyName("LARGE_SMOKE", "SMOKE_LARGE"); + registerLegacyName("RED_DUST", "REDSTONE"); + registerLegacyName("SNOWBALL_POOF", "SNOWBALL"); + registerLegacyName("ANGRY_VILLAGER", "VILLAGER_ANGRY"); + registerLegacyName("HAPPY_VILLAGER", "VILLAGER_HAPPY"); + } +} diff --git a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/Handler.java b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/Handler.java index 82b81e02d4..3a196de10b 100644 --- a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/Handler.java +++ b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/Handler.java @@ -80,7 +80,6 @@ public Handler() { fishingHelper = new FishingHelperImpl(); itemHelper = new ItemHelperImpl(); packetHelper = new PacketHelperImpl(); - particleHelper = new ParticleHelperImpl(); playerHelper = new PlayerHelperImpl(); worldHelper = new WorldHelperImpl(); enchantmentHelper = new EnchantmentHelperImpl(); diff --git a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/ParticleHelperImpl.java b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/ParticleHelperImpl.java deleted file mode 100644 index ed623d1ca9..0000000000 --- a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/ParticleHelperImpl.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.denizenscript.denizen.nms.v1_17.helpers; - -import com.denizenscript.denizen.nms.abstracts.ParticleHelper; -import com.denizenscript.denizen.nms.v1_17.impl.ParticleImpl; -import com.denizenscript.denizen.nms.interfaces.Particle; - -public class ParticleHelperImpl extends ParticleHelper { - - @Override - public void register(String name, Particle particle) { - super.register(name, new ParticleImpl(particle.particle)); - } -} diff --git a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/impl/ParticleImpl.java b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/impl/ParticleImpl.java deleted file mode 100644 index 57dd756ae2..0000000000 --- a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/impl/ParticleImpl.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.denizenscript.denizen.nms.v1_17.impl; - -import com.denizenscript.denizen.nms.interfaces.Particle; -import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_17_R1.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_17_R1.util.CraftMagicNumbers; -import org.bukkit.entity.Player; -import org.bukkit.material.MaterialData; -import org.bukkit.util.Vector; - -public class ParticleImpl extends Particle { - - public ParticleImpl(org.bukkit.Particle particle) { - super(particle); - } - - @Override - public void playFor(Player player, Location location, int count, Vector offset, double extra, T data) { - if (data instanceof MaterialData) { - super.playFor(player, location, count, offset, extra, CraftBlockData.fromData(CraftMagicNumbers.getBlock((MaterialData) data))); - } - else { - super.playFor(player, location, count, offset, extra, data); - } - } -} diff --git a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/Handler.java b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/Handler.java index 428c8ddc80..6e611dfe04 100644 --- a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/Handler.java +++ b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/Handler.java @@ -85,7 +85,6 @@ public Handler() { fishingHelper = new FishingHelperImpl(); itemHelper = new ItemHelperImpl(); packetHelper = new PacketHelperImpl(); - particleHelper = new ParticleHelper(); playerHelper = new PlayerHelperImpl(); worldHelper = new WorldHelperImpl(); enchantmentHelper = new EnchantmentHelperImpl(); diff --git a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/Handler.java b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/Handler.java index 1eda7cca30..e19e762ab2 100644 --- a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/Handler.java +++ b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/Handler.java @@ -89,7 +89,6 @@ public Handler() { fishingHelper = new FishingHelperImpl(); itemHelper = new ItemHelperImpl(); packetHelper = new PacketHelperImpl(); - particleHelper = new ParticleHelper(); playerHelper = new PlayerHelperImpl(); worldHelper = new WorldHelperImpl(); enchantmentHelper = new EnchantmentHelperImpl(); diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java index b6dc825435..559ea7a158 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java @@ -108,7 +108,6 @@ public Handler() { fishingHelper = new FishingHelperImpl(); itemHelper = new ItemHelperImpl(); packetHelper = new PacketHelperImpl(); - particleHelper = new ParticleHelper(); playerHelper = new PlayerHelperImpl(); worldHelper = new WorldHelperImpl(); enchantmentHelper = new EnchantmentHelperImpl(); diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java index 361575f396..74e4ec8fda 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java @@ -107,7 +107,6 @@ public Handler() { fishingHelper = new FishingHelperImpl(); itemHelper = new ItemHelperImpl(); packetHelper = new PacketHelperImpl(); - particleHelper = new ParticleHelper(); playerHelper = new PlayerHelperImpl(); worldHelper = new WorldHelperImpl(); enchantmentHelper = new EnchantmentHelperImpl(); From 82ba64753d40a93c53e37241f5e1e408c45d645d Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Fri, 28 Jun 2024 01:39:25 -0700 Subject: [PATCH 039/280] Spigot Location.getWorld added validations, so bypass those because our Location objects don't break after a world unloads, unlike spigot's bad lib :( --- .../denizen/objects/LocationTag.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java index 085094fc50..5b4ef6dc2b 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java @@ -55,6 +55,7 @@ import org.bukkit.util.Vector; import org.bukkit.util.*; +import java.lang.ref.WeakReference; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -98,12 +99,13 @@ public class LocationTag extends org.bukkit.Location implements VectorObject, Ob */ public String backupWorld; public int trackedWorldChange; + public WeakReference internalWorld; public String getWorldName() { if (backupWorld != null) { return backupWorld; } - World w = super.getWorld(); + World w = internalWorld == null ? null : internalWorld.get(); if (w != null) { backupWorld = w.getName(); } @@ -112,7 +114,7 @@ public String getWorldName() { @Override public World getWorld() { - World w = super.getWorld(); + World w = internalWorld == null ? null : internalWorld.get(); if (w != null) { if (trackedWorldChange == WorldListChangeTracker.changes) { return w; @@ -125,8 +127,10 @@ public World getWorld() { return null; } trackedWorldChange = WorldListChangeTracker.changes; - super.setWorld(Bukkit.getWorld(backupWorld)); - return super.getWorld(); + w = Bukkit.getWorld(backupWorld); + internalWorld = new WeakReference<>(w); + super.setWorld(w); + return w; } @Override @@ -231,8 +235,9 @@ public LocationTag duplicate() { */ public LocationTag(Location location) { this(location.getWorld(), location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); - if (location instanceof LocationTag) { - backupWorld = ((LocationTag) location).backupWorld; + if (location instanceof LocationTag loctag) { + backupWorld = loctag.backupWorld; + internalWorld = loctag.internalWorld; } } @@ -270,6 +275,7 @@ public LocationTag(World world, double x, double y, double z, float yaw, float p super(world, x, y, z, EntityHelper.normalizeYaw(yaw), pitch); if (world != null) { backupWorld = world.getName(); + internalWorld = new WeakReference<>(world); } } @@ -532,6 +538,7 @@ public LocationTag multiply(double input) { @Override public void setWorld(World world) { super.setWorld(world); + internalWorld = world == null ? null : new WeakReference<>(world); backupWorld = world == null ? null : world.getName(); } From 30deebd6c89102125bd27385175505af5e8eee2b Mon Sep 17 00:00:00 2001 From: Zozer Firehood Date: Wed, 3 Jul 2024 17:19:37 -0400 Subject: [PATCH 040/280] `ItemTag.trim`: allow removing trims (#2631) * allow providing an empty map to remove trim * updated meta for mechanism * change empty map input to null --- .../objects/properties/item/ItemTrim.java | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemTrim.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemTrim.java index acc2335097..a113fad5d1 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemTrim.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemTrim.java @@ -25,6 +25,8 @@ public class ItemTrim extends ItemProperty { // Valid values also include ones added by datapacks, plugins, etc. as a namespaced key. // For the mechanism, if an item already has a trim, you can omit either material or pattern to keep the original data while also changing the other option. // For example, if you only want to change the pattern and not the material, you can omit the material, and it will use the already existing material. + // @mechanism + // To remove the trim provide no input. // --> public static boolean describes(ItemTag item) { @@ -55,25 +57,32 @@ public String getPropertyId() { @Override public void setPropertyValue(MapTag map, Mechanism mechanism) { - ElementTag mat = map.getElement("material"); - ElementTag pat = map.getElement("pattern"); ArmorMeta meta = (ArmorMeta) getItemMeta(); - ArmorTrim currentTrim = meta.getTrim(); - if (mat == null && currentTrim == null) { - mechanism.echoError("The armor piece must have a material already if you want to omit it!"); - return; + ArmorTrim newTrim; + if (map == null) { + newTrim = null; } - if (pat == null && currentTrim == null) { - mechanism.echoError("The armor piece must have a pattern already if you want to omit it!"); - return; + else { + ElementTag mat = map.getElement("material"); + ElementTag pat = map.getElement("pattern"); + ArmorTrim currentTrim = meta.getTrim(); + if (mat == null && currentTrim == null) { + mechanism.echoError("The armor piece must have a material already if you want to omit it!"); + return; + } + if (pat == null && currentTrim == null) { + mechanism.echoError("The armor piece must have a pattern already if you want to omit it!"); + return; + } + TrimMaterial material = mat == null ? currentTrim.getMaterial() : Registry.TRIM_MATERIAL.get(Utilities.parseNamespacedKey(mat.asString())); + TrimPattern pattern = pat == null ? currentTrim.getPattern() : Registry.TRIM_PATTERN.get(Utilities.parseNamespacedKey(pat.asString())); + newTrim = new ArmorTrim(material, pattern); } - TrimMaterial material = mat == null ? currentTrim.getMaterial() : Registry.TRIM_MATERIAL.get(Utilities.parseNamespacedKey(mat.asString())); - TrimPattern pattern = pat == null ? currentTrim.getPattern() : Registry.TRIM_PATTERN.get(Utilities.parseNamespacedKey(pat.asString())); - meta.setTrim(new ArmorTrim(material, pattern)); + meta.setTrim(newTrim); setItemMeta(meta); } public static void register() { - autoRegister("trim", ItemTrim.class, MapTag.class, false); + autoRegisterNullable("trim", ItemTrim.class, MapTag.class, false); } } From ce9cc7b71bf538f4695b57cc6a37f65d4e169adc Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Sat, 6 Jul 2024 14:48:21 +0100 Subject: [PATCH 041/280] Fix `ItemTag.base_color` on 1.20.6+ (#2634) * Fix `ItemTag.base_color` on 1.20.6+ * Proper has value checks --- paper/pom.xml | 2 +- plugin/pom.xml | 2 +- .../denizen/nms/interfaces/ItemHelper.java | 21 +++++++ .../properties/item/ItemBaseColor.java | 63 +++---------------- .../nms/v1_20/helpers/ItemHelperImpl.java | 19 ++++++ .../nms/v1_21/helpers/ItemHelperImpl.java | 19 ++++++ 6 files changed, 69 insertions(+), 57 deletions(-) diff --git a/paper/pom.xml b/paper/pom.xml index dc4f11db93..8f971f3ab1 100644 --- a/paper/pom.xml +++ b/paper/pom.xml @@ -25,7 +25,7 @@ io.papermc.paper paper-api - 1.20.6-R0.1-SNAPSHOT + 1.21-R0.1-SNAPSHOT provided diff --git a/plugin/pom.xml b/plugin/pom.xml index 59645cda8a..1af3695e5d 100644 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -30,7 +30,7 @@ org.spigotmc spigot-api - 1.20.4-R0.1-SNAPSHOT + 1.21-R0.1-SNAPSHOT jar provided diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java index 4e017b2099..75e98eb955 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java @@ -6,8 +6,10 @@ import com.denizenscript.denizen.nms.util.jnbt.Tag; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.utilities.nbt.CustomNBT; +import org.bukkit.DyeColor; import org.bukkit.Material; import org.bukkit.NamespacedKey; +import org.bukkit.block.Banner; import org.bukkit.block.data.BlockData; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; @@ -15,6 +17,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.RecipeChoice; import org.bukkit.inventory.ShapedRecipe; +import org.bukkit.inventory.meta.BlockStateMeta; import org.bukkit.map.MapView; import java.util.List; @@ -142,4 +145,22 @@ public byte[] renderMap(MapView mapView, Player player) { public int getFoodPoints(Material itemType) { throw new UnsupportedOperationException(); } + + public DyeColor getShieldColor(ItemStack item) { // TODO: once 1.20 is the minimum supported version, remove default impl + BlockStateMeta stateMeta = (BlockStateMeta) item.getItemMeta(); + return stateMeta.hasBlockState() ? ((Banner) stateMeta.getBlockState()).getBaseColor() : null; + } + + public ItemStack setShieldColor(ItemStack item, DyeColor color) { // TODO: once 1.20 is the minimum supported version, remove default impl + if (color == null) { + CompoundTag noStateNbt = getNbtData(item).createBuilder().remove("BlockEntityTag").build(); + return setNbtData(item, noStateNbt); + } + BlockStateMeta stateMeta = (BlockStateMeta) item.getItemMeta(); + Banner banner = (Banner) stateMeta.getBlockState(); + banner.setBaseColor(color); + stateMeta.setBlockState(banner); + item.setItemMeta(stateMeta); + return item; + } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemBaseColor.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemBaseColor.java index a20ccc1412..8cb194790b 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemBaseColor.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemBaseColor.java @@ -1,18 +1,11 @@ package com.denizenscript.denizen.objects.properties.item; import com.denizenscript.denizen.nms.NMSHandler; -import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.core.ElementTag; -import com.denizenscript.denizencore.objects.core.MapTag; -import com.denizenscript.denizencore.tags.TagContext; import org.bukkit.DyeColor; import org.bukkit.Material; -import org.bukkit.block.Banner; -import org.bukkit.inventory.meta.BannerMeta; -import org.bukkit.inventory.meta.BlockStateMeta; -import org.bukkit.inventory.meta.ItemMeta; public class ItemBaseColor extends ItemProperty { @@ -33,16 +26,16 @@ public static boolean describes(ItemTag item) { @Override public ElementTag getPropertyValue() { - DyeColor baseColor = getBaseColor(); - if (baseColor != null) { - return new ElementTag(baseColor.name()); - } - return null; + DyeColor color = NMSHandler.itemHelper.getShieldColor(getItemStack()); + return color != null ? new ElementTag(color) : null; } @Override - public void setPropertyValue(ElementTag val, Mechanism mechanism) { - setBaseColor(mechanism.hasValue() ? val.asEnum(DyeColor.class) : null, mechanism.context); + public void setPropertyValue(ElementTag value, Mechanism mechanism) { + if (value != null && !mechanism.requireEnum(DyeColor.class)) { + return; + } + setItemStack(NMSHandler.itemHelper.setShieldColor(getItemStack(), value != null ? value.asEnum(DyeColor.class) : null)); } @Override @@ -50,47 +43,7 @@ public String getPropertyId() { return "base_color"; } - public DyeColor getBaseColor() { - ItemMeta itemMeta = getItemMeta(); - if (itemMeta instanceof BlockStateMeta) { - DyeColor color = ((Banner) ((BlockStateMeta) itemMeta).getBlockState()).getBaseColor(); - if (color == DyeColor.WHITE && getMaterial() == Material.SHIELD) { // Hack to avoid blank shields misdisplaying as white - if (new ItemRawNBT(object).getFullNBTMap().getObject("BlockEntityTag") == null) { - return null; - } - } - return color; - } - else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { - // TODO: 1.20.6: Banner color has been part of the item type for a while, and Spigot removed this API - return ((BannerMeta) itemMeta).getBaseColor(); - } - return null; - } - - public void setBaseColor(DyeColor color, TagContext context) { - if (color == null && getMaterial() == Material.SHIELD) { - ItemRawNBT property = new ItemRawNBT(object); - MapTag nbt = property.getFullNBTMap(); - nbt.putObject("BlockEntityTag", null); - property.setFullNBT(object, nbt, context, false); - return; - } - ItemMeta itemMeta = getItemMeta(); - if (itemMeta instanceof BlockStateMeta) { - Banner banner = (Banner) ((BlockStateMeta) itemMeta).getBlockState(); - banner.setBaseColor(color); - banner.update(); - ((BlockStateMeta) itemMeta).setBlockState(banner); - } - else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { - // TODO: 1.20.6: Banner color has been part of the item type for a while, and Spigot removed this API - ((BannerMeta) itemMeta).setBaseColor(color); - } - setItemMeta(itemMeta); - } - public static void register() { - autoRegister("base_color", ItemBaseColor.class, ElementTag.class, false); + autoRegisterNullable("base_color", ItemBaseColor.class, ElementTag.class, false); } } diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java index 5c45a910ed..057d34dc88 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java @@ -53,6 +53,7 @@ import net.minecraft.world.level.saveddata.maps.MapId; import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import org.bukkit.Bukkit; +import org.bukkit.DyeColor; import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.block.data.BlockData; @@ -608,4 +609,22 @@ public byte[] renderMap(MapView mapView, Player player) { public int getFoodPoints(Material itemType) { return CraftMagicNumbers.getItem(itemType).components().get(DataComponents.FOOD).nutrition(); } + + @Override + public DyeColor getShieldColor(ItemStack item) { + net.minecraft.world.item.DyeColor nmsColor = CraftItemStack.asNMSCopy(item).get(DataComponents.BASE_COLOR); + return nmsColor != null ? DyeColor.getByWoolData((byte) nmsColor.getId()) : null; + } + + @Override + public ItemStack setShieldColor(ItemStack item, DyeColor color) { + net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item); + if (color != null) { + nmsItemStack.set(DataComponents.BASE_COLOR, net.minecraft.world.item.DyeColor.byId(color.getWoolData())); + } + else { + nmsItemStack.remove(DataComponents.BASE_COLOR); + } + return CraftItemStack.asBukkitCopy(nmsItemStack); + } } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java index a651ee2c5b..4966a1dcc2 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java @@ -53,6 +53,7 @@ import net.minecraft.world.level.saveddata.maps.MapId; import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import org.bukkit.Bukkit; +import org.bukkit.DyeColor; import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.block.data.BlockData; @@ -608,4 +609,22 @@ public byte[] renderMap(MapView mapView, Player player) { public int getFoodPoints(Material itemType) { return CraftMagicNumbers.getItem(itemType).components().get(DataComponents.FOOD).nutrition(); } + + @Override + public DyeColor getShieldColor(ItemStack item) { + net.minecraft.world.item.DyeColor nmsColor = CraftItemStack.asNMSCopy(item).get(DataComponents.BASE_COLOR); + return nmsColor != null ? DyeColor.getByWoolData((byte) nmsColor.getId()) : null; + } + + @Override + public ItemStack setShieldColor(ItemStack item, DyeColor color) { + net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item); + if (color != null) { + nmsItemStack.set(DataComponents.BASE_COLOR, net.minecraft.world.item.DyeColor.byId(color.getWoolData())); + } + else { + nmsItemStack.remove(DataComponents.BASE_COLOR); + } + return CraftItemStack.asBukkitCopy(nmsItemStack); + } } From fccada9a84439144c41905a9fd28ad2b9382f8de Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Sat, 6 Jul 2024 14:49:59 +0100 Subject: [PATCH 042/280] Fix `PacketHelper#resetEquipment` on 1.20.6+ (#2633) --- .../denizen/paper/utilities/PaperAPIToolsImpl.java | 6 ++++++ .../denizenscript/denizen/nms/interfaces/PacketHelper.java | 5 ++++- .../com/denizenscript/denizen/utilities/PaperAPITools.java | 5 +++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/utilities/PaperAPIToolsImpl.java b/paper/src/main/java/com/denizenscript/denizen/paper/utilities/PaperAPIToolsImpl.java index 76bc8a34c1..2f8246dd2b 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/utilities/PaperAPIToolsImpl.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/utilities/PaperAPIToolsImpl.java @@ -25,6 +25,7 @@ import org.bukkit.block.Sign; import org.bukkit.command.CommandSender; import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.entity.TextDisplay; import org.bukkit.event.entity.CreatureSpawnEvent; @@ -377,4 +378,9 @@ public String getClientBrand(Player player) { String clientBrand = player.getClientBrandName(); return clientBrand != null ? clientBrand : "unknown"; } + + @Override + public boolean canUseEquipmentSlot(LivingEntity entity, EquipmentSlot slot) { + return NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20) ? entity.canUseEquipmentSlot(slot) : super.canUseEquipmentSlot(entity, slot); + } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/PacketHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/PacketHelper.java index c9ed4b6574..440671baec 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/PacketHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/PacketHelper.java @@ -2,6 +2,7 @@ import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; import com.denizenscript.denizen.scripts.commands.entity.TeleportCommand; +import com.denizenscript.denizen.utilities.PaperAPITools; import com.denizenscript.denizen.utilities.maps.MapImage; import com.denizenscript.denizencore.objects.core.ColorTag; import org.bukkit.Bukkit; @@ -93,7 +94,9 @@ default void resetEquipment(Player player, LivingEntity entity) { // TODO: once EntityEquipment equipment = entity.getEquipment(); Map equipmentMap = new EnumMap<>(EquipmentSlot.class); for (EquipmentSlot slot : EquipmentSlot.values()) { - equipmentMap.put(slot, equipment.getItem(slot)); + if (PaperAPITools.instance.canUseEquipmentSlot(entity, slot)) { + equipmentMap.put(slot, equipment.getItem(slot)); + } } player.sendEquipmentChange(entity, equipmentMap); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/PaperAPITools.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/PaperAPITools.java index 9058bc1666..b12ce29902 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/PaperAPITools.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/PaperAPITools.java @@ -12,6 +12,7 @@ import org.bukkit.block.Sign; import org.bukkit.command.CommandSender; import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.entity.TextDisplay; import org.bukkit.event.entity.CreatureSpawnEvent; @@ -212,4 +213,8 @@ public String getClientBrand(Player player) { NetworkInterceptHelper.enable(); return NMSHandler.playerHelper.getClientBrand(player); } + + public boolean canUseEquipmentSlot(LivingEntity entity, EquipmentSlot slot) { + return true; + } } From b645892680f29ae93337b7124a635673f9fd664c Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Wed, 10 Jul 2024 10:12:06 +0100 Subject: [PATCH 043/280] Interfaceification fixes (#2635) * Initial fixes * Fixup enum method usages * `listForEnum` -> `listTypes` * Correct version check * More fixes * Cleanups * TODO for stuff that can use proper registry logic * Fixup TODOs * Rename --- .../VillagerChangesProfessionScriptEvent.java | 10 ++- .../properties/entity/EntityColor.java | 75 ++++++++++--------- .../properties/entity/EntityProfession.java | 10 ++- .../denizen/tags/core/ServerTagBase.java | 13 +++- .../denizen/utilities/LegacyNamingHelper.java | 24 ++++++ .../utilities/MultiVersionHelper1_19.java | 11 +-- .../denizen/utilities/Utilities.java | 6 ++ .../denizen/utilities/maps/MapCursor.java | 3 +- 8 files changed, 101 insertions(+), 51 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/VillagerChangesProfessionScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/VillagerChangesProfessionScriptEvent.java index 84491d6636..5004b051bc 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/VillagerChangesProfessionScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/VillagerChangesProfessionScriptEvent.java @@ -2,6 +2,7 @@ import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.utilities.LegacyNamingHelper; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; import org.bukkit.entity.Villager; @@ -56,8 +57,9 @@ public boolean matches(ScriptPath path) { @Override public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) { - if (exactMatchesEnum(determinationObj.toString(), Villager.Profession.values())) { - Villager.Profession newProfession = Villager.Profession.valueOf(determinationObj.toString().toUpperCase()); + // TODO This technically has registries on all supported versions + Villager.Profession newProfession = LegacyNamingHelper.convert(Villager.Profession.class, determinationObj.toString()); + if (newProfession != null) { event.setProfession(newProfession); return true; } @@ -70,9 +72,9 @@ public ObjectTag getContext(String name) { case "entity": return entity; case "reason": - return new ElementTag(event.getReason().toString()); + return new ElementTag(event.getReason()); case "profession": - return new ElementTag(event.getProfession().toString()); + return new ElementTag(String.valueOf(event.getProfession()), true); } return super.getContext(name); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityColor.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityColor.java index 048c7695c7..db1b588daa 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityColor.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityColor.java @@ -4,17 +4,16 @@ import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.properties.bukkit.BukkitColorExtensions; +import com.denizenscript.denizen.utilities.LegacyNamingHelper; import com.denizenscript.denizen.utilities.MultiVersionHelper1_19; +import com.denizenscript.denizen.utilities.Utilities; +import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.core.ColorTag; import com.denizenscript.denizencore.objects.core.ElementTag; -import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.core.ListTag; import com.denizenscript.denizencore.objects.properties.PropertyParser; import com.denizenscript.denizencore.utilities.CoreUtilities; -import org.bukkit.Color; -import org.bukkit.DyeColor; -import org.bukkit.NamespacedKey; -import org.bukkit.Registry; +import org.bukkit.*; import org.bukkit.entity.*; import java.util.Arrays; @@ -150,12 +149,13 @@ else if (type == EntityType.FOX && mechanism.requireEnum(Fox.Type.class)) { else if (type == EntityType.CAT && mechanism.requireObject(ListTag.class)) { Cat cat = as(Cat.class); ListTag list = mechanism.valueAsType(ListTag.class); - ElementTag catType = new ElementTag(list.get(0)); - if (catType.matchesEnum(Cat.Type.class)) { - cat.setCatType(catType.asEnum(Cat.Type.class)); + String catTypeStr = list.get(0); + Cat.Type catType = LegacyNamingHelper.convert(Cat.Type.class, catTypeStr); + if (catType != null) { + cat.setCatType(catType); } else { - mechanism.echoError("Invalid cat type specified: " + catType); + mechanism.echoError("Invalid cat type specified: " + catTypeStr); } if (list.size() > 1) { ElementTag collarColor = new ElementTag(list.get(1)); @@ -187,11 +187,12 @@ else if (type == EntityType.PANDA && mechanism.requireObject(ListTag.class)) { } } } - else if (type == EntityType.VILLAGER && mechanism.requireEnum(Villager.Type.class)) { - as(Villager.class).setVillagerType(color.asEnum(Villager.Type.class)); + // TODO This technically has registries on all supported versions + else if (type == EntityType.VILLAGER) { + LegacyNamingHelper.requireType(mechanism, Villager.Type.class).ifPresent(as(Villager.class)::setVillagerType); } - else if (type == EntityType.ZOMBIE_VILLAGER && mechanism.requireEnum(Villager.Type.class)) { - as(ZombieVillager.class).setVillagerType(color.asEnum(Villager.Type.class)); + else if (type == EntityType.ZOMBIE_VILLAGER) { + LegacyNamingHelper.requireType(mechanism, Villager.Type.class).ifPresent(as(ZombieVillager.class)::setVillagerType); } else if (type == EntityType.ARROW && mechanism.requireObject(ColorTag.class)) { as(Arrow.class).setColor(BukkitColorExtensions.getColor(mechanism.valueAsType(ColorTag.class))); @@ -242,14 +243,16 @@ public String getColor(boolean includeDeprecated) { case FOX -> as(Fox.class).getFoxType().name(); case CAT -> { Cat cat = as(Cat.class); - yield cat.getCatType().name() + "|" + cat.getCollarColor().name(); + // TODO once 1.21 is the minimum supported version, replace with direct registry-based handling + yield cat.getCatType() + "|" + cat.getCollarColor().name(); } case PANDA -> { Panda panda = as(Panda.class); yield panda.getMainGene().name() + "|" + panda.getHiddenGene().name(); } - case VILLAGER -> as(Villager.class).getVillagerType().name(); - case ZOMBIE_VILLAGER -> as(ZombieVillager.class).getVillagerType().name(); + // TODO This technically has registries on all supported versions + case VILLAGER -> String.valueOf(as(Villager.class).getVillagerType()); + case ZOMBIE_VILLAGER -> String.valueOf(as(ZombieVillager.class).getVillagerType()); case ARROW -> { try { yield BukkitColorExtensions.fromColor(as(Arrow.class).getColor()).identify(); @@ -264,12 +267,13 @@ public String getColor(boolean includeDeprecated) { }; } - public static ListTag listForEnum(Enum[] values) { - ListTag list = new ListTag(values.length); - for (Enum obj : values) { - list.addObject(new ElementTag(obj)); + // TODO once 1.21 is the minimum supported version, replace with direct registry-based handling + @SuppressWarnings({"unchecked", "DataFlowIssue"}) + public static ListTag listTypes(Class type) { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && Keyed.class.isAssignableFrom(type)) { + return Utilities.registryKeys(Bukkit.getRegistry((Class) type)); } - return list; + return new ListTag(Arrays.asList(((Class>) type).getEnumConstants()), ElementTag::new); } public ListTag getAllowedColors() { @@ -278,34 +282,35 @@ public ListTag getAllowedColors() { return MultiVersionHelper1_19.getAllowedColors(type); } if (type == MOOSHROOM_ENTITY_TYPE) { - return listForEnum(MushroomCow.Variant.values()); + return listTypes(MushroomCow.Variant.class); } return switch (type) { case HORSE -> { - ListTag horseColors = listForEnum(Horse.Color.values()); - horseColors.addAll(listForEnum(Horse.Style.values())); + ListTag horseColors = listTypes(Horse.Color.class); + horseColors.addAll(listTypes(Horse.Style.class)); yield horseColors; } - case SHEEP, WOLF, SHULKER -> listForEnum(DyeColor.values()); - case RABBIT -> listForEnum(Rabbit.Type.values()); - case LLAMA, TRADER_LLAMA -> listForEnum(Llama.Color.values()); - case PARROT -> listForEnum(Parrot.Variant.values()); + case SHEEP, WOLF, SHULKER -> listTypes(DyeColor.class); + case RABBIT -> listTypes(Rabbit.Type.class); + case LLAMA, TRADER_LLAMA -> listTypes(Llama.Color.class); + case PARROT -> listTypes(Parrot.Variant.class); case TROPICAL_FISH -> { - ListTag patterns = listForEnum(TropicalFish.Pattern.values()); - patterns.addAll(listForEnum(DyeColor.values())); + ListTag patterns = listTypes(TropicalFish.Pattern.class); + patterns.addAll(listTypes(DyeColor.class)); yield patterns; } - case FOX -> listForEnum(Fox.Type.values()); - case CAT -> listForEnum(Cat.Type.values()); - case PANDA -> listForEnum(Panda.Gene.values()); - case VILLAGER, ZOMBIE_VILLAGER -> listForEnum(Villager.Type.values()); + case FOX -> listTypes(Fox.Type.class); + case CAT -> listTypes(Cat.Type.class); + case PANDA -> listTypes(Panda.Gene.class); + // TODO This technically has registries on all supported versions + case VILLAGER, ZOMBIE_VILLAGER -> listTypes(Villager.Type.class); case GOAT -> { ListTag result = new ListTag(); result.add("screaming"); result.add("normal"); yield result; } - case AXOLOTL -> EntityColor.listForEnum(Axolotl.Variant.values()); + case AXOLOTL -> EntityColor.listTypes(Axolotl.Variant.class); default -> null; // includes Ocelot (deprecated) and arrow (ColorTag) }; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityProfession.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityProfession.java index c04b7aaae4..84baeae1bf 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityProfession.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityProfession.java @@ -1,6 +1,7 @@ package com.denizenscript.denizen.objects.properties.entity; import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.utilities.LegacyNamingHelper; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.ObjectTag; @@ -13,6 +14,7 @@ public class EntityProfession implements Property { + // TODO This technically has registries on all supported versions public static boolean describes(ObjectTag entity) { if (!(entity instanceof EntityTag)) { return false; @@ -62,7 +64,7 @@ public void setProfession(Villager.Profession profession) { @Override public String getPropertyString() { - return CoreUtilities.toLowerCase(getProfession().name()); + return CoreUtilities.toLowerCase(String.valueOf(getProfession())); } @Override @@ -88,7 +90,7 @@ public ObjectTag getObjectAttribute(Attribute attribute) { // For the list of possible professions, refer to <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/entity/Villager.Profession.html> // --> if (attribute.startsWith("profession")) { - return new ElementTag(getProfession()) + return new ElementTag(String.valueOf(getProfession()), true) .getObjectAttribute(attribute.fulfill(1)); } @@ -109,8 +111,8 @@ public void adjust(Mechanism mechanism) { // @tags // // --> - if (mechanism.matches("profession") && mechanism.requireEnum(Villager.Profession.class)) { - setProfession(Villager.Profession.valueOf(mechanism.getValue().asString().toUpperCase())); + if (mechanism.matches("profession")) { + LegacyNamingHelper.requireType(mechanism, Villager.Profession.class).ifPresent(this::setProfession); } } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/tags/core/ServerTagBase.java b/plugin/src/main/java/com/denizenscript/denizen/tags/core/ServerTagBase.java index d7448206c1..c80429a62c 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/tags/core/ServerTagBase.java +++ b/plugin/src/main/java/com/denizenscript/denizen/tags/core/ServerTagBase.java @@ -912,7 +912,16 @@ else if (param.shouldBeType(EntityTag.class)) { // Generally used with <@link command map> and <@link language Map Script Containers>. // This is only their Bukkit enum names, as seen at <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/map/MapCursor.Type.html>. // --> - registerEnumListTag("map_cursor_types", MapCursor.Type.class, "list_map_cursor_types"); + // TODO once 1.20 is the minimum supported version, replace with direct registry-based handling + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + tagProcessor.registerStaticTag(ListTag.class, "map_cursor_types", (attribute, object) -> { + listDeprecateWarn(attribute); + return Utilities.registryKeys(Registry.MAP_DECORATION_TYPE); + }, "list_map_cursor_types"); + } + else { + registerEnumListTag("map_cursor_types", (Class>) (Class) MapCursor.Type.class, "list_map_cursor_types"); + } // <--[tag] // @attribute @@ -972,7 +981,7 @@ else if (param.shouldBeType(EntityTag.class)) { // For locating specific structures, see <@link language Structure lookups>. // --> tagProcessor.registerTag(ListTag.class, "structures", (attribute, object) -> { - return new ListTag(Registry.STRUCTURE.stream().toList(), structure -> new ElementTag(Utilities.namespacedKeyToString(structure.getKey()), true)); + return Utilities.registryKeys(Registry.STRUCTURE); }); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/LegacyNamingHelper.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/LegacyNamingHelper.java index 5ccbd016b9..5ffaacdec9 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/LegacyNamingHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/LegacyNamingHelper.java @@ -2,14 +2,38 @@ import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.NMSVersion; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.tags.TagContext; import com.denizenscript.denizencore.utilities.CoreUtilities; +import com.denizenscript.denizencore.utilities.debugging.DebugInternals; +import org.bukkit.Bukkit; +import org.bukkit.Keyed; import java.util.HashSet; +import java.util.Optional; import java.util.Set; public class LegacyNamingHelper> { + // TODO once 1.21 is the minimum supported version, replace with direct registry-based handling + @SuppressWarnings({"unchecked", "rawtypes", "DataFlowIssue"}) + public static T convert(Class type, String string) { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + return Bukkit.getRegistry(type).get(Utilities.parseNamespacedKey(string)); + } + return (T) ElementTag.asEnum((Class) type, string); + } + + public static Optional requireType(Mechanism mechanism, Class type) { + T converted = convert(type, mechanism.getValue().asString()); + if (converted == null) { + mechanism.echoError("Invalid " + DebugInternals.getClassNameOpti(type) + " specified: must specify a valid name."); + return Optional.empty(); + } + return Optional.of(converted); + } + private final Set modernNames; private final Class enumType; diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/MultiVersionHelper1_19.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/MultiVersionHelper1_19.java index 1a152134e3..e2d9b17d74 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/MultiVersionHelper1_19.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/MultiVersionHelper1_19.java @@ -16,9 +16,10 @@ public static boolean colorIsApplicable(EntityType type) { return type == EntityType.FROG || type == EntityType.BOAT || type == EntityType.CHEST_BOAT; } + // TODO Frog variants technically have registries on all supported versions public static String getColor(Entity entity) { if (entity instanceof Frog frog) { - return frog.getVariant().name(); + return String.valueOf(frog.getVariant()); } else if (entity instanceof Boat boat) { return boat.getBoatType().name(); @@ -28,17 +29,17 @@ else if (entity instanceof Boat boat) { public static ListTag getAllowedColors(EntityType type) { if (type == EntityType.FROG) { - return EntityColor.listForEnum(Frog.Variant.values()); + return EntityColor.listTypes(Frog.Variant.class); } else if (type == EntityType.BOAT || type == EntityType.CHEST_BOAT) { - return EntityColor.listForEnum(Boat.Type.values()); + return EntityColor.listTypes(Boat.Type.class); } return null; } public static void setColor(Entity entity, Mechanism mech) { - if (entity instanceof Frog frog && mech.requireEnum(Frog.Variant.class)) { - frog.setVariant(mech.getValue().asEnum(Frog.Variant.class)); + if (entity instanceof Frog frog) { + LegacyNamingHelper.requireType(mech, Frog.Variant.class).ifPresent(frog::setVariant); } else if (entity instanceof Boat boat && mech.requireEnum(Boat.Type.class)) { boat.setBoatType(mech.getValue().asEnum(Boat.Type.class)); diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java index 59814cc4a7..9b260abc5e 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java @@ -9,6 +9,8 @@ import com.denizenscript.denizen.tags.BukkitTagContext; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; import com.denizenscript.denizencore.events.ScriptEvent; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.objects.core.ListTag; import com.denizenscript.denizencore.objects.core.ScriptTag; import com.denizenscript.denizencore.scripts.ScriptEntry; import com.denizenscript.denizencore.tags.TagManager; @@ -54,6 +56,10 @@ public static String namespacedKeyToString(NamespacedKey key) { return key.getNamespace().equals(NamespacedKey.MINECRAFT) ? key.getKey() : key.toString(); } + public static ListTag registryKeys(Registry registry) { + return new ListTag(registry.stream().toList(), keyed -> new ElementTag(namespacedKeyToString(keyed.getKey()), true)); + } + public static boolean matchesNamespacedKeyButCaseInsensitive(String input) { int colonIndex = input.indexOf(':'); if (colonIndex == -1) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/maps/MapCursor.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/maps/MapCursor.java index 5008abac63..4fbfa0966b 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/maps/MapCursor.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/maps/MapCursor.java @@ -1,6 +1,7 @@ package com.denizenscript.denizen.utilities.maps; import com.denizenscript.denizen.objects.PlayerTag; +import com.denizenscript.denizen.utilities.LegacyNamingHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import org.bukkit.map.MapCanvas; import org.bukkit.map.MapView; @@ -26,7 +27,7 @@ public byte getDirection(PlayerTag player) { } public org.bukkit.map.MapCursor.Type getType(PlayerTag player) { - return org.bukkit.map.MapCursor.Type.valueOf(tag(typeTag, player).toUpperCase()); + return LegacyNamingHelper.convert(org.bukkit.map.MapCursor.Type.class, tag(typeTag, player)); } private byte yawToDirection(double yaw) { From 3aefd29139cb7cf87d08fb214b10d56e8e225ea6 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Sat, 13 Jul 2024 20:00:55 +0100 Subject: [PATCH 044/280] `TagContext` in object matchers (#2636) * Update for core changes * Store created context where needed * Use `path.context` * Imports + oops * They can be `static` again now --- .../EntityKnocksbackEntityScriptEvent.java | 4 +-- .../events/PlayerEquipsArmorScriptEvent.java | 4 +-- .../paper/utilities/PaperAPIToolsImpl.java | 10 +++--- .../denizen/events/BukkitScriptEvent.java | 8 ++--- .../events/block/BlockBuiltScriptEvent.java | 2 +- .../block/BlockDestroyedByExplosionEvent.java | 4 +-- .../events/block/BlockPhysicsScriptEvent.java | 18 +++++------ .../events/block/LeafDecaysScriptEvent.java | 2 +- .../block/LiquidLevelChangeScriptEvent.java | 2 +- .../events/block/LiquidSpreadScriptEvent.java | 2 +- .../block/PistonExtendsScriptEvent.java | 2 +- .../block/PistonRetractsScriptEvent.java | 2 +- .../entity/AreaEnterExitScriptEvent.java | 2 +- .../entity/DragonPhaseChangeScriptEvent.java | 2 +- .../EntityAirLevelChangeScriptEvent.java | 2 +- .../EntityBreaksHangingScriptEvent.java | 8 ++--- .../entity/EntityChangesBlockScriptEvent.java | 8 ++--- .../entity/EntityDamagedScriptEvent.java | 12 +++---- .../events/entity/EntityDeathScriptEvent.java | 2 +- .../entity/EntityDespawnScriptEvent.java | 2 +- .../entity/EntityDropsItemScriptEvent.java | 2 +- .../entity/EntityEntersPortalScriptEvent.java | 2 +- .../EntityEntersVehicleScriptEvent.java | 2 +- .../entity/EntityExitsPortalScriptEvent.java | 2 +- .../entity/EntityExitsVehicleScriptEvent.java | 2 +- .../entity/EntityExplodesScriptEvent.java | 2 +- .../EntityFoodLevelChangeScriptEvent.java | 2 +- .../entity/EntityKilledScriptEvent.java | 10 +++--- .../entity/EntityPotionEffectScriptEvent.java | 2 +- .../entity/EntityShootsBowScriptEvent.java | 9 +++--- .../events/entity/EntityTamesScriptEvent.java | 4 +-- .../entity/EntityTargetsScriptEvent.java | 2 +- .../entity/HangingBreaksScriptEvent.java | 2 +- .../events/entity/HorseJumpsScriptEvent.java | 2 +- .../entity/ProjectileLaunchedScriptEvent.java | 2 +- .../player/BlockDropsItemScriptEvent.java | 2 +- .../player/PlayerAnimatesScriptEvent.java | 4 +-- .../player/PlayerBreaksBlockScriptEvent.java | 2 +- .../player/PlayerChangesSignScriptEvent.java | 2 +- .../player/PlayerChangesWorldScriptEvent.java | 6 ++-- .../player/PlayerClicksBlockScriptEvent.java | 2 +- .../PlayerClicksInInventoryScriptEvent.java | 4 +-- .../player/PlayerDragsInInvScriptEvent.java | 8 ++--- .../PlayerEmptiesBucketScriptEvent.java | 2 +- .../player/PlayerFillsBucketScriptEvent.java | 2 +- .../player/PlayerFishesScriptEvent.java | 5 ++- .../player/PlayerPlacesBlockScriptEvent.java | 11 ++++--- .../PlayerPlacesHangingScriptEvent.java | 2 +- .../PlayerRightClicksEntityScriptEvent.java | 13 +++++--- .../player/PlayerShearsScriptEvent.java | 2 +- .../player/PlayerStandsOnScriptEvent.java | 2 +- .../player/PlayerSteersEntityScriptEvent.java | 2 +- .../vehicle/VehicleDamagedScriptEvent.java | 6 ++-- .../vehicle/VehicleDestroyedScriptEvent.java | 6 ++-- .../world/ChunkLoadEntitiesScriptEvent.java | 2 +- .../world/ChunkUnloadEntitiesScriptEvent.java | 2 +- .../events/world/PotionSplashScriptEvent.java | 2 +- .../objects/AreaContainmentObject.java | 6 ++-- .../denizen/objects/CuboidTag.java | 2 +- .../denizen/objects/EllipsoidTag.java | 2 +- .../denizen/objects/EntityTag.java | 8 ++--- .../denizen/objects/InventoryTag.java | 12 +++---- .../denizen/objects/ItemTag.java | 2 +- .../denizen/objects/LocationTag.java | 31 ++++++++++--------- .../denizen/objects/MaterialTag.java | 2 +- .../denizenscript/denizen/objects/NPCTag.java | 4 +-- .../denizen/objects/PlayerTag.java | 10 +++--- .../denizen/objects/PolygonTag.java | 4 +-- .../denizen/objects/WorldTag.java | 4 +-- .../scripts/commands/item/TakeCommand.java | 2 +- .../containers/core/ItemScriptHelper.java | 4 ++- .../scripts/triggers/core/ClickTrigger.java | 7 +++-- .../utilities/entity/HideEntitiesHelper.java | 3 +- 73 files changed, 177 insertions(+), 160 deletions(-) diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/EntityKnocksbackEntityScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/EntityKnocksbackEntityScriptEvent.java index 713e8133f1..167a3423b2 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/events/EntityKnocksbackEntityScriptEvent.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/EntityKnocksbackEntityScriptEvent.java @@ -2,10 +2,10 @@ import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; import com.denizenscript.denizencore.objects.ObjectTag; -import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; import com.destroystokyo.paper.event.entity.EntityKnockbackByEntityEvent; import org.bukkit.event.EventHandler; @@ -58,7 +58,7 @@ public EntityKnocksbackEntityScriptEvent() { public boolean matches(ScriptPath path) { String attacker = path.eventArgLowerAt(0); String target = path.eventArgLowerAt(3); - if (!hitBy.tryAdvancedMatcher(attacker) || (!entity.tryAdvancedMatcher(target))) { + if (!hitBy.tryAdvancedMatcher(attacker, path.context) || (!entity.tryAdvancedMatcher(target, path.context))) { return false; } if (!runInCheck(path, entity.getLocation())) { diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerEquipsArmorScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerEquipsArmorScriptEvent.java index 204f0587c8..2c3b933852 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerEquipsArmorScriptEvent.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerEquipsArmorScriptEvent.java @@ -77,7 +77,7 @@ public boolean matches(ScriptPath path) { return false; } } - else if (!itemCompare.equals("armor") && !newItem.tryAdvancedMatcher(itemCompare)) { + else if (!itemCompare.equals("armor") && !newItem.tryAdvancedMatcher(itemCompare, path.context)) { return false; } } @@ -87,7 +87,7 @@ else if (!itemCompare.equals("armor") && !newItem.tryAdvancedMatcher(itemCompare return false; } } - else if (!itemCompare.equals("armor") && !oldItem.tryAdvancedMatcher(itemCompare)) { + else if (!itemCompare.equals("armor") && !oldItem.tryAdvancedMatcher(itemCompare, path.context)) { return false; } } diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/utilities/PaperAPIToolsImpl.java b/paper/src/main/java/com/denizenscript/denizen/paper/utilities/PaperAPIToolsImpl.java index 2f8246dd2b..bccb44dc8a 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/utilities/PaperAPIToolsImpl.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/utilities/PaperAPIToolsImpl.java @@ -11,6 +11,7 @@ import com.denizenscript.denizen.utilities.FormattedTextHelper; import com.denizenscript.denizen.utilities.PaperAPITools; import com.denizenscript.denizencore.DenizenCore; +import com.denizenscript.denizencore.tags.TagContext; import com.denizenscript.denizencore.utilities.CoreUtilities; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; @@ -171,11 +172,12 @@ public void registerBrewingRecipe(String keyName, ItemStack result, String input if (!NMSHandler.getVersion().isAtLeast(NMSVersion.v1_18)) { throw new UnsupportedOperationException(); } - RecipeChoice inputChoice = parseBrewingRecipeChoice(itemScriptContainer, input); + TagContext context = DenizenCore.implementation.getTagContext(itemScriptContainer); + RecipeChoice inputChoice = parseBrewingRecipeChoice(itemScriptContainer, input, context); if (inputChoice == null) { return; } - RecipeChoice ingredientChoice = parseBrewingRecipeChoice(itemScriptContainer, ingredient); + RecipeChoice ingredientChoice = parseBrewingRecipeChoice(itemScriptContainer, ingredient, context); if (ingredientChoice == null) { return; } @@ -196,10 +198,10 @@ public void clearBrewingRecipes() { } } - public static RecipeChoice parseBrewingRecipeChoice(ItemScriptContainer container, String choice) { + public static RecipeChoice parseBrewingRecipeChoice(ItemScriptContainer container, String choice, TagContext context) { if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20) && choice.startsWith("matcher:")) { String matcher = choice.substring("matcher:".length()); - return PotionMix.createPredicateChoice(item -> new ItemTag(item).tryAdvancedMatcher(matcher)); + return PotionMix.createPredicateChoice(item -> new ItemTag(item).tryAdvancedMatcher(matcher, context)); } boolean exact = true; if (choice.startsWith("material:")) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/BukkitScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/BukkitScriptEvent.java index e5fc88d214..337060fff7 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/BukkitScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/BukkitScriptEvent.java @@ -441,7 +441,7 @@ public static boolean nonSwitchWithCheck(ScriptPath path, ItemTag held) { } String with = path.eventArgLowerAt(index + 1); - if (with != null && (held == null || !held.tryAdvancedMatcher(with))) { + if (with != null && (held == null || !held.tryAdvancedMatcher(with, path.context))) { return false; } return true; @@ -699,9 +699,9 @@ else if (subit.equals("ellipsoid")) { return false; } if (inputText.startsWith("!")) { - return !inCheckInternal(getTagContext(path), getName(), location, inputText.substring(1), path.event, path.container.getName()); + return !inCheckInternal(path.context, getName(), location, inputText.substring(1), path.event, path.container.getName()); } - return inCheckInternal(getTagContext(path), getName(), location, inputText, path.event, path.container.getName()); + return inCheckInternal(path.context, getName(), location, inputText, path.event, path.container.getName()); } public static boolean inCheckInternal(TagContext context, String name, Location location, String inputText, String evtLine, String containerName) { @@ -814,7 +814,7 @@ public static boolean runWithCheck(ScriptPath path, ItemTag held, String key) { if (CoreUtilities.equalsIgnoreCase(with, "item")) { return true; } - if (held == null || !held.tryAdvancedMatcher(with)) { + if (held == null || !held.tryAdvancedMatcher(with, path.context)) { return false; } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/block/BlockBuiltScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/block/BlockBuiltScriptEvent.java index ca58eb67f8..0a5b3da17a 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/block/BlockBuiltScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/block/BlockBuiltScriptEvent.java @@ -53,7 +53,7 @@ public boolean matches(ScriptPath path) { return false; } String mat2 = path.eventArgLowerAt(4); - if (mat2.length() > 0 && !old_material.tryAdvancedMatcher(mat2)) { + if (mat2.length() > 0 && !old_material.tryAdvancedMatcher(mat2, path.context)) { return false; } if (!path.tryArgObject(0, new_material)) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/block/BlockDestroyedByExplosionEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/block/BlockDestroyedByExplosionEvent.java index c9e9da96a9..807b8baeec 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/block/BlockDestroyedByExplosionEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/block/BlockDestroyedByExplosionEvent.java @@ -59,10 +59,10 @@ public boolean matches(ScriptPath path) { if (!runInCheck(path, location)) { return false; } - if (path.switches.containsKey("source_entity") && (entityEvent == null || !new EntityTag(entityEvent.getEntity()).tryAdvancedMatcher(path.switches.get("source_entity")))) { + if (path.switches.containsKey("source_entity") && (entityEvent == null || !new EntityTag(entityEvent.getEntity()).tryAdvancedMatcher(path.switches.get("source_entity"), path.context))) { return false; } - if (path.switches.containsKey("source_block") && (blockEvent == null || !new LocationTag(blockEvent.getBlock().getLocation()).tryAdvancedMatcher(path.switches.get("source_block")))) { + if (path.switches.containsKey("source_block") && (blockEvent == null || !new LocationTag(blockEvent.getBlock().getLocation()).tryAdvancedMatcher(path.switches.get("source_block"), path.context))) { return false; } return super.matches(path); diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/block/BlockPhysicsScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/block/BlockPhysicsScriptEvent.java index c2608037b7..a078fdc997 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/block/BlockPhysicsScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/block/BlockPhysicsScriptEvent.java @@ -1,11 +1,11 @@ package com.denizenscript.denizen.events.block; +import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.objects.MaterialTag; -import com.denizenscript.denizen.events.BukkitScriptEvent; -import com.denizenscript.denizencore.utilities.debugging.Debug; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; @@ -59,14 +59,14 @@ public boolean matches(ScriptPath path) { } String adjacent = path.switches.get("adjacent"); if (adjacent != null) { - if (!material.tryAdvancedMatcher(adjacent)) { + if (!material.tryAdvancedMatcher(adjacent, path.context)) { Block block = location.getBlock(); - if (!new LocationTag(block.getRelative(0, 1, 0).getLocation()).tryAdvancedMatcher(adjacent) - && !new LocationTag(block.getRelative(0, -1, 0).getLocation()).tryAdvancedMatcher(adjacent) - && !new LocationTag(block.getRelative(1, 0, 0).getLocation()).tryAdvancedMatcher(adjacent) - && !new LocationTag(block.getRelative(-1, 0, 0).getLocation()).tryAdvancedMatcher(adjacent) - && !new LocationTag(block.getRelative(0, 0, 1).getLocation()).tryAdvancedMatcher(adjacent) - && !new LocationTag(block.getRelative(0, 0, -1).getLocation()).tryAdvancedMatcher(adjacent)) { + if (!new LocationTag(block.getRelative(0, 1, 0).getLocation()).tryAdvancedMatcher(adjacent, path.context) + && !new LocationTag(block.getRelative(0, -1, 0).getLocation()).tryAdvancedMatcher(adjacent, path.context) + && !new LocationTag(block.getRelative(1, 0, 0).getLocation()).tryAdvancedMatcher(adjacent, path.context) + && !new LocationTag(block.getRelative(-1, 0, 0).getLocation()).tryAdvancedMatcher(adjacent, path.context) + && !new LocationTag(block.getRelative(0, 0, 1).getLocation()).tryAdvancedMatcher(adjacent, path.context) + && !new LocationTag(block.getRelative(0, 0, -1).getLocation()).tryAdvancedMatcher(adjacent, path.context)) { return false; } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/block/LeafDecaysScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/block/LeafDecaysScriptEvent.java index 7a0115fcbc..6d6a4993be 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/block/LeafDecaysScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/block/LeafDecaysScriptEvent.java @@ -44,7 +44,7 @@ public boolean matches(ScriptPath path) { if (!runInCheck(path, location)) { return false; } - if (!mat.equals("leaves") && !material.tryAdvancedMatcher(mat)) { + if (!mat.equals("leaves") && !material.tryAdvancedMatcher(mat, path.context)) { return false; } return super.matches(path); diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/block/LiquidLevelChangeScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/block/LiquidLevelChangeScriptEvent.java index 2b12be6367..d3fdc67897 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/block/LiquidLevelChangeScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/block/LiquidLevelChangeScriptEvent.java @@ -51,7 +51,7 @@ public boolean couldMatch(ScriptPath path) { @Override public boolean matches(ScriptPath path) { String mat = path.eventArgLowerAt(0); - if (!mat.equals("liquid") && !old_material.tryAdvancedMatcher(mat)) { + if (!mat.equals("liquid") && !old_material.tryAdvancedMatcher(mat, path.context)) { return false; } if (!runInCheck(path, location)) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/block/LiquidSpreadScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/block/LiquidSpreadScriptEvent.java index b6fcf39928..16f2ae0be6 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/block/LiquidSpreadScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/block/LiquidSpreadScriptEvent.java @@ -65,7 +65,7 @@ public boolean matches(ScriptPath path) { } else { String mat = path.eventArgLowerAt(0); - if (!mat.equals("liquid") && !material.tryAdvancedMatcher(mat)) { + if (!mat.equals("liquid") && !material.tryAdvancedMatcher(mat, path.context)) { return false; } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/block/PistonExtendsScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/block/PistonExtendsScriptEvent.java index e1e3d888b9..f544ce7200 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/block/PistonExtendsScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/block/PistonExtendsScriptEvent.java @@ -51,7 +51,7 @@ public boolean matches(ScriptPath path) { if (!runInCheck(path, location)) { return false; } - if (!mat.equals("piston") && !material.tryAdvancedMatcher(mat)) { + if (!mat.equals("piston") && !material.tryAdvancedMatcher(mat, path.context)) { return false; } return super.matches(path); diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/block/PistonRetractsScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/block/PistonRetractsScriptEvent.java index 6172dd18e0..88ae3d2a0a 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/block/PistonRetractsScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/block/PistonRetractsScriptEvent.java @@ -51,7 +51,7 @@ public boolean matches(ScriptPath path) { if (!runInCheck(path, location)) { return false; } - if (!mat.equals("piston") && !material.tryAdvancedMatcher(mat)) { + if (!mat.equals("piston") && !material.tryAdvancedMatcher(mat, path.context)) { return false; } return super.matches(path); diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/AreaEnterExitScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/AreaEnterExitScriptEvent.java index eb22fd7c4a..f9fb2c4ba0 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/AreaEnterExitScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/AreaEnterExitScriptEvent.java @@ -71,7 +71,7 @@ public boolean matches(ScriptPath path) { if (areaName.equals("notable")) { // TODO: Deprecate? areaName = path.eventArgLowerAt(3); } - if (!area.tryAdvancedMatcher(areaName)) { + if (!area.tryAdvancedMatcher(areaName, path.context)) { return false; } if (!path.tryArgObject(0, currentEntity)) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/DragonPhaseChangeScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/DragonPhaseChangeScriptEvent.java index 2f423262f9..66b6a847e9 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/DragonPhaseChangeScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/DragonPhaseChangeScriptEvent.java @@ -47,7 +47,7 @@ public DragonPhaseChangeScriptEvent() { @Override public boolean matches(ScriptPath path) { String target = path.eventArgLowerAt(0); - if (!entity.tryAdvancedMatcher(target)) { + if (!entity.tryAdvancedMatcher(target, path.context)) { return false; } if (!runInCheck(path, entity.getLocation())) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityAirLevelChangeScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityAirLevelChangeScriptEvent.java index 0e53bd018f..47ac143ac1 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityAirLevelChangeScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityAirLevelChangeScriptEvent.java @@ -51,7 +51,7 @@ public EntityAirLevelChangeScriptEvent() { @Override public boolean matches(ScriptPath path) { String target = path.eventArgLowerAt(0); - if (!entity.tryAdvancedMatcher(target)) { + if (!entity.tryAdvancedMatcher(target, path.context)) { return false; } if (!runInCheck(path, entity.getLocation())) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityBreaksHangingScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityBreaksHangingScriptEvent.java index 8d658d9a05..aa4a142ce0 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityBreaksHangingScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityBreaksHangingScriptEvent.java @@ -1,11 +1,11 @@ package com.denizenscript.denizen.events.entity; +import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; -import com.denizenscript.denizen.events.BukkitScriptEvent; -import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -66,10 +66,10 @@ public boolean couldMatch(ScriptPath path) { public boolean matches(ScriptPath path) { String entName = path.eventArgLowerAt(0); String hang = path.eventArgLowerAt(2); - if (!breaker.tryAdvancedMatcher(entName)) { + if (!breaker.tryAdvancedMatcher(entName, path.context)) { return false; } - if (!hang.equals("hanging") && !hanging.tryAdvancedMatcher(hang)) { + if (!hang.equals("hanging") && !hanging.tryAdvancedMatcher(hang, path.context)) { return false; } if (!runInCheck(path, location)) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityChangesBlockScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityChangesBlockScriptEvent.java index 805c0a4a3d..873ccd4de9 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityChangesBlockScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityChangesBlockScriptEvent.java @@ -1,13 +1,13 @@ package com.denizenscript.denizen.events.entity; +import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.objects.MaterialTag; -import com.denizenscript.denizencore.utilities.debugging.Debug; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; -import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; +import com.denizenscript.denizencore.utilities.debugging.Debug; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityChangeBlockEvent; @@ -49,7 +49,7 @@ public EntityChangesBlockScriptEvent() { @Override public boolean matches(ScriptPath path) { String entName = path.eventArgLowerAt(0); - if (!entity.tryAdvancedMatcher(entName)) { + if (!entity.tryAdvancedMatcher(entName, path.context)) { return false; } if (!path.tryArgObject(2, old_material)) { @@ -61,7 +61,7 @@ public boolean matches(ScriptPath path) { Debug.echoError("Invalid event material [" + getName() + "]: '" + path.event + "' for " + path.container.getName()); return false; } - else if (!new_material.tryAdvancedMatcher(mat2)) { + else if (!new_material.tryAdvancedMatcher(mat2, path.context)) { return false; } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityDamagedScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityDamagedScriptEvent.java index 0f3ee6cd1d..3b310639b8 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityDamagedScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityDamagedScriptEvent.java @@ -1,16 +1,16 @@ package com.denizenscript.denizen.events.entity; +import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.objects.LocationTag; +import com.denizenscript.denizen.utilities.BukkitImplDeprecations; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; -import com.denizenscript.denizen.events.BukkitScriptEvent; -import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.MapTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; import com.denizenscript.denizencore.utilities.CoreUtilities; -import com.denizenscript.denizen.utilities.BukkitImplDeprecations; import org.bukkit.block.Block; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; @@ -133,7 +133,7 @@ public boolean matches(ScriptPath path) { String target = cmd.equals("damages") ? path.eventArgLowerAt(2) : path.eventArgLowerAt(0); if (!attacker.isEmpty()) { if (damager != null) { - if (!runGenericCheck(attacker, event.getCause().name()) && (projectile == null || !projectile.tryAdvancedMatcher(attacker)) && (damager == null || !damager.tryAdvancedMatcher(attacker))) { + if (!runGenericCheck(attacker, event.getCause().name()) && (projectile == null || !projectile.tryAdvancedMatcher(attacker, path.context)) && (damager == null || !damager.tryAdvancedMatcher(attacker, path.context))) { return false; } } @@ -143,7 +143,7 @@ public boolean matches(ScriptPath path) { } } } - if (!entity.tryAdvancedMatcher(target) || !path.tryObjectSwitch("type", entity)) { + if (!entity.tryAdvancedMatcher(target, path.context) || !path.tryObjectSwitch("type", entity)) { return false; } if (!runInCheck(path, entity.getLocation())) { @@ -161,7 +161,7 @@ public boolean matches(ScriptPath path) { if (block == null) { return false; } - if (!new LocationTag(block.getLocation()).tryAdvancedMatcher(blockMatcher)) { + if (!new LocationTag(block.getLocation()).tryAdvancedMatcher(blockMatcher, path.context)) { return false; } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityDeathScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityDeathScriptEvent.java index 75a9a70617..2141a8629f 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityDeathScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityDeathScriptEvent.java @@ -79,7 +79,7 @@ public EntityDeathScriptEvent() { @Override public boolean matches(ScriptPath path) { String target = path.eventArgLowerAt(0); - if (!entity.tryAdvancedMatcher(target)) { + if (!entity.tryAdvancedMatcher(target, path.context)) { return false; } if (!runInCheck(path, entity.getLocation())) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityDespawnScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityDespawnScriptEvent.java index 6980fc81a4..e39a215822 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityDespawnScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityDespawnScriptEvent.java @@ -44,7 +44,7 @@ public EntityDespawnScriptEvent() { @Override public boolean matches(ScriptPath path) { String target = path.eventArgLowerAt(0); - if (!entity.tryAdvancedMatcher(target)) { + if (!entity.tryAdvancedMatcher(target, path.context)) { return false; } if (!path.checkSwitch("cause", cause.asLowerString())) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityDropsItemScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityDropsItemScriptEvent.java index 18e0a0b037..21942ffb38 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityDropsItemScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityDropsItemScriptEvent.java @@ -52,7 +52,7 @@ public boolean matches(ScriptPath path) { return false; } String iCheck = path.eventArgLowerAt(2); - if (!item.tryAdvancedMatcher(iCheck)) { + if (!item.tryAdvancedMatcher(iCheck, path.context)) { return false; } if (!runInCheck(path, location)) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityEntersPortalScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityEntersPortalScriptEvent.java index 22edce17a6..40799e70a8 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityEntersPortalScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityEntersPortalScriptEvent.java @@ -43,7 +43,7 @@ public EntityEntersPortalScriptEvent() { @Override public boolean matches(ScriptPath path) { String target = path.eventArgLowerAt(0); - if (!entity.tryAdvancedMatcher(target)) { + if (!entity.tryAdvancedMatcher(target, path.context)) { return false; } if (!runInCheck(path, entity.getLocation())) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityEntersVehicleScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityEntersVehicleScriptEvent.java index b6db4c0487..6fefc81e8f 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityEntersVehicleScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityEntersVehicleScriptEvent.java @@ -63,7 +63,7 @@ public boolean matches(ScriptPath path) { return false; } String vehicleLabel = path.eventArgLowerAt(2); - if (!vehicleLabel.equals("vehicle") && !vehicle.tryAdvancedMatcher(vehicleLabel)) { + if (!vehicleLabel.equals("vehicle") && !vehicle.tryAdvancedMatcher(vehicleLabel, path.context)) { return false; } if (!runInCheck(path, vehicle.getLocation())) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExitsPortalScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExitsPortalScriptEvent.java index 201a7931c2..211b259437 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExitsPortalScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExitsPortalScriptEvent.java @@ -43,7 +43,7 @@ public EntityExitsPortalScriptEvent() { @Override public boolean matches(ScriptPath path) { String target = path.eventArgLowerAt(0); - if (!entity.tryAdvancedMatcher(target)) { + if (!entity.tryAdvancedMatcher(target, path.context)) { return false; } if (!runInCheck(path, entity.getLocation())) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExitsVehicleScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExitsVehicleScriptEvent.java index 223d15f122..01902181df 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExitsVehicleScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExitsVehicleScriptEvent.java @@ -47,7 +47,7 @@ public boolean matches(ScriptPath path) { return false; } String vehicleLabel = path.eventArgLowerAt(2); - if (!vehicleLabel.equals("vehicle") && !vehicle.tryAdvancedMatcher(vehicleLabel)) { + if (!vehicleLabel.equals("vehicle") && !vehicle.tryAdvancedMatcher(vehicleLabel, path.context)) { return false; } if (!runInCheck(path, vehicle.getLocation())) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExplodesScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExplodesScriptEvent.java index 7620104945..33d0e303e9 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExplodesScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityExplodesScriptEvent.java @@ -52,7 +52,7 @@ public EntityExplodesScriptEvent() { @Override public boolean matches(ScriptPath path) { String target = path.eventArgLowerAt(0); - if (!entity.tryAdvancedMatcher(target)) { + if (!entity.tryAdvancedMatcher(target, path.context)) { return false; } if (!runInCheck(path, entity.getLocation())) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityFoodLevelChangeScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityFoodLevelChangeScriptEvent.java index 235c46cea5..1e2c42f4e8 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityFoodLevelChangeScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityFoodLevelChangeScriptEvent.java @@ -55,7 +55,7 @@ public EntityFoodLevelChangeScriptEvent() { @Override public boolean matches(ScriptPath path) { String target = path.eventArgLowerAt(0); - if (!entity.tryAdvancedMatcher(target)) { + if (!entity.tryAdvancedMatcher(target, path.context)) { return false; } if (!path.tryObjectSwitch("item", item)) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityKilledScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityKilledScriptEvent.java index 63e1947373..f410540029 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityKilledScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityKilledScriptEvent.java @@ -1,16 +1,16 @@ package com.denizenscript.denizen.events.entity; +import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.NPCTag; import com.denizenscript.denizen.objects.PlayerTag; +import com.denizenscript.denizen.utilities.BukkitImplDeprecations; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; -import com.denizenscript.denizen.events.BukkitScriptEvent; -import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.MapTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; import com.denizenscript.denizencore.utilities.CoreUtilities; -import com.denizenscript.denizen.utilities.BukkitImplDeprecations; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -76,7 +76,7 @@ public boolean matches(ScriptPath path) { String target = cmd.equals("kills") ? arg2 : arg0; if (!attacker.isEmpty()) { if (damager != null) { - if (!runGenericCheck(attacker, event.getCause().name()) && (projectile == null || !projectile.tryAdvancedMatcher(attacker)) && (damager == null || !damager.tryAdvancedMatcher(attacker))) { + if (!runGenericCheck(attacker, event.getCause().name()) && (projectile == null || !projectile.tryAdvancedMatcher(attacker, path.context)) && (damager == null || !damager.tryAdvancedMatcher(attacker, path.context))) { return false; } } @@ -84,7 +84,7 @@ else if (!runGenericCheck(attacker, event.getCause().name())) { return false; } } - if (!entity.tryAdvancedMatcher(target)) { + if (!entity.tryAdvancedMatcher(target, path.context)) { return false; } if (!runInCheck(path, entity.getLocation())) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityPotionEffectScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityPotionEffectScriptEvent.java index 19674d4b3d..531adc9734 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityPotionEffectScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityPotionEffectScriptEvent.java @@ -76,7 +76,7 @@ public boolean matches(ScriptPath path) { if (!change.equals("modified") && !runGenericCheck(change, CoreUtilities.toLowerCase(event.getAction().name()))) { return false; } - if (!entity.tryAdvancedMatcher(target)) { + if (!entity.tryAdvancedMatcher(target, path.context)) { return false; } if (!runInCheck(path, entity.getLocation())) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityShootsBowScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityShootsBowScriptEvent.java index 5ced7b6056..fca35efd42 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityShootsBowScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityShootsBowScriptEvent.java @@ -1,13 +1,14 @@ package com.denizenscript.denizen.events.entity; import com.denizenscript.denizen.Denizen; +import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.utilities.Conversion; import com.denizenscript.denizen.utilities.entity.Position; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; -import com.denizenscript.denizen.events.BukkitScriptEvent; -import com.denizenscript.denizencore.objects.*; +import com.denizenscript.denizencore.objects.Argument; +import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.ListTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; @@ -67,10 +68,10 @@ public EntityShootsBowScriptEvent() { public boolean matches(ScriptPath path) { String attacker = path.eventArgLowerAt(0); String item = path.eventArgLowerAt(2); - if (!entity.tryAdvancedMatcher(attacker)) { + if (!entity.tryAdvancedMatcher(attacker, path.context)) { return false; } - if (!item.equals("bow") && !bow.tryAdvancedMatcher(item)) { + if (!item.equals("bow") && !bow.tryAdvancedMatcher(item, path.context)) { return false; } if (!runInCheck(path, entity.getLocation())) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityTamesScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityTamesScriptEvent.java index 39090a34bd..10881babc4 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityTamesScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityTamesScriptEvent.java @@ -1,8 +1,8 @@ package com.denizenscript.denizen.events.entity; +import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; -import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; import org.bukkit.entity.Entity; @@ -60,7 +60,7 @@ public boolean matches(ScriptPath path) { String cmd = path.eventArgLowerAt(1); String ownerTest = cmd.equals("tames") ? path.eventArgLowerAt(0) : path.eventArgLowerAt(2); String tamed = cmd.equals("tamed") ? path.eventArgLowerAt(0) : path.eventArgLowerAt(2); - if (!owner.tryAdvancedMatcher(ownerTest) || !entity.tryAdvancedMatcher(tamed)) { + if (!owner.tryAdvancedMatcher(ownerTest, path.context) || !entity.tryAdvancedMatcher(tamed, path.context)) { return false; } if (!runInCheck(path, entity.getLocation())) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityTargetsScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityTargetsScriptEvent.java index c5b0412b33..19afaae973 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityTargetsScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityTargetsScriptEvent.java @@ -53,7 +53,7 @@ public boolean matches(ScriptPath path) { return false; } String victim = path.eventArgLowerAt(2); - if (!victim.equals("in") && !victim.equals("because") && !victim.equals("") && (target == null || !target.tryAdvancedMatcher(victim))) { + if (!victim.equals("in") && !victim.equals("because") && !victim.equals("") && (target == null || !target.tryAdvancedMatcher(victim, path.context))) { return false; } if (!runInCheck(path, location)) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/HangingBreaksScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/HangingBreaksScriptEvent.java index c00c896122..c5f62b6f4e 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/HangingBreaksScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/HangingBreaksScriptEvent.java @@ -43,7 +43,7 @@ public HangingBreaksScriptEvent() { @Override public boolean matches(ScriptPath path) { String hangCheck = path.eventArgLowerAt(0); - if (!hanging.tryAdvancedMatcher(hangCheck)) { + if (!hanging.tryAdvancedMatcher(hangCheck, path.context)) { return false; } if (path.eventArgLowerAt(2).equals("because") && !path.eventArgLowerAt(3).equals(cause.asLowerString())) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/HorseJumpsScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/HorseJumpsScriptEvent.java index 43a27896dc..32e0c867b5 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/HorseJumpsScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/HorseJumpsScriptEvent.java @@ -64,7 +64,7 @@ public boolean matches(ScriptPath path) { String arg1 = path.eventArgLowerAt(0); String arg2 = path.eventArgLowerAt(1); String tamed = arg2.equals("jumps") ? arg1 : arg2; - if (!entity.tryAdvancedMatcher(tamed)) { + if (!entity.tryAdvancedMatcher(tamed, path.context)) { return false; } if (path.eventArgLowerAt(2).equals("jumps") && (color == null || !arg1.equals(CoreUtilities.toLowerCase(color.toString())))) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/ProjectileLaunchedScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/ProjectileLaunchedScriptEvent.java index def8c5cc33..ef0cc8b83d 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/ProjectileLaunchedScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/ProjectileLaunchedScriptEvent.java @@ -52,7 +52,7 @@ public boolean couldMatch(ScriptPath path) { @Override public boolean matches(ScriptPath path) { String projTest = path.eventArgLowerAt(0); - if (!projTest.equals("projectile") && !projectile.tryAdvancedMatcher(projTest)) { + if (!projTest.equals("projectile") && !projectile.tryAdvancedMatcher(projTest, path.context)) { return false; } if (!runInCheck(path, location)) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/BlockDropsItemScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/BlockDropsItemScriptEvent.java index 9286634a72..5d1aecfb39 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/BlockDropsItemScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/BlockDropsItemScriptEvent.java @@ -70,7 +70,7 @@ public boolean matches(ScriptPath path) { if (!item.equals("item")) { boolean anyMatch = false; for (Item itemEnt : event.getItems()) { - if (new ItemTag(itemEnt.getItemStack()).tryAdvancedMatcher(item)) { + if (new ItemTag(itemEnt.getItemStack()).tryAdvancedMatcher(item, path.context)) { anyMatch = true; break; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerAnimatesScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerAnimatesScriptEvent.java index 521748d85f..018838866e 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerAnimatesScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerAnimatesScriptEvent.java @@ -65,12 +65,12 @@ public boolean matches(ScriptPath path) { String with = path.switches.get("with"); if (with != null) { if (event.getAnimationType() == PlayerAnimationType.ARM_SWING) { - if (!new ItemTag(event.getPlayer().getEquipment().getItemInMainHand()).tryAdvancedMatcher(with)) { + if (!new ItemTag(event.getPlayer().getEquipment().getItemInMainHand()).tryAdvancedMatcher(with, path.context)) { return false; } } else if (event.getAnimationType() == PlayerAnimationType.OFF_ARM_SWING) { - if (!new ItemTag(event.getPlayer().getEquipment().getItemInOffHand()).tryAdvancedMatcher(with)) { + if (!new ItemTag(event.getPlayer().getEquipment().getItemInOffHand()).tryAdvancedMatcher(with, path.context)) { return false; } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerBreaksBlockScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerBreaksBlockScriptEvent.java index ff2e429b0f..c95d2a0080 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerBreaksBlockScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerBreaksBlockScriptEvent.java @@ -77,7 +77,7 @@ public boolean couldMatch(ScriptPath path) { @Override public boolean matches(ScriptPath path) { String mat = path.eventArgLowerAt(2); - if (!material.tryAdvancedMatcher(mat)) { + if (!material.tryAdvancedMatcher(mat, path.context)) { return false; } if (!runInCheck(path, location)) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerChangesSignScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerChangesSignScriptEvent.java index aac3564ffe..a2122a61cc 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerChangesSignScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerChangesSignScriptEvent.java @@ -69,7 +69,7 @@ public boolean couldMatch(ScriptPath path) { @Override public boolean matches(ScriptPath path) { String mat = path.eventArgLowerAt(2); - if (!mat.equals("sign") && (!material.tryAdvancedMatcher(mat))) { + if (!mat.equals("sign") && (!material.tryAdvancedMatcher(mat, path.context))) { return false; } if (!runInCheck(path, location)) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerChangesWorldScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerChangesWorldScriptEvent.java index d59737420e..5e6e99c601 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerChangesWorldScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerChangesWorldScriptEvent.java @@ -1,9 +1,9 @@ package com.denizenscript.denizen.events.player; +import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.WorldTag; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; -import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; import org.bukkit.event.EventHandler; @@ -49,10 +49,10 @@ public boolean matches(ScriptPath path) { String[] data = path.eventArgsLower; // TODO: Switches for (int index = 3; index < data.length; index++) { - if (data[index].equals("from") && !origin_world.tryAdvancedMatcher(data[index + 1])) { + if (data[index].equals("from") && !origin_world.tryAdvancedMatcher(data[index + 1], path.context)) { return false; } - else if (data[index].equals("to") && !destination_world.tryAdvancedMatcher(data[index + 1])) { + else if (data[index].equals("to") && !destination_world.tryAdvancedMatcher(data[index + 1], path.context)) { return false; } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerClicksBlockScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerClicksBlockScriptEvent.java index 067f9630fd..ed7d477365 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerClicksBlockScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerClicksBlockScriptEvent.java @@ -127,7 +127,7 @@ public boolean matches(ScriptPath path) { return false; } String mat = path.eventArgLowerAt(index + 1); - if (mat.length() > 0 && !withHelpList.contains(mat) && !blockMaterial.tryAdvancedMatcher(mat)) { + if (mat.length() > 0 && !withHelpList.contains(mat) && !blockMaterial.tryAdvancedMatcher(mat, path.context)) { return false; } if (!nonSwitchWithCheck(path, new ItemTag(event.getItem()))) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerClicksInInventoryScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerClicksInInventoryScriptEvent.java index 5dfca3aa54..a1a1956e6d 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerClicksInInventoryScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerClicksInInventoryScriptEvent.java @@ -149,7 +149,7 @@ public boolean matches(ScriptPath path) { return false; } String clickedItemText = path.eventArgLowerAt(hasClickType ? 3 : 2); - if (!clickedItemText.equals("in") && !item.tryAdvancedMatcher(clickedItemText)) { + if (!clickedItemText.equals("in") && !item.tryAdvancedMatcher(clickedItemText, path.context)) { return false; } int inIndex = -1; @@ -158,7 +158,7 @@ public boolean matches(ScriptPath path) { inIndex = i; } } - if (!inventory.tryAdvancedMatcher(path.eventArgLowerAt(inIndex + 1))) { + if (!inventory.tryAdvancedMatcher(path.eventArgLowerAt(inIndex + 1), path.context)) { return false; } if (!runWithCheck(path, cursor)) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerDragsInInvScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerDragsInInvScriptEvent.java index c2ece26a73..bf484e52da 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerDragsInInvScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerDragsInInvScriptEvent.java @@ -1,15 +1,15 @@ package com.denizenscript.denizen.events.player; import com.denizenscript.denizen.Denizen; +import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.InventoryTag; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.objects.PlayerTag; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; -import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.ListTag; -import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -72,10 +72,10 @@ public boolean matches(ScriptPath path) { String arg3 = path.eventArgLowerAt(3); String arg4 = path.eventArgLowerAt(4); String inv = arg2.equals("in") ? arg3 : arg3.equals("in") ? arg4 : ""; - if (!inv.equals("") && !dInv.tryAdvancedMatcher(inv)) { + if (!inv.equals("") && !dInv.tryAdvancedMatcher(inv, path.context)) { return false; } - if (!arg2.equals("in") && !item.tryAdvancedMatcher(arg2)) { + if (!arg2.equals("in") && !item.tryAdvancedMatcher(arg2, path.context)) { return false; } if (!runInCheck(path, entity.getLocation(), "in_area")) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerEmptiesBucketScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerEmptiesBucketScriptEvent.java index 855cb421fc..931a7ed137 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerEmptiesBucketScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerEmptiesBucketScriptEvent.java @@ -50,7 +50,7 @@ public PlayerEmptiesBucketScriptEvent() { @Override public boolean matches(ScriptPath path) { String iTest = path.eventArgLowerAt(2); - if ((!iTest.equals("bucket") && !item.tryAdvancedMatcher(iTest)) || !runInCheck(path, location)) { + if ((!iTest.equals("bucket") && !item.tryAdvancedMatcher(iTest, path.context)) || !runInCheck(path, location)) { return false; } return super.matches(path); diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerFillsBucketScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerFillsBucketScriptEvent.java index 41bf4f5ca8..d5321336d2 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerFillsBucketScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerFillsBucketScriptEvent.java @@ -51,7 +51,7 @@ public PlayerFillsBucketScriptEvent() { @Override public boolean matches(ScriptPath path) { String iTest = path.eventArgLowerAt(2); - if ((!iTest.equals("bucket") && !item.tryAdvancedMatcher(iTest)) || !runInCheck(path, location)) { + if ((!iTest.equals("bucket") && !item.tryAdvancedMatcher(iTest, path.context)) || !runInCheck(path, location)) { return false; } return super.matches(path); diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerFishesScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerFishesScriptEvent.java index 88facf69d5..10c840628c 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerFishesScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerFishesScriptEvent.java @@ -10,7 +10,6 @@ import com.denizenscript.denizencore.utilities.CoreUtilities; import org.bukkit.Material; import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; import org.bukkit.entity.Item; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -69,11 +68,11 @@ public boolean matches(ScriptPath path) { if (entity == null) { return false; } - if (!entity.tryAdvancedMatcher(fish)) { + if (!entity.tryAdvancedMatcher(fish, path.context)) { if (item == null) { return false; } - if (!item.tryAdvancedMatcher(fish)) { + if (!item.tryAdvancedMatcher(fish, path.context)) { return false; } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerPlacesBlockScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerPlacesBlockScriptEvent.java index cbb213753c..6578e5bf04 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerPlacesBlockScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerPlacesBlockScriptEvent.java @@ -1,10 +1,13 @@ package com.denizenscript.denizen.events.player; -import com.denizenscript.denizen.objects.*; -import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; import com.denizenscript.denizen.events.BukkitScriptEvent; -import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizen.objects.LocationTag; +import com.denizenscript.denizen.objects.MaterialTag; +import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -69,7 +72,7 @@ public PlayerPlacesBlockScriptEvent() { @Override public boolean matches(ScriptPath path) { String mat = path.eventArgLowerAt(2); - if (!item_in_hand.tryAdvancedMatcher(mat) && !material.tryAdvancedMatcher(mat)) { + if (!item_in_hand.tryAdvancedMatcher(mat, path.context) && !material.tryAdvancedMatcher(mat, path.context)) { return false; } if (!runGenericSwitchCheck(path, "using", hand.asString())) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerPlacesHangingScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerPlacesHangingScriptEvent.java index 3d51136ec3..53339f0877 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerPlacesHangingScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerPlacesHangingScriptEvent.java @@ -50,7 +50,7 @@ public PlayerPlacesHangingScriptEvent() { @Override public boolean matches(ScriptPath path) { String hangCheck = path.eventArgLowerAt(2); - if (!hanging.tryAdvancedMatcher(hangCheck)) { + if (!hanging.tryAdvancedMatcher(hangCheck, path.context)) { return false; } if (!runInCheck(path, location)) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerRightClicksEntityScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerRightClicksEntityScriptEvent.java index 9bd8e210e7..e6a47e9ca2 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerRightClicksEntityScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerRightClicksEntityScriptEvent.java @@ -1,12 +1,15 @@ package com.denizenscript.denizen.events.player; -import com.denizenscript.denizen.objects.*; -import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizen.objects.LocationTag; +import com.denizenscript.denizen.objects.PlayerTag; +import com.denizenscript.denizen.utilities.BukkitImplDeprecations; +import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; -import com.denizenscript.denizen.utilities.BukkitImplDeprecations; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerInteractAtEntityEvent; @@ -53,7 +56,7 @@ public PlayerRightClicksEntityScriptEvent() { @Override public boolean matches(ScriptPath path) { boolean isAt = path.eventArgLowerAt(3).equals("at"); - if (!entity.tryAdvancedMatcher(path.eventArgLowerAt(isAt ? 4 : 3))) { + if (!entity.tryAdvancedMatcher(path.eventArgLowerAt(isAt ? 4 : 3), path.context)) { return false; } if (!runInCheck(path, entity.getLocation())) { @@ -63,7 +66,7 @@ public boolean matches(ScriptPath path) { return false; } // Deprecated in favor of with: format - if (path.eventArgLowerAt(isAt ? 5 : 4).equals("with") && !item.tryAdvancedMatcher(path.eventArgLowerAt(isAt ? 6 : 5))) { + if (path.eventArgLowerAt(isAt ? 5 : 4).equals("with") && !item.tryAdvancedMatcher(path.eventArgLowerAt(isAt ? 6 : 5), path.context)) { return false; } if (!path.tryObjectSwitch("type", entity)) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerShearsScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerShearsScriptEvent.java index d96d4c797f..5cd65a73b4 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerShearsScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerShearsScriptEvent.java @@ -57,7 +57,7 @@ public boolean couldMatch(ScriptPath path) { public boolean matches(ScriptPath path) { String ent = path.eventArgLowerAt(3).equals("sheep") ? "sheep" : path.eventArgLowerAt(2); - if (!ent.equals("sheep") && !entity.tryAdvancedMatcher(ent)) { + if (!ent.equals("sheep") && !entity.tryAdvancedMatcher(ent, path.context)) { return false; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerStandsOnScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerStandsOnScriptEvent.java index 8186a5d36c..4c34448ae9 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerStandsOnScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerStandsOnScriptEvent.java @@ -58,7 +58,7 @@ public boolean couldMatch(ScriptPath path) { @Override public boolean matches(ScriptPath path) { String mat = path.eventArgLowerAt(3); - if (mat.length() > 0 && !mat.equals("in") && !material.tryAdvancedMatcher(mat)) { + if (mat.length() > 0 && !mat.equals("in") && !material.tryAdvancedMatcher(mat, path.context)) { return false; } if (!runInCheck(path, location)) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerSteersEntityScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerSteersEntityScriptEvent.java index 7cc569f9a6..f00bc4fc54 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerSteersEntityScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerSteersEntityScriptEvent.java @@ -72,7 +72,7 @@ public boolean couldMatch(ScriptPath path) { @Override public boolean matches(ScriptPath path) { String entityName = path.eventArgLowerAt(2); - if (!entity.tryAdvancedMatcher(entityName)) { + if (!entity.tryAdvancedMatcher(entityName, path.context)) { return false; } if (!runInCheck(path, entity.getLocation())) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/vehicle/VehicleDamagedScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/vehicle/VehicleDamagedScriptEvent.java index b321710b36..d26467933f 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/vehicle/VehicleDamagedScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/vehicle/VehicleDamagedScriptEvent.java @@ -1,8 +1,8 @@ package com.denizenscript.denizen.events.vehicle; +import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; -import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; @@ -82,10 +82,10 @@ public boolean matches(ScriptPath path) { String cmd = path.eventArgLowerAt(1); String veh = cmd.equals("damaged") ? path.eventArgLowerAt(0) : path.eventArgLowerAt(2); String ent = cmd.equals("damages") ? path.eventArgLowerAt(0) : ""; - if (!vehicle.tryAdvancedMatcher(veh)) { + if (!vehicle.tryAdvancedMatcher(veh, path.context)) { return false; } - if (!ent.isEmpty() && (entity == null || !entity.tryAdvancedMatcher(ent))) { + if (!ent.isEmpty() && (entity == null || !entity.tryAdvancedMatcher(ent, path.context))) { return false; } if (!runInCheck(path, vehicle.getLocation())) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/vehicle/VehicleDestroyedScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/vehicle/VehicleDestroyedScriptEvent.java index f0d0f337e8..2deb0ff896 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/vehicle/VehicleDestroyedScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/vehicle/VehicleDestroyedScriptEvent.java @@ -1,8 +1,8 @@ package com.denizenscript.denizen.events.vehicle; +import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; -import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; import org.bukkit.event.EventHandler; @@ -77,10 +77,10 @@ public boolean matches(ScriptPath path) { String cmd = path.eventArgLowerAt(1); String veh = cmd.equals("destroyed") ? path.eventArgLowerAt(0) : path.eventArgLowerAt(2); String ent = cmd.equals("destroys") ? path.eventArgLowerAt(0) : ""; - if (!vehicle.tryAdvancedMatcher(veh)) { + if (!vehicle.tryAdvancedMatcher(veh, path.context)) { return false; } - if (ent.length() > 0 && (entity == null || !entity.tryAdvancedMatcher(ent))) { + if (ent.length() > 0 && (entity == null || !entity.tryAdvancedMatcher(ent, path.context))) { return false; } if (!runInCheck(path, vehicle.getLocation())) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/world/ChunkLoadEntitiesScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/world/ChunkLoadEntitiesScriptEvent.java index 522d9bc964..eb99a0b664 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/world/ChunkLoadEntitiesScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/world/ChunkLoadEntitiesScriptEvent.java @@ -54,7 +54,7 @@ public boolean matches(ScriptPath path) { if (typeMatch != null) { boolean any = false; for (Entity e : event.getEntities()) { - any = new EntityTag(e).tryAdvancedMatcher(typeMatch); + any = new EntityTag(e).tryAdvancedMatcher(typeMatch, path.context); if (any) { break; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/world/ChunkUnloadEntitiesScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/world/ChunkUnloadEntitiesScriptEvent.java index 4ec5213044..a054641aee 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/world/ChunkUnloadEntitiesScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/world/ChunkUnloadEntitiesScriptEvent.java @@ -54,7 +54,7 @@ public boolean matches(ScriptPath path) { if (typeMatch != null) { boolean any = false; for (Entity e : event.getEntities()) { - any = new EntityTag(e).tryAdvancedMatcher(typeMatch); + any = new EntityTag(e).tryAdvancedMatcher(typeMatch, path.context); if (any) { break; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/world/PotionSplashScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/world/PotionSplashScriptEvent.java index 5ce1e401ef..768b0a3d67 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/world/PotionSplashScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/world/PotionSplashScriptEvent.java @@ -64,7 +64,7 @@ public PotionSplashScriptEvent() { @Override public boolean matches(ScriptPath path) { String item = path.eventArgLowerAt(0); - if (!potion.tryAdvancedMatcher(item)) { + if (!potion.tryAdvancedMatcher(item, path.context)) { return false; } if (!runInCheck(path, location)) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/AreaContainmentObject.java b/plugin/src/main/java/com/denizenscript/denizen/objects/AreaContainmentObject.java index 70a4c187aa..acfa2f35b8 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/AreaContainmentObject.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/AreaContainmentObject.java @@ -170,7 +170,7 @@ static void register(Class type, ObjectTagP for (Entity ent : area.getCuboidBoundary().getEntitiesPossiblyWithinForTag()) { if (area.doesContainLocation(ent.getLocation())) { EntityTag current = new EntityTag(ent); - if (matcher == null || current.tryAdvancedMatcher(matcher)) { + if (matcher == null || current.tryAdvancedMatcher(matcher, attribute.context)) { entities.addObject(current.getDenizenObject()); } } @@ -226,7 +226,7 @@ static void register(Class type, ObjectTagP NMSHandler.chunkHelper.changeChunkServerThread(area.getWorld().getWorld()); try { String matcher = attribute.getParam(); - Predicate predicate = (l) -> new LocationTag(l).tryAdvancedMatcher(matcher); + Predicate predicate = (l) -> new LocationTag(l).tryAdvancedMatcher(matcher, attribute.context); return area.getBlocks(predicate); } finally { @@ -252,7 +252,7 @@ static void register(Class type, ObjectTagP try { if (attribute.hasParam()) { String matcher = attribute.getParam(); - Predicate predicate = (l) -> SpawnableHelper.isSpawnable(l) && new LocationTag(l.getBlock().getRelative(0, -1, 0).getLocation()).tryAdvancedMatcher(matcher); + Predicate predicate = (l) -> SpawnableHelper.isSpawnable(l) && new LocationTag(l.getBlock().getRelative(0, -1, 0).getLocation()).tryAdvancedMatcher(matcher, attribute.context); return area.getBlocks(predicate); } return area.getBlocks(SpawnableHelper::isSpawnable); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/CuboidTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/CuboidTag.java index 6384d8f548..59afc17d17 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/CuboidTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/CuboidTag.java @@ -1871,7 +1871,7 @@ public void adjust(Mechanism mechanism) { } @Override - public boolean advancedMatches(String matcher) { + public boolean advancedMatches(String matcher, TagContext context) { String matcherLow = CoreUtilities.toLowerCase(matcher); if (matcherLow.equals("cuboid")) { return true; diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/EllipsoidTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/EllipsoidTag.java index edb5fe771a..76ec5a4aef 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/EllipsoidTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/EllipsoidTag.java @@ -653,7 +653,7 @@ public void adjust(Mechanism mechanism) { } @Override - public boolean advancedMatches(String matcher) { + public boolean advancedMatches(String matcher, TagContext context) { String matcherLow = CoreUtilities.toLowerCase(matcher); if (matcherLow.equals("ellipsoid")) { return true; diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java index 7994f5a654..93125a477e 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java @@ -2160,7 +2160,7 @@ else if (object.getBukkitEntity() instanceof ShulkerBullet) { if (attribute.startsWith("type", 2) && attribute.hasContext(2)) { attribute.fulfill(1); String matcher = attribute.getParam(); - requirement = (e) -> !e.equals(object.getBukkitEntity()) && new EntityTag(e).tryAdvancedMatcher(matcher); + requirement = (e) -> !e.equals(object.getBukkitEntity()) && new EntityTag(e).tryAdvancedMatcher(matcher, attribute.context); } else { requirement = (e) -> !e.equals(object.getBukkitEntity()); @@ -2196,7 +2196,7 @@ else if (object.getBukkitEntity() instanceof ShulkerBullet) { if (attribute.startsWith("type", 2) && attribute.hasContext(2)) { attribute.fulfill(1); String matcher = attribute.getParam(); - requirement = (e) -> !e.equals(object.getBukkitEntity()) && new EntityTag(e).tryAdvancedMatcher(matcher); + requirement = (e) -> !e.equals(object.getBukkitEntity()) && new EntityTag(e).tryAdvancedMatcher(matcher, attribute.context); } else { requirement = (e) -> !e.equals(object.getBukkitEntity()); @@ -2644,7 +2644,7 @@ else if (object.getBukkitEntity() instanceof Hanging hanging) { } String matcher = attribute.getParam(); for (ItemStack item : object.getLivingEntity().getEquipment().getArmorContents()) { - if (new ItemTag(item).tryAdvancedMatcher(matcher)) { + if (new ItemTag(item).tryAdvancedMatcher(matcher, attribute.context)) { return new ElementTag(true); } } @@ -4582,7 +4582,7 @@ else if (text.startsWith("vanilla_tagged:")) { } @Override - public boolean advancedMatches(String text) { + public boolean advancedMatches(String text, TagContext context) { ScriptEvent.MatchHelper matcher = ScriptEvent.createMatcher(text); if (isCitizensNPC()) { return matcher.doesMatch("npc", this::tryExactMatcher); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/InventoryTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/InventoryTag.java index f1aeb69a61..8ce024e433 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/InventoryTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/InventoryTag.java @@ -1357,7 +1357,7 @@ public static void register() { } for (int slot = 0; slot < dummyInv.inventory.getSize(); slot++) { ItemStack item = dummyInv.inventory.getItem(slot); - if (item != null && new ItemTag(item).tryAdvancedMatcher(matcher)) { + if (item != null && new ItemTag(item).tryAdvancedMatcher(matcher, attribute.context)) { quantity -= item.getAmount(); if (quantity >= 0) { dummyInv.inventory.setItem(slot, null); @@ -1472,7 +1472,7 @@ public static void register() { int found_items = 0; for (ItemStack item : object.getContents()) { if (item != null) { - if (new ItemTag(item).tryAdvancedMatcher(matcher)) { + if (new ItemTag(item).tryAdvancedMatcher(matcher, attribute.context)) { found_items += item.getAmount(); if (found_items >= qty) { break; @@ -1870,7 +1870,7 @@ else if (meta.hasDisplayName() && CoreUtilities.toLowerCase(meta.getDisplayName( for (int i = 0; i < object.inventory.getSize(); i++) { ItemStack item = object.inventory.getItem(i); if (item != null) { - if (new ItemTag(item).tryAdvancedMatcher(matcher)) { + if (new ItemTag(item).tryAdvancedMatcher(matcher, attribute.context)) { return new ElementTag(i + 1); } } @@ -1895,7 +1895,7 @@ else if (meta.hasDisplayName() && CoreUtilities.toLowerCase(meta.getDisplayName( for (int i = 0; i < object.inventory.getSize(); i++) { ItemStack item = object.inventory.getItem(i); if (item != null) { - if (new ItemTag(item).tryAdvancedMatcher(matcher)) { + if (new ItemTag(item).tryAdvancedMatcher(matcher, attribute.context)) { result.addObject(new ElementTag(i + 1)); } } @@ -2029,7 +2029,7 @@ else if (meta.hasDisplayName() && CoreUtilities.toLowerCase(meta.getDisplayName( int found_items = 0; for (ItemStack item : object.getContents()) { if (item != null) { - if (matcher == null || new ItemTag(item).tryAdvancedMatcher(matcher)) { + if (matcher == null || new ItemTag(item).tryAdvancedMatcher(matcher, attribute.context)) { found_items += item.getAmount(); } } @@ -2583,7 +2583,7 @@ public boolean compareInventoryToMatch(ScriptEvent.MatchHelper matcher) { } @Override - public boolean advancedMatches(String comparedto) { + public boolean advancedMatches(String comparedto, TagContext context) { String matcherLow = CoreUtilities.toLowerCase(comparedto); if (matcherLow.equals("inventory")) { return true; diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/ItemTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/ItemTag.java index dddfd675a4..0b62d42075 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/ItemTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/ItemTag.java @@ -960,7 +960,7 @@ public static ItemPropertyMatchHelper getPropertyMatchHelper(String text) { } @Override - public boolean advancedMatches(String matcher) { + public boolean advancedMatches(String matcher, TagContext context) { String matcherLow = CoreUtilities.toLowerCase(matcher); if (matcherLow.contains(":")) { if (matcherLow.startsWith("item_flagged:")) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java index 5b4ef6dc2b..38ddf372e5 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java @@ -695,10 +695,13 @@ public static class FloodFiller { public String matcher; - public void run(LocationTag start, AreaContainmentObject area) { + public TagContext context; + + public void run(LocationTag start, AreaContainmentObject area, TagContext context) { iterationLimit = Settings.blockTagsMaxBlocks(); areaLimit = area; result = new LinkedHashSet<>(); + this.context = context; flood(start.getBlockLocation()); } @@ -709,7 +712,7 @@ public void flood(LocationTag loc) { if (!loc.isChunkLoaded()) { return; } - if (matcher == null ? loc.getBlock().getType() != requiredMaterial : !loc.tryAdvancedMatcher(matcher)) { + if (matcher == null ? loc.getBlock().getType() != requiredMaterial : !loc.tryAdvancedMatcher(matcher, context)) { return; } result.add(loc); @@ -1785,7 +1788,7 @@ public static void register() { traced = object.getWorld().rayTraceBlocks(object, direction, range, fluids ? FluidCollisionMode.ALWAYS : FluidCollisionMode.NEVER, !nonsolids); } else { - traced = object.getWorld().rayTrace(object, direction, range, fluids ? FluidCollisionMode.ALWAYS : FluidCollisionMode.NEVER, !nonsolids, raySize, (e) -> !ignoreIds.contains(e.getUniqueId()) && new EntityTag(e).tryAdvancedMatcher(entitiesMatcher)); + traced = object.getWorld().rayTrace(object, direction, range, fluids ? FluidCollisionMode.ALWAYS : FluidCollisionMode.NEVER, !nonsolids, raySize, (e) -> !ignoreIds.contains(e.getUniqueId()) && new EntityTag(e).tryAdvancedMatcher(entitiesMatcher, attribute.context)); } if (traced != null) { LocationTag result = null; @@ -1870,11 +1873,11 @@ else if (CoreUtilities.equalsIgnoreCase(returnMode, "normal")) { RayTraceResult traced; if (!blocks) { traced = object.getWorld().rayTraceEntities(object, direction, range, raySize, - (e) -> !ignoreIds.contains(e.getUniqueId()) && (entitiesMatcher.isEmpty() || new EntityTag(e).tryAdvancedMatcher(entitiesMatcher))); + (e) -> !ignoreIds.contains(e.getUniqueId()) && (entitiesMatcher.isEmpty() || new EntityTag(e).tryAdvancedMatcher(entitiesMatcher, attribute.context))); } else { traced = object.getWorld().rayTrace(object, direction, range, fluids ? FluidCollisionMode.ALWAYS : FluidCollisionMode.NEVER, !nonsolids, raySize, - (e) -> !ignoreIds.contains(e.getUniqueId()) && (entitiesMatcher.isEmpty() || new EntityTag(e).tryAdvancedMatcher(entitiesMatcher))); + (e) -> !ignoreIds.contains(e.getUniqueId()) && (entitiesMatcher.isEmpty() || new EntityTag(e).tryAdvancedMatcher(entitiesMatcher, attribute.context))); } if (traced != null && traced.getHitEntity() != null) { return new EntityTag(traced.getHitEntity()); @@ -2569,7 +2572,7 @@ else if (yaw < 315) { else { flooder.requiredMaterial = object.getBlock().getType(); } - flooder.run(object, area); + flooder.run(object, area, attribute.context); } finally { NMSHandler.chunkHelper.restoreServerThread(object.getWorld()); @@ -2675,7 +2678,7 @@ else if (yaw < 315) { for (Entity entity : new WorldTag(object.getWorld()).getPossibleEntitiesForBoundaryForTag(box)) { if (Utilities.checkLocationWithBoundingBox(object, entity, radius)) { EntityTag current = new EntityTag(entity); - if (matcher == null || current.tryAdvancedMatcher(matcher)) { + if (matcher == null || current.tryAdvancedMatcher(matcher, attribute.context)) { found.addObject(current.getDenizenObject()); } } @@ -2719,7 +2722,7 @@ else if (yaw < 315) { break fullloop; } if (Utilities.checkLocation(object, tstart.clone().add(x + 0.5, y + 0.5, z + 0.5), radius)) { - if (matcher == null || new LocationTag(tstart.clone().add(x, y, z)).tryAdvancedMatcher(matcher)) { + if (matcher == null || new LocationTag(tstart.clone().add(x, y, z)).tryAdvancedMatcher(matcher, attribute.context)) { found.addObject(new LocationTag(tstart.clone().add(x, y, z))); } } @@ -2778,7 +2781,7 @@ else if (yaw < 315) { Location current = block.getLocation(refLoc).add(0.5, 0.5, 0.5); if (Utilities.checkLocation(object, current, radius)) { LocationTag actualLoc = new LocationTag(current); - if (matcher == null || actualLoc.tryAdvancedMatcher(matcher)) { + if (matcher == null || actualLoc.tryAdvancedMatcher(matcher, attribute.context)) { found.addObject(actualLoc); } } @@ -3524,7 +3527,7 @@ else if (PolygonTag.matches(attribute.getParam())) { String matcher = attribute.getParam(); ListTag list = new ListTag(); NotedAreaTracker.forEachAreaThatContains(object, (area) -> { - if (matcher == null || area.tryAdvancedMatcher(matcher)) { + if (matcher == null || area.tryAdvancedMatcher(matcher, attribute.context)) { list.addObject(area); } }); @@ -3544,7 +3547,7 @@ else if (PolygonTag.matches(attribute.getParam())) { ListTag list = new ListTag(); NotedAreaTracker.forEachAreaThatContains(object, (area) -> { if (area instanceof CuboidTag) { - if (matcher == null || area.tryAdvancedMatcher(matcher)) { + if (matcher == null || area.tryAdvancedMatcher(matcher, attribute.context)) { list.addObject(area); } } @@ -3565,7 +3568,7 @@ else if (PolygonTag.matches(attribute.getParam())) { ListTag list = new ListTag(); NotedAreaTracker.forEachAreaThatContains(object, (area) -> { if (area instanceof EllipsoidTag) { - if (matcher == null || area.tryAdvancedMatcher(matcher)) { + if (matcher == null || area.tryAdvancedMatcher(matcher, attribute.context)) { list.addObject(area); } } @@ -3586,7 +3589,7 @@ else if (PolygonTag.matches(attribute.getParam())) { ListTag list = new ListTag(); NotedAreaTracker.forEachAreaThatContains(object, (area) -> { if (area instanceof PolygonTag) { - if (matcher == null || area.tryAdvancedMatcher(matcher)) { + if (matcher == null || area.tryAdvancedMatcher(matcher, attribute.context)) { list.addObject(area); } } @@ -5651,7 +5654,7 @@ public String formatHelper(String format, String prefix, Function goal) { } @Override - public boolean advancedMatches(String matcher) { - return isOnline() && getDenizenEntity().tryAdvancedMatcher(matcher); + public boolean advancedMatches(String matcher, TagContext context) { + return isOnline() && getDenizenEntity().tryAdvancedMatcher(matcher, context); } /** diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/PolygonTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/PolygonTag.java index cbc7a61e66..42bf37cf9b 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/PolygonTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/PolygonTag.java @@ -888,7 +888,7 @@ public static void register() { NMSHandler.chunkHelper.changeChunkServerThread(polygon.getWorld().getWorld()); try { String matcher = attribute.getParam(); - Predicate predicate = (l) -> new LocationTag(l).tryAdvancedMatcher(matcher); + Predicate predicate = (l) -> new LocationTag(l).tryAdvancedMatcher(matcher, attribute.context); return polygon.getBlocksInternal(predicate, true); } finally { @@ -934,7 +934,7 @@ public void adjust(Mechanism mechanism) { } @Override - public boolean advancedMatches(String matcher) { + public boolean advancedMatches(String matcher, TagContext context) { String matcherLow = CoreUtilities.toLowerCase(matcher); if (matcherLow.equals("polygon")) { return true; diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/WorldTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/WorldTag.java index 0053c516df..0cb68d98d7 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/WorldTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/WorldTag.java @@ -260,7 +260,7 @@ public static void register() { String matcher = attribute.hasParam() ? attribute.getParam() : null; for (Entity entity : object.getEntitiesForTag()) { EntityTag current = new EntityTag(entity); - if (matcher == null || current.tryAdvancedMatcher(matcher)) { + if (matcher == null || current.tryAdvancedMatcher(matcher, attribute.context)) { entities.addObject(current.getDenizenObject()); } } @@ -1405,7 +1405,7 @@ public void unloadWorldClean(Mechanism mechanism, boolean doSave) { } @Override - public boolean advancedMatches(String matcher) { + public boolean advancedMatches(String matcher, TagContext context) { String matcherLow = CoreUtilities.toLowerCase(matcher); if (matcherLow.equals("world")) { return true; diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/item/TakeCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/item/TakeCommand.java index 72cb110553..d3005d89b1 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/item/TakeCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/item/TakeCommand.java @@ -405,7 +405,7 @@ && equalOrNull(titleAuthor.get(0), ((BookMeta) item.getItemMeta()).getTitle()) Debug.echoError(scriptEntry, "Must specify an item matcher!"); return; } - takeByMatcher(inventory, (item) -> new ItemTag(item).tryAdvancedMatcher(matcherText.asString()), quantity.asInt()); + takeByMatcher(inventory, (item) -> new ItemTag(item).tryAdvancedMatcher(matcherText.asString(), scriptEntry.getContext()), quantity.asInt()); break; } case SLOT: { diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptHelper.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptHelper.java index 77b01dd291..1425d50e79 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptHelper.java @@ -14,6 +14,7 @@ import com.denizenscript.denizen.utilities.BukkitImplDeprecations; import com.denizenscript.denizen.utilities.PaperAPITools; import com.denizenscript.denizen.utilities.Utilities; +import com.denizenscript.denizencore.DenizenCore; import com.denizenscript.denizencore.events.ScriptEvent; import com.denizenscript.denizencore.objects.core.DurationTag; import com.denizenscript.denizencore.objects.core.ListTag; @@ -118,8 +119,9 @@ public static ItemStack[] textToItemArray(ItemScriptContainer container, String } } if (exact) { + TagContext context = DenizenCore.implementation.getTagContext(container); for (ItemScriptContainer possibleContainer : ItemScriptHelper.item_scripts.values()) { - if (possibleContainer.getCleanReference() != null && possibleContainer.getCleanReference().tryAdvancedMatcher(entry)) { + if (possibleContainer.getCleanReference() != null && possibleContainer.getCleanReference().tryAdvancedMatcher(entry, context)) { outputItems.add(possibleContainer.getCleanReference().getItemStack()); any = true; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/triggers/core/ClickTrigger.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/triggers/core/ClickTrigger.java index 16c551de84..0bb93ae728 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/triggers/core/ClickTrigger.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/triggers/core/ClickTrigger.java @@ -8,6 +8,8 @@ import com.denizenscript.denizen.objects.PlayerTag; import com.denizenscript.denizen.scripts.triggers.AbstractTrigger; import com.denizenscript.denizen.tags.BukkitTagContext; +import com.denizenscript.denizencore.objects.core.ScriptTag; +import com.denizenscript.denizencore.tags.TagContext; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.denizenscript.denizencore.tags.TagManager; import net.citizensnpcs.api.event.NPCRightClickEvent; @@ -107,9 +109,10 @@ public void clickTrigger(NPCRightClickEvent event) { Map idMap = script.getIdMapFor(ClickTrigger.class, player); if (!idMap.isEmpty()) { ItemTag heldItem = new ItemTag(player.getPlayerEntity().getEquipment().getItemInMainHand()); + TagContext context = new BukkitTagContext(player, npc, new ScriptTag(script)); for (Map.Entry entry : idMap.entrySet()) { - String entry_value = TagManager.tag(entry.getValue(), new BukkitTagContext(player, npc, null, false, null)); - boolean isMatch = entry_value.isEmpty() || heldItem.tryAdvancedMatcher(entry_value); + String entry_value = TagManager.tag(entry.getValue(), context); + boolean isMatch = entry_value.isEmpty() || heldItem.tryAdvancedMatcher(entry_value, context); if (script.shouldDebug()) { Debug.echoDebug(script, "Comparing click trigger '" + entry_value + "' with item '" + heldItem.debuggable() + "': " + (isMatch ? "Match!" : "Not a match")); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/HideEntitiesHelper.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/HideEntitiesHelper.java index 764ed41a2a..42b00cb137 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/HideEntitiesHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/HideEntitiesHelper.java @@ -4,6 +4,7 @@ import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.utilities.packets.NetworkInterceptHelper; +import com.denizenscript.denizencore.utilities.CoreUtilities; import org.bukkit.Bukkit; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @@ -36,7 +37,7 @@ public boolean shouldHideViaMatcher(Entity entity) { } EntityTag entityTag = new EntityTag(entity); for (String matchable : matchersHidden) { - if (entityTag.tryAdvancedMatcher(matchable)) { + if (entityTag.tryAdvancedMatcher(matchable, CoreUtilities.noDebugContext)) { if (entity instanceof Player) { Player thisPlayer = Bukkit.getPlayer(player); if (thisPlayer != null && thisPlayer.canSee((Player) entity)) { From 023bda77dae2a010e3fe023467c5a2da18091932 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Fri, 19 Jul 2024 14:26:13 -0700 Subject: [PATCH 045/280] patch for AttributeModifier UUID values --- .../entity/EntityAttributeModifiers.java | 17 ++++++++++++----- .../properties/item/ItemAttributeModifiers.java | 12 ++++++++++-- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAttributeModifiers.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAttributeModifiers.java index b65d8e4a2d..eb9dbf7b9d 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAttributeModifiers.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAttributeModifiers.java @@ -1,6 +1,9 @@ package com.denizenscript.denizen.objects.properties.entity; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.objects.properties.item.ItemAttributeModifiers; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.ObjectTag; @@ -79,7 +82,9 @@ public static MapTag mapify(AttributeModifier modifier) { result.putObject("amount", new ElementTag(modifier.getAmount())); result.putObject("operation", new ElementTag(modifier.getOperation())); result.putObject("slot", new ElementTag(modifier.getSlot() == null ? "any" : modifier.getSlot().name())); - result.putObject("id", new ElementTag(modifier.getUniqueId().toString())); + if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_20)) { + result.putObject("id", new ElementTag(modifier.getUniqueId().toString())); + } return result; } @@ -88,6 +93,7 @@ public static AttributeModifier modiferForMap(Attribute attr, MapTag map) { ElementTag amount = map.getElement("amount"); ElementTag operation = map.getElement("operation"); ElementTag slot = map.getElement("slot", "any"); + // TODO: MC 1.21: ID and name are now the same internal value. ElementTag id = map.getElement("id"); UUID idValue; double amountValue; @@ -310,10 +316,12 @@ public void adjust(Mechanism mechanism) { instance.addModifier(modifier); } catch (IllegalArgumentException ex) { - if (!ex.getMessage().equals("Modifier is already applied on this attribute!")) { + if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_20) && ex.getMessage().equals("Modifier is already applied on this attribute!")) { + Debug.echoError("Cannot add attribute with ID '" + modifier.getUniqueId() + "' as the entity already has a modifier with the same ID."); + } + else { throw ex; } - Debug.echoError("Cannot add attribute with ID '" + modifier.getUniqueId() + "' as the entity already has a modifier with the same ID."); } } } @@ -355,14 +363,13 @@ public void adjust(Mechanism mechanism) { } } for (String toRemove : inputList) { - UUID id = UUID.fromString(toRemove); for (Attribute attr : Attribute.values()) { AttributeInstance instance = ent.getAttribute(attr); if (instance == null) { continue; } for (AttributeModifier modifer : instance.getModifiers()) { - if (modifer.getUniqueId().equals(id)) { + if (ItemAttributeModifiers.getIdString(modifer).equals(toRemove)) { instance.removeModifier(modifer); break; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemAttributeModifiers.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemAttributeModifiers.java index 11cd8f531f..a081d0a5c8 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemAttributeModifiers.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemAttributeModifiers.java @@ -159,11 +159,10 @@ public static void register() { } } for (String toRemove : inputList) { - UUID id = UUID.fromString(toRemove); Multimap metaMap = meta.getAttributeModifiers(); for (org.bukkit.attribute.Attribute attribute : metaMap.keys()) { for (AttributeModifier modifer : metaMap.get(attribute)) { - if (modifer.getUniqueId().equals(id)) { + if (getIdString(modifer).equals(toRemove)) { meta.removeAttributeModifier(attribute, modifer); break; } @@ -173,4 +172,13 @@ public static void register() { prop.setItemMeta(meta); }); } + + public static String getIdString(AttributeModifier modifier) { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + return modifier.getName(); + } + else { + return modifier.getUniqueId().toString(); + } + } } From 3c59ee05fb4570ea8a8182e2c2d0127910bfd88f Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Fri, 19 Jul 2024 14:29:52 -0700 Subject: [PATCH 046/280] add error check in element.color --- .../objects/properties/bukkit/BukkitElementExtensions.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/bukkit/BukkitElementExtensions.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/bukkit/BukkitElementExtensions.java index 603b1dd091..2275a1ae84 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/bukkit/BukkitElementExtensions.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/bukkit/BukkitElementExtensions.java @@ -741,6 +741,12 @@ else if (colorName.startsWith("co@")) { if (colorOut == null) { try { ChatColor color = ChatColor.of(colorName.toUpperCase()); + if (color.getColor() == null) { + if (!TagManager.isStaticParsing) { + attribute.echoError("Color '" + colorName + "' is valid but is a format code not a real color (for ElementTag.color[...])."); + } + return null; + } String colorStr = color.toString().replace(String.valueOf(ChatColor.COLOR_CHAR), "").replace("x", "#"); colorOut = ChatColor.COLOR_CHAR + "[color=" + colorStr + "]"; } From 9cd089f8eb2faad330dc180635a23e0ad8cdffec Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Tue, 6 Aug 2024 11:30:43 -0700 Subject: [PATCH 047/280] swap registerEnumListTag to something intercompatible --- .../properties/entity/EntityColor.java | 37 +++++++------------ .../denizen/tags/core/ServerTagBase.java | 9 +---- .../utilities/MultiVersionHelper1_19.java | 4 +- .../denizen/utilities/Utilities.java | 10 +++++ 4 files changed, 28 insertions(+), 32 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityColor.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityColor.java index db1b588daa..f72fe10276 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityColor.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityColor.java @@ -267,50 +267,41 @@ public String getColor(boolean includeDeprecated) { }; } - // TODO once 1.21 is the minimum supported version, replace with direct registry-based handling - @SuppressWarnings({"unchecked", "DataFlowIssue"}) - public static ListTag listTypes(Class type) { - if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && Keyed.class.isAssignableFrom(type)) { - return Utilities.registryKeys(Bukkit.getRegistry((Class) type)); - } - return new ListTag(Arrays.asList(((Class>) type).getEnumConstants()), ElementTag::new); - } - public ListTag getAllowedColors() { EntityType type = getType(); if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19) && MultiVersionHelper1_19.colorIsApplicable(type)) { return MultiVersionHelper1_19.getAllowedColors(type); } if (type == MOOSHROOM_ENTITY_TYPE) { - return listTypes(MushroomCow.Variant.class); + return Utilities.listTypes(MushroomCow.Variant.class); } return switch (type) { case HORSE -> { - ListTag horseColors = listTypes(Horse.Color.class); - horseColors.addAll(listTypes(Horse.Style.class)); + ListTag horseColors = Utilities.listTypes(Horse.Color.class); + horseColors.addAll(Utilities.listTypes(Horse.Style.class)); yield horseColors; } - case SHEEP, WOLF, SHULKER -> listTypes(DyeColor.class); - case RABBIT -> listTypes(Rabbit.Type.class); - case LLAMA, TRADER_LLAMA -> listTypes(Llama.Color.class); - case PARROT -> listTypes(Parrot.Variant.class); + case SHEEP, WOLF, SHULKER -> Utilities.listTypes(DyeColor.class); + case RABBIT -> Utilities.listTypes(Rabbit.Type.class); + case LLAMA, TRADER_LLAMA -> Utilities.listTypes(Llama.Color.class); + case PARROT -> Utilities.listTypes(Parrot.Variant.class); case TROPICAL_FISH -> { - ListTag patterns = listTypes(TropicalFish.Pattern.class); - patterns.addAll(listTypes(DyeColor.class)); + ListTag patterns = Utilities.listTypes(TropicalFish.Pattern.class); + patterns.addAll(Utilities.listTypes(DyeColor.class)); yield patterns; } - case FOX -> listTypes(Fox.Type.class); - case CAT -> listTypes(Cat.Type.class); - case PANDA -> listTypes(Panda.Gene.class); + case FOX -> Utilities.listTypes(Fox.Type.class); + case CAT -> Utilities.listTypes(Cat.Type.class); + case PANDA -> Utilities.listTypes(Panda.Gene.class); // TODO This technically has registries on all supported versions - case VILLAGER, ZOMBIE_VILLAGER -> listTypes(Villager.Type.class); + case VILLAGER, ZOMBIE_VILLAGER -> Utilities.listTypes(Villager.Type.class); case GOAT -> { ListTag result = new ListTag(); result.add("screaming"); result.add("normal"); yield result; } - case AXOLOTL -> EntityColor.listTypes(Axolotl.Variant.class); + case AXOLOTL -> Utilities.listTypes(Axolotl.Variant.class); default -> null; // includes Ocelot (deprecated) and arrow (ColorTag) }; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/tags/core/ServerTagBase.java b/plugin/src/main/java/com/denizenscript/denizen/tags/core/ServerTagBase.java index c80429a62c..a379d8e1f4 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/tags/core/ServerTagBase.java +++ b/plugin/src/main/java/com/denizenscript/denizen/tags/core/ServerTagBase.java @@ -2429,15 +2429,10 @@ public void registerCitizensFeatures() { }); } - public void registerEnumListTag(String name, Class> enumType, String... deprecatedVariants) { + public void registerEnumListTag(String name, Class enumType, String... deprecatedVariants) { tagProcessor.registerStaticTag(ListTag.class, name, (attribute, object) -> { listDeprecateWarn(attribute); - Enum[] enumConstants = enumType.getEnumConstants(); - ListTag result = new ListTag(enumConstants.length); - for (Enum constant : enumConstants) { - result.addObject(new ElementTag(constant)); - } - return result; + return Utilities.listTypes(enumType); }, deprecatedVariants); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/MultiVersionHelper1_19.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/MultiVersionHelper1_19.java index e2d9b17d74..ed9d821b38 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/MultiVersionHelper1_19.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/MultiVersionHelper1_19.java @@ -29,10 +29,10 @@ else if (entity instanceof Boat boat) { public static ListTag getAllowedColors(EntityType type) { if (type == EntityType.FROG) { - return EntityColor.listTypes(Frog.Variant.class); + return Utilities.listTypes(Frog.Variant.class); } else if (type == EntityType.BOAT || type == EntityType.CHEST_BOAT) { - return EntityColor.listTypes(Boat.Type.class); + return Utilities.listTypes(Boat.Type.class); } return null; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java index 9b260abc5e..08064ece2b 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java @@ -1,6 +1,7 @@ package com.denizenscript.denizen.utilities; import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.nms.interfaces.BlockHelper; import com.denizenscript.denizen.npc.traits.TriggerTrait; import com.denizenscript.denizen.objects.*; @@ -540,4 +541,13 @@ public static ArrayList allMaterialsThatMatch(String matcherText) { } return mats; } + + // TODO once 1.21 is the minimum supported version, replace with direct registry-based handling + @SuppressWarnings({"unchecked", "DataFlowIssue"}) + public static ListTag listTypes(Class type) { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && Keyed.class.isAssignableFrom(type)) { + return registryKeys(Bukkit.getRegistry((Class) type)); + } + return new ListTag(Arrays.asList(((Class>) type).getEnumConstants()), ElementTag::new); + } } From d7ee4fb29a66493912dfd1543b449ab25cf2fc8e Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Tue, 6 Aug 2024 15:11:02 -0700 Subject: [PATCH 048/280] fix fish event var name mixup --- .../denizen/events/player/PlayerFishesScriptEvent.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerFishesScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerFishesScriptEvent.java index 10c840628c..2395f2662d 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerFishesScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerFishesScriptEvent.java @@ -108,8 +108,8 @@ public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) { String determinationLower = CoreUtilities.toLowerCase(determination); if (determinationLower.startsWith("caught:")) { item = ItemTag.valueOf(determination.substring("caught:".length()), getTagContext(path)); - if (entity != null && entity.getBukkitEntity() instanceof Item item) { - item.setItemStack(item.getItemStack()); + if (entity != null && entity.getBukkitEntity() instanceof Item itemEnt) { + itemEnt.setItemStack(item.getItemStack()); return true; } } From 4a943f1539ae9724c3e689367fc26987cd4fedb4 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Sun, 11 Aug 2024 21:17:31 -0700 Subject: [PATCH 049/280] fix build for spigot update --- .../PlayerLoomPatternSelectScriptEvent.java | 7 ++++--- .../denizen/utilities/Utilities.java | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerLoomPatternSelectScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerLoomPatternSelectScriptEvent.java index abfdb486f5..3501c2164f 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerLoomPatternSelectScriptEvent.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerLoomPatternSelectScriptEvent.java @@ -2,6 +2,7 @@ import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizen.objects.InventoryTag; +import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; @@ -64,7 +65,7 @@ public boolean matches(ScriptPath path) { if (!runInCheck(path, event.getLoomInventory().getLocation())) { return false; } - if (!path.tryObjectSwitch("type", new ElementTag(event.getPatternType()))) { + if (!path.tryObjectSwitch("type", Utilities.enumlikeToElement(event.getPatternType()))) { return false; } return super.matches(path); @@ -79,7 +80,7 @@ public ScriptEntryData getScriptEntryData() { public ObjectTag getContext(String name) { return switch (name) { case "loom" -> InventoryTag.mirrorBukkitInventory(event.getLoomInventory()); - case "pattern" -> new ElementTag(event.getPatternType()); + case "pattern" -> Utilities.enumlikeToElement(event.getPatternType()); default -> super.getContext(name); }; } @@ -90,7 +91,7 @@ public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) { String lower = CoreUtilities.toLowerCase(determinationObj.toString()); if (lower.startsWith("pattern:")) { ElementTag value = new ElementTag(lower.substring("pattern:".length())); - event.setPatternType(value.asEnum(PatternType.class)); + event.setPatternType(Utilities.elementToEnumlike(value, PatternType.class)); return true; } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java index 08064ece2b..1d012b892a 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java @@ -550,4 +550,21 @@ public static ListTag listTypes(Class type) { } return new ListTag(Arrays.asList(((Class>) type).getEnumConstants()), ElementTag::new); } + + public static ElementTag enumlikeToElement(Object val) { + if (val instanceof Enum) { + return new ElementTag(((Enum) val).name()); + } + if (val instanceof Keyed) { + return new ElementTag(namespacedKeyToString(((Keyed) val).getKey())); + } + return new ElementTag(val.toString()); + } + + public static T elementToEnumlike(ElementTag element, Class type) { + if (Keyed.class.isAssignableFrom(type)) { + return (T) Bukkit.getRegistry((Class) type).get(parseNamespacedKey(element.asString())); + } + return (T) element.asEnum((Class) type); + } } From 8e85c7410367f09fd17085a37fbd5ec2ffb50679 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Wed, 21 Aug 2024 18:08:33 -0700 Subject: [PATCH 050/280] remove 'Toggleable' trait ref removed in upstream citizens --- .../com/denizenscript/denizen/npc/traits/InvisibleTrait.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/npc/traits/InvisibleTrait.java b/plugin/src/main/java/com/denizenscript/denizen/npc/traits/InvisibleTrait.java index 57219fef5e..66cc4f9213 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/npc/traits/InvisibleTrait.java +++ b/plugin/src/main/java/com/denizenscript/denizen/npc/traits/InvisibleTrait.java @@ -5,7 +5,6 @@ import net.citizensnpcs.api.persistence.Persist; import net.citizensnpcs.api.trait.Trait; import net.citizensnpcs.trait.ArmorStandTrait; -import net.citizensnpcs.trait.Toggleable; import net.citizensnpcs.util.NMS; import org.bukkit.entity.ArmorStand; import org.bukkit.entity.EntityType; @@ -15,7 +14,7 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.scheduler.BukkitRunnable; -public class InvisibleTrait extends Trait implements Listener, Toggleable { +public class InvisibleTrait extends Trait implements Listener { // <--[language] // @name Invisible Trait From 350c3956ed7f517f7b8de7b949f1d129a5da2fbd Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Wed, 21 Aug 2024 18:11:28 -0700 Subject: [PATCH 051/280] oops --- .../com/denizenscript/denizen/npc/traits/InvisibleTrait.java | 1 - 1 file changed, 1 deletion(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/npc/traits/InvisibleTrait.java b/plugin/src/main/java/com/denizenscript/denizen/npc/traits/InvisibleTrait.java index 66cc4f9213..3dabc32eed 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/npc/traits/InvisibleTrait.java +++ b/plugin/src/main/java/com/denizenscript/denizen/npc/traits/InvisibleTrait.java @@ -117,7 +117,6 @@ public void run() { } } - @Override public boolean toggle() { setInvisible(!invisible); return invisible; From 96e41b52fb8d16566f974a4699a538797db01d14 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Wed, 21 Aug 2024 21:32:09 -0700 Subject: [PATCH 052/280] bump build target to 1.21.1 --- README.md | 2 +- paper/pom.xml | 4 ++-- plugin/pom.xml | 4 ++-- .../objects/properties/entity/EntityGravity.java | 2 +- v1_21/pom.xml | 12 ++++++------ .../com/denizenscript/denizen/nms/v1_21/Handler.java | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 20c2ae65b2..cc184b5a68 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ The Denizen Scripting Language - Spigot Impl An implementation of the Denizen Scripting Language for Spigot servers, with strong Citizens interlinks to emphasize the power of using Denizen with NPCs! -**Version 1.3.1**: Compatible with Spigot 1.17.1, 1.18.2, 1.19.4, 1.20.6, and 1.21! +**Version 1.3.1**: Compatible with Spigot 1.17.1, 1.18.2, 1.19.4, 1.20.6, and 1.21.1! **Learn about Denizen from the Beginner's guide:** https://guide.denizenscript.com/guides/background/index.html diff --git a/paper/pom.xml b/paper/pom.xml index 8f971f3ab1..2489e766d0 100644 --- a/paper/pom.xml +++ b/paper/pom.xml @@ -25,13 +25,13 @@ io.papermc.paper paper-api - 1.21-R0.1-SNAPSHOT + 1.21.1-R0.1-SNAPSHOT provided net.citizensnpcs citizens-main - 2.0.34-SNAPSHOT + 2.0.35-SNAPSHOT jar provided diff --git a/plugin/pom.xml b/plugin/pom.xml index 1af3695e5d..4ce441f6e1 100644 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -30,7 +30,7 @@ org.spigotmc spigot-api - 1.21-R0.1-SNAPSHOT + 1.21.1-R0.1-SNAPSHOT jar provided @@ -44,7 +44,7 @@ net.citizensnpcs citizens-main - 2.0.34-SNAPSHOT + 2.0.35-SNAPSHOT jar provided diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityGravity.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityGravity.java index a38bb1da3a..54abb5d4e4 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityGravity.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityGravity.java @@ -95,7 +95,7 @@ public void adjust(Mechanism mechanism) { // --> if (mechanism.matches("gravity") && mechanism.requireBoolean()) { if (dentity.isCitizensNPC()) { - dentity.getDenizenNPC().getCitizen().getOrAddTrait(Gravity.class).gravitate(!mechanism.getValue().asBoolean()); + dentity.getDenizenNPC().getCitizen().getOrAddTrait(Gravity.class).setHasGravity(mechanism.getValue().asBoolean()); } else { dentity.getBukkitEntity().setGravity(mechanism.getValue().asBoolean()); diff --git a/v1_21/pom.xml b/v1_21/pom.xml index 6bb5c3eb84..84ca40d661 100644 --- a/v1_21/pom.xml +++ b/v1_21/pom.xml @@ -19,13 +19,13 @@ org.spigotmc spigot-api - 1.21-R0.1-SNAPSHOT + 1.21.1-R0.1-SNAPSHOT provided org.spigotmc spigot - 1.21-R0.1-SNAPSHOT + 1.21.1-R0.1-SNAPSHOT remapped-mojang provided @@ -45,9 +45,9 @@ remap-obf - org.spigotmc:minecraft-server:1.21-R0.1-SNAPSHOT:txt:maps-mojang + org.spigotmc:minecraft-server:1.21.1-R0.1-SNAPSHOT:txt:maps-mojang true - org.spigotmc:spigot:1.21-R0.1-SNAPSHOT:jar:remapped-mojang + org.spigotmc:spigot:1.21.1-R0.1-SNAPSHOT:jar:remapped-mojang true remapped-obf @@ -60,8 +60,8 @@ remap-spigot ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar - org.spigotmc:minecraft-server:1.21-R0.1-SNAPSHOT:csrg:maps-spigot - org.spigotmc:spigot:1.21-R0.1-SNAPSHOT:jar:remapped-obf + org.spigotmc:minecraft-server:1.21.1-R0.1-SNAPSHOT:csrg:maps-spigot + org.spigotmc:spigot:1.21.1-R0.1-SNAPSHOT:jar:remapped-obf diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java index 74e4ec8fda..11e603bd68 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java @@ -146,7 +146,7 @@ public void undisableAsyncCatcher() { @Override public boolean isCorrectMappingsCode() { - return ((CraftMagicNumbers) CraftMagicNumbers.INSTANCE).getMappingsVersion().equals("229d7afc75b70a6c388337687ac4da1f"); + return ((CraftMagicNumbers) CraftMagicNumbers.INSTANCE).getMappingsVersion().equals("7092ff1ff9352ad7e2260dc150e6a3ec"); } @Override From 42ca91b98c63d8bec88f9bbca458c0d6a6798a5a Mon Sep 17 00:00:00 2001 From: david <89749147+davight@users.noreply.github.com> Date: Fri, 23 Aug 2024 20:42:59 +0200 Subject: [PATCH 053/280] update --- .../denizen/paper/tags/PaperTagBase.java | 33 +++++++------------ 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/tags/PaperTagBase.java b/paper/src/main/java/com/denizenscript/denizen/paper/tags/PaperTagBase.java index d5f4aef3f9..427bf1c51f 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/tags/PaperTagBase.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/tags/PaperTagBase.java @@ -2,29 +2,19 @@ import com.denizenscript.denizencore.objects.core.DurationTag; import com.denizenscript.denizencore.objects.core.ListTag; -import com.denizenscript.denizencore.tags.TagRunnable; -import com.denizenscript.denizencore.tags.Attribute; -import com.denizenscript.denizencore.tags.ReplaceableTagEvent; -import com.denizenscript.denizencore.tags.TagManager; +import com.denizenscript.denizencore.tags.*; import org.bukkit.Bukkit; -public class PaperTagBase { +public class PaperTagBase extends PseudoObjectTagBase { + + public static PaperTagBase instance; public PaperTagBase() { - TagManager.registerTagHandler(new TagRunnable.RootForm() { - @Override - public void run(ReplaceableTagEvent event) { - paperTag(event); - } - }, "paper"); + instance = this; + TagManager.registerStaticTagBaseHandler(PaperTagBase.class, "paper", (t) -> instance); } - public void paperTag(ReplaceableTagEvent event) { - if (!event.matches("paper") || event.replaced()) { - return; - } - - Attribute attribute = event.getAttributes().fulfill(1); + public void register() { // <--[tag] // @attribute @@ -34,13 +24,12 @@ public void paperTag(ReplaceableTagEvent event) { // Returns a sample of the server's last 5s of tick times as a list of durations. // On average, a tick should take 50ms or less for a stable 20tps. // --> - if (attribute.startsWith("tick_times")) { - ListTag list = new ListTag(); + tagProcessor.registerTag(ListTag.class, "tick_times", (attribute, object) -> { + ListTag list = new ListTag(3); for (long time : Bukkit.getServer().getTickTimes()) { list.addObject(new DurationTag(time / 1000000000D)); } - event.setReplacedObject(list.getObjectAttribute(attribute.fulfill(1))); - return; - } + return list; + }); } } From a6890b9dfda14d80598fe63eebe514d940e1da57 Mon Sep 17 00:00:00 2001 From: david <89749147+davight@users.noreply.github.com> Date: Fri, 23 Aug 2024 21:09:24 +0200 Subject: [PATCH 054/280] oops --- .../java/com/denizenscript/denizen/paper/tags/PaperTagBase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/tags/PaperTagBase.java b/paper/src/main/java/com/denizenscript/denizen/paper/tags/PaperTagBase.java index 427bf1c51f..6ca61cdc7c 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/tags/PaperTagBase.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/tags/PaperTagBase.java @@ -25,7 +25,7 @@ public void register() { // On average, a tick should take 50ms or less for a stable 20tps. // --> tagProcessor.registerTag(ListTag.class, "tick_times", (attribute, object) -> { - ListTag list = new ListTag(3); + ListTag list = new ListTag(); for (long time : Bukkit.getServer().getTickTimes()) { list.addObject(new DurationTag(time / 1000000000D)); } From 144ce402d8985777e9c6d2b11337faa9bc98b420 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Sat, 24 Aug 2024 14:31:10 -0700 Subject: [PATCH 055/280] MaterialTag PropertyMatchHelper --- .../denizen/objects/ItemTag.java | 120 +----------------- .../denizen/objects/LocationTag.java | 2 +- .../denizen/objects/MaterialTag.java | 15 ++- .../DenizenCoreImplementation.java | 1 - 4 files changed, 19 insertions(+), 119 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/ItemTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/ItemTag.java index 0b62d42075..f554706170 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/ItemTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/ItemTag.java @@ -21,7 +21,6 @@ import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.ImageTag; import com.denizenscript.denizencore.objects.core.ListTag; -import com.denizenscript.denizencore.objects.properties.Property; import com.denizenscript.denizencore.objects.properties.PropertyParser; import com.denizenscript.denizencore.scripts.ScriptRegistry; import com.denizenscript.denizencore.tags.Attribute; @@ -29,6 +28,7 @@ import com.denizenscript.denizencore.tags.TagContext; import com.denizenscript.denizencore.utilities.CoreConfiguration; import com.denizenscript.denizencore.utilities.CoreUtilities; +import com.denizenscript.denizencore.utilities.PropertyMatchHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.denizenscript.denizencore.utilities.debugging.Debuggable; import org.bukkit.Bukkit; @@ -48,12 +48,8 @@ import org.bukkit.map.MapView; import java.awt.image.BufferedImage; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; import java.util.Map; import java.util.function.Consumer; -import java.util.stream.Collectors; public class ItemTag implements ObjectTag, Adjustable, FlaggableObject { @@ -849,116 +845,6 @@ public void adjust(Mechanism mechanism) { tagProcessor.processMechanism(this, mechanism); } - public static class ItemPropertyMatchHelper { - - public ItemTag properItem; - - public static class PropertyComparison { - - public String compareValue; - - public PropertyParser.PropertyGetter getter; - - public PropertyComparison(String compareValue, PropertyParser.PropertyGetter getter) { - this.compareValue = compareValue; - this.getter = getter; - } - } - - public List comparisons = new ArrayList<>(); - - public final boolean doesMatch(ItemTag item) { - if (item == null) { - return false; - } - if (item.getBukkitMaterial() != properItem.getBukkitMaterial()) { - Debug.verboseLog("[ItemPropertyMatchHelper] deny because material mismatch"); - return false; - } - for (PropertyComparison comparison : comparisons) { - Property p = comparison.getter.get(item); - if (p == null) { - Debug.verboseLog("[ItemPropertyMatchHelper] deny because property is null"); - return false; - } - String val = p.getPropertyString(); - if (comparison.compareValue == null) { - if (val != null) { - Debug.verboseLog("[ItemPropertyMatchHelper] deny because nullity"); - return false; - } - } - else { - if (val == null || !CoreUtilities.equalsIgnoreCase(comparison.compareValue, val)) { - Debug.verboseLog("[ItemPropertyMatchHelper] deny because unequal"); - return false; - } - } - } - return true; - } - - @Override - public String toString() { - return "item=" + properItem + ", comparisons=" + comparisons.stream().map(c -> c.compareValue).collect(Collectors.joining(", ")); - } - } - - public static LinkedHashMap matchHelperCache = new LinkedHashMap<>(); - - public static int MAX_MATCH_HELPER_CACHE = 1024; - - public static ItemPropertyMatchHelper getPropertyMatchHelper(String text) { - if (CoreConfiguration.debugVerbose) { - Debug.verboseLog("[ItemPropertyMatchHelper] getting helper for " + text); - } - ItemPropertyMatchHelper matchHelper = matchHelperCache.get(text); - if (matchHelper != null) { - return matchHelper; - } - ItemTag item = valueOf(text, CoreUtilities.noDebugContext); - if (item == null) { - Debug.verboseLog("[ItemPropertyMatchHelper] rejecting item because it's null"); - return null; - } - matchHelper = new ItemPropertyMatchHelper(); - matchHelper.properItem = item; - List propertiesGiven = ObjectFetcher.separateProperties(text); - if (propertiesGiven == null) { - return matchHelper; - } - PropertyParser.ClassPropertiesInfo itemInfo = PropertyParser.propertiesByClass.get(ItemTag.class); - for (int i = 1; i < propertiesGiven.size(); i++) { - String property = propertiesGiven.get(i); - int equalSign = property.indexOf('='); - if (equalSign == -1) { - if (CoreConfiguration.debugVerbose) { - Debug.verboseLog("[ItemPropertyMatchHelper] rejecting item because " + property + " lacks an equal sign"); - } - return null; - } - String label = ObjectFetcher.unescapeProperty(property.substring(0, equalSign)); - PropertyParser.PropertyGetter getter = itemInfo.propertiesByMechanism.get(label); - if (getter == null) { - continue; - } - Property realProp = getter.get(item); - if (realProp == null) { - continue; - } - matchHelper.comparisons.add(new ItemPropertyMatchHelper.PropertyComparison(realProp.getPropertyString(), getter)); - } - if (matchHelperCache.size() > MAX_MATCH_HELPER_CACHE) { - String firstMost = matchHelperCache.keySet().iterator().next(); - matchHelperCache.remove(firstMost); - } - if (CoreConfiguration.debugVerbose) { - Debug.verboseLog("[ItemPropertyMatchHelper] stored final result as " + matchHelper); - } - matchHelperCache.put(text, matchHelper); - return matchHelper; - } - @Override public boolean advancedMatches(String matcher, TagContext context) { String matcherLow = CoreUtilities.toLowerCase(matcher); @@ -994,7 +880,9 @@ else if (matcherLow.startsWith("raw_exact:")) { return true; } if (matcher.contains("[") && matcher.endsWith("]")) { - ItemPropertyMatchHelper helper = getPropertyMatchHelper(matcher); + PropertyMatchHelper helper = PropertyMatchHelper.getPropertyMatchHelper(ItemTag.class, matcher, (actual, compare) -> { + return actual.getBukkitMaterial() == compare.getBukkitMaterial(); + }); if (helper == null) { return false; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java index 38ddf372e5..0161f53a4f 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java @@ -5673,6 +5673,6 @@ public boolean advancedMatches(String matcher, TagContext context) { if (getY() < getWorld().getMinHeight() || getY() >= getWorld().getMaxHeight()) { return false; } - return MaterialTag.advancedMatchesInternal(getBlock().getType(), matcher, true); + return new MaterialTag(getBlock()).advancedMatches(matcher, context); } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/MaterialTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/MaterialTag.java index 25d38020f5..851e965d4d 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/MaterialTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/MaterialTag.java @@ -21,6 +21,7 @@ import com.denizenscript.denizencore.tags.ObjectTagProcessor; import com.denizenscript.denizencore.tags.TagContext; import com.denizenscript.denizencore.utilities.CoreUtilities; +import com.denizenscript.denizencore.utilities.PropertyMatchHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import org.bukkit.*; import org.bukkit.block.Block; @@ -834,6 +835,18 @@ else if (matcherLow.startsWith("material_flagged:")) { @Override public boolean advancedMatches(String matcher, TagContext context) { - return advancedMatchesInternal(getMaterial(), matcher, true); + if (advancedMatchesInternal(getMaterial(), matcher, true)) { + return true; + } + if (matcher.contains("[") && matcher.endsWith("]")) { + PropertyMatchHelper helper = PropertyMatchHelper.getPropertyMatchHelper(MaterialTag.class, matcher, (actual, compare) -> { + return actual.getMaterial() == compare.getMaterial(); + }); + if (helper == null) { + return false; + } + return helper.doesMatch(this); + } + return false; } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/implementation/DenizenCoreImplementation.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/implementation/DenizenCoreImplementation.java index 4fd047146e..5ded9bac24 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/implementation/DenizenCoreImplementation.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/implementation/DenizenCoreImplementation.java @@ -65,7 +65,6 @@ public String getImplementationName() { public void preScriptReload() { // Remove all recipes added by Denizen item scripts ItemScriptHelper.removeDenizenRecipes(); - ItemTag.matchHelperCache.clear(); // Remove all registered commands added by Denizen command scripts CommandScriptHelper.removeDenizenCommands(); // Remove all registered economy scripts if needed From e81c469d72939364d59e9ae9e2aa4a89d26a7289 Mon Sep 17 00:00:00 2001 From: david <89749147+davight@users.noreply.github.com> Date: Mon, 23 Sep 2024 08:15:00 +0200 Subject: [PATCH 056/280] fix --- .../java/com/denizenscript/denizen/paper/tags/PaperTagBase.java | 1 + 1 file changed, 1 insertion(+) diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/tags/PaperTagBase.java b/paper/src/main/java/com/denizenscript/denizen/paper/tags/PaperTagBase.java index 6ca61cdc7c..df7f418def 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/tags/PaperTagBase.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/tags/PaperTagBase.java @@ -14,6 +14,7 @@ public PaperTagBase() { TagManager.registerStaticTagBaseHandler(PaperTagBase.class, "paper", (t) -> instance); } + @Override public void register() { // <--[tag] From 4daacbfb2498f88a74b6985f97910b57983a4f5c Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Mon, 30 Sep 2024 14:15:06 -0700 Subject: [PATCH 057/280] ChunkTag: 'xz' and 'simple' --- .../denizen/objects/ChunkTag.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/ChunkTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/ChunkTag.java index b4d2436ec9..d2b8ba213b 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/ChunkTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/ChunkTag.java @@ -431,6 +431,34 @@ public static void register() { return object.world; }); + // <--[tag] + // @attribute + // @returns ElementTag + // @description + // Returns the X,Z coordinates of the chunk in the format "X,Z". + // @example + // # Narrates the player's chunk's X,Z coordinate pair. + // # For example, if the player was in , this will be "5,10" + // - narrate "Your current chunk coordinate is: !" + // --> + tagProcessor.registerTag(ElementTag.class, "xz", (attribute, object) -> { + return new ElementTag(object.chunkX + "," + object.chunkZ); + }); + + // <--[tag] + // @attribute + // @returns ElementTag + // @description + // Returns the X,Z coordinates and world name of the chunk in the format "X,Z,world". + // @example + // # Narrates the player's chunk's X,Z,World coordinates. + // # For example, if the player was in , this will be "5,10,world" + // - narrate "Your current chunk is: !" + // --> + tagProcessor.registerTag(ElementTag.class, "simple", (attribute, object) -> { + return new ElementTag(object.chunkX + "," + object.chunkZ + "," + object.getWorldName()); + }); + // <--[tag] // @attribute // @returns CuboidTag From 6461c8d963dca9b6430ea0ac00078fe8528e5b3d Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Tue, 1 Oct 2024 16:43:19 +0100 Subject: [PATCH 058/280] `PlayerTag.stop_sound`: input consistency --- .../denizenscript/denizen/nms/interfaces/PlayerHelper.java | 2 +- .../java/com/denizenscript/denizen/objects/PlayerTag.java | 4 ++-- .../denizen/nms/v1_17/helpers/PlayerHelperImpl.java | 5 +++-- .../denizen/nms/v1_18/helpers/PlayerHelperImpl.java | 5 +++-- .../denizen/nms/v1_19/helpers/PlayerHelperImpl.java | 5 +++-- .../denizen/nms/v1_20/helpers/PlayerHelperImpl.java | 5 +++-- .../denizen/nms/v1_21/helpers/PlayerHelperImpl.java | 5 +++-- 7 files changed, 18 insertions(+), 13 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/PlayerHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/PlayerHelper.java index 5359e37c3e..ae8714eb67 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/PlayerHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/PlayerHelper.java @@ -18,7 +18,7 @@ public abstract class PlayerHelper { - public abstract void stopSound(Player player, String sound, SoundCategory category); // TODO: remove the category param once 1.19 is the minimum version + public abstract void stopSound(Player player, NamespacedKey sound, SoundCategory category); // TODO: remove the category param once 1.19 is the minimum version public abstract FakeEntity sendEntitySpawn(List players, DenizenEntityType entityType, LocationTag location, ArrayList mechanisms, int customId, UUID customUUID, boolean autoTrack); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/PlayerTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/PlayerTag.java index 0ba1c08439..734a62298d 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/PlayerTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/PlayerTag.java @@ -3944,7 +3944,7 @@ else if (getPlayerEntity().getGameMode() == GameMode.SPECTATOR) { // --> if (mechanism.matches("stop_sound")) { SoundCategory category = null; - String key = null; + NamespacedKey key = null; if (mechanism.hasValue()) { if (mechanism.getValue().matchesEnum(SoundCategory.class)) { category = mechanism.getValue().asEnum(SoundCategory.class); @@ -3954,7 +3954,7 @@ else if (getPlayerEntity().getGameMode() == GameMode.SPECTATOR) { } } else { - key = mechanism.getValue().asString(); + key = Utilities.parseNamespacedKey(mechanism.getValue().asString()); } } NMSHandler.playerHelper.stopSound(getPlayerEntity(), key, category); diff --git a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/PlayerHelperImpl.java b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/PlayerHelperImpl.java index f289977558..5ff8967e98 100644 --- a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/PlayerHelperImpl.java +++ b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/PlayerHelperImpl.java @@ -47,6 +47,7 @@ import org.bukkit.craftbukkit.v1_17_R1.boss.CraftBossBar; import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_17_R1.util.CraftNamespacedKey; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -78,8 +79,8 @@ public class PlayerHelperImpl extends PlayerHelper { } @Override - public void stopSound(Player player, String sound, SoundCategory category) { - ResourceLocation soundKey = sound == null ? null : new ResourceLocation(sound); + public void stopSound(Player player, NamespacedKey sound, SoundCategory category) { + ResourceLocation soundKey = sound == null ? null : CraftNamespacedKey.toMinecraft(sound); net.minecraft.sounds.SoundSource nmsCategory = category == null ? null : net.minecraft.sounds.SoundSource.valueOf(category.name()); ((CraftPlayer) player).getHandle().connection.send(new ClientboundStopSoundPacket(soundKey, nmsCategory)); } diff --git a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/PlayerHelperImpl.java b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/PlayerHelperImpl.java index ab8f67dca1..566afc4032 100644 --- a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/PlayerHelperImpl.java +++ b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/PlayerHelperImpl.java @@ -56,6 +56,7 @@ import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_18_R2.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_18_R2.util.CraftNamespacedKey; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -87,8 +88,8 @@ public class PlayerHelperImpl extends PlayerHelper { } @Override - public void stopSound(Player player, String sound, SoundCategory category) { - ResourceLocation soundKey = sound == null ? null : new ResourceLocation(sound); + public void stopSound(Player player, NamespacedKey sound, SoundCategory category) { + ResourceLocation soundKey = sound == null ? null : CraftNamespacedKey.toMinecraft(sound); net.minecraft.sounds.SoundSource nmsCategory = category == null ? null : net.minecraft.sounds.SoundSource.valueOf(category.name()); ((CraftPlayer) player).getHandle().connection.send(new ClientboundStopSoundPacket(soundKey, nmsCategory)); } diff --git a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/PlayerHelperImpl.java b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/PlayerHelperImpl.java index a14a50690c..59927a9144 100644 --- a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/PlayerHelperImpl.java +++ b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/PlayerHelperImpl.java @@ -63,6 +63,7 @@ import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_19_R3.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_19_R3.util.CraftNamespacedKey; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -94,8 +95,8 @@ public class PlayerHelperImpl extends PlayerHelper { } @Override - public void stopSound(Player player, String sound, SoundCategory category) { - ((CraftPlayer) player).getHandle().connection.send(new ClientboundStopSoundPacket(sound == null ? null : new ResourceLocation(sound), null)); + public void stopSound(Player player, NamespacedKey sound, SoundCategory category) { + ((CraftPlayer) player).getHandle().connection.send(new ClientboundStopSoundPacket(sound == null ? null : CraftNamespacedKey.toMinecraft(sound), null)); } @Override diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PlayerHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PlayerHelperImpl.java index d54ef1810c..2f0c9f0d10 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PlayerHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/PlayerHelperImpl.java @@ -64,6 +64,7 @@ import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_20_R4.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftNamespacedKey; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -85,8 +86,8 @@ public class PlayerHelperImpl extends PlayerHelper { public static final EntityDataAccessor PLAYER_DATA_ACCESSOR_SKINLAYERS = ReflectionHelper.getFieldValue(net.minecraft.world.entity.player.Player.class, ReflectionMappingsInfo.Player_DATA_PLAYER_MODE_CUSTOMISATION, null); @Override - public void stopSound(Player player, String sound, SoundCategory category) { - ((CraftPlayer) player).getHandle().connection.send(new ClientboundStopSoundPacket(sound == null ? null : new ResourceLocation(sound), null)); + public void stopSound(Player player, NamespacedKey sound, SoundCategory category) { + ((CraftPlayer) player).getHandle().connection.send(new ClientboundStopSoundPacket(sound == null ? null : CraftNamespacedKey.toMinecraft(sound), null)); } @Override diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java index 55e625472d..8db2ba1bbc 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java @@ -64,6 +64,7 @@ import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_21_R1.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_21_R1.util.CraftNamespacedKey; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -85,8 +86,8 @@ public class PlayerHelperImpl extends PlayerHelper { public static final EntityDataAccessor PLAYER_DATA_ACCESSOR_SKINLAYERS = ReflectionHelper.getFieldValue(net.minecraft.world.entity.player.Player.class, ReflectionMappingsInfo.Player_DATA_PLAYER_MODE_CUSTOMISATION, null); @Override - public void stopSound(Player player, String sound, SoundCategory category) { - ((CraftPlayer) player).getHandle().connection.send(new ClientboundStopSoundPacket(sound == null ? null : ResourceLocation.withDefaultNamespace(sound), null)); + public void stopSound(Player player, NamespacedKey sound, SoundCategory category) { + ((CraftPlayer) player).getHandle().connection.send(new ClientboundStopSoundPacket(sound == null ? null : CraftNamespacedKey.toMinecraft(sound), null)); } @Override From 0d9bc9447a59394596f103ff8ea62467aebe0ee3 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Thu, 3 Oct 2024 14:36:24 +0100 Subject: [PATCH 059/280] Biomes: proper key handling with `NamespacedKey` (#2651) * Proper `NamespacedKey` usage in biome handling * Imports --- .../denizen/events/BukkitScriptEvent.java | 3 ++- .../player/BiomeEnterExitScriptEvent.java | 5 +++-- .../denizenscript/denizen/nms/NMSHandler.java | 5 +++-- .../denizen/nms/abstracts/BiomeNMS.java | 12 ++++++------ .../denizen/objects/BiomeTag.java | 18 ++++++------------ .../denizen/nms/v1_17/Handler.java | 11 ++++++----- .../denizen/nms/v1_17/impl/BiomeNMSImpl.java | 11 ++++++----- .../denizen/nms/v1_18/Handler.java | 16 ++++++++++------ .../denizen/nms/v1_18/impl/BiomeNMSImpl.java | 11 ++++++----- .../denizen/nms/v1_19/Handler.java | 16 ++++++++++------ .../denizen/nms/v1_19/impl/BiomeNMSImpl.java | 11 ++++++----- .../denizen/nms/v1_20/Handler.java | 17 ++++++++++------- .../denizen/nms/v1_20/impl/BiomeNMSImpl.java | 11 ++++++----- .../denizen/nms/v1_21/Handler.java | 19 +++++++++++-------- .../denizen/nms/v1_21/impl/BiomeNMSImpl.java | 11 ++++++----- 15 files changed, 97 insertions(+), 80 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/BukkitScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/BukkitScriptEvent.java index 337060fff7..e5ff12d2c4 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/BukkitScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/BukkitScriptEvent.java @@ -8,6 +8,7 @@ import com.denizenscript.denizen.scripts.containers.core.ItemScriptHelper; import com.denizenscript.denizen.tags.BukkitTagContext; import com.denizenscript.denizen.utilities.NotedAreaTracker; +import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; import com.denizenscript.denizen.utilities.inventory.SlotHelper; import com.denizenscript.denizencore.flags.AbstractFlagTracker; @@ -725,7 +726,7 @@ else if (lower.startsWith("area_flagged:")) { } else if (lower.startsWith("biome:")) { String biome = inputText.substring("biome:".length()); - return runGenericCheck(biome, new LocationTag(location).getBiome().name); + return runGenericCheck(biome, Utilities.namespacedKeyToString(new LocationTag(location).getBiome().getKey())); } } if (lower.equals("cuboid")) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/BiomeEnterExitScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/BiomeEnterExitScriptEvent.java index dcd014fb9e..8db1290cfb 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/BiomeEnterExitScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/BiomeEnterExitScriptEvent.java @@ -78,10 +78,11 @@ public boolean matches(ScriptPath path) { if (biome == null) { return false; } - if (!biome_test.equals("biome") && !biome_test.equals(CoreUtilities.toLowerCase(biome.getBiome().getName()))) { + String biomeKey = Utilities.namespacedKeyToString(biome.getBiome().getKey()); + if (!biome_test.equals("biome") && !biome_test.equals(biomeKey)) { return false; } - if (!runGenericSwitchCheck(path, "biome", biome.getBiome().getName())) { + if (!runGenericSwitchCheck(path, "biome", biomeKey)) { return false; } return super.matches(path); diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java b/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java index 19a8def9e6..a170628d46 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java @@ -8,6 +8,7 @@ import net.md_5.bungee.api.chat.HoverEvent; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.NamespacedKey; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.boss.BossBar; @@ -110,10 +111,10 @@ public List getBiomes(World world) { throw new UnsupportedOperationException(); } - public abstract BiomeNMS getBiomeNMS(World world, String name); + public abstract BiomeNMS getBiomeNMS(World world, NamespacedKey key); public BiomeNMS getBiomeAt(Block block) { - return NMSHandler.instance.getBiomeNMS(block.getWorld(), block.getBiome().name()); + return NMSHandler.instance.getBiomeNMS(block.getWorld(), block.getBiome().getKey()); } public abstract double[] getRecentTps(); diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/abstracts/BiomeNMS.java b/plugin/src/main/java/com/denizenscript/denizen/nms/abstracts/BiomeNMS.java index 13d9072a25..f60e1129ad 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/abstracts/BiomeNMS.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/abstracts/BiomeNMS.java @@ -1,8 +1,8 @@ package com.denizenscript.denizen.nms.abstracts; import com.denizenscript.denizencore.objects.core.ColorTag; -import com.denizenscript.denizencore.utilities.CoreUtilities; import org.bukkit.Location; +import org.bukkit.NamespacedKey; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.entity.EntityType; @@ -12,17 +12,17 @@ public abstract class BiomeNMS { - public String name; + public NamespacedKey key; public World world; - public BiomeNMS(World world, String name) { + public BiomeNMS(World world, NamespacedKey key) { this.world = world; - this.name = CoreUtilities.toLowerCase(name); + this.key = key; } - public String getName() { - return name; + public NamespacedKey getKey() { + return key; } public DownfallType getDownfallType() { diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/BiomeTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/BiomeTag.java index f3ddb58303..c10907b005 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/BiomeTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/BiomeTag.java @@ -4,6 +4,7 @@ import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.nms.abstracts.BiomeNMS; import com.denizenscript.denizen.utilities.BukkitImplDeprecations; +import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizencore.DenizenCore; import com.denizenscript.denizencore.flags.AbstractFlagTracker; import com.denizenscript.denizencore.flags.FlaggableObject; @@ -78,7 +79,7 @@ public static BiomeTag valueOf(String string, TagContext context) { } world = worldTag.getWorld(); } - BiomeNMS biome = NMSHandler.instance.getBiomeNMS(world, biomeName); + BiomeNMS biome = NMSHandler.instance.getBiomeNMS(world, Utilities.parseNamespacedKey(biomeName)); if (biome == null) { return null; } @@ -97,14 +98,7 @@ public static boolean matches(String arg) { ///////////// public BiomeTag(Biome biome) { - String key; - if (biome.getKey().getNamespace().equals("minecraft")) { - key = biome.getKey().getKey(); - } - else { - key = biome.getKey().toString(); - } - this.biome = NMSHandler.instance.getBiomeNMS(Bukkit.getWorlds().get(0), key); + this.biome = NMSHandler.instance.getBiomeNMS(Bukkit.getWorlds().get(0), biome.getKey()); } public BiomeTag(BiomeNMS biome) { @@ -135,7 +129,7 @@ public boolean isUnique() { @Override public String identify() { - return "b@" + biome.world.getName() + "," + biome.getName(); + return "b@" + biome.world.getName() + "," + Utilities.namespacedKeyToString(biome.getKey()); } @Override @@ -158,7 +152,7 @@ public ObjectTag setPrefix(String prefix) { @Override public AbstractFlagTracker getFlagTracker() { - return new RedirectionFlagTracker(DenizenCore.serverFlagMap, "__biomes." + biome.getName().replace(".", "&dot")); + return new RedirectionFlagTracker(DenizenCore.serverFlagMap, "__biomes." + Utilities.namespacedKeyToString(biome.getKey()).replace(".", "&dot")); } @Override @@ -200,7 +194,7 @@ public static void register() { // - narrate "You are currently in a biome!" // --> tagProcessor.registerTag(ElementTag.class, "name", (attribute, object) -> { - return new ElementTag(CoreUtilities.toLowerCase(object.biome.getName())); + return new ElementTag(Utilities.namespacedKeyToString(object.biome.getKey()), true); }); // <--[tag] diff --git a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/Handler.java b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/Handler.java index 3a196de10b..c0667ae3e7 100644 --- a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/Handler.java +++ b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/Handler.java @@ -46,6 +46,7 @@ import net.minecraft.world.level.biome.Biome; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.NamespacedKey; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.craftbukkit.v1_17_R1.CraftServer; @@ -57,6 +58,7 @@ import org.bukkit.craftbukkit.v1_17_R1.persistence.CraftPersistentDataContainer; import org.bukkit.craftbukkit.v1_17_R1.util.CraftChatMessage; import org.bukkit.craftbukkit.v1_17_R1.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_17_R1.util.CraftNamespacedKey; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.persistence.PersistentDataContainer; @@ -234,14 +236,14 @@ public List getBiomes(World world) { ServerLevel level = ((CraftWorld) world).getHandle(); ArrayList output = new ArrayList<>(); for (Map.Entry, Biome> pair : level.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY).entrySet()) { - output.add(new BiomeNMSImpl(level, pair.getKey().location().toString())); + output.add(new BiomeNMSImpl(level, CraftNamespacedKey.fromMinecraft(pair.getKey().location()))); } return output; } @Override - public BiomeNMS getBiomeNMS(World world, String name) { - BiomeNMSImpl impl = new BiomeNMSImpl(((CraftWorld) world).getHandle(), name); + public BiomeNMS getBiomeNMS(World world, NamespacedKey key) { + BiomeNMSImpl impl = new BiomeNMSImpl(((CraftWorld) world).getHandle(), key); if (impl.biomeBase == null) { return null; } @@ -254,8 +256,7 @@ public BiomeNMS getBiomeAt(Block block) { ServerLevel level = ((CraftWorld) block.getWorld()).getHandle(); Biome biome = level.getNoiseBiome(block.getX() >> 2, block.getY() >> 2, block.getZ() >> 2); ResourceLocation key = level.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY).getKey(biome); - String keyText = key.getNamespace().equals("minecraft") ? key.getPath() : key.toString(); - return new BiomeNMSImpl(level, keyText); + return new BiomeNMSImpl(level, CraftNamespacedKey.fromMinecraft(key)); } @Override diff --git a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/impl/BiomeNMSImpl.java b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/impl/BiomeNMSImpl.java index ca1c03d3ee..de250d1908 100644 --- a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/impl/BiomeNMSImpl.java +++ b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/impl/BiomeNMSImpl.java @@ -7,7 +7,6 @@ import com.denizenscript.denizencore.utilities.debugging.Debug; import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.random.WeightedRandomList; import net.minecraft.world.entity.MobCategory; @@ -15,8 +14,10 @@ import net.minecraft.world.level.biome.BiomeSpecialEffects; import net.minecraft.world.level.biome.MobSpawnSettings; import net.minecraft.world.level.chunk.LevelChunk; +import org.bukkit.NamespacedKey; import org.bukkit.block.Block; import org.bukkit.craftbukkit.v1_17_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_17_R1.util.CraftNamespacedKey; import org.bukkit.entity.EntityType; import java.util.ArrayList; @@ -30,10 +31,10 @@ public class BiomeNMSImpl extends BiomeNMS { public ServerLevel world; - public BiomeNMSImpl(ServerLevel world, String name) { - super(world.getWorld(), name); + public BiomeNMSImpl(ServerLevel world, NamespacedKey key) { + super(world.getWorld(), key); this.world = world; - biomeBase = world.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY).get(new ResourceLocation(name)); + biomeBase = world.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY).get(CraftNamespacedKey.toMinecraft(key)); } @Override @@ -170,7 +171,7 @@ private List getSpawnableEntities(MobCategory creatureType) { @Override public void setTo(Block block) { if (((CraftWorld) block.getWorld()).getHandle() != this.world) { - NMSHandler.instance.getBiomeNMS(block.getWorld(), getName()).setTo(block); + NMSHandler.instance.getBiomeNMS(block.getWorld(), getKey()).setTo(block); return; } // Based on CraftWorld source diff --git a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/Handler.java b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/Handler.java index 6e611dfe04..32350a5242 100644 --- a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/Handler.java +++ b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/Handler.java @@ -2,7 +2,10 @@ import com.denizenscript.denizen.Denizen; import com.denizenscript.denizen.nms.NMSHandler; -import com.denizenscript.denizen.nms.abstracts.*; +import com.denizenscript.denizen.nms.abstracts.BiomeNMS; +import com.denizenscript.denizen.nms.abstracts.BlockLight; +import com.denizenscript.denizen.nms.abstracts.ProfileEditor; +import com.denizenscript.denizen.nms.abstracts.Sidebar; import com.denizenscript.denizen.nms.util.PlayerProfile; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; import com.denizenscript.denizen.nms.util.jnbt.Tag; @@ -48,6 +51,7 @@ import net.minecraft.world.level.biome.Biome; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.NamespacedKey; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.craftbukkit.v1_18_R2.CraftServer; @@ -60,6 +64,7 @@ import org.bukkit.craftbukkit.v1_18_R2.persistence.CraftPersistentDataContainer; import org.bukkit.craftbukkit.v1_18_R2.util.CraftChatMessage; import org.bukkit.craftbukkit.v1_18_R2.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_18_R2.util.CraftNamespacedKey; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; @@ -254,14 +259,14 @@ public List getBiomes(World world) { ServerLevel level = ((CraftWorld) world).getHandle(); ArrayList output = new ArrayList<>(); for (Map.Entry, Biome> pair : level.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY).entrySet()) { - output.add(new BiomeNMSImpl(level, pair.getKey().location().toString())); + output.add(new BiomeNMSImpl(level, CraftNamespacedKey.fromMinecraft(pair.getKey().location()))); } return output; } @Override - public BiomeNMS getBiomeNMS(World world, String name) { - BiomeNMSImpl impl = new BiomeNMSImpl(((CraftWorld) world).getHandle(), name); + public BiomeNMS getBiomeNMS(World world, NamespacedKey key) { + BiomeNMSImpl impl = new BiomeNMSImpl(((CraftWorld) world).getHandle(), key); if (impl.biomeBase == null) { return null; } @@ -274,8 +279,7 @@ public BiomeNMS getBiomeAt(Block block) { ServerLevel level = ((CraftWorld) block.getWorld()).getHandle(); Holder biome = level.getNoiseBiome(block.getX() >> 2, block.getY() >> 2, block.getZ() >> 2); ResourceLocation key = level.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY).getKey(biome.value()); - String keyText = key.getNamespace().equals("minecraft") ? key.getPath() : key.toString(); - return new BiomeNMSImpl(level, keyText); + return new BiomeNMSImpl(level, CraftNamespacedKey.fromMinecraft(key)); } @Override diff --git a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/impl/BiomeNMSImpl.java b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/impl/BiomeNMSImpl.java index 0f23b72215..3588a6f8dc 100644 --- a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/impl/BiomeNMSImpl.java +++ b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/impl/BiomeNMSImpl.java @@ -9,7 +9,6 @@ import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.random.WeightedRandomList; import net.minecraft.world.entity.MobCategory; @@ -17,8 +16,10 @@ import net.minecraft.world.level.biome.BiomeSpecialEffects; import net.minecraft.world.level.biome.MobSpawnSettings; import net.minecraft.world.level.chunk.LevelChunk; +import org.bukkit.NamespacedKey; import org.bukkit.block.Block; import org.bukkit.craftbukkit.v1_18_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_18_R2.util.CraftNamespacedKey; import org.bukkit.entity.EntityType; import java.util.ArrayList; @@ -32,10 +33,10 @@ public class BiomeNMSImpl extends BiomeNMS { public ServerLevel world; - public BiomeNMSImpl(ServerLevel world, String name) { - super(world.getWorld(), name); + public BiomeNMSImpl(ServerLevel world, NamespacedKey key) { + super(world.getWorld(), key); this.world = world; - biomeBase = world.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY).getHolder(ResourceKey.create(Registry.BIOME_REGISTRY, new ResourceLocation(name))).orElse(null); + biomeBase = world.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY).getHolder(ResourceKey.create(Registry.BIOME_REGISTRY, CraftNamespacedKey.toMinecraft(key))).orElse(null); } @Override @@ -160,7 +161,7 @@ private List getSpawnableEntities(MobCategory creatureType) { @Override public void setTo(Block block) { if (((CraftWorld) block.getWorld()).getHandle() != this.world) { - NMSHandler.instance.getBiomeNMS(block.getWorld(), getName()).setTo(block); + NMSHandler.instance.getBiomeNMS(block.getWorld(), getKey()).setTo(block); return; } // Based on CraftWorld source diff --git a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/Handler.java b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/Handler.java index e19e762ab2..bf3f92977d 100644 --- a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/Handler.java +++ b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/Handler.java @@ -2,7 +2,10 @@ import com.denizenscript.denizen.Denizen; import com.denizenscript.denizen.nms.NMSHandler; -import com.denizenscript.denizen.nms.abstracts.*; +import com.denizenscript.denizen.nms.abstracts.BiomeNMS; +import com.denizenscript.denizen.nms.abstracts.BlockLight; +import com.denizenscript.denizen.nms.abstracts.ProfileEditor; +import com.denizenscript.denizen.nms.abstracts.Sidebar; import com.denizenscript.denizen.nms.util.PlayerProfile; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; import com.denizenscript.denizen.nms.util.jnbt.Tag; @@ -49,6 +52,7 @@ import net.minecraft.world.level.biome.Biome; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.NamespacedKey; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.boss.BossBar; @@ -63,6 +67,7 @@ import org.bukkit.craftbukkit.v1_19_R3.persistence.CraftPersistentDataContainer; import org.bukkit.craftbukkit.v1_19_R3.util.CraftChatMessage; import org.bukkit.craftbukkit.v1_19_R3.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_19_R3.util.CraftNamespacedKey; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; @@ -258,14 +263,14 @@ public List getBiomes(World world) { ServerLevel level = ((CraftWorld) world).getHandle(); ArrayList output = new ArrayList<>(); for (Map.Entry, Biome> pair : level.registryAccess().registryOrThrow(Registries.BIOME).entrySet()) { - output.add(new BiomeNMSImpl(level, pair.getKey().location().toString())); + output.add(new BiomeNMSImpl(level, CraftNamespacedKey.fromMinecraft(pair.getKey().location()))); } return output; } @Override - public BiomeNMS getBiomeNMS(World world, String name) { - BiomeNMSImpl impl = new BiomeNMSImpl(((CraftWorld) world).getHandle(), name); + public BiomeNMS getBiomeNMS(World world, NamespacedKey key) { + BiomeNMSImpl impl = new BiomeNMSImpl(((CraftWorld) world).getHandle(), key); if (impl.biomeHolder == null) { return null; } @@ -278,8 +283,7 @@ public BiomeNMS getBiomeAt(Block block) { ServerLevel level = ((CraftWorld) block.getWorld()).getHandle(); Holder biome = level.getNoiseBiome(block.getX() >> 2, block.getY() >> 2, block.getZ() >> 2); ResourceLocation key = level.registryAccess().registryOrThrow(Registries.BIOME).getKey(biome.value()); - String keyText = key.getNamespace().equals("minecraft") ? key.getPath() : key.toString(); - return new BiomeNMSImpl(level, keyText); + return new BiomeNMSImpl(level, CraftNamespacedKey.fromMinecraft(key)); } @Override diff --git a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/impl/BiomeNMSImpl.java b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/impl/BiomeNMSImpl.java index eae451a234..5f3b94961a 100644 --- a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/impl/BiomeNMSImpl.java +++ b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/impl/BiomeNMSImpl.java @@ -9,7 +9,6 @@ import net.minecraft.core.Holder; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.random.WeightedRandomList; import net.minecraft.world.entity.MobCategory; @@ -18,9 +17,11 @@ import net.minecraft.world.level.biome.MobSpawnSettings; import net.minecraft.world.level.chunk.LevelChunk; import org.bukkit.Location; +import org.bukkit.NamespacedKey; import org.bukkit.block.Block; import org.bukkit.craftbukkit.v1_19_R3.CraftWorld; import org.bukkit.craftbukkit.v1_19_R3.util.CraftLocation; +import org.bukkit.craftbukkit.v1_19_R3.util.CraftNamespacedKey; import org.bukkit.entity.EntityType; import java.lang.invoke.MethodHandle; @@ -36,10 +37,10 @@ public class BiomeNMSImpl extends BiomeNMS { public Holder biomeHolder; public ServerLevel world; - public BiomeNMSImpl(ServerLevel world, String name) { - super(world.getWorld(), name); + public BiomeNMSImpl(ServerLevel world, NamespacedKey key) { + super(world.getWorld(), key); this.world = world; - biomeHolder = world.registryAccess().registryOrThrow(Registries.BIOME).getHolder(ResourceKey.create(Registries.BIOME, new ResourceLocation(name))).orElse(null); + biomeHolder = world.registryAccess().registryOrThrow(Registries.BIOME).getHolder(ResourceKey.create(Registries.BIOME, CraftNamespacedKey.toMinecraft(key))).orElse(null); } @Override @@ -185,7 +186,7 @@ private List getSpawnableEntities(MobCategory creatureType) { @Override public void setTo(Block block) { if (((CraftWorld) block.getWorld()).getHandle() != this.world) { - NMSHandler.instance.getBiomeNMS(block.getWorld(), getName()).setTo(block); + NMSHandler.instance.getBiomeNMS(block.getWorld(), getKey()).setTo(block); return; } // Based on CraftWorld source diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java index 559ea7a158..a9c75aae33 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java @@ -2,7 +2,10 @@ import com.denizenscript.denizen.Denizen; import com.denizenscript.denizen.nms.NMSHandler; -import com.denizenscript.denizen.nms.abstracts.*; +import com.denizenscript.denizen.nms.abstracts.BiomeNMS; +import com.denizenscript.denizen.nms.abstracts.BlockLight; +import com.denizenscript.denizen.nms.abstracts.ProfileEditor; +import com.denizenscript.denizen.nms.abstracts.Sidebar; import com.denizenscript.denizen.nms.util.PlayerProfile; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; import com.denizenscript.denizen.nms.util.jnbt.Tag; @@ -47,7 +50,6 @@ import net.minecraft.nbt.StringTag; import net.minecraft.nbt.TagParser; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; @@ -62,6 +64,7 @@ import net.minecraft.world.level.block.state.BlockState; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.NamespacedKey; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.boss.BossBar; @@ -79,6 +82,7 @@ import org.bukkit.craftbukkit.v1_20_R4.util.CraftChatMessage; import org.bukkit.craftbukkit.v1_20_R4.util.CraftLocation; import org.bukkit.craftbukkit.v1_20_R4.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftNamespacedKey; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; @@ -308,14 +312,14 @@ public List getBiomes(World world) { ServerLevel level = ((CraftWorld) world).getHandle(); ArrayList output = new ArrayList<>(); for (Map.Entry, Biome> pair : level.registryAccess().registryOrThrow(Registries.BIOME).entrySet()) { - output.add(new BiomeNMSImpl(level, pair.getKey().location().toString())); + output.add(new BiomeNMSImpl(level, CraftNamespacedKey.fromMinecraft(pair.getKey().location()))); } return output; } @Override - public BiomeNMS getBiomeNMS(World world, String name) { - BiomeNMSImpl impl = new BiomeNMSImpl(((CraftWorld) world).getHandle(), name); + public BiomeNMS getBiomeNMS(World world, NamespacedKey key) { + BiomeNMSImpl impl = new BiomeNMSImpl(((CraftWorld) world).getHandle(), key); if (impl.biomeHolder == null) { return null; } @@ -328,8 +332,7 @@ public BiomeNMS getBiomeAt(Block block) { ServerLevel level = ((CraftWorld) block.getWorld()).getHandle(); Holder biome = level.getNoiseBiome(block.getX() >> 2, block.getY() >> 2, block.getZ() >> 2); ResourceLocation key = level.registryAccess().registryOrThrow(Registries.BIOME).getKey(biome.value()); - String keyText = key.getNamespace().equals("minecraft") ? key.getPath() : key.toString(); - return new BiomeNMSImpl(level, keyText); + return new BiomeNMSImpl(level, CraftNamespacedKey.fromMinecraft(key)); } @Override diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/BiomeNMSImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/BiomeNMSImpl.java index d9cbb1f635..24c64363e8 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/BiomeNMSImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/BiomeNMSImpl.java @@ -9,7 +9,6 @@ import net.minecraft.core.Holder; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.random.WeightedRandomList; import net.minecraft.world.entity.MobCategory; @@ -18,10 +17,12 @@ import net.minecraft.world.level.biome.MobSpawnSettings; import net.minecraft.world.level.chunk.LevelChunk; import org.bukkit.Location; +import org.bukkit.NamespacedKey; import org.bukkit.block.Block; import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; import org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntityType; import org.bukkit.craftbukkit.v1_20_R4.util.CraftLocation; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftNamespacedKey; import org.bukkit.entity.EntityType; import java.lang.invoke.MethodHandle; @@ -36,10 +37,10 @@ public class BiomeNMSImpl extends BiomeNMS { public Holder biomeHolder; public ServerLevel world; - public BiomeNMSImpl(ServerLevel world, String name) { - super(world.getWorld(), name); + public BiomeNMSImpl(ServerLevel world, NamespacedKey key) { + super(world.getWorld(), key); this.world = world; - biomeHolder = world.registryAccess().registryOrThrow(Registries.BIOME).getHolder(ResourceKey.create(Registries.BIOME, new ResourceLocation(name))).orElse(null); + biomeHolder = world.registryAccess().registryOrThrow(Registries.BIOME).getHolder(ResourceKey.create(Registries.BIOME, CraftNamespacedKey.toMinecraft(key))).orElse(null); } @Override @@ -175,7 +176,7 @@ private List getSpawnableEntities(MobCategory creatureType) { @Override public void setTo(Block block) { if (((CraftWorld) block.getWorld()).getHandle() != this.world) { - NMSHandler.instance.getBiomeNMS(block.getWorld(), getName()).setTo(block); + NMSHandler.instance.getBiomeNMS(block.getWorld(), getKey()).setTo(block); return; } // Based on CraftWorld source diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java index 11e603bd68..0046f6022e 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java @@ -2,7 +2,10 @@ import com.denizenscript.denizen.Denizen; import com.denizenscript.denizen.nms.NMSHandler; -import com.denizenscript.denizen.nms.abstracts.*; +import com.denizenscript.denizen.nms.abstracts.BiomeNMS; +import com.denizenscript.denizen.nms.abstracts.BlockLight; +import com.denizenscript.denizen.nms.abstracts.ProfileEditor; +import com.denizenscript.denizen.nms.abstracts.Sidebar; import com.denizenscript.denizen.nms.util.PlayerProfile; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; import com.denizenscript.denizen.nms.util.jnbt.Tag; @@ -47,7 +50,6 @@ import net.minecraft.nbt.StringTag; import net.minecraft.nbt.TagParser; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; @@ -61,6 +63,7 @@ import net.minecraft.world.level.block.state.BlockState; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.NamespacedKey; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.boss.BossBar; @@ -78,6 +81,7 @@ import org.bukkit.craftbukkit.v1_21_R1.util.CraftChatMessage; import org.bukkit.craftbukkit.v1_21_R1.util.CraftLocation; import org.bukkit.craftbukkit.v1_21_R1.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_21_R1.util.CraftNamespacedKey; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; @@ -306,15 +310,15 @@ public ProfileEditor getProfileEditor() { public List getBiomes(World world) { ServerLevel level = ((CraftWorld) world).getHandle(); ArrayList output = new ArrayList<>(); - for (Map.Entry, Biome> pair : level.registryAccess().registryOrThrow(Registries.BIOME).entrySet()) { - output.add(new BiomeNMSImpl(level, pair.getKey().location().toString())); + for (ResourceLocation key : level.registryAccess().registryOrThrow(Registries.BIOME).keySet()) { + output.add(new BiomeNMSImpl(level, CraftNamespacedKey.fromMinecraft(key))); } return output; } @Override - public BiomeNMS getBiomeNMS(World world, String name) { - BiomeNMSImpl impl = new BiomeNMSImpl(((CraftWorld) world).getHandle(), name); + public BiomeNMS getBiomeNMS(World world, NamespacedKey key) { + BiomeNMSImpl impl = new BiomeNMSImpl(((CraftWorld) world).getHandle(), key); if (impl.biomeHolder == null) { return null; } @@ -327,8 +331,7 @@ public BiomeNMS getBiomeAt(Block block) { ServerLevel level = ((CraftWorld) block.getWorld()).getHandle(); Holder biome = level.getNoiseBiome(block.getX() >> 2, block.getY() >> 2, block.getZ() >> 2); ResourceLocation key = level.registryAccess().registryOrThrow(Registries.BIOME).getKey(biome.value()); - String keyText = key.getNamespace().equals("minecraft") ? key.getPath() : key.toString(); - return new BiomeNMSImpl(level, keyText); + return new BiomeNMSImpl(level, CraftNamespacedKey.fromMinecraft(key)); } @Override diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java index 62194f31cc..d6ce214e19 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java @@ -9,7 +9,6 @@ import net.minecraft.core.Holder; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.random.WeightedRandomList; import net.minecraft.world.entity.MobCategory; @@ -18,10 +17,12 @@ import net.minecraft.world.level.biome.MobSpawnSettings; import net.minecraft.world.level.chunk.LevelChunk; import org.bukkit.Location; +import org.bukkit.NamespacedKey; import org.bukkit.block.Block; import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; import org.bukkit.craftbukkit.v1_21_R1.entity.CraftEntityType; import org.bukkit.craftbukkit.v1_21_R1.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R1.util.CraftNamespacedKey; import org.bukkit.entity.EntityType; import java.lang.invoke.MethodHandle; @@ -36,10 +37,10 @@ public class BiomeNMSImpl extends BiomeNMS { public Holder biomeHolder; public ServerLevel world; - public BiomeNMSImpl(ServerLevel world, String name) { - super(world.getWorld(), name); + public BiomeNMSImpl(ServerLevel world, NamespacedKey key) { + super(world.getWorld(), key); this.world = world; - biomeHolder = world.registryAccess().registryOrThrow(Registries.BIOME).getHolder(ResourceKey.create(Registries.BIOME, ResourceLocation.withDefaultNamespace(name))).orElse(null); + biomeHolder = world.registryAccess().registryOrThrow(Registries.BIOME).getHolder(ResourceKey.create(Registries.BIOME, CraftNamespacedKey.toMinecraft(key))).orElse(null); } @Override @@ -175,7 +176,7 @@ private List getSpawnableEntities(MobCategory creatureType) { @Override public void setTo(Block block) { if (((CraftWorld) block.getWorld()).getHandle() != this.world) { - NMSHandler.instance.getBiomeNMS(block.getWorld(), getName()).setTo(block); + NMSHandler.instance.getBiomeNMS(block.getWorld(), getKey()).setTo(block); return; } // Based on CraftWorld source From cace9e906c39a8f59fd31ae8eb8f67016f6852d0 Mon Sep 17 00:00:00 2001 From: Hydroxycobalamin <54799651+Hydroxycobalamin@users.noreply.github.com> Date: Fri, 4 Oct 2024 23:18:08 +0200 Subject: [PATCH 060/280] Fix: Paper deprecation warning on BellRingEvent (#2646) * fix: paper deprecation warning on BellRingEvent * return the correct entity * update meta --- .../denizen/paper/PaperModule.java | 4 +- .../paper/events/BellRingScriptEvent.java | 23 +----- .../denizen/events/ScriptEventRegistry.java | 3 + .../events/block/BellRingScriptEvent.java | 73 +++++++++++++++++++ 4 files changed, 80 insertions(+), 23 deletions(-) create mode 100644 plugin/src/main/java/com/denizenscript/denizen/events/block/BellRingScriptEvent.java diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java index 2f179f250c..e9fb7769a9 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java @@ -30,7 +30,9 @@ public static void init() { // Events ScriptEvent.registerScriptEvent(AnvilBlockDamagedScriptEvent.class); ScriptEvent.registerScriptEvent(AreaEnterExitScriptEventPaperImpl.class); - ScriptEvent.registerScriptEvent(BellRingScriptEvent.class); + if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_18)) { + ScriptEvent.registerScriptEvent(BellRingScriptEvent.class); + } ScriptEvent.registerScriptEvent(BlockPreDispenseScriptEvent.class); ScriptEvent.registerScriptEvent(CreeperIgnitesScriptEvent.class); ScriptEvent.registerScriptEvent(EntityAddToWorldScriptEvent.class); diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/BellRingScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/BellRingScriptEvent.java index b70112effa..40ef73ef82 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/events/BellRingScriptEvent.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/BellRingScriptEvent.java @@ -12,27 +12,6 @@ public class BellRingScriptEvent extends BukkitScriptEvent implements Listener { - // <--[event] - // @Events - // bell rings - // - // @Location true - // - // @Plugin Paper - // - // @Group Paper - // - // @Cancellable true - // - // @Triggers when a bell block rings. - // - // @Context - // returns the entity that rung the bell, if any. - // returns the location of the bell being rung. - // - // @Player when the ringing entity is a player. - // - // --> public BellRingScriptEvent() { registerCouldMatcher("bell rings"); @@ -58,7 +37,7 @@ public ScriptEntryData getScriptEntryData() { public ObjectTag getContext(String name) { switch (name) { case "entity": - return event.getEntity() == null ? null : new EntityTag(event.getEntity()); + return event.getEntity() == null ? null : new EntityTag(event.getEntity()).getDenizenObject(); case "location": return location; } return super.getContext(name); diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java index f124f602b1..a2f7560d1d 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java @@ -61,6 +61,9 @@ public static void registerMainEvents() { ScriptEvent.notNameParts.add(0, "SpigotImpl"); // Block events + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { + ScriptEvent.registerScriptEvent(BellRingScriptEvent.class); + } ScriptEvent.registerScriptEvent(BlockBuiltScriptEvent.class); ScriptEvent.registerScriptEvent(BlockBurnsScriptEvent.class); ScriptEvent.registerScriptEvent(BlockCooksSmeltsItemScriptEvent.class); diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/block/BellRingScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/block/BellRingScriptEvent.java new file mode 100644 index 0000000000..e5b223e7b1 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/events/block/BellRingScriptEvent.java @@ -0,0 +1,73 @@ +package com.denizenscript.denizen.events.block; + +import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.objects.LocationTag; +import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.scripts.ScriptEntryData; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BellRingEvent; + +public class BellRingScriptEvent extends BukkitScriptEvent implements Listener { + + // <--[event] + // @Events + // bell rings + // + // @Location true + // + // @Group Block + // + // @Cancellable true + // + // @Triggers when a bell block rings. (Requires Paper on versions lower than 1.19) + // + // @Context + // returns the EntityTag that rung the bell, if any. + // returns the LocationTag of the bell being rung. + // returns the ElementTag of the direction the bell was rung in. Can be "north", "west", "south", "east". Available only on MC 1.19+. + // + // @Player when the ringing entity is a player. + // + // --> + + public BellRingScriptEvent() { + registerCouldMatcher("bell rings"); + } + + public BellRingEvent event; + public LocationTag location; + + @Override + public boolean matches(ScriptPath path) { + if (!runInCheck(path, location)) { + return false; + } + return super.matches(path); + } + + @Override + public ScriptEntryData getScriptEntryData() { + return new BukkitScriptEntryData(event.getEntity()); + } + + @Override + public ObjectTag getContext(String name) { + return switch (name) { + case "entity" -> event.getEntity() == null ? null : new EntityTag(event.getEntity()).getDenizenObject(); + case "location" -> location; + case "direction" -> new ElementTag(event.getDirection()); + default -> super.getContext(name); + }; + } + + @EventHandler + public void bellRingEvent(BellRingEvent event) { + this.event = event; + location = new LocationTag(event.getBlock().getLocation()); + fire(event); + } +} From 423e86c321cd842a9c48149db197e392471440de Mon Sep 17 00:00:00 2001 From: Hydroxycobalamin <54799651+Hydroxycobalamin@users.noreply.github.com> Date: Tue, 8 Oct 2024 12:51:58 +0200 Subject: [PATCH 061/280] Add paper-only PlayerShieldDisable event (#2640) * Add paper-only PlayerShieldDisable event * minor: meta fix * improved meta --- .../denizen/paper/PaperModule.java | 3 + .../PlayerShieldDisableScriptEvent.java | 79 +++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerShieldDisableScriptEvent.java diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java index e9fb7769a9..f47fd55f95 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java @@ -75,6 +75,9 @@ public static void init() { ScriptEvent.registerScriptEvent(PlayerSelectsStonecutterRecipeScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerLecternPageChangeScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerSpectatesEntityScriptEvent.class); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + ScriptEvent.registerScriptEvent(PlayerShieldDisableScriptEvent.class); + } ScriptEvent.registerScriptEvent(PlayerStopsSpectatingScriptEvent.class); if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { ScriptEvent.registerScriptEvent(PlayerTracksEntityScriptEvent.class); diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerShieldDisableScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerShieldDisableScriptEvent.java new file mode 100644 index 0000000000..89e1358e66 --- /dev/null +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerShieldDisableScriptEvent.java @@ -0,0 +1,79 @@ +package com.denizenscript.denizen.paper.events; + +import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.objects.LocationTag; +import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.DurationTag; +import com.denizenscript.denizencore.scripts.ScriptEntryData; +import io.papermc.paper.event.player.PlayerShieldDisableEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class PlayerShieldDisableScriptEvent extends BukkitScriptEvent implements Listener { + + // <--[event] + // @Events + // player shield disables + // + // @Plugin Paper + // + // @Group Paper + // + // @Location true + // + // @Cancellable true + // + // @Triggers When a players shield is disabled. + // + // @Context + // returns an EntityTag of the attacker who disabled the shield. + // returns a DurationTag of the cooldown the shield is disabled for. + // + // @Determine + // "COOLDOWN:" to change the cooldown. + // + // @Player Always. + // + // --> + + public PlayerShieldDisableScriptEvent() { + registerCouldMatcher("player shield disables"); + this.registerDetermination("cooldown", DurationTag.class, (evt, context, duration) -> { + evt.event.setCooldown(duration.getTicksAsInt()); + }); + } + + public PlayerShieldDisableEvent event; + public LocationTag location; + + @Override + public boolean matches(ScriptPath path) { + if (!runInCheck(path, location)) { + return false; + } + return super.matches(path); + } + + @Override + public ObjectTag getContext(String name) { + return switch (name) { + case "damager" -> new EntityTag(event.getDamager()).getDenizenObject(); + case "cooldown" -> new DurationTag((long) event.getCooldown()); + default -> super.getContext(name); + }; + } + + @Override + public ScriptEntryData getScriptEntryData() { + return new BukkitScriptEntryData(event.getPlayer()); + } + + @EventHandler + public void playerShieldDisableEvent(PlayerShieldDisableEvent event) { + location = new LocationTag(event.getPlayer().getLocation()); + this.event = event; + fire(event); + } +} From 07b81f7dbee63dd645cf3acf2a28a2b5e91a16fd Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Sun, 13 Oct 2024 23:01:45 +0100 Subject: [PATCH 062/280] `ItemTag.is_waxed` property (#2652) * `ItemTag.is_waxed` property * Meta fixes * Non-Null tag returns --- .../objects/properties/PropertyRegistry.java | 3 + .../properties/item/ItemSignIsWaxed.java | 60 +++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemSignIsWaxed.java diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java index dbcb0e6043..529ea7aa35 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java @@ -245,6 +245,9 @@ public static void registerMainProperties() { PropertyParser.registerProperty(ItemRepairCost.class, ItemTag.class); PropertyParser.registerProperty(ItemScript.class, ItemTag.class); PropertyParser.registerProperty(ItemSignContents.class, ItemTag.class); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + PropertyParser.registerProperty(ItemSignIsWaxed.class, ItemTag.class); + } PropertyParser.registerProperty(ItemSkullskin.class, ItemTag.class); PropertyParser.registerProperty(ItemSpawnerCount.class, ItemTag.class); PropertyParser.registerProperty(ItemSpawnerDelay.class, ItemTag.class); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemSignIsWaxed.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemSignIsWaxed.java new file mode 100644 index 0000000000..6990a90754 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemSignIsWaxed.java @@ -0,0 +1,60 @@ +package com.denizenscript.denizen.objects.properties.item; + +import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.tags.Attribute; +import org.bukkit.Tag; +import org.bukkit.block.Sign; +import org.bukkit.inventory.meta.BlockStateMeta; + +public class ItemSignIsWaxed extends ItemProperty { + + // <--[property] + // @object ItemTag + // @name is_waxed + // @input ElementTag(Boolean) + // @description + // Controls whether a sign item is waxed (cannot be edited once placed). + // --> + + public static boolean describes(ItemTag item) { + return Tag.ALL_SIGNS.isTagged(item.getBukkitMaterial()); + } + + @Override + public ElementTag getPropertyValue() { + BlockStateMeta stateMeta = as(BlockStateMeta.class); + if (!stateMeta.hasBlockState()) { + return null; + } + return new ElementTag(((Sign) stateMeta.getBlockState()).isWaxed()); + } + + @Override + public ElementTag getTagValue(Attribute attribute) { + ElementTag value = getPropertyValue(); + return value == null ? new ElementTag(false) : value; + } + + @Override + public void setPropertyValue(ElementTag value, Mechanism mechanism) { + if (!mechanism.requireBoolean()) { + return; + } + editMeta(BlockStateMeta.class, stateMeta -> { + Sign sign = (Sign) stateMeta.getBlockState(); + sign.setWaxed(value.asBoolean()); + stateMeta.setBlockState(sign); + }); + } + + @Override + public String getPropertyId() { + return "is_waxed"; + } + + public static void register() { + autoRegister("is_waxed", ItemSignIsWaxed.class, ElementTag.class, false); + } +} From e4f7fc97b7a8f30262ed27ed4d98899805b6168e Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Sun, 13 Oct 2024 23:04:26 +0100 Subject: [PATCH 063/280] Properly deprecate `EntityTag.step_height` (#2654) * Properly deprecate `EntityTag.step_height` * Property deprecate class --- .../denizen/nms/interfaces/EntityHelper.java | 7 ++++-- .../properties/entity/EntityStepHeight.java | 23 ++++++++++++++----- .../utilities/BukkitImplDeprecations.java | 4 ++++ 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java index a39d9b8813..be2bc3b606 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java @@ -11,6 +11,7 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; +import org.bukkit.attribute.Attribute; import org.bukkit.block.BlockFace; import org.bukkit.block.CreatureSpawner; import org.bukkit.block.data.BlockData; @@ -445,11 +446,13 @@ public void setUUID(Entity entity, UUID id) { } public float getStepHeight(Entity entity) { - throw new UnsupportedOperationException(); + return entity instanceof LivingEntity livingEntity ? (float) livingEntity.getAttribute(Attribute.GENERIC_STEP_HEIGHT).getBaseValue() : 0; } public void setStepHeight(Entity entity, float stepHeight) { - throw new UnsupportedOperationException(); + if (entity instanceof LivingEntity livingEntity) { + livingEntity.getAttribute(Attribute.GENERIC_STEP_HEIGHT).setBaseValue(stepHeight); + } } public List convertInternalEntityDataValues(Entity entity, MapTag internalData) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityStepHeight.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityStepHeight.java index 6e5490cb29..7e22900a50 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityStepHeight.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityStepHeight.java @@ -1,23 +1,23 @@ package com.denizenscript.denizen.objects.properties.entity; import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.utilities.BukkitImplDeprecations; import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.tags.Attribute; +@Deprecated(forRemoval = true) public class EntityStepHeight extends EntityProperty { - // TODO: 1.20.6: this can be controlled by an attribute now, can deprecate in favor of that & backsupport // <--[property] // @object EntityTag // @name step_height // @input ElementTag(Decimal) + // @deprecated Use the step height attribute on MC 1.20+. // @description - // Controls the entity's step height, which controls how many blocks can it walk over. - // As this is based on an internal value, it has some edge-cases, for example: - // - most (but not all) living entities can still step over 1 block tall things as usual, even if this is set to 0. - // - this doesn't apply to vehicles when the player is controlling them. - // Note that this also applies to things like getting pushed. + // Deprecated in favor of the step height attribute on MC 1.20+, see <@link language Attribute Modifiers>. // --> public static boolean describes(EntityTag entity) { @@ -29,8 +29,19 @@ public ElementTag getPropertyValue() { return new ElementTag(NMSHandler.entityHelper.getStepHeight(getEntity())); } + @Override + public ElementTag getTagValue(Attribute attribute) { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + BukkitImplDeprecations.entityStepHeight.warn(attribute.context); + } + return super.getTagValue(attribute); + } + @Override public void setPropertyValue(ElementTag param, Mechanism mechanism) { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + BukkitImplDeprecations.entityStepHeight.warn(mechanism.context); + } if (mechanism.requireFloat()) { NMSHandler.entityHelper.setStepHeight(getEntity(), param.asFloat()); } 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 9be448ff50..08e7b0325a 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java @@ -337,6 +337,10 @@ public class BukkitImplDeprecations { // Added 2024/02/19, deprecate officially by 2027. public static Warning lecternPage = new FutureWarning("lecternPage", "'LocationTag.lectern_page' is deprecated in favor of 'LocationTag.page'."); + // Added 2024/10/12 + // Good candidate for bumping, as this is a niche feature only on 1.19+ that already had some issues + public static Warning entityStepHeight = new FutureWarning("entityStepHeight", "'EntityTag.step_height' is deprecated in favor of the step height attribute."); + // ==================== PAST deprecations of things that are already gone but still have a warning left behind ==================== // Removed upstream 2023/10/29 without warning. From 6919884c1eeaaffda1bc025cf848dfa40cfda320 Mon Sep 17 00:00:00 2001 From: hyper <39167664+heypr@users.noreply.github.com> Date: Thu, 17 Oct 2024 07:58:43 -0400 Subject: [PATCH 064/280] Dragon tags & mechs (#2620) * Dragon tags & mechs * Spacing * Error changes * ListTag converter, add space before mech meta entry * Minor fixes. * Remove unneeded null checks, added echo error if non-end world * Meta updates. * Updated meta, resolved all other comments * Meta updates --- .../properties/PaperWorldExtensions.java | 88 +++++++++++++++++ .../denizen/objects/WorldTag.java | 96 +++++++++++++++++++ 2 files changed, 184 insertions(+) diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperWorldExtensions.java b/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperWorldExtensions.java index 2299f5864e..74c335a853 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperWorldExtensions.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperWorldExtensions.java @@ -1,8 +1,14 @@ package com.denizenscript.denizen.paper.properties; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.objects.WorldTag; import com.denizenscript.denizen.utilities.BukkitImplDeprecations; import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.objects.core.ListTag; +import org.bukkit.boss.DragonBattle; public class PaperWorldExtensions { @@ -23,6 +29,88 @@ public static void register() { return new ElementTag(world.getWorld().getNoTickViewDistance()); }); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + + // <--[tag] + // @attribute + // @returns ElementTag(Number) + // @group paper + // @Plugin Paper + // @description + // Returns the number of end gateway portals. + // Only works if the world is an end world. + // --> + WorldTag.tagProcessor.registerTag(ElementTag.class, "gateway_count", (attribute, object) -> { + DragonBattle battle = object.getWorld().getEnderDragonBattle(); + if (battle == null) { + attribute.echoError("Provided world is not an end world!"); + return null; + } + return new ElementTag(battle.getGatewayCount()); + }); + + // <--[tag] + // @attribute + // @returns ListTag(EntityTag) + // @group paper + // @Plugin Paper + // @description + // Returns a ListTag of the healing end crystals located on top of the obsidian towers. + // Only works if the world is an end world. + // --> + WorldTag.tagProcessor.registerTag(ListTag.class, "healing_crystals", (attribute, object) -> { + DragonBattle battle = object.getWorld().getEnderDragonBattle(); + if (battle == null) { + attribute.echoError("Provided world is not an end world!"); + return null; + } + return new ListTag(battle.getHealingCrystals(), EntityTag::new); + }); + + // <--[tag] + // @attribute + // @returns ListTag(EntityTag) + // @group paper + // @Plugin Paper + // @description + // Returns a ListTag of the respawn end crystals located at the end exit portal. + // Only works if the world is an end world. + // --> + WorldTag.tagProcessor.registerTag(ListTag.class, "respawn_crystals", (attribute, object) -> { + DragonBattle battle = object.getWorld().getEnderDragonBattle(); + if (battle == null) { + attribute.echoError("Provided world is not an end world!"); + return null; + } + return new ListTag(battle.getRespawnCrystals(), EntityTag::new); + }); + + // <--[mechanism] + // @object WorldTag + // @name spawn_gateway + // @input LocationTag + // @group paper + // @Plugin Paper + // @description + // Spawns a new end gateway portal at the specified location. + // If no location is specified, tries to spawn a new end gateway using default game mechanics. + // Only works if the world is an end world. + // --> + WorldTag.tagProcessor.registerMechanism("spawn_gateway", false, (object, mechanism) -> { + DragonBattle battle = object.getWorld().getEnderDragonBattle(); + if (battle == null) { + mechanism.echoError("Cannot spawn gateway in non-end world!"); + return; + } + if (!mechanism.hasValue()) { + battle.spawnNewGateway(); + } + else if (mechanism.requireObject(LocationTag.class)) { + battle.spawnNewGateway(mechanism.valueAsType(LocationTag.class)); + } + }); + } + // <--[mechanism] // @object WorldTag // @name view_distance diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/WorldTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/WorldTag.java index 0cb68d98d7..557e15d9d9 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/WorldTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/WorldTag.java @@ -2,6 +2,7 @@ import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.nms.abstracts.BiomeNMS; import com.denizenscript.denizen.utilities.flags.WorldFlagHandler; import com.denizenscript.denizencore.flags.AbstractFlagTracker; @@ -837,6 +838,7 @@ else if (time >= 12500) { registerTag(LocationTag.class, "dragon_portal_location", (attribute, object) -> { DragonBattle battle = object.getWorld().getEnderDragonBattle(); if (battle == null) { + attribute.echoError("Provided world is not an end world!"); return null; } if (battle.getEndPortalLocation() == null) { @@ -1006,6 +1008,100 @@ else if (time >= 12500) { registerTag(ElementTag.class, "is_night", (attribute, world) -> { return new ElementTag(NMSHandler.worldHelper.isNight(world.getWorld())); }); + + // <--[tag] + // @attribute + // @returns ElementTag(Boolean) + // @mechanism WorldTag.first_dragon_killed + // @description + // Returns whether the ender dragon has been killed in this world before. + // Only works if the world is an end world. + // --> + registerTag(ElementTag.class, "first_dragon_killed", (attribute, object) -> { + DragonBattle battle = object.getWorld().getEnderDragonBattle(); + if (battle == null) { + attribute.echoError("Provided world is not an end world!"); + return null; + } + return new ElementTag(battle.hasBeenPreviouslyKilled()); + }); + + // <--[mechanism] + // @object WorldTag + // @name respawn_dragon + // @description + // Initiates the respawn sequence of the ender dragon as if a player placed 4 end crystals on the portal. + // Only works if the world is an end world. + // --> + tagProcessor.registerMechanism("respawn_dragon", false, (object, mechanism) -> { + DragonBattle battle = object.getWorld().getEnderDragonBattle(); + if (battle == null) { + mechanism.echoError("Provided world is not an end world!"); + return; + } + battle.initiateRespawn(); + }); + + // <--[mechanism] + // @object WorldTag + // @name reset_crystals + // @description + // Resets the end crystals located on the obsidian pillars in this world. + // Only works if the world is an end world. + // --> + tagProcessor.registerMechanism("reset_crystals", false, (object, mechanism) -> { + DragonBattle battle = object.getWorld().getEnderDragonBattle(); + if (battle == null) { + mechanism.echoError("Provided world is not an end world!"); + return; + } + battle.resetCrystals(); + }); + + // <--[mechanism] + // @object WorldTag + // @name respawn_phase + // @input ElementTag + // @description + // Set the current respawn phase of the ender dragon. Valid phases can be found at <@link url https://jd.papermc.io/paper/1.21.1/org/bukkit/boss/DragonBattle.RespawnPhase.html> + // Only works if the world is an end world. + // --> + tagProcessor.registerMechanism("respawn_phase", false, ElementTag.class, (object, mechanism, input) -> { + DragonBattle battle = object.getWorld().getEnderDragonBattle(); + if (battle == null) { + mechanism.echoError("Provided world is not an end world!"); + return; + } + if (mechanism.requireEnum(DragonBattle.RespawnPhase.class)) { + battle.setRespawnPhase(input.asEnum(DragonBattle.RespawnPhase.class)); + } + }); + + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + + // <--[mechanism] + // @object WorldTag + // @name first_dragon_killed + // @input ElementTag(Boolean) + // @description + // Set whether the first ender dragon was killed already. + // Toggling this value won't really affect anything in the end world, but may be useful when creating custom end worlds. + // Only works if the world is an end world. + // @tags + // + // --> + tagProcessor.registerMechanism("first_dragon_killed", false, ElementTag.class, (object, mechanism, input) -> { + DragonBattle battle = object.getWorld().getEnderDragonBattle(); + if (battle == null) { + mechanism.echoError("Provided world is not an end world!"); + return; + } + if (mechanism.requireBoolean()) { + battle.setPreviouslyKilled(input.asBoolean()); + } + }); + } + } public static ObjectTagProcessor tagProcessor = new ObjectTagProcessor<>(); From 95272dd1b4cf8026572428736a6c3acbd1d19c02 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Fri, 18 Oct 2024 09:12:02 +0100 Subject: [PATCH 065/280] `1.21` Attribute modifiers updates (#2637) * Revert "patch for AttributeModifier UUID values" This reverts commit 023bda77dae2a010e3fe023467c5a2da18091932. * Initial attribute modifiers update * Meta fixes * Remove redundant variable * `parseLegacyModifier`: `public` + `Deprecated` * Fix deprecation warning format * Fixes from review --- .../entity/EntityAttributeModifiers.java | 126 +++++++++++++----- .../item/ItemAttributeModifiers.java | 28 ++-- .../utilities/BukkitImplDeprecations.java | 3 + 3 files changed, 112 insertions(+), 45 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAttributeModifiers.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAttributeModifiers.java index eb9dbf7b9d..1feb30181b 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAttributeModifiers.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAttributeModifiers.java @@ -3,8 +3,8 @@ import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.EntityTag; -import com.denizenscript.denizen.objects.properties.item.ItemAttributeModifiers; -import com.denizenscript.denizencore.utilities.debugging.Debug; +import com.denizenscript.denizen.utilities.BukkitImplDeprecations; +import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; @@ -12,15 +12,18 @@ import com.denizenscript.denizencore.objects.core.MapTag; import com.denizenscript.denizencore.objects.properties.Property; import com.denizenscript.denizencore.objects.properties.PropertyParser; +import com.denizenscript.denizencore.tags.TagContext; import com.denizenscript.denizencore.tags.core.EscapeTagUtil; import com.denizenscript.denizencore.utilities.CoreUtilities; -import com.denizenscript.denizen.utilities.BukkitImplDeprecations; +import com.denizenscript.denizencore.utilities.debugging.Debug; import com.denizenscript.denizencore.utilities.text.StringHolder; +import org.bukkit.NamespacedKey; import org.bukkit.attribute.Attributable; import org.bukkit.attribute.Attribute; import org.bukkit.attribute.AttributeInstance; import org.bukkit.attribute.AttributeModifier; import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.EquipmentSlotGroup; import java.util.ArrayList; import java.util.List; @@ -81,27 +84,67 @@ public static MapTag mapify(AttributeModifier modifier) { result.putObject("name", new ElementTag(modifier.getName())); result.putObject("amount", new ElementTag(modifier.getAmount())); result.putObject("operation", new ElementTag(modifier.getOperation())); - result.putObject("slot", new ElementTag(modifier.getSlot() == null ? "any" : modifier.getSlot().name())); - if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_20)) { - result.putObject("id", new ElementTag(modifier.getUniqueId().toString())); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + result.putObject("slot", new ElementTag(modifier.getSlotGroup().toString(), true)); + } + else { + result.putObject("slot", new ElementTag(modifier.getSlot() == null ? "any" : modifier.getSlot().name())); } + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + result.putObject("key", new ElementTag(Utilities.namespacedKeyToString(modifier.getKey()), true)); + } + // TODO: remove/deprecate the UUID key + result.putObject("id", new ElementTag(modifier.getUniqueId().toString())); return result; } - public static AttributeModifier modiferForMap(Attribute attr, MapTag map) { - ElementTag name = map.getElement("name"); + public static AttributeModifier modiferForMap(Attribute attr, MapTag map, TagContext context) { ElementTag amount = map.getElement("amount"); ElementTag operation = map.getElement("operation"); - ElementTag slot = map.getElement("slot", "any"); - // TODO: MC 1.21: ID and name are now the same internal value. - ElementTag id = map.getElement("id"); - UUID idValue; double amountValue; AttributeModifier.Operation operationValue = operation.asEnum(AttributeModifier.Operation.class); if (operationValue == null) { Debug.echoError("Attribute modifier operation '" + operation + "' does not exist."); return null; } + try { + amountValue = Double.parseDouble(amount.toString()); + } + catch (NumberFormatException ex) { + Debug.echoError("Attribute modifier amount '" + amount + "' is not a valid decimal number."); + return null; + } + if (!NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + return parseLegacyModifier(attr, map, amountValue, operationValue); + } + ElementTag key = map.getElement("key"); + if (key == null && map.size() >= 2) { + BukkitImplDeprecations.pre1_21AttributeFormat.warn(context); + return parseLegacyModifier(attr, map, amountValue, operationValue); + } + if (key == null) { + Debug.echoError("Must specify a key."); + return null; + } + String slotGroupName = map.getElement("slot", "any").asString(); + EquipmentSlotGroup group = EquipmentSlotGroup.getByName(slotGroupName); + if (group == null) { + EquipmentSlot slot = ElementTag.asEnum(EquipmentSlot.class, slotGroupName); + if (slot == null) { + Debug.echoError("Invalid equipment slot group specified: " + slotGroupName); + return null; + } + group = slot.getGroup(); + } + return new AttributeModifier(Utilities.parseNamespacedKey(key.asString()), amountValue, operationValue, group); + } + + @Deprecated(forRemoval = true) + public static AttributeModifier parseLegacyModifier(Attribute attr, MapTag map, double amount, AttributeModifier.Operation operation) { + ElementTag name = map.getElement("name"); + ElementTag slot = map.getElement("slot", "any"); + ElementTag id = map.getElement("id"); + UUID idValue; try { idValue = id == null ? UUID.randomUUID() : UUID.fromString(id.toString()); } @@ -110,14 +153,15 @@ public static AttributeModifier modiferForMap(Attribute attr, MapTag map) { return null; } EquipmentSlot slotValue = CoreUtilities.equalsIgnoreCase(slot.toString(), "any") ? null : slot.asEnum(EquipmentSlot.class); - try { - amountValue = Double.parseDouble(amount.toString()); - } - catch (NumberFormatException ex) { - Debug.echoError("Attribute modifier amount '" + amount + "' is not a valid decimal number."); - return null; + if (slotValue == null && NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + EquipmentSlotGroup group = EquipmentSlotGroup.getByName(slot.asString()); + if (group == null) { + Debug.echoError("Invalid equipment slot group specified: " + slot); + return null; + } + return new AttributeModifier(idValue, name == null ? attr.name() : name.asString(), amount, operation, group); } - return new AttributeModifier(idValue, name == null ? attr.name() : name.toString(), amountValue, operationValue, slotValue); + return new AttributeModifier(idValue, name == null ? attr.name() : name.toString(), amount, operation, slotValue); } public ListTag getAttributeModifierList(AttributeInstance instance) { @@ -175,13 +219,18 @@ public String getPropertyId() { // These can be modified by such mechanisms as <@link mechanism EntityTag.attribute_base_values>, <@link mechanism EntityTag.attribute_modifiers>, <@link mechanism EntityTag.add_attribute_modifiers>, // <@link mechanism EntityTag.remove_attribute_modifiers>, <@link mechanism ItemTag.attribute_modifiers>, <@link mechanism ItemTag.add_attribute_modifiers>, <@link mechanism ItemTag.remove_attribute_modifiers>, ... // - // The input format of each of the 'add' and set mechanisms is slightly complicated: a MapTag where the keys are attribute names, and values are a ListTag of modifiers, - // where each modifier is itself a MapTag with required keys 'operation' and 'amount', and optional keys 'name', 'slot', and 'id'. + // The input format of each of the 'add' and set mechanisms is slightly complicated: a MapTag where the keys are attribute names, and values are a ListTag of modifiers, + // where each modifier is itself a MapTag with required keys 'operation' and 'amount', and additionally: + // Before MC 1.21: optional 'name', 'slot', and 'id' keys. + // The default ID will be randomly generated, the default name will be the attribute name. + // After MC 1.21: required 'key' key, and optional 'slot'. + // The 'key' is the attribute's name/identifier in a "namespace:key" format (defaulting to the "minecraft" namespace), which has to be distinct to other modifiers of the same type on the object. // // Valid operations: ADD_NUMBER, ADD_SCALAR, and MULTIPLY_SCALAR_1 - // Valid slots: HAND, OFF_HAND, FEET, LEGS, CHEST, HEAD, ANY + // Valid slots (used up to MC 1.20.6): HAND, OFF_HAND, FEET, LEGS, CHEST, HEAD, ANY + // Valid slot groups (used on MC 1.20.6+): <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/inventory/EquipmentSlotGroup.html> // Valid attribute names are listed at <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/attribute/Attribute.html> - // The default ID will be randomly generated, the default name will be the attribute name, the default slot is any. + // The default slot/slot group is "any". // // Operation names are based on the Bukkit enum. // ADD_NUMBER corresponds to Mojang "ADDITION" - adds on top of the base value. @@ -203,20 +252,21 @@ public String getPropertyId() { // // See also <@link url https://minecraft.wiki/w/Attribute#Modifiers> // - // For a quick and dirty in-line input, you can do for example: [generic_max_health=]>] + // For a quick and dirty in-line input, you can do for example: [generic_max_health=]>] // // For more clean/proper input, instead do something like: // // - definemap attributes: // generic_max_health: // 1: + // key: my_project:add_health // operation: ADD_NUMBER // amount: 20 // slot: head // - inventory adjust slot:head add_attribute_modifiers:<[attributes]> // // - // When pre-defining a custom item, instead of any of this, simply use an item script: <@link language item script containers>. That page shows an example of valid attribute modifiers on an item script. + // When pre-defining a custom item, instead of this, simply use an item script: <@link language item script containers>. That page shows an example of valid attribute modifiers on an item script. // // --> @@ -276,7 +326,7 @@ public void adjust(Mechanism mechanism) { instance.removeModifier(modifier); } for (ObjectTag listValue : CoreUtilities.objectToList(subValue.getValue(), mechanism.context)) { - instance.addModifier(modiferForMap(attr, listValue.asType(MapTag.class, mechanism.context))); + instance.addModifier(modiferForMap(attr, listValue.asType(MapTag.class, mechanism.context), mechanism.context)); } } } @@ -311,16 +361,19 @@ public void adjust(Mechanism mechanism) { continue; } for (ObjectTag listValue : CoreUtilities.objectToList(subValue.getValue(), mechanism.context)) { - AttributeModifier modifier = modiferForMap(attr, listValue.asType(MapTag.class, mechanism.context)); + AttributeModifier modifier = modiferForMap(attr, listValue.asType(MapTag.class, mechanism.context), mechanism.context); try { instance.addModifier(modifier); } catch (IllegalArgumentException ex) { - if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_20) && ex.getMessage().equals("Modifier is already applied on this attribute!")) { - Debug.echoError("Cannot add attribute with ID '" + modifier.getUniqueId() + "' as the entity already has a modifier with the same ID."); + if (!ex.getMessage().equals("Modifier is already applied on this attribute!")) { + throw ex; + } + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + mechanism.echoError("Cannot add attribute with key '" + modifier.getKey() + "' as the entity already has a modifier with the same key."); } else { - throw ex; + mechanism.echoError("Cannot add attribute with ID '" + modifier.getUniqueId() + "' as the entity already has a modifier with the same ID."); } } } @@ -336,7 +389,7 @@ public void adjust(Mechanism mechanism) { // @name remove_attribute_modifiers // @input ListTag // @description - // Removes attribute modifiers from an entity. Specify a list of attribute names or modifier UUIDs as input. + // Removes attribute modifiers from an entity. Specify a list of attribute names or modifier keys (UUIDs on versions below MC 1.21) as input. // See also <@link language attribute modifiers>. // @tags // @@ -363,13 +416,22 @@ public void adjust(Mechanism mechanism) { } } for (String toRemove : inputList) { + UUID id = null; + NamespacedKey key = null; + boolean is1_21 = NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21); + if (is1_21) { + key = Utilities.parseNamespacedKey(toRemove); + } + else { + id = UUID.fromString(toRemove); + } for (Attribute attr : Attribute.values()) { AttributeInstance instance = ent.getAttribute(attr); if (instance == null) { continue; } for (AttributeModifier modifer : instance.getModifiers()) { - if (ItemAttributeModifiers.getIdString(modifer).equals(toRemove)) { + if (is1_21 ? modifer.getKey().equals(key) : modifer.getUniqueId().equals(id)) { instance.removeModifier(modifer); break; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemAttributeModifiers.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemAttributeModifiers.java index a081d0a5c8..721063e236 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemAttributeModifiers.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemAttributeModifiers.java @@ -4,6 +4,7 @@ import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.objects.properties.entity.EntityAttributeModifiers; +import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; @@ -14,6 +15,7 @@ import com.denizenscript.denizencore.utilities.text.StringHolder; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; +import org.bukkit.NamespacedKey; import org.bukkit.attribute.AttributeModifier; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.meta.ItemMeta; @@ -61,7 +63,7 @@ public void setPropertyValue(MapTag param, Mechanism mechanism) { for (Map.Entry mapEntry : param.entrySet()) { org.bukkit.attribute.Attribute attr = org.bukkit.attribute.Attribute.valueOf(mapEntry.getKey().str.toUpperCase()); for (ObjectTag listValue : CoreUtilities.objectToList(mapEntry.getValue(), mechanism.context)) { - metaMap.put(attr, EntityAttributeModifiers.modiferForMap(attr, (MapTag) listValue)); + metaMap.put(attr, EntityAttributeModifiers.modiferForMap(attr, (MapTag) listValue, mechanism.context)); } } ItemMeta meta = getItemMeta(); @@ -132,7 +134,7 @@ public static void register() { for (Map.Entry subValue : param.entrySet()) { org.bukkit.attribute.Attribute attr = org.bukkit.attribute.Attribute.valueOf(subValue.getKey().str.toUpperCase()); for (ObjectTag listValue : CoreUtilities.objectToList(subValue.getValue(), mechanism.context)) { - meta.addAttributeModifier(attr, EntityAttributeModifiers.modiferForMap(attr, (MapTag) listValue)); + meta.addAttributeModifier(attr, EntityAttributeModifiers.modiferForMap(attr, (MapTag) listValue, mechanism.context)); } } prop.setItemMeta(meta); @@ -143,7 +145,7 @@ public static void register() { // @name remove_attribute_modifiers // @input ListTag // @description - // Removes attribute modifiers from an item. Specify a list of attribute names or modifier UUIDs as input. + // Removes attribute modifiers from an item. Specify a list of attribute names or modifier keys (UUIDs on versions below MC 1.21) as input. // See also <@link language attribute modifiers>. // @tags // @@ -159,10 +161,19 @@ public static void register() { } } for (String toRemove : inputList) { + UUID id = null; + NamespacedKey key = null; + boolean is1_21 = NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21); + if (is1_21) { + key = Utilities.parseNamespacedKey(toRemove); + } + else { + id = UUID.fromString(toRemove); + } Multimap metaMap = meta.getAttributeModifiers(); for (org.bukkit.attribute.Attribute attribute : metaMap.keys()) { for (AttributeModifier modifer : metaMap.get(attribute)) { - if (getIdString(modifer).equals(toRemove)) { + if (is1_21 ? modifer.getKey().equals(key) : modifer.getUniqueId().equals(id)) { meta.removeAttributeModifier(attribute, modifer); break; } @@ -172,13 +183,4 @@ public static void register() { prop.setItemMeta(meta); }); } - - public static String getIdString(AttributeModifier modifier) { - if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { - return modifier.getName(); - } - else { - return modifier.getUniqueId().toString(); - } - } } 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 08e7b0325a..457801563c 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java @@ -310,6 +310,9 @@ public class BukkitImplDeprecations { // Good candidate for SlowWarning, due to ease of update and the newer names already being more "normal"/well-known public static Warning oldSpigotNames = new VerySlowWarning("oldSpigotNames", "Several features (particles, entities, etc.) had alternative naming added by Spigot, which is now deprecated in favor of the official Minecraft naming; see relevant feature's meta docs for more information."); + // Added 2024/07/13 + public static Warning pre1_21AttributeFormat = new VerySlowWarning("pre1_21AttributeFormat", "Attribute modifiers were changed in 1.21, now using slot groups instead of slots and namespaced keys instead of UUIDS; check relevant meta docs for more information."); + // ==================== FUTURE deprecations ==================== // Added 2023/01/15, deprecate officially by 2026 From 3f523e9bd709ff4577db49eaeaa5e839902d9e04 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Fri, 18 Oct 2024 20:33:31 -0700 Subject: [PATCH 066/280] fix critical meta error --- .../main/java/com/denizenscript/denizen/objects/WorldTag.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/WorldTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/WorldTag.java index 557e15d9d9..c9796ff153 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/WorldTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/WorldTag.java @@ -1029,6 +1029,7 @@ else if (time >= 12500) { // <--[mechanism] // @object WorldTag // @name respawn_dragon + // @input None // @description // Initiates the respawn sequence of the ender dragon as if a player placed 4 end crystals on the portal. // Only works if the world is an end world. @@ -1045,6 +1046,7 @@ else if (time >= 12500) { // <--[mechanism] // @object WorldTag // @name reset_crystals + // @input None // @description // Resets the end crystals located on the obsidian pillars in this world. // Only works if the world is an end world. From da91cefe3e0a17b814860980910cec8c449cdcd5 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Thu, 24 Oct 2024 01:42:51 +0100 Subject: [PATCH 067/280] Cross-version `InventoryView` compatability (#2655) --- .../denizen/paper/PaperEventHelpers.java | 3 +- .../events/AnvilBlockDamagedScriptEvent.java | 3 +- .../item/ItemRecipeFormedScriptEvent.java | 7 +- .../player/PlayerDragsInInvScriptEvent.java | 4 +- .../player/PlayerSmithsItemScriptEvent.java | 3 +- .../denizen/objects/InventoryTag.java | 18 ++++-- .../denizen/objects/PlayerTag.java | 15 +++-- .../commands/item/FakeItemCommand.java | 21 +++--- .../commands/item/InventoryCommand.java | 25 +++++--- .../inventory/InventoryViewUtil.java | 64 +++++++++++++++++++ 10 files changed, 123 insertions(+), 40 deletions(-) create mode 100644 plugin/src/main/java/com/denizenscript/denizen/utilities/inventory/InventoryViewUtil.java diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/PaperEventHelpers.java b/paper/src/main/java/com/denizenscript/denizen/paper/PaperEventHelpers.java index bda20425d7..e727515ad0 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/PaperEventHelpers.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/PaperEventHelpers.java @@ -2,6 +2,7 @@ import com.denizenscript.denizen.objects.InventoryTag; import com.denizenscript.denizen.scripts.containers.core.InventoryScriptContainer; +import com.denizenscript.denizen.utilities.inventory.InventoryViewUtil; import com.denizenscript.denizencore.objects.core.ScriptTag; import com.destroystokyo.paper.event.player.PlayerRecipeBookClickEvent; import org.bukkit.event.EventHandler; @@ -11,7 +12,7 @@ public class PaperEventHelpers implements Listener { @EventHandler public void onRecipeBookClick(PlayerRecipeBookClickEvent event) { - InventoryTag inventory = InventoryTag.mirrorBukkitInventory(event.getPlayer().getOpenInventory().getTopInventory()); + InventoryTag inventory = InventoryTag.mirrorBukkitInventory(InventoryViewUtil.getTopInventory(event.getPlayer().getOpenInventory())); if (inventory.getIdHolder() instanceof ScriptTag) { if (((InventoryScriptContainer) ((ScriptTag) inventory.getIdHolder()).getContainer()).gui) { event.setCancelled(true); diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/AnvilBlockDamagedScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/AnvilBlockDamagedScriptEvent.java index 79af137dc8..7bc98d3f02 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/events/AnvilBlockDamagedScriptEvent.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/AnvilBlockDamagedScriptEvent.java @@ -3,6 +3,7 @@ import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizen.objects.InventoryTag; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; +import com.denizenscript.denizen.utilities.inventory.InventoryViewUtil; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; @@ -91,7 +92,7 @@ else if (lower.startsWith("break:")) { @Override public ScriptEntryData getScriptEntryData() { - return new BukkitScriptEntryData(event.getView().getPlayer()); + return new BukkitScriptEntryData(InventoryViewUtil.getPlayer(event.getView())); } @EventHandler diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/item/ItemRecipeFormedScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/item/ItemRecipeFormedScriptEvent.java index 7be360d8b7..7e419c48e1 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/item/ItemRecipeFormedScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/item/ItemRecipeFormedScriptEvent.java @@ -1,13 +1,14 @@ package com.denizenscript.denizen.events.item; +import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.InventoryTag; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; -import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.utilities.inventory.InventoryViewUtil; +import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.ListTag; -import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; import org.bukkit.Keyed; import org.bukkit.Material; @@ -68,7 +69,7 @@ public boolean matches(ScriptPath path) { @Override public ScriptEntryData getScriptEntryData() { - return new BukkitScriptEntryData(EntityTag.getPlayerFrom(event.getView().getPlayer()), null); + return new BukkitScriptEntryData(EntityTag.getPlayerFrom(InventoryViewUtil.getPlayer(event.getView())), null); } @Override diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerDragsInInvScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerDragsInInvScriptEvent.java index bf484e52da..b753e2ff86 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerDragsInInvScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerDragsInInvScriptEvent.java @@ -7,6 +7,7 @@ import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.objects.PlayerTag; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; +import com.denizenscript.denizen.utilities.inventory.InventoryViewUtil; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.ListTag; @@ -112,8 +113,7 @@ public ObjectTag getContext(String name) { case "item": return item; case "clicked_inventory": - return InventoryTag.mirrorBukkitInventory(event.getView() - .getInventory(event.getRawSlots().stream().findFirst().orElse(0))); + return InventoryTag.mirrorBukkitInventory(InventoryViewUtil.getInventory(event.getView(), event.getRawSlots().stream().findFirst().orElse(0))); case "drag_type": return new ElementTag(event.getType()); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerSmithsItemScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerSmithsItemScriptEvent.java index e9f302c5f4..7b3ed3e0af 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerSmithsItemScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerSmithsItemScriptEvent.java @@ -6,6 +6,7 @@ import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.objects.PlayerTag; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; +import com.denizenscript.denizen.utilities.inventory.InventoryViewUtil; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; import org.bukkit.entity.HumanEntity; @@ -94,7 +95,7 @@ else if (name.equals("inventory")) { @EventHandler public void onCraftItem(SmithItemEvent event) { - HumanEntity humanEntity = event.getView().getPlayer(); + HumanEntity humanEntity = InventoryViewUtil.getPlayer(event.getView()); if (EntityTag.isNPC(humanEntity)) { return; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/InventoryTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/InventoryTag.java index 8ce024e433..74672849c4 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/InventoryTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/InventoryTag.java @@ -1,13 +1,17 @@ package com.denizenscript.denizen.objects; import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.abstracts.ImprovedOfflinePlayer; import com.denizenscript.denizen.scripts.containers.core.InventoryScriptContainer; import com.denizenscript.denizen.scripts.containers.core.InventoryScriptHelper; import com.denizenscript.denizen.scripts.containers.core.ItemScriptHelper; +import com.denizenscript.denizen.tags.BukkitTagContext; +import com.denizenscript.denizen.utilities.BukkitImplDeprecations; import com.denizenscript.denizen.utilities.PaperAPITools; -import com.denizenscript.denizencore.utilities.debugging.Debug; import com.denizenscript.denizen.utilities.depends.Depends; import com.denizenscript.denizen.utilities.inventory.InventoryTrackerSystem; +import com.denizenscript.denizen.utilities.inventory.InventoryViewUtil; import com.denizenscript.denizen.utilities.inventory.RecipeHelper; import com.denizenscript.denizen.utilities.inventory.SlotHelper; import com.denizenscript.denizen.utilities.nbt.CustomNBT; @@ -16,9 +20,6 @@ import com.denizenscript.denizencore.flags.FlaggableObject; import com.denizenscript.denizencore.flags.SavableMapFlagTracker; import com.denizenscript.denizencore.objects.*; -import com.denizenscript.denizen.nms.NMSHandler; -import com.denizenscript.denizen.nms.abstracts.ImprovedOfflinePlayer; -import com.denizenscript.denizen.tags.BukkitTagContext; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.ListTag; import com.denizenscript.denizencore.objects.core.MapTag; @@ -32,8 +33,8 @@ import com.denizenscript.denizencore.tags.ObjectTagProcessor; import com.denizenscript.denizencore.tags.TagContext; import com.denizenscript.denizencore.utilities.CoreUtilities; -import com.denizenscript.denizen.utilities.BukkitImplDeprecations; import com.denizenscript.denizencore.utilities.YamlConfiguration; +import com.denizenscript.denizencore.utilities.debugging.Debug; import net.citizensnpcs.api.CitizensAPI; import org.bukkit.Bukkit; import org.bukkit.Keyed; @@ -48,7 +49,10 @@ import org.bukkit.inventory.meta.BookMeta; import org.bukkit.inventory.meta.ItemMeta; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; public class InventoryTag implements ObjectTag, Notable, Adjustable, FlaggableObject { @@ -306,7 +310,7 @@ else if (property.startsWith("size=")) { case "workbench": return player.getWorkbench(); case "crafting": - Inventory opened = player.getPlayerEntity().getOpenInventory().getTopInventory(); + Inventory opened = InventoryViewUtil.getTopInventory(player.getPlayerEntity().getOpenInventory()); if (opened instanceof CraftingInventory) { return new InventoryTag(opened, player.getPlayerEntity()); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/PlayerTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/PlayerTag.java index 734a62298d..4982fe8d11 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/PlayerTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/PlayerTag.java @@ -19,6 +19,7 @@ import com.denizenscript.denizen.utilities.entity.FakeEntity; import com.denizenscript.denizen.utilities.entity.HideEntitiesHelper; import com.denizenscript.denizen.utilities.flags.PlayerFlagHandler; +import com.denizenscript.denizen.utilities.inventory.InventoryViewUtil; import com.denizenscript.denizen.utilities.packets.DenizenPacketHandler; import com.denizenscript.denizen.utilities.packets.HideParticles; import com.denizenscript.denizen.utilities.packets.ItemChangeMessage; @@ -358,9 +359,9 @@ public InventoryTag getInventory() { public CraftingInventory getBukkitWorkbench() { if (isOnline()) { - if (getPlayerEntity().getOpenInventory().getType() == InventoryType.WORKBENCH - || getPlayerEntity().getOpenInventory().getType() == InventoryType.CRAFTING) { - return (CraftingInventory) getPlayerEntity().getOpenInventory().getTopInventory(); + if (InventoryViewUtil.getType(getPlayerEntity().getOpenInventory()) == InventoryType.WORKBENCH + || InventoryViewUtil.getType(getPlayerEntity().getOpenInventory()) == InventoryType.CRAFTING) { + return (CraftingInventory) InventoryViewUtil.getTopInventory(getPlayerEntity().getOpenInventory()); } } return null; @@ -1538,7 +1539,7 @@ else if (obj instanceof EntityTag) { // inventory, this returns the player's inventory. // --> registerOnlineOnlyTag(InventoryTag.class, "open_inventory", (attribute, object) -> { - return InventoryTag.mirrorBukkitInventory(object.getPlayerEntity().getOpenInventory().getTopInventory()); + return InventoryTag.mirrorBukkitInventory(InventoryViewUtil.getTopInventory(object.getPlayerEntity().getOpenInventory())); }); // <--[tag] @@ -1562,8 +1563,8 @@ else if (obj instanceof EntityTag) { // Returns the index of the trade the player is currently viewing, if any. // --> registerOnlineOnlyTag(ElementTag.class, "selected_trade_index", (attribute, object) -> { - if (object.getPlayerEntity().getOpenInventory().getTopInventory() instanceof MerchantInventory) { - return new ElementTag(((MerchantInventory) object.getPlayerEntity().getOpenInventory().getTopInventory()) + if (InventoryViewUtil.getTopInventory(object.getPlayerEntity().getOpenInventory()) instanceof MerchantInventory) { + return new ElementTag(((MerchantInventory) InventoryViewUtil.getTopInventory(object.getPlayerEntity().getOpenInventory())) .getSelectedRecipeIndex() + 1); } return null; @@ -1577,7 +1578,7 @@ else if (obj instanceof EntityTag) { // This is almost completely broke and only works if the player has placed items in the trade slots. // registerOnlineOnlyTag(TradeTag.class, "selected_trade", (attribute, object) -> { - Inventory playerInventory = object.getPlayerEntity().getOpenInventory().getTopInventory(); + Inventory playerInventory = InventoryViewUtil.getTopInventory(object.getPlayerEntity().getOpenInventory()); if (playerInventory instanceof MerchantInventory && ((MerchantInventory) playerInventory).getSelectedRecipe() != null) { return new TradeTag(((MerchantInventory) playerInventory).getSelectedRecipe()).duplicate(); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/item/FakeItemCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/item/FakeItemCommand.java index 02a40a29d8..a68d5e6362 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/item/FakeItemCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/item/FakeItemCommand.java @@ -1,20 +1,21 @@ package com.denizenscript.denizen.scripts.commands.item; -import com.denizenscript.denizen.utilities.Utilities; -import com.denizenscript.denizen.utilities.command.TabCompleteHelper; -import com.denizenscript.denizencore.utilities.debugging.Debug; -import com.denizenscript.denizen.utilities.inventory.SlotHelper; import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.objects.PlayerTag; +import com.denizenscript.denizen.utilities.Utilities; +import com.denizenscript.denizen.utilities.command.TabCompleteHelper; +import com.denizenscript.denizen.utilities.inventory.InventoryViewUtil; +import com.denizenscript.denizen.utilities.inventory.SlotHelper; import com.denizenscript.denizencore.DenizenCore; import com.denizenscript.denizencore.exceptions.InvalidArgumentsException; -import com.denizenscript.denizencore.objects.*; +import com.denizenscript.denizencore.objects.Argument; import com.denizenscript.denizencore.objects.core.DurationTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.ListTag; import com.denizenscript.denizencore.scripts.ScriptEntry; import com.denizenscript.denizencore.scripts.commands.AbstractCommand; +import com.denizenscript.denizencore.utilities.debugging.Debug; import com.denizenscript.denizencore.utilities.scheduling.OneTimeSchedulable; import org.bukkit.entity.Player; import org.bukkit.inventory.CraftingInventory; @@ -138,15 +139,15 @@ public void execute(ScriptEntry scriptEntry) { final Player ent = player.getPlayerEntity(); final int translated = raw ? slot : translateSlot(ent, slot); final InventoryView view = ent.getOpenInventory(); - final Inventory top = view.getTopInventory(); + final Inventory top = InventoryViewUtil.getTopInventory(view); NMSHandler.packetHelper.setSlot(ent, translated, item.getItemStack(), false); if (duration.getSeconds() > 0) { DenizenCore.schedule(new OneTimeSchedulable(() -> { if (!ent.isOnline()) { return; } - if (top == view.getTopInventory()) { - ItemStack original = view.getItem(translated); + if (top == InventoryViewUtil.getTopInventory(view)) { + ItemStack original = InventoryViewUtil.getItem(view, translated); NMSHandler.packetHelper.setSlot(ent, translated, original, false); } else if (slotSnapshot < 36) { @@ -162,8 +163,8 @@ else if (slotSnapshot < 36) { static int translateSlot(Player player, int slot) { // This translates Spigot slot standards to vanilla slots. // The slot order is different when a player is viewing an inventory vs not doing so, leading to this chaos. - int topSize = player.getOpenInventory().getTopInventory().getSize(); - if (player.getOpenInventory().getTopInventory() instanceof CraftingInventory) { + int topSize = InventoryViewUtil.getTopInventory(player.getOpenInventory()).getSize(); + if (InventoryViewUtil.getTopInventory(player.getOpenInventory()) instanceof CraftingInventory) { topSize = 9; if (slot > 35) { if (slot < 40) { // Armor equipment diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/item/InventoryCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/item/InventoryCommand.java index 3353285725..22044a1a38 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/item/InventoryCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/item/InventoryCommand.java @@ -3,22 +3,29 @@ import com.denizenscript.denizen.Denizen; import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.NMSVersion; -import com.denizenscript.denizen.objects.*; +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.objects.InventoryTag; +import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizen.objects.PlayerTag; import com.denizenscript.denizen.scripts.containers.core.InventoryScriptHelper; -import com.denizenscript.denizen.utilities.PaperAPITools; import com.denizenscript.denizen.utilities.Conversion; +import com.denizenscript.denizen.utilities.PaperAPITools; import com.denizenscript.denizen.utilities.Utilities; -import com.denizenscript.denizencore.exceptions.InvalidArgumentsRuntimeException; -import com.denizenscript.denizencore.scripts.commands.generator.*; import com.denizenscript.denizen.utilities.inventory.InventoryTrackerSystem; +import com.denizenscript.denizen.utilities.inventory.InventoryViewUtil; import com.denizenscript.denizen.utilities.inventory.SlotHelper; -import com.denizenscript.denizencore.objects.*; -import com.denizenscript.denizencore.objects.core.*; +import com.denizenscript.denizencore.exceptions.InvalidArgumentsRuntimeException; +import com.denizenscript.denizencore.objects.Argument; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.DurationTag; +import com.denizenscript.denizencore.objects.core.TimeTag; import com.denizenscript.denizencore.objects.notable.NoteManager; import com.denizenscript.denizencore.objects.properties.PropertyParser; import com.denizenscript.denizencore.scripts.ScriptEntry; import com.denizenscript.denizencore.scripts.commands.AbstractCommand; import com.denizenscript.denizencore.scripts.commands.core.FlagCommand; +import com.denizenscript.denizencore.scripts.commands.generator.*; import com.denizenscript.denizencore.utilities.data.DataAction; import com.denizenscript.denizencore.utilities.data.DataActionHelper; import org.bukkit.Bukkit; @@ -30,7 +37,9 @@ import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.event.inventory.InventoryType; -import org.bukkit.inventory.*; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.inventory.ItemStack; import java.util.AbstractMap; import java.util.HashSet; @@ -233,7 +242,7 @@ else if (type == InventoryType.WORKBENCH) { else { return; } - Inventory newInv = view.getTopInventory(); + Inventory newInv = InventoryViewUtil.getTopInventory(view); newInv.setContents(destination.getContents()); } finally { diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/inventory/InventoryViewUtil.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/inventory/InventoryViewUtil.java new file mode 100644 index 0000000000..6a38ee809d --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/inventory/InventoryViewUtil.java @@ -0,0 +1,64 @@ +package com.denizenscript.denizen.utilities.inventory; + +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import org.bukkit.entity.HumanEntity; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.inventory.ItemStack; + +import java.lang.invoke.MethodHandle; + +public class InventoryViewUtil { + + private static T get(MethodHandle methodHandle, InventoryView view) { + try { + return (T) methodHandle.invoke(view); + } + catch (Throwable e) { + Debug.echoError(e); + return null; + } + } + + private static T get(MethodHandle methodHandle, InventoryView view, int num) { + try { + return (T) methodHandle.invoke(view, num); + } + catch (Throwable e) { + Debug.echoError(e); + return null; + } + } + + private static final MethodHandle GET_TOP_INVENTORY = ReflectionHelper.getMethodHandle(InventoryView.class, "getTopInventory"); + + public static Inventory getTopInventory(InventoryView view) { + return get(GET_TOP_INVENTORY, view); + } + + private static final MethodHandle GET_PLAYER = ReflectionHelper.getMethodHandle(InventoryView.class, "getPlayer"); + + public static HumanEntity getPlayer(InventoryView view) { + return get(GET_PLAYER, view); + } + + private static final MethodHandle GET_TYPE = ReflectionHelper.getMethodHandle(InventoryView.class, "getType"); + + public static InventoryType getType(InventoryView view) { + return get(GET_TYPE, view); + } + + private static final MethodHandle GET_ITEM = ReflectionHelper.getMethodHandle(InventoryView.class, "getItem", int.class); + + public static ItemStack getItem(InventoryView view, int slot) { + return get(GET_ITEM, view, slot); + } + + private static final MethodHandle GET_INVENTORY = ReflectionHelper.getMethodHandle(InventoryView.class, "getInventory", int.class); + + public static Inventory getInventory(InventoryView view, int slot) { + return get(GET_INVENTORY, view, slot); + } +} From 47cba2878631b84da9c3820c77e88e529eb777c2 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Thu, 24 Oct 2024 21:13:47 +0100 Subject: [PATCH 068/280] 1.21.3 part 1: bump version numbers --- README.md | 2 +- plugin/pom.xml | 2 +- v1_21/pom.xml | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index cc184b5a68..413e01f7d0 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ The Denizen Scripting Language - Spigot Impl An implementation of the Denizen Scripting Language for Spigot servers, with strong Citizens interlinks to emphasize the power of using Denizen with NPCs! -**Version 1.3.1**: Compatible with Spigot 1.17.1, 1.18.2, 1.19.4, 1.20.6, and 1.21.1! +**Version 1.3.1**: Compatible with Spigot 1.17.1, 1.18.2, 1.19.4, 1.20.6, and 1.21.3! **Learn about Denizen from the Beginner's guide:** https://guide.denizenscript.com/guides/background/index.html diff --git a/plugin/pom.xml b/plugin/pom.xml index 4ce441f6e1..27686fac19 100644 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -30,7 +30,7 @@ org.spigotmc spigot-api - 1.21.1-R0.1-SNAPSHOT + 1.21.3-R0.1-SNAPSHOT jar provided diff --git a/v1_21/pom.xml b/v1_21/pom.xml index 84ca40d661..c9bd15f642 100644 --- a/v1_21/pom.xml +++ b/v1_21/pom.xml @@ -19,13 +19,13 @@ org.spigotmc spigot-api - 1.21.1-R0.1-SNAPSHOT + 1.21.3-R0.1-SNAPSHOT provided org.spigotmc spigot - 1.21.1-R0.1-SNAPSHOT + 1.21.3-R0.1-SNAPSHOT remapped-mojang provided @@ -45,9 +45,9 @@ remap-obf - org.spigotmc:minecraft-server:1.21.1-R0.1-SNAPSHOT:txt:maps-mojang + org.spigotmc:minecraft-server:1.21.3-R0.1-SNAPSHOT:txt:maps-mojang true - org.spigotmc:spigot:1.21.1-R0.1-SNAPSHOT:jar:remapped-mojang + org.spigotmc:spigot:1.21.3-R0.1-SNAPSHOT:jar:remapped-mojang true remapped-obf @@ -60,8 +60,8 @@ remap-spigot ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar - org.spigotmc:minecraft-server:1.21.1-R0.1-SNAPSHOT:csrg:maps-spigot - org.spigotmc:spigot:1.21.1-R0.1-SNAPSHOT:jar:remapped-obf + org.spigotmc:minecraft-server:1.21.3-R0.1-SNAPSHOT:csrg:maps-spigot + org.spigotmc:spigot:1.21.3-R0.1-SNAPSHOT:jar:remapped-obf From 73a11d861017019ccbf949117116a4746cc5229c Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Thu, 24 Oct 2024 21:16:00 +0100 Subject: [PATCH 069/280] 1.21.3 part 2: bump import revision numbers --- .../denizen/nms/v1_21/Handler.java | 30 +++++++++---------- .../v1_21/helpers/AdvancementHelperImpl.java | 8 ++--- .../v1_21/helpers/AnimationHelperImpl.java | 6 ++-- .../nms/v1_21/helpers/BlockHelperImpl.java | 26 ++++++++-------- .../nms/v1_21/helpers/ChunkHelperImpl.java | 4 +-- .../v1_21/helpers/CustomEntityHelperImpl.java | 4 +-- .../nms/v1_21/helpers/EntityHelperImpl.java | 16 +++++----- .../nms/v1_21/helpers/FishingHelperImpl.java | 8 ++--- .../nms/v1_21/helpers/ItemHelperImpl.java | 22 +++++++------- .../nms/v1_21/helpers/PacketHelperImpl.java | 16 +++++----- .../nms/v1_21/helpers/PlayerHelperImpl.java | 16 +++++----- .../nms/v1_21/helpers/WorldHelperImpl.java | 2 +- .../denizen/nms/v1_21/impl/BiomeNMSImpl.java | 8 ++--- .../v1_21/impl/ImprovedOfflinePlayerImpl.java | 6 ++-- .../nms/v1_21/impl/ProfileEditorImpl.java | 4 +-- .../nms/v1_21/impl/blocks/BlockLightImpl.java | 4 +-- .../impl/entities/CraftFakeArrowImpl.java | 6 ++-- .../impl/entities/CraftFakePlayerImpl.java | 4 +-- .../entities/CraftItemProjectileImpl.java | 6 ++-- .../impl/entities/EntityFakeArrowImpl.java | 4 +-- .../impl/entities/EntityFakePlayerImpl.java | 2 +- .../entities/EntityItemProjectileImpl.java | 2 +- .../handlers/AbstractListenerPlayInImpl.java | 2 +- .../handlers/DenizenNetworkManagerImpl.java | 6 ++-- .../handlers/DenizenPacketListenerImpl.java | 2 +- .../network/handlers/FakeBlockHelper.java | 8 ++--- .../packet/ActionBarEventPacketHandlers.java | 2 +- .../handlers/packet/AttachPacketHandlers.java | 2 +- .../packet/DisguisePacketHandlers.java | 2 +- .../packet/FakeEquipmentPacketHandlers.java | 2 +- .../packet/HideParticlesPacketHandlers.java | 2 +- .../network/packets/PacketOutChatImpl.java | 2 +- 32 files changed, 117 insertions(+), 117 deletions(-) diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java index 0046f6022e..c436c459bf 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java @@ -67,21 +67,21 @@ import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.boss.BossBar; -import org.bukkit.craftbukkit.v1_21_R1.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R1.CraftServer; -import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R1.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_21_R1.boss.CraftBossBar; -import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftInventory; -import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftInventoryCustom; -import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftInventoryView; -import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R1.persistence.CraftPersistentDataContainer; -import org.bukkit.craftbukkit.v1_21_R1.util.CraftChatMessage; -import org.bukkit.craftbukkit.v1_21_R1.util.CraftLocation; -import org.bukkit.craftbukkit.v1_21_R1.util.CraftMagicNumbers; -import org.bukkit.craftbukkit.v1_21_R1.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.v1_21_R2.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R2.CraftServer; +import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R2.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_21_R2.boss.CraftBossBar; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftInventory; +import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftInventoryCustom; +import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftInventoryView; +import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R2.persistence.CraftPersistentDataContainer; +import org.bukkit.craftbukkit.v1_21_R2.util.CraftChatMessage; +import org.bukkit.craftbukkit.v1_21_R2.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R2.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_21_R2.util.CraftNamespacedKey; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java index f40b5cb5ce..632e8bf63f 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java @@ -13,10 +13,10 @@ import net.minecraft.server.ServerAdvancementManager; import net.minecraft.server.level.ServerPlayer; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_21_R1.CraftServer; -import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R1.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.v1_21_R2.CraftServer; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R2.util.CraftNamespacedKey; import org.bukkit.entity.Player; import java.util.*; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AnimationHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AnimationHelperImpl.java index 3faa480465..4b16704620 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AnimationHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AnimationHelperImpl.java @@ -2,9 +2,9 @@ import com.denizenscript.denizen.nms.abstracts.AnimationHelper; import net.minecraft.world.entity.Entity; -import org.bukkit.craftbukkit.v1_21_R1.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R1.entity.CraftHorse; -import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPolarBear; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftHorse; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPolarBear; import org.bukkit.entity.EntityType; import org.bukkit.entity.Horse; import org.bukkit.entity.IronGolem; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java index 2691d73f16..dcc74cc161 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java @@ -44,19 +44,19 @@ import org.bukkit.block.BlockState; import org.bukkit.block.CreatureSpawner; import org.bukkit.block.Skull; -import org.bukkit.craftbukkit.v1_21_R1.CraftChunk; -import org.bukkit.craftbukkit.v1_21_R1.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R1.CraftServer; -import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R1.block.CraftBlock; -import org.bukkit.craftbukkit.v1_21_R1.block.CraftBlockEntityState; -import org.bukkit.craftbukkit.v1_21_R1.block.CraftCreatureSpawner; -import org.bukkit.craftbukkit.v1_21_R1.block.CraftSkull; -import org.bukkit.craftbukkit.v1_21_R1.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R1.tag.CraftBlockTag; -import org.bukkit.craftbukkit.v1_21_R1.util.CraftLocation; -import org.bukkit.craftbukkit.v1_21_R1.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_21_R2.CraftChunk; +import org.bukkit.craftbukkit.v1_21_R2.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R2.CraftServer; +import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R2.block.CraftBlock; +import org.bukkit.craftbukkit.v1_21_R2.block.CraftBlockEntityState; +import org.bukkit.craftbukkit.v1_21_R2.block.CraftCreatureSpawner; +import org.bukkit.craftbukkit.v1_21_R2.block.CraftSkull; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R2.tag.CraftBlockTag; +import org.bukkit.craftbukkit.v1_21_R2.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R2.util.CraftMagicNumbers; import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ChunkHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ChunkHelperImpl.java index 35628afb8e..99baae4130 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ChunkHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ChunkHelperImpl.java @@ -20,8 +20,8 @@ import net.minecraft.world.level.levelgen.Heightmap; import org.bukkit.World; import org.bukkit.Chunk; -import org.bukkit.craftbukkit.v1_21_R1.CraftChunk; -import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R2.CraftChunk; +import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/CustomEntityHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/CustomEntityHelperImpl.java index c449df8ca7..51acd9db81 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/CustomEntityHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/CustomEntityHelperImpl.java @@ -20,8 +20,8 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.scoreboard.Scoreboard; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java index 20c341cf9e..66f30191b8 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java @@ -65,14 +65,14 @@ import org.bukkit.attribute.AttributeInstance; import org.bukkit.block.CreatureSpawner; import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_21_R1.CraftServer; -import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R1.block.CraftBlock; -import org.bukkit.craftbukkit.v1_21_R1.block.CraftCreatureSpawner; -import org.bukkit.craftbukkit.v1_21_R1.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_21_R1.entity.*; -import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R1.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R2.CraftServer; +import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R2.block.CraftBlock; +import org.bukkit.craftbukkit.v1_21_R2.block.CraftCreatureSpawner; +import org.bukkit.craftbukkit.v1_21_R2.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_21_R2.entity.*; +import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R2.util.CraftLocation; import org.bukkit.entity.*; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.inventory.EquipmentSlot; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java index 5186b6695e..84e1416161 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java @@ -20,10 +20,10 @@ import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.phys.Vec3; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R1.entity.CraftFishHook; -import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftFishHook; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; import org.bukkit.entity.FishHook; import org.bukkit.entity.Player; import org.bukkit.event.entity.CreatureSpawnEvent; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java index 4966a1dcc2..ca9ba6a90a 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java @@ -57,17 +57,17 @@ import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_21_R1.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R1.CraftServer; -import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R1.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftInventoryPlayer; -import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftRecipe; -import org.bukkit.craftbukkit.v1_21_R1.map.CraftMapView; -import org.bukkit.craftbukkit.v1_21_R1.util.CraftMagicNumbers; -import org.bukkit.craftbukkit.v1_21_R1.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.v1_21_R2.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R2.CraftServer; +import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R2.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftInventoryPlayer; +import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftRecipe; +import org.bukkit.craftbukkit.v1_21_R2.map.CraftMapView; +import org.bukkit.craftbukkit.v1_21_R2.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_21_R2.util.CraftNamespacedKey; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java index a22795c98f..5b9fb51766 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java @@ -46,14 +46,14 @@ import org.bukkit.block.Sign; import org.bukkit.block.sign.Side; import org.bukkit.block.sign.SignSide; -import org.bukkit.craftbukkit.v1_21_R1.CraftServer; -import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R1.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R1.map.CraftMapCanvas; -import org.bukkit.craftbukkit.v1_21_R1.map.CraftMapView; -import org.bukkit.craftbukkit.v1_21_R1.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R2.CraftServer; +import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R2.map.CraftMapCanvas; +import org.bukkit.craftbukkit.v1_21_R2.map.CraftMapView; +import org.bukkit.craftbukkit.v1_21_R2.util.CraftLocation; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java index 8db2ba1bbc..bd7f501fce 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java @@ -57,14 +57,14 @@ import net.minecraft.world.phys.AABB; import org.bukkit.*; import org.bukkit.boss.BossBar; -import org.bukkit.craftbukkit.v1_21_R1.CraftServer; -import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R1.boss.CraftBossBar; -import org.bukkit.craftbukkit.v1_21_R1.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R1.util.CraftMagicNumbers; -import org.bukkit.craftbukkit.v1_21_R1.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.v1_21_R2.CraftServer; +import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R2.boss.CraftBossBar; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R2.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_21_R2.util.CraftNamespacedKey; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java index eb5b0e3486..590341cd9e 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java @@ -16,7 +16,7 @@ import net.minecraft.world.level.storage.PrimaryLevelData; import org.bukkit.Location; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; public class WorldHelperImpl implements WorldHelper { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java index d6ce214e19..eab9a42f70 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java @@ -19,10 +19,10 @@ import org.bukkit.Location; import org.bukkit.NamespacedKey; import org.bukkit.block.Block; -import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R1.entity.CraftEntityType; -import org.bukkit.craftbukkit.v1_21_R1.util.CraftLocation; -import org.bukkit.craftbukkit.v1_21_R1.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftEntityType; +import org.bukkit.craftbukkit.v1_21_R2.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R2.util.CraftNamespacedKey; import org.bukkit.entity.EntityType; import java.lang.invoke.MethodHandle; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java index fc51727c5c..fd68b685cd 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java @@ -13,9 +13,9 @@ import net.minecraft.world.entity.ai.attributes.DefaultAttributes; import net.minecraft.world.inventory.PlayerEnderChestContainer; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_21_R1.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftInventory; -import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftInventoryPlayer; +import org.bukkit.craftbukkit.v1_21_R2.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftInventory; +import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftInventoryPlayer; import org.bukkit.entity.HumanEntity; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java index 72561f5743..de0ccef095 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java @@ -19,8 +19,8 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_21_R1.CraftServer; -import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R2.CraftServer; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerRespawnEvent; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/blocks/BlockLightImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/blocks/BlockLightImpl.java index 4e687e70e2..b5d1f16bff 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/blocks/BlockLightImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/blocks/BlockLightImpl.java @@ -21,8 +21,8 @@ import net.minecraft.world.level.lighting.LevelLightEngine; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R1.CraftChunk; -import org.bukkit.craftbukkit.v1_21_R1.block.CraftBlock; +import org.bukkit.craftbukkit.v1_21_R2.CraftChunk; +import org.bukkit.craftbukkit.v1_21_R2.block.CraftBlock; import org.bukkit.util.Vector; import java.lang.invoke.MethodHandle; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakeArrowImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakeArrowImpl.java index 08bafa205d..8307ab0986 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakeArrowImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakeArrowImpl.java @@ -2,9 +2,9 @@ import com.denizenscript.denizen.nms.interfaces.FakeArrow; import net.minecraft.world.entity.projectile.AbstractArrow; -import org.bukkit.craftbukkit.v1_21_R1.CraftServer; -import org.bukkit.craftbukkit.v1_21_R1.entity.CraftAbstractArrow; -import org.bukkit.craftbukkit.v1_21_R1.entity.CraftArrow; +import org.bukkit.craftbukkit.v1_21_R2.CraftServer; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftAbstractArrow; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftArrow; public class CraftFakeArrowImpl extends CraftAbstractArrow implements FakeArrow { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakePlayerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakePlayerImpl.java index 0d622fc3ca..f22c98089c 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakePlayerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakePlayerImpl.java @@ -4,8 +4,8 @@ import com.denizenscript.denizen.nms.NMSHandler; import org.bukkit.Material; import org.bukkit.block.Block; -import org.bukkit.craftbukkit.v1_21_R1.CraftServer; -import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R2.CraftServer; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.metadata.MetadataValue; import org.bukkit.plugin.Plugin; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftItemProjectileImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftItemProjectileImpl.java index 02cf1c6013..f332d8c73a 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftItemProjectileImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftItemProjectileImpl.java @@ -3,9 +3,9 @@ import com.denizenscript.denizen.nms.interfaces.ItemProjectile; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; -import org.bukkit.craftbukkit.v1_21_R1.CraftServer; -import org.bukkit.craftbukkit.v1_21_R1.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R2.CraftServer; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; import org.bukkit.projectiles.ProjectileSource; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakeArrowImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakeArrowImpl.java index 8d34b29cdc..5b468cd628 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakeArrowImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakeArrowImpl.java @@ -7,8 +7,8 @@ import net.minecraft.world.item.Items; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R1.CraftServer; -import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R2.CraftServer; +import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; import org.bukkit.event.entity.CreatureSpawnEvent; public class EntityFakeArrowImpl extends SpectralArrow { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakePlayerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakePlayerImpl.java index fe5641ea0f..ab350624ff 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakePlayerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakePlayerImpl.java @@ -15,7 +15,7 @@ import net.minecraft.server.network.CommonListenerCookie; import net.minecraft.world.entity.player.Player; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_21_R1.CraftServer; +import org.bukkit.craftbukkit.v1_21_R2.CraftServer; import org.bukkit.event.entity.CreatureSpawnEvent; public class EntityFakePlayerImpl extends ServerPlayer { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java index 215a9667d9..0092218ee6 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java @@ -14,7 +14,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R1.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R2.CraftRegistry; import java.lang.invoke.MethodHandle; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java index ccda64f0f3..581fde7874 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java @@ -26,7 +26,7 @@ import net.minecraft.world.entity.RelativeMovement; import net.minecraft.world.phys.Vec3; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; import org.bukkit.event.player.PlayerTeleportEvent; import java.lang.reflect.Field; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java index 36db992cc6..367740fd00 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -31,9 +31,9 @@ import net.minecraft.util.debugchart.LocalSampleLogger; import org.bukkit.Bukkit; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_21_R1.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R2.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; import org.bukkit.entity.Player; import javax.annotation.Nullable; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java index f02f49a307..ebbec85d6e 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java @@ -18,7 +18,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.CommonListenerCookie; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_21_R1.block.CraftBlock; +import org.bukkit.craftbukkit.v1_21_R2.block.CraftBlock; import org.bukkit.event.block.SignChangeEvent; public class DenizenPacketListenerImpl extends AbstractListenerPlayInImpl { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java index 3c67cb7901..5897890e21 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java @@ -23,10 +23,10 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.PalettedContainer; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_21_R1.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R1.block.CraftBlockStates; -import org.bukkit.craftbukkit.v1_21_R1.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_21_R2.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R2.block.CraftBlockStates; +import org.bukkit.craftbukkit.v1_21_R2.block.data.CraftBlockData; import java.lang.invoke.MethodHandle; import java.lang.reflect.Constructor; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/ActionBarEventPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/ActionBarEventPacketHandlers.java index 92a520a679..94d4a1827d 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/ActionBarEventPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/ActionBarEventPacketHandlers.java @@ -8,7 +8,7 @@ import com.denizenscript.denizencore.objects.core.ElementTag; import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundSetActionBarTextPacket; -import org.bukkit.craftbukkit.v1_21_R1.util.CraftChatMessage; +import org.bukkit.craftbukkit.v1_21_R2.util.CraftChatMessage; public class ActionBarEventPacketHandlers { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java index 5535b73298..78ec8a98ef 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java @@ -11,7 +11,7 @@ import net.minecraft.network.protocol.game.*; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; -import org.bukkit.craftbukkit.v1_21_R1.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftEntity; import org.bukkit.util.Vector; import java.lang.reflect.Field; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java index ccee457bd2..244f5ac500 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java @@ -14,7 +14,7 @@ import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; -import org.bukkit.craftbukkit.v1_21_R1.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftEntity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java index 461d454bf6..7e2301e469 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java @@ -12,7 +12,7 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; -import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; import java.util.ArrayList; import java.util.List; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HideParticlesPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HideParticlesPacketHandlers.java index f63494f896..7f36f5928c 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HideParticlesPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HideParticlesPacketHandlers.java @@ -4,7 +4,7 @@ import com.denizenscript.denizen.utilities.packets.HideParticles; import net.minecraft.network.protocol.game.ClientboundLevelParticlesPacket; import org.bukkit.Particle; -import org.bukkit.craftbukkit.v1_21_R1.CraftParticle; +import org.bukkit.craftbukkit.v1_21_R2.CraftParticle; import java.util.Set; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java index 22f5d271c9..aa06fe9e30 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java @@ -8,7 +8,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundPlayerChatPacket; import net.minecraft.network.protocol.game.ClientboundSystemChatPacket; -import org.bukkit.craftbukkit.v1_21_R1.util.CraftChatMessage; +import org.bukkit.craftbukkit.v1_21_R2.util.CraftChatMessage; import java.lang.reflect.Field; From 648df4798a65b6795f6694b5a79eb47f8be57a18 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Sat, 26 Oct 2024 21:08:34 +0100 Subject: [PATCH 070/280] 1.21.3 part 3: update reflection mappings --- .../nms/v1_21/ReflectionMappingsInfo.java | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java index 058d4be58c..6ee95b871a 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java @@ -5,44 +5,44 @@ public class ReflectionMappingsInfo { // Content generated by ReflectionMappingsGenerator - https://github.com/DenizenScript/ReflectionMappingsGenerator // net.minecraft.world.level.block.state.BlockBehaviour - public static String BlockBehaviour_explosionResistance = "aH"; + public static String BlockBehaviour_explosionResistance = "aI"; // net.minecraft.core.MappedRegistry public static String MappedRegistry_frozen = "l"; public static String MappedRegistry_unregisteredIntrusiveHolders = "m"; // net.minecraft.world.item.crafting.RecipeManager - public static String RecipeManager_byName = "e"; + public static String RecipeManager_byName = ERROR_UNKNOWN_TARGET; // net.minecraft.world.entity.Entity - public static String Entity_onGround = "aG"; - public static String Entity_DATA_SHARED_FLAGS_ID = "ap"; - public static String Entity_DATA_CUSTOM_NAME = "aQ"; - public static String Entity_DATA_CUSTOM_NAME_VISIBLE = "aR"; + public static String Entity_onGround = "aD"; + public static String Entity_DATA_SHARED_FLAGS_ID = "am"; + public static String Entity_DATA_CUSTOM_NAME = "aO"; + public static String Entity_DATA_CUSTOM_NAME_VISIBLE = "aP"; // net.minecraft.world.entity.LivingEntity - public static String LivingEntity_attackStrengthTicker = "aT"; + public static String LivingEntity_attackStrengthTicker = "aS"; public static String LivingEntity_autoSpinAttackTicks = "bC"; public static String LivingEntity_setLivingEntityFlag_method = "c"; // net.minecraft.world.entity.player.Player - public static String Player_DATA_PLAYER_ABSORPTION_ID = "e"; + public static String Player_DATA_PLAYER_ABSORPTION_ID = "d"; public static String Player_DATA_PLAYER_MODE_CUSTOMISATION = "bX"; // net.minecraft.server.level.ServerPlayer - public static String ServerPlayer_respawnForced = "dl"; + public static String ServerPlayer_respawnForced = "dn"; // net.minecraft.world.entity.monster.EnderMan - public static String EnderMan_DATA_CREEPY = "ce"; + public static String EnderMan_DATA_CREEPY = "cc"; // net.minecraft.world.entity.monster.Zombie - public static String Zombie_inWaterTime = "cq"; + public static String Zombie_inWaterTime = "cn"; // net.minecraft.world.item.Item public static String Item_components = "c"; // net.minecraft.world.level.Level - public static String Level_isClientSide = "B"; + public static String Level_isClientSide = "C"; // net.minecraft.server.level.ThreadedLevelLightEngine public static String ThreadedLevelLightEngine_addTask_method = "a"; @@ -51,10 +51,10 @@ public class ReflectionMappingsInfo { public static String ThreadedLevelLightEngineTaskType_PRE_UPDATE = "a"; // net.minecraft.world.entity.ExperienceOrb - public static String ExperienceOrb_age = "g"; + public static String ExperienceOrb_age = "f"; // net.minecraft.world.entity.item.ItemEntity - public static String ItemEntity_DATA_ITEM = "d"; + public static String ItemEntity_DATA_ITEM = "c"; // net.minecraft.world.level.biome.Biome public static String Biome_climateSettings = "i"; @@ -101,11 +101,11 @@ public class ReflectionMappingsInfo { // net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket public static String ClientboundTeleportEntityPacket_id = "b"; - public static String ClientboundTeleportEntityPacket_x = "c"; - public static String ClientboundTeleportEntityPacket_y = "d"; - public static String ClientboundTeleportEntityPacket_z = "e"; - public static String ClientboundTeleportEntityPacket_yRot = "f"; - public static String ClientboundTeleportEntityPacket_xRot = "g"; + public static String ClientboundTeleportEntityPacket_x = ERROR_UNKNOWN_TARGET; + public static String ClientboundTeleportEntityPacket_y = ERROR_UNKNOWN_TARGET; + public static String ClientboundTeleportEntityPacket_z = ERROR_UNKNOWN_TARGET; + public static String ClientboundTeleportEntityPacket_yRot = ERROR_UNKNOWN_TARGET; + public static String ClientboundTeleportEntityPacket_xRot = ERROR_UNKNOWN_TARGET; // net.minecraft.network.protocol.game.ClientboundLevelChunkPacketData$BlockEntityInfo public static String ClientboundLevelChunkPacketDataBlockEntityInfo_packedXZ = "c"; @@ -115,12 +115,12 @@ public class ReflectionMappingsInfo { public static String SynchedEntityData_itemsById = "e"; // net.minecraft.world.entity.projectile.FishingHook - public static String FishingHook_nibble = "j"; - public static String FishingHook_timeUntilLured = "k"; - public static String FishingHook_timeUntilHooked = "l"; + public static String FishingHook_nibble = "i"; + public static String FishingHook_timeUntilLured = "j"; + public static String FishingHook_timeUntilHooked = "k"; // net.minecraft.tags.TagNetworkSerialization$NetworkPayload - public static String TagNetworkSerializationNetworkPayload_tags = "a"; + public static String TagNetworkSerializationNetworkPayload_tags = "b"; // net.minecraft.core.HolderSet$Named public static String HolderSetNamed_bind_method = "b"; @@ -129,7 +129,7 @@ public class ReflectionMappingsInfo { public static String HolderReference_bindTags_method = "a"; // net.minecraft.server.level.ServerLevel - public static String ServerLevel_sleepStatus = "P"; + public static String ServerLevel_sleepStatus = "Q"; // net.minecraft.world.item.AdventureModePredicate public static String AdventureModePredicate_predicates = "h"; From 44d3a6cbe45576975f2fdb17615b964e0f70c814 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Sun, 27 Oct 2024 11:15:41 +0000 Subject: [PATCH 071/280] 1.21.3 part 4: update mappings version check --- .../main/java/com/denizenscript/denizen/nms/v1_21/Handler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java index c436c459bf..cb8ee14a7e 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java @@ -150,7 +150,7 @@ public void undisableAsyncCatcher() { @Override public boolean isCorrectMappingsCode() { - return ((CraftMagicNumbers) CraftMagicNumbers.INSTANCE).getMappingsVersion().equals("7092ff1ff9352ad7e2260dc150e6a3ec"); + return CraftMagicNumbers.INSTANCE.getMappingsVersion().equals("61a218cda78417b6039da56e08194083"); } @Override From 41a94d6ab19326eacc2420a118d071a22beab49c Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Sun, 27 Oct 2024 14:07:20 +0000 Subject: [PATCH 072/280] 1.21.3 part 5: initial code updates --- ...layerReceivesTablistUpdateScriptEvent.java | 2 + .../player/PlayerSteersEntityScriptEvent.java | 1 + .../denizen/objects/WorldTag.java | 2 +- .../utilities/MultiVersionHelper1_19.java | 5 +- .../entity/EntityAttachmentHelper.java | 24 +++-- .../denizen/nms/v1_21/Handler.java | 4 +- .../nms/v1_21/ReflectionMappingsInfo.java | 14 +-- .../nms/v1_21/helpers/BlockHelperImpl.java | 83 ++++++++--------- .../nms/v1_21/helpers/ChunkHelperImpl.java | 6 +- .../nms/v1_21/helpers/EntityHelperImpl.java | 12 +-- .../nms/v1_21/helpers/FishingHelperImpl.java | 16 ++-- .../nms/v1_21/helpers/ItemHelperImpl.java | 43 ++++----- .../nms/v1_21/helpers/PacketHelperImpl.java | 25 +++--- .../nms/v1_21/helpers/PlayerHelperImpl.java | 21 +++-- .../nms/v1_21/helpers/WorldHelperImpl.java | 2 +- .../denizen/nms/v1_21/impl/BiomeNMSImpl.java | 8 +- .../nms/v1_21/impl/ProfileEditorImpl.java | 2 +- .../handlers/AbstractListenerPlayInImpl.java | 60 +++++++++++-- .../network/handlers/FakeBlockHelper.java | 4 +- .../handlers/packet/AttachPacketHandlers.java | 90 +++++++++---------- .../packet/DisguisePacketHandlers.java | 36 +++++--- .../packet/HiddenEntitiesPacketHandlers.java | 2 +- .../PlayerHearsSoundEventPacketHandlers.java | 4 +- .../TablistUpdateEventPacketHandlers.java | 2 +- .../packets/PacketInSteerVehicleImpl.java | 8 +- 25 files changed, 279 insertions(+), 197 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerReceivesTablistUpdateScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerReceivesTablistUpdateScriptEvent.java index a72d4348c1..ae8cc03d5c 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerReceivesTablistUpdateScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerReceivesTablistUpdateScriptEvent.java @@ -15,6 +15,8 @@ public class PlayerReceivesTablistUpdateScriptEvent extends BukkitScriptEvent { + // TODO: 1.21.3: players now have a list order value that's controlled here + // <--[event] // @Events // player receives tablist update diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerSteersEntityScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerSteersEntityScriptEvent.java index f00bc4fc54..6d8133ffb2 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerSteersEntityScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerSteersEntityScriptEvent.java @@ -11,6 +11,7 @@ import java.util.function.Consumer; +// TODO: 1.21.3: This can probably be deprecated in favor of the new "PlayerInputEvent" public class PlayerSteersEntityScriptEvent extends BukkitScriptEvent { // <--[event] diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/WorldTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/WorldTag.java index 557e15d9d9..0a95ce53e4 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/WorldTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/WorldTag.java @@ -1063,7 +1063,7 @@ else if (time >= 12500) { // @name respawn_phase // @input ElementTag // @description - // Set the current respawn phase of the ender dragon. Valid phases can be found at <@link url https://jd.papermc.io/paper/1.21.1/org/bukkit/boss/DragonBattle.RespawnPhase.html> + // Set the current respawn phase of the ender dragon. Valid phases can be found at <@link url https://jd.papermc.io/paper/1.21.3/org/bukkit/boss/DragonBattle.RespawnPhase.html> // Only works if the world is an end world. // --> tagProcessor.registerMechanism("respawn_phase", false, ElementTag.class, (object, mechanism, input) -> { diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/MultiVersionHelper1_19.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/MultiVersionHelper1_19.java index ed9d821b38..917817ee5f 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/MultiVersionHelper1_19.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/MultiVersionHelper1_19.java @@ -13,7 +13,7 @@ public class MultiVersionHelper1_19 { public static boolean colorIsApplicable(EntityType type) { - return type == EntityType.FROG || type == EntityType.BOAT || type == EntityType.CHEST_BOAT; + return type == EntityType.FROG || Boat.class.isAssignableFrom(type.getEntityClass()); } // TODO Frog variants technically have registries on all supported versions @@ -31,7 +31,7 @@ public static ListTag getAllowedColors(EntityType type) { if (type == EntityType.FROG) { return Utilities.listTypes(Frog.Variant.class); } - else if (type == EntityType.BOAT || type == EntityType.CHEST_BOAT) { + else if (Boat.class.isAssignableFrom(type.getEntityClass())) { return Utilities.listTypes(Boat.Type.class); } return null; @@ -42,6 +42,7 @@ public static void setColor(Entity entity, Mechanism mech) { LegacyNamingHelper.requireType(mech, Frog.Variant.class).ifPresent(frog::setVariant); } else if (entity instanceof Boat boat && mech.requireEnum(Boat.Type.class)) { + // TODO: 1.21.3: Deprecate setting boat types boat.setBoatType(mech.getValue().asEnum(Boat.Type.class)); } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/EntityAttachmentHelper.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/EntityAttachmentHelper.java index f0ec27024d..2c98905da9 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/EntityAttachmentHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/EntityAttachmentHelper.java @@ -3,12 +3,16 @@ import com.denizenscript.denizen.Denizen; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.utilities.packets.NetworkInterceptHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; import org.bukkit.Location; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; import org.bukkit.util.Vector; -import java.util.*; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.UUID; public class EntityAttachmentHelper { @@ -178,15 +182,19 @@ public static class EntityAttachedToMap { public static byte adaptedCompressedAngle(byte angle, float offset) { float angleF = ((float) angle) * (360F / 256F); - angleF += offset; - angleF %= 360; - if (angleF > 180) { - angleF -= 360; + return compressAngle(adaptedAngle(angleF, offset)); + } + + public static float adaptedAngle(float angle, float offset) { + angle += offset; + angle %= 360; + if (angle > 180) { + angle -= 360; } - if (angleF < -180) { - angleF += 360; + if (angle < -180) { + angle += 360; } - return (byte)((int)(angleF * (256F / 360F))); + return angle; } public static byte compressAngle(float angle) { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java index cb8ee14a7e..a116cc8bd5 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java @@ -310,7 +310,7 @@ public ProfileEditor getProfileEditor() { public List getBiomes(World world) { ServerLevel level = ((CraftWorld) world).getHandle(); ArrayList output = new ArrayList<>(); - for (ResourceLocation key : level.registryAccess().registryOrThrow(Registries.BIOME).keySet()) { + for (ResourceLocation key : level.registryAccess().lookupOrThrow(Registries.BIOME).keySet()) { output.add(new BiomeNMSImpl(level, CraftNamespacedKey.fromMinecraft(key))); } return output; @@ -330,7 +330,7 @@ public BiomeNMS getBiomeAt(Block block) { // Based on CraftWorld source ServerLevel level = ((CraftWorld) block.getWorld()).getHandle(); Holder biome = level.getNoiseBiome(block.getX() >> 2, block.getY() >> 2, block.getZ() >> 2); - ResourceLocation key = level.registryAccess().registryOrThrow(Registries.BIOME).getKey(biome.value()); + ResourceLocation key = level.registryAccess().lookupOrThrow(Registries.BIOME).getKey(biome.value()); return new BiomeNMSImpl(level, CraftNamespacedKey.fromMinecraft(key)); } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java index 6ee95b871a..29fd56de6b 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java @@ -11,9 +11,6 @@ public class ReflectionMappingsInfo { public static String MappedRegistry_frozen = "l"; public static String MappedRegistry_unregisteredIntrusiveHolders = "m"; - // net.minecraft.world.item.crafting.RecipeManager - public static String RecipeManager_byName = ERROR_UNKNOWN_TARGET; - // net.minecraft.world.entity.Entity public static String Entity_onGround = "aD"; public static String Entity_DATA_SHARED_FLAGS_ID = "am"; @@ -99,14 +96,6 @@ public class ReflectionMappingsInfo { // net.minecraft.network.protocol.game.ClientboundSetPassengersPacket public static String ClientboundSetPassengersPacket_passengers = "c"; - // net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket - public static String ClientboundTeleportEntityPacket_id = "b"; - public static String ClientboundTeleportEntityPacket_x = ERROR_UNKNOWN_TARGET; - public static String ClientboundTeleportEntityPacket_y = ERROR_UNKNOWN_TARGET; - public static String ClientboundTeleportEntityPacket_z = ERROR_UNKNOWN_TARGET; - public static String ClientboundTeleportEntityPacket_yRot = ERROR_UNKNOWN_TARGET; - public static String ClientboundTeleportEntityPacket_xRot = ERROR_UNKNOWN_TARGET; - // net.minecraft.network.protocol.game.ClientboundLevelChunkPacketData$BlockEntityInfo public static String ClientboundLevelChunkPacketDataBlockEntityInfo_packedXZ = "c"; public static String ClientboundLevelChunkPacketDataBlockEntityInfo_y = "d"; @@ -133,4 +122,7 @@ public class ReflectionMappingsInfo { // net.minecraft.world.item.AdventureModePredicate public static String AdventureModePredicate_predicates = "h"; + + // net.minecraft.stats.ServerRecipeBook + public static String ServerRecipeBook_addHighlight_method = "e"; } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java index dcc74cc161..c3737bdbad 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java @@ -271,45 +271,46 @@ public void setSpawnerCustomRules(CreatureSpawner spawner, int skyMin, int skyMa public static final MethodHandle HOLDERSET_NAMED_BIND = ReflectionHelper.getMethodHandle(HolderSet.Named.class, ReflectionMappingsInfo.HolderSetNamed_bind_method, List.class); public static final MethodHandle HOLDER_REFERENCE_BINDTAGS = ReflectionHelper.getMethodHandle(Holder.Reference.class, ReflectionMappingsInfo.HolderReference_bindTags_method, Collection.class); - @Override - public void setVanillaTags(Material material, Set tags) { - Holder nmsHolder = CraftMagicNumbers.getBlock(material).builtInRegistryHolder(); - nmsHolder.tags().forEach(nmsTag -> { - HolderSet.Named nmsHolderSet = BuiltInRegistries.BLOCK.getTag(nmsTag).orElse(null); - if (nmsHolderSet == null) { - return; - } - List> nmsHolders = nmsHolderSet.stream().collect(Collectors.toCollection(ArrayList::new)); - nmsHolders.remove(nmsHolder); - try { - HOLDERSET_NAMED_BIND.invoke(nmsHolderSet, nmsHolders); - } - catch (Throwable ex) { - Debug.echoError(ex); - } - VanillaTagHelper.updateMaterialTag(new CraftBlockTag(BuiltInRegistries.BLOCK, nmsTag)); - }); - List> newNmsTags = new ArrayList<>(); - for (String tag : tags) { - TagKey newNmsTag = TagKey.create(BuiltInRegistries.BLOCK.key(), ResourceLocation.withDefaultNamespace(tag)); - HolderSet.Named nmsHolderSet = BuiltInRegistries.BLOCK.getOrCreateTag(newNmsTag); - List> nmsHolders = nmsHolderSet.stream().collect(Collectors.toCollection(ArrayList::new)); - nmsHolders.add(nmsHolder); - try { - HOLDERSET_NAMED_BIND.invoke(nmsHolderSet, nmsHolders); - } - catch (Throwable ex) { - Debug.echoError(ex); - } - newNmsTags.add(newNmsTag); - VanillaTagHelper.addOrUpdateMaterialTag(new CraftBlockTag(BuiltInRegistries.BLOCK, newNmsTag)); - } - try { - HOLDER_REFERENCE_BINDTAGS.invoke(nmsHolder, newNmsTags); - } - catch (Throwable ex) { - Debug.echoError(ex); - } - PacketHelperImpl.broadcast(new ClientboundUpdateTagsPacket(TagNetworkSerialization.serializeTagsToNetwork(((CraftServer) Bukkit.getServer()).getServer().registries()))); - } + // TODO: 1.21.3: decently large internal changes - should probably look into implementing with Paper's API? +// @Override +// public void setVanillaTags(Material material, Set tags) { +// Holder nmsHolder = CraftMagicNumbers.getBlock(material).builtInRegistryHolder(); +// nmsHolder.tags().forEach(nmsTag -> { +// HolderSet.Named nmsHolderSet = BuiltInRegistries.BLOCK.get(nmsTag).orElse(null); +// if (nmsHolderSet == null) { +// return; +// } +// List> nmsHolders = nmsHolderSet.stream().collect(Collectors.toCollection(ArrayList::new)); +// nmsHolders.remove(nmsHolder); +// try { +// HOLDERSET_NAMED_BIND.invoke(nmsHolderSet, nmsHolders); +// } +// catch (Throwable ex) { +// Debug.echoError(ex); +// } +// VanillaTagHelper.updateMaterialTag(new CraftBlockTag(BuiltInRegistries.BLOCK, nmsTag)); +// }); +// List> newNmsTags = new ArrayList<>(); +// for (String tag : tags) { +// TagKey newNmsTag = TagKey.create(BuiltInRegistries.BLOCK.key(), ResourceLocation.withDefaultNamespace(tag)); +// HolderSet.Named nmsHolderSet = BuiltInRegistries.BLOCK.getOrCreateTag(newNmsTag); +// List> nmsHolders = nmsHolderSet.stream().collect(Collectors.toCollection(ArrayList::new)); +// nmsHolders.add(nmsHolder); +// try { +// HOLDERSET_NAMED_BIND.invoke(nmsHolderSet, nmsHolders); +// } +// catch (Throwable ex) { +// Debug.echoError(ex); +// } +// newNmsTags.add(newNmsTag); +// VanillaTagHelper.addOrUpdateMaterialTag(new CraftBlockTag(BuiltInRegistries.BLOCK, newNmsTag)); +// } +// try { +// HOLDER_REFERENCE_BINDTAGS.invoke(nmsHolder, newNmsTags); +// } +// catch (Throwable ex) { +// Debug.echoError(ex); +// } +// PacketHelperImpl.broadcast(new ClientboundUpdateTagsPacket(TagNetworkSerialization.serializeTagsToNetwork(((CraftServer) Bukkit.getServer()).getServer().registries()))); +// } } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ChunkHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ChunkHelperImpl.java index 99baae4130..511db1e0a1 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ChunkHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ChunkHelperImpl.java @@ -1,8 +1,8 @@ package com.denizenscript.denizen.nms.v1_21.helpers; import com.denizenscript.denizen.nms.abstracts.BiomeNMS; -import com.denizenscript.denizen.nms.v1_21.impl.BiomeNMSImpl; import com.denizenscript.denizen.nms.interfaces.ChunkHelper; +import com.denizenscript.denizen.nms.v1_21.impl.BiomeNMSImpl; import com.denizenscript.denizencore.tags.TagManager; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; @@ -18,8 +18,8 @@ import net.minecraft.world.level.chunk.PalettedContainer; import net.minecraft.world.level.chunk.status.ChunkStatus; import net.minecraft.world.level.levelgen.Heightmap; -import org.bukkit.World; import org.bukkit.Chunk; +import org.bukkit.World; import org.bukkit.craftbukkit.v1_21_R2.CraftChunk; import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; @@ -102,7 +102,7 @@ public void setAllBiomes(Chunk chunk, BiomeNMS biome) { int i = QuartPos.fromBlock(chunkcoordintpair.getMinBlockX()); int j = QuartPos.fromBlock(chunkcoordintpair.getMinBlockZ()); LevelHeightAccessor levelheightaccessor = nmsChunk.getHeightAccessorForGeneration(); - for(int k = levelheightaccessor.getMinSection(); k < levelheightaccessor.getMaxSection(); ++k) { + for(int k = levelheightaccessor.getMinSectionY(); k < levelheightaccessor.getMaxSectionY(); ++k) { LevelChunkSection chunksection = nmsChunk.getSection(nmsChunk.getSectionIndexFromSectionY(k)); PalettedContainer> datapaletteblock = (PalettedContainer>) chunksection.getBiomes(); datapaletteblock.acquire(); diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java index 66f30191b8..f63c0f169f 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java @@ -40,6 +40,7 @@ import net.minecraft.world.damagesource.DamageSources; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.MoverType; +import net.minecraft.world.entity.PositionMoveRotation; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.entity.ai.navigation.PathNavigation; @@ -130,17 +131,18 @@ public double getDamageTo(LivingEntity attacker, Entity target) { else { source = nmsTarget.level().damageSources().mobAttack(((CraftLivingEntity) attacker).getHandle()); } - if (nmsTarget.isInvulnerableTo(source)) { + net.minecraft.world.entity.LivingEntity nmsLivingTarget = nmsTarget instanceof net.minecraft.world.entity.LivingEntity living ? living : null; + if (nmsLivingTarget != null ? nmsLivingTarget.isInvulnerableTo(nmsWorld, source) : nmsTarget.isInvulnerableToBase(source)) { return 0; } if (attacker.getEquipment() != null) { damage = EnchantmentHelper.modifyDamage(nmsWorld, CraftItemStack.asNMSCopy(attacker.getEquipment().getItemInMainHand()), nmsTarget, source, (float) damage); } - if (!(nmsTarget instanceof net.minecraft.world.entity.LivingEntity livingTarget)) { + if (nmsLivingTarget == null) { return damage; } - damage = CombatRules.getDamageAfterAbsorb(livingTarget, (float) damage, source, (float) livingTarget.getArmorValue(), (float) livingTarget.getAttributeValue(Attributes.ARMOR_TOUGHNESS)); - float enchantDamageModifier = EnchantmentHelper.getDamageProtection(nmsWorld, livingTarget, source); + damage = CombatRules.getDamageAfterAbsorb(nmsLivingTarget, (float) damage, source, (float) nmsLivingTarget.getArmorValue(), (float) nmsLivingTarget.getAttributeValue(Attributes.ARMOR_TOUGHNESS)); + float enchantDamageModifier = EnchantmentHelper.getDamageProtection(nmsWorld, nmsLivingTarget, source); if (enchantDamageModifier > 0) { damage = CombatRules.getDamageAfterMagicAbsorb((float) damage, enchantDamageModifier); } @@ -522,7 +524,7 @@ public void fakeTeleport(Entity entity, Location location) { @Override public void clientResetLoc(Entity entity) { - ClientboundTeleportEntityPacket packet = new ClientboundTeleportEntityPacket(((CraftEntity) entity).getHandle()); + ClientboundTeleportEntityPacket packet = new ClientboundTeleportEntityPacket(entity.getEntityId(), PositionMoveRotation.of(((CraftEntity) entity).getHandle()), Set.of(), entity.isOnGround()); for (Player player : getPlayersThatSee(entity)) { PacketHelperImpl.send(player, packet); } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java index 84e1416161..f933f3bff6 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java @@ -4,7 +4,6 @@ import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; -import com.google.common.collect.Maps; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; import net.minecraft.server.level.ServerLevel; @@ -16,7 +15,7 @@ import net.minecraft.world.level.storage.loot.BuiltInLootTables; import net.minecraft.world.level.storage.loot.LootParams; import net.minecraft.world.level.storage.loot.LootTable; -import net.minecraft.world.level.storage.loot.parameters.LootContextParam; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.phys.Vec3; import org.bukkit.Location; @@ -30,7 +29,6 @@ import java.lang.reflect.Field; import java.util.List; -import java.util.Map; public class FishingHelperImpl implements FishingHelper { @@ -72,18 +70,18 @@ public org.bukkit.inventory.ItemStack getResult(FishHook fishHook, CatchType cat public ItemStack getRandomReward(FishingHook nmsHook, ResourceKey key) { ServerLevel nmsWorld = (ServerLevel) nmsHook.level(); - Map, Object> params = Maps.newIdentityHashMap(); - params.put(LootContextParams.ORIGIN, new Vec3(nmsHook.getX(), nmsHook.getY(), nmsHook.getZ())); - params.put(LootContextParams.TOOL, new ItemStack(Items.FISHING_ROD)); - LootParams nmsLootParams = new LootParams(nmsWorld, params, Maps.newHashMap(), 0); - List nmsItems = nmsHook.registryAccess().registryOrThrow(Registries.LOOT_TABLE).get(key).getRandomItems(nmsLootParams); + LootParams nmsLootParams = new LootParams.Builder(nmsWorld) + .withParameter(LootContextParams.ORIGIN, new Vec3(nmsHook.getX(), nmsHook.getY(), nmsHook.getZ())) + .withParameter(LootContextParams.TOOL, new ItemStack(Items.FISHING_ROD)) + .create(LootContextParamSets.FISHING); + List nmsItems = nmsHook.registryAccess().lookupOrThrow(Registries.LOOT_TABLE).getValueOrThrow(key).getRandomItems(nmsLootParams); return nmsItems.get(nmsWorld.random.nextInt(nmsItems.size())); } @Override public FishHook spawnHook(Location location, Player player) { ServerLevel nmsWorld = ((CraftWorld) location.getWorld()).getHandle(); - FishingHook hook = new FishingHook(((CraftPlayer) player).getHandle(), nmsWorld, 0, 0); + FishingHook hook = new FishingHook(((CraftPlayer) player).getHandle(), nmsWorld, 0, 0, new ItemStack(Items.FISHING_ROD)); nmsWorld.addFreshEntity(hook, CreatureSpawnEvent.SpawnReason.CUSTOM); return (FishHook) hook.getBukkitEntity(); } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java index ca9ba6a90a..8ca6337878 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java @@ -26,9 +26,11 @@ import net.minecraft.core.component.DataComponentType; import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.NbtUtils; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.util.datafix.fixes.References; @@ -44,7 +46,6 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.levelgen.Heightmap; @@ -83,7 +84,7 @@ public class ItemHelperImpl extends ItemHelper { public static net.minecraft.world.item.crafting.RecipeHolder getNMSRecipe(NamespacedKey key) { - ResourceLocation nmsKey = CraftNamespacedKey.toMinecraft(key); + ResourceKey> nmsKey = ResourceKey.create(Registries.RECIPE, CraftNamespacedKey.toMinecraft(key)); return ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager().byKey(nmsKey).orElse(null); } @@ -92,7 +93,7 @@ public static net.minecraft.world.item.crafting.RecipeHolder getNMSRecipe(Nam public void setMaxStackSize(Material material, int size) { try { ReflectionHelper.getFinalSetter(Material.class, "maxStack").invoke(material, size); - Item nmsItem = BuiltInRegistries.ITEM.get(CraftNamespacedKey.toMinecraft(material.getKey())); + Item nmsItem = BuiltInRegistries.ITEM.getValue(CraftNamespacedKey.toMinecraft(material.getKey())); DataComponentMap currentComponents = nmsItem.components(); Item_components.set(nmsItem, DataComponentMap.composite(currentComponents, DataComponentMap.builder().set(DataComponents.MAX_STACK_SIZE, size).build())); } @@ -103,7 +104,7 @@ public void setMaxStackSize(Material material, int size) { @Override public Integer burnTime(Material material) { - return AbstractFurnaceBlockEntity.getFuel().get(CraftMagicNumbers.getItem(material)); + return MinecraftServer.getServer().fuelValues().burnDuration(new net.minecraft.world.item.ItemStack(CraftMagicNumbers.getItem(material))); } @Override @@ -123,19 +124,21 @@ else if (exact) { } } + // TODO: Recipe registration should be moved to the API public static Ingredient itemArrayToRecipe(ItemStack[] items, boolean exact) { - Ingredient.ItemValue[] stacks = new Ingredient.ItemValue[items.length]; - for (int i = 0; i < items.length; i++) { - stacks[i] = new Ingredient.ItemValue(CraftItemStack.asNMSCopy(items[i])); + if (!exact) { + return Ingredient.of(Arrays.stream(items).map(item -> CraftMagicNumbers.getItem(item.getType()))); } - Ingredient itemRecipe = new Ingredient(Arrays.stream(stacks)); - itemRecipe.exact = exact; - return itemRecipe; + return Ingredient.ofStacks(Arrays.stream(items).map(CraftItemStack::asNMSCopy).toList()); + } + + private static ResourceKey> createRecipeKey(String name) { + return ResourceKey.create(Registries.RECIPE, ResourceLocation.fromNamespaceAndPath("denizen", name)); } @Override public void registerFurnaceRecipe(String keyName, String group, ItemStack result, ItemStack[] ingredient, float exp, int time, String type, boolean exact, String category) { - ResourceLocation key = ResourceLocation.fromNamespaceAndPath("denizen", keyName); + ResourceKey> key = createRecipeKey(keyName); Ingredient itemRecipe = itemArrayToRecipe(ingredient, exact); AbstractCookingRecipe recipe; CookingBookCategory categoryValue = category == null ? CookingBookCategory.MISC : CookingBookCategory.valueOf(CoreUtilities.toUpperCase(category)); @@ -157,7 +160,7 @@ else if (type.equalsIgnoreCase("campfire")) { @Override public void registerStonecuttingRecipe(String keyName, String group, ItemStack result, ItemStack[] ingredient, boolean exact) { - ResourceLocation key = ResourceLocation.fromNamespaceAndPath("denizen", keyName); + ResourceKey> key = createRecipeKey(keyName); Ingredient itemRecipe = itemArrayToRecipe(ingredient, exact); StonecutterRecipe recipe = new StonecutterRecipe(group, itemRecipe, CraftItemStack.asNMSCopy(result)); RecipeHolder holder = new RecipeHolder<>(key, recipe); @@ -166,18 +169,18 @@ public void registerStonecuttingRecipe(String keyName, String group, ItemStack r @Override public void registerSmithingRecipe(String keyName, ItemStack result, ItemStack[] baseItem, boolean baseExact, ItemStack[] upgradeItem, boolean upgradeExact, ItemStack[] templateItem, boolean templateExact) { - ResourceLocation key = ResourceLocation.fromNamespaceAndPath("denizen", keyName); + ResourceKey> key = createRecipeKey(keyName); Ingredient templateItemRecipe = itemArrayToRecipe(templateItem, templateExact); Ingredient baseItemRecipe = itemArrayToRecipe(baseItem, baseExact); Ingredient upgradeItemRecipe = itemArrayToRecipe(upgradeItem, upgradeExact); - SmithingTransformRecipe recipe = new SmithingTransformRecipe(templateItemRecipe, baseItemRecipe, upgradeItemRecipe, CraftItemStack.asNMSCopy(result)); + SmithingTransformRecipe recipe = new SmithingTransformRecipe(Optional.of(templateItemRecipe), Optional.of(baseItemRecipe), Optional.of(upgradeItemRecipe), CraftItemStack.asNMSCopy(result)); RecipeHolder holder = new RecipeHolder<>(key, recipe); ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager().addRecipe(holder); } @Override public void registerShapelessRecipe(String keyName, String group, ItemStack result, List ingredients, boolean[] exact, String category) { - ResourceLocation key = ResourceLocation.fromNamespaceAndPath("denizen", keyName); + ResourceKey> key = createRecipeKey(keyName); ArrayList ingredientList = new ArrayList<>(); CraftingBookCategory categoryValue = category == null ? CraftingBookCategory.MISC : CraftingBookCategory.valueOf(CoreUtilities.toUpperCase(category)); for (int i = 0; i < ingredients.size(); i++) { @@ -364,7 +367,7 @@ private ItemStack setAdventureModePredicateMaterials(ItemStack item, DataCompone return CraftItemStack.asBukkitCopy(nmsItemStack); } BlockPredicate nmsPredicate = new BlockPredicate(Optional.of( - HolderSet.direct(material -> BuiltInRegistries.BLOCK.getHolder(CraftNamespacedKey.toMinecraft(material.getKey())).orElseThrow(), materials) + HolderSet.direct(material -> BuiltInRegistries.BLOCK.get(CraftNamespacedKey.toMinecraft(material.getKey())).orElseThrow(), materials) ), Optional.empty(), Optional.empty()); nmsItemStack.set(nmsComponent, new AdventureModePredicate(List.of(nmsPredicate), nmsAdventurePredicate == null || nmsAdventurePredicate.showInTooltip())); return CraftItemStack.asBukkitCopy(nmsItemStack); @@ -491,7 +494,7 @@ public static void renderFullMap(MapItemSavedData worldmap, int xMin, int zMin, for (int j4 = 0; j4 < scale; ++j4) { int k4 = chunk.getHeight(Heightmap.Types.WORLD_SURFACE, i4 + i3, j4 + j3) + 1; BlockState iblockdata; - if (k4 <= world.getMinBuildHeight() + 1) { + if (k4 <= world.getMinY() + 1) { iblockdata = Blocks.BEDROCK.defaultBlockState(); } else { @@ -499,8 +502,8 @@ public static void renderFullMap(MapItemSavedData worldmap, int xMin, int zMin, --k4; blockposition_mutableblockposition.set(chunkcoordintpair.getMinBlockX() + i4 + i3, k4, chunkcoordintpair.getMinBlockZ() + j4 + j3); iblockdata = chunk.getBlockState(blockposition_mutableblockposition); - } while (iblockdata.getMapColor(world, blockposition_mutableblockposition) == MapColor.NONE && k4 > world.getMinBuildHeight()); - if (k4 > world.getMinBuildHeight() && !iblockdata.getFluidState().isEmpty()) { + } while (iblockdata.getMapColor(world, blockposition_mutableblockposition) == MapColor.NONE && k4 > world.getMinY()); + if (k4 > world.getMinY() && !iblockdata.getFluidState().isEmpty()) { int l4 = k4 - 1; blockposition_mutableblockposition1.set(blockposition_mutableblockposition); @@ -509,7 +512,7 @@ public static void renderFullMap(MapItemSavedData worldmap, int xMin, int zMin, blockposition_mutableblockposition1.setY(l4--); iblockdata1 = chunk.getBlockState(blockposition_mutableblockposition1); k3++; - } while (l4 > world.getMinBuildHeight() && !iblockdata1.getFluidState().isEmpty()); + } while (l4 > world.getMinY() && !iblockdata1.getFluidState().isEmpty()); iblockdata = getCorrectStateForFluidBlock(world, iblockdata, blockposition_mutableblockposition); } } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java index 5b9fb51766..ed7fcdd24b 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java @@ -28,7 +28,8 @@ import net.minecraft.server.level.ChunkMap; import net.minecraft.server.level.ServerEntity; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.RelativeMovement; +import net.minecraft.world.entity.PositionMoveRotation; +import net.minecraft.world.entity.Relative; import net.minecraft.world.entity.ai.attributes.AttributeInstance; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.monster.CaveSpider; @@ -38,6 +39,7 @@ import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.saveddata.maps.MapItemSavedData; +import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.PlayerTeam; import net.minecraft.world.scores.Team; import org.bukkit.Bukkit; @@ -368,29 +370,30 @@ public void sendCollectItemEntity(Player player, Entity taker, Entity item, int send(player, new ClientboundTakeItemEntityPacket(item.getEntityId(), taker.getEntityId(), amount)); } - public RelativeMovement toNmsRelativeMovement(TeleportCommand.Relative relative) { + public Relative toNmsRelativeMovement(TeleportCommand.Relative relative) { + // TODO: 1.21.3: There seem to be more relative movement types now return switch (relative) { - case X -> RelativeMovement.X; - case Y -> RelativeMovement.Y; - case Z -> RelativeMovement.Z; - case YAW -> RelativeMovement.Y_ROT; - case PITCH -> RelativeMovement.X_ROT; + case X -> Relative.X; + case Y -> Relative.Y; + case Z -> Relative.Z; + case YAW -> Relative.Y_ROT; + case PITCH -> Relative.X_ROT; }; } @Override public void sendRelativePositionPacket(Player player, double x, double y, double z, float yaw, float pitch, List relativeAxis) { - Set relativeMovements; + Set relativeMovements; if (relativeAxis == null) { - relativeMovements = RelativeMovement.ALL; + relativeMovements = Relative.ALL; } else { - relativeMovements = EnumSet.noneOf(RelativeMovement.class); + relativeMovements = EnumSet.noneOf(Relative.class); for (TeleportCommand.Relative relative : relativeAxis) { relativeMovements.add(toNmsRelativeMovement(relative)); } } - ClientboundPlayerPositionPacket packet = new ClientboundPlayerPositionPacket(x, y, z, yaw, pitch, relativeMovements, 0); + ClientboundPlayerPositionPacket packet = new ClientboundPlayerPositionPacket(0, new PositionMoveRotation(new Vec3(x, y, z), Vec3.ZERO, yaw, pitch), relativeMovements); sendAsyncSafe(player, packet); } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java index bd7f501fce..06df0f4af3 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java @@ -48,9 +48,9 @@ import net.minecraft.tags.TagNetworkSerialization; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemCooldowns; import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.GameType; import net.minecraft.world.level.Level; @@ -82,6 +82,7 @@ public class PlayerHelperImpl extends PlayerHelper { public static final Field VEHICLE_FLY_TICKS = ReflectionHelper.getFields(ServerGamePacketListenerImpl.class).get(ReflectionMappingsInfo.ServerGamePacketListenerImpl_aboveGroundVehicleTickCount, int.class); public static final Field PASSENGERS_PACKET_PASSENGERS = ReflectionHelper.getFields(ClientboundSetPassengersPacket.class).get(ReflectionMappingsInfo.ClientboundSetPassengersPacket_passengers, int[].class); public static final MethodHandle PLAYER_RESPAWNFORCED_SETTER = ReflectionHelper.getFinalSetter(ServerPlayer.class, ReflectionMappingsInfo.ServerPlayer_respawnForced, boolean.class); + public static final MethodHandle SERVER_RECIPE_BOOK_ADD_HIGHLIGHT = ReflectionHelper.getMethodHandle(ServerRecipeBook.class, ReflectionMappingsInfo.ServerRecipeBook_addHighlight_method, ResourceKey.class); public static final EntityDataAccessor PLAYER_DATA_ACCESSOR_SKINLAYERS = ReflectionHelper.getFieldValue(net.minecraft.world.entity.player.Player.class, ReflectionMappingsInfo.Player_DATA_PLAYER_MODE_CUSTOMISATION, null); @@ -331,8 +332,8 @@ public ImprovedOfflinePlayer getOfflineData(UUID uuid) { @Override public void resendRecipeDetails(Player player) { - Collection> recipes = ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager().getRecipes(); - ClientboundUpdateRecipesPacket updatePacket = new ClientboundUpdateRecipesPacket(recipes); + RecipeManager recipeManager = ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager(); + ClientboundUpdateRecipesPacket updatePacket = new ClientboundUpdateRecipesPacket(recipeManager.getSynchronizedItemProperties(), recipeManager.getSynchronizedStonecutterRecipes()); ((CraftPlayer) player).getHandle().connection.send(updatePacket); } @@ -350,8 +351,13 @@ public void quietlyAddRecipe(Player player, NamespacedKey key) { Debug.echoError("Cannot add recipe '" + key + "': it does not exist."); return; } - recipeBook.add(recipe); - recipeBook.addHighlight(recipe); + recipeBook.add(recipe.id()); + try { + SERVER_RECIPE_BOOK_ADD_HIGHLIGHT.invoke(recipeBook, recipe.id()); + } + catch (Throwable e) { + Debug.echoError(e); + } } @Override @@ -421,7 +427,8 @@ public void sendPlayerInfoAddPacket(Player player, EnumSet edit if (texture != null) { profile.getProperties().put("textures", new Property("textures", texture, signature)); } - ClientboundPlayerInfoUpdatePacket.Entry entry = new ClientboundPlayerInfoUpdatePacket.Entry(id, profile, listed, latency, gameMode == null ? null : GameType.byId(gameMode.getValue()), display == null ? null : Handler.componentToNMS(FormattedTextHelper.parse(display, ChatColor.WHITE)), null); + // TODO: 1.21.3: Player list order support + ClientboundPlayerInfoUpdatePacket.Entry entry = new ClientboundPlayerInfoUpdatePacket.Entry(id, profile, listed, latency, gameMode == null ? null : GameType.byId(gameMode.getValue()), display == null ? null : Handler.componentToNMS(FormattedTextHelper.parse(display, ChatColor.WHITE)), player.getPlayerListOrder(), null); PacketHelperImpl.send(player, ProfileEditorImpl.createInfoPacket(actions, List.of(entry))); } @@ -460,7 +467,7 @@ public void refreshPlayer(Player player) { } if (!nmsPlayer.getCooldowns().cooldowns.isEmpty()) { int tickCount = nmsPlayer.getCooldowns().tickCount; - for (Map.Entry entry : nmsPlayer.getCooldowns().cooldowns.entrySet()) { + for (Map.Entry entry : nmsPlayer.getCooldowns().cooldowns.entrySet()) { nmsPlayer.connection.send(new ClientboundCooldownPacket(entry.getKey(), entry.getValue().endTime - tickCount)); } } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java index 590341cd9e..43b0934daf 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java @@ -98,7 +98,7 @@ public void wakeUpAllPlayers(World world) { // net.minecraft.server.level.ServerLevel#resetWeatherCycle() @Override public void clearWeather(World world) { - PrimaryLevelData data = ((CraftWorld) world).getHandle().K; + PrimaryLevelData data = ((CraftWorld) world).getHandle().L; data.setRaining(false); if (!data.isRaining()) { data.setRainTime(0); diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java index eab9a42f70..62aa152328 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java @@ -40,12 +40,12 @@ public class BiomeNMSImpl extends BiomeNMS { public BiomeNMSImpl(ServerLevel world, NamespacedKey key) { super(world.getWorld(), key); this.world = world; - biomeHolder = world.registryAccess().registryOrThrow(Registries.BIOME).getHolder(ResourceKey.create(Registries.BIOME, CraftNamespacedKey.toMinecraft(key))).orElse(null); + biomeHolder = world.registryAccess().lookupOrThrow(Registries.BIOME).get(ResourceKey.create(Registries.BIOME, CraftNamespacedKey.toMinecraft(key))).orElse(null); } @Override public DownfallType getDownfallTypeAt(Location location) { - Biome.Precipitation precipitation = biomeHolder.value().getPrecipitationAt(CraftLocation.toBlockPosition(location)); + Biome.Precipitation precipitation = biomeHolder.value().getPrecipitationAt(CraftLocation.toBlockPosition(location), world.getSeaLevel()); return switch (precipitation) { case RAIN -> DownfallType.RAIN; case SNOW -> DownfallType.SNOW; @@ -65,7 +65,7 @@ public float getBaseTemperature() { @Override public float getTemperatureAt(Location location) { - return biomeHolder.value().getTemperature(CraftLocation.toBlockPosition(location)); + return biomeHolder.value().getTemperature(CraftLocation.toBlockPosition(location), world.getSeaLevel()); } @Override @@ -185,7 +185,7 @@ public void setTo(Block block) { LevelChunk chunk = world.getChunkAt(pos); if (chunk != null) { chunk.setBiome(block.getX() >> 2, block.getY() >> 2, block.getZ() >> 2, biomeHolder); - chunk.setUnsaved(true); + chunk.markUnsaved(); } } } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java index de0ccef095..25e7ec4937 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java @@ -96,7 +96,7 @@ public static ClientboundPlayerInfoUpdatePacket processPlayerInfoUpdatePacket(De } String listRename = RenameCommand.getCustomNameFor(entry.profileId(), networkManager.player.getBukkitEntity(), true); Component displayName = listRename != null ? Handler.componentToNMS(FormattedTextHelper.parse(listRename, ChatColor.WHITE)) : entry.displayName(); - ClientboundPlayerInfoUpdatePacket.Entry modifiedEntry = new ClientboundPlayerInfoUpdatePacket.Entry(entry.profileId(), modifiedProfile, entry.listed(), entry.latency(), entry.gameMode(), displayName, entry.chatSession()); + ClientboundPlayerInfoUpdatePacket.Entry modifiedEntry = new ClientboundPlayerInfoUpdatePacket.Entry(entry.profileId(), modifiedProfile, entry.listed(), entry.latency(), entry.gameMode(), displayName, entry.listOrder(), entry.chatSession()); modifiedEntries.add(modifiedEntry); } return createInfoPacket(actions, modifiedEntries); diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java index 581fde7874..0712401c54 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java @@ -19,11 +19,13 @@ import net.minecraft.network.protocol.PacketFlow; import net.minecraft.network.protocol.common.*; import net.minecraft.network.protocol.game.*; +import net.minecraft.network.protocol.ping.ServerboundPingRequestPacket; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.CommonListenerCookie; import net.minecraft.server.network.ServerGamePacketListenerImpl; -import net.minecraft.world.entity.RelativeMovement; +import net.minecraft.world.entity.PositionMoveRotation; +import net.minecraft.world.entity.Relative; import net.minecraft.world.phys.Vec3; import org.bukkit.Location; import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; @@ -68,13 +70,13 @@ public boolean teleport(double d0, double d1, double d2, float f, float f1, Play } @Override - public void teleport(double d0, double d1, double d2, float f, float f1, Set set) { - oldListener.teleport(d0, d1, d2, f, f1, set); + public void teleport(PositionMoveRotation positionmoverotation, Set set) { + oldListener.teleport(positionmoverotation, set); } @Override - public boolean teleport(double d0, double d1, double d2, float f, float f1, Set set, PlayerTeleportEvent.TeleportCause cause) { - return oldListener.teleport(d0, d1, d2, f, f1, set, cause); + public boolean teleport(PositionMoveRotation positionmoverotation, Set set, PlayerTeleportEvent.TeleportCause cause) { + return oldListener.teleport(positionmoverotation, set, cause); } @Override @@ -522,6 +524,54 @@ public void handleChunkBatchReceived(ServerboundChunkBatchReceivedPacket packet) oldListener.handleChunkBatchReceived(packet); } + @Override + public void handleBlockEntityTagQuery(ServerboundBlockEntityTagQueryPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleBlockEntityTagQuery(packet); + } + + @Override + public void handleBundleItemSelectedPacket(ServerboundSelectBundleItemPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleBundleItemSelectedPacket(packet); + } + + @Override + public void handleClientTickEnd(ServerboundClientTickEndPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleClientTickEnd(packet); + } + + @Override + public void handleContainerSlotStateChanged(ServerboundContainerSlotStateChangedPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleContainerSlotStateChanged(packet); + } + + @Override + public void handleDebugSampleSubscription(ServerboundDebugSampleSubscriptionPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleDebugSampleSubscription(packet); + } + + @Override + public void handleEntityTagQuery(ServerboundEntityTagQueryPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleEntityTagQuery(packet); + } + + @Override + public void handlePingRequest(ServerboundPingRequestPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handlePingRequest(packet); + } + + @Override + public void handleSignedChatCommand(ServerboundChatCommandSignedPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleSignedChatCommand(packet); + } + @Override public ServerPlayer getPlayer() { return oldListener.getPlayer(); diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java index 5897890e21..a1e57fd85e 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java @@ -4,8 +4,8 @@ import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.utilities.blocks.FakeBlock; -import com.denizenscript.denizencore.utilities.debugging.Debug; import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; import io.netty.buffer.Unpooled; import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries; @@ -119,7 +119,7 @@ public static ClientboundLevelChunkWithLightPacket handleMapChunkPacket(World wo int worldMaxY = world.getMaxHeight(); int minChunkY = worldMinY >> 4; int maxChunkY = worldMaxY >> 4; - Registry biomeRegistry = ((CraftWorld) world).getHandle().registryAccess().registryOrThrow(Registries.BIOME); + Registry biomeRegistry = ((CraftWorld) world).getHandle().registryAccess().lookupOrThrow(Registries.BIOME); for (int y = minChunkY; y < maxChunkY; y++) { int blockCount = serial.readShort(); // reflected constructors as workaround for spigot remapper bug - Mojang "IdMap" became Spigot "IRegistry" but should be "Registry" diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java index 78ec8a98ef..97e790df55 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java @@ -11,10 +11,14 @@ import net.minecraft.network.protocol.game.*; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.PositionMoveRotation; +import net.minecraft.world.phys.Vec3; import org.bukkit.craftbukkit.v1_21_R2.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R2.util.CraftVector; import org.bukkit.util.Vector; import java.lang.reflect.Field; +import java.util.Set; public class AttachPacketHandlers { @@ -31,12 +35,6 @@ public static void registerHandlers() { public static Field POS_Z_PACKENT = ReflectionHelper.getFields(ClientboundMoveEntityPacket.class).get(ReflectionMappingsInfo.ClientboundMoveEntityPacket_za, short.class); public static Field YAW_PACKENT = ReflectionHelper.getFields(ClientboundMoveEntityPacket.class).get(ReflectionMappingsInfo.ClientboundMoveEntityPacket_yRot, byte.class); public static Field PITCH_PACKENT = ReflectionHelper.getFields(ClientboundMoveEntityPacket.class).get(ReflectionMappingsInfo.ClientboundMoveEntityPacket_xRot, byte.class); - public static Field ENTITY_ID_PACKTELENT = ReflectionHelper.getFields(ClientboundTeleportEntityPacket.class).get(ReflectionMappingsInfo.ClientboundTeleportEntityPacket_id, int.class); - public static Field POS_X_PACKTELENT = ReflectionHelper.getFields(ClientboundTeleportEntityPacket.class).get(ReflectionMappingsInfo.ClientboundTeleportEntityPacket_x, double.class); - public static Field POS_Y_PACKTELENT = ReflectionHelper.getFields(ClientboundTeleportEntityPacket.class).get(ReflectionMappingsInfo.ClientboundTeleportEntityPacket_y, double.class); - public static Field POS_Z_PACKTELENT = ReflectionHelper.getFields(ClientboundTeleportEntityPacket.class).get(ReflectionMappingsInfo.ClientboundTeleportEntityPacket_z, double.class); - public static Field YAW_PACKTELENT = ReflectionHelper.getFields(ClientboundTeleportEntityPacket.class).get(ReflectionMappingsInfo.ClientboundTeleportEntityPacket_yRot, byte.class); - public static Field PITCH_PACKTELENT = ReflectionHelper.getFields(ClientboundTeleportEntityPacket.class).get(ReflectionMappingsInfo.ClientboundTeleportEntityPacket_xRot, byte.class); public static Field ENTITY_ID_PACKVELENT = ReflectionHelper.getFields(ClientboundSetEntityMotionPacket.class).get(ReflectionMappingsInfo.ClientboundSetEntityMotionPacket_id, int.class); public static Vector VECTOR_ZERO = new Vector(0, 0, 0); @@ -53,10 +51,10 @@ public static void tryProcessMovePacketForAttach(DenizenNetworkManagerImpl netwo pNew = new ClientboundMoveEntityPacket.Pos(newId, packet.getXa(), packet.getYa(), packet.getZa(), packet.isOnGround()); } else if (packet instanceof ClientboundMoveEntityPacket.Rot) { - pNew = new ClientboundMoveEntityPacket.Rot(newId, packet.getyRot(), packet.getxRot(), packet.isOnGround()); + pNew = new ClientboundMoveEntityPacket.Rot(newId, Mth.packDegrees(packet.getyRot()), Mth.packDegrees(packet.getxRot()), packet.isOnGround()); } else if (packet instanceof ClientboundMoveEntityPacket.PosRot) { - pNew = new ClientboundMoveEntityPacket.PosRot(newId, packet.getXa(), packet.getYa(), packet.getZa(), packet.getyRot(), packet.getxRot(), packet.isOnGround()); + pNew = new ClientboundMoveEntityPacket.PosRot(newId, packet.getXa(), packet.getYa(), packet.getZa(), Mth.packDegrees(packet.getyRot()), Mth.packDegrees(packet.getxRot()), packet.isOnGround()); } else { if (CoreConfiguration.debugVerbose) { @@ -66,28 +64,28 @@ else if (packet instanceof ClientboundMoveEntityPacket.PosRot) { } if (att.positionalOffset != null) { boolean isRotate = packet instanceof ClientboundMoveEntityPacket.PosRot || packet instanceof ClientboundMoveEntityPacket.Rot; - byte yaw, pitch; + float yaw, pitch; if (att.noRotate) { Entity attachedEntity = ((CraftEntity) att.attached.getBukkitEntity()).getHandle(); - yaw = EntityAttachmentHelper.compressAngle(attachedEntity.getYRot()); - pitch = EntityAttachmentHelper.compressAngle(attachedEntity.getXRot()); + yaw = attachedEntity.getYRot(); + pitch = attachedEntity.getXRot(); } else if (isRotate) { yaw = packet.getyRot(); pitch = packet.getxRot(); } else { - yaw = EntityAttachmentHelper.compressAngle(e.getYRot()); - pitch = EntityAttachmentHelper.compressAngle(e.getXRot()); + yaw = e.getYRot(); + pitch = e.getXRot(); } if (att.noPitch) { Entity attachedEntity = ((CraftEntity) att.attached.getBukkitEntity()).getHandle(); pitch = EntityAttachmentHelper.compressAngle(attachedEntity.getXRot()); } - byte newYaw = yaw; + float newYaw = yaw; if (isRotate) { - newYaw = EntityAttachmentHelper.adaptedCompressedAngle(newYaw, att.positionalOffset.getYaw()); - pitch = EntityAttachmentHelper.adaptedCompressedAngle(pitch, att.positionalOffset.getPitch()); + newYaw = EntityAttachmentHelper.adaptedAngle(newYaw, att.positionalOffset.getYaw()); + pitch = EntityAttachmentHelper.adaptedAngle(pitch, att.positionalOffset.getPitch()); } Vector goalPosition = att.fixedForOffset(new Vector(e.getX(), e.getY(), e.getZ()), e.getYRot(), e.getXRot()); Vector oldPos = att.visiblePositions.get(networkManager.player.getUUID()); @@ -104,13 +102,12 @@ else if (isRotate) { if ((isRotate && att.offsetRelative) || forceTele || offX < Short.MIN_VALUE || offX > Short.MAX_VALUE || offY < Short.MIN_VALUE || offY > Short.MAX_VALUE || offZ < Short.MIN_VALUE || offZ > Short.MAX_VALUE) { - ClientboundTeleportEntityPacket newTeleportPacket = new ClientboundTeleportEntityPacket(e); - ENTITY_ID_PACKTELENT.setInt(newTeleportPacket, att.attached.getBukkitEntity().getEntityId()); - POS_X_PACKTELENT.setDouble(newTeleportPacket, goalPosition.getX()); - POS_Y_PACKTELENT.setDouble(newTeleportPacket, goalPosition.getY()); - POS_Z_PACKTELENT.setDouble(newTeleportPacket, goalPosition.getZ()); - YAW_PACKTELENT.setByte(newTeleportPacket, newYaw); - PITCH_PACKTELENT.setByte(newTeleportPacket, pitch); + ClientboundTeleportEntityPacket newTeleportPacket = new ClientboundTeleportEntityPacket( + att.attached.getBukkitEntity().getEntityId(), + new PositionMoveRotation(CraftVector.toNMS(goalPosition), Vec3.ZERO, newYaw, pitch), + Set.of(), + e.onGround() + ); if (NMSHandler.debugPackets) { DenizenNetworkManagerImpl.doPacketOutput("Attach Move-Tele Packet: " + newTeleportPacket.getClass().getCanonicalName() + " for " + att.attached.getUUID() + " sent to " + networkManager.player.getScoreboardName() + " with original yaw " + yaw + " adapted to " + newYaw); } @@ -121,8 +118,8 @@ else if (isRotate) { POS_Y_PACKENT.setShort(pNew, (short) Mth.clamp(offY, Short.MIN_VALUE, Short.MAX_VALUE)); POS_Z_PACKENT.setShort(pNew, (short) Mth.clamp(offZ, Short.MIN_VALUE, Short.MAX_VALUE)); if (isRotate) { - YAW_PACKENT.setByte(pNew, yaw); - PITCH_PACKENT.setByte(pNew, pitch); + YAW_PACKENT.setByte(pNew, EntityAttachmentHelper.compressAngle(yaw)); + PITCH_PACKENT.setByte(pNew, EntityAttachmentHelper.compressAngle(pitch)); } if (NMSHandler.debugPackets) { DenizenNetworkManagerImpl.doPacketOutput("Attach Move Packet: " + pNew.getClass().getCanonicalName() + " for " + att.attached.getUUID() + " sent to " + networkManager.player.getScoreboardName() + " with original yaw " + yaw + " adapted to " + newYaw); @@ -152,15 +149,15 @@ public static void tryProcessRotateHeadPacketForAttach(DenizenNetworkManagerImpl for (EntityAttachmentHelper.PlayerAttachMap attMap : attList.attachedToMap.values()) { EntityAttachmentHelper.AttachmentData att = attMap.getAttachment(networkManager.player.getUUID()); if (attMap.attached.isValid() && att != null) { - byte yaw = packet.getYHeadRot(); + float yaw = packet.getYHeadRot(); Entity attachedEntity = ((CraftEntity) att.attached.getBukkitEntity()).getHandle(); if (att.positionalOffset != null) { if (att.noRotate) { - yaw = EntityAttachmentHelper.compressAngle(attachedEntity.getYRot()); + yaw = attachedEntity.getYRot(); } - yaw = EntityAttachmentHelper.adaptedCompressedAngle(yaw, att.positionalOffset.getYaw()); + yaw = EntityAttachmentHelper.adaptedAngle(yaw, att.positionalOffset.getYaw()); } - ClientboundRotateHeadPacket pNew = new ClientboundRotateHeadPacket(attachedEntity, yaw); + ClientboundRotateHeadPacket pNew = new ClientboundRotateHeadPacket(attachedEntity, EntityAttachmentHelper.compressAngle(yaw)); if (NMSHandler.debugPackets) { DenizenNetworkManagerImpl.doPacketOutput("Head Rotation Packet: " + pNew.getClass().getCanonicalName() + " for " + att.attached.getUUID() + " sent to " + networkManager.player.getScoreboardName()); } @@ -203,37 +200,40 @@ public static void tryProcessTeleportPacketForAttach(DenizenNetworkManagerImpl n for (EntityAttachmentHelper.PlayerAttachMap attMap : attList.attachedToMap.values()) { EntityAttachmentHelper.AttachmentData att = attMap.getAttachment(networkManager.player.getUUID()); if (attMap.attached.isValid() && att != null) { - ClientboundTeleportEntityPacket pNew = ClientboundTeleportEntityPacket.STREAM_CODEC.decode(DenizenNetworkManagerImpl.copyPacket(packet, ClientboundTeleportEntityPacket.STREAM_CODEC)); - ENTITY_ID_PACKTELENT.setInt(pNew, att.attached.getBukkitEntity().getEntityId()); - Vector resultPos = new Vector(POS_X_PACKTELENT.getDouble(pNew), POS_Y_PACKTELENT.getDouble(pNew), POS_Z_PACKTELENT.getDouble(pNew)).add(relative); + ClientboundTeleportEntityPacket pNew; + Vector resultPos = CraftVector.toBukkit(packet.change().position()).add(relative); if (att.positionalOffset != null) { resultPos = att.fixedForOffset(resultPos, e.getYRot(), e.getXRot()); - byte yaw, pitch; + float yaw, pitch; if (att.noRotate) { Entity attachedEntity = ((CraftEntity) att.attached.getBukkitEntity()).getHandle(); - yaw = EntityAttachmentHelper.compressAngle(attachedEntity.getYRot()); - pitch = EntityAttachmentHelper.compressAngle(attachedEntity.getXRot()); + yaw = attachedEntity.getYRot(); + pitch = attachedEntity.getXRot(); } else { - yaw = packet.getyRot(); - pitch = packet.getxRot(); + yaw = packet.change().yRot(); + pitch = packet.change().xRot(); } if (att.noPitch) { Entity attachedEntity = ((CraftEntity) att.attached.getBukkitEntity()).getHandle(); pitch = EntityAttachmentHelper.compressAngle(attachedEntity.getXRot()); } - byte newYaw = EntityAttachmentHelper.adaptedCompressedAngle(yaw, att.positionalOffset.getYaw()); - pitch = EntityAttachmentHelper.adaptedCompressedAngle(pitch, att.positionalOffset.getPitch()); - POS_X_PACKTELENT.setDouble(pNew, resultPos.getX()); - POS_Y_PACKTELENT.setDouble(pNew, resultPos.getY()); - POS_Z_PACKTELENT.setDouble(pNew, resultPos.getZ()); - YAW_PACKTELENT.setByte(pNew, newYaw); - PITCH_PACKTELENT.setByte(pNew, pitch); + float newYaw = EntityAttachmentHelper.adaptedAngle(yaw, att.positionalOffset.getYaw()); + pitch = EntityAttachmentHelper.adaptedAngle(pitch, att.positionalOffset.getPitch()); + pNew = new ClientboundTeleportEntityPacket( + att.attached.getBukkitEntity().getEntityId(), + new PositionMoveRotation(CraftVector.toNMS(resultPos), packet.change().deltaMovement(), newYaw, pitch), + packet.relatives(), + packet.onGround() + ); if (NMSHandler.debugPackets) { DenizenNetworkManagerImpl.doPacketOutput("Attach Teleport Packet: " + pNew.getClass().getCanonicalName() + " for " + att.attached.getUUID() + " sent to " + networkManager.player.getScoreboardName() + " with raw yaw " + yaw + " adapted to " + newYaw); } } + else { + pNew = new ClientboundTeleportEntityPacket(att.attached.getBukkitEntity().getEntityId(), packet.change(), packet.relatives(), packet.onGround()); + } att.visiblePositions.put(networkManager.player.getUUID(), resultPos.clone()); networkManager.oldManager.send(pNew); } @@ -279,7 +279,7 @@ else if (packet instanceof ClientboundSetEntityMotionPacket setEntityMotionPacke return EntityAttachmentHelper.denyOriginalPacketSend(networkManager.player.getUUID(), e.getUUID()) ? null : packet; } else if (packet instanceof ClientboundTeleportEntityPacket teleportEntityPacket) { - int ider = teleportEntityPacket.getId(); + int ider = teleportEntityPacket.id(); Entity e = networkManager.player.level().getEntity(ider); if (e == null) { return packet; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java index 244f5ac500..f0a0c4a9b9 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java @@ -1,24 +1,23 @@ package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; import com.denizenscript.denizen.nms.NMSHandler; -import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; import com.denizenscript.denizen.nms.v1_21.helpers.PacketHelperImpl; import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.objects.PlayerTag; import com.denizenscript.denizen.scripts.commands.player.DisguiseCommand; import com.denizenscript.denizen.utilities.entity.EntityAttachmentHelper; import com.denizenscript.denizen.utilities.entity.FakeEntity; -import com.denizenscript.denizencore.utilities.ReflectionHelper; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.*; import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.PositionMoveRotation; import net.minecraft.world.level.Level; import org.bukkit.craftbukkit.v1_21_R2.entity.CraftEntity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; -import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -32,13 +31,11 @@ public static void registerHandlers() { registerPacketHandler(ClientboundSetEntityDataPacket.class, ClientboundSetEntityDataPacket::id, DisguisePacketHandlers::processEntityDataPacket); registerPacketHandler(ClientboundUpdateAttributesPacket.class, ClientboundUpdateAttributesPacket::getEntityId, DisguisePacketHandlers::processAttributesPacket); registerPacketHandler(ClientboundAddEntityPacket.class, ClientboundAddEntityPacket::getId, DisguisePacketHandlers::sendDisguiseForPacket); - registerPacketHandler(ClientboundTeleportEntityPacket.class, ClientboundTeleportEntityPacket::getId, DisguisePacketHandlers::processTeleportPacket); + registerPacketHandler(ClientboundTeleportEntityPacket.class, ClientboundTeleportEntityPacket::id, DisguisePacketHandlers::processTeleportPacket); registerPacketHandler(ClientboundMoveEntityPacket.Rot.class, ClientboundMoveEntityPacket::getEntity, DisguisePacketHandlers::processMoveEntityRotPacket); registerPacketHandler(ClientboundMoveEntityPacket.PosRot.class, ClientboundMoveEntityPacket::getEntity, DisguisePacketHandlers::processMoveEntityPosRotPacket); } - public static final Field TELEPORT_PACKET_YAW = ReflectionHelper.getFields(ClientboundTeleportEntityPacket.class).get(ReflectionMappingsInfo.ClientboundTeleportEntityPacket_yRot, byte.class); - private static boolean antiDuplicate = false; public static > void registerPacketHandler(Class packetType, ToIntFunction idGetter, DisguisePacketHandler handler) { @@ -114,9 +111,13 @@ public static ClientboundUpdateAttributesPacket processAttributesPacket(DenizenN public static ClientboundTeleportEntityPacket processTeleportPacket(DenizenNetworkManagerImpl networkManager, ClientboundTeleportEntityPacket teleportEntityPacket, DisguiseCommand.TrackedDisguise disguise) throws IllegalAccessException { if (disguise.as.getBukkitEntityType() == EntityType.ENDER_DRAGON) { - ClientboundTeleportEntityPacket pNew = ClientboundTeleportEntityPacket.STREAM_CODEC.decode(DenizenNetworkManagerImpl.copyPacket(teleportEntityPacket, ClientboundTeleportEntityPacket.STREAM_CODEC)); - TELEPORT_PACKET_YAW.setByte(pNew, EntityAttachmentHelper.adaptedCompressedAngle(teleportEntityPacket.getyRot(), 180)); - return pNew; + PositionMoveRotation oldChange = teleportEntityPacket.change(); + return new ClientboundTeleportEntityPacket( + teleportEntityPacket.id(), + new PositionMoveRotation(oldChange.position(), oldChange.deltaMovement(), oldChange.xRot(), EntityAttachmentHelper.adaptedAngle(oldChange.yRot(), 180)), + teleportEntityPacket.relatives(), + teleportEntityPacket.onGround() + ); } return sendDisguiseForPacket(networkManager, teleportEntityPacket, disguise); } @@ -124,7 +125,12 @@ public static ClientboundTeleportEntityPacket processTeleportPacket(DenizenNetwo public static ClientboundMoveEntityPacket.Rot processMoveEntityRotPacket(DenizenNetworkManagerImpl networkManager, ClientboundMoveEntityPacket.Rot rotPacket, DisguiseCommand.TrackedDisguise disguise) { if (disguise.as.getBukkitEntityType() == EntityType.ENDER_DRAGON) { - return new ClientboundMoveEntityPacket.Rot(disguise.entity.getBukkitEntity().getEntityId(), EntityAttachmentHelper.adaptedCompressedAngle(rotPacket.getyRot(), 180), rotPacket.getxRot(), rotPacket.isOnGround()); + return new ClientboundMoveEntityPacket.Rot( + disguise.entity.getBukkitEntity().getEntityId(), + Mth.packDegrees(EntityAttachmentHelper.adaptedAngle(rotPacket.getyRot(), 180)), + Mth.packDegrees(rotPacket.getxRot()), + rotPacket.isOnGround() + ); } return sendDisguiseForPacket(networkManager, rotPacket, disguise); } @@ -132,7 +138,15 @@ public static ClientboundMoveEntityPacket.Rot processMoveEntityRotPacket(Denizen public static ClientboundMoveEntityPacket.PosRot processMoveEntityPosRotPacket(DenizenNetworkManagerImpl networkManager, ClientboundMoveEntityPacket.PosRot posRotPacket, DisguiseCommand.TrackedDisguise disguise) { if (disguise.as.getBukkitEntityType() == EntityType.ENDER_DRAGON) { - return new ClientboundMoveEntityPacket.PosRot(disguise.entity.getBukkitEntity().getEntityId(), posRotPacket.getXa(), posRotPacket.getYa(), posRotPacket.getZa(), EntityAttachmentHelper.adaptedCompressedAngle(posRotPacket.getyRot(), 180), posRotPacket.getxRot(), posRotPacket.isOnGround()); + return new ClientboundMoveEntityPacket.PosRot( + disguise.entity.getBukkitEntity().getEntityId(), + posRotPacket.getXa(), + posRotPacket.getYa(), + posRotPacket.getZa(), + Mth.packDegrees(EntityAttachmentHelper.adaptedAngle(posRotPacket.getyRot(), 180)), + Mth.packDegrees(posRotPacket.getxRot()), + posRotPacket.isOnGround() + ); } return sendDisguiseForPacket(networkManager, posRotPacket, disguise); } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java index ecf90285ad..76c974b059 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java @@ -48,7 +48,7 @@ else if (packet instanceof ClientboundSetEntityMotionPacket) { ider = ((ClientboundSetEntityMotionPacket) packet).getId(); } else if (packet instanceof ClientboundTeleportEntityPacket) { - ider = ((ClientboundTeleportEntityPacket) packet).getId(); + ider = ((ClientboundTeleportEntityPacket) packet).id(); } if (e == null && ider != -1) { e = networkManager.player.level().getEntity(ider); diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/PlayerHearsSoundEventPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/PlayerHearsSoundEventPacketHandlers.java index 041bf5ece1..4dad338a67 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/PlayerHearsSoundEventPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/PlayerHearsSoundEventPacketHandlers.java @@ -22,7 +22,7 @@ public static Packet processSoundPacket(DenizenNetwork } if (packet instanceof ClientboundSoundPacket) { ClientboundSoundPacket spacket = (ClientboundSoundPacket) packet; - return PlayerHearsSoundScriptEvent.instance.run(networkManager.player.getBukkitEntity(), spacket.getSound().value().getLocation().getPath(), spacket.getSource().name(), + return PlayerHearsSoundScriptEvent.instance.run(networkManager.player.getBukkitEntity(), spacket.getSound().value().location().getPath(), spacket.getSource().name(), false, null, new Location(networkManager.player.getBukkitEntity().getWorld(), spacket.getX(), spacket.getY(), spacket.getZ()), spacket.getVolume(), spacket.getPitch()) ? null : packet; } else if (packet instanceof ClientboundSoundEntityPacket) { @@ -31,7 +31,7 @@ else if (packet instanceof ClientboundSoundEntityPacket) { if (entity == null) { return packet; } - return PlayerHearsSoundScriptEvent.instance.run(networkManager.player.getBukkitEntity(), spacket.getSound().value().getLocation().getPath(), spacket.getSource().name(), + return PlayerHearsSoundScriptEvent.instance.run(networkManager.player.getBukkitEntity(), spacket.getSound().value().location().getPath(), spacket.getSource().name(), false, entity.getBukkitEntity(), null, spacket.getVolume(), spacket.getPitch()) ? null : packet; } return packet; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java index 6164da7775..c72fa0ab28 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java @@ -98,7 +98,7 @@ public static Packet processTablistPacket(DenizenNetwo newProfile.getProperties().put("textures", new Property("textures", data.texture, data.signature)); } ClientboundPlayerInfoUpdatePacket.Entry entry = new ClientboundPlayerInfoUpdatePacket.Entry(newProfile.getId(), newProfile, data.isListed, data.latency, data.gamemode == null ? null : GameType.byName(CoreUtilities.toLowerCase(data.gamemode)), - data.display == null ? null : Handler.componentToNMS(FormattedTextHelper.parse(data.display, ChatColor.WHITE)), update.chatSession()); + data.display == null ? null : Handler.componentToNMS(FormattedTextHelper.parse(data.display, ChatColor.WHITE)), update.listOrder(), update.chatSession()); networkManager.oldManager.send(ProfileEditorImpl.createInfoPacket(infoPacket.actions(), Collections.singletonList(entry))); } } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketInSteerVehicleImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketInSteerVehicleImpl.java index bbbb63ee6f..ce2c293c29 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketInSteerVehicleImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketInSteerVehicleImpl.java @@ -13,21 +13,21 @@ public PacketInSteerVehicleImpl(ServerboundPlayerInputPacket internal) { @Override public float getLeftwardInput() { - return internal.getXxa(); + return internal.input().left() ? 1 : 0; } @Override public float getForwardInput() { - return internal.getZza(); + return internal.input().forward() ? 1 : 0; } @Override public boolean getJumpInput() { - return internal.isJumping(); + return internal.input().jump(); } @Override public boolean getDismountInput() { - return internal.isShiftKeyDown(); + return internal.input().shift(); } } From 68d8b877a90d3ec3702c99556090f467fe984548 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Sun, 27 Oct 2024 14:21:44 +0000 Subject: [PATCH 073/280] 1.21.3 part 1 part 2: bump paper API version --- paper/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paper/pom.xml b/paper/pom.xml index 2489e766d0..415da04a99 100644 --- a/paper/pom.xml +++ b/paper/pom.xml @@ -25,7 +25,7 @@ io.papermc.paper paper-api - 1.21.1-R0.1-SNAPSHOT + 1.21.3-R0.1-SNAPSHOT provided From 42b85afd3362f2db248a58ac78277b288728b2cf Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Mon, 28 Oct 2024 13:01:21 +0000 Subject: [PATCH 074/280] 1.21.3 part 6: final fixes --- .../denizen/utilities/entity/EntityAttachmentHelper.java | 1 - .../denizen/nms/v1_21/helpers/FishingHelperImpl.java | 3 +-- .../denizen/nms/v1_21/helpers/ItemHelperImpl.java | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/EntityAttachmentHelper.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/EntityAttachmentHelper.java index 2c98905da9..2c489d2e28 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/EntityAttachmentHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/EntityAttachmentHelper.java @@ -3,7 +3,6 @@ import com.denizenscript.denizen.Denizen; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.utilities.packets.NetworkInterceptHelper; -import com.denizenscript.denizencore.utilities.debugging.Debug; import org.bukkit.Location; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java index f933f3bff6..f2673b498a 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java @@ -4,7 +4,6 @@ import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; -import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Mth; @@ -74,7 +73,7 @@ public ItemStack getRandomReward(FishingHook nmsHook, ResourceKey key .withParameter(LootContextParams.ORIGIN, new Vec3(nmsHook.getX(), nmsHook.getY(), nmsHook.getZ())) .withParameter(LootContextParams.TOOL, new ItemStack(Items.FISHING_ROD)) .create(LootContextParamSets.FISHING); - List nmsItems = nmsHook.registryAccess().lookupOrThrow(Registries.LOOT_TABLE).getValueOrThrow(key).getRandomItems(nmsLootParams); + List nmsItems = nmsWorld.getServer().reloadableRegistries().getLootTable(key).getRandomItems(nmsLootParams); return nmsItems.get(nmsWorld.random.nextInt(nmsItems.size())); } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java index 8ca6337878..ab5e065017 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java @@ -132,7 +132,7 @@ public static Ingredient itemArrayToRecipe(ItemStack[] items, boolean exact) { return Ingredient.ofStacks(Arrays.stream(items).map(CraftItemStack::asNMSCopy).toList()); } - private static ResourceKey> createRecipeKey(String name) { + public static ResourceKey> createRecipeKey(String name) { return ResourceKey.create(Registries.RECIPE, ResourceLocation.fromNamespaceAndPath("denizen", name)); } From 563f656c4cf7c8494da1a7165d1abdebb8dcacc7 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Tue, 29 Oct 2024 11:21:45 +0000 Subject: [PATCH 075/280] 1.21.3 part 7: fixes from review --- .../utilities/entity/EntityAttachmentHelper.java | 14 +++----------- .../handlers/packet/AttachPacketHandlers.java | 16 +++++++--------- .../handlers/packet/DisguisePacketHandlers.java | 6 +++--- 3 files changed, 13 insertions(+), 23 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/EntityAttachmentHelper.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/EntityAttachmentHelper.java index 2c489d2e28..e2e4c50d02 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/EntityAttachmentHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/EntityAttachmentHelper.java @@ -181,11 +181,10 @@ public static class EntityAttachedToMap { public static byte adaptedCompressedAngle(byte angle, float offset) { float angleF = ((float) angle) * (360F / 256F); - return compressAngle(adaptedAngle(angleF, offset)); + return compressAngle(angleF + offset); } - public static float adaptedAngle(float angle, float offset) { - angle += offset; + public static float normalizeAngle(float angle) { angle %= 360; if (angle > 180) { angle -= 360; @@ -197,14 +196,7 @@ public static float adaptedAngle(float angle, float offset) { } public static byte compressAngle(float angle) { - angle %= 360; - if (angle > 180) { - angle -= 360; - } - if (angle < -180) { - angle += 360; - } - return (byte)((int)(angle * (256F / 360F))); + return (byte)((int)(normalizeAngle(angle) * (256F / 360F))); } public static Vector fixOffset(Vector offset, double yaw, double pitch) { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java index 97e790df55..edc0a34359 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java @@ -79,13 +79,12 @@ else if (isRotate) { pitch = e.getXRot(); } if (att.noPitch) { - Entity attachedEntity = ((CraftEntity) att.attached.getBukkitEntity()).getHandle(); - pitch = EntityAttachmentHelper.compressAngle(attachedEntity.getXRot()); + pitch = ((CraftEntity) att.attached.getBukkitEntity()).getHandle().getXRot(); } float newYaw = yaw; if (isRotate) { - newYaw = EntityAttachmentHelper.adaptedAngle(newYaw, att.positionalOffset.getYaw()); - pitch = EntityAttachmentHelper.adaptedAngle(pitch, att.positionalOffset.getPitch()); + newYaw = EntityAttachmentHelper.normalizeAngle(newYaw + att.positionalOffset.getYaw()); + pitch = EntityAttachmentHelper.normalizeAngle(pitch + att.positionalOffset.getPitch()); } Vector goalPosition = att.fixedForOffset(new Vector(e.getX(), e.getY(), e.getZ()), e.getYRot(), e.getXRot()); Vector oldPos = att.visiblePositions.get(networkManager.player.getUUID()); @@ -155,7 +154,7 @@ public static void tryProcessRotateHeadPacketForAttach(DenizenNetworkManagerImpl if (att.noRotate) { yaw = attachedEntity.getYRot(); } - yaw = EntityAttachmentHelper.adaptedAngle(yaw, att.positionalOffset.getYaw()); + yaw = EntityAttachmentHelper.normalizeAngle(yaw + att.positionalOffset.getYaw()); } ClientboundRotateHeadPacket pNew = new ClientboundRotateHeadPacket(attachedEntity, EntityAttachmentHelper.compressAngle(yaw)); if (NMSHandler.debugPackets) { @@ -215,11 +214,10 @@ public static void tryProcessTeleportPacketForAttach(DenizenNetworkManagerImpl n pitch = packet.change().xRot(); } if (att.noPitch) { - Entity attachedEntity = ((CraftEntity) att.attached.getBukkitEntity()).getHandle(); - pitch = EntityAttachmentHelper.compressAngle(attachedEntity.getXRot()); + pitch = ((CraftEntity) att.attached.getBukkitEntity()).getHandle().getXRot(); } - float newYaw = EntityAttachmentHelper.adaptedAngle(yaw, att.positionalOffset.getYaw()); - pitch = EntityAttachmentHelper.adaptedAngle(pitch, att.positionalOffset.getPitch()); + float newYaw = EntityAttachmentHelper.normalizeAngle(yaw + att.positionalOffset.getYaw()); + pitch = EntityAttachmentHelper.normalizeAngle(pitch + att.positionalOffset.getPitch()); pNew = new ClientboundTeleportEntityPacket( att.attached.getBukkitEntity().getEntityId(), new PositionMoveRotation(CraftVector.toNMS(resultPos), packet.change().deltaMovement(), newYaw, pitch), diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java index f0a0c4a9b9..37d9daee59 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java @@ -114,7 +114,7 @@ public static ClientboundTeleportEntityPacket processTeleportPacket(DenizenNetwo PositionMoveRotation oldChange = teleportEntityPacket.change(); return new ClientboundTeleportEntityPacket( teleportEntityPacket.id(), - new PositionMoveRotation(oldChange.position(), oldChange.deltaMovement(), oldChange.xRot(), EntityAttachmentHelper.adaptedAngle(oldChange.yRot(), 180)), + new PositionMoveRotation(oldChange.position(), oldChange.deltaMovement(), EntityAttachmentHelper.normalizeAngle(oldChange.yRot() + 180), oldChange.xRot()), teleportEntityPacket.relatives(), teleportEntityPacket.onGround() ); @@ -127,7 +127,7 @@ public static ClientboundMoveEntityPacket.Rot processMoveEntityRotPacket(Denizen if (disguise.as.getBukkitEntityType() == EntityType.ENDER_DRAGON) { return new ClientboundMoveEntityPacket.Rot( disguise.entity.getBukkitEntity().getEntityId(), - Mth.packDegrees(EntityAttachmentHelper.adaptedAngle(rotPacket.getyRot(), 180)), + EntityAttachmentHelper.compressAngle(rotPacket.getyRot() + 180), Mth.packDegrees(rotPacket.getxRot()), rotPacket.isOnGround() ); @@ -143,7 +143,7 @@ public static ClientboundMoveEntityPacket.PosRot processMoveEntityPosRotPacket(D posRotPacket.getXa(), posRotPacket.getYa(), posRotPacket.getZa(), - Mth.packDegrees(EntityAttachmentHelper.adaptedAngle(posRotPacket.getyRot(), 180)), + EntityAttachmentHelper.compressAngle(posRotPacket.getyRot() + 180), Mth.packDegrees(posRotPacket.getxRot()), posRotPacket.isOnGround() ); From cbe65948ee2278c6cb62a7d2c0bc7b445620e13e Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Wed, 30 Oct 2024 09:13:48 -0700 Subject: [PATCH 076/280] cleanup and fix for 1.21.3 --- .../VillagerChangesProfessionScriptEvent.java | 4 +- .../denizen/nms/interfaces/EntityHelper.java | 11 +++- .../properties/entity/EntityArmorBonus.java | 3 +- .../entity/EntityAttributeBaseValues.java | 9 +-- .../entity/EntityAttributeModifiers.java | 2 +- .../properties/entity/EntityColor.java | 29 +++++---- .../properties/entity/EntityProfession.java | 6 +- .../properties/entity/EntitySpeed.java | 5 +- .../item/ItemAttributeModifiers.java | 2 +- .../commands/world/PlayEffectCommand.java | 5 +- .../denizen/utilities/LegacyNamingHelper.java | 63 ------------------- .../utilities/MultiVersionHelper1_19.java | 5 +- .../denizen/utilities/Utilities.java | 24 +++++++ .../denizen/utilities/maps/MapCursor.java | 5 +- .../nms/v1_21/helpers/EntityHelperImpl.java | 2 +- 15 files changed, 71 insertions(+), 104 deletions(-) delete mode 100644 plugin/src/main/java/com/denizenscript/denizen/utilities/LegacyNamingHelper.java diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/VillagerChangesProfessionScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/VillagerChangesProfessionScriptEvent.java index 5004b051bc..e9bbe9591c 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/VillagerChangesProfessionScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/VillagerChangesProfessionScriptEvent.java @@ -2,7 +2,7 @@ import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizen.objects.EntityTag; -import com.denizenscript.denizen.utilities.LegacyNamingHelper; +import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; import org.bukkit.entity.Villager; @@ -58,7 +58,7 @@ public boolean matches(ScriptPath path) { @Override public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) { // TODO This technically has registries on all supported versions - Villager.Profession newProfession = LegacyNamingHelper.convert(Villager.Profession.class, determinationObj.toString()); + Villager.Profession newProfession = Utilities.elementToEnumlike(determinationObj.asElement(), Villager.Profession.class); if (newProfession != null) { event.setProfession(newProfession); return true; diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java index be2bc3b606..7b63b179c1 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java @@ -5,6 +5,7 @@ import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.LocationTag; +import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.MapTag; import org.bukkit.Bukkit; @@ -29,6 +30,10 @@ public abstract class EntityHelper { + public static Attribute ATTRIBUTE_ARMOR = Utilities.findBestEnumlike(Attribute.class, "ARMOR", "GENERIC_ARMOR"); + public static Attribute ATTRIBUTE_STEP_HEIGHT = Utilities.findBestEnumlike(Attribute.class, "STEP_HEIGHT", "GENERIC_STEP_HEIGHT"); + public static Attribute ATTRIBUTE_MOVEMENT_SPEED = Utilities.findBestEnumlike(Attribute.class, "MOVEMENT_SPEED", "GENERIC_MOVEMENT_SPEED"); + public abstract void setInvisible(Entity entity, boolean invisible); public abstract boolean isInvisible(Entity entity); @@ -287,7 +292,7 @@ public boolean isFacingEntity(Entity from, Entity at, float degreeLimit) { public static float normalizeYaw(float yaw) { yaw = yaw % 360; if (yaw < 0) { - yaw += 360.0; + yaw += 360; } return yaw; } @@ -446,12 +451,12 @@ public void setUUID(Entity entity, UUID id) { } public float getStepHeight(Entity entity) { - return entity instanceof LivingEntity livingEntity ? (float) livingEntity.getAttribute(Attribute.GENERIC_STEP_HEIGHT).getBaseValue() : 0; + return entity instanceof LivingEntity livingEntity ? (float) livingEntity.getAttribute(ATTRIBUTE_STEP_HEIGHT).getBaseValue() : 0; } public void setStepHeight(Entity entity, float stepHeight) { if (entity instanceof LivingEntity livingEntity) { - livingEntity.getAttribute(Attribute.GENERIC_STEP_HEIGHT).setBaseValue(stepHeight); + livingEntity.getAttribute(ATTRIBUTE_STEP_HEIGHT).setBaseValue(stepHeight); } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityArmorBonus.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityArmorBonus.java index 9a1865d648..f9bebc0a04 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityArmorBonus.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityArmorBonus.java @@ -1,5 +1,6 @@ package com.denizenscript.denizen.objects.properties.entity; +import com.denizenscript.denizen.nms.interfaces.EntityHelper; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.Mechanism; @@ -47,7 +48,7 @@ public String getPropertyId() { } public AttributeInstance getAttribute() { - return entity.getLivingEntity().getAttribute(Attribute.GENERIC_ARMOR); + return entity.getLivingEntity().getAttribute(EntityHelper.ATTRIBUTE_ARMOR); } public static void register() { diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAttributeBaseValues.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAttributeBaseValues.java index fe652debc9..599652b6f8 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAttributeBaseValues.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAttributeBaseValues.java @@ -1,6 +1,7 @@ package com.denizenscript.denizen.objects.properties.entity; import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; @@ -79,7 +80,7 @@ public static void register() { // See also <@link language attribute modifiers>. // --> PropertyParser.registerTag(EntityAttributeBaseValues.class, ElementTag.class, "has_attribute", (attribute, object) -> { - if (!(attribute.hasParam() && attribute.getParamElement().matchesEnum(Attribute.class))) { + if (!(attribute.hasParam() && Utilities.matchesEnumlike(attribute.getParamElement(), Attribute.class))) { attribute.echoError("Invalid entity.has_attribute[...] input: must be a valid attribute name."); return null; } @@ -99,7 +100,7 @@ public static void register() { // See also <@link language attribute modifiers>. // --> PropertyParser.registerTag(EntityAttributeBaseValues.class, ElementTag.class, "attribute_value", (attribute, object) -> { - if (!(attribute.hasParam() && attribute.getParamElement().matchesEnum(Attribute.class))) { + if (!(attribute.hasParam() && Utilities.matchesEnumlike(attribute.getParamElement(), Attribute.class))) { attribute.echoError("Invalid entity.attribute_value[...] input: must be a valid attribute name."); return null; } @@ -124,7 +125,7 @@ public static void register() { // See also <@link language attribute modifiers>. // --> PropertyParser.registerTag(EntityAttributeBaseValues.class, ElementTag.class, "attribute_base_value", (attribute, object) -> { - if (!(attribute.hasParam() && attribute.getParamElement().matchesEnum(Attribute.class))) { + if (!(attribute.hasParam() && Utilities.matchesEnumlike(attribute.getParamElement(), Attribute.class))) { attribute.echoError("Invalid entity.attribute_base_value[...] input: must be a valid attribute name."); return null; } @@ -149,7 +150,7 @@ public static void register() { // See also <@link language attribute modifiers>. // --> PropertyParser.registerTag(EntityAttributeBaseValues.class, ElementTag.class, "attribute_default_value", (attribute, object) -> { - if (!(attribute.hasParam() && attribute.getParamElement().matchesEnum(Attribute.class))) { + if (!(attribute.hasParam() && Utilities.matchesEnumlike(attribute.getParamElement(), Attribute.class))) { attribute.echoError("Invalid entity.attribute_default_value[...] input: must be a valid attribute name."); return null; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAttributeModifiers.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAttributeModifiers.java index 1feb30181b..d6ef4c54c2 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAttributeModifiers.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAttributeModifiers.java @@ -402,7 +402,7 @@ public void adjust(Mechanism mechanism) { ArrayList inputList = new ArrayList<>(mechanism.valueAsType(ListTag.class)); Attributable ent = getAttributable(); for (String toRemove : new ArrayList<>(inputList)) { - if (new ElementTag(toRemove).matchesEnum(Attribute.class)) { + if (Utilities.matchesEnumlike(new ElementTag(toRemove), Attribute.class)) { inputList.remove(toRemove); Attribute attr = Attribute.valueOf(toRemove.toUpperCase()); AttributeInstance instance = ent.getAttribute(attr); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityColor.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityColor.java index f72fe10276..3960841ecb 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityColor.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityColor.java @@ -4,7 +4,6 @@ import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.properties.bukkit.BukkitColorExtensions; -import com.denizenscript.denizen.utilities.LegacyNamingHelper; import com.denizenscript.denizen.utilities.MultiVersionHelper1_19; import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizencore.objects.Mechanism; @@ -81,7 +80,7 @@ public void setPropertyValue(ElementTag color, Mechanism mechanism) { mechanism.echoError("Invalid horse color specified: " + horseColor); } if (list.size() > 1) { - ElementTag style = new ElementTag(list.get(1)); + ElementTag style = list.getObject(1).asElement(); if (style.matchesEnum(Horse.Style.class)) { horse.setStyle(style.asEnum(Horse.Style.class)); } @@ -117,7 +116,7 @@ else if (type == MOOSHROOM_ENTITY_TYPE && mechanism.requireEnum(MushroomCow.Vari else if (type == EntityType.TROPICAL_FISH && mechanism.requireObject(ListTag.class)) { ListTag list = mechanism.valueAsType(ListTag.class); TropicalFish fish = as(TropicalFish.class); - ElementTag pattern = new ElementTag(list.get(0)); + ElementTag pattern = list.getObject(0).asElement(); if (pattern.matchesEnum(TropicalFish.Pattern.class)) { fish.setPattern(pattern.asEnum(TropicalFish.Pattern.class)); } @@ -125,7 +124,7 @@ else if (type == EntityType.TROPICAL_FISH && mechanism.requireObject(ListTag.cla mechanism.echoError("Invalid tropical fish pattern specified: " + pattern); } if (list.size() > 1) { - ElementTag fishColor = new ElementTag(list.get(1)); + ElementTag fishColor = list.getObject(1).asElement(); if (fishColor.matchesEnum(DyeColor.class)) { fish.setBodyColor(fishColor.asEnum(DyeColor.class)); } @@ -134,7 +133,7 @@ else if (type == EntityType.TROPICAL_FISH && mechanism.requireObject(ListTag.cla } } if (list.size() > 2) { - ElementTag patternColor = new ElementTag(list.get(2)); + ElementTag patternColor = list.getObject(2).asElement(); if (patternColor.matchesEnum(DyeColor.class)) { fish.setPatternColor(patternColor.asEnum(DyeColor.class)); } @@ -149,16 +148,16 @@ else if (type == EntityType.FOX && mechanism.requireEnum(Fox.Type.class)) { else if (type == EntityType.CAT && mechanism.requireObject(ListTag.class)) { Cat cat = as(Cat.class); ListTag list = mechanism.valueAsType(ListTag.class); - String catTypeStr = list.get(0); - Cat.Type catType = LegacyNamingHelper.convert(Cat.Type.class, catTypeStr); + ElementTag input = list.getObject(0).asElement(); + Cat.Type catType = Utilities.elementToEnumlike(input, Cat.Type.class); if (catType != null) { cat.setCatType(catType); } else { - mechanism.echoError("Invalid cat type specified: " + catTypeStr); + mechanism.echoError("Invalid cat type specified: " + input); } if (list.size() > 1) { - ElementTag collarColor = new ElementTag(list.get(1)); + ElementTag collarColor = list.getObject(1).asElement(); if (collarColor.matchesEnum(DyeColor.class)) { cat.setCollarColor(collarColor.asEnum(DyeColor.class)); } @@ -170,7 +169,7 @@ else if (type == EntityType.CAT && mechanism.requireObject(ListTag.class)) { else if (type == EntityType.PANDA && mechanism.requireObject(ListTag.class)) { Panda panda = as(Panda.class); ListTag list = mechanism.valueAsType(ListTag.class); - ElementTag mainGene = new ElementTag(list.get(0)); + ElementTag mainGene = list.getObject(0).asElement(); if (mainGene.matchesEnum(Panda.Gene.class)) { panda.setMainGene(mainGene.asEnum(Panda.Gene.class)); } @@ -178,7 +177,7 @@ else if (type == EntityType.PANDA && mechanism.requireObject(ListTag.class)) { mechanism.echoError("Invalid panda gene specified: " + mainGene); } if (list.size() > 1) { - ElementTag hiddenGene = new ElementTag(list.get(1)); + ElementTag hiddenGene = list.getObject(1).asElement(); if (hiddenGene.matchesEnum(Panda.Gene.class)) { panda.setHiddenGene(hiddenGene.asEnum(Panda.Gene.class)); } @@ -188,11 +187,11 @@ else if (type == EntityType.PANDA && mechanism.requireObject(ListTag.class)) { } } // TODO This technically has registries on all supported versions - else if (type == EntityType.VILLAGER) { - LegacyNamingHelper.requireType(mechanism, Villager.Type.class).ifPresent(as(Villager.class)::setVillagerType); + else if (type == EntityType.VILLAGER && Utilities.requireEnumlike(mechanism, Villager.Type.class)) { + as(Villager.class).setVillagerType(Utilities.elementToEnumlike(mechanism.getValue(), Villager.Type.class)); } - else if (type == EntityType.ZOMBIE_VILLAGER) { - LegacyNamingHelper.requireType(mechanism, Villager.Type.class).ifPresent(as(ZombieVillager.class)::setVillagerType); + else if (type == EntityType.ZOMBIE_VILLAGER && Utilities.requireEnumlike(mechanism, Villager.Type.class)) { + as(ZombieVillager.class).setVillagerType(Utilities.elementToEnumlike(mechanism.getValue(), Villager.Type.class)); } else if (type == EntityType.ARROW && mechanism.requireObject(ColorTag.class)) { as(Arrow.class).setColor(BukkitColorExtensions.getColor(mechanism.valueAsType(ColorTag.class))); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityProfession.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityProfession.java index 84baeae1bf..478f6e9f56 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityProfession.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityProfession.java @@ -1,7 +1,7 @@ package com.denizenscript.denizen.objects.properties.entity; import com.denizenscript.denizen.objects.EntityTag; -import com.denizenscript.denizen.utilities.LegacyNamingHelper; +import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.ObjectTag; @@ -111,8 +111,8 @@ public void adjust(Mechanism mechanism) { // @tags // // --> - if (mechanism.matches("profession")) { - LegacyNamingHelper.requireType(mechanism, Villager.Profession.class).ifPresent(this::setProfession); + if (mechanism.matches("profession") && Utilities.requireEnumlike(mechanism, Villager.Profession.class)) { + setProfession(Utilities.elementToEnumlike(mechanism.getValue(), Villager.Profession.class)); } } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntitySpeed.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntitySpeed.java index b99ed6e5ed..8dd8aae4d4 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntitySpeed.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntitySpeed.java @@ -1,5 +1,6 @@ package com.denizenscript.denizen.objects.properties.entity; +import com.denizenscript.denizen.nms.interfaces.EntityHelper; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.ObjectTag; @@ -57,7 +58,7 @@ public String getPropertyId() { public ElementTag getSpeed() { if (entity.isLivingEntity()) { - return new ElementTag(entity.getLivingEntity().getAttribute(org.bukkit.attribute.Attribute.GENERIC_MOVEMENT_SPEED).getBaseValue()); + return new ElementTag(entity.getLivingEntity().getAttribute(EntityHelper.ATTRIBUTE_MOVEMENT_SPEED).getBaseValue()); } else { if (entity.getBukkitEntity() instanceof Boat) { @@ -109,7 +110,7 @@ public void adjust(Mechanism mechanism) { if (mechanism.matches("speed") && mechanism.requireDouble()) { double value = mechanism.getValue().asDouble(); if (entity.isLivingEntity()) { - entity.getLivingEntity().getAttribute(org.bukkit.attribute.Attribute.GENERIC_MOVEMENT_SPEED).setBaseValue(value); + entity.getLivingEntity().getAttribute(EntityHelper.ATTRIBUTE_MOVEMENT_SPEED).setBaseValue(value); } else { if (entity.getBukkitEntity() instanceof Boat) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemAttributeModifiers.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemAttributeModifiers.java index 721063e236..fb10189175 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemAttributeModifiers.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemAttributeModifiers.java @@ -154,7 +154,7 @@ public static void register() { ItemMeta meta = prop.getItemMeta(); ArrayList inputList = new ArrayList<>(param); for (String toRemove : new ArrayList<>(inputList)) { - if (new ElementTag(toRemove).matchesEnum(org.bukkit.attribute.Attribute.class)) { + if (Utilities.matchesEnumlike(new ElementTag(toRemove), org.bukkit.attribute.Attribute.class)) { inputList.remove(toRemove); org.bukkit.attribute.Attribute attr = org.bukkit.attribute.Attribute.valueOf(toRemove.toUpperCase()); meta.removeAttributeModifier(attr); diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/PlayEffectCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/PlayEffectCommand.java index 11620e9fb5..2da37c6516 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/PlayEffectCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/PlayEffectCommand.java @@ -5,8 +5,8 @@ import com.denizenscript.denizen.objects.*; import com.denizenscript.denizen.objects.properties.bukkit.BukkitColorExtensions; import com.denizenscript.denizen.utilities.BukkitImplDeprecations; -import com.denizenscript.denizen.utilities.LegacyNamingHelper; import com.denizenscript.denizen.utilities.LegacyParticleNaming; +import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizencore.exceptions.InvalidArgumentsException; import com.denizenscript.denizencore.objects.Argument; import com.denizenscript.denizencore.objects.ObjectTag; @@ -32,7 +32,6 @@ public class PlayEffectCommand extends AbstractCommand { - public static final LegacyNamingHelper PARTICLE_NAMING = new LegacyNamingHelper<>(Particle.class); public static final List VISIBLE_PARTICLES = new ArrayList<>(Arrays.asList(Particle.values())); static { @@ -129,7 +128,7 @@ else if (!scriptEntry.hasObject("effect") && !scriptEntry.hasObject("particleeffect") && !scriptEntry.hasObject("iconcrack")) { String particleName = CoreUtilities.toUpperCase(arg.getValue()); - Particle particle = PARTICLE_NAMING.fromName(particleName, scriptEntry.getContext()); + Particle particle = Utilities.elementToEnumlike(new ElementTag(particleName), Particle.class); if (particle != null) { scriptEntry.addObject("particleeffect", particle); continue; diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/LegacyNamingHelper.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/LegacyNamingHelper.java deleted file mode 100644 index 5ffaacdec9..0000000000 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/LegacyNamingHelper.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.denizenscript.denizen.utilities; - -import com.denizenscript.denizen.nms.NMSHandler; -import com.denizenscript.denizen.nms.NMSVersion; -import com.denizenscript.denizencore.objects.Mechanism; -import com.denizenscript.denizencore.objects.core.ElementTag; -import com.denizenscript.denizencore.tags.TagContext; -import com.denizenscript.denizencore.utilities.CoreUtilities; -import com.denizenscript.denizencore.utilities.debugging.DebugInternals; -import org.bukkit.Bukkit; -import org.bukkit.Keyed; - -import java.util.HashSet; -import java.util.Optional; -import java.util.Set; - -public class LegacyNamingHelper> { - - // TODO once 1.21 is the minimum supported version, replace with direct registry-based handling - @SuppressWarnings({"unchecked", "rawtypes", "DataFlowIssue"}) - public static T convert(Class type, String string) { - if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { - return Bukkit.getRegistry(type).get(Utilities.parseNamespacedKey(string)); - } - return (T) ElementTag.asEnum((Class) type, string); - } - - public static Optional requireType(Mechanism mechanism, Class type) { - T converted = convert(type, mechanism.getValue().asString()); - if (converted == null) { - mechanism.echoError("Invalid " + DebugInternals.getClassNameOpti(type) + " specified: must specify a valid name."); - return Optional.empty(); - } - return Optional.of(converted); - } - - private final Set modernNames; - private final Class enumType; - - public LegacyNamingHelper(Class enumType) { - this.enumType = enumType; - T[] enumConstants = enumType.getEnumConstants(); - modernNames = new HashSet<>(enumConstants.length); - for (T enumConstant : enumConstants) { - modernNames.add(enumConstant.name()); - } - } - - public T fromName(String name, TagContext context) { - String nameUpper = CoreUtilities.toUpperCase(name); - T value; - try { - value = Enum.valueOf(enumType, nameUpper); - } - catch (IllegalArgumentException ignored) { - return null; - } - if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20) && !modernNames.contains(nameUpper)) { - BukkitImplDeprecations.oldSpigotNames.warn(context); - } - return value; - } -} diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/MultiVersionHelper1_19.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/MultiVersionHelper1_19.java index 917817ee5f..073e093230 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/MultiVersionHelper1_19.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/MultiVersionHelper1_19.java @@ -1,7 +1,6 @@ package com.denizenscript.denizen.utilities; import com.denizenscript.denizen.objects.PlayerTag; -import com.denizenscript.denizen.objects.properties.entity.EntityColor; import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.core.DurationTag; import com.denizenscript.denizencore.objects.core.ElementTag; @@ -38,8 +37,8 @@ else if (Boat.class.isAssignableFrom(type.getEntityClass())) { } public static void setColor(Entity entity, Mechanism mech) { - if (entity instanceof Frog frog) { - LegacyNamingHelper.requireType(mech, Frog.Variant.class).ifPresent(frog::setVariant); + if (entity instanceof Frog frog && Utilities.requireEnumlike(mech, Frog.Variant.class)) { + frog.setVariant(Utilities.elementToEnumlike(mech.getValue(), Frog.Variant.class)); } else if (entity instanceof Boat boat && mech.requireEnum(Boat.Type.class)) { // TODO: 1.21.3: Deprecate setting boat types diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java index 1d012b892a..7d2020ff62 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java @@ -10,6 +10,7 @@ import com.denizenscript.denizen.tags.BukkitTagContext; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; import com.denizenscript.denizencore.events.ScriptEvent; +import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.ListTag; import com.denizenscript.denizencore.objects.core.ScriptTag; @@ -19,6 +20,7 @@ import com.denizenscript.denizencore.utilities.CoreConfiguration; import com.denizenscript.denizencore.utilities.CoreUtilities; import com.denizenscript.denizencore.utilities.debugging.Debug; +import com.denizenscript.denizencore.utilities.debugging.DebugInternals; import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.npc.NPC; import org.bukkit.*; @@ -567,4 +569,26 @@ public static T elementToEnumlike(ElementTag element, Class type) { } return (T) element.asEnum((Class) type); } + + public static T findBestEnumlike(Class type, String... names) { + for (String name : names) { + T val = elementToEnumlike(new ElementTag(name), type); + if (val != null) { + return val; + } + } + return null; + } + + public static boolean matchesEnumlike(ElementTag element, Class type) { + return elementToEnumlike(element, type) != null; + } + + public static boolean requireEnumlike(Mechanism mechanism, Class type) { + if (!matchesEnumlike(mechanism.getValue(), type)) { + mechanism.echoError("Invalid " + DebugInternals.getClassNameOpti(type) + " specified."); + return false; + } + return true; + } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/maps/MapCursor.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/maps/MapCursor.java index 4fbfa0966b..7dc909162f 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/maps/MapCursor.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/maps/MapCursor.java @@ -1,7 +1,8 @@ package com.denizenscript.denizen.utilities.maps; import com.denizenscript.denizen.objects.PlayerTag; -import com.denizenscript.denizen.utilities.LegacyNamingHelper; +import com.denizenscript.denizen.utilities.Utilities; +import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.utilities.debugging.Debug; import org.bukkit.map.MapCanvas; import org.bukkit.map.MapView; @@ -27,7 +28,7 @@ public byte getDirection(PlayerTag player) { } public org.bukkit.map.MapCursor.Type getType(PlayerTag player) { - return LegacyNamingHelper.convert(org.bukkit.map.MapCursor.Type.class, tag(typeTag, player)); + return Utilities.elementToEnumlike(new ElementTag(tag(typeTag, player)), org.bukkit.map.MapCursor.Type.class); } private byte yawToDirection(double yaw) { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java index f63c0f169f..d06c26fea3 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java @@ -111,7 +111,7 @@ public void setPose(Entity entity, Pose pose) { @Override public double getDamageTo(LivingEntity attacker, Entity target) { double damage = 0; - AttributeInstance attrib = attacker.getAttribute(Attribute.GENERIC_ATTACK_DAMAGE); + AttributeInstance attrib = attacker.getAttribute(Attribute.ATTACK_DAMAGE); if (attrib != null) { damage = attrib.getValue(); } From 500b2e41e672d0b12299cd7d567b7e07ffe17ba7 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Wed, 30 Oct 2024 09:31:58 -0700 Subject: [PATCH 077/280] cleanup --- .../events/player/BiomeEnterExitScriptEvent.java | 1 - .../objects/properties/entity/EntityArmorBonus.java | 1 - .../objects/properties/entity/EntityFirework.java | 1 - .../properties/entity/EntityIsShowingBottom.java | 1 - .../objects/properties/entity/EntityProperty.java | 1 - .../objects/properties/entity/EntityPumpkinHead.java | 1 - .../denizen/objects/properties/item/ItemProperty.java | 2 -- .../com/denizenscript/denizen/utilities/Utilities.java | 1 - .../impl/network/packets/PacketOutSetSlotImpl.java | 1 - .../nms/v1_20/helpers/EnchantmentHelperImpl.java | 2 -- .../denizen/nms/v1_20/helpers/FishingHelperImpl.java | 1 - .../denizen/nms/v1_20/impl/SidebarImpl.java | 1 - .../nms/v1_20/impl/entities/CraftFakeArrowImpl.java | 1 - .../v1_20/impl/network/packets/PacketOutChatImpl.java | 1 - .../denizen/nms/v1_21/helpers/BlockHelperImpl.java | 10 ---------- .../nms/v1_21/impl/entities/CraftFakeArrowImpl.java | 1 - .../v1_21/impl/network/packets/PacketOutChatImpl.java | 1 - 17 files changed, 28 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/BiomeEnterExitScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/BiomeEnterExitScriptEvent.java index 8db1290cfb..6b63e5a183 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/BiomeEnterExitScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/BiomeEnterExitScriptEvent.java @@ -9,7 +9,6 @@ import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; -import com.denizenscript.denizencore.utilities.CoreUtilities; import org.bukkit.block.Biome; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityArmorBonus.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityArmorBonus.java index f9bebc0a04..ac804712a0 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityArmorBonus.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityArmorBonus.java @@ -7,7 +7,6 @@ import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.properties.Property; import com.denizenscript.denizencore.objects.properties.PropertyParser; -import org.bukkit.attribute.Attribute; import org.bukkit.attribute.AttributeInstance; public class EntityArmorBonus implements Property { diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityFirework.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityFirework.java index 6925a0d546..ba0991d3e1 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityFirework.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityFirework.java @@ -7,7 +7,6 @@ import com.denizenscript.denizencore.objects.properties.Property; import com.denizenscript.denizencore.tags.Attribute; import org.bukkit.Material; -import org.bukkit.entity.EntityType; import org.bukkit.entity.Firework; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.FireworkMeta; diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityIsShowingBottom.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityIsShowingBottom.java index f4f4297fb5..189aa25991 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityIsShowingBottom.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityIsShowingBottom.java @@ -7,7 +7,6 @@ import com.denizenscript.denizencore.objects.properties.Property; import com.denizenscript.denizencore.tags.Attribute; import org.bukkit.entity.EnderCrystal; -import org.bukkit.entity.EntityType; public class EntityIsShowingBottom implements Property { diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityProperty.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityProperty.java index 0e3ed5b2a9..c3da4140eb 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityProperty.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityProperty.java @@ -28,7 +28,6 @@ public EntityType getType() { return object.getBukkitEntityType(); } - @SuppressWarnings({"unchecked", "unused"}) public T as(Class entityClass) { return (T) getEntity(); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPumpkinHead.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPumpkinHead.java index 4e0fcfabe6..47fabb6221 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPumpkinHead.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPumpkinHead.java @@ -6,7 +6,6 @@ import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.properties.Property; import com.denizenscript.denizencore.tags.Attribute; -import org.bukkit.entity.EntityType; import org.bukkit.entity.Snowman; public class EntityPumpkinHead implements Property { diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemProperty.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemProperty.java index 8b68dbd17f..f7848f3bd9 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemProperty.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemProperty.java @@ -36,12 +36,10 @@ public void setItemMeta(ItemMeta meta) { object.setItemMeta(meta); } - @SuppressWarnings("unchecked") public T as(Class metaType) { return (T) getItemMeta(); } - @SuppressWarnings("unchecked") public void editMeta(Class metaType, Consumer editor) { T meta = (T) getItemMeta(); editor.accept(meta); diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java index 7d2020ff62..4ccf7ae6d2 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java @@ -545,7 +545,6 @@ public static ArrayList allMaterialsThatMatch(String matcherText) { } // TODO once 1.21 is the minimum supported version, replace with direct registry-based handling - @SuppressWarnings({"unchecked", "DataFlowIssue"}) public static ListTag listTypes(Class type) { if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && Keyed.class.isAssignableFrom(type)) { return registryKeys(Bukkit.getRegistry((Class) type)); diff --git a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/impl/network/packets/PacketOutSetSlotImpl.java b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/impl/network/packets/PacketOutSetSlotImpl.java index b72484e4bf..f16779c031 100644 --- a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/impl/network/packets/PacketOutSetSlotImpl.java +++ b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/impl/network/packets/PacketOutSetSlotImpl.java @@ -8,7 +8,6 @@ import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack; import java.lang.reflect.Field; -import java.util.Map; public class PacketOutSetSlotImpl implements PacketOutSetSlot { diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EnchantmentHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EnchantmentHelperImpl.java index d51abcde37..c8b1400c6a 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EnchantmentHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EnchantmentHelperImpl.java @@ -16,7 +16,6 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import org.bukkit.NamespacedKey; @@ -26,7 +25,6 @@ import org.bukkit.craftbukkit.v1_20_R4.util.CraftNamespacedKey; import org.bukkit.enchantments.Enchantment; import org.bukkit.event.entity.EntityDamageEvent; -import net.minecraft.world.item.enchantment.Enchantment.EnchantmentDefinition; import java.lang.reflect.Field; import java.util.IdentityHashMap; diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/FishingHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/FishingHelperImpl.java index 94a3c107c4..05aff82c5e 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/FishingHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/FishingHelperImpl.java @@ -7,7 +7,6 @@ import com.google.common.collect.Maps; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Mth; import net.minecraft.world.entity.projectile.FishingHook; diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/SidebarImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/SidebarImpl.java index ed33d38f76..5a76a4a10e 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/SidebarImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/SidebarImpl.java @@ -7,7 +7,6 @@ import com.denizenscript.denizencore.utilities.debugging.Debug; import net.md_5.bungee.api.ChatColor; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.numbers.StyledFormat; import net.minecraft.network.protocol.game.ClientboundSetDisplayObjectivePacket; import net.minecraft.network.protocol.game.ClientboundSetObjectivePacket; diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakeArrowImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakeArrowImpl.java index 1257f21557..45ffcc8f4d 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakeArrowImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/entities/CraftFakeArrowImpl.java @@ -4,7 +4,6 @@ import net.minecraft.world.entity.projectile.AbstractArrow; import org.bukkit.craftbukkit.v1_20_R4.CraftServer; import org.bukkit.craftbukkit.v1_20_R4.entity.CraftAbstractArrow; -import org.bukkit.craftbukkit.v1_20_R4.entity.CraftArrow; public class CraftFakeArrowImpl extends CraftAbstractArrow implements FakeArrow { diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketOutChatImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketOutChatImpl.java index c7e2119967..f4ba9350ee 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketOutChatImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketOutChatImpl.java @@ -5,7 +5,6 @@ import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import net.md_5.bungee.chat.ComponentSerializer; -import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundPlayerChatPacket; import net.minecraft.network.protocol.game.ClientboundSystemChatPacket; import org.bukkit.craftbukkit.v1_20_R4.util.CraftChatMessage; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java index c3737bdbad..bf94a048e6 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java @@ -8,7 +8,6 @@ import com.denizenscript.denizen.nms.v1_21.impl.ProfileEditorImpl; import com.denizenscript.denizen.nms.v1_21.impl.jnbt.CompoundTagImpl; import com.denizenscript.denizen.objects.EntityTag; -import com.denizenscript.denizen.utilities.VanillaTagHelper; import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; @@ -17,12 +16,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.core.HolderSet; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.network.protocol.common.ClientboundUpdateTagsPacket; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; -import net.minecraft.tags.TagKey; -import net.minecraft.tags.TagNetworkSerialization; import net.minecraft.util.InclusiveRange; import net.minecraft.util.random.SimpleWeightedRandomList; import net.minecraft.world.entity.Entity; @@ -36,7 +30,6 @@ import net.minecraft.world.level.chunk.status.ChunkStatus; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.PushReaction; -import org.bukkit.Bukkit; import org.bukkit.Instrument; import org.bukkit.Location; import org.bukkit.Material; @@ -46,7 +39,6 @@ import org.bukkit.block.Skull; import org.bukkit.craftbukkit.v1_21_R2.CraftChunk; import org.bukkit.craftbukkit.v1_21_R2.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R2.CraftServer; import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; import org.bukkit.craftbukkit.v1_21_R2.block.CraftBlock; import org.bukkit.craftbukkit.v1_21_R2.block.CraftBlockEntityState; @@ -54,14 +46,12 @@ import org.bukkit.craftbukkit.v1_21_R2.block.CraftSkull; import org.bukkit.craftbukkit.v1_21_R2.entity.CraftEntity; import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R2.tag.CraftBlockTag; import org.bukkit.craftbukkit.v1_21_R2.util.CraftLocation; import org.bukkit.craftbukkit.v1_21_R2.util.CraftMagicNumbers; import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; import java.util.*; -import java.util.stream.Collectors; public class BlockHelperImpl implements BlockHelper { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakeArrowImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakeArrowImpl.java index 8307ab0986..0849ef83b9 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakeArrowImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakeArrowImpl.java @@ -4,7 +4,6 @@ import net.minecraft.world.entity.projectile.AbstractArrow; import org.bukkit.craftbukkit.v1_21_R2.CraftServer; import org.bukkit.craftbukkit.v1_21_R2.entity.CraftAbstractArrow; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftArrow; public class CraftFakeArrowImpl extends CraftAbstractArrow implements FakeArrow { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java index aa06fe9e30..5c12d55c84 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java @@ -5,7 +5,6 @@ import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import net.md_5.bungee.chat.ComponentSerializer; -import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundPlayerChatPacket; import net.minecraft.network.protocol.game.ClientboundSystemChatPacket; import org.bukkit.craftbukkit.v1_21_R2.util.CraftChatMessage; From 2a5ba73f6735325bfbf5666273a0ee8ca47d22e9 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Wed, 30 Oct 2024 12:11:08 -0700 Subject: [PATCH 078/280] add missing version check --- .../java/com/denizenscript/denizen/utilities/Utilities.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java index 4ccf7ae6d2..07307a21b1 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java @@ -563,7 +563,7 @@ public static ElementTag enumlikeToElement(Object val) { } public static T elementToEnumlike(ElementTag element, Class type) { - if (Keyed.class.isAssignableFrom(type)) { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && Keyed.class.isAssignableFrom(type)) { return (T) Bukkit.getRegistry((Class) type).get(parseNamespacedKey(element.asString())); } return (T) element.asEnum((Class) type); From d43598b7d8ba005c8318dd811c35c823a3fa66b4 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Mon, 11 Nov 2024 18:27:55 +0000 Subject: [PATCH 079/280] Interfacification fixes 2 (#2671) * `Biome` fixes * `Sound` fixes * `Art` fixes * Fixes from review --- .../denizen/events/BukkitScriptEvent.java | 30 +++++++++++++---- .../block/NoteBlockPlaysNoteScriptEvent.java | 8 ++++- .../player/BiomeEnterExitScriptEvent.java | 3 +- .../player/PlayerHearsSoundScriptEvent.java | 5 +-- .../denizen/nms/interfaces/EntityHelper.java | 15 ++++++--- .../denizen/objects/BiomeTag.java | 3 +- .../denizen/objects/EntityTag.java | 6 ++-- .../properties/entity/EntityPainting.java | 15 +++++---- .../commands/world/PlaySoundCommand.java | 11 ++++--- .../denizen/tags/core/ServerTagBase.java | 32 +++++++++++++++---- .../denizen/utilities/SoundLookup.java | 16 ---------- .../denizen/utilities/Utilities.java | 17 ++++++++++ .../nms/v1_17/helpers/EntityHelperImpl.java | 11 +++++++ .../nms/v1_18/helpers/EntityHelperImpl.java | 11 +++++++ .../nms/v1_19/helpers/EntityHelperImpl.java | 11 +++++++ .../nms/v1_20/helpers/EntityHelperImpl.java | 11 +++++++ 16 files changed, 153 insertions(+), 52 deletions(-) delete mode 100644 plugin/src/main/java/com/denizenscript/denizen/utilities/SoundLookup.java diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/BukkitScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/BukkitScriptEvent.java index e5ff12d2c4..84706cf66c 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/BukkitScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/BukkitScriptEvent.java @@ -11,6 +11,7 @@ import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; import com.denizenscript.denizen.utilities.inventory.SlotHelper; +import com.denizenscript.denizencore.events.ScriptEvent; import com.denizenscript.denizencore.flags.AbstractFlagTracker; import com.denizenscript.denizencore.flags.FlaggableObject; import com.denizenscript.denizencore.objects.ObjectTag; @@ -19,14 +20,13 @@ import com.denizenscript.denizencore.objects.notable.NoteManager; import com.denizenscript.denizencore.tags.TagContext; import com.denizenscript.denizencore.utilities.CoreConfiguration; +import com.denizenscript.denizencore.utilities.CoreUtilities; import com.denizenscript.denizencore.utilities.Deprecations; import com.denizenscript.denizencore.utilities.debugging.Debug; -import com.denizenscript.denizencore.events.ScriptEvent; -import com.denizenscript.denizencore.utilities.CoreUtilities; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.entity.*; +import org.bukkit.*; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Vehicle; import org.bukkit.event.*; import org.bukkit.event.inventory.InventoryType; import org.bukkit.plugin.EventExecutor; @@ -163,6 +163,24 @@ public static boolean couldMatchEnum(String text, final Enum[] enumVals) { return false; } + public static boolean couldMatchRegistry(String text, Registry registry) { + if (!isAdvancedMatchable(text)) { + if (registry.get(Utilities.parseNamespacedKey(text)) != null) { + return true; + } + addPossibleCouldMatchFailReason("Does not match required registry", text); + return false; + } + MatchHelper matcher = createMatcher(text); + for (Keyed value : registry) { + if (matcher.doesMatch(Utilities.namespacedKeyToString(value.getKey()))) { + return true; + } + } + addPossibleCouldMatchFailReason("Does not match required registry", text); + return false; + } + public static HashSet inventoryCouldMatchableText = new HashSet<>(List.of("inventory", "notable", "note", "gui")); public static HashSet inventoryCouldMatchPrefixes = new HashSet<>(List.of("inventory_flagged")); diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/block/NoteBlockPlaysNoteScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/block/NoteBlockPlaysNoteScriptEvent.java index e86e263f32..d0743dc37b 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/block/NoteBlockPlaysNoteScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/block/NoteBlockPlaysNoteScriptEvent.java @@ -1,7 +1,10 @@ package com.denizenscript.denizen.events.block; import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.LocationTag; +import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; import org.bukkit.Sound; @@ -56,6 +59,9 @@ public boolean matches(ScriptPath path) { } public Sound getSound() { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + return event.getInstrument().getSound(); + } switch (event.getInstrument()) { case PIANO: return Sound.BLOCK_NOTE_BLOCK_HARP; @@ -98,7 +104,7 @@ public ObjectTag getContext(String name) { switch (name) { case "location": return location; case "instrument": return new ElementTag(event.getInstrument()); - case "sound": return new ElementTag(getSound()); + case "sound": return Utilities.enumLikeToLegacyElement(getSound()); case "tone": return new ElementTag(event.getNote().getTone()); case "octave": return new ElementTag(event.getNote().getOctave()); case "sharp": return new ElementTag(event.getNote().isSharped()); diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/BiomeEnterExitScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/BiomeEnterExitScriptEvent.java index 6b63e5a183..5777f5e600 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/BiomeEnterExitScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/BiomeEnterExitScriptEvent.java @@ -9,6 +9,7 @@ import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; +import org.bukkit.Registry; import org.bukkit.block.Biome; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -59,7 +60,7 @@ public boolean couldMatch(ScriptPath path) { if (!super.couldMatch(path)) { return false; } - if (!path.eventArgLowerAt(2).equals("biome") && !couldMatchEnum(path.eventArgLowerAt(2), Biome.values())) { + if (!path.eventArgLowerAt(2).equals("biome") && !couldMatchRegistry(path.eventArgLowerAt(2), Registry.BIOME)) { return false; } return true; diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerHearsSoundScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerHearsSoundScriptEvent.java index 1462e86758..445e290a8d 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerHearsSoundScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerHearsSoundScriptEvent.java @@ -3,7 +3,7 @@ import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.LocationTag; -import com.denizenscript.denizen.utilities.SoundLookup; +import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; import com.denizenscript.denizen.utilities.packets.NetworkInterceptHelper; import com.denizenscript.denizencore.events.ScriptEvent; @@ -11,6 +11,7 @@ import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; import org.bukkit.Location; +import org.bukkit.Registry; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.Listener; @@ -95,7 +96,7 @@ public void destroy() { public ObjectTag getContext(String name) { switch (name) { case "sound_key": return new ElementTag(soundName); - case "sound_name": return isCustom ? null : new ElementTag(SoundLookup.keyToSound.get(soundName)); + case "sound_name": return isCustom ? null : Utilities.enumLikeToLegacyElement(Registry.SOUNDS.get(Utilities.parseNamespacedKey(soundName))); case "category": return new ElementTag(category); case "is_custom": return new ElementTag(isCustom); case "source_entity": return entity == null ? null : new EntityTag(entity); diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java index 7b63b179c1..39fcc47173 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java @@ -8,10 +8,7 @@ import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.MapTag; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.World; +import org.bukkit.*; import org.bukkit.attribute.Attribute; import org.bukkit.block.BlockFace; import org.bukkit.block.CreatureSpawner; @@ -34,6 +31,16 @@ public abstract class EntityHelper { public static Attribute ATTRIBUTE_STEP_HEIGHT = Utilities.findBestEnumlike(Attribute.class, "STEP_HEIGHT", "GENERIC_STEP_HEIGHT"); public static Attribute ATTRIBUTE_MOVEMENT_SPEED = Utilities.findBestEnumlike(Attribute.class, "MOVEMENT_SPEED", "GENERIC_MOVEMENT_SPEED"); + // TODO: once 1.21 is the minimum supported version, remove these + public int getBlockHeight(Art art) { + return art.getBlockHeight(); + } + + // TODO: once 1.21 is the minimum supported version, remove these + public int getBlockWidth(Art art) { + return art.getBlockWidth(); + } + public abstract void setInvisible(Entity entity, boolean invisible); public abstract boolean isInvisible(Entity entity); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/BiomeTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/BiomeTag.java index c10907b005..d0f02e6750 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/BiomeTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/BiomeTag.java @@ -21,6 +21,7 @@ import com.denizenscript.denizencore.tags.TagContext; import com.denizenscript.denizencore.utilities.CoreUtilities; import org.bukkit.Bukkit; +import org.bukkit.Keyed; import org.bukkit.World; import org.bukkit.block.Biome; import org.bukkit.entity.EntityType; @@ -98,7 +99,7 @@ public static boolean matches(String arg) { ///////////// public BiomeTag(Biome biome) { - this.biome = NMSHandler.instance.getBiomeNMS(Bukkit.getWorlds().get(0), biome.getKey()); + this.biome = NMSHandler.instance.getBiomeNMS(Bukkit.getWorlds().get(0), ((Keyed) biome).getKey()); } public BiomeTag(BiomeNMS biome) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java index 93125a477e..3960751466 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java @@ -877,7 +877,7 @@ else if (entity_type.getBukkitEntityType() == EntityType.PAINTING) { try { for (Mechanism mech : mechanisms) { if (mech.getName().equals("painting")) { - art = Art.valueOf(mech.getValue().asString().toUpperCase()); + art = Registry.ART.get(Utilities.parseNamespacedKey(mech.getValue().asString())); } else if (mech.getName().equals("rotation")) { face = BlockFace.valueOf(mech.getValue().asString().toUpperCase()); @@ -888,10 +888,10 @@ else if (mech.getName().equals("rotation")) { // ignore } if (art != null && face != null) { // Paintings are the worst - if (art.getBlockHeight() % 2 == 0) { + if (NMSHandler.entityHelper.getBlockHeight(art) % 2 == 0) { location.subtract(0, 1, 0); } - if (art.getBlockWidth() % 2 == 0) { + if (NMSHandler.entityHelper.getBlockWidth(art) % 2 == 0) { if (face == BlockFace.WEST) { location.subtract(0, 0, 1); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPainting.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPainting.java index 8862c73c69..40bfb503a0 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPainting.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPainting.java @@ -1,12 +1,15 @@ package com.denizenscript.denizen.objects.properties.entity; +import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.objects.EntityTag; -import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.properties.Property; import com.denizenscript.denizencore.tags.Attribute; import org.bukkit.Art; +import org.bukkit.Registry; import org.bukkit.entity.EntityType; import org.bukkit.entity.Painting; @@ -65,7 +68,7 @@ public ObjectTag getObjectAttribute(Attribute attribute) { // If the entity is a painting, returns its width. // --> if (attribute.startsWith("painting_width")) { - return new ElementTag(((Painting) painting.getBukkitEntity()).getArt().getBlockWidth()) + return new ElementTag(NMSHandler.entityHelper.getBlockWidth(((Painting) painting.getBukkitEntity()).getArt())) .getObjectAttribute(attribute.fulfill(1)); } @@ -78,7 +81,7 @@ public ObjectTag getObjectAttribute(Attribute attribute) { // If the entity is a painting, returns its height. // --> if (attribute.startsWith("painting_height")) { - return new ElementTag(((Painting) painting.getBukkitEntity()).getArt().getBlockHeight()) + return new ElementTag(NMSHandler.entityHelper.getBlockHeight(((Painting) painting.getBukkitEntity()).getArt())) .getObjectAttribute(attribute.fulfill(1)); } @@ -92,7 +95,7 @@ public ObjectTag getObjectAttribute(Attribute attribute) { // See also <@link tag server.art_types>. // --> if (attribute.startsWith("painting")) { - return new ElementTag(((Painting) painting.getBukkitEntity()).getArt()) + return Utilities.enumlikeToElement(((Painting) painting.getBukkitEntity()).getArt()) .getObjectAttribute(attribute.fulfill(1)); } @@ -112,8 +115,8 @@ public void adjust(Mechanism mechanism) { // // // --> - if (mechanism.matches("painting") && mechanism.requireEnum(Art.class)) { - Art art = Art.valueOf(mechanism.getValue().asString().toUpperCase()); + if (mechanism.matches("painting") && Utilities.requireEnumlike(mechanism, Art.class)) { + Art art = Registry.ART.get(Utilities.parseNamespacedKey(mechanism.getValue().asString())); if (((Painting) painting.getBukkitEntity()).getArt() != art) { ((Painting) painting.getBukkitEntity()).setArt(art, true); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/PlaySoundCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/PlaySoundCommand.java index 8c46c7804f..43d37aa1b6 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/PlaySoundCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/PlaySoundCommand.java @@ -4,6 +4,7 @@ import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.objects.PlayerTag; +import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizencore.exceptions.InvalidArgumentsException; import com.denizenscript.denizencore.objects.Argument; import com.denizenscript.denizencore.objects.core.ElementTag; @@ -74,7 +75,7 @@ public PlaySoundCommand() { @Override public void addCustomTabCompletions(TabCompletionsBuilder tab) { - tab.addWithPrefix("sound:", Sound.values()); + tab.addWithPrefix("sound:", Utilities.listTypes(Sound.class)); } @Override @@ -133,7 +134,7 @@ public void execute(ScriptEntry scriptEntry) { } else { for (LocationTag location : locations) { - location.getWorld().playSound(location, Sound.valueOf(sound.toUpperCase()), categoryEnum, volume, pitch); + location.getWorld().playSound(location, Utilities.elementToEnumlike(soundElement, Sound.class), categoryEnum, volume, pitch); } } } @@ -144,7 +145,7 @@ else if (locations != null) { player.getPlayerEntity().playSound(location, sound, categoryEnum, volume, pitch); } else { - player.getPlayerEntity().playSound(location, Sound.valueOf(sound.toUpperCase()), categoryEnum, volume, pitch); + player.getPlayerEntity().playSound(location, Utilities.elementToEnumlike(soundElement, Sound.class), categoryEnum, volume, pitch); } } } @@ -156,10 +157,10 @@ else if (locations != null) { } else { if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_18)) { - player.getPlayerEntity().playSound(player.getPlayerEntity(), Sound.valueOf(sound.toUpperCase()), categoryEnum, volume, pitch); + player.getPlayerEntity().playSound(player.getPlayerEntity(), Utilities.elementToEnumlike(soundElement, Sound.class), categoryEnum, volume, pitch); } else { - player.getPlayerEntity().playSound(player.getLocation(), Sound.valueOf(sound.toUpperCase()), categoryEnum, volume, pitch); + player.getPlayerEntity().playSound(player.getLocation(), Utilities.elementToEnumlike(soundElement, Sound.class), categoryEnum, volume, pitch); } } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/tags/core/ServerTagBase.java b/plugin/src/main/java/com/denizenscript/denizen/tags/core/ServerTagBase.java index a379d8e1f4..b35bf1c68d 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/tags/core/ServerTagBase.java +++ b/plugin/src/main/java/com/denizenscript/denizen/tags/core/ServerTagBase.java @@ -731,14 +731,14 @@ else if (param.shouldBeType(EntityTag.class)) { // @attribute // @returns ListTag(BiomeTag) // @description - // Returns a list of all biomes known to the server. + // Returns a list of all biomes known to the server, including custom added ones. // Generally used with <@link objecttype BiomeTag>. - // This is based on Bukkit Biome enum, as seen at <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/block/Biome.html>. + // See <@link url https://minecraft.wiki/w/Biome#List_of_biomes> for a list of all default (vanilla) biomes. // --> tagProcessor.registerStaticTag(ListTag.class, "biome_types", (attribute, object) -> { listDeprecateWarn(attribute); ListTag biomes = new ListTag(); - for (Biome biome : Biome.values()) { + for (Biome biome : Registry.BIOME) { BiomeTag biomeTag = new BiomeTag(biome); if (biomeTag.getBiome() != null) { biomes.addObject(biomeTag); @@ -821,12 +821,30 @@ else if (param.shouldBeType(EntityTag.class)) { // <--[tag] // @attribute // @returns ListTag + // @deprecated Use 'server.sound_keys' on MC 1.21+. // @description - // Returns a list of all sounds known to the server. - // Generally used with <@link command playsound>. - // This is only their Bukkit enum names, as seen at <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Sound.html>. + // Deprecated in favor of <@link tag server.sound_keys> on MC 1.21+. // --> - registerEnumListTag("sound_types", Sound.class, "list_sounds"); + tagProcessor.registerStaticTag(ListTag.class, "sound_types", (attribute, object) -> { + listDeprecateWarn(attribute); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + BukkitImplDeprecations.oldSpigotNames.warn(attribute.context); + } + return Utilities.listLegacyTypes(Sound.class); + }, "list_sounds"); + + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + + // <--[tag] + // @attribute + // @returns ListTag + // @description + // Returns a list of the keys/names of all sounds known to the server. + // --> + tagProcessor.registerStaticTag(ListTag.class, "sound_keys", (attribute, object) -> { + return Utilities.registryKeys(Registry.SOUNDS); + }); + } // <--[tag] // @attribute diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/SoundLookup.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/SoundLookup.java deleted file mode 100644 index 12506ae8dd..0000000000 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/SoundLookup.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.denizenscript.denizen.utilities; - -import org.bukkit.Sound; - -import java.util.HashMap; - -public class SoundLookup { - - public static HashMap keyToSound = new HashMap<>(); - - static { - for (Sound sound : Sound.values()) { - keyToSound.put(sound.getKey().getKey(), sound); - } - } -} diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java index 07307a21b1..6f8b66c1f2 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java @@ -33,6 +33,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.*; import org.bukkit.util.BoundingBox; +import org.bukkit.util.OldEnum; import org.bukkit.util.Vector; import java.io.File; @@ -552,6 +553,11 @@ public static ListTag listTypes(Class type) { return new ListTag(Arrays.asList(((Class>) type).getEnumConstants()), ElementTag::new); } + public static ListTag listLegacyTypes(Class type) { + List types = NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) ? Bukkit.getRegistry(type).stream().toList() : Arrays.asList(type.getEnumConstants()); + return new ListTag(types, Utilities::enumLikeToLegacyElement); + } + public static ElementTag enumlikeToElement(Object val) { if (val instanceof Enum) { return new ElementTag(((Enum) val).name()); @@ -562,6 +568,17 @@ public static ElementTag enumlikeToElement(Object val) { return new ElementTag(val.toString()); } + public static ElementTag enumLikeToLegacyElement(Object val) { + if (val instanceof Enum enumVal) { + return new ElementTag(enumVal); + } + if (val instanceof OldEnum oldEnumVal) { + return new ElementTag(oldEnumVal.name(), true); + } + throw new UnsupportedOperationException("Cannot get legacy name element, value isn't an enum: " + val); + } + + // TODO: need proper input backsupport, see https://discord.com/channels/315163488085475337/1011496047811506227/1301272242386370580 public static T elementToEnumlike(ElementTag element, Class type) { if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && Keyed.class.isAssignableFrom(type)) { return (T) Bukkit.getRegistry((Class) type).get(parseNamespacedKey(element.asString())); diff --git a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/EntityHelperImpl.java b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/EntityHelperImpl.java index 76dd4081bc..85ef1a2cc4 100644 --- a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/EntityHelperImpl.java +++ b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/EntityHelperImpl.java @@ -40,6 +40,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; +import org.bukkit.Art; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.attribute.Attribute; @@ -73,6 +74,16 @@ public class EntityHelperImpl extends EntityHelper { public static final EntityDataAccessor ENTITY_ENDERMAN_DATAWATCHER_SCREAMING = ReflectionHelper.getFieldValue(EnderMan.class, ReflectionMappingsInfo.EnderMan_DATA_CREEPY, null); + @Override + public int getBlockHeight(Art art) { + return art.getBlockHeight(); + } + + @Override + public int getBlockWidth(Art art) { + return art.getBlockWidth(); + } + @Override public void setInvisible(Entity entity, boolean invisible) { ((CraftEntity) entity).getHandle().setInvisible(invisible); diff --git a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/EntityHelperImpl.java b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/EntityHelperImpl.java index 4668d1b31a..73b32add4d 100644 --- a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/EntityHelperImpl.java +++ b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/EntityHelperImpl.java @@ -47,6 +47,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; +import org.bukkit.Art; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.attribute.Attribute; @@ -80,6 +81,16 @@ public class EntityHelperImpl extends EntityHelper { public static final EntityDataAccessor ENTITY_ENDERMAN_DATAWATCHER_SCREAMING = ReflectionHelper.getFieldValue(EnderMan.class, ReflectionMappingsInfo.EnderMan_DATA_CREEPY, null); + @Override + public int getBlockHeight(Art art) { + return art.getBlockHeight(); + } + + @Override + public int getBlockWidth(Art art) { + return art.getBlockWidth(); + } + @Override public void setInvisible(Entity entity, boolean invisible) { ((CraftEntity) entity).getHandle().setInvisible(invisible); diff --git a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/EntityHelperImpl.java b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/EntityHelperImpl.java index 3269e40f9f..bfe4f5c49a 100644 --- a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/EntityHelperImpl.java +++ b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/EntityHelperImpl.java @@ -54,6 +54,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; +import org.bukkit.Art; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; @@ -89,6 +90,16 @@ public class EntityHelperImpl extends EntityHelper { public static final EntityDataAccessor ENTITY_ENDERMAN_DATAWATCHER_SCREAMING = ReflectionHelper.getFieldValue(EnderMan.class, ReflectionMappingsInfo.EnderMan_DATA_CREEPY, null); + @Override + public int getBlockHeight(Art art) { + return art.getBlockHeight(); + } + + @Override + public int getBlockWidth(Art art) { + return art.getBlockWidth(); + } + @Override public void setInvisible(Entity entity, boolean invisible) { ((CraftEntity) entity).getHandle().setInvisible(invisible); diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java index 0822fa3036..925f2a7643 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java @@ -58,6 +58,7 @@ import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; +import org.bukkit.Art; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; @@ -92,6 +93,16 @@ public class EntityHelperImpl extends EntityHelper { public static final EntityDataAccessor ENDERMAN_DATA_ACCESSOR_SCREAMING = ReflectionHelper.getFieldValue(EnderMan.class, ReflectionMappingsInfo.EnderMan_DATA_CREEPY, null); + @Override + public int getBlockHeight(Art art) { + return art.getBlockHeight(); + } + + @Override + public int getBlockWidth(Art art) { + return art.getBlockWidth(); + } + @Override public void setInvisible(Entity entity, boolean invisible) { ((CraftEntity) entity).getHandle().setInvisible(invisible); From 8c0a1a5ef48d93e0c3773381c439bd892cc2f52f Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Wed, 13 Nov 2024 13:01:06 -0800 Subject: [PATCH 080/280] minor cleanup of some old code --- .../denizen/utilities/debugging/DebugSubmit.java | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/debugging/DebugSubmit.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/debugging/DebugSubmit.java index 6c72100733..9a0335b6f1 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/debugging/DebugSubmit.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/debugging/DebugSubmit.java @@ -13,33 +13,19 @@ import org.bukkit.plugin.Plugin; import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.List; import java.util.UUID; -import java.util.function.Supplier; /** * Spigot helper for the core DebugSubmitter. */ public class DebugSubmit { - @Deprecated - public static List> additionalDebugLines = new ArrayList<>(); - public static void init() { DebugSubmitter.pasteTitleGetter = () -> "Denizen Debug Logs From " + ChatColor.stripColor(Bukkit.getServer().getMotd()); DebugSubmitter.debugHeaderLines.add(DebugSubmit::getCoreHeader); - DebugSubmitter.debugHeaderLines.addAll(additionalDebugLines); - additionalDebugLines.clear(); } public static String getCoreHeader() { - if (!DebugSubmitter.debugHeaderLines.isEmpty()) { - Bukkit.getScheduler().scheduleSyncDelayedTask(Denizen.instance, () -> { - DebugSubmitter.debugHeaderLines.addAll(additionalDebugLines); - additionalDebugLines.clear(); - }, 0); - } try { // Build a list of plugins StringBuilder pluginlist = new StringBuilder(); From 4f0dd051081c8e2ee6106650d9674c6a7bedd9f2 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Wed, 13 Nov 2024 13:01:45 -0800 Subject: [PATCH 081/280] TradeTag: construct with Dirt default result and no ingredients the air options break on paper for some reason. Only paper, not spigot. --- .../java/com/denizenscript/denizen/objects/TradeTag.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/TradeTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/TradeTag.java index e38785d17e..c1d695e288 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/TradeTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/TradeTag.java @@ -12,8 +12,6 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.MerchantRecipe; -import java.util.Collections; - public class TradeTag implements ObjectTag, Adjustable { // <--[ObjectType] @@ -71,8 +69,7 @@ public static boolean matches(String str) { public TradeTag(MerchantRecipe recipe) { if (recipe == null) { - recipe = new MerchantRecipe(new ItemStack(Material.AIR), 0); - recipe.setIngredients(Collections.singletonList(new ItemStack(Material.AIR))); + recipe = new MerchantRecipe(new ItemStack(Material.DIRT), 0); // Dirt instead of air because Paper will get upset at air } this.recipe = recipe; } From 3651dcbb4d74bcb8630e1eea62d5300c0da26acf Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Wed, 13 Nov 2024 13:16:24 -0800 Subject: [PATCH 082/280] fix offline player inventory via fake player the entire fake player object exists just to fill the dang 'registryAccess' var, argh --- .../v1_21/impl/ImprovedOfflinePlayerImpl.java | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java index fd68b685cd..9923cfd7bf 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java @@ -4,16 +4,26 @@ import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; import com.denizenscript.denizen.nms.v1_21.impl.jnbt.CompoundTagImpl; import com.denizenscript.denizencore.utilities.debugging.Debug; +import com.mojang.authlib.GameProfile; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NbtAccounter; import net.minecraft.nbt.NbtIo; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ClientInformation; +import net.minecraft.server.level.ParticleStatus; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.HumanoidArm; import net.minecraft.world.entity.ai.attributes.AttributeInstance; import net.minecraft.world.entity.ai.attributes.AttributeMap; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.attributes.DefaultAttributes; +import net.minecraft.world.entity.player.ChatVisiblity; import net.minecraft.world.inventory.PlayerEnderChestContainer; import org.bukkit.Bukkit; +import org.bukkit.World; import org.bukkit.craftbukkit.v1_21_R2.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R2.CraftServer; +import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftInventoryPlayer; import org.bukkit.entity.HumanEntity; @@ -55,10 +65,23 @@ public HumanEntity getHolder() { } } + public static ServerPlayer fakeNmsPlayer; + + public static ServerPlayer getFakeNmsPlayer() { + if (fakeNmsPlayer == null) { + MinecraftServer server = ((CraftServer)Bukkit.getServer()).getServer(); + World world = Bukkit.getWorlds().getFirst(); + GameProfile fakeProfile = new GameProfile(new UUID(0, 0xABC123), "fakeplayer"); + ClientInformation fakeClientInfo = new ClientInformation("en", 0, ChatVisiblity.HIDDEN, false, 0, HumanoidArm.LEFT, true, false, ParticleStatus.MINIMAL); + fakeNmsPlayer = new ServerPlayer(server, ((CraftWorld) world).getHandle(), fakeProfile, fakeClientInfo); + } + return fakeNmsPlayer; + } + @Override public org.bukkit.inventory.PlayerInventory getInventory() { if (inventory == null) { - net.minecraft.world.entity.player.Inventory newInv = new OfflinePlayerInventory(null); + net.minecraft.world.entity.player.Inventory newInv = new OfflinePlayerInventory(getFakeNmsPlayer()); newInv.load(((CompoundTagImpl) this.compound).toNMSTag().getList("Inventory", 10)); inventory = new OfflineCraftInventoryPlayer(newInv); } From e78e4d705bac182cb3ed55372cd602029a1a593c Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Wed, 13 Nov 2024 13:22:13 -0800 Subject: [PATCH 083/280] fix locationtag.skull_skin on 1.21 --- .../denizen/nms/v1_21/helpers/BlockHelperImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java index bf94a048e6..3e9a243678 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java @@ -99,7 +99,7 @@ public PlayerProfile getPlayerProfile(Skull skull) { public void setPlayerProfile(Skull skull, PlayerProfile playerProfile) { GameProfile gameProfile = ProfileEditorImpl.getGameProfile(playerProfile); try { - craftSkull_profile.set(skull, gameProfile); + craftSkull_profile.set(skull, new ResolvableProfile(gameProfile)); } catch (Throwable ex) { Debug.echoError(ex); From 2a923dda74267ae783bf823457cc9905e0318998 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Wed, 13 Nov 2024 14:15:15 -0800 Subject: [PATCH 084/280] fix empty edit_sign --- .../denizen/nms/v1_21/helpers/PacketHelperImpl.java | 7 ++++++- .../impl/network/handlers/DenizenPacketListenerImpl.java | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java index ed7fcdd24b..b2e3d540be 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java @@ -6,6 +6,7 @@ import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; import com.denizenscript.denizen.nms.v1_21.impl.SidebarImpl; import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.scripts.commands.entity.TeleportCommand; import com.denizenscript.denizen.utilities.FormattedTextHelper; import com.denizenscript.denizen.utilities.Utilities; @@ -45,6 +46,7 @@ import org.bukkit.Bukkit; import org.bukkit.EntityEffect; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.block.Sign; import org.bukkit.block.sign.Side; import org.bukkit.block.sign.SignSide; @@ -175,7 +177,7 @@ public void showMobHealth(Player player, LivingEntity mob, double health, double } @Override - public void showSignEditor(Player player, Location location) { + public void showSignEditor(Player player, Location location) { // TODO: MC 1.18: once 1.18 is removed, remove 'location' arg NetworkInterceptHelper.enable(); Sign sign = null; BlockPos toOpen = null; @@ -200,6 +202,9 @@ public void showSignEditor(Player player, Location location) { } player.sendBlockUpdate(sign.getLocation(), sign); } + else { + player.sendBlockChange(new LocationTag(player.getWorld(), toOpen.getX(), toOpen.getY(), toOpen.getZ()), Material.OAK_WALL_SIGN.createBlockData()); + } DenizenNetworkManagerImpl.getNetworkManager(player).packetListener.fakeSignExpected = toOpen; send(player, new ClientboundOpenSignEditorPacket(toOpen, true)); } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java index ebbec85d6e..b1b915ac03 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java @@ -96,6 +96,8 @@ public void handleCustomPayload(ServerboundCustomPayloadPacket packet) { @Override public void handleSignUpdate(ServerboundSignUpdatePacket packet) { if (fakeSignExpected != null && packet.getPos().equals(fakeSignExpected)) { + LocationTag loc = new LocationTag(player.getBukkitEntity().getWorld(), fakeSignExpected.getX(), fakeSignExpected.getY(), fakeSignExpected.getZ()); + this.connection.send(new ClientboundBlockUpdatePacket(player.level(), fakeSignExpected)); PlayerChangesSignScriptEvent evt = (PlayerChangesSignScriptEvent) PlayerChangesSignScriptEvent.instance.clone(); evt.material = new MaterialTag(org.bukkit.Material.OAK_WALL_SIGN); evt.location = new LocationTag(player.getBukkitEntity().getLocation()); From c0dfae0d3682e90ff2ab1f490d1410bb3bc04dea Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Thu, 14 Nov 2024 12:39:22 +0000 Subject: [PATCH 085/280] Unhandled item components persistence (#2648) * Raw components Alpha release 0.1-dev * Small meta fix * More internal property registrations * Provide registry context in serialization * More custom component filtering * `PerIdPropertyDataRemover` for generic handling * Spawner handling * Last few properties * Persist some spawner data for now * Tad bit less NMS * Naming * Registry context in patch deserialization * Very important fix * Add meta * Rename to `components_patch` * Minor final cleanups --- .../denizen/nms/interfaces/ItemHelper.java | 12 +- .../objects/properties/PropertyRegistry.java | 89 +++++----- .../objects/properties/item/ItemColor.java | 7 +- .../properties/item/ItemComponentsPatch.java | 152 ++++++++++++++++++ .../nms/v1_20/helpers/ItemHelperImpl.java | 48 ++++++ .../nms/v1_21/helpers/ItemHelperImpl.java | 48 ++++++ 6 files changed, 312 insertions(+), 44 deletions(-) create mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemComponentsPatch.java diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java index 75e98eb955..0c35cea09e 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java @@ -6,6 +6,7 @@ import com.denizenscript.denizen.nms.util.jnbt.Tag; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.utilities.nbt.CustomNBT; +import com.denizenscript.denizencore.objects.core.MapTag; import org.bukkit.DyeColor; import org.bukkit.Material; import org.bukkit.NamespacedKey; @@ -23,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.function.Consumer; public abstract class ItemHelper { @@ -105,7 +107,15 @@ public ItemStack setCanBreak(ItemStack item, List canBreak) { // TODO: } return CustomNBT.setNBTMaterials(item, CustomNBT.KEY_CAN_DESTROY, canBreak); } - + + public MapTag getRawComponentsPatch(ItemStack item, boolean excludeHandled) { + throw new UnsupportedOperationException(); + } + + public ItemStack setRawComponentsPatch(ItemStack item, MapTag rawComponentsMap, int dataVersion, Consumer errorHandler) { + throw new UnsupportedOperationException(); + } + public abstract void registerSmithingRecipe(String keyName, ItemStack result, ItemStack[] baseItem, boolean baseExact, ItemStack[] upgradeItem, boolean upgradeExact, ItemStack[] templateItem, boolean templateExact); public abstract void setInventoryItem(Inventory inventory, ItemStack item, int slot); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java index 529ea7aa35..829f50e409 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java @@ -9,6 +9,7 @@ import com.denizenscript.denizen.objects.properties.item.*; import com.denizenscript.denizen.objects.properties.material.*; import com.denizenscript.denizen.objects.properties.trade.*; +import com.denizenscript.denizencore.objects.properties.Property; import com.denizenscript.denizencore.objects.properties.PropertyParser; public class PropertyRegistry { @@ -203,62 +204,63 @@ public static void registerMainProperties() { PropertyParser.registerProperty(InventoryUniquifier.class, InventoryTag.class); // register core ItemTag properties - PropertyParser.registerProperty(ItemArmorPose.class, ItemTag.class); - PropertyParser.registerProperty(ItemAttributeModifiers.class, ItemTag.class); + PropertyParser.registerProperty(ItemArmorPose.class, ItemTag.class); // Special case handling in ItemComponentsPatch + registerItemProperty(ItemAttributeModifiers.class, "attribute_modifiers"); PropertyParser.registerProperty(ItemAttributeNBT.class, ItemTag.class); - PropertyParser.registerProperty(ItemBaseColor.class, ItemTag.class); - PropertyParser.registerProperty(ItemBlockMaterial.class, ItemTag.class); - PropertyParser.registerProperty(ItemBook.class, ItemTag.class); - PropertyParser.registerProperty(ItemBookGeneration.class, ItemTag.class); - PropertyParser.registerProperty(ItemDisplayname.class, ItemTag.class); - PropertyParser.registerProperty(ItemDurability.class, ItemTag.class); - PropertyParser.registerProperty(ItemCanDestroy.class, ItemTag.class); - PropertyParser.registerProperty(ItemCanPlaceOn.class, ItemTag.class); - PropertyParser.registerProperty(ItemColor.class, ItemTag.class); + registerItemProperty(ItemBaseColor.class, "base_color"); + registerItemProperty(ItemBlockMaterial.class, "block_state"); + registerItemProperty(ItemBook.class, "writable_book_content", "written_book_content"); + PropertyParser.registerProperty(ItemBookGeneration.class, ItemTag.class); // Part of "written_book_content" + registerItemProperty(ItemDisplayname.class, "custom_name"); + registerItemProperty(ItemDurability.class, "damage"); + registerItemProperty(ItemCanDestroy.class, "can_break"); + PropertyParser.registerProperty(ItemCanPlaceOn.class, ItemTag.class); // Let "can_place_on" through, this doesn't cover the entire component + registerItemProperty(ItemColor.class, "dyed_color", "map_color"); // Potion color included in ItemPotion's "potion_contents" if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { - PropertyParser.registerProperty(ItemCustomData.class, ItemTag.class); + PropertyParser.registerProperty(ItemComponentsPatch.class, ItemTag.class); + registerItemProperty(ItemCustomData.class, "custom_data"); } - PropertyParser.registerProperty(ItemCustomModel.class, ItemTag.class); - PropertyParser.registerProperty(ItemChargedProjectile.class, ItemTag.class); - PropertyParser.registerProperty(ItemEnchantments.class, ItemTag.class); - PropertyParser.registerProperty(ItemFirework.class, ItemTag.class); + registerItemProperty(ItemCustomModel.class, "custom_model_data"); + registerItemProperty(ItemChargedProjectile.class, "charged_projectiles"); + registerItemProperty(ItemEnchantments.class, "enchantments", "stored_enchantments"); + registerItemProperty(ItemFirework.class, "fireworks", "firework_explosion"); PropertyParser.registerProperty(ItemFlags.class, ItemTag.class); - PropertyParser.registerProperty(ItemFrameInvisible.class, ItemTag.class); - PropertyParser.registerProperty(ItemHidden.class, ItemTag.class); + PropertyParser.registerProperty(ItemFrameInvisible.class, ItemTag.class); // Special case handling in ItemComponentsPatch + PropertyParser.registerProperty(ItemHidden.class, ItemTag.class); // Relevant components control their own hiding internally if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { - PropertyParser.registerProperty(ItemInstrument.class, ItemTag.class); + PropertyParser.registerProperty(ItemInstrument.class, ItemTag.class); // Special case handling in ItemComponentsPatch } - PropertyParser.registerProperty(ItemInventoryContents.class, ItemTag.class); - PropertyParser.registerProperty(ItemKnowledgeBookRecipes.class, ItemTag.class); - PropertyParser.registerProperty(ItemLock.class, ItemTag.class); - PropertyParser.registerProperty(ItemLodestoneLocation.class, ItemTag.class); - PropertyParser.registerProperty(ItemLodestoneTracked.class, ItemTag.class); - PropertyParser.registerProperty(ItemLore.class, ItemTag.class); - PropertyParser.registerProperty(ItemMap.class, ItemTag.class); + registerItemProperty(ItemInventoryContents.class, "container", "bundle_contents"); + registerItemProperty(ItemKnowledgeBookRecipes.class, "recipes"); + registerItemProperty(ItemLock.class, "lock"); + registerItemProperty(ItemLodestoneLocation.class, "lodestone_tracker"); + registerItemProperty(ItemLodestoneTracked.class, "lodestone_tracker"); + registerItemProperty(ItemLore.class, "lore"); + registerItemProperty(ItemMap.class, "map_id"); PropertyParser.registerProperty(ItemNBT.class, ItemTag.class); - PropertyParser.registerProperty(ItemPatterns.class, ItemTag.class); + registerItemProperty(ItemPatterns.class, "banner_patterns"); if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_19)) { - PropertyParser.registerProperty(ItemPotion.class, ItemTag.class); + registerItemProperty(ItemPotion.class, "potion_contents"); } PropertyParser.registerProperty(ItemQuantity.class, ItemTag.class); PropertyParser.registerProperty(ItemRawNBT.class, ItemTag.class); - PropertyParser.registerProperty(ItemRepairCost.class, ItemTag.class); + registerItemProperty(ItemRepairCost.class, "repair_cost"); PropertyParser.registerProperty(ItemScript.class, ItemTag.class); - PropertyParser.registerProperty(ItemSignContents.class, ItemTag.class); + PropertyParser.registerProperty(ItemSignContents.class, ItemTag.class); // Special case handling in ItemComponentsPatch if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { - PropertyParser.registerProperty(ItemSignIsWaxed.class, ItemTag.class); + PropertyParser.registerProperty(ItemSignIsWaxed.class, ItemTag.class); // Special case handling in ItemComponentsPatch } - PropertyParser.registerProperty(ItemSkullskin.class, ItemTag.class); - PropertyParser.registerProperty(ItemSpawnerCount.class, ItemTag.class); - PropertyParser.registerProperty(ItemSpawnerDelay.class, ItemTag.class); - PropertyParser.registerProperty(ItemSpawnerMaxNearbyEntities.class, ItemTag.class); - PropertyParser.registerProperty(ItemSpawnerPlayerRange.class, ItemTag.class); - PropertyParser.registerProperty(ItemSpawnerRange.class, ItemTag.class); - PropertyParser.registerProperty(ItemSpawnerType.class, ItemTag.class); + registerItemProperty(ItemSkullskin.class, "profile"); + PropertyParser.registerProperty(ItemSpawnerCount.class, ItemTag.class); // Special case handling in ItemComponentsPatch + PropertyParser.registerProperty(ItemSpawnerDelay.class, ItemTag.class); // Special case handling in ItemComponentsPatch + PropertyParser.registerProperty(ItemSpawnerMaxNearbyEntities.class, ItemTag.class); // Special case handling in ItemComponentsPatch + PropertyParser.registerProperty(ItemSpawnerPlayerRange.class, ItemTag.class); // Special case handling in ItemComponentsPatch + PropertyParser.registerProperty(ItemSpawnerRange.class, ItemTag.class); // Special case handling in ItemComponentsPatch + PropertyParser.registerProperty(ItemSpawnerType.class, ItemTag.class); // Special case handling in ItemComponentsPatch if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { - PropertyParser.registerProperty(ItemTrim.class, ItemTag.class); + registerItemProperty(ItemTrim.class, "trim"); } - PropertyParser.registerProperty(ItemUnbreakable.class, ItemTag.class); + registerItemProperty(ItemUnbreakable.class, "unbreakable"); // register core MaterialTag properties PropertyParser.registerProperty(MaterialAge.class, MaterialTag.class); @@ -306,4 +308,11 @@ public static void registerMainProperties() { PropertyParser.registerProperty(TradeUses.class, TradeTag.class); PropertyParser.registerProperty(TradeVillagerXP.class, TradeTag.class); } + + public static void registerItemProperty(Class propertyClass, String... internalComponents) { + PropertyParser.registerProperty(propertyClass, ItemTag.class); + for (String internalComponent : internalComponents) { + ItemComponentsPatch.registerHandledComponent(internalComponent); + } + } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemColor.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemColor.java index cbd4b18a83..29feaa1250 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemColor.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemColor.java @@ -17,9 +17,10 @@ public class ItemColor extends ItemProperty { // @name color // @input ColorTag // @description - // The color of a leather armor, potion, filled map, or tipped arrow item. - // For the tag: will return a white <@link objecttype ColorTag> if the given potion item doesn't have a color. - // For the tag: will return null if the given map item doesn't have a color. + // Controls the color of a leather armor, potion, filled map, or tipped arrow item. + // @tag + // For potions, will return a white <@link objecttype ColorTag> if the given item doesn't have a color. + // For maps, will return null if the given item doesn't have a color. // --> public static boolean describes(ItemTag item) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemComponentsPatch.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemComponentsPatch.java new file mode 100644 index 0000000000..413834c3b8 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemComponentsPatch.java @@ -0,0 +1,152 @@ +package com.denizenscript.denizen.objects.properties.item; + +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.objects.core.MapTag; +import com.denizenscript.denizencore.objects.properties.PropertyParser; +import com.denizenscript.denizencore.utilities.text.StringHolder; +import org.bukkit.Keyed; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public class ItemComponentsPatch extends ItemProperty { + + // <--[property] + // @object ItemTag + // @name components_patch + // @input MapTag + // @description + // Controls the item's internal component patch. That is, the changes in components on top of the item type's default components. + // The map is in <@link language Raw NBT Encoding> format. + // This is mainly intended for item data persistence, and scripts should prefer using proper item properties instead of setting raw data directly. + // If you're trying to control custom data (such as data set by other plugins), use <@link property ItemTag.custom_data>. + // @tag + // Note that this is just data that isn't already controlled by other ItemTag properties, see <@link tag ItemTag.full_components_patch> for the complete component patch. + // @warning + // Due to this being a direct representation of internal data, compatibility for script usage across versions is not guaranteed. + // --> + + public static final String DATA_VERSION_KEY = "denizen:__data_version"; + public static final PerIdPropertyDataRemover ENTITY_DATA_REMOVER = new PerIdPropertyDataRemover("minecraft:entity_data"); + public static final PerIdPropertyDataRemover BLOCK_ENTITY_DATA_REMOVER = new PerIdPropertyDataRemover("minecraft:block_entity_data"); + public static final StringHolder INSTRUMENT_COMPONENT = new StringHolder("minecraft:instrument"); + public static final Set propertyHandledComponents = new HashSet<>(); + + public static void registerHandledComponent(String component) { + propertyHandledComponents.add("minecraft:" + component); + } + + static { + ENTITY_DATA_REMOVER.registerRemoval(EntityType.ITEM_FRAME, "Invisible"); + ENTITY_DATA_REMOVER.registerRemoval(EntityType.ARMOR_STAND, "Pose", "Small", "NoBasePlate", "Marker", "Invisible", "ShowArms"); + BLOCK_ENTITY_DATA_REMOVER.registerRemoval("minecraft:sign", "front_text", "back_text", "is_waxed"); + BLOCK_ENTITY_DATA_REMOVER.registerRemoval("minecraft:hanging_sign", "front_text", "back_text", "is_waxed"); + BLOCK_ENTITY_DATA_REMOVER.registerRemoval("minecraft:spawner", + "SpawnCount", "Delay", "MinSpawnDelay", "MaxSpawnDelay", "MaxNearbyEntities", "RequiredPlayerRange", "SpawnRange" +// , "SpawnData", "SpawnPotentials" TODO: needs proper property support + ); + } + + public static boolean describes(ItemTag item) { + return item.getBukkitMaterial() != Material.AIR; + } + + @Override + public MapTag getPropertyValue() { + MapTag rawComponents = NMSHandler.itemHelper.getRawComponentsPatch(getItemStack(), true); + if (rawComponents.isEmpty()) { + return rawComponents; + } + ENTITY_DATA_REMOVER.removeFrom(rawComponents); + BLOCK_ENTITY_DATA_REMOVER.removeFrom(rawComponents); + rawComponents.map.computeIfPresent(INSTRUMENT_COMPONENT, (key, value) -> value instanceof ElementTag ? null : value); + if (rawComponents.size() == 1) { // Just the data version + return new MapTag(); + } + return rawComponents; + } + + @Override + public boolean isDefaultValue(MapTag value) { + return value.isEmpty(); + } + + @Override + public void setPropertyValue(MapTag value, Mechanism mechanism) { + ElementTag dataVersionInput = value.getElement(DATA_VERSION_KEY); + int dataVersion; + if (dataVersionInput == null) { + dataVersion = Integer.MAX_VALUE; + } + else if (!dataVersionInput.isInt()) { + mechanism.echoError("Invalid data version '" + dataVersionInput + "' specified: must be a valid non-decimal number."); + return; + } + else { + dataVersion = dataVersionInput.asInt(); + value.remove(DATA_VERSION_KEY); + } + setItemStack(NMSHandler.itemHelper.setRawComponentsPatch(getItemStack(), value, dataVersion, mechanism::echoError)); + } + + @Override + public String getPropertyId() { + return "components_patch"; + } + + public static void register() { + autoRegister("components_patch", ItemComponentsPatch.class, MapTag.class, false); + + // <--[tag] + // @attribute + // @returns MapTag + // @description + // Returns the item's entire internal component patch (see <@link tag ItemTag.components_patch>). + // @warning + // Due to this being a direct representation of internal data, compatibility for script usage across versions is not guaranteed. + // --> + PropertyParser.registerTag(ItemComponentsPatch.class, MapTag.class, "full_components_patch", (attribute, property) -> { + return NMSHandler.itemHelper.getRawComponentsPatch(property.getItemStack(), false); + }); + } + + public record PerIdPropertyDataRemover(StringHolder propertyId, Map> removalsPerId) { + + public static final StringHolder ID_STRING_HOLDER = new StringHolder("id"); + + public PerIdPropertyDataRemover(String propertyId) { + this(new StringHolder(propertyId), new HashMap<>()); + } + + public void registerRemoval(Keyed type, String... keys) { + registerRemoval(type.getKey().toString(), keys); + } + + public void registerRemoval(String id, String... keys) { + Set toRemove = new HashSet<>(keys.length + 1); + toRemove.add(ID_STRING_HOLDER); + for (String key : keys) { + toRemove.add(new StringHolder(key)); + } + removalsPerId.put("string:" + id, toRemove); + } + + public void removeFrom(MapTag rawComponents) { + rawComponents.map.computeIfPresent(propertyId, (key, rawValue) -> { + MapTag value = (MapTag) rawValue; + Set toRemove = removalsPerId.get(value.getObject(ID_STRING_HOLDER).toString()); + if (toRemove != null && toRemove.size() >= value.size() && toRemove.containsAll(value.keySet())) { + return null; + } + return rawValue; + }); + } + } +} diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java index 057d34dc88..244e85560b 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java @@ -10,8 +10,12 @@ import com.denizenscript.denizen.nms.v1_20.impl.ProfileEditorImpl; import com.denizenscript.denizen.nms.v1_20.impl.jnbt.CompoundTagImpl; import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizen.objects.properties.item.ItemComponentsPatch; +import com.denizenscript.denizen.objects.properties.item.ItemRawNBT; import com.denizenscript.denizen.utilities.FormattedTextHelper; import com.denizenscript.denizen.utilities.PaperAPITools; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.objects.core.MapTag; import com.denizenscript.denizencore.utilities.CoreUtilities; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; @@ -23,12 +27,14 @@ import net.minecraft.advancements.critereon.BlockPredicate; import net.minecraft.core.*; import net.minecraft.core.component.DataComponentMap; +import net.minecraft.core.component.DataComponentPatch; import net.minecraft.core.component.DataComponentType; import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.NbtUtils; import net.minecraft.network.chat.Component; +import net.minecraft.resources.RegistryOps; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.util.datafix.fixes.References; @@ -78,6 +84,7 @@ import java.lang.reflect.Field; import java.util.*; +import java.util.function.Consumer; import java.util.function.Predicate; public class ItemHelperImpl extends ItemHelper { @@ -307,6 +314,47 @@ public ItemStack setEntityData(ItemStack item, CompoundTag entityNbt, EntityType return CraftItemStack.asBukkitCopy(nmsItemStack); } + @Override + public MapTag getRawComponentsPatch(ItemStack item, boolean excludeHandled) { + net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item); + DataComponentPatch patch = nmsItemStack.getComponentsPatch(); + if (excludeHandled) { + patch = patch.forget(componentType -> { + ResourceLocation componentId = BuiltInRegistries.DATA_COMPONENT_TYPE.getKey(componentType); + return ItemComponentsPatch.propertyHandledComponents.contains(componentId.toString()); + }); + } + if (patch.isEmpty()) { + return new MapTag(); + } + RegistryOps registryOps = CraftRegistry.getMinecraftRegistry().createSerializationContext(NbtOps.INSTANCE); + net.minecraft.nbt.CompoundTag nmsPatch = (net.minecraft.nbt.CompoundTag) DataComponentPatch.CODEC.encodeStart(registryOps, patch).getOrThrow(); + MapTag rawComponents = (MapTag) ItemRawNBT.jnbtTagToObject(CompoundTagImpl.fromNMSTag(nmsPatch)); + rawComponents.putObject(ItemComponentsPatch.DATA_VERSION_KEY, new ElementTag(CraftMagicNumbers.INSTANCE.getDataVersion())); + return rawComponents; + } + + @Override + public ItemStack setRawComponentsPatch(ItemStack item, MapTag rawComponentsMap, int dataVersion, Consumer errorHandler) { + int currentDataVersion = CraftMagicNumbers.INSTANCE.getDataVersion(); + Tag rawComponents = ItemRawNBT.convertObjectToNbt(rawComponentsMap.identify(), CoreUtilities.errorButNoDebugContext, ""); + net.minecraft.nbt.CompoundTag nmsRawComponents = ((CompoundTagImpl) rawComponents).toNMSTag(); + RegistryOps registryOps = CraftRegistry.getMinecraftRegistry().createSerializationContext(NbtOps.INSTANCE); + if (dataVersion < currentDataVersion) { + net.minecraft.nbt.CompoundTag legacyItemData = new net.minecraft.nbt.CompoundTag(); + legacyItemData.putString("id", item.getType().getKey().toString()); + legacyItemData.putInt("count", item.getAmount()); + legacyItemData.put("components", nmsRawComponents); + net.minecraft.nbt.CompoundTag nmsUpdatedTag = (net.minecraft.nbt.CompoundTag) MinecraftServer.getServer().fixerUpper.update(References.ITEM_STACK, new Dynamic<>(registryOps, legacyItemData), dataVersion, currentDataVersion).getValue(); + nmsRawComponents = nmsUpdatedTag.getCompound("components"); + } + net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item); + DataComponentPatch.CODEC.parse(registryOps, nmsRawComponents) + .ifError(error -> errorHandler.accept(error.message())) + .ifSuccess(nmsItemStack::applyComponents); + return CraftItemStack.asBukkitCopy(nmsItemStack); + } + public static final Field AdventureModePredicate_predicates = ReflectionHelper.getFields(AdventureModePredicate.class).get(ReflectionMappingsInfo.AdventureModePredicate_predicates); @Override diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java index ab5e065017..483a2218a5 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java @@ -10,8 +10,12 @@ import com.denizenscript.denizen.nms.v1_21.impl.ProfileEditorImpl; import com.denizenscript.denizen.nms.v1_21.impl.jnbt.CompoundTagImpl; import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizen.objects.properties.item.ItemComponentsPatch; +import com.denizenscript.denizen.objects.properties.item.ItemRawNBT; import com.denizenscript.denizen.utilities.FormattedTextHelper; import com.denizenscript.denizen.utilities.PaperAPITools; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.objects.core.MapTag; import com.denizenscript.denizencore.utilities.CoreUtilities; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; @@ -23,6 +27,7 @@ import net.minecraft.advancements.critereon.BlockPredicate; import net.minecraft.core.*; import net.minecraft.core.component.DataComponentMap; +import net.minecraft.core.component.DataComponentPatch; import net.minecraft.core.component.DataComponentType; import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.BuiltInRegistries; @@ -30,6 +35,7 @@ import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.NbtUtils; import net.minecraft.network.chat.Component; +import net.minecraft.resources.RegistryOps; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; @@ -79,6 +85,7 @@ import java.lang.reflect.Field; import java.util.*; +import java.util.function.Consumer; import java.util.function.Predicate; public class ItemHelperImpl extends ItemHelper { @@ -310,6 +317,47 @@ public ItemStack setEntityData(ItemStack item, CompoundTag entityNbt, EntityType return CraftItemStack.asBukkitCopy(nmsItemStack); } + @Override + public MapTag getRawComponentsPatch(ItemStack item, boolean excludeHandled) { + net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item); + DataComponentPatch patch = nmsItemStack.getComponentsPatch(); + if (excludeHandled) { + patch = patch.forget(componentType -> { + ResourceLocation componentId = BuiltInRegistries.DATA_COMPONENT_TYPE.getKey(componentType); + return ItemComponentsPatch.propertyHandledComponents.contains(componentId.toString()); + }); + } + if (patch.isEmpty()) { + return new MapTag(); + } + RegistryOps registryOps = CraftRegistry.getMinecraftRegistry().createSerializationContext(NbtOps.INSTANCE); + net.minecraft.nbt.CompoundTag nmsPatch = (net.minecraft.nbt.CompoundTag) DataComponentPatch.CODEC.encodeStart(registryOps, patch).getOrThrow(); + MapTag rawComponents = (MapTag) ItemRawNBT.jnbtTagToObject(CompoundTagImpl.fromNMSTag(nmsPatch)); + rawComponents.putObject(ItemComponentsPatch.DATA_VERSION_KEY, new ElementTag(CraftMagicNumbers.INSTANCE.getDataVersion())); + return rawComponents; + } + + @Override + public ItemStack setRawComponentsPatch(ItemStack item, MapTag rawComponentsMap, int dataVersion, Consumer errorHandler) { + int currentDataVersion = CraftMagicNumbers.INSTANCE.getDataVersion(); + Tag rawComponents = ItemRawNBT.convertObjectToNbt(rawComponentsMap.identify(), CoreUtilities.errorButNoDebugContext, ""); + net.minecraft.nbt.CompoundTag nmsRawComponents = ((CompoundTagImpl) rawComponents).toNMSTag(); + RegistryOps registryOps = CraftRegistry.getMinecraftRegistry().createSerializationContext(NbtOps.INSTANCE); + if (dataVersion < currentDataVersion) { + net.minecraft.nbt.CompoundTag legacyItemData = new net.minecraft.nbt.CompoundTag(); + legacyItemData.putString("id", item.getType().getKey().toString()); + legacyItemData.putInt("count", item.getAmount()); + legacyItemData.put("components", nmsRawComponents); + net.minecraft.nbt.CompoundTag nmsUpdatedTag = (net.minecraft.nbt.CompoundTag) MinecraftServer.getServer().fixerUpper.update(References.ITEM_STACK, new Dynamic<>(registryOps, legacyItemData), dataVersion, currentDataVersion).getValue(); + nmsRawComponents = nmsUpdatedTag.getCompound("components"); + } + net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item); + DataComponentPatch.CODEC.parse(registryOps, nmsRawComponents) + .ifError(error -> errorHandler.accept(error.message())) + .ifSuccess(nmsItemStack::applyComponents); + return CraftItemStack.asBukkitCopy(nmsItemStack); + } + public static final Field AdventureModePredicate_predicates = ReflectionHelper.getFields(AdventureModePredicate.class).get(ReflectionMappingsInfo.AdventureModePredicate_predicates); @Override From cb0098a52e15036e1136d42bd8f949708c6cd0de Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Fri, 29 Nov 2024 10:01:16 -0800 Subject: [PATCH 086/280] 1.21.3 better item recipe registration --- .../player/PlayerStandsOnScriptEvent.java | 3 - .../denizen/nms/interfaces/ItemHelper.java | 12 ++ .../containers/core/ItemScriptHelper.java | 15 ++- .../nms/v1_21/helpers/ItemHelperImpl.java | 119 ++++++++++++++++-- 4 files changed, 134 insertions(+), 15 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerStandsOnScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerStandsOnScriptEvent.java index 4c34448ae9..162342fa76 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerStandsOnScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerStandsOnScriptEvent.java @@ -19,8 +19,6 @@ public class PlayerStandsOnScriptEvent extends BukkitScriptEvent implements List // player stands on material // player stands on () // - // @Regex ^on player stands on [^\s]+$ - // // @Group Player // // @Location true @@ -39,7 +37,6 @@ public class PlayerStandsOnScriptEvent extends BukkitScriptEvent implements List public PlayerStandsOnScriptEvent() { } - PlayerStandsOnScriptEvent instance; PlayerInteractEvent event; LocationTag location; MaterialTag material; diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java index 0c35cea09e..91dad0210e 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java @@ -173,4 +173,16 @@ public ItemStack setShieldColor(ItemStack item, DyeColor color) { // TODO: once item.setItemMeta(stateMeta); return item; } + + public void blockRecipeFinalization() { + } + + public void restoreRecipeFinalization() { + } + + public void removeRecipes(List keys) { + } + + public void registerOtherRecipe(org.bukkit.inventory.Recipe recipe) { + } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptHelper.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptHelper.java index 1425d50e79..5cf3668155 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptHelper.java @@ -58,11 +58,20 @@ public static void removeDenizenRecipes() { recipeCache.clear(); recipeIdToItemScript.clear(); Iterator recipeIterator = Bukkit.recipeIterator(); + ArrayList keys = new ArrayList<>(); while (recipeIterator.hasNext()) { if (recipeIterator.next() instanceof Keyed keyed && keyed.getKey().getNamespace().equals("denizen")) { - recipeIterator.remove(); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + keys.add(keyed.getKey()); + } + else { + recipeIterator.remove(); + } } } + if (!keys.isEmpty()) { + NMSHandler.itemHelper.removeRecipes(keys); + } PaperAPITools.instance.clearBrewingRecipes(); } @@ -194,7 +203,7 @@ else if (recipeList.size() == 2) { NMSHandler.itemHelper.setShapedRecipeIngredient(recipe, itemChars.charAt(i), ingredients.get(i), exacts.get(i)); } } - Bukkit.addRecipe(recipe); + NMSHandler.itemHelper.registerOtherRecipe(recipe); } public static void registerShapelessRecipe(ItemScriptContainer container, ItemStack item, String shapelessString, String internalId, String group, String category) { @@ -283,6 +292,7 @@ public static void registerSmithingRecipe(ItemScriptContainer container, ItemSta } public static void rebuildRecipes() { + NMSHandler.itemHelper.blockRecipeFinalization(); for (ItemScriptContainer container : item_scripts.values()) { try { if (container.contains("recipes", Map.class)) { @@ -356,6 +366,7 @@ public static void rebuildRecipes() { Debug.echoError(ex); } } + NMSHandler.itemHelper.restoreRecipeFinalization(); } @EventHandler diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java index 483a2218a5..e67c7374f9 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java @@ -40,6 +40,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.util.datafix.fixes.References; +import net.minecraft.world.flag.FeatureFlagSet; import net.minecraft.world.item.AdventureModePredicate; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; @@ -48,6 +49,11 @@ import net.minecraft.world.item.component.ItemLore; import net.minecraft.world.item.component.ResolvableProfile; import net.minecraft.world.item.crafting.*; +import net.minecraft.world.item.crafting.BlastingRecipe; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.ShapelessRecipe; +import net.minecraft.world.item.crafting.SmithingTransformRecipe; +import net.minecraft.world.item.crafting.SmokingRecipe; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -69,18 +75,16 @@ import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; import org.bukkit.craftbukkit.v1_21_R2.block.data.CraftBlockData; import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftInventoryPlayer; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftRecipe; +import org.bukkit.craftbukkit.v1_21_R2.inventory.*; import org.bukkit.craftbukkit.v1_21_R2.map.CraftMapView; import org.bukkit.craftbukkit.v1_21_R2.util.CraftMagicNumbers; import org.bukkit.craftbukkit.v1_21_R2.util.CraftNamespacedKey; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.RecipeChoice; +import org.bukkit.inventory.*; import org.bukkit.inventory.ShapedRecipe; +import org.bukkit.inventory.SmithingTrimRecipe; +import org.bukkit.inventory.TransmuteRecipe; import org.bukkit.map.MapView; import java.lang.reflect.Field; @@ -97,6 +101,8 @@ public static net.minecraft.world.item.crafting.RecipeHolder getNMSRecipe(Nam public static final Field Item_components = ReflectionHelper.getFields(Item.class).get(ReflectionMappingsInfo.Item_components, DataComponentMap.class); + public static final Field RecipeManager_featureFlagSet = ReflectionHelper.getFields(RecipeManager.class).getFirstOfType(FeatureFlagSet.class); + public void setMaxStackSize(Material material, int size) { try { ReflectionHelper.getFinalSetter(Material.class, "maxStack").invoke(material, size); @@ -109,6 +115,53 @@ public void setMaxStackSize(Material material, int size) { } } + public static RecipeManager getRecipeManager() { + return ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager(); + } + + public Object recipeManagerFeatureFlagSetCache = null; + + @Override + public void blockRecipeFinalization() { + try { + RecipeManager manager = getRecipeManager(); + Object flags = RecipeManager_featureFlagSet.get(manager); + if (flags != null) { + recipeManagerFeatureFlagSetCache = flags; + RecipeManager_featureFlagSet.set(manager, null); + + } + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + @Override + public void restoreRecipeFinalization() { + try { + RecipeManager manager = getRecipeManager(); + if (recipeManagerFeatureFlagSetCache != null) { + RecipeManager_featureFlagSet.set(manager, recipeManagerFeatureFlagSetCache); + manager.finalizeRecipeLoading(); + } + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + @Override + public void removeRecipes(List keys) { + blockRecipeFinalization(); + RecipeManager manager = getRecipeManager(); + for (NamespacedKey key: keys) { + ResourceKey> nmsKey = ResourceKey.create(Registries.RECIPE, CraftNamespacedKey.toMinecraft(key)); + manager.removeRecipe(nmsKey); + } + restoreRecipeFinalization(); + } + @Override public Integer burnTime(Material material) { return MinecraftServer.getServer().fuelValues().burnDuration(new net.minecraft.world.item.ItemStack(CraftMagicNumbers.getItem(material))); @@ -162,7 +215,7 @@ else if (type.equalsIgnoreCase("campfire")) { recipe = new SmeltingRecipe(group, categoryValue, itemRecipe, CraftItemStack.asNMSCopy(result), exp, time); } RecipeHolder holder = new RecipeHolder<>(key, recipe); - ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager().addRecipe(holder); + getRecipeManager().addRecipe(holder); } @Override @@ -171,7 +224,7 @@ public void registerStonecuttingRecipe(String keyName, String group, ItemStack r Ingredient itemRecipe = itemArrayToRecipe(ingredient, exact); StonecutterRecipe recipe = new StonecutterRecipe(group, itemRecipe, CraftItemStack.asNMSCopy(result)); RecipeHolder holder = new RecipeHolder<>(key, recipe); - ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager().addRecipe(holder); + getRecipeManager().addRecipe(holder); } @Override @@ -182,7 +235,7 @@ public void registerSmithingRecipe(String keyName, ItemStack result, ItemStack[] Ingredient upgradeItemRecipe = itemArrayToRecipe(upgradeItem, upgradeExact); SmithingTransformRecipe recipe = new SmithingTransformRecipe(Optional.of(templateItemRecipe), Optional.of(baseItemRecipe), Optional.of(upgradeItemRecipe), CraftItemStack.asNMSCopy(result)); RecipeHolder holder = new RecipeHolder<>(key, recipe); - ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager().addRecipe(holder); + getRecipeManager().addRecipe(holder); } @Override @@ -196,7 +249,53 @@ public void registerShapelessRecipe(String keyName, String group, ItemStack resu // TODO: 1.19.3: Add support for choosing a CraftingBookCategory ShapelessRecipe recipe = new ShapelessRecipe(group, categoryValue, CraftItemStack.asNMSCopy(result), NonNullList.of(null, ingredientList.toArray(new Ingredient[0]))); RecipeHolder holder = new RecipeHolder<>(key, recipe); - ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager().addRecipe(holder); + getRecipeManager().addRecipe(holder); + } + + @Override + public void registerOtherRecipe(org.bukkit.inventory.Recipe recipe) { + // This method copied from Bukkit CraftServer source, just to bypass unwanted paper patch + CraftRecipe toAdd; + if (recipe instanceof CraftRecipe craft) { + toAdd = craft; + } + else if (recipe instanceof ShapedRecipe) { + toAdd = CraftShapedRecipe.fromBukkitRecipe((ShapedRecipe)recipe); + } + else if (recipe instanceof org.bukkit.inventory.ShapelessRecipe) { + toAdd = CraftShapelessRecipe.fromBukkitRecipe((org.bukkit.inventory.ShapelessRecipe)recipe); + } + else if (recipe instanceof FurnaceRecipe) { + toAdd = CraftFurnaceRecipe.fromBukkitRecipe((FurnaceRecipe)recipe); + } + else if (recipe instanceof org.bukkit.inventory.BlastingRecipe) { + toAdd = CraftBlastingRecipe.fromBukkitRecipe((org.bukkit.inventory.BlastingRecipe)recipe); + } + else if (recipe instanceof CampfireRecipe) { + toAdd = CraftCampfireRecipe.fromBukkitRecipe((CampfireRecipe)recipe); + } + else if (recipe instanceof org.bukkit.inventory.SmokingRecipe) { + toAdd = CraftSmokingRecipe.fromBukkitRecipe((org.bukkit.inventory.SmokingRecipe)recipe); + } + else if (recipe instanceof StonecuttingRecipe) { + toAdd = CraftStonecuttingRecipe.fromBukkitRecipe((StonecuttingRecipe)recipe); + } + else if (recipe instanceof org.bukkit.inventory.SmithingTransformRecipe) { + toAdd = CraftSmithingTransformRecipe.fromBukkitRecipe((org.bukkit.inventory.SmithingTransformRecipe)recipe); + } + else if (recipe instanceof org.bukkit.inventory.SmithingTrimRecipe) { + toAdd = CraftSmithingTrimRecipe.fromBukkitRecipe((SmithingTrimRecipe)recipe); + } + else { + if (!(recipe instanceof org.bukkit.inventory.TransmuteRecipe)) { + if (recipe instanceof ComplexRecipe) { + throw new UnsupportedOperationException("Cannot add custom complex recipe"); + } + return; + } + toAdd = CraftTransmuteRecipe.fromBukkitRecipe((TransmuteRecipe)recipe); + } + toAdd.addToCraftingManager(); } @Override From a023d96dcda19d5423231679a19035ad285cf97b Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Mon, 2 Dec 2024 05:14:21 -0800 Subject: [PATCH 087/280] patch 'teleport relative' on latest paper --- .../denizen/paper/utilities/PaperAPIToolsImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/utilities/PaperAPIToolsImpl.java b/paper/src/main/java/com/denizenscript/denizen/paper/utilities/PaperAPIToolsImpl.java index bccb44dc8a..54ce299a36 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/utilities/PaperAPIToolsImpl.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/utilities/PaperAPIToolsImpl.java @@ -11,6 +11,7 @@ import com.denizenscript.denizen.utilities.FormattedTextHelper; import com.denizenscript.denizen.utilities.PaperAPITools; import com.denizenscript.denizencore.DenizenCore; +import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.tags.TagContext; import com.denizenscript.denizencore.utilities.CoreUtilities; import com.denizenscript.denizencore.utilities.ReflectionHelper; @@ -157,8 +158,9 @@ public void teleport(Entity entity, Location loc, PlayerTeleportEvent.TeleportCa } } if (relativeTeleportFlags != null) { + // TODO: MC 1.21.3: Paper updated this API to work differently due to underlying Minecraft changes. for (TeleportCommand.Relative relativeTeleportFlag : relativeTeleportFlags) { - teleportFlags.add(TeleportFlag.Relative.values()[relativeTeleportFlag.ordinal()]); + teleportFlags.add(new ElementTag(relativeTeleportFlag.name()).asEnum(TeleportFlag.Relative.class)); } } entity.teleport(loc, cause, teleportFlags.toArray(new TeleportFlag[0])); From 36b4fec640808a80e85fff9ddc95338e97d9e25d Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Mon, 2 Dec 2024 05:26:26 -0800 Subject: [PATCH 088/280] make book scripts work properly around writable books multiple layers of correction to be safe --- .../containers/core/BookScriptContainer.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/BookScriptContainer.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/BookScriptContainer.java index a25ab7a6f4..1653649825 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/BookScriptContainer.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/BookScriptContainer.java @@ -21,7 +21,7 @@ public class BookScriptContainer extends ScriptContainer { // @group Script Container System // @description // Book script containers are similar to item script containers, except they are specifically - // for the book items. They work with with the ItemTag object, and can be fetched + // for the book items. They work with the ItemTag object, and can be fetched // with the Object Fetcher by using the ItemTag constructor book_script_name // Example: - give my_book // @@ -57,7 +57,11 @@ public BookScriptContainer(YamlConfiguration configurationSection, String script } public ItemTag getBookFrom(TagContext context) { - ItemTag stack = new ItemTag(Material.WRITTEN_BOOK); + Material material = Material.WRITTEN_BOOK; + if (contains("signed", String.class) && getString("signed").equalsIgnoreCase("false")) { + material = Material.WRITABLE_BOOK; + } + ItemTag stack = new ItemTag(material); return writeBookTo(stack, context); } @@ -65,18 +69,19 @@ public ItemTag writeBookTo(ItemTag book, TagContext context) { if (context == null) { context = new BukkitTagContext(null, null, new ScriptTag(this)); } - // Get current ItemMeta from the book + if (contains("signed", String.class)) { + Material target = getString("signed").equalsIgnoreCase("false") ? Material.WRITABLE_BOOK : Material.WRITTEN_BOOK; + if (book.getItemStack().getType() != target) { + book.getItemStack().setType(target); + book.setItemStack(book.getItemStack()); + } + } BookMeta bookInfo = (BookMeta) book.getItemMeta(); if (contains("title", String.class)) { String title = getString("title"); title = TagManager.tag(title, context); bookInfo.setTitle(title); } - if (contains("signed", String.class)) { - if (getString("signed").equalsIgnoreCase("false")) { - book.getItemStack().setType(Material.WRITABLE_BOOK); - } - } if (contains("author", String.class)) { String author = getString("author"); author = TagManager.tag(author, context); From f2abb9749ffb834bf6791da3b0a8651e1f082080 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Mon, 2 Dec 2024 05:39:13 -0800 Subject: [PATCH 089/280] Toast: mandatory icon --- .../denizen/scripts/commands/player/ToastCommand.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/player/ToastCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/player/ToastCommand.java index b6716cf01e..f2051c09ae 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/player/ToastCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/player/ToastCommand.java @@ -1,6 +1,7 @@ package com.denizenscript.denizen.scripts.commands.player; import com.denizenscript.denizen.Denizen; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.denizenscript.denizen.nms.NMSHandler; @@ -44,6 +45,8 @@ public ToastCommand() { // The icon argument changes the icon displayed in the toast pop-up notification. // The frame argument changes the type of advancement. // + // As of MC 1.20, an icon is required. Dirt will be used if it is missing. + // // @Tags // None // @@ -110,6 +113,9 @@ public void execute(ScriptEntry scriptEntry) { if (scriptEntry.dbCallShouldDebug()) { Debug.report(scriptEntry, name, text, frame, icon, db("targets", targets)); } + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20) && icon.getBukkitMaterial().isAir()) { + icon = new ItemTag(Material.DIRT); + } final Advancement advancement = new Advancement(true, new NamespacedKey(Denizen.getInstance(), UUID.randomUUID().toString()), null, icon.getItemStack(), text.asString(), "", null, From da2c94ce8c7671ff2c04714ab0183d7ca537def8 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Mon, 2 Dec 2024 05:52:31 -0800 Subject: [PATCH 090/280] minor fix re parse_color --- .../objects/properties/bukkit/BukkitElementExtensions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/bukkit/BukkitElementExtensions.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/bukkit/BukkitElementExtensions.java index 2275a1ae84..8e8bcbc5c0 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/bukkit/BukkitElementExtensions.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/bukkit/BukkitElementExtensions.java @@ -27,7 +27,7 @@ public class BukkitElementExtensions { public static String replaceEssentialsHexColors(char prefix, String input) { int hex = input.indexOf(prefix + "#"); - while (hex != -1 && hex < input.length() + 8) { + while (hex != -1 && hex + 7 < input.length()) { StringBuilder converted = new StringBuilder(10); converted.append(ChatColor.COLOR_CHAR).append("x"); for (int i = 0; i < 6; i++) { From ac179765bdc52b02d9d313a334cd3fde6d3c1557 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Mon, 2 Dec 2024 05:56:20 -0800 Subject: [PATCH 091/280] fix re advancement progress_length --- .../denizen/nms/v1_20/helpers/AdvancementHelperImpl.java | 2 +- .../denizen/nms/v1_21/helpers/AdvancementHelperImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AdvancementHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AdvancementHelperImpl.java index 3e0d4dd07f..7b70014dcb 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AdvancementHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/AdvancementHelperImpl.java @@ -170,7 +170,7 @@ private static AdvancementHolder asNMSCopy(com.denizenscript.denizen.nms.util.Ad requirements = new ArrayList<>(advancement.length); for (int i = 0; i < advancement.length; i++) { criteria.put(IMPOSSIBLE_KEY + i, new Criterion<>(new ImpossibleTrigger(), new ImpossibleTrigger.TriggerInstance())); - requirements.set(i, List.of(IMPOSSIBLE_KEY + i)); + requirements.add(List.of(IMPOSSIBLE_KEY + i)); } } AdvancementRequirements reqs = new AdvancementRequirements(requirements); diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java index 632e8bf63f..5c8db00b28 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java @@ -170,7 +170,7 @@ private static AdvancementHolder asNMSCopy(com.denizenscript.denizen.nms.util.Ad requirements = new ArrayList<>(advancement.length); for (int i = 0; i < advancement.length; i++) { criteria.put(IMPOSSIBLE_KEY + i, new Criterion<>(new ImpossibleTrigger(), new ImpossibleTrigger.TriggerInstance())); - requirements.set(i, List.of(IMPOSSIBLE_KEY + i)); + requirements.add(List.of(IMPOSSIBLE_KEY + i)); } } AdvancementRequirements reqs = new AdvancementRequirements(requirements); From c03fba06ea563d0a7ab72658fd54a2d39f7a3640 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Mon, 2 Dec 2024 05:58:17 -0800 Subject: [PATCH 092/280] advancement command: same icon fix as toast --- .../denizen/scripts/commands/player/AdvancementCommand.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/player/AdvancementCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/player/AdvancementCommand.java index bc57e43abb..cf197cbd2c 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/player/AdvancementCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/player/AdvancementCommand.java @@ -47,6 +47,7 @@ public AdvancementCommand() { // The parent argument sets the root advancement in the advancements menu, in the format "namespace:key". // If no namespace is specified, the parent is assumed to have been created through this command. // The icon argument sets the icon displayed in toasts and the advancements menu. + // As of MC 1.20, an icon is required. Dirt will be used if it is missing. // The title argument sets the title that will show on toasts and in the advancements menu. // The description argument sets the information that will show when scrolling over a chat announcement or in the advancements menu. // The background argument sets the image to use if the advancement goes to a new tab. @@ -205,6 +206,9 @@ public void execute(ScriptEntry scriptEntry) { ElementTag x = scriptEntry.getElement("x"); ElementTag y = scriptEntry.getElement("y"); ElementTag progressLength = scriptEntry.getElement("progress_length"); + if (icon.getBukkitMaterial().isAir()) { + icon = new ItemTag(Material.DIRT); + } if (scriptEntry.dbCallShouldDebug()) { Debug.report(scriptEntry, name, id, parent, delete, grant, revoke, icon, title, description, background, progressLength, frame, toast, announce, hidden, x, y); } From 4f39be7b1fbb43825199702e17ed5ad095dcbafb Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Mon, 2 Dec 2024 06:01:29 -0800 Subject: [PATCH 093/280] Switchable: lightable should outrank powerable --- .../properties/material/MaterialSwitchable.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialSwitchable.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialSwitchable.java index af5c889198..997e53b285 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialSwitchable.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialSwitchable.java @@ -157,6 +157,9 @@ public boolean getState() { if (isOpenable()) { return getOpenable().isOpen(); } + else if (isLightable()) { + return getLightable().isLit(); + } else if (isPowerable()) { return getPowerable().isPowered(); } @@ -166,9 +169,6 @@ else if (isDisepnser()) { else if (isDaylightDetector()) { return getDaylightDetector().isInverted(); } - else if (isLightable()) { - return getLightable().isLit(); - } else if (isPiston()) { return getPiston().isExtended(); } @@ -188,6 +188,9 @@ public void setState(boolean state) { if (isOpenable()) { getOpenable().setOpen(state); } + else if (isLightable()) { + getLightable().setLit(state); + } else if (isPowerable()) { getPowerable().setPowered(state); } @@ -197,9 +200,6 @@ else if (isDisepnser()) { else if (isDaylightDetector()) { getDaylightDetector().setInverted(state); } - else if (isLightable()) { - getLightable().setLit(state); - } else if (isPiston()) { getPiston().setExtended(state); } From 4f27bf4b13b392bec5e25b41811a5e20334a825f Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Mon, 2 Dec 2024 06:08:08 -0800 Subject: [PATCH 094/280] allow uncancelling block destroyed by explosion --- .../denizen/events/block/BlockDestroyedByExplosionEvent.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/block/BlockDestroyedByExplosionEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/block/BlockDestroyedByExplosionEvent.java index 807b8baeec..355db8e40f 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/block/BlockDestroyedByExplosionEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/block/BlockDestroyedByExplosionEvent.java @@ -81,9 +81,12 @@ public ObjectTag getContext(String name) { @Override public void cancellationChanged() { - if (cancelled) { + if (cancelled && rawList.contains(location.getBlock())) { rawList.remove(location.getBlock()); } + else if (!rawList.contains(location.getBlock())) { + rawList.add(location.getBlock()); + } } @EventHandler From 7412828a1a58164f935bdf0f6f679d70784dc4a9 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Mon, 2 Dec 2024 06:09:10 -0800 Subject: [PATCH 095/280] fix old docs --- .../denizen/events/player/PlayerClosesInvScriptEvent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerClosesInvScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerClosesInvScriptEvent.java index c6c44d83c4..f5c5f37bf6 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerClosesInvScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerClosesInvScriptEvent.java @@ -26,7 +26,7 @@ public class PlayerClosesInvScriptEvent extends BukkitScriptEvent implements Lis // // @Location true // - // @Triggers when a player closes an inventory. (EG, chests, not the player's main inventory.) + // @Triggers when a player closes an inventory. // // @Context // returns the InventoryTag. From a123c1af5a96c74bc3f9d3769c54b97ecad92ee7 Mon Sep 17 00:00:00 2001 From: Hydroxycobalamin <54799651+Hydroxycobalamin@users.noreply.github.com> Date: Mon, 2 Dec 2024 20:30:39 +0100 Subject: [PATCH 096/280] Add context and switches to PlayerQuitEvent (#2641) * modernize PlayerQuitEvent * remove stray lines, cleanup * remove: redundant duplicates * fix: prevent misfiring * monkey is dum and needs to read docs before replying to questions * minus Optional * Update PlayerQuitsScriptEventPaperImpl.java --- .../denizen/paper/PaperModule.java | 1 + .../PlayerQuitsScriptEventPaperImpl.java | 38 +++++++++++++++ .../denizen/events/ScriptEventRegistry.java | 4 +- .../events/player/PlayerQuitsScriptEvent.java | 46 +++++++++---------- 4 files changed, 65 insertions(+), 24 deletions(-) create mode 100644 paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerQuitsScriptEventPaperImpl.java diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java index f47fd55f95..d0f83257b7 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java @@ -83,6 +83,7 @@ public static void init() { ScriptEvent.registerScriptEvent(PlayerTracksEntityScriptEvent.class); } ScriptEvent.registerScriptEvent(PlayerTradesWithMerchantScriptEvent.class); + ScriptEvent.registerScriptEvent(PlayerQuitsScriptEventPaperImpl.class); ScriptEvent.registerScriptEvent(PreEntitySpawnScriptEvent.class); ScriptEvent.registerScriptEvent(ProjectileCollideScriptEvent.class); ScriptEvent.registerScriptEvent(ServerListPingScriptEventPaperImpl.class); diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerQuitsScriptEventPaperImpl.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerQuitsScriptEventPaperImpl.java new file mode 100644 index 0000000000..a899af3781 --- /dev/null +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerQuitsScriptEventPaperImpl.java @@ -0,0 +1,38 @@ +package com.denizenscript.denizen.paper.events; + +import com.denizenscript.denizen.events.player.PlayerQuitsScriptEvent; +import com.denizenscript.denizen.paper.PaperModule; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; +import net.md_5.bungee.api.ChatColor; + + +public class PlayerQuitsScriptEventPaperImpl extends PlayerQuitsScriptEvent { + + public PlayerQuitsScriptEventPaperImpl() { + registerSwitches("cause"); + this.registerTextDetermination("none", (evt) -> { + event.quitMessage(null); + }); + this.registerDetermination(null, ElementTag.class, (evt, context, determination) -> { + event.quitMessage(PaperModule.parseFormattedText(determination.toString(), ChatColor.WHITE)); + }); + } + + @Override + public boolean matches(ScriptPath path) { + if (!runGenericSwitchCheck(path, "cause", event.getReason().name())) { + return false; + } + return super.matches(path); + } + + @Override + public ObjectTag getContext(String name) { + return switch (name) { + case "message" -> new ElementTag(PaperModule.stringifyComponent(event.quitMessage())); + case "cause" -> new ElementTag(event.getReason()); + default -> super.getContext(name); + }; + } +} diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java index a2f7560d1d..3b5120bc76 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java @@ -223,7 +223,9 @@ public static void registerMainEvents() { ScriptEvent.registerScriptEvent(PlayerPreLoginScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerPreparesAnvilCraftScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerPreparesEnchantScriptEvent.class); - ScriptEvent.registerScriptEvent(PlayerQuitsScriptEvent.class); + if (!Denizen.supportsPaper) { + ScriptEvent.registerScriptEvent(PlayerQuitsScriptEvent.class); + } if (!Denizen.supportsPaper || NMSHandler.getVersion().isAtMost(NMSVersion.v1_17)) { ScriptEvent.registerScriptEvent(PlayerRaiseLowerItemScriptEvent.PlayerRaiseLowerItemScriptEventSpigotImpl.class); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerQuitsScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerQuitsScriptEvent.java index 63a05e1db9..05d263a665 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerQuitsScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerQuitsScriptEvent.java @@ -1,12 +1,12 @@ package com.denizenscript.denizen.events.player; import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; -import com.denizenscript.denizencore.utilities.CoreUtilities; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; @@ -18,16 +18,19 @@ public class PlayerQuitsScriptEvent extends BukkitScriptEvent implements Listene // player quits // player quit // - // @Regex ^on player (quit|quits)$ - // // @Synonyms Player Disconnects,Player Logs Off,Player Leaves // // @Group Player // + // @Switch cause: to only process the event when it matches the specific cause (only on Paper). + // + // @Location true + // // @Triggers when a player quit the server. // // @Context // returns an ElementTag of the quit message. + // returns an ElementTag of the cause of the quit (only on Paper): <@link url https://jd.papermc.io/paper/1.21.1/org/bukkit/event/player/PlayerQuitEvent.QuitReason.html>. // // @Determine // ElementTag to change the quit message. @@ -38,27 +41,24 @@ public class PlayerQuitsScriptEvent extends BukkitScriptEvent implements Listene // --> public PlayerQuitsScriptEvent() { + registerCouldMatcher("player quits|quit"); + this.registerTextDetermination("none", (evt) -> { + event.setQuitMessage(null); + }); + this.registerDetermination(null, ElementTag.class, (evt, context, determination) -> { + event.setQuitMessage(determination.asString()); + }); } public PlayerQuitEvent event; + public LocationTag location; @Override - public boolean couldMatch(ScriptPath path) { - return path.eventLower.startsWith("player quit"); - } - - @Override - public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) { - if (determinationObj instanceof ElementTag) { - String determination = determinationObj.toString(); - if (CoreUtilities.equalsIgnoreCase(determination, "none")) { - event.setQuitMessage(null); - return true; - } - event.setQuitMessage(determination); - return true; + public boolean matches(ScriptPath path) { + if (!runInCheck(path, location)) { + return false; } - return super.applyDetermination(path, determinationObj); + return super.matches(path); } @Override @@ -68,10 +68,10 @@ public ScriptEntryData getScriptEntryData() { @Override public ObjectTag getContext(String name) { - if (name.equals("message")) { - return new ElementTag(event.getQuitMessage()); - } - return super.getContext(name); + return switch (name) { + case "message" -> new ElementTag(event.getQuitMessage()); + default -> super.getContext(name); + }; } @EventHandler @@ -82,8 +82,8 @@ public void onPlayerQuits(PlayerQuitEvent event) { if (!event.getPlayer().isOnline()) { // Workaround: Paper event misfire - refer to comments in NetworkInterceptHelper return; } + location = new LocationTag(event.getPlayer().getLocation()); this.event = event; fire(event); - } } From a6ff7e7826859457ebd2ad390819418bad8261e5 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Tue, 3 Dec 2024 06:29:45 -0800 Subject: [PATCH 097/280] registerSpawnedOnlyMechanism without param variant --- .../com/denizenscript/denizen/objects/EntityTag.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java index 3960751466..b87fe9e86c 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java @@ -3330,6 +3330,16 @@ public static void registerSpawnedOnlyTag(Class returnT }, variants); } + public static void registerSpawnedOnlyMechanism(String name, boolean allowProperty, Mechanism.GenericMechRunnerInterface runner) { + tagProcessor.registerMechanism(name, allowProperty, (entity, mechanism) -> { + if (!entity.isSpawned()) { + mechanism.echoError("Entity is not spawned, but mechanism '" + name + "' requires the entity be spawned, for entity: " + entity.debuggable()); + return; + } + runner.run(entity, mechanism); + }); + } + public static

void registerSpawnedOnlyMechanism(String name, boolean allowProperty, Class

paramType, Mechanism.ObjectInputMechRunnerInterface runner) { tagProcessor.registerMechanism(name, allowProperty, paramType, (entity, mechanism, param) -> { if (!entity.isSpawned()) { From c6f64305c8c5370da5974d671c2394fdd9ffb5a8 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Tue, 3 Dec 2024 21:59:19 +0000 Subject: [PATCH 098/280] 1.21.4 part 1: bump version numbers --- README.md | 2 +- plugin/pom.xml | 2 +- v1_21/pom.xml | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 413e01f7d0..7200fd8682 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ The Denizen Scripting Language - Spigot Impl An implementation of the Denizen Scripting Language for Spigot servers, with strong Citizens interlinks to emphasize the power of using Denizen with NPCs! -**Version 1.3.1**: Compatible with Spigot 1.17.1, 1.18.2, 1.19.4, 1.20.6, and 1.21.3! +**Version 1.3.1**: Compatible with Spigot 1.17.1, 1.18.2, 1.19.4, 1.20.6, and 1.21.4! **Learn about Denizen from the Beginner's guide:** https://guide.denizenscript.com/guides/background/index.html diff --git a/plugin/pom.xml b/plugin/pom.xml index 27686fac19..cf1d33be28 100644 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -30,7 +30,7 @@ org.spigotmc spigot-api - 1.21.3-R0.1-SNAPSHOT + 1.21.4-R0.1-SNAPSHOT jar provided diff --git a/v1_21/pom.xml b/v1_21/pom.xml index c9bd15f642..680fa5aeab 100644 --- a/v1_21/pom.xml +++ b/v1_21/pom.xml @@ -19,13 +19,13 @@ org.spigotmc spigot-api - 1.21.3-R0.1-SNAPSHOT + 1.21.4-R0.1-SNAPSHOT provided org.spigotmc spigot - 1.21.3-R0.1-SNAPSHOT + 1.21.4-R0.1-SNAPSHOT remapped-mojang provided @@ -45,9 +45,9 @@ remap-obf - org.spigotmc:minecraft-server:1.21.3-R0.1-SNAPSHOT:txt:maps-mojang + org.spigotmc:minecraft-server:1.21.4-R0.1-SNAPSHOT:txt:maps-mojang true - org.spigotmc:spigot:1.21.3-R0.1-SNAPSHOT:jar:remapped-mojang + org.spigotmc:spigot:1.21.4-R0.1-SNAPSHOT:jar:remapped-mojang true remapped-obf @@ -60,8 +60,8 @@ remap-spigot ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar - org.spigotmc:minecraft-server:1.21.3-R0.1-SNAPSHOT:csrg:maps-spigot - org.spigotmc:spigot:1.21.3-R0.1-SNAPSHOT:jar:remapped-obf + org.spigotmc:minecraft-server:1.21.4-R0.1-SNAPSHOT:csrg:maps-spigot + org.spigotmc:spigot:1.21.4-R0.1-SNAPSHOT:jar:remapped-obf From 1b50fb932705d0a1ed11d9c8f366615c6edc53dd Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Tue, 3 Dec 2024 22:01:38 +0000 Subject: [PATCH 099/280] 1.21.4 part 2: bump import revision numbers --- .../denizen/nms/v1_21/Handler.java | 30 +++++++++---------- .../v1_21/helpers/AdvancementHelperImpl.java | 8 ++--- .../v1_21/helpers/AnimationHelperImpl.java | 6 ++-- .../nms/v1_21/helpers/BlockHelperImpl.java | 22 +++++++------- .../nms/v1_21/helpers/ChunkHelperImpl.java | 4 +-- .../v1_21/helpers/CustomEntityHelperImpl.java | 4 +-- .../nms/v1_21/helpers/EntityHelperImpl.java | 16 +++++----- .../nms/v1_21/helpers/FishingHelperImpl.java | 8 ++--- .../nms/v1_21/helpers/ItemHelperImpl.java | 18 +++++------ .../nms/v1_21/helpers/PacketHelperImpl.java | 16 +++++----- .../nms/v1_21/helpers/PlayerHelperImpl.java | 16 +++++----- .../nms/v1_21/helpers/WorldHelperImpl.java | 2 +- .../denizen/nms/v1_21/impl/BiomeNMSImpl.java | 8 ++--- .../v1_21/impl/ImprovedOfflinePlayerImpl.java | 10 +++---- .../nms/v1_21/impl/ProfileEditorImpl.java | 4 +-- .../nms/v1_21/impl/blocks/BlockLightImpl.java | 4 +-- .../impl/entities/CraftFakeArrowImpl.java | 4 +-- .../impl/entities/CraftFakePlayerImpl.java | 4 +-- .../entities/CraftItemProjectileImpl.java | 6 ++-- .../impl/entities/EntityFakeArrowImpl.java | 4 +-- .../impl/entities/EntityFakePlayerImpl.java | 2 +- .../entities/EntityItemProjectileImpl.java | 2 +- .../handlers/AbstractListenerPlayInImpl.java | 2 +- .../handlers/DenizenNetworkManagerImpl.java | 6 ++-- .../handlers/DenizenPacketListenerImpl.java | 2 +- .../network/handlers/FakeBlockHelper.java | 8 ++--- .../packet/ActionBarEventPacketHandlers.java | 2 +- .../handlers/packet/AttachPacketHandlers.java | 4 +-- .../packet/DisguisePacketHandlers.java | 2 +- .../packet/FakeEquipmentPacketHandlers.java | 2 +- .../packet/HideParticlesPacketHandlers.java | 2 +- .../network/packets/PacketOutChatImpl.java | 2 +- 32 files changed, 115 insertions(+), 115 deletions(-) diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java index a116cc8bd5..3bc759ad19 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java @@ -67,21 +67,21 @@ import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.boss.BossBar; -import org.bukkit.craftbukkit.v1_21_R2.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R2.CraftServer; -import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R2.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_21_R2.boss.CraftBossBar; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftInventory; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftInventoryCustom; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftInventoryView; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R2.persistence.CraftPersistentDataContainer; -import org.bukkit.craftbukkit.v1_21_R2.util.CraftChatMessage; -import org.bukkit.craftbukkit.v1_21_R2.util.CraftLocation; -import org.bukkit.craftbukkit.v1_21_R2.util.CraftMagicNumbers; -import org.bukkit.craftbukkit.v1_21_R2.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.v1_21_R3.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R3.CraftServer; +import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R3.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_21_R3.boss.CraftBossBar; +import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftInventory; +import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftInventoryCustom; +import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftInventoryView; +import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R3.persistence.CraftPersistentDataContainer; +import org.bukkit.craftbukkit.v1_21_R3.util.CraftChatMessage; +import org.bukkit.craftbukkit.v1_21_R3.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R3.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_21_R3.util.CraftNamespacedKey; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java index 5c8db00b28..9b001676ad 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java @@ -13,10 +13,10 @@ import net.minecraft.server.ServerAdvancementManager; import net.minecraft.server.level.ServerPlayer; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_21_R2.CraftServer; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R2.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.v1_21_R3.CraftServer; +import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R3.util.CraftNamespacedKey; import org.bukkit.entity.Player; import java.util.*; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AnimationHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AnimationHelperImpl.java index 4b16704620..456a1ef965 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AnimationHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AnimationHelperImpl.java @@ -2,9 +2,9 @@ import com.denizenscript.denizen.nms.abstracts.AnimationHelper; import net.minecraft.world.entity.Entity; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftHorse; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPolarBear; +import org.bukkit.craftbukkit.v1_21_R3.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R3.entity.CraftHorse; +import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPolarBear; import org.bukkit.entity.EntityType; import org.bukkit.entity.Horse; import org.bukkit.entity.IronGolem; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java index 3e9a243678..b828715671 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java @@ -37,17 +37,17 @@ import org.bukkit.block.BlockState; import org.bukkit.block.CreatureSpawner; import org.bukkit.block.Skull; -import org.bukkit.craftbukkit.v1_21_R2.CraftChunk; -import org.bukkit.craftbukkit.v1_21_R2.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R2.block.CraftBlock; -import org.bukkit.craftbukkit.v1_21_R2.block.CraftBlockEntityState; -import org.bukkit.craftbukkit.v1_21_R2.block.CraftCreatureSpawner; -import org.bukkit.craftbukkit.v1_21_R2.block.CraftSkull; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R2.util.CraftLocation; -import org.bukkit.craftbukkit.v1_21_R2.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_21_R3.CraftChunk; +import org.bukkit.craftbukkit.v1_21_R3.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R3.block.CraftBlock; +import org.bukkit.craftbukkit.v1_21_R3.block.CraftBlockEntityState; +import org.bukkit.craftbukkit.v1_21_R3.block.CraftCreatureSpawner; +import org.bukkit.craftbukkit.v1_21_R3.block.CraftSkull; +import org.bukkit.craftbukkit.v1_21_R3.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R3.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R3.util.CraftMagicNumbers; import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ChunkHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ChunkHelperImpl.java index 511db1e0a1..883a644e12 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ChunkHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ChunkHelperImpl.java @@ -20,8 +20,8 @@ import net.minecraft.world.level.levelgen.Heightmap; import org.bukkit.Chunk; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_21_R2.CraftChunk; -import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R3.CraftChunk; +import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/CustomEntityHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/CustomEntityHelperImpl.java index 51acd9db81..9ee131436a 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/CustomEntityHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/CustomEntityHelperImpl.java @@ -20,8 +20,8 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.scoreboard.Scoreboard; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java index d06c26fea3..26bdd1c342 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java @@ -66,14 +66,14 @@ import org.bukkit.attribute.AttributeInstance; import org.bukkit.block.CreatureSpawner; import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_21_R2.CraftServer; -import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R2.block.CraftBlock; -import org.bukkit.craftbukkit.v1_21_R2.block.CraftCreatureSpawner; -import org.bukkit.craftbukkit.v1_21_R2.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_21_R2.entity.*; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R2.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R3.CraftServer; +import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R3.block.CraftBlock; +import org.bukkit.craftbukkit.v1_21_R3.block.CraftCreatureSpawner; +import org.bukkit.craftbukkit.v1_21_R3.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_21_R3.entity.*; +import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R3.util.CraftLocation; import org.bukkit.entity.*; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.inventory.EquipmentSlot; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java index f2673b498a..cbcb4d4706 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java @@ -18,10 +18,10 @@ import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.phys.Vec3; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftFishHook; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R3.entity.CraftFishHook; +import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack; import org.bukkit.entity.FishHook; import org.bukkit.entity.Player; import org.bukkit.event.entity.CreatureSpawnEvent; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java index e67c7374f9..991f94cb58 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java @@ -70,15 +70,15 @@ import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_21_R2.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R2.CraftServer; -import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R2.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R2.inventory.*; -import org.bukkit.craftbukkit.v1_21_R2.map.CraftMapView; -import org.bukkit.craftbukkit.v1_21_R2.util.CraftMagicNumbers; -import org.bukkit.craftbukkit.v1_21_R2.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.v1_21_R3.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R3.CraftServer; +import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R3.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R3.inventory.*; +import org.bukkit.craftbukkit.v1_21_R3.map.CraftMapView; +import org.bukkit.craftbukkit.v1_21_R3.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_21_R3.util.CraftNamespacedKey; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.inventory.*; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java index b2e3d540be..900146fd23 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java @@ -50,14 +50,14 @@ import org.bukkit.block.Sign; import org.bukkit.block.sign.Side; import org.bukkit.block.sign.SignSide; -import org.bukkit.craftbukkit.v1_21_R2.CraftServer; -import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R2.map.CraftMapCanvas; -import org.bukkit.craftbukkit.v1_21_R2.map.CraftMapView; -import org.bukkit.craftbukkit.v1_21_R2.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R3.CraftServer; +import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R3.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R3.map.CraftMapCanvas; +import org.bukkit.craftbukkit.v1_21_R3.map.CraftMapView; +import org.bukkit.craftbukkit.v1_21_R3.util.CraftLocation; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java index 06df0f4af3..a71c98a8c8 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java @@ -57,14 +57,14 @@ import net.minecraft.world.phys.AABB; import org.bukkit.*; import org.bukkit.boss.BossBar; -import org.bukkit.craftbukkit.v1_21_R2.CraftServer; -import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R2.boss.CraftBossBar; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R2.util.CraftMagicNumbers; -import org.bukkit.craftbukkit.v1_21_R2.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.v1_21_R3.CraftServer; +import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R3.boss.CraftBossBar; +import org.bukkit.craftbukkit.v1_21_R3.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R3.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_21_R3.util.CraftNamespacedKey; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java index 43b0934daf..f97dff634d 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java @@ -16,7 +16,7 @@ import net.minecraft.world.level.storage.PrimaryLevelData; import org.bukkit.Location; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; public class WorldHelperImpl implements WorldHelper { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java index 62aa152328..b978537b17 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java @@ -19,10 +19,10 @@ import org.bukkit.Location; import org.bukkit.NamespacedKey; import org.bukkit.block.Block; -import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftEntityType; -import org.bukkit.craftbukkit.v1_21_R2.util.CraftLocation; -import org.bukkit.craftbukkit.v1_21_R2.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R3.entity.CraftEntityType; +import org.bukkit.craftbukkit.v1_21_R3.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R3.util.CraftNamespacedKey; import org.bukkit.entity.EntityType; import java.lang.invoke.MethodHandle; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java index 9923cfd7bf..4f20342632 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java @@ -21,11 +21,11 @@ import net.minecraft.world.inventory.PlayerEnderChestContainer; import org.bukkit.Bukkit; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_21_R2.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R2.CraftServer; -import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftInventory; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftInventoryPlayer; +import org.bukkit.craftbukkit.v1_21_R3.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R3.CraftServer; +import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftInventory; +import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftInventoryPlayer; import org.bukkit.entity.HumanEntity; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java index 25e7ec4937..b41f9aeffb 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java @@ -19,8 +19,8 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_21_R2.CraftServer; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R3.CraftServer; +import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerRespawnEvent; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/blocks/BlockLightImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/blocks/BlockLightImpl.java index b5d1f16bff..a594380a30 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/blocks/BlockLightImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/blocks/BlockLightImpl.java @@ -21,8 +21,8 @@ import net.minecraft.world.level.lighting.LevelLightEngine; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R2.CraftChunk; -import org.bukkit.craftbukkit.v1_21_R2.block.CraftBlock; +import org.bukkit.craftbukkit.v1_21_R3.CraftChunk; +import org.bukkit.craftbukkit.v1_21_R3.block.CraftBlock; import org.bukkit.util.Vector; import java.lang.invoke.MethodHandle; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakeArrowImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakeArrowImpl.java index 0849ef83b9..a6ce25b9ed 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakeArrowImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakeArrowImpl.java @@ -2,8 +2,8 @@ import com.denizenscript.denizen.nms.interfaces.FakeArrow; import net.minecraft.world.entity.projectile.AbstractArrow; -import org.bukkit.craftbukkit.v1_21_R2.CraftServer; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftAbstractArrow; +import org.bukkit.craftbukkit.v1_21_R3.CraftServer; +import org.bukkit.craftbukkit.v1_21_R3.entity.CraftAbstractArrow; public class CraftFakeArrowImpl extends CraftAbstractArrow implements FakeArrow { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakePlayerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakePlayerImpl.java index f22c98089c..4d8f9fac7d 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakePlayerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakePlayerImpl.java @@ -4,8 +4,8 @@ import com.denizenscript.denizen.nms.NMSHandler; import org.bukkit.Material; import org.bukkit.block.Block; -import org.bukkit.craftbukkit.v1_21_R2.CraftServer; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R3.CraftServer; +import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.metadata.MetadataValue; import org.bukkit.plugin.Plugin; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftItemProjectileImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftItemProjectileImpl.java index f332d8c73a..ba0e570a90 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftItemProjectileImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftItemProjectileImpl.java @@ -3,9 +3,9 @@ import com.denizenscript.denizen.nms.interfaces.ItemProjectile; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; -import org.bukkit.craftbukkit.v1_21_R2.CraftServer; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R3.CraftServer; +import org.bukkit.craftbukkit.v1_21_R3.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; import org.bukkit.projectiles.ProjectileSource; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakeArrowImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakeArrowImpl.java index 5b468cd628..b8e31cba26 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakeArrowImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakeArrowImpl.java @@ -7,8 +7,8 @@ import net.minecraft.world.item.Items; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R2.CraftServer; -import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R3.CraftServer; +import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; import org.bukkit.event.entity.CreatureSpawnEvent; public class EntityFakeArrowImpl extends SpectralArrow { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakePlayerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakePlayerImpl.java index ab350624ff..69754b932e 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakePlayerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakePlayerImpl.java @@ -15,7 +15,7 @@ import net.minecraft.server.network.CommonListenerCookie; import net.minecraft.world.entity.player.Player; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_21_R2.CraftServer; +import org.bukkit.craftbukkit.v1_21_R3.CraftServer; import org.bukkit.event.entity.CreatureSpawnEvent; public class EntityFakePlayerImpl extends ServerPlayer { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java index 0092218ee6..e138391cb3 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java @@ -14,7 +14,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R2.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R3.CraftRegistry; import java.lang.invoke.MethodHandle; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java index 0712401c54..e7d70a5c03 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java @@ -28,7 +28,7 @@ import net.minecraft.world.entity.Relative; import net.minecraft.world.phys.Vec3; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer; import org.bukkit.event.player.PlayerTeleportEvent; import java.lang.reflect.Field; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java index 367740fd00..80dce3bd17 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -31,9 +31,9 @@ import net.minecraft.util.debugchart.LocalSampleLogger; import org.bukkit.Bukkit; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_21_R2.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R3.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer; import org.bukkit.entity.Player; import javax.annotation.Nullable; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java index b1b915ac03..21d9751669 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java @@ -18,7 +18,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.CommonListenerCookie; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_21_R2.block.CraftBlock; +import org.bukkit.craftbukkit.v1_21_R3.block.CraftBlock; import org.bukkit.event.block.SignChangeEvent; public class DenizenPacketListenerImpl extends AbstractListenerPlayInImpl { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java index a1e57fd85e..221c4a1f03 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java @@ -23,10 +23,10 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.PalettedContainer; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_21_R2.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R2.block.CraftBlockStates; -import org.bukkit.craftbukkit.v1_21_R2.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_21_R3.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R3.block.CraftBlockStates; +import org.bukkit.craftbukkit.v1_21_R3.block.data.CraftBlockData; import java.lang.invoke.MethodHandle; import java.lang.reflect.Constructor; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/ActionBarEventPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/ActionBarEventPacketHandlers.java index 94d4a1827d..cbd336cbfe 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/ActionBarEventPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/ActionBarEventPacketHandlers.java @@ -8,7 +8,7 @@ import com.denizenscript.denizencore.objects.core.ElementTag; import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundSetActionBarTextPacket; -import org.bukkit.craftbukkit.v1_21_R2.util.CraftChatMessage; +import org.bukkit.craftbukkit.v1_21_R3.util.CraftChatMessage; public class ActionBarEventPacketHandlers { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java index edc0a34359..70f369b245 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java @@ -13,8 +13,8 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.PositionMoveRotation; import net.minecraft.world.phys.Vec3; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R2.util.CraftVector; +import org.bukkit.craftbukkit.v1_21_R3.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R3.util.CraftVector; import org.bukkit.util.Vector; import java.lang.reflect.Field; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java index 37d9daee59..c9a71b1573 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java @@ -14,7 +14,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.PositionMoveRotation; import net.minecraft.world.level.Level; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R3.entity.CraftEntity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java index 7e2301e469..c319db2ec6 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java @@ -12,7 +12,7 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack; import java.util.ArrayList; import java.util.List; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HideParticlesPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HideParticlesPacketHandlers.java index 7f36f5928c..5317f47957 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HideParticlesPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HideParticlesPacketHandlers.java @@ -4,7 +4,7 @@ import com.denizenscript.denizen.utilities.packets.HideParticles; import net.minecraft.network.protocol.game.ClientboundLevelParticlesPacket; import org.bukkit.Particle; -import org.bukkit.craftbukkit.v1_21_R2.CraftParticle; +import org.bukkit.craftbukkit.v1_21_R3.CraftParticle; import java.util.Set; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java index 5c12d55c84..fdd2032e3e 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java @@ -7,7 +7,7 @@ import net.md_5.bungee.chat.ComponentSerializer; import net.minecraft.network.protocol.game.ClientboundPlayerChatPacket; import net.minecraft.network.protocol.game.ClientboundSystemChatPacket; -import org.bukkit.craftbukkit.v1_21_R2.util.CraftChatMessage; +import org.bukkit.craftbukkit.v1_21_R3.util.CraftChatMessage; import java.lang.reflect.Field; From d8d4b9585c6d7d8db2871d03e3e9980285f45c34 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Tue, 3 Dec 2024 22:03:44 +0000 Subject: [PATCH 100/280] 1.21.4 part 3: update reflection mappings --- .../denizen/nms/v1_21/ReflectionMappingsInfo.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java index 29fd56de6b..6a4717e85e 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java @@ -19,21 +19,21 @@ public class ReflectionMappingsInfo { // net.minecraft.world.entity.LivingEntity public static String LivingEntity_attackStrengthTicker = "aS"; - public static String LivingEntity_autoSpinAttackTicks = "bC"; + public static String LivingEntity_autoSpinAttackTicks = "bB"; public static String LivingEntity_setLivingEntityFlag_method = "c"; // net.minecraft.world.entity.player.Player public static String Player_DATA_PLAYER_ABSORPTION_ID = "d"; - public static String Player_DATA_PLAYER_MODE_CUSTOMISATION = "bX"; + public static String Player_DATA_PLAYER_MODE_CUSTOMISATION = "bW"; // net.minecraft.server.level.ServerPlayer public static String ServerPlayer_respawnForced = "dn"; // net.minecraft.world.entity.monster.EnderMan - public static String EnderMan_DATA_CREEPY = "cc"; + public static String EnderMan_DATA_CREEPY = "cb"; // net.minecraft.world.entity.monster.Zombie - public static String Zombie_inWaterTime = "cn"; + public static String Zombie_inWaterTime = "cm"; // net.minecraft.world.item.Item public static String Item_components = "c"; From 45f47cb2f3a229efa398ca88c72cb461c3505d85 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Tue, 3 Dec 2024 22:05:05 +0000 Subject: [PATCH 101/280] 1.21.4 part 4: update mappings version check --- .../main/java/com/denizenscript/denizen/nms/v1_21/Handler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java index 3bc759ad19..cd10d3ab81 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java @@ -150,7 +150,7 @@ public void undisableAsyncCatcher() { @Override public boolean isCorrectMappingsCode() { - return CraftMagicNumbers.INSTANCE.getMappingsVersion().equals("61a218cda78417b6039da56e08194083"); + return CraftMagicNumbers.INSTANCE.getMappingsVersion().equals("60ac387ca8007aa018e6aeb394a6988c"); } @Override From 5fdfa74f270777a0c28e8f75ef49427f6c61071e Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Tue, 3 Dec 2024 22:35:30 +0000 Subject: [PATCH 102/280] 1.21.4 part 5: initial code updates --- .../nms/v1_21/helpers/FishingHelperImpl.java | 2 +- .../nms/v1_21/helpers/PlayerHelperImpl.java | 4 ++-- .../nms/v1_21/impl/ProfileEditorImpl.java | 2 +- .../handlers/AbstractListenerPlayInImpl.java | 16 ++++++++++++++-- .../packet/TablistUpdateEventPacketHandlers.java | 2 +- 5 files changed, 19 insertions(+), 7 deletions(-) diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java index cbcb4d4706..badb0998db 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java @@ -80,7 +80,7 @@ public ItemStack getRandomReward(FishingHook nmsHook, ResourceKey key @Override public FishHook spawnHook(Location location, Player player) { ServerLevel nmsWorld = ((CraftWorld) location.getWorld()).getHandle(); - FishingHook hook = new FishingHook(((CraftPlayer) player).getHandle(), nmsWorld, 0, 0, new ItemStack(Items.FISHING_ROD)); + FishingHook hook = new FishingHook(((CraftPlayer) player).getHandle(), nmsWorld, 0, 0); nmsWorld.addFreshEntity(hook, CreatureSpawnEvent.SpawnReason.CUSTOM); return (FishHook) hook.getBukkitEntity(); } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java index a71c98a8c8..f5dc481589 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java @@ -427,8 +427,8 @@ public void sendPlayerInfoAddPacket(Player player, EnumSet edit if (texture != null) { profile.getProperties().put("textures", new Property("textures", texture, signature)); } - // TODO: 1.21.3: Player list order support - ClientboundPlayerInfoUpdatePacket.Entry entry = new ClientboundPlayerInfoUpdatePacket.Entry(id, profile, listed, latency, gameMode == null ? null : GameType.byId(gameMode.getValue()), display == null ? null : Handler.componentToNMS(FormattedTextHelper.parse(display, ChatColor.WHITE)), player.getPlayerListOrder(), null); + // TODO: 1.21.3: Player list order and hat visibility support + ClientboundPlayerInfoUpdatePacket.Entry entry = new ClientboundPlayerInfoUpdatePacket.Entry(id, profile, listed, latency, gameMode == null ? null : GameType.byId(gameMode.getValue()), display == null ? null : Handler.componentToNMS(FormattedTextHelper.parse(display, ChatColor.WHITE)), true, player.getPlayerListOrder(), null); PacketHelperImpl.send(player, ProfileEditorImpl.createInfoPacket(actions, List.of(entry))); } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java index b41f9aeffb..6ec362989b 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java @@ -96,7 +96,7 @@ public static ClientboundPlayerInfoUpdatePacket processPlayerInfoUpdatePacket(De } String listRename = RenameCommand.getCustomNameFor(entry.profileId(), networkManager.player.getBukkitEntity(), true); Component displayName = listRename != null ? Handler.componentToNMS(FormattedTextHelper.parse(listRename, ChatColor.WHITE)) : entry.displayName(); - ClientboundPlayerInfoUpdatePacket.Entry modifiedEntry = new ClientboundPlayerInfoUpdatePacket.Entry(entry.profileId(), modifiedProfile, entry.listed(), entry.latency(), entry.gameMode(), displayName, entry.listOrder(), entry.chatSession()); + ClientboundPlayerInfoUpdatePacket.Entry modifiedEntry = new ClientboundPlayerInfoUpdatePacket.Entry(entry.profileId(), modifiedProfile, entry.listed(), entry.latency(), entry.gameMode(), displayName, entry.showHat(), entry.listOrder(), entry.chatSession()); modifiedEntries.add(modifiedEntry); } return createInfoPacket(actions, modifiedEntries); diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java index e7d70a5c03..79af1a511d 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java @@ -247,9 +247,21 @@ public void handleSetCommandMinecart(ServerboundSetCommandMinecartPacket packet) } @Override - public void handlePickItem(ServerboundPickItemPacket packet) { + public void handleAcceptPlayerLoad(ServerboundPlayerLoadedPacket packet) { if (handlePacketIn(packet)) { return; } - oldListener.handlePickItem(packet); + oldListener.handleAcceptPlayerLoad(packet); + } + + @Override + public void handlePickItemFromBlock(ServerboundPickItemFromBlockPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handlePickItemFromBlock(packet); + } + + @Override + public void handlePickItemFromEntity(ServerboundPickItemFromEntityPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handlePickItemFromEntity(packet); } @Override diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java index c72fa0ab28..a23de7900f 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java @@ -98,7 +98,7 @@ public static Packet processTablistPacket(DenizenNetwo newProfile.getProperties().put("textures", new Property("textures", data.texture, data.signature)); } ClientboundPlayerInfoUpdatePacket.Entry entry = new ClientboundPlayerInfoUpdatePacket.Entry(newProfile.getId(), newProfile, data.isListed, data.latency, data.gamemode == null ? null : GameType.byName(CoreUtilities.toLowerCase(data.gamemode)), - data.display == null ? null : Handler.componentToNMS(FormattedTextHelper.parse(data.display, ChatColor.WHITE)), update.listOrder(), update.chatSession()); + data.display == null ? null : Handler.componentToNMS(FormattedTextHelper.parse(data.display, ChatColor.WHITE)), update.showHat(), update.listOrder(), update.chatSession()); networkManager.oldManager.send(ProfileEditorImpl.createInfoPacket(infoPacket.actions(), Collections.singletonList(entry))); } } From df04be959da2ae85fb432097fbc953c0b5ed3335 Mon Sep 17 00:00:00 2001 From: MCSamuel Date: Thu, 5 Dec 2024 07:36:18 -0800 Subject: [PATCH 103/280] EntityAwake Property (#2676) * EntityAwake Property * Aya update --- .../objects/properties/PropertyRegistry.java | 1 + .../properties/entity/EntityAwake.java | 41 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAwake.java diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java index 829f50e409..e788cd358f 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java @@ -44,6 +44,7 @@ public static void registerMainProperties() { PropertyParser.registerProperty(EntityAttributeModifiers.class, EntityTag.class); PropertyParser.registerProperty(EntityArmorPose.class, EntityTag.class); PropertyParser.registerProperty(EntityArms.class, EntityTag.class); + PropertyParser.registerProperty(EntityAwake.class, EntityTag.class); PropertyParser.registerProperty(EntityAware.class, EntityTag.class); if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { PropertyParser.registerProperty(EntityBackgroundColor.class, EntityTag.class); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAwake.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAwake.java new file mode 100644 index 0000000000..00e670608e --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAwake.java @@ -0,0 +1,41 @@ +package com.denizenscript.denizen.objects.properties.entity; + +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; +import org.bukkit.entity.Bat; + +public class EntityAwake extends EntityProperty { + + // <--[property] + // @object EntityTag + // @name awake + // @input ElementTag(Boolean) + // @description + // Controls whether a bat is flying (awake/true) or hanging (asleep/false). + + public static boolean describes(EntityTag entity) { + return entity.getBukkitEntity() instanceof Bat; + } + + @Override + public ElementTag getPropertyValue() { + return new ElementTag(as(Bat.class).isAwake()); + } + + @Override + public void setPropertyValue(ElementTag param, Mechanism mechanism) { + if (mechanism.requireBoolean()) { + as(Bat.class).setAwake(param.asBoolean()); + } + } + + @Override + public String getPropertyId() { + return "awake"; + } + + public static void register() { + autoRegister("awake", EntityAwake.class, ElementTag.class, false); + } +} From beed811ec18e83aa01cb51db2409bb4e07f7e2a3 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Fri, 6 Dec 2024 04:15:35 -0800 Subject: [PATCH 104/280] fix back-support of entity attribute_base_values --- .../entity/EntityAttributeBaseValues.java | 22 +++++++++---------- .../entity/EntityAttributeModifiers.java | 4 ++-- .../denizen/utilities/Utilities.java | 12 ++++++---- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAttributeBaseValues.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAttributeBaseValues.java index 599652b6f8..49f7068dc6 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAttributeBaseValues.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAttributeBaseValues.java @@ -44,10 +44,10 @@ public EntityAttributeBaseValues(EntityTag entity) { public MapTag attributeBaseValues() { MapTag result = new MapTag(); Attributable ent = getAttributable(); - for (Attribute attr : Attribute.values()) { + for (Attribute attr : Utilities.listTypesRaw(Attribute.class)) { AttributeInstance instance = ent.getAttribute(attr); if (instance != null) { - result.putObject(attr.name(), new ElementTag(instance.getBaseValue())); + result.putObject(Utilities.enumlikeToElement(attr).asString(), new ElementTag(instance.getBaseValue())); } } return result; @@ -84,7 +84,7 @@ public static void register() { attribute.echoError("Invalid entity.has_attribute[...] input: must be a valid attribute name."); return null; } - Attribute attr = Attribute.valueOf(attribute.getParam().toUpperCase()); + Attribute attr = Utilities.elementToEnumlike(attribute.getParamElement(), Attribute.class); return new ElementTag(object.getAttributable().getAttribute(attr) != null); }); @@ -104,10 +104,10 @@ public static void register() { attribute.echoError("Invalid entity.attribute_value[...] input: must be a valid attribute name."); return null; } - Attribute attr = Attribute.valueOf(attribute.getParam().toUpperCase()); + Attribute attr = Utilities.elementToEnumlike(attribute.getParamElement(), Attribute.class); AttributeInstance instance = object.getAttributable().getAttribute(attr); if (instance == null) { - attribute.echoError("Attribute " + attr.name() + " is not applicable to entity of type " + object.entity.getBukkitEntityType().name()); + attribute.echoError("Attribute " + Utilities.enumlikeToElement(attr) + " is not applicable to entity of type " + object.entity.getBukkitEntityType().name()); return null; } return new ElementTag(instance.getValue()); @@ -129,10 +129,10 @@ public static void register() { attribute.echoError("Invalid entity.attribute_base_value[...] input: must be a valid attribute name."); return null; } - Attribute attr = Attribute.valueOf(attribute.getParam().toUpperCase()); + Attribute attr = Utilities.elementToEnumlike(attribute.getParamElement(), Attribute.class); AttributeInstance instance = object.getAttributable().getAttribute(attr); if (instance == null) { - attribute.echoError("Attribute " + attr.name() + " is not applicable to entity of type " + object.entity.getBukkitEntityType().name()); + attribute.echoError("Attribute " + Utilities.enumlikeToElement(attr) + " is not applicable to entity of type " + object.entity.getBukkitEntityType().name()); return null; } return new ElementTag(instance.getBaseValue()); @@ -154,10 +154,10 @@ public static void register() { attribute.echoError("Invalid entity.attribute_default_value[...] input: must be a valid attribute name."); return null; } - Attribute attr = Attribute.valueOf(attribute.getParam().toUpperCase()); + Attribute attr = Utilities.elementToEnumlike(attribute.getParamElement(), Attribute.class); AttributeInstance instance = object.getAttributable().getAttribute(attr); if (instance == null) { - attribute.echoError("Attribute " + attr.name() + " is not applicable to entity of type " + object.entity.getBukkitEntityType().name()); + attribute.echoError("Attribute " + Utilities.enumlikeToElement(attr) + " is not applicable to entity of type " + object.entity.getBukkitEntityType().name()); return null; } return new ElementTag(instance.getDefaultValue()); @@ -186,10 +186,10 @@ public void adjust(Mechanism mechanism) { MapTag input = mechanism.valueAsType(MapTag.class); Attributable ent = getAttributable(); for (Map.Entry subValue : input.entrySet()) { - Attribute attr = Attribute.valueOf(subValue.getKey().str.toUpperCase()); + Attribute attr = Utilities.elementToEnumlike(new ElementTag(subValue.getKey().str), Attribute.class); AttributeInstance instance = ent.getAttribute(attr); if (instance == null) { - mechanism.echoError("Attribute " + attr.name() + " is not applicable to entity of type " + entity.getBukkitEntityType().name()); + mechanism.echoError("Attribute " + Utilities.enumlikeToElement(attr) + " is not applicable to entity of type " + entity.getBukkitEntityType().name()); continue; } ElementTag value = subValue.getValue().asElement(); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAttributeModifiers.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAttributeModifiers.java index d6ef4c54c2..79f932d690 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAttributeModifiers.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAttributeModifiers.java @@ -180,7 +180,7 @@ public ListTag getAttributeModifierList(AttributeInstance instance) { public MapTag getAttributeModifiers() { MapTag map = new MapTag(); - for (Attribute attribute : Attribute.values()) { + for (Attribute attribute : Utilities.listTypesRaw(Attribute.class)) { ListTag list = getAttributeModifierList(getAttributable().getAttribute(attribute)); if (list != null) { map.putObject(attribute.name(), list); @@ -425,7 +425,7 @@ public void adjust(Mechanism mechanism) { else { id = UUID.fromString(toRemove); } - for (Attribute attr : Attribute.values()) { + for (Attribute attr : Utilities.listTypesRaw(Attribute.class)) { AttributeInstance instance = ent.getAttribute(attr); if (instance == null) { continue; diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java index 6f8b66c1f2..9f19851c49 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java @@ -546,11 +546,15 @@ public static ArrayList allMaterialsThatMatch(String matcherText) { } // TODO once 1.21 is the minimum supported version, replace with direct registry-based handling - public static ListTag listTypes(Class type) { + public static List listTypesRaw(Class type) { if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && Keyed.class.isAssignableFrom(type)) { - return registryKeys(Bukkit.getRegistry((Class) type)); + return (List) Bukkit.getRegistry((Class) type).stream().toList(); } - return new ListTag(Arrays.asList(((Class>) type).getEnumConstants()), ElementTag::new); + return (List) Arrays.asList(((Class>) type).getEnumConstants()); + } + + public static ListTag listTypes(Class type) { + return new ListTag(listTypesRaw(type), Utilities::enumlikeToElement); } public static ListTag listLegacyTypes(Class type) { @@ -563,7 +567,7 @@ public static ElementTag enumlikeToElement(Object val) { return new ElementTag(((Enum) val).name()); } if (val instanceof Keyed) { - return new ElementTag(namespacedKeyToString(((Keyed) val).getKey())); + return new ElementTag(namespacedKeyToString(((Keyed) val).getKey()), true); } return new ElementTag(val.toString()); } From 20913326f4d3a7055d209d5b33bd71a6db862a99 Mon Sep 17 00:00:00 2001 From: Hydroxycobalamin <54799651+Hydroxycobalamin@users.noreply.github.com> Date: Sat, 7 Dec 2024 10:40:32 +0100 Subject: [PATCH 105/280] Add MoistureChangeEvent (#2644) * add MoistureChangeScriptEvent * update meta * add old and new_material, improve meta * oldMaterial equals the old material and newMaterial equals the new material * fix * cleanup, remove redundant old / new material context tags, replace with context.material * use oldFarmland --- .../denizen/events/ScriptEventRegistry.java | 1 + .../block/MoistureChangeScriptEvent.java | 86 +++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 plugin/src/main/java/com/denizenscript/denizen/events/block/MoistureChangeScriptEvent.java diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java index 3b5120bc76..6d1710666b 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java @@ -87,6 +87,7 @@ public static void registerMainEvents() { ScriptEvent.registerScriptEvent(LeafDecaysScriptEvent.class); ScriptEvent.registerScriptEvent(LiquidLevelChangeScriptEvent.class); ScriptEvent.registerScriptEvent(LiquidSpreadScriptEvent.class); + ScriptEvent.registerScriptEvent(MoistureChangeScriptEvent.class); ScriptEvent.registerScriptEvent(NoteBlockPlaysNoteScriptEvent.class); ScriptEvent.registerScriptEvent(PistonExtendsScriptEvent.class); ScriptEvent.registerScriptEvent(PistonRetractsScriptEvent.class); diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/block/MoistureChangeScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/block/MoistureChangeScriptEvent.java new file mode 100644 index 0000000000..320fd4ee20 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/events/block/MoistureChangeScriptEvent.java @@ -0,0 +1,86 @@ +package com.denizenscript.denizen.events.block; + +import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.objects.LocationTag; +import com.denizenscript.denizen.objects.MaterialTag; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; +import org.bukkit.block.data.type.Farmland; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.MoistureChangeEvent; + +public class MoistureChangeScriptEvent extends BukkitScriptEvent implements Listener { + + // <--[event] + // @Events + // farmland moisture level changes + // + // @Group Block + // + // @Location true + // + // @Triggers when a farmland's moisture level changes. + // + // @Switch from: to only process the event when the previous moisture level matches the input. + // @Switch to: to only process the event when the new moisture level matches the input. + // + // @Context + // returns the LocationTag of the farmland block. + // returns the MaterialTag of the farmland block that changed the moisture level. + // returns the ElementTag(Number) of the previous moisture level. + // returns the ElementTag(Number) of the new moisture level. + // + // @Cancellable true + // + // @Example + // # Announce when farmland begins to dry out. + // on farmland moisture level changes from:7 to:6: + // - announce "Farmland at location lost its water source and began to dry!" + // + // --> + + public MoistureChangeScriptEvent() { + registerCouldMatcher("farmland moisture level changes"); + registerSwitches("from", "to"); + } + + public MoistureChangeEvent event; + public LocationTag location; + public Farmland oldFarmland; + public Farmland newFarmland; + + @Override + public boolean matches(ScriptPath path) { + if (!runInCheck(path, location)) { + return false; + } + if (!path.checkSwitch("from", String.valueOf(oldFarmland.getMoisture()))) { + return false; + } + if (!path.checkSwitch("to", String.valueOf(newFarmland.getMoisture()))) { + return false; + } + return super.matches(path); + } + + @Override + public ObjectTag getContext(String name) { + return switch (name) { + case "location" -> location; + case "material" -> new MaterialTag(oldFarmland); + case "old_level" -> new ElementTag(oldFarmland.getMoisture()); + case "new_level" -> new ElementTag(newFarmland.getMoisture()); + default -> super.getContext(name); + }; + } + + @EventHandler + public void onMoistureChange(MoistureChangeEvent event) { + location = new LocationTag(event.getBlock().getLocation()); + oldFarmland = (Farmland) event.getBlock().getBlockData(); + newFarmland = (Farmland) event.getNewState().getBlockData(); + this.event = event; + fire(event); + } +} From f54be298f9563deb838a6d29f8ca355368a70d37 Mon Sep 17 00:00:00 2001 From: MCSamuel Date: Mon, 9 Dec 2024 11:57:16 -0800 Subject: [PATCH 106/280] Property updates & fixes (#2673) * Added a couple missing @Override's and converted a couple tags and mechs to properties. * Fixed CannotEnterHive mechanic not being processed * EntityAwake property for bats * unnecessary import * Moving to separate branch * Aya Fixes --- .../objects/properties/PropertyRegistry.java | 1 + .../properties/entity/EntityCanJoinRaid.java | 76 ++++----------- .../entity/EntityCannotEnterHive.java | 94 ++++--------------- .../entity/EntityPotionEffects.java | 1 + .../properties/entity/EntityTrades.java | 1 + .../properties/item/ItemFrameInvisible.java | 1 + .../properties/item/ItemUnbreakable.java | 1 + .../objects/properties/trade/TradeDemand.java | 1 + 8 files changed, 42 insertions(+), 134 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java index e788cd358f..688c48a01a 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java @@ -59,6 +59,7 @@ public static void registerMainProperties() { } PropertyParser.registerProperty(EntityCanBreakDoors.class, EntityTag.class); PropertyParser.registerProperty(EntityCanJoinRaid.class, EntityTag.class); + PropertyParser.registerProperty(EntityCannotEnterHive.class, EntityTag.class); PropertyParser.registerProperty(EntityCharged.class, EntityTag.class); PropertyParser.registerProperty(EntityChestCarrier.class, EntityTag.class); PropertyParser.registerProperty(EntityColor.class, EntityTag.class); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityCanJoinRaid.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityCanJoinRaid.java index 0240313d76..712e316650 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityCanJoinRaid.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityCanJoinRaid.java @@ -2,41 +2,33 @@ import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizencore.objects.Mechanism; -import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; -import com.denizenscript.denizencore.objects.properties.Property; -import com.denizenscript.denizencore.objects.properties.PropertyParser; import org.bukkit.entity.Raider; -public class EntityCanJoinRaid implements Property { +public class EntityCanJoinRaid extends EntityProperty { - public static boolean describes(ObjectTag entity) { - return entity instanceof EntityTag - && ((EntityTag) entity).getBukkitEntity() instanceof Raider; - } + // <--[property] + // @object EntityTag + // @name can_join_raid + // @input ElementTag(Boolean) + // @description + // Controls whether a raider mob (like a pillager), is allowed to join active raids. + // --> - public static EntityCanJoinRaid getFrom(ObjectTag entity) { - if (!describes(entity)) { - return null; - } - else { - return new EntityCanJoinRaid((EntityTag) entity); - } + public static boolean describes(EntityTag entity) { + return entity.getBukkitEntity() instanceof Raider; } - public static final String[] handledMechs = new String[] { - "can_join_raid" - }; - - public EntityCanJoinRaid(EntityTag entity) { - this.entity = entity; + @Override + public ElementTag getPropertyValue() { + return new ElementTag(as(Raider.class).isCanJoinRaid()); } - EntityTag entity; - @Override - public String getPropertyString() { - return getRaider().isCanJoinRaid() ? "true" : "false"; + public void setPropertyValue(ElementTag param, Mechanism mechanism) { + if (mechanism.requireBoolean()) { + as(Raider.class).setCanJoinRaid(param.asBoolean()); + } } @Override @@ -44,39 +36,7 @@ public String getPropertyId() { return "can_join_raid"; } - public Raider getRaider() { - return (Raider) entity.getBukkitEntity(); - } - public static void register() { - - // <--[tag] - // @attribute - // @returns ElementTag(Boolean) - // @mechanism EntityTag.can_join_raid - // @group properties - // @description - // If the entity is raider mob (like a pillager), returns whether the entity is allowed to join active raids. - // --> - PropertyParser.registerTag(EntityCanJoinRaid.class, ElementTag.class, "can_join_raid", (attribute, object) -> { - return new ElementTag(object.getRaider().isCanJoinRaid()); - }); - } - - @Override - public void adjust(Mechanism mechanism) { - - // <--[mechanism] - // @object EntityTag - // @name can_join_raid - // @input ElementTag(Boolean) - // @description - // If the entity is raider mob (like a pillager), changes whether the entity is allowed to join active raids. - // @tags - // - // --> - if (mechanism.matches("can_join_raid") && mechanism.requireBoolean()) { - getRaider().setCanJoinRaid(mechanism.getValue().asBoolean()); - } + autoRegister("can_join_raid", EntityCanJoinRaid.class, ElementTag.class, false); } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityCannotEnterHive.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityCannotEnterHive.java index 10d1d84e92..5c9fb81b71 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityCannotEnterHive.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityCannotEnterHive.java @@ -2,97 +2,39 @@ import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizencore.objects.Mechanism; -import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.DurationTag; -import com.denizenscript.denizencore.objects.properties.Property; -import com.denizenscript.denizencore.tags.Attribute; import org.bukkit.entity.Bee; -import org.bukkit.entity.Entity; -public class EntityCannotEnterHive implements Property { +public class EntityCannotEnterHive extends EntityProperty { - public static boolean describes(ObjectTag entity) { - if (!(entity instanceof EntityTag)) { - return false; - } - Entity bukkitEntity = ((EntityTag) entity).getBukkitEntity(); - return bukkitEntity instanceof Bee; - } - - public static EntityCannotEnterHive getFrom(ObjectTag entity) { - if (!describes(entity)) { - return null; - } - else { - return new EntityCannotEnterHive((EntityTag) entity); - } - } - - public static final String[] handledTags = new String[] { - "cannot_enter_hive" - }; - - public static final String[] handledMechs = new String[] { - "cannot_enter_hive" - }; - - public EntityCannotEnterHive(EntityTag entity) { - this.entity = entity; - } - - EntityTag entity; + // <--[property] + // @object EntityTag + // @name cannot_enter_hive + // @input DurationTag + // @description + // Controls the minimum duration until a Bee is able to enter a hive. + // --> - public Bee getBee() { - return (Bee) entity.getBukkitEntity(); + public static boolean describes(EntityTag entity) { + return entity.getBukkitEntity() instanceof Bee; } @Override - public String getPropertyString() { - return new DurationTag((long) getBee().getCannotEnterHiveTicks()).identify(); + public DurationTag getPropertyValue() { + return new DurationTag((long) as(Bee.class).getCannotEnterHiveTicks()); } @Override - public String getPropertyId() { - return "flower"; + public void setPropertyValue(DurationTag param, Mechanism mechanism) { + as(Bee.class).setCannotEnterHiveTicks(param.getTicksAsInt()); } @Override - public ObjectTag getObjectAttribute(Attribute attribute) { - - if (attribute == null) { - return null; - } - - // <--[tag] - // @attribute - // @returns DurationTag - // @mechanism EntityTag.cannot_enter_hive - // @group properties - // @description - // Returns the minimum duration until a Bee entity is allowed to enter a hive. - // --> - if (attribute.startsWith("cannot_enter_hive")) { - return new DurationTag((long) getBee().getCannotEnterHiveTicks()) - .getObjectAttribute(attribute.fulfill(1)); - } - - return null; + public String getPropertyId() { + return "cannot_enter_hive"; } - @Override - public void adjust(Mechanism mechanism) { - - // <--[mechanism] - // @object EntityTag - // @name cannot_enter_hive - // @input DurationTag - // @description - // Changes the minimum duration until a Bee entity is allowed to enter a hive. - // @tags - // - // --> - if (mechanism.matches("cannot_enter_hive") && mechanism.requireObject(DurationTag.class)) { - getBee().setCannotEnterHiveTicks(mechanism.valueAsType(DurationTag.class).getTicksAsInt()); - } + public static void register() { + autoRegister("cannot_enter_hive", EntityCannotEnterHive.class, DurationTag.class, false); } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotionEffects.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotionEffects.java index ea4c689b05..eddc57814a 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotionEffects.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotionEffects.java @@ -87,6 +87,7 @@ public String getPropertyString() { return effects.isEmpty() ? null : effects.identify(); } + @Override public String getPropertyId() { return "potion_effects"; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityTrades.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityTrades.java index 70c6570857..c0d95178e7 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityTrades.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityTrades.java @@ -52,6 +52,7 @@ public String getPropertyString() { return getTradeRecipes().identify(); } + @Override public String getPropertyId() { return "trades"; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFrameInvisible.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFrameInvisible.java index 3208081937..960e4b41c8 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFrameInvisible.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFrameInvisible.java @@ -78,6 +78,7 @@ public String getPropertyString() { return null; } + @Override public String getPropertyId() { return "invisible"; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemUnbreakable.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemUnbreakable.java index ab93e41169..f9fecb3d00 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemUnbreakable.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemUnbreakable.java @@ -60,6 +60,7 @@ public String getPropertyString() { return (item.getItemMeta() != null && item.getItemMeta().isUnbreakable()) ? "true" : null; } + @Override public String getPropertyId() { return "unbreakable"; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/trade/TradeDemand.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/trade/TradeDemand.java index 6aac7cc49d..3fc6595a4a 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/trade/TradeDemand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/trade/TradeDemand.java @@ -30,6 +30,7 @@ public void setPropertyValue(ElementTag val, Mechanism mechanism) { } } + @Override public String getPropertyId() { return "demand"; } From 74ec6a54f1c5c0f131f5056d420c6f30c6c1444f Mon Sep 17 00:00:00 2001 From: MCSamuel Date: Mon, 9 Dec 2024 12:10:43 -0800 Subject: [PATCH 107/280] `EntityTag.variant` property for wolves (#2677) * Wolf Variants * Fixed * Meta fix * Minor fixes * AllowedColors cross-version compatibility * Moved variants to separate file/property * Typo * Aya Fixes * Spigot site --- .../objects/properties/PropertyRegistry.java | 3 ++ .../properties/entity/EntityVariant.java | 47 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityVariant.java diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java index 688c48a01a..e3cfb9d22a 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java @@ -186,6 +186,9 @@ public static void registerMainProperties() { PropertyParser.registerProperty(EntityTrapped.class, EntityTag.class); PropertyParser.registerProperty(EntityTrapTime.class, EntityTag.class); } + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + PropertyParser.registerProperty(EntityVariant.class, EntityTag.class); + } if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { PropertyParser.registerProperty(EntityViewRange.class, EntityTag.class); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityVariant.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityVariant.java new file mode 100644 index 0000000000..45f433fcf1 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityVariant.java @@ -0,0 +1,47 @@ +package com.denizenscript.denizen.objects.properties.entity; + +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.utilities.Utilities; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; +import org.bukkit.entity.Wolf; + +public class EntityVariant extends EntityProperty { + + // <--[property] + // @object EntityTag + // @name variant + // @input ElementTag + // @description + // Controls which variant a wolf is. + // A list of valid variants can be found at <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/entity/Wolf.Variant.html>. + + public static boolean describes(EntityTag entity) { + return entity.getBukkitEntity() instanceof Wolf; + } + + @Override + public ElementTag getPropertyValue() { + return new ElementTag(Utilities.namespacedKeyToString(as(Wolf.class).getVariant().getKey())); + } + + @Override + public void setPropertyValue(ElementTag variant, Mechanism mechanism) { + Wolf.Variant wolfVariety = Utilities.elementToEnumlike(variant, Wolf.Variant.class); + if (wolfVariety != null) { + as(Wolf.class).setVariant(wolfVariety); + } + else { + mechanism.echoError("Invalid wolf variant specified: " + variant); + } + } + + @Override + public String getPropertyId() { + return "variant"; + } + + public static void register() { + autoRegister("variant", EntityVariant.class, ElementTag.class, false); + } +} From 8fe6e7982c47f0c198081941bb4ca2085c3ed729 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Sat, 14 Dec 2024 22:55:26 +0000 Subject: [PATCH 108/280] Legacy Spigot names compatibility (#2684) * Compatibility with legacy Spigot names * No need to pass a `TagContext` * Allow more types * Suppress the suppression --- .../denizenscript/denizen/nms/NMSHandler.java | 4 +++ .../denizen/utilities/Settings.java | 3 ++- .../denizen/utilities/Utilities.java | 27 ++++++++++++++----- plugin/src/main/resources/config.yml | 3 +++ .../denizen/nms/v1_21/Handler.java | 20 ++++++++------ 5 files changed, 42 insertions(+), 15 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java b/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java index a170628d46..a7e1becf71 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java @@ -145,4 +145,8 @@ public UUID getBossbarUUID(BossBar bar) { public void setBossbarUUID(BossBar bar, UUID id) { } + + public String updateLegacyName(Class type, String legacyName) { + return legacyName; + } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/Settings.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/Settings.java index 5676ac5d30..4207bdba19 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/Settings.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/Settings.java @@ -129,6 +129,7 @@ public static void refillCache() { cache_packetInterception = config.getBoolean("Packets.Interception", true); cache_packetInterceptAutoInit = config.getBoolean("Packets.Auto init", false); cache_commandScriptAutoInit = config.getBoolean("Scripts.Command.Auto init", false); + cache_legacySpigotNamesSupport = config.getBoolean("Scripts.Legacy Spigot names support", false); PlayerFlagHandler.cacheTimeoutSeconds = config.getLong("Saves.Offline player cache timeout", 300); PlayerFlagHandler.asyncPreload = config.getBoolean("Saves.Load async on login", true); PlayerFlagHandler.saveOnlyWhenWorldSaveOn = config.getBoolean("Saves.Only save if world save is on", false); @@ -162,7 +163,7 @@ public static void refillCache() { cache_chatGloballyIfFailedChatTriggers, cache_chatGloballyIfNoChatTriggers, cache_chatGloballyIfUninteractable, cache_worldScriptChatEventAsynchronous, cache_packetInterception, cache_createWorldSymbols, cache_createWorldWeirdPaths, - cache_commandScriptAutoInit, cache_packetInterceptAutoInit, cache_warnOnAsyncPackets; + cache_commandScriptAutoInit, cache_packetInterceptAutoInit, cache_warnOnAsyncPackets, cache_legacySpigotNamesSupport; public static volatile boolean cache_useDefaultScriptPath; public static volatile String cache_getAlternateScriptPath; diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java index 9f19851c49..aa4c3e5596 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java @@ -582,17 +582,32 @@ public static ElementTag enumLikeToLegacyElement(Object val) { throw new UnsupportedOperationException("Cannot get legacy name element, value isn't an enum: " + val); } - // TODO: need proper input backsupport, see https://discord.com/channels/315163488085475337/1011496047811506227/1301272242386370580 public static T elementToEnumlike(ElementTag element, Class type) { - if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && Keyed.class.isAssignableFrom(type)) { - return (T) Bukkit.getRegistry((Class) type).get(parseNamespacedKey(element.asString())); + return elementToEnumlike(element, type, true); + } + + public static T elementToEnumlike(ElementTag element, Class type, boolean showWarning) { + Registry registry; + if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_20) || (registry = Bukkit.getRegistry((Class) type)) == null) { + return (T) element.asEnum((Class>) type); + } + T value = (T) registry.get(parseNamespacedKey(element.asString())); + if (!Settings.cache_legacySpigotNamesSupport || value != null) { + return value; + } + String updatedName = NMSHandler.instance.updateLegacyName(type, element.asString()); + if (CoreUtilities.equalsIgnoreCase(element.asString(), updatedName)) { + return null; + } + if (showWarning) { + BukkitImplDeprecations.oldSpigotNames.warn(); } - return (T) element.asEnum((Class) type); + return (T) registry.get(parseNamespacedKey(updatedName)); } public static T findBestEnumlike(Class type, String... names) { for (String name : names) { - T val = elementToEnumlike(new ElementTag(name), type); + T val = elementToEnumlike(new ElementTag(name), type, false); if (val != null) { return val; } @@ -601,7 +616,7 @@ public static T findBestEnumlike(Class type, String... names) { } public static boolean matchesEnumlike(ElementTag element, Class type) { - return elementToEnumlike(element, type) != null; + return elementToEnumlike(element, type, false) != null; } public static boolean requireEnumlike(Mechanism mechanism, Class type) { diff --git a/plugin/src/main/resources/config.yml b/plugin/src/main/resources/config.yml index 408ca41516..4f4c78241d 100644 --- a/plugin/src/main/resources/config.yml +++ b/plugin/src/main/resources/config.yml @@ -50,6 +50,9 @@ Debug: Paste URL: default Scripts: + # Whether backwards compatibility for older Spigot names should be enabled (e.g. 'GENERIC_MAX_HEALTH' as an attribute instead of 'max_health'). + # This should generally be disabled, and should only be used while updating older scripts to Minecraft versions 1.21 and above. + Legacy Spigot names support: false World: Events: On player chats: diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java index cd10d3ab81..4f84ec59c7 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java @@ -61,10 +61,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.state.BlockState; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.NamespacedKey; -import org.bukkit.World; +import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.boss.BossBar; import org.bukkit.craftbukkit.v1_21_R3.CraftRegistry; @@ -77,11 +74,9 @@ import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftInventoryCustom; import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R3.legacy.FieldRename; import org.bukkit.craftbukkit.v1_21_R3.persistence.CraftPersistentDataContainer; -import org.bukkit.craftbukkit.v1_21_R3.util.CraftChatMessage; -import org.bukkit.craftbukkit.v1_21_R3.util.CraftLocation; -import org.bukkit.craftbukkit.v1_21_R3.util.CraftMagicNumbers; -import org.bukkit.craftbukkit.v1_21_R3.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.v1_21_R3.util.*; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; @@ -436,4 +431,13 @@ public static Component componentToNMS(BaseComponent[] spigot) { } return CraftChatMessage.fromJSONOrNull(FormattedTextHelper.componentToJson(spigot)); } + + @Override + public String updateLegacyName(Class type, String legacyName) { + if (type == Sound.class) { + Sound sound = ReflectionHelper.getFieldValue(Sound.class, CoreUtilities.toUpperCase(legacyName), null); + return sound != null ? sound.getKey().toString() : null; + } + return FieldRename.rename(ApiVersion.FIELD_NAME_PARITY, type.getName().replace('.', '/'), legacyName); + } } From 7026a5b4dafa7dc118c1b04724d48ad82f1aea77 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Tue, 17 Dec 2024 00:46:37 -0800 Subject: [PATCH 109/280] fix elementToEnumlike for valid enum names --- .../denizen/utilities/Utilities.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java index aa4c3e5596..914cae9fc1 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java @@ -587,12 +587,19 @@ public static T elementToEnumlike(ElementTag element, Class type) { } public static T elementToEnumlike(ElementTag element, Class type, boolean showWarning) { - Registry registry; - if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_20) || (registry = Bukkit.getRegistry((Class) type)) == null) { - return (T) element.asEnum((Class>) type); + T value = (T) element.asEnum((Class) type); + if (value != null) { + return value; + } + if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_20)) { + return null; + } + Registry registry = Bukkit.getRegistry((Class) type); + if (registry == null) { + return null; } - T value = (T) registry.get(parseNamespacedKey(element.asString())); - if (!Settings.cache_legacySpigotNamesSupport || value != null) { + value = (T) registry.get(parseNamespacedKey(element.asString())); + if (value != null || !Settings.cache_legacySpigotNamesSupport) { return value; } String updatedName = NMSHandler.instance.updateLegacyName(type, element.asString()); From 7ad213cafe898e9e65aefbd4eb558ce7f94e738e Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Mon, 23 Dec 2024 12:36:24 +0000 Subject: [PATCH 110/280] Legacy renames: enable by default (#2687) * Legacy renames: enable by default * Fixes from review --- .../java/com/denizenscript/denizen/Denizen.java | 3 +++ .../denizen/utilities/Settings.java | 2 +- .../denizen/utilities/Utilities.java | 17 ++++++++++------- plugin/src/main/resources/config.yml | 2 +- .../denizen/nms/v1_21/Handler.java | 4 ---- 5 files changed, 15 insertions(+), 13 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/Denizen.java b/plugin/src/main/java/com/denizenscript/denizen/Denizen.java index 3889f37638..72aa7245b9 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/Denizen.java +++ b/plugin/src/main/java/com/denizenscript/denizen/Denizen.java @@ -498,6 +498,9 @@ public void reloadConfig() { if (!CoreConfiguration.defaultDebugMode) { getLogger().warning("Debug is disabled in the Denizen config. This is almost always a mistake, and should not be done in the majority of cases."); } + if (Settings.cache_legacySpigotNamesSupport) { + Debug.log("LEGACY SPIGOT NAMES SUPPORT ENABLED! This should only be used if you have scripts with legacy Spigot names, and should otherwise be disabled; see config.yml for more information."); + } } private FileConfiguration scoreboardsConfig = null; diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/Settings.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/Settings.java index 4207bdba19..39b2a96f55 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/Settings.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/Settings.java @@ -129,7 +129,7 @@ public static void refillCache() { cache_packetInterception = config.getBoolean("Packets.Interception", true); cache_packetInterceptAutoInit = config.getBoolean("Packets.Auto init", false); cache_commandScriptAutoInit = config.getBoolean("Scripts.Command.Auto init", false); - cache_legacySpigotNamesSupport = config.getBoolean("Scripts.Legacy Spigot names support", false); + cache_legacySpigotNamesSupport = config.getBoolean("Scripts.Legacy Spigot names support", true); PlayerFlagHandler.cacheTimeoutSeconds = config.getLong("Saves.Offline player cache timeout", 300); PlayerFlagHandler.asyncPreload = config.getBoolean("Saves.Load async on login", true); PlayerFlagHandler.saveOnlyWhenWorldSaveOn = config.getBoolean("Saves.Only save if world save is on", false); diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java index 914cae9fc1..59af417c06 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java @@ -587,21 +587,24 @@ public static T elementToEnumlike(ElementTag element, Class type) { } public static T elementToEnumlike(ElementTag element, Class type, boolean showWarning) { - T value = (T) element.asEnum((Class) type); - if (value != null) { - return value; - } if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_20)) { - return null; + return element.asEnum(type); } Registry registry = Bukkit.getRegistry((Class) type); if (registry == null) { - return null; + return element.asEnum(type); } - value = (T) registry.get(parseNamespacedKey(element.asString())); + T value = (T) registry.get(parseNamespacedKey(element.asString())); if (value != null || !Settings.cache_legacySpigotNamesSupport) { return value; } + T enumValue = element.asEnum(type); + if (enumValue != null) { + if (showWarning) { + BukkitImplDeprecations.oldSpigotNames.warn(); + } + return enumValue; + } String updatedName = NMSHandler.instance.updateLegacyName(type, element.asString()); if (CoreUtilities.equalsIgnoreCase(element.asString(), updatedName)) { return null; diff --git a/plugin/src/main/resources/config.yml b/plugin/src/main/resources/config.yml index 4f4c78241d..20b566dad8 100644 --- a/plugin/src/main/resources/config.yml +++ b/plugin/src/main/resources/config.yml @@ -52,7 +52,7 @@ Debug: Scripts: # Whether backwards compatibility for older Spigot names should be enabled (e.g. 'GENERIC_MAX_HEALTH' as an attribute instead of 'max_health'). # This should generally be disabled, and should only be used while updating older scripts to Minecraft versions 1.21 and above. - Legacy Spigot names support: false + Legacy Spigot names support: true World: Events: On player chats: diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java index 4f84ec59c7..b39cb8013d 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java @@ -434,10 +434,6 @@ public static Component componentToNMS(BaseComponent[] spigot) { @Override public String updateLegacyName(Class type, String legacyName) { - if (type == Sound.class) { - Sound sound = ReflectionHelper.getFieldValue(Sound.class, CoreUtilities.toUpperCase(legacyName), null); - return sound != null ? sound.getKey().toString() : null; - } return FieldRename.rename(ApiVersion.FIELD_NAME_PARITY, type.getName().replace('.', '/'), legacyName); } } From 26b4c35e1dfe93159aa7f6ef7bc885af2676121e Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Mon, 23 Dec 2024 04:37:24 -0800 Subject: [PATCH 111/280] rename setting to reinit for existing servers --- .../main/java/com/denizenscript/denizen/utilities/Settings.java | 2 +- plugin/src/main/resources/config.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/Settings.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/Settings.java index 39b2a96f55..1449b29431 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/Settings.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/Settings.java @@ -129,7 +129,7 @@ public static void refillCache() { cache_packetInterception = config.getBoolean("Packets.Interception", true); cache_packetInterceptAutoInit = config.getBoolean("Packets.Auto init", false); cache_commandScriptAutoInit = config.getBoolean("Scripts.Command.Auto init", false); - cache_legacySpigotNamesSupport = config.getBoolean("Scripts.Legacy Spigot names support", true); + cache_legacySpigotNamesSupport = config.getBoolean("Scripts.Support legacy Spigot names", true); PlayerFlagHandler.cacheTimeoutSeconds = config.getLong("Saves.Offline player cache timeout", 300); PlayerFlagHandler.asyncPreload = config.getBoolean("Saves.Load async on login", true); PlayerFlagHandler.saveOnlyWhenWorldSaveOn = config.getBoolean("Saves.Only save if world save is on", false); diff --git a/plugin/src/main/resources/config.yml b/plugin/src/main/resources/config.yml index 20b566dad8..983b94c71b 100644 --- a/plugin/src/main/resources/config.yml +++ b/plugin/src/main/resources/config.yml @@ -52,7 +52,7 @@ Debug: Scripts: # Whether backwards compatibility for older Spigot names should be enabled (e.g. 'GENERIC_MAX_HEALTH' as an attribute instead of 'max_health'). # This should generally be disabled, and should only be used while updating older scripts to Minecraft versions 1.21 and above. - Legacy Spigot names support: true + Support legacy Spigot names: true World: Events: On player chats: From 440734b5871dd140b103f0ef875a8c9ba709b8e1 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Mon, 23 Dec 2024 04:46:36 -0800 Subject: [PATCH 112/280] calm down the yelling also small opti. more proper cache may be preferable --- .../src/main/java/com/denizenscript/denizen/Denizen.java | 6 +++--- .../denizen/utilities/BukkitImplDeprecations.java | 8 ++++---- plugin/src/main/resources/config.yml | 2 +- .../java/com/denizenscript/denizen/nms/v1_21/Handler.java | 3 ++- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/Denizen.java b/plugin/src/main/java/com/denizenscript/denizen/Denizen.java index 72aa7245b9..9191902ac9 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/Denizen.java +++ b/plugin/src/main/java/com/denizenscript/denizen/Denizen.java @@ -293,6 +293,9 @@ else if (javaVersion.startsWith("21")) { configOutput.close(); reloadConfig(); } + if (Settings.cache_legacySpigotNamesSupport) { + Debug.log("Legacy Spigot name support enabled. This may be unnecessary; see config.yml for more information."); + } } catch (Exception e) { Debug.echoError(e); @@ -498,9 +501,6 @@ public void reloadConfig() { if (!CoreConfiguration.defaultDebugMode) { getLogger().warning("Debug is disabled in the Denizen config. This is almost always a mistake, and should not be done in the majority of cases."); } - if (Settings.cache_legacySpigotNamesSupport) { - Debug.log("LEGACY SPIGOT NAMES SUPPORT ENABLED! This should only be used if you have scripts with legacy Spigot names, and should otherwise be disabled; see config.yml for more information."); - } } private FileConfiguration scoreboardsConfig = null; 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 457801563c..7be2570b99 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java @@ -306,10 +306,6 @@ public class BukkitImplDeprecations { // 2023-year-end commonality: #30 public static Warning debugBlockAlpha = new VerySlowWarning("debugBlockAlpha", "The 'alpha' argument for the 'debugblock' command is deprecated: put the alpha in the color input instead."); - // Added 2024/6/17 - // Good candidate for SlowWarning, due to ease of update and the newer names already being more "normal"/well-known - public static Warning oldSpigotNames = new VerySlowWarning("oldSpigotNames", "Several features (particles, entities, etc.) had alternative naming added by Spigot, which is now deprecated in favor of the official Minecraft naming; see relevant feature's meta docs for more information."); - // Added 2024/07/13 public static Warning pre1_21AttributeFormat = new VerySlowWarning("pre1_21AttributeFormat", "Attribute modifiers were changed in 1.21, now using slot groups instead of slots and namespaced keys instead of UUIDS; check relevant meta docs for more information."); @@ -344,6 +340,10 @@ public class BukkitImplDeprecations { // Good candidate for bumping, as this is a niche feature only on 1.19+ that already had some issues public static Warning entityStepHeight = new FutureWarning("entityStepHeight", "'EntityTag.step_height' is deprecated in favor of the step height attribute."); + // Added 2024/06/17, do not deprecate officially before end-of-year 2025 hitrate commonality review. + // Bad candidate for bumping, targets extremely commonly used naming, some of which may be hard to remove (eg stored in flag data). + public static Warning oldSpigotNames = new FutureWarning("oldSpigotNames", "Several features (particles, entities, etc.) had alternative naming added by Spigot, which are now deprecated in favor of the official Minecraft naming; see relevant feature's meta docs for more information."); + // ==================== PAST deprecations of things that are already gone but still have a warning left behind ==================== // Removed upstream 2023/10/29 without warning. diff --git a/plugin/src/main/resources/config.yml b/plugin/src/main/resources/config.yml index 983b94c71b..fd988f718a 100644 --- a/plugin/src/main/resources/config.yml +++ b/plugin/src/main/resources/config.yml @@ -51,7 +51,7 @@ Debug: Scripts: # Whether backwards compatibility for older Spigot names should be enabled (e.g. 'GENERIC_MAX_HEALTH' as an attribute instead of 'max_health'). - # This should generally be disabled, and should only be used while updating older scripts to Minecraft versions 1.21 and above. + # This is not needed if your scripts all use modern names. Take caution where names may be stored (eg in flag data). Support legacy Spigot names: true World: Events: diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java index b39cb8013d..c7313e842a 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java @@ -30,6 +30,7 @@ import com.denizenscript.denizencore.utilities.CoreUtilities; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; +import com.denizenscript.denizencore.utilities.debugging.DebugInternals; import com.google.common.collect.Iterables; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; @@ -434,6 +435,6 @@ public static Component componentToNMS(BaseComponent[] spigot) { @Override public String updateLegacyName(Class type, String legacyName) { - return FieldRename.rename(ApiVersion.FIELD_NAME_PARITY, type.getName().replace('.', '/'), legacyName); + return FieldRename.rename(ApiVersion.FIELD_NAME_PARITY, DebugInternals.getFullClassNameOpti(type).replace('.', '/'), legacyName); } } From 21dfb7015d2ba4f7d895680fca25f56a39a87053 Mon Sep 17 00:00:00 2001 From: david <89749147+davight@users.noreply.github.com> Date: Tue, 24 Dec 2024 21:48:32 +0100 Subject: [PATCH 113/280] `age` command: fix `lock` arg, update (#2642) * update * add legacy out-of-order support * fix out of order --- .../scripts/commands/entity/AgeCommand.java | 81 +++++++------------ 1 file changed, 28 insertions(+), 53 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/AgeCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/AgeCommand.java index 458aa56bc2..266ed6f140 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/AgeCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/AgeCommand.java @@ -2,12 +2,13 @@ import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.properties.entity.EntityAge; -import com.denizenscript.denizencore.exceptions.InvalidArgumentsException; -import com.denizenscript.denizencore.objects.Argument; +import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.ListTag; 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.Deprecations; import com.denizenscript.denizencore.utilities.debugging.Debug; import org.bukkit.entity.Breedable; @@ -20,6 +21,7 @@ public AgeCommand() { setSyntax("age [|...] (adult/baby/) (lock)"); setRequiredArguments(1, 3); isProcedural = false; + autoCompile(); } // <--[command] @@ -57,64 +59,37 @@ public AgeCommand() { // - age adult // --> - private enum AgeType {ADULT, BABY} + private enum AgeType { ADULT, BABY } - @Override - public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException { - for (Argument arg : scriptEntry) { - if (!scriptEntry.hasObject("entities") - && arg.matchesArgumentList(EntityTag.class)) { - scriptEntry.addObject("entities", arg.asType(ListTag.class).filter(EntityTag.class, scriptEntry)); - } - else if (!scriptEntry.hasObject("agetype") - && arg.matchesEnum(AgeType.class)) { - scriptEntry.addObject("agetype", AgeType.valueOf(arg.getValue().toUpperCase())); - } - else if (!scriptEntry.hasObject("age") - && arg.matchesInteger()) { - scriptEntry.addObject("age", arg.asElement()); - } - else if (!scriptEntry.hasObject("lock") - && arg.matches("lock")) { - scriptEntry.addObject("lock", new ElementTag(true)); - } - else { - arg.reportUnhandled(); + public static void autoExecute(ScriptEntry scriptEntry, + @ArgName("entities") @ArgLinear ObjectTag entities, + @ArgName("age") @ArgLinear @ArgDefaultText("1") ObjectTag age, + @ArgName("lock") boolean shouldLock) { + if (!age.asElement().isInt() && !age.asElement().matchesEnum(AgeType.class)) { // Compensate for legacy age/entity out-of-order support + Deprecations.outOfOrderArgs.warn(scriptEntry); + ObjectTag swap = entities; + entities = age; + age = swap; + } + int ageInt = 1; + ElementTag ageElement = age.asElement(); + if (ageElement.matchesEnum(AgeType.class)) { + switch (ageElement.asEnum(AgeType.class)) { + case BABY -> ageInt = -24000; + case ADULT -> ageInt = 0; } } - if (!scriptEntry.hasObject("entities")) { - throw new InvalidArgumentsException("No valid entities specified."); + else if (ageElement.isInt()) { + ageInt = ageElement.asInt(); } - scriptEntry.defaultObject("age", new ElementTag(1)); - } - - @Override - public void execute(final ScriptEntry scriptEntry) { - List entities = (List) scriptEntry.getObject("entities"); - AgeType ageType = (AgeType) scriptEntry.getObject("agetype"); - int age = scriptEntry.getElement("age").asInt(); - boolean lock = scriptEntry.hasObject("lock"); - - if (scriptEntry.dbCallShouldDebug()) { - Debug.report(scriptEntry, getName(), (lock ? db("lock", true) : ""), (ageType != null ? db("agetype", ageType) : db("age", age)), db("entities", entities)); - } - for (EntityTag entity : entities) { + List entitiesList = entities.asType(ListTag.class, scriptEntry.context).filter(EntityTag.class, scriptEntry); + for (EntityTag entity : entitiesList) { if (entity.isSpawned()) { if (EntityAge.describes(entity)) { EntityAge property = new EntityAge(entity); - if (ageType != null) { - if (ageType.equals(AgeType.BABY)) { - property.setAge(-24000); - } - else { - property.setAge(0); - } - } - else { - property.setAge(age); - } - if (entity instanceof Breedable breedable) { - breedable.setAgeLock(lock); + property.setAge(ageInt); + if (entity.getBukkitEntity() instanceof Breedable breedable) { + breedable.setAgeLock(shouldLock); } } else { From dbc8e92d1de5b0fc6238cc9fc61aaff8ed10943b Mon Sep 17 00:00:00 2001 From: Maxime Moisant Date: Wed, 25 Dec 2024 16:08:13 +0100 Subject: [PATCH 114/280] Inventory click & block smelt events: modernize determinations (#2683) * BlockCooksSmeltsItem + PlayerClicksInInventory * Fixes from review --- .../BlockCooksSmeltsItemScriptEvent.java | 25 +++----- .../PlayerClicksInInventoryScriptEvent.java | 61 ++++++------------- 2 files changed, 26 insertions(+), 60 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/block/BlockCooksSmeltsItemScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/block/BlockCooksSmeltsItemScriptEvent.java index 6e308e07d9..10878c900a 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/block/BlockCooksSmeltsItemScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/block/BlockCooksSmeltsItemScriptEvent.java @@ -34,6 +34,9 @@ public class BlockCooksSmeltsItemScriptEvent extends BukkitScriptEvent implement public BlockCooksSmeltsItemScriptEvent() { registerCouldMatcher(" cooks|smelts (into )"); + this.registerDetermination(null, ItemTag.class, (evt, context, result) -> { + event.setResult(result.getItemStack()); + }); } public ItemTag source_item; @@ -60,24 +63,14 @@ public boolean matches(ScriptPath path) { return super.matches(path); } - @Override - public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) { - if (determinationObj.canBeType(ItemTag.class)) { - result_item = determinationObj.asType(ItemTag.class, getTagContext(path)); - event.setResult(result_item.getItemStack()); - return true; - } - return super.applyDetermination(path, determinationObj); - } - @Override public ObjectTag getContext(String name) { - switch (name) { - case "location": return location; - case "source_item": return source_item; - case "result_item": return result_item; - } - return super.getContext(name); + return switch (name) { + case "location" -> location; + case "source_item" -> source_item; + case "result_item" -> new ItemTag(event.getResult()); + default -> super.getContext(name); + }; } @EventHandler diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerClicksInInventoryScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerClicksInInventoryScriptEvent.java index a1a1956e6d..3567e305e2 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerClicksInInventoryScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerClicksInInventoryScriptEvent.java @@ -107,9 +107,11 @@ public class PlayerClicksInInventoryScriptEvent extends BukkitScriptEvent implem public PlayerClicksInInventoryScriptEvent() { registerCouldMatcher("player (<'click_type'>) clicks () in "); registerSwitches("with", "in_area", "action", "slot"); + this.registerDetermination(null, ItemTag.class, (evt, context, current) -> { + event.setCurrentItem(current.getItemStack()); + }); } - public InventoryTag inventory; public ItemTag item; public ItemTag cursor; // Needed due to internal oddity @@ -179,15 +181,6 @@ public boolean matches(ScriptPath path) { return super.matches(path); } - @Override - public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) { - if (determinationObj.canBeType(ItemTag.class)) { - event.setCurrentItem(determinationObj.asType(ItemTag.class, getTagContext(path)).getItemStack()); - return true; - } - return super.applyDetermination(path, determinationObj); - } - @Override public ScriptEntryData getScriptEntryData() { return new BukkitScriptEntryData(event.getWhoClicked()); @@ -195,40 +188,20 @@ public ScriptEntryData getScriptEntryData() { @Override public ObjectTag getContext(String name) { - if (name.equals("inventory")) { - return inventory; - } - else if (name.equals("item")) { - return item; - } - else if (name.equals("cursor_item")) { - return cursor; - } - else if (name.equals("click")) { - return new ElementTag(event.getClick()); - } - else if (name.equals("action")) { - return new ElementTag(event.getAction()); - } - else if (name.equals("slot_type")) { - return new ElementTag(event.getSlotType()); - } - else if (name.equals("is_shift_click")) { - return new ElementTag(event.isShiftClick()); - } - else if (name.equals("clicked_inventory") && event.getClickedInventory() != null) { - return InventoryTag.mirrorBukkitInventory(event.getClickedInventory()); - } - else if (name.equals("slot")) { - return new ElementTag(event.getSlot() + 1); - } - else if (name.equals("raw_slot")) { - return new ElementTag(event.getRawSlot() + 1); - } - else if (name.equals("hotbar_button")) { - return new ElementTag(event.getHotbarButton() + 1); - } - return super.getContext(name); + return switch (name) { + case "inventory" -> inventory; + case "item" -> item; + case "cursor_item" -> cursor; + case "click" -> new ElementTag(event.getClick()); + case "action" -> new ElementTag(event.getAction()); + case "slot_type" -> new ElementTag(event.getSlotType()); + case "is_shift_click" -> new ElementTag(event.isShiftClick()); + case "slot" -> new ElementTag(event.getSlot() + 1); + case "raw_slot" -> new ElementTag(event.getRawSlot() + 1); + case "hotbar_button" -> new ElementTag(event.getHotbarButton() + 1); + case "clicked_inventory" -> event.getClickedInventory() != null ? InventoryTag.mirrorBukkitInventory(event.getClickedInventory()) : null; + default -> super.getContext(name); + }; } @EventHandler From 28030e518e494e4eb83c339a86067f1f7d70c043 Mon Sep 17 00:00:00 2001 From: Maxime Moisant Date: Fri, 27 Dec 2024 17:57:39 +0100 Subject: [PATCH 115/280] OnCrafterCraftsScriptEvent (#2682) * OnCrafterScriptEvent * removed unused imports * Update CrafterCraftsScriptEvent.java * Update ScriptEventRegistry.java * Update ScriptEventRegistry.java * Update CrafterCraftsScriptEvent.java * Update CrafterCraftsScriptEvent.java * Update CrafterCraftsScriptEvent.java * ItemMoveScriptEvent : determination new method * Revert "ItemMoveScriptEvent : determination new method" This reverts commit 8c7a17685a10524cdbe0bd8d6e9f5118cf59b6c4. * Fixes from review * Update CrafterCraftsScriptEvent.java * Update CrafterCraftsScriptEvent.java --- .../denizen/events/ScriptEventRegistry.java | 3 + .../block/CrafterCraftsScriptEvent.java | 76 +++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 plugin/src/main/java/com/denizenscript/denizen/events/block/CrafterCraftsScriptEvent.java diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java index 6d1710666b..55c8625b28 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java @@ -97,6 +97,9 @@ public static void registerMainEvents() { ScriptEvent.registerScriptEvent(BrewingStartsScriptEvent.class); ScriptEvent.registerScriptEvent(TNTPrimesScriptEvent.class); } + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + ScriptEvent.registerScriptEvent(CrafterCraftsScriptEvent.class); + } // Entity events ScriptEvent.registerScriptEvent(AreaEffectCloudApplyScriptEvent.class); diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/block/CrafterCraftsScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/block/CrafterCraftsScriptEvent.java new file mode 100644 index 0000000000..18be3cb32e --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/events/block/CrafterCraftsScriptEvent.java @@ -0,0 +1,76 @@ +package com.denizenscript.denizen.events.block; + +import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizen.objects.LocationTag; +import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.utilities.Utilities; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.CrafterCraftEvent; + +public class CrafterCraftsScriptEvent extends BukkitScriptEvent implements Listener { + + // <--[event] + // @Events + // crafter crafts + // + // @Group Block + // + // @Location true + // + // @Cancellable true + // + // @Triggers when a crafter crafts an item. + // + // @Context + // returns the LocationTag of the crafter. + // returns the ItemTag of the item being crafted. + // returns the ElementTag of the recipe ID formed. + // + // @Determine + // "ITEM:" to set the item being crafted. Determinations still consume ingredients. + // + // --> + + public CrafterCraftsScriptEvent() { + registerCouldMatcher("crafter crafts "); + this.registerDetermination("item", ItemTag.class, (evt, context, result) -> { + event.setResult(result.getItemStack()); + }); + } + + public LocationTag location; + public ItemTag result; + public CrafterCraftEvent event; + + @Override + public boolean matches(ScriptPath path) { + if (!runInCheck(path, location)) { + return false; + } + if (!path.tryArgObject(2, result)) { + return false; + } + return super.matches(path); + } + + @Override + public ObjectTag getContext(String name) { + return switch (name) { + case "item" -> new ItemTag(event.getResult()); + case "location" -> location; + case "recipe_id" -> new ElementTag(Utilities.namespacedKeyToString(event.getRecipe().getKey()), true); + default -> super.getContext(name); + }; + } + + @EventHandler + public void onCrafterCrafts(CrafterCraftEvent event) { + location = new LocationTag(event.getBlock().getLocation()); + result = new ItemTag(event.getResult()); + this.event = event; + fire(event); + } +} From d9e7dae12011f35ecefa239ba96d371adf1cb4b9 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Fri, 27 Dec 2024 09:03:05 -0800 Subject: [PATCH 116/280] minor meta edit --- .../denizen/events/block/CrafterCraftsScriptEvent.java | 8 ++++---- .../denizen/events/player/BiomeEnterExitScriptEvent.java | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/block/CrafterCraftsScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/block/CrafterCraftsScriptEvent.java index 18be3cb32e..d7f7c3c721 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/block/CrafterCraftsScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/block/CrafterCraftsScriptEvent.java @@ -22,12 +22,12 @@ public class CrafterCraftsScriptEvent extends BukkitScriptEvent implements Liste // // @Cancellable true // - // @Triggers when a crafter crafts an item. + // @Triggers when a crafter block crafts an item. // // @Context - // returns the LocationTag of the crafter. - // returns the ItemTag of the item being crafted. - // returns the ElementTag of the recipe ID formed. + // returns the LocationTag of the crafter block. + // returns the ItemTag being crafted. + // returns the ID of the recipe formed. // // @Determine // "ITEM:" to set the item being crafted. Determinations still consume ingredients. diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/BiomeEnterExitScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/BiomeEnterExitScriptEvent.java index 5777f5e600..b0016f9c70 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/BiomeEnterExitScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/BiomeEnterExitScriptEvent.java @@ -10,7 +10,6 @@ import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; import org.bukkit.Registry; -import org.bukkit.block.Biome; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerMoveEvent; From acdb2c91e7bedf614542e2611defe592be42a108 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Mon, 30 Dec 2024 14:11:11 +0000 Subject: [PATCH 117/280] `LegacyParticleNaming`: remove STEP_SOUND renaming Was typoed in 8 years ago lol, see https://github.com/DenizenScript/Denizen/commit/3767d06bdc453ad4366a624c931d6d37791660eb#diff-9cae8953ecc2bf08116e0ad12d0a3526813347f285474ae4b1be88f347e13ff0R32 --- .../denizenscript/denizen/utilities/LegacyParticleNaming.java | 1 - 1 file changed, 1 deletion(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/LegacyParticleNaming.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/LegacyParticleNaming.java index cd8e779b92..34d4bc0c82 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/LegacyParticleNaming.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/LegacyParticleNaming.java @@ -31,7 +31,6 @@ public static void registerLegacyName(String name, String particle) { } registerLegacyName("INSTANT_SPELL", "SPELL_INSTANT"); registerLegacyName("WITCH_MAGIC", "SPELL_WITCH"); - registerLegacyName("STEP_SOUND", "HEART"); registerLegacyName("EXPLODE", "EXPLOSION_NORMAL"); registerLegacyName("SPLASH", "WATER_SPLASH"); registerLegacyName("LARGE_SMOKE", "SMOKE_LARGE"); From 823c4be21e7deb014995d49c955519ac5feec55c Mon Sep 17 00:00:00 2001 From: MCSamuel Date: Tue, 31 Dec 2024 19:41:24 -0500 Subject: [PATCH 118/280] Minor format fixes (#2690) --- .../java/com/denizenscript/denizen/objects/CuboidTag.java | 1 + .../objects/properties/bukkit/BukkitElementExtensions.java | 2 +- .../com/denizenscript/denizen/tags/core/TextTagBase.java | 6 +++--- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/CuboidTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/CuboidTag.java index 59afc17d17..193f1b2a1e 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/CuboidTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/CuboidTag.java @@ -780,6 +780,7 @@ public static void register() { // @returns ListTag(LocationTag) // @description // Returns a list of block locations along the 2D outline of this CuboidTag, at the specified Y level. + // @example // # Plays the "flame" effect at the 2D outline of the cuboid on the player's Y level. // - playeffect effect:flame at:]> offset:0.0 // --> diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/bukkit/BukkitElementExtensions.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/bukkit/BukkitElementExtensions.java index 8e8bcbc5c0..380212be83 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/bukkit/BukkitElementExtensions.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/bukkit/BukkitElementExtensions.java @@ -925,7 +925,7 @@ else if (colorName.startsWith("co@")) { // See <@link language Raw NBT Encoding> for more information on the returned MapTag. // See <@link url https://minecraft.wiki/w/NBT_format#SNBT_format> for more information on SNBT. // @example - // Use to set certain SNBT data onto an entity. + // # Use to set certain SNBT data onto an entity. // - adjust <[entity]> raw_nbt:<[snbt].snbt_to_map> // --> ElementTag.tagProcessor.registerStaticTag(MapTag.class, "snbt_to_map", (attribute, object) -> { diff --git a/plugin/src/main/java/com/denizenscript/denizen/tags/core/TextTagBase.java b/plugin/src/main/java/com/denizenscript/denizen/tags/core/TextTagBase.java index 9143b41baa..82a3e03e8d 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/tags/core/TextTagBase.java +++ b/plugin/src/main/java/com/denizenscript/denizen/tags/core/TextTagBase.java @@ -192,13 +192,13 @@ public TextTagBase() { // Note that this is a magic Denizen tool - refer to <@link language Denizen Text Formatting>. // You can use <@link tag ElementTag.strip_color> to convert the translated output to plain text (pre-translated). // @example - // Narrates a translatable of a diamond sword's name. + // # Narrates a translatable of a diamond sword's name. // - narrate "Reward: <&translate[key=item.minecraft.diamond_sword]>" // @example - // Narrates a translatable with some input data. + // # Narrates a translatable with some input data. // - narrate <&translate[key=commands.give.success.single;with=32|<&translate[key=item.minecraft.diamond_sword]>|]> // @example - // Narrates a custom translatable (from something like a resource pack), with a fallback in case it can't be translated. + // # Narrates a custom translatable (from something like a resource pack), with a fallback in case it can't be translated. // - narrate <&translate[key=my.custom.translation;fallback=Please use the resource pack!]> // --> TagManager.registerTagHandler(ElementTag.class, ObjectTag.class, "&translate", (attribute, param) -> { // Cannot be static due to hacked sub-tag From a1fea2db9209e6aaea912a049116aace8e648940 Mon Sep 17 00:00:00 2001 From: MCSamuel Date: Fri, 3 Jan 2025 16:12:11 -0500 Subject: [PATCH 119/280] Added `player receives chunk unload` event (#2686) * - "PlayerUnloadsChunkEvent" added for Paper. * Minor changes * format fixes * Warning added and PaperModule.java alphabetized * "Player" context removed and meta updated. * Re-added switch * Event name change --- .../denizen/paper/PaperModule.java | 17 ++--- .../events/PlayerChunkUnloadScriptEvent.java | 68 +++++++++++++++++++ 2 files changed, 77 insertions(+), 8 deletions(-) create mode 100644 paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerChunkUnloadScriptEvent.java diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java index d0f83257b7..6b59784a02 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java @@ -51,6 +51,7 @@ public static void init() { ScriptEvent.registerScriptEvent(PlayerChangesFramedItemScriptEvent.class); } ScriptEvent.registerScriptEvent(PlayerChoosesArrowScriptEvent.class); + ScriptEvent.registerScriptEvent(PlayerChunkUnloadScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerClicksFakeEntityScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerClicksInRecipeBookScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerClientOptionsChangeScriptEvent.class); @@ -58,33 +59,36 @@ public static void init() { ScriptEvent.registerScriptEvent(PlayerDeepSleepScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerElytraBoostScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerEquipsArmorScriptEvent.class); + ScriptEvent.registerScriptEvent(PlayerGrantedAdvancementCriterionScriptEvent.class); if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { ScriptEvent.registerScriptEvent(PlayerInventorySlotChangeScriptEvent.class); } ScriptEvent.registerScriptEvent(PlayerItemTakesDamageScriptEventPaperImpl.class); ScriptEvent.registerScriptEvent(PlayerJumpsScriptEventPaperImpl.class); - ScriptEvent.registerScriptEvent(PlayerGrantedAdvancementCriterionScriptEvent.class); + ScriptEvent.registerScriptEvent(PlayerLecternPageChangeScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerLoomPatternSelectScriptEvent.class); if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { ScriptEvent.registerScriptEvent(PlayerOpenSignScriptEvent.class); } ScriptEvent.registerScriptEvent(PlayerPreparesGrindstoneCraftScriptEvent.class); + ScriptEvent.registerScriptEvent(PlayerQuitsScriptEventPaperImpl.class); if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_18)) { ScriptEvent.registerScriptEvent(PlayerRaiseLowerItemScriptEventPaperImpl.class); } ScriptEvent.registerScriptEvent(PlayerSelectsStonecutterRecipeScriptEvent.class); - ScriptEvent.registerScriptEvent(PlayerLecternPageChangeScriptEvent.class); - ScriptEvent.registerScriptEvent(PlayerSpectatesEntityScriptEvent.class); if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { ScriptEvent.registerScriptEvent(PlayerShieldDisableScriptEvent.class); } + ScriptEvent.registerScriptEvent(PlayerSpectatesEntityScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerStopsSpectatingScriptEvent.class); if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { ScriptEvent.registerScriptEvent(PlayerTracksEntityScriptEvent.class); } ScriptEvent.registerScriptEvent(PlayerTradesWithMerchantScriptEvent.class); - ScriptEvent.registerScriptEvent(PlayerQuitsScriptEventPaperImpl.class); ScriptEvent.registerScriptEvent(PreEntitySpawnScriptEvent.class); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { + ScriptEvent.registerScriptEvent(PrePlayerAttackEntityScriptEvent.class); + } ScriptEvent.registerScriptEvent(ProjectileCollideScriptEvent.class); ScriptEvent.registerScriptEvent(ServerListPingScriptEventPaperImpl.class); ScriptEvent.registerScriptEvent(ServerResourcesReloadedScriptEvent.class); @@ -93,9 +97,6 @@ public static void init() { if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_18)) { ScriptEvent.registerScriptEvent(TNTPrimesScriptEvent.class); } - if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { - ScriptEvent.registerScriptEvent(PrePlayerAttackEntityScriptEvent.class); - } ScriptEvent.registerScriptEvent(UnknownCommandScriptEvent.class); if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { ScriptEvent.registerScriptEvent(WardenChangesAngerLevelScriptEvent.class); @@ -107,8 +108,8 @@ public static void init() { if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_18)) { PropertyParser.registerProperty(EntityAutoExpire.class, EntityTag.class); } - PropertyParser.registerProperty(EntityCanTick.class, EntityTag.class); PropertyParser.registerProperty(EntityCarryingEgg.class, EntityTag.class); + PropertyParser.registerProperty(EntityCanTick.class, EntityTag.class); PropertyParser.registerProperty(EntityDrinkingPotion.class, EntityTag.class); if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { PropertyParser.registerProperty(EntityEggLayTime.class, EntityTag.class); diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerChunkUnloadScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerChunkUnloadScriptEvent.java new file mode 100644 index 0000000000..3199313aa8 --- /dev/null +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerChunkUnloadScriptEvent.java @@ -0,0 +1,68 @@ +package com.denizenscript.denizen.paper.events; + +import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.objects.ChunkTag; +import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.scripts.ScriptEntryData; +import io.papermc.paper.event.packet.PlayerChunkUnloadEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class PlayerChunkUnloadScriptEvent extends BukkitScriptEvent implements Listener { + + // <--[event] + // @Events + // player receives chunk unload + // + // @Group Paper + // + // @Location true + // + // @Plugin Paper + // + // @Warning This event will fire *extremely* rapidly and almost guarantees lag. Use with maximum caution. + // + // @Triggers when a Player receives a chunk unload packet. + // Should only be used for packet/clientside related stuff. Not intended for modifying server side. + // Generally prefer <@link event chunk unloads> in most cases. + // + // @Context + // returns a ChunkTag of the chunk being unloaded. + // + // @Player Always. + // --> + + public PlayerChunkUnloadScriptEvent() { + registerCouldMatcher("player receives chunk unload"); + } + + public PlayerChunkUnloadEvent event; + + @Override + public boolean matches(ScriptPath path) { + if (!runInCheck(path, event.getPlayer().getLocation())) { + return false; + } + return super.matches(path); + } + + @Override + public ScriptEntryData getScriptEntryData() { + return new BukkitScriptEntryData(event.getPlayer()); + } + + @Override + public ObjectTag getContext(String name) { + return switch (name) { + case "chunk" -> new ChunkTag(event.getChunk()); + default -> super.getContext(name); + }; + } + + @EventHandler + public void playerChunkUnloadEvent(PlayerChunkUnloadEvent event) { + this.event = event; + fire(event); + } +} From de138fd11ac72152126cf880c075a04c75657eb2 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Fri, 3 Jan 2025 21:35:01 +0000 Subject: [PATCH 120/280] `EntityAwake/Variant`: properly close meta blocks --- .../denizen/objects/properties/entity/EntityAwake.java | 1 + .../denizen/objects/properties/entity/EntityVariant.java | 1 + 2 files changed, 2 insertions(+) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAwake.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAwake.java index 00e670608e..bcdfd4ec56 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAwake.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAwake.java @@ -13,6 +13,7 @@ public class EntityAwake extends EntityProperty { // @input ElementTag(Boolean) // @description // Controls whether a bat is flying (awake/true) or hanging (asleep/false). + // --> public static boolean describes(EntityTag entity) { return entity.getBukkitEntity() instanceof Bat; diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityVariant.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityVariant.java index 45f433fcf1..e912bc4790 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityVariant.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityVariant.java @@ -15,6 +15,7 @@ public class EntityVariant extends EntityProperty { // @description // Controls which variant a wolf is. // A list of valid variants can be found at <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/entity/Wolf.Variant.html>. + // --> public static boolean describes(EntityTag entity) { return entity.getBukkitEntity() instanceof Wolf; From e9d90779b1d8b286cc30cf3a8490c2bc57b68298 Mon Sep 17 00:00:00 2001 From: Hydroxycobalamin <54799651+Hydroxycobalamin@users.noreply.github.com> Date: Wed, 8 Jan 2025 23:06:35 +0100 Subject: [PATCH 121/280] shearable entities support (#2679) * shearable entities support * review changes * review changes part 2 * review changes * cleanup * move entityIsSheared into FutureWarning * remove shearable entirely * only Snowman should have a pumpkin head * fix mechs * remove unrelated changes * meta improvements * fix typo --- .../properties/PaperEntityExtensions.java | 42 +++++++ .../denizen/objects/EntityTag.java | 27 ---- .../objects/properties/PropertyRegistry.java | 2 +- .../properties/entity/EntityPumpkinHead.java | 89 ------------- .../properties/entity/EntitySheared.java | 118 ++++++++++++++++++ .../utilities/BukkitImplDeprecations.java | 3 + 6 files changed, 164 insertions(+), 117 deletions(-) delete mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPumpkinHead.java create mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntitySheared.java diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperEntityExtensions.java b/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperEntityExtensions.java index 1fb2c8ddaa..2cc1573296 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperEntityExtensions.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperEntityExtensions.java @@ -7,6 +7,8 @@ import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.MapTag; +import io.papermc.paper.entity.Shearable; +import net.kyori.adventure.sound.Sound; import org.bukkit.Location; import org.bukkit.entity.Entity; import org.bukkit.entity.ExperienceOrb; @@ -184,6 +186,46 @@ public static void register() { } object.getLivingEntity().damageItemStack(slot.asEnum(EquipmentSlot.class), amount.asInt()); }); + + // <--[mechanism] + // @object EntityTag + // @name shear + // @Plugin paper + // @group paper + // @description + // Shears entities in the same way as a player can do using shears, including drops. + // If the entity is not ready to be sheared, there will be no drops but the sound will still play. + // + // This mech will: + // - Shear a sheep + // - harvest a bogged + // - harvest a mushroom cow (note: entity data will be lost as Minecraft will remove the entity and spawn an entirely new cow instead) + // - derp a snowman (i.e. remove the pumpkin) + // + // Optionally, specify a sound source to change the source of the sound. + // Valid sound sources can be found here: <@link url https://jd.advntr.dev/api/latest/net/kyori/adventure/sound/Sound.Source.html>. + // + // @example + // # Shears the entity you're looking at. + // - adjust shear + // + // --> + EntityTag.registerSpawnedOnlyMechanism("shear", false, (object, mechanism) -> { + if (!(object.getBukkitEntity() instanceof Shearable shearable)) { + return; + } + if (!mechanism.hasValue()) { + shearable.shear(); + return; + } + ElementTag input = mechanism.getValue(); + if (!mechanism.requireEnum(Sound.Source.class)) { + mechanism.echoError("Invalid sound source specified: " + input); + return; + } + Sound.Source source = input.asEnum(Sound.Source.class); + shearable.shear(source); + }); } } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java index b87fe9e86c..d52e4a68b0 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java @@ -1912,20 +1912,6 @@ else if (object.getLivingEntity() instanceof Steerable) { return new ElementTag(object.isLivingEntity() && object.getLivingEntity().isLeashed()); }, "leashed"); - // <--[tag] - // @attribute - // @returns ElementTag(Boolean) - // @group attributes - // @description - // Returns whether a sheep is sheared. - // --> - registerSpawnedOnlyTag(ElementTag.class, "is_sheared", (attribute, object) -> { - if (!(object.getBukkitEntity() instanceof Sheep)) { - return null; - } - return new ElementTag(((Sheep) object.getBukkitEntity()).isSheared()); - }); - // <--[tag] // @attribute // @returns ElementTag(Boolean) @@ -3762,19 +3748,6 @@ public void adjust(Mechanism mechanism) { getLivingEntity().setRemoveWhenFarAway(mechanism.getValue().asBoolean()); } - // <--[mechanism] - // @object EntityTag - // @name sheared - // @input ElementTag(Boolean) - // @description - // Sets whether the sheep is sheared. - // @tags - // - // --> - if (mechanism.matches("sheared") && mechanism.requireBoolean() && getBukkitEntity() instanceof Sheep) { - ((Sheep) getBukkitEntity()).setSheared(mechanism.getValue().asBoolean()); - } - // <--[mechanism] // @object EntityTag // @name collidable diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java index e3cfb9d22a..6e6306bb9b 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java @@ -142,7 +142,6 @@ public static void registerMainProperties() { PropertyParser.registerProperty(EntityPotionEffects.class, EntityTag.class); PropertyParser.registerProperty(EntityPowered.class, EntityTag.class); PropertyParser.registerProperty(EntityProfession.class, EntityTag.class); - PropertyParser.registerProperty(EntityPumpkinHead.class, EntityTag.class); PropertyParser.registerProperty(EntityRiptide.class, EntityTag.class); if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { PropertyParser.registerProperty(EntityRightRotation.class, EntityTag.class); @@ -157,6 +156,7 @@ public static void registerMainProperties() { PropertyParser.registerProperty(EntityShadowRadius.class, EntityTag.class); PropertyParser.registerProperty(EntityShadowStrength.class, EntityTag.class); } + PropertyParser.registerProperty(EntitySheared.class, EntityTag.class); PropertyParser.registerProperty(EntityShivering.class, EntityTag.class); PropertyParser.registerProperty(EntityShotAtAngle.class, EntityTag.class); PropertyParser.registerProperty(EntityShulkerPeek.class, EntityTag.class); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPumpkinHead.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPumpkinHead.java deleted file mode 100644 index 47fabb6221..0000000000 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPumpkinHead.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.denizenscript.denizen.objects.properties.entity; - -import com.denizenscript.denizen.objects.EntityTag; -import com.denizenscript.denizencore.objects.Mechanism; -import com.denizenscript.denizencore.objects.ObjectTag; -import com.denizenscript.denizencore.objects.core.ElementTag; -import com.denizenscript.denizencore.objects.properties.Property; -import com.denizenscript.denizencore.tags.Attribute; -import org.bukkit.entity.Snowman; - -public class EntityPumpkinHead implements Property { - - public static boolean describes(ObjectTag entity) { - return entity instanceof EntityTag entityTag && entityTag.getBukkitEntity() instanceof Snowman; - } - - public static EntityPumpkinHead getFrom(ObjectTag entity) { - if (!describes(entity)) { - return null; - } - else { - return new EntityPumpkinHead((EntityTag) entity); - } - } - - public static final String[] handledTags = new String[] { - "has_pumpkin_head" - }; - - public static final String[] handledMechs = new String[] { - "has_pumpkin_head" - }; - - public EntityPumpkinHead(EntityTag entity) { - dentity = entity; - } - - EntityTag dentity; - - @Override - public String getPropertyString() { - return String.valueOf(!((Snowman) dentity.getBukkitEntity()).isDerp()); - } - - @Override - public String getPropertyId() { - return "has_pumpkin_head"; - } - - @Override - public ObjectTag getObjectAttribute(Attribute attribute) { - - if (attribute == null) { - return null; - } - - // <--[tag] - // @attribute - // @returns ElementTag(Boolean) - // @mechanism EntityTag.has_pumpkin_head - // @group properties - // @description - // If the entity is a snowman, returns whether the snowman has a pumpkin on its head. - // --> - if (attribute.startsWith("has_pumpkin_head")) { - return new ElementTag(!((Snowman) dentity.getBukkitEntity()).isDerp()) - .getObjectAttribute(attribute.fulfill(1)); - } - - return null; - } - - @Override - public void adjust(Mechanism mechanism) { - - // <--[mechanism] - // @object EntityTag - // @name has_pumpkin_head - // @input ElementTag(Boolean) - // @description - // Changes whether a Snowman entity has a pumpkin on its head. - // @tags - // - // --> - if (mechanism.matches("has_pumpkin_head") && mechanism.requireBoolean()) { - ((Snowman) dentity.getBukkitEntity()).setDerp(!mechanism.getValue().asBoolean()); - } - } -} diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntitySheared.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntitySheared.java new file mode 100644 index 0000000000..4b200237bd --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntitySheared.java @@ -0,0 +1,118 @@ +package com.denizenscript.denizen.objects.properties.entity; + +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.utilities.BukkitImplDeprecations; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.objects.properties.PropertyParser; +import org.bukkit.entity.*; + +public class EntitySheared extends EntityProperty { + + // <--[property] + // @object EntityTag + // @name sheared + // @synonyms has_pumpkin_head + // @input ElementTag(Boolean) + // @description + // Controls whether a sheep is sheared, a bogged is harvested, or a snow golem is derped (ie not wearing a pumpkin). + // To include drops or for harvesting mushroom cows consider <@link mechanism EntityTag.shear>. + // --> + + public static boolean describes(EntityTag entity) { + return entity.getBukkitEntity() instanceof Sheep + || entity.getBukkitEntity() instanceof Snowman + || (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && entity.getBukkitEntity() instanceof Bogged); + } + + @Override + public ElementTag getPropertyValue() { + if (getEntity() instanceof Sheep sheep) { + return new ElementTag(sheep.isSheared()); + } + else if (getEntity() instanceof Snowman snowman) { + return new ElementTag(snowman.isDerp()); + } + else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && getEntity() instanceof Bogged bogged) { + return new ElementTag(bogged.isSheared()); + } + return null; + } + + @Override + public void setPropertyValue(ElementTag param, Mechanism mechanism) { + if (!mechanism.requireBoolean()) { + return; + } + if (getEntity() instanceof Sheep sheep) { + sheep.setSheared(param.asBoolean()); + } + else if (getEntity() instanceof Snowman snowman) { + snowman.setDerp(param.asBoolean()); + } + else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && getEntity() instanceof Bogged bogged) { + bogged.setSheared(param.asBoolean()); + } + } + + + @Override + public String getPropertyId() { + return "sheared"; + } + + public static void register() { + autoRegister("sheared", EntitySheared.class, ElementTag.class, false); + + // <--[tag] + // @attribute + // @returns ElementTag(Boolean) + // @group attributes + // @deprecated use 'EntityTag.sheared' + // @description + // Deprecated in favor of <@link tag EntityTag.sheared>. + // --> + PropertyParser.registerTag(EntitySheared.class, ElementTag.class, "is_sheared", (attribute, prop) -> { + BukkitImplDeprecations.entityIsSheared.warn(attribute.context); + return prop.getPropertyValue(); + }); + + // <--[tag] + // @attribute + // @returns ElementTag(Boolean) + // @mechanism EntityTag.has_pumpkin_head + // @group properties + // @deprecated use 'EntityTag.sheared' + // @description + // Deprecated in favor of <@link tag EntityTag.sheared>. + // --> + PropertyParser.registerTag(EntitySheared.class, ElementTag.class, "has_pumpkin_head", (attribute, prop) -> { + BukkitImplDeprecations.entityIsSheared.warn(attribute.context); + if (!(prop.getEntity() instanceof Snowman)) { + return null; + } + return new ElementTag(!prop.getPropertyValue().asBoolean()); + }); + + // <--[mechanism] + // @object EntityTag + // @name has_pumpkin_head + // @input ElementTag(Boolean) + // @description + // @deprecated use 'EntityTag.sheared' + // Deprecated in favor of <@link mechanism EntityTag.sheared>. + // @tags + // + // --> + PropertyParser.registerMechanism(EntitySheared.class, ElementTag.class, "has_pumpkin_head", (prop, mechanism, input) -> { + BukkitImplDeprecations.entityIsSheared.warn(mechanism.context); + if (!(prop.getEntity() instanceof Snowman)) { + return; + } + prop.setPropertyValue(new ElementTag(!input.asBoolean()), mechanism); + }); + } +} + 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 7be2570b99..1efb8d826d 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java @@ -344,6 +344,9 @@ public class BukkitImplDeprecations { // Bad candidate for bumping, targets extremely commonly used naming, some of which may be hard to remove (eg stored in flag data). public static Warning oldSpigotNames = new FutureWarning("oldSpigotNames", "Several features (particles, entities, etc.) had alternative naming added by Spigot, which are now deprecated in favor of the official Minecraft naming; see relevant feature's meta docs for more information."); + // Added 2024/12/27 + public static Warning entityIsSheared = new FutureWarning("entityIsSheared", "'EntityTag.is_sheared' and 'EntityTag.has_pumpkin_head' properties are deprecated in favor of 'EntityTag.sheared'."); + // ==================== PAST deprecations of things that are already gone but still have a warning left behind ==================== // Removed upstream 2023/10/29 without warning. From 9adc6430f4572dc0ceca80c89d6442681ab11f0f Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Wed, 8 Jan 2025 22:31:50 +0000 Subject: [PATCH 122/280] 1.20+ potions support (#2692) * Split base potion data handling for cleaner flow * Custom name, null base type, modern effect type * Back-Support legacy tags/mechs * Metaify all changes * Fixup some version checks * Minor `applyBasePotionData` cleanup & renames * More backsupport for now-null base potion type * Final fixups * `effect` key only on 1.20+ to match input * Oops whitespace --- paper/pom.xml | 2 +- .../events/PlayerBeaconEffectScriptEvent.java | 4 +- .../paper/utilities/PaperAPIToolsImpl.java | 6 + .../entity/EntityPotionEffectScriptEvent.java | 8 +- .../objects/properties/PropertyRegistry.java | 4 +- .../entity/EntityPotionEffects.java | 20 +- .../objects/properties/item/ItemPotion.java | 200 ++++++++++++------ .../utilities/BukkitImplDeprecations.java | 3 + .../denizen/utilities/PaperAPITools.java | 6 + 9 files changed, 161 insertions(+), 92 deletions(-) diff --git a/paper/pom.xml b/paper/pom.xml index 415da04a99..2ea638249e 100644 --- a/paper/pom.xml +++ b/paper/pom.xml @@ -25,7 +25,7 @@ io.papermc.paper paper-api - 1.21.3-R0.1-SNAPSHOT + 1.21.4-R0.1-SNAPSHOT provided diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerBeaconEffectScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerBeaconEffectScriptEvent.java index 6f204e60e6..99baed8d42 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerBeaconEffectScriptEvent.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerBeaconEffectScriptEvent.java @@ -31,7 +31,7 @@ public class PlayerBeaconEffectScriptEvent extends BukkitScriptEvent implements // // @Context // returns the LocationTag of the beacon applying an effect. - // returns a MapTag of the potion effect (in the same format as <@link tag EntityTag.effects_data>). + // returns a MapTag of the potion effect in <@link language Potion Effect Format>. // returns an ElementTag of the effect type. // returns an ElementTag(Boolean) of whether the beacon effect is the primary effect. // @@ -78,7 +78,7 @@ public ObjectTag getContext(String name) { return switch (name) { case "location" -> new LocationTag(event.getBlock().getLocation()); case "effect" -> new ElementTag(ItemPotion.effectToLegacyString(event.getEffect(), null)); - case "effect_data" -> ItemPotion.effectToMap(event.getEffect()); + case "effect_data" -> ItemPotion.effectToMap(event.getEffect(), true); case "effect_type" -> new ElementTag(event.getEffect().getType().getName()); case "is_primary" -> new ElementTag(event.isPrimary()); default -> super.getContext(name); diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/utilities/PaperAPIToolsImpl.java b/paper/src/main/java/com/denizenscript/denizen/paper/utilities/PaperAPIToolsImpl.java index 54ce299a36..d6499b8c1e 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/utilities/PaperAPIToolsImpl.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/utilities/PaperAPIToolsImpl.java @@ -35,6 +35,7 @@ import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.*; +import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.potion.PotionBrewer; import org.bukkit.scoreboard.Team; import org.bukkit.util.Consumer; @@ -387,4 +388,9 @@ public String getClientBrand(Player player) { public boolean canUseEquipmentSlot(LivingEntity entity, EquipmentSlot slot) { return NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20) ? entity.canUseEquipmentSlot(slot) : super.canUseEquipmentSlot(entity, slot); } + + @Override + public boolean hasCustomName(PotionMeta meta) { + return meta.hasCustomPotionName(); + } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityPotionEffectScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityPotionEffectScriptEvent.java index 531adc9734..1ec33c7c3e 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityPotionEffectScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityPotionEffectScriptEvent.java @@ -34,8 +34,8 @@ public class EntityPotionEffectScriptEvent extends BukkitScriptEvent implements // returns the cause of the effect change, based on <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/event/entity/EntityPotionEffectEvent.Cause.html> // returns the action of the effect changed, which can be 'added', 'changed', 'cleared', or 'removed' // returns whether the new potion effect will override the old. - // returns the new potion effect (in the same format as <@link tag EntityTag.effects_data>) (if any). - // returns the old potion effect (in the same format as <@link tag EntityTag.effects_data>) (if any). + // returns the new potion effect in <@link language Potion Effect Format>. + // returns the old potion effect in <@link language Potion Effect Format>. // returns the name of the modified potion effect type. // // @Determine @@ -118,8 +118,8 @@ public ObjectTag getContext(String name) { case "override" -> new ElementTag(event.isOverride()); case "new_effect" -> event.getNewEffect() == null ? null : new ElementTag(ItemPotion.effectToLegacyString(event.getNewEffect(), null)); case "old_effect" -> event.getOldEffect() == null ? null : new ElementTag(ItemPotion.effectToLegacyString(event.getOldEffect(), null)); - case "new_effect_data" -> event.getNewEffect() == null ? null : ItemPotion.effectToMap(event.getNewEffect()); - case "old_effect_data" -> event.getOldEffect() == null ? null : ItemPotion.effectToMap(event.getOldEffect()); + case "new_effect_data" -> event.getNewEffect() == null ? null : ItemPotion.effectToMap(event.getNewEffect(), true); + case "old_effect_data" -> event.getOldEffect() == null ? null : ItemPotion.effectToMap(event.getOldEffect(), true); default -> super.getContext(name); }; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java index 6e6306bb9b..a3e5a7c6a6 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java @@ -244,9 +244,7 @@ public static void registerMainProperties() { registerItemProperty(ItemMap.class, "map_id"); PropertyParser.registerProperty(ItemNBT.class, ItemTag.class); registerItemProperty(ItemPatterns.class, "banner_patterns"); - if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_19)) { - registerItemProperty(ItemPotion.class, "potion_contents"); - } + registerItemProperty(ItemPotion.class, "potion_contents"); PropertyParser.registerProperty(ItemQuantity.class, ItemTag.class); PropertyParser.registerProperty(ItemRawNBT.class, ItemTag.class); registerItemProperty(ItemRepairCost.class, "repair_cost"); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotionEffects.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotionEffects.java index eddc57814a..8b7f1c08e5 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotionEffects.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotionEffects.java @@ -66,10 +66,10 @@ public ListTag getEffectsListTag(TagContext context) { return result; } - public ListTag getEffectsMapTag() { + public ListTag getEffectsMapTag(boolean includeDeprecated) { ListTag result = new ListTag(); for (PotionEffect effect : getEffectsList()) { - result.addObject(ItemPotion.effectToMap(effect)); + result.addObject(ItemPotion.effectToMap(effect, includeDeprecated)); } return result; } @@ -83,7 +83,7 @@ public Arrow getArrow() { } public String getPropertyString() { - ListTag effects = getEffectsMapTag(); + ListTag effects = getEffectsMapTag(false); return effects.isEmpty() ? null : effects.identify(); } @@ -114,10 +114,10 @@ public static void register() { // @group attribute // @mechanism EntityTag.potion_effects // @description - // Returns the active potion effects on the entity, in the MapTag format of the mechanism. + // Returns the active potion effects on the entity, as a list of maps in <@link language Potion Effect Format>. // --> PropertyParser.registerTag(EntityPotionEffects.class, ListTag.class, "effects_data", (attribute, object) -> { - return object.getEffectsMapTag(); + return object.getEffectsMapTag(true); }); // <--[tag] @@ -160,17 +160,9 @@ public void adjust(Mechanism mechanism) { // @input ListTag // @description // Set the entity's active potion effects. - // Each item in the list must be a MapTag with keys: - // "type" - from <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/potion/PotionEffectType.html> - // "amplifier" - number to increase the level by (0 for default level 1) - // "duration" - DurationTag, how long it lasts - // "ambient", "particles", "icon" - booleans - // - // For example: [type=SPEED;amplifier=0;duration=120t;ambient=false;particles=true;icon=true] - // This example would be a level 1 swiftness potion that lasts 120 ticks. + // Each item in the list must be a MapTag in <@link language Potion Effect Format>. // @tags // - // // ]> // --> if (mechanism.matches("potion_effects")) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemPotion.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemPotion.java index 93bbed2f03..6aa445a123 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemPotion.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemPotion.java @@ -5,6 +5,7 @@ import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.objects.properties.bukkit.BukkitColorExtensions; import com.denizenscript.denizen.utilities.BukkitImplDeprecations; +import com.denizenscript.denizen.utilities.PaperAPITools; import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.ObjectTag; @@ -26,21 +27,44 @@ import java.util.ArrayList; import java.util.List; -// TODO: 1.20.6: Spigot removed the PotionData API, can either remove relevant features on 1.20.6, or try and backsupport somehow (probably either hard-coding our own data or hacking it based on the name) public class ItemPotion extends ItemProperty { + // <--[language] + // @name Potion Effect Format + // @group Minecraft Logic + // @description + // Potion effects (be it on an entity, given by a potion, etc.) are represented in Denizen as <@link ObjectType MapTag>s with the following keys: + // - effect: the effect type given by the effect, see <@link url https://minecraft.wiki/w/Effect#Descriptions>. + // - amplifier: the number to increase the effect level by, usually controls how powerful its effects are (optional for input, defaults to 0 which is level 1). + // - duration (<@link ObjectType DurationTag>): how long the effect should last (optional for input, defaults to 0s). + // - ambient: a boolean (true/false) for whether the effect's particles should be more translucent and less intrusive, like effects given by a beacon (optional for input, defaults to true). + // - particles: a boolean (true/false) for whether the effect should display particles (optional for input, defaults to true). + // - icon: a boolean (true/false) for whether the effect should have an icon on a player's HUD when applied (optional for input, defaults to false). + // + // For example, [effect=speed;amplifier=2;duration=10s;ambient=false;particles=true;icon=true] would be a level 3 speed effect that lasts 10 seconds, with (normal) particles and an icon. + // --> + public static boolean describes(ItemTag item) { return item.getItemMeta() instanceof PotionMeta || item.getItemMeta() instanceof SuspiciousStewMeta; } - public static MapTag effectToMap(PotionEffect effect) { + public static MapTag effectToMap(PotionEffect effect, boolean includeDeprecated) { MapTag map = new MapTag(); - map.putObject("type", new ElementTag(effect.getType().getName())); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + map.putObject("effect", new ElementTag(Utilities.namespacedKeyToString(effect.getType().getKey()), true)); + } + else { + includeDeprecated = true; + } map.putObject("amplifier", new ElementTag(effect.getAmplifier())); map.putObject("duration", new DurationTag((long) effect.getDuration())); map.putObject("ambient", new ElementTag(effect.isAmbient())); map.putObject("particles", new ElementTag(effect.hasParticles())); map.putObject("icon", new ElementTag(effect.hasIcon())); + // TODO: deprecate this + if (includeDeprecated) { + map.putObject("type", new ElementTag(effect.getType().getName(), true)); + } return map; } @@ -50,15 +74,21 @@ public ListTag getMapTagData(boolean includeExtras) { if (getItemMeta() instanceof PotionMeta potionMeta) { MapTag base = new MapTag(); if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { - base.putObject("base_type", new ElementTag(Utilities.namespacedKeyToString(potionMeta.getBasePotionType().getKey()), true)); + if (potionMeta.hasBasePotionType()) { + base.putObject("base_type", new ElementTag(Utilities.namespacedKeyToString(potionMeta.getBasePotionType().getKey()), true)); + } + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && PaperAPITools.instance.hasCustomName(potionMeta)) { + base.putObject("translation_id", new ElementTag(potionMeta.getCustomName(), true)); + } } else { includeExtras = true; } if (includeExtras) { // TODO: Eventually remove these 4 - base.putObject("type", new ElementTag(potionMeta.getBasePotionData().getType())); - base.putObject("upgraded", new ElementTag(potionMeta.getBasePotionData().isUpgraded())); - base.putObject("extended", new ElementTag(potionMeta.getBasePotionData().isExtended())); + LegacyPotionData data = getLegacyBasePotionData(); + base.putObject("type", new ElementTag(data.type(), true)); + base.putObject("upgraded", new ElementTag(data.upgraded())); + base.putObject("extended", new ElementTag(data.extended())); if (potionMeta.hasColor()) { base.putObject("color", BukkitColorExtensions.fromColor(potionMeta.getColor())); } @@ -66,7 +96,7 @@ public ListTag getMapTagData(boolean includeExtras) { result.addObject(base); } for (PotionEffect potionEffect : potionEffects) { - result.addObject(effectToMap(potionEffect)); + result.addObject(effectToMap(potionEffect, includeExtras)); } return result; } @@ -78,19 +108,26 @@ public static PotionEffect parseEffect(MapTag effectMap, TagContext context) { boolean ambient = true; boolean particles = true; boolean icon = false; - if (effectMap.containsKey("type")) { - String typeString = effectMap.getObject("type").toString(); - type = PotionEffectType.getByName(typeString); - if (type == null) { - if (context.showErrors()) { - Debug.echoError("Invalid potion effect type '" + typeString + "': effect type is required."); - } - return null; + ElementTag effectInput = effectMap.getElement("effect"); + ElementTag typeInput = null; + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20) && effectInput != null) { + type = Registry.EFFECT.get(Utilities.parseNamespacedKey(effectInput.asString())); + } + else if ((typeInput = effectMap.getElement("type")) != null) { + type = PotionEffectType.getByName(typeInput.asString()); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + BukkitImplDeprecations.oldPotionEffectType.warn(context); } } else { if (context.showErrors()) { - Debug.echoError("Invalid potion effect type: effect type is required."); + Debug.echoError("Invalid potion effect: effect type is required."); + } + return null; + } + if (type == null) { + if (context.showErrors()) { + Debug.echoError("Invalid potion effect type '" + (effectInput != null ? effectInput : typeInput) + "' specified: effect type is required."); } return null; } @@ -154,32 +191,39 @@ public ListTag getPropertyValue() { return getMapTagData(false); } + private boolean applyBasePotionData(PotionMeta potionMeta, ObjectTag baseData, Mechanism mechanism) { + if (!baseData.canBeType(MapTag.class)) { + return applyLegacyStringBasePotionData(baseData.toString(), potionMeta, mechanism); + } + MapTag baseDataMap = baseData.asType(MapTag.class, mechanism.context); + if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_19) || baseDataMap.containsKey("type")) { + return applyLegacyMapBasePotionData(baseDataMap, potionMeta, mechanism); + } + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + ElementTag translationId = baseDataMap.getElement("translation_id"); + potionMeta.setCustomName(translationId != null ? translationId.asString() : null); + } + ElementTag baseTypeElement = baseDataMap.getElement("base_type"); + if (baseTypeElement == null) { + potionMeta.setBasePotionType(null); + return false; + } + PotionType baseType = Utilities.elementToEnumlike(baseTypeElement, PotionType.class); + if (baseType == null) { + mechanism.echoError("Invalid base potion type '" + baseTypeElement + "' specified."); + return true; + } + potionMeta.setBasePotionType(baseType); + return false; + } + @Override public void setPropertyValue(ObjectTag value, Mechanism mechanism) { List data = new ArrayList<>(CoreUtilities.objectToList(value, mechanism.context)); ItemMeta meta = getItemMeta(); if (meta instanceof PotionMeta potionMeta) { - ObjectTag firstObj = data.remove(0); - if (firstObj.canBeType(MapTag.class)) { - MapTag baseEffect = firstObj.asType(MapTag.class, mechanism.context); - if (baseEffect.containsKey("base_type")) { - ElementTag baseTypeElement = baseEffect.getElement("base_type"); - PotionType type = Registry.POTION.get(Utilities.parseNamespacedKey(baseTypeElement.asString())); - if (type == null && baseTypeElement.matchesEnum(PotionType.class)) { - type = baseTypeElement.asEnum(PotionType.class); - } - if (type == null) { - mechanism.echoError("Invalid base potion type '" + baseTypeElement + "': valid base potion_type is required"); - return; - } - potionMeta.setBasePotionType(type); - } - else { - applyLegacyMapBasePotionData(baseEffect, potionMeta, mechanism); - } - } - else { - applyLegacyStringBasePotionData(firstObj.toString(), potionMeta, mechanism); + if (applyBasePotionData(potionMeta, data.remove(0), mechanism)) { + return; } potionMeta.clearCustomEffects(); } @@ -224,7 +268,7 @@ public static void register() { // Returns a list of all potion effects on this item, in the same format as the MapTag input to the mechanism. // This applies to Potion items, Tipped Arrow items, and Suspicious Stews. // Note that for potions or tipped arrows (not suspicious stew) the first value in the list is the potion's base type. - // All subsequent entries are effect data. + // All subsequent entries are potion effects in <@link language Potion Effect Format>. // --> PropertyParser.registerTag(ItemPotion.class, ListTag.class, "effects_data", (attribute, prop) -> { return prop.getMapTagData(true); @@ -239,22 +283,16 @@ public static void register() { // This applies to Potion items, Tipped Arrow items, and Suspicious Stews. // // For potions or tipped arrows (not suspicious stew), the first item in the list must be a MapTag with keys: - // "base_type" - from <@link url https://minecraft.wiki/w/Potion#Item_data> + // "base_type" - from <@link url https://minecraft.wiki/w/Potion#Item_data> (optional, becomes an uncraftable potion when unset). + // "translation_id" - controls the translation key used for the default item display name. The translation key used is "item.minecraft..effect." (optional). // // For example: [base_type=strong_swiftness] // This example produces an item labeled as "Potion of Swiftness - Speed II (1:30)" // - // Each following item in the list are potion effects, which must be a MapTag with keys: - // "type" - from <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/potion/PotionEffectType.html> - // "amplifier" - number to increase the level by (0 for default level 1) (optional, default 0) - // "duration" - DurationTag, how long it lasts (optional, default 0s) - // "ambient", "particles", "icon" - booleans (optional, default true, true, false) - // - // For example: [type=SPEED;amplifier=2;duration=10s;ambient=false;particles=true;icon=true] - // This example would be a level 3 swiftness potion that lasts 10 seconds. + // Each following item in the list are potion effects, which must be a MapTag in <@link language Potion Effect Format>. // // A very short full default potion item would be: potion[potion_effects=[base_type=regeneration] - // A (relatively) short full potion item would be: potion[potion_effects=] + // A (relatively) short full potion item would be: potion[potion_effects=] // (Note the list constructor to force data format interpretation, as potion formats can be given multiple ways and the system will get confused without a constructor) // // @tags @@ -293,12 +331,12 @@ public static void register() { // Deprecated in favor of <@link tag ItemTag.effects_data> // --> PropertyParser.registerTag(ItemPotion.class, ElementTag.class, "potion_base_type", (attribute, object) -> { - if (!(object.getItemMeta() instanceof PotionMeta potionMeta)) { + if (!(object.getItemMeta() instanceof PotionMeta)) { attribute.echoError("This item does not have a base potion type."); return null; } BukkitImplDeprecations.oldPotionEffects.warn(attribute.context); - return new ElementTag(potionMeta.getBasePotionData().getType()); + return new ElementTag(object.getLegacyBasePotionData().type(), true); }); // <--[tag] @@ -316,8 +354,9 @@ public static void register() { return null; } BukkitImplDeprecations.oldPotionEffects.warn(attribute.context); - return new ElementTag(potionMeta.getBasePotionData().getType().name() + "," + (potionMeta.getBasePotionData().isUpgraded() ? 2 : 1) - + "," + potionMeta.getBasePotionData().isExtended() + "," + (object.getMaterial() == Material.SPLASH_POTION) + LegacyPotionData data = object.getLegacyBasePotionData(); + return new ElementTag(data.type() + "," + (data.upgraded() ? 2 : 1) + + "," + data.extended() + "," + (object.getMaterial() == Material.SPLASH_POTION) + (potionMeta.hasColor() ? "," + BukkitColorExtensions.fromColor(potionMeta.getColor()).identify() : "")); }); @@ -359,17 +398,17 @@ public static void register() { } if (attribute.startsWith("is_extended", 2)) { attribute.fulfill(1); - if (!(object.getItemMeta() instanceof PotionMeta potionMeta)) { + if (!(object.getItemMeta() instanceof PotionMeta)) { return null; } - return new ElementTag(potionMeta.getBasePotionData().isExtended()); + return new ElementTag(object.getLegacyBasePotionData().extended()); } if (attribute.startsWith("level", 2)) { attribute.fulfill(1); - if (!(object.getItemMeta() instanceof PotionMeta potionMeta)) { + if (!(object.getItemMeta() instanceof PotionMeta)) { return null; } - return new ElementTag(potionMeta.getBasePotionData().isUpgraded() ? 2 : 1); + return new ElementTag(object.getLegacyBasePotionData().upgraded() ? 2 : 1); } if (attribute.startsWith("is_ambient", 2)) { attribute.fulfill(1); @@ -399,27 +438,31 @@ public static void register() { attribute.fulfill(1); return new ElementTag(0); } - if (!(object.getItemMeta() instanceof PotionMeta potionMeta)) { + if (!(object.getItemMeta() instanceof PotionMeta)) { return null; } - PotionData data = potionMeta.getBasePotionData(); - return new ElementTag(data.getType().name() + "," + (data.isUpgraded() ? 2 : 1) - + "," + data.isExtended() + "," + (object.getMaterial() == Material.SPLASH_POTION)); + LegacyPotionData data = object.getLegacyBasePotionData(); + return new ElementTag(data.type() + "," + (data.upgraded() ? 2 : 1) + + "," + data.extended() + "," + (object.getMaterial() == Material.SPLASH_POTION)); }); } - private static void applyLegacyMapBasePotionData(MapTag input, PotionMeta potionMeta, Mechanism mechanism) { + private static boolean applyLegacyMapBasePotionData(MapTag input, PotionMeta potionMeta, Mechanism mechanism) { if (!input.containsKey("type")) { mechanism.echoError("Must specify a base potion type."); - return; + return true; } ElementTag typeElement = input.getElement("type"); - if (!typeElement.matchesEnum(PotionType.class)) { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20) && typeElement.asLowerString().equals("uncraftable")) { + potionMeta.setBasePotionType(null); + return false; + } + PotionType type = Utilities.elementToEnumlike(typeElement, PotionType.class); + if (type == null) { mechanism.echoError("Invalid base potion type '" + typeElement + "': type is required"); - return; + return true; } - PotionType type = PotionType.valueOf(typeElement.asString().toUpperCase()); boolean upgraded = false; boolean extended = false; if (input.containsKey("upgraded")) { @@ -451,17 +494,22 @@ private static void applyLegacyMapBasePotionData(MapTag input, PotionMeta potion } } applyLegacyBasePotionData(potionMeta, type, upgraded, extended, color, mechanism); + return false; } - private static void applyLegacyStringBasePotionData(String input, PotionMeta potionMeta, Mechanism mechanism) { + private static boolean applyLegacyStringBasePotionData(String input, PotionMeta potionMeta, Mechanism mechanism) { String[] d1 = input.split(","); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20) && CoreUtilities.equalsIgnoreCase(d1[0], "uncraftable")) { + potionMeta.setBasePotionType(null); + return false; + } PotionType type; try { type = PotionType.valueOf(d1[0].toUpperCase()); } catch (IllegalArgumentException ex) { mechanism.echoError("Invalid base potion type '" + d1[0] + "': type is required"); - return; + return true; } boolean upgraded = CoreUtilities.equalsIgnoreCase(d1[1], "true"); boolean extended = CoreUtilities.equalsIgnoreCase(d1[2], "true"); @@ -476,6 +524,7 @@ private static void applyLegacyStringBasePotionData(String input, PotionMeta pot } } applyLegacyBasePotionData(potionMeta, type, upgraded, extended, color, mechanism); + return false; } private static void applyLegacyBasePotionData(PotionMeta potionMeta, PotionType type, boolean upgraded, boolean extended, ColorTag color, Mechanism mechanism) { @@ -541,4 +590,19 @@ public static PotionEffect parseLegacyEffectString(String str, TagContext contex } return new PotionEffect(type, duration, amplifier, ambient, particles, icon); } + + @Deprecated(forRemoval = true) + public record LegacyPotionData(String type, boolean extended, boolean upgraded) { + public static final LegacyPotionData DEFAULT_DATA = new LegacyPotionData("UNCRAFTABLE", false, false); + + public LegacyPotionData(PotionData data) { + this(data.getType().name(), data.isExtended(), data.isUpgraded()); + } + } + + @Deprecated(forRemoval = true) + public LegacyPotionData getLegacyBasePotionData() { + PotionData data = as(PotionMeta.class).getBasePotionData(); + return data != null ? new LegacyPotionData(data) : LegacyPotionData.DEFAULT_DATA; + } } 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 1efb8d826d..461972636c 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java @@ -344,6 +344,9 @@ public class BukkitImplDeprecations { // Bad candidate for bumping, targets extremely commonly used naming, some of which may be hard to remove (eg stored in flag data). public static Warning oldSpigotNames = new FutureWarning("oldSpigotNames", "Several features (particles, entities, etc.) had alternative naming added by Spigot, which are now deprecated in favor of the official Minecraft naming; see relevant feature's meta docs for more information."); + // Added 2024/11/19 + public static Warning oldPotionEffectType = new FutureWarning("oldPotionEffectType", "Potion effects now use an 'effect' key for the potion effect's type, see meta docs for more information."); + // Added 2024/12/27 public static Warning entityIsSheared = new FutureWarning("entityIsSheared", "'EntityTag.is_sheared' and 'EntityTag.has_pumpkin_head' properties are deprecated in favor of 'EntityTag.sheared'."); diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/PaperAPITools.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/PaperAPITools.java index b12ce29902..3eb86b9e5c 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/PaperAPITools.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/PaperAPITools.java @@ -20,6 +20,7 @@ import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.*; +import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.scoreboard.Team; import org.bukkit.util.Consumer; @@ -217,4 +218,9 @@ public String getClientBrand(Player player) { public boolean canUseEquipmentSlot(LivingEntity entity, EquipmentSlot slot) { return true; } + + // TODO workaround Paper issue - https://github.com/PaperMC/Paper/issues/11732 + public boolean hasCustomName(PotionMeta meta) { + return meta.hasCustomName(); + } } From 60cacefa5978ded1086e76315bbd3c4d05648119 Mon Sep 17 00:00:00 2001 From: MCSamuel Date: Tue, 14 Jan 2025 18:32:21 -0500 Subject: [PATCH 123/280] `EntityTag.on_back/rolling/sneezing` for pandas (#2688) * 3 Panda-exclusive properties added. * changed tags to more of a boolean name * Set default values * Meta Updates * NMS requirement bump (tested 1.18, only worked past 1.19) (sry for all the re-approvals monkey) * Reverted `isX` format --- .../objects/properties/PropertyRegistry.java | 5 ++ .../properties/entity/EntityOnBack.java | 47 +++++++++++++++++++ .../properties/entity/EntityRolling.java | 47 +++++++++++++++++++ .../properties/entity/EntitySneezing.java | 47 +++++++++++++++++++ 4 files changed, 146 insertions(+) create mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityOnBack.java create mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityRolling.java create mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntitySneezing.java diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java index a3e5a7c6a6..87e1711365 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java @@ -127,6 +127,7 @@ public static void registerMainProperties() { PropertyParser.registerProperty(EntityMaterial.class, EntityTag.class); PropertyParser.registerProperty(EntityMaxFuseTicks.class, EntityTag.class); if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { + PropertyParser.registerProperty(EntityOnBack.class, EntityTag.class); PropertyParser.registerProperty(EntityOpacity.class, EntityTag.class); } PropertyParser.registerProperty(EntityPainting.class, EntityTag.class); @@ -145,6 +146,7 @@ public static void registerMainProperties() { PropertyParser.registerProperty(EntityRiptide.class, EntityTag.class); if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { PropertyParser.registerProperty(EntityRightRotation.class, EntityTag.class); + PropertyParser.registerProperty(EntityRolling.class, EntityTag.class); } PropertyParser.registerProperty(EntityRotation.class, EntityTag.class); if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { @@ -164,6 +166,9 @@ public static void registerMainProperties() { PropertyParser.registerProperty(EntitySitting.class, EntityTag.class); PropertyParser.registerProperty(EntitySize.class, EntityTag.class); PropertyParser.registerProperty(EntitySmall.class, EntityTag.class); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { + PropertyParser.registerProperty(EntitySneezing.class, EntityTag.class); + } PropertyParser.registerProperty(EntitySpeed.class, EntityTag.class); PropertyParser.registerProperty(EntitySpell.class, EntityTag.class); if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityOnBack.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityOnBack.java new file mode 100644 index 0000000000..211495ee09 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityOnBack.java @@ -0,0 +1,47 @@ +package com.denizenscript.denizen.objects.properties.entity; + +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; +import org.bukkit.entity.Panda; + +public class EntityOnBack extends EntityProperty { + + // <--[property] + // @object EntityTag + // @name on_back + // @input ElementTag(Boolean) + // @description + // Controls whether a panda is on its back. + // --> + + public static boolean describes(EntityTag entity) { + return entity.getBukkitEntity() instanceof Panda; + } + + @Override + public boolean isDefaultValue(ElementTag val) { + return !val.asBoolean(); + } + + @Override + public ElementTag getPropertyValue() { + return new ElementTag(as(Panda.class).isOnBack()); + } + + @Override + public void setPropertyValue(ElementTag param, Mechanism mechanism) { + if (mechanism.requireBoolean()) { + as(Panda.class).setOnBack(param.asBoolean()); + } + } + + @Override + public String getPropertyId() { + return "on_back"; + } + + public static void register() { + autoRegister("on_back", EntityOnBack.class, ElementTag.class, false); + } +} diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityRolling.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityRolling.java new file mode 100644 index 0000000000..4e964eea32 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityRolling.java @@ -0,0 +1,47 @@ +package com.denizenscript.denizen.objects.properties.entity; + +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; +import org.bukkit.entity.Panda; + +public class EntityRolling extends EntityProperty { + + // <--[property] + // @object EntityTag + // @name rolling + // @input ElementTag(Boolean) + // @description + // Controls whether a panda is rolling on the ground. + // --> + + public static boolean describes(EntityTag entity) { + return entity.getBukkitEntity() instanceof Panda; + } + + @Override + public boolean isDefaultValue(ElementTag val) { + return !val.asBoolean(); + } + + @Override + public ElementTag getPropertyValue() { + return new ElementTag(as(Panda.class).isRolling()); + } + + @Override + public void setPropertyValue(ElementTag param, Mechanism mechanism) { + if (mechanism.requireBoolean()) { + as(Panda.class).setRolling(param.asBoolean()); + } + } + + @Override + public String getPropertyId() { + return "rolling"; + } + + public static void register() { + autoRegister("rolling", EntityRolling.class, ElementTag.class, false); + } +} diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntitySneezing.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntitySneezing.java new file mode 100644 index 0000000000..8450cb6045 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntitySneezing.java @@ -0,0 +1,47 @@ +package com.denizenscript.denizen.objects.properties.entity; + +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; +import org.bukkit.entity.Panda; + +public class EntitySneezing extends EntityProperty { + + // <--[property] + // @object EntityTag + // @name sneezing + // @input ElementTag(Boolean) + // @description + // Controls whether a panda is sneezing. + // --> + + public static boolean describes(EntityTag entity) { + return entity.getBukkitEntity() instanceof Panda; + } + + @Override + public boolean isDefaultValue(ElementTag val) { + return !val.asBoolean(); + } + + @Override + public ElementTag getPropertyValue() { + return new ElementTag(as(Panda.class).isSneezing()); + } + + @Override + public void setPropertyValue(ElementTag param, Mechanism mechanism) { + if (mechanism.requireBoolean()) { + as(Panda.class).setSneezing(param.asBoolean()); + } + } + + @Override + public String getPropertyId() { + return "sneezing"; + } + + public static void register() { + autoRegister("sneezing", EntitySneezing.class, ElementTag.class, false); + } +} From ad3da0b8be901a686b7c8aacb45db987b3d26ebe Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Wed, 15 Jan 2025 09:04:49 +0000 Subject: [PATCH 124/280] Entity potion handling 1.20 fixes (#2693) * Update to modern property format * Use modern `PotionType`s on 1.20+ * EntityTag.potion_type, deprecate EntityTag.potion * `potion_type` no input handling --- .../objects/properties/PropertyRegistry.java | 3 + .../properties/entity/EntityPotion.java | 139 +++++++----------- .../properties/entity/EntityPotionType.java | 53 +++++++ .../utilities/BukkitImplDeprecations.java | 6 + 4 files changed, 113 insertions(+), 88 deletions(-) create mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotionType.java diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java index 87e1711365..8bf9b31087 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java @@ -141,6 +141,9 @@ public static void registerMainProperties() { PropertyParser.registerProperty(EntityPlayingDead.class, EntityTag.class); PropertyParser.registerProperty(EntityPotion.class, EntityTag.class); PropertyParser.registerProperty(EntityPotionEffects.class, EntityTag.class); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + PropertyParser.registerProperty(EntityPotionType.class, EntityTag.class); + } PropertyParser.registerProperty(EntityPowered.class, EntityTag.class); PropertyParser.registerProperty(EntityProfession.class, EntityTag.class); PropertyParser.registerProperty(EntityRiptide.class, EntityTag.class); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotion.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotion.java index 39b3fed330..351f3e4386 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotion.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotion.java @@ -4,9 +4,8 @@ import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizen.utilities.BukkitImplDeprecations; import com.denizenscript.denizencore.objects.Mechanism; -import com.denizenscript.denizencore.objects.ObjectTag; -import com.denizenscript.denizencore.objects.properties.Property; import com.denizenscript.denizencore.tags.Attribute; import org.bukkit.Material; import org.bukkit.entity.Arrow; @@ -14,70 +13,72 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.PotionMeta; -public class EntityPotion implements Property { +@Deprecated +public class EntityPotion extends EntityProperty { - public static boolean describes(ObjectTag entity) { - if (!(entity instanceof EntityTag)) { - return false; - } - return ((EntityTag) entity).getBukkitEntity() instanceof ThrownPotion - || ((EntityTag) entity).getBukkitEntity() instanceof Arrow; - } + // <--[property] + // @object EntityTag + // @name potion + // @input ItemTag + // @deprecated use 'EntityTag.potion_type' for arrows, and 'EntityTag.item' for splash potions. + // @description + // Deprecated in favor of <@link property EntityTag.potion_type> for arrows, and <@link property EntityTag.item> for splash potions. + // --> - public static EntityPotion getFrom(ObjectTag entity) { - if (!describes(entity)) { - return null; - } - else { - return new EntityPotion((EntityTag) entity); - } + public static boolean describes(EntityTag entity) { + return entity.getBukkitEntity() instanceof ThrownPotion || entity.getBukkitEntity() instanceof Arrow; } - public static final String[] handledTags = new String[] { - "potion" - }; - - public static final String[] handledMechs = new String[] { - "potion" - }; - - EntityTag entity; - - public EntityPotion(EntityTag entity) { - this.entity = entity; - } - - public ItemStack getPotion() { - if (entity.getBukkitEntity() instanceof ThrownPotion) { - return ((ThrownPotion) entity.getBukkitEntity()).getItem(); + @Override + public ItemTag getPropertyValue() { + if (getEntity() instanceof ThrownPotion thrownPotion) { + return new ItemTag(thrownPotion.getItem()); } else { // Tipped arrow ItemStack refItem = new ItemStack(Material.POTION); PotionMeta meta = (PotionMeta) refItem.getItemMeta(); - // TODO: 1.20.6: PotionData API - if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_19)) { - meta.setBasePotionData(((Arrow) entity.getBukkitEntity()).getBasePotionData()); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + meta.setBasePotionType(as(Arrow.class).getBasePotionType()); + } + else { + meta.setBasePotionData(as(Arrow.class).getBasePotionData()); } refItem.setItemMeta(meta); - return refItem; + return new ItemTag(refItem); } } - public void setPotion(ItemStack item) { - if (entity.getBukkitEntity() instanceof ThrownPotion) { - ((ThrownPotion) entity.getBukkitEntity()).setItem(item); + @Override + public ItemTag getTagValue(Attribute attribute) { + if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_19)) { + return super.getTagValue(attribute); } - else { // Tipped arrow - // TODO: 1.20.6: PotionData API - if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_19)) { - ((Arrow) entity.getBukkitEntity()).setBasePotionData(((PotionMeta) item.getItemMeta()).getBasePotionData()); - } + if (getEntity() instanceof ThrownPotion) { + BukkitImplDeprecations.splashPotionItem.warn(attribute.context); + } + else { + BukkitImplDeprecations.arrowBasePotionType.warn(attribute.context); } + return super.getTagValue(attribute); } @Override - public String getPropertyString() { - return new ItemTag(getPotion()).identify(); + public void setPropertyValue(ItemTag value, Mechanism mechanism) { + if (getEntity() instanceof ThrownPotion thrownPotion) { + thrownPotion.setItem(value.getItemStack()); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + BukkitImplDeprecations.splashPotionItem.warn(mechanism.context); + } + } + else { // Tipped arrow + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + BukkitImplDeprecations.arrowBasePotionType.warn(mechanism.context); + as(Arrow.class).setBasePotionType(((PotionMeta) value.getItemMeta()).getBasePotionType()); + } + else { + as(Arrow.class).setBasePotionData(((PotionMeta) value.getItemMeta()).getBasePotionData()); + } + } } @Override @@ -85,45 +86,7 @@ public String getPropertyId() { return "potion"; } - @Override - public ObjectTag getObjectAttribute(Attribute attribute) { - if (attribute == null) { - return null; - } - - // <--[tag] - // @attribute - // @returns ItemTag - // @mechanism EntityTag.potion - // @group properties - // @description - // If the entity is a Tipped Arrow, returns an ItemTag of a potion with the base potion data of the arrow. - // If the entity is a Splash Potion, returns an ItemTag of the splash potion's full potion data. - // --> - if (attribute.startsWith("potion")) { - return new ItemTag(getPotion()).getObjectAttribute(attribute.fulfill(1)); - } - - return null; - } - - @Override - public void adjust(Mechanism mechanism) { - - // <--[mechanism] - // @object EntityTag - // @name potion - // @input ItemTag - // @description - // Input must be a potion item! - // If the entity is a Tipped Arrow, sets the arrow's base potion data based on the item input. - // If the entity is a splash Potion, sets the splash potion's full potion data from the item input. - // @tags - // - // --> - if (mechanism.matches("potion") && mechanism.requireObject(ItemTag.class)) { - setPotion(mechanism.valueAsType(ItemTag.class).getItemStack()); - } - + public static void register() { + autoRegister("potion", EntityPotion.class, ItemTag.class, false); } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotionType.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotionType.java new file mode 100644 index 0000000000..e98a7f0a7c --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotionType.java @@ -0,0 +1,53 @@ +package com.denizenscript.denizen.objects.properties.entity; + +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.utilities.Utilities; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; +import org.bukkit.entity.Arrow; +import org.bukkit.potion.PotionType; + +public class EntityPotionType extends EntityProperty { + + // <--[property] + // @object EntityTag + // @name potion_type + // @input ElementTag + // @description + // Controls an Arrow's base potion type, if any. + // See <@link url https://minecraft.wiki/w/Potion#Item_data> for a list of potion types. + // See <@link property EntityTag.potion_effects> to control the potion effects an arrow applies. + // @mechanism + // Specify no input to remove the base potion type. + // --> + + public static boolean describes(EntityTag entity) { + return entity.getBukkitEntity() instanceof Arrow; + } + + @Override + public ElementTag getPropertyValue() { + PotionType type = as(Arrow.class).getBasePotionType(); + return type != null ? new ElementTag(Utilities.namespacedKeyToString(type.getKey()), true) : null; + } + + @Override + public void setPropertyValue(ElementTag value, Mechanism mechanism) { + if (value == null) { + as(Arrow.class).setBasePotionType(null); + return; + } + if (Utilities.requireEnumlike(mechanism, PotionType.class)) { + as(Arrow.class).setBasePotionType(Utilities.elementToEnumlike(value, PotionType.class)); + } + } + + @Override + public String getPropertyId() { + return "potion_type"; + } + + public static void register() { + autoRegisterNullable("potion_type", EntityPotionType.class, ElementTag.class, false); + } +} 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 461972636c..f2b886226e 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java @@ -350,6 +350,12 @@ public class BukkitImplDeprecations { // Added 2024/12/27 public static Warning entityIsSheared = new FutureWarning("entityIsSheared", "'EntityTag.is_sheared' and 'EntityTag.has_pumpkin_head' properties are deprecated in favor of 'EntityTag.sheared'."); + // Added 2025/1/12 + public static Warning splashPotionItem = new FutureWarning("splashPotionItem", "Using 'EntityTag.potion' to get a splash potion's item is deprecated in favor of 'EntityTag.item'."); + + // Added 2025/1/12 + public static Warning arrowBasePotionType = new FutureWarning("arrowBasePotionType", "Using 'EntityTag.potion' to get an arrow's base potion type is deprecated in favor of 'EntityTag.potion_type'."); + // ==================== PAST deprecations of things that are already gone but still have a warning left behind ==================== // Removed upstream 2023/10/29 without warning. From ef4e356a9f8ef4d3f025189a496d3a935fdc910c Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Wed, 15 Jan 2025 01:32:35 -0800 Subject: [PATCH 125/280] end-of-year 2024 deprecation advancements --- .../denizen/objects/InventoryTag.java | 4 +- .../utilities/BukkitImplDeprecations.java | 378 +++++++++++------- 2 files changed, 237 insertions(+), 145 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/InventoryTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/InventoryTag.java index 74672849c4..882e7a9570 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/InventoryTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/InventoryTag.java @@ -1214,7 +1214,9 @@ public static void register() { // @attribute |...]> // @returns ElementTag(Boolean) // @description - // Returns whether the inventory can fit an item. + // Returns whether the inventory can fit an item, or list of items. + // When giving multiple item inputs, the tag will only return true if every item can be added to the inventory at once. + // If only some fit, the tag will return false. // --> tagProcessor.registerTag(ElementTag.class, "can_fit", (attribute, object) -> { if (!attribute.hasParam()) { 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 f2b886226e..235cc0d677 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java @@ -4,29 +4,29 @@ public class BukkitImplDeprecations { - // ==================== STRONG deprecations ==================== - // These show up every time, and warn any online ops. These are made clear they need to be fixed ASAP. + private static final String pointlessSubtagPrefix = "Most pointless sub-tags are deprecated in favor of explicit unique tags. "; + + // ==================== REMOVE THESE ==================== + // Every warning inside this section should be removed from the codebase. // Added on 2019/08/11 - // Recommend removal 2023 or later. + // Safe to remove now. public static Warning oldEconomyTags = new StrongWarning("oldEconomyTags", "player.money.currency* tags are deprecated in favor of server.economy.currency* tags."); - // In Bukkit impl, Added on 2019/08/19 - // Bad candidate for functionality removal - sometimes used by accident (when misreading the escape-tag docs) - public static Warning pointlessTextTags = new StrongWarning("pointlessTextTags", "Several text tags like '&dot' or '&cm' are pointless (there's no reason you can't just directly write them in). Please replace them with the actual intended text."); - // Added on 2019/09/18, but was deprecated earlier. // 2022-year-end commonality: #27 + // Safe to remove now. public static Warning playerRightClicksEntityContext = new StrongWarning("playerRightClicksEntityContext", "'context.location' in event 'on player right clicks entity' is deprecated: use 'context.entity.location'."); // Added on 2019/09/25, but was deprecated earlier. // Bad candidate for functionality removal - used to be commonly used // 2022-year-end commonality: #13 // 2023-year-end commonality: #19 + // Safe to remove now. public static Warning qtyTags = new StrongWarning("qtyTags", "'qty' in a tag or command is deprecated: use 'quantity'."); // In Bukkit impl, Relevant as of 2019/09/25, made current on 2020/02/12, made strong 2022/12/31. - private static final String pointlessSubtagPrefix = "Most pointless sub-tags are deprecated in favor of explicit unique tags. "; + // Safe to remove now. public static Warning npcNicknameTag = new StrongWarning("npcNicknameTag", pointlessSubtagPrefix + "npc.name.nickname is now just npc.nickname. Note that this historically appeared in the config.yml file, so check there if you're unsure what's using this tag."); public static Warning npcPreviousLocationTag = new StrongWarning("npcPreviousLocationTag", pointlessSubtagPrefix + "npc.location.previous_location is now just npc.previous_location."); public static Warning npcAnchorListTag = new StrongWarning("npcAnchorListTag", pointlessSubtagPrefix + "npc.anchor.list is now just npc.list_anchors."); @@ -37,22 +37,24 @@ public class BukkitImplDeprecations { public static Warning playerSidebarTags = new StrongWarning("playerSidebarTags", pointlessSubtagPrefix + "player.sidebar.* tags are now just player.sidebar_*."); public static Warning playerAttackCooldownTags = new StrongWarning("playerAttackCooldownTags", pointlessSubtagPrefix + "player.attack_cooldown.* tags are now just player.attack_cooldown_*."); public static Warning playerXpTags = new StrongWarning("playerXpTags", pointlessSubtagPrefix + "player.xp.* tags are now just player.xp_*."); - // 2023-year-end commonality: #36 - public static Warning entityHealthTags = new StrongWarning("entityHealthTags", pointlessSubtagPrefix + "entity.health.* tags are now just entity.health_*."); public static Warning entityMaxOxygenTag = new StrongWarning("entityMaxOxygenTag", pointlessSubtagPrefix + "entity.oxygen.max is now just entity.max_oxygen."); public static Warning itemBookTags = new StrongWarning("itemBookTags", pointlessSubtagPrefix + "item.book.* tags are now just item.book_*."); public static Warning playerItemInHandSlotTag = new StrongWarning("playerItemInHandSlotTag", pointlessSubtagPrefix + "player.item_in_hand_slot is now just player.held_item_slot."); // Added on 2019/09/24, made normal 2021/11/2021, made strong 2022/12/31. + // Safe to remove now. public static Warning oldRecipeScript = new StrongWarning("oldRecipeScript", "Item script single-recipe format is outdated. Use the modern 'recipes' list key (see meta docs)."); // Added 2020/04/24, made strong 2022/12/31. + // Safe to remove now. public static Warning itemInventoryTag = new StrongWarning("itemInventoryTag", "The tag 'item.inventory' is deprecated: use inventory_contents instead."); // Added 2020/05/21, made strong 2022/12/31. + // Safe to remove now. public static Warning itemSkinFullTag = new StrongWarning("itemSkinFullTag", pointlessSubtagPrefix + "item.skin.full is now item.skull_skin."); // Added 2020/06/03 but deprecated long ago, made strong 2022/12/31. + // Safe to remove now. public static Warning oldBossBarMech = new StrongWarning("oldBossBarMech", "The show_boss_bar mechanism is deprecated: use the bossbar command instead."); public static Warning oldTimeMech = new StrongWarning("oldTimeMech", "The player.*time mechanisms are deprecated: use the time command instead."); public static Warning oldWeatherMech = new StrongWarning("oldWeatherMech", "The player.*weather mechanisms are deprecated: use the weather command instead."); @@ -60,11 +62,13 @@ public class BukkitImplDeprecations { public static Warning oldMoneyMech = new StrongWarning("oldMoneyMech", "The player.money mechanism is deprecated: use the money command instead."); // added 2020/07/04, made normal 2021/11/2021, made strong 2022/12/31. + // Safe to remove now. public static Warning cuboidFullTag = new StrongWarning("cuboidFullTag", "The tag cuboid.full is deprecated: this should just never be used."); public static Warning furnaceTimeTags = new StrongWarning("furnaceTimeTags", "The furnace_burn_time, cook time, and cook total time tag/mechs have been replaced by _duration instead of _time equivalents (using DurationTag now)."); public static Warning playerTimePlayedTags = new StrongWarning("playerTimePlayedTags", "The tags player.first_played, last_played, ban_expiration, and ban_created have been replaced by tags of the same name with '_time' added to the end (using TimeTag now)."); // added 2020/07/19, made normal 2021/11/2021, made strong 2022/12/31. + // Safe to remove now. public static Warning airLevelEventDuration = new StrongWarning("airLevelEventDuration", "The 'entity changes air level' event uses 'air_duration' context now instead of the old tick count number."); public static Warning damageEventTypeMap = new StrongWarning("damageEventTypeMap", "The 'entity damaged' context 'damage_[TYPE]' is deprecated in favor of 'damage_type_map', which is operated as a MapTag."); @@ -72,54 +76,124 @@ public class BukkitImplDeprecations { public static Warning headCommand = new StrongWarning("headCommand", "The 'head' command is deprecated: use the 'equip' command with a 'player_head' item using the 'skull_skin' mechanism."); // added 2020/08/01, made normal 2021/11/2021, made strong 2022/12/31. + // Safe to remove now. public static Warning entityRemoveWhenFar = new StrongWarning("entityRemoveWhenFar", "The EntityTag remove_when_far_away property is deprecated in favor of the persistent property (which is the exact inverse)."); public static Warning entityPlayDeath = new StrongWarning("entityPlayDeath", "The EntityTag 'play_death' mechanism is deprecated: use the animate command."); // added 2020/08/19, made normal 2021/11/2021, made strong 2022/12/31. + // Safe to remove now. public static Warning npcSpawnMechanism = new StrongWarning("npcSpawnMechanism", "The NPCTag 'spawn' mechanism is deprecated: use the spawn command."); // Added 2020/05/17, made current on 2020/10/24. // 2022-year-end commonality: #28 + // Safe to remove now. public static Warning itemFlagsProperty = new StrongWarning("itemFlagsProperty", "The item.flags property has been renamed to item.hides, to avoid confusion with the new flaggable itemtags system."); // Added 2020/11/22, made current 2021/11/2021, made strong 2024/01/02. + // Safe to remove now. public static Warning biomeSpawnableTag = new StrongWarning("biomeSpawnableTag", pointlessSubtagPrefix + "The tag BiomeTag.spawnable_entities.(type) is deprecated: the type is now an input context instead."); // Added 2020/11/30, made current 2021/11/2021, made strong 2024/01/02. + // Safe to remove now. public static Warning npcDespawnMech = new StrongWarning("npcDespawnMech", "The NPCTag despawn mechanism is deprecated: use the despawn command."); // Added 2021/02/25, made current 2022/12/31, made strong 2024/01/02. + // Safe to remove now. public static Warning zapPrefix = new StrongWarning("zapPrefix", "The 'zap' command should be used with the scriptname and step as two separate arguments, not just one."); // Added 2020/03/05, made current on 2021/04/16, made current 2022/12/31, made strong 2024/01/02. + // Safe to remove now. public static Warning oldPlayEffectSpecials = new StrongWarning("oldPlayEffectSpecials", "The playeffect input of forms like 'iconcrack_' have been deprecated in favor of using the special_data input (refer to meta docs)."); // Added 2020/04/16, made current 2022/12/31, made strong 2024/01/02. + // Safe to remove now. public static Warning entityStandingOn = new StrongWarning("entityStandingOn", pointlessSubtagPrefix + "entity.location.standing_on is now just entity.standing_on."); // Added 2021/05/05, made current 2022/12/31, made strong 2024/01/02. + // Safe to remove now. public static Warning materialLit = new StrongWarning("materialLit", "The MaterialTag property 'lit' is deprecated in favor of 'switched'."); public static Warning materialCampfire = new StrongWarning("materialCampfire", "The MaterialTag property 'campfire' are deprecated in favor of 'type'."); public static Warning materialDrags = new StrongWarning("materialDrags", "The MaterialTag property 'drags' are deprecated in favor of 'mode'."); // Added 2021/06/15, but was irrelevant years earlier, made current 2022/12/31, made strong 2024/01/02. + // Safe to remove now. public static Warning itemMessage = new StrongWarning("itemMessage", "The PlayerTag mechanism 'item_message' is deprecated in favor of using the actionbar."); // Added 2021/11/14, made current 2022/12/31, made strong 2024/01/02. + // Safe to remove now. public static Warning blockSpreads = new StrongWarning("blockSpreads", "There are two ' spreads' events - use 'block spreads type:' or 'liquid spreads type:'"); // Added 2021/11/15, made current 2022/12/31, made strong 2024/01/02. + // Safe to remove now. public static Warning horseJumpsFormat = new StrongWarning("horseJumpsFormat", "The ' horse jumps' event is deprecated: don't put the color in the event line. (Deprecated for technical design reasons)."); // Added 2019/11/11, made slow 2021/11/2021, made current 2022/12/31, made strong 2024/01/02. + // Safe to remove now. public static Warning entityLocationCursorOnTag = new StrongWarning("entityLocationCursorOnTag", "entity.location.cursor_on tags should be replaced by entity.cursor_on (be careful with the slight differences though)."); // Added 2021/05/05, made current 2022/12/31, made strong 2024/01/02. + // Safe to remove now. public static Warning locationDistanceTag = new StrongWarning("locationDistanceTag", "locationtag.tree_distance is deprecated in favor of location.material.distance"); - // Added 2024/02/10. + // Added 2024/02/10, made strong 2025/01/15. + // Safe to remove now. public static Warning fakePlayer = new StrongWarning("fakePlayer", "The 'fake_player' entity was an experiment that was always redundant due to the availability of Citizens NPCs. If you use 'fake_player' please let us know on Discord ASAP."); + // ==================== STRONG deprecations ==================== + // These show up every time, and warn any online ops. These are made clear they need to be fixed ASAP. + + // In Bukkit impl, Relevant as of 2019/09/25, made current on 2020/02/12, made strong 2022/12/31. + // 2023-year-end commonality: #36 + // 2024-year-end commonality: #21 + public static Warning entityHealthTags = new StrongWarning("entityHealthTags", pointlessSubtagPrefix + "entity.health.* tags are now just entity.health_*."); + + // In Bukkit impl, Added on 2019/08/19 + // Bad candidate for functionality removal - sometimes used by accident (when misreading the escape-tag docs) + public static Warning pointlessTextTags = new StrongWarning("pointlessTextTags", "Several text tags like '&dot' or '&cm' are pointless (there's no reason you can't just directly write them in). Please replace them with the actual intended text."); + + // Added 2021/09/08, but was irrelevant years earlier, made normal 2024/01/02, made strong 2025/01/15. + // 2022-year-end commonality: #31 + // Safe to remove now. + public static Warning isValidTag = new StrongWarning("isValidTag", "The 'server.x_is_valid' style tags are deprecated: use '.exists', '.is_spawned.if_null[false]', etc."); + + // Added 2022/05/07, made normal 2024/01/02, made strong 2025/01/15. + // Safe to remove now. + public static Warning armorStandRawSlot = new StrongWarning("armorStandRawSlot", "The EntityTag.disabled_slots.raw tag and EntityTag.disabled_slots_raw mechanism are deprecated, use the EntityTag.disabled_slots_data tag and EntityTag.disabled_slots mechanism instead."); + + // Added 2022/07/28, made normal 2024/01/02, made strong 2025/01/15. + // Safe to remove now. + public static Warning internalEventReflectionContext = new StrongWarning("internalEventReflectionContext", "The context.field_ and fields special tags for 'internal bukkit event' are deprecated in favor of the 'reflect_event' global context."); + + // Added 2022/10/14, made normal 2024/01/02, made strong 2025/01/15. + // Safe to remove now. + public static Warning skeletonSwingArm = new StrongWarning("skeletonSwingArm", "The 'SKELETON_START/STOP_SWING_ARM' animations are deprecated in favor of the 'EntityTag.aggressive' property."); + public static Warning entityArmsRaised = new StrongWarning("entityArmsRaised", "The 'EntityTag.arms_raised' property is deprecated in favor of 'EntityTag.aggressive'."); + + // Added 2022/12/16, made normal 2024/01/02, made strong 2025/01/15. + // Safe to remove now. + public static Warning entitySkeletonArmsRaised = new StrongWarning("entitySkeletonArmsRaised", "The 'EntityTag.skeleton_arms_raised' mechanism is deprecated in favor of 'EntityTag.aggressive'."); + + // Added 2021/10/24, made slow 2022/12/31, made normal 2024/01/02, made strong 2025/01/15. + // Safe to remove now. + public static Warning entityArmorPose = new StrongWarning("entityArmorPose", "The old EntityTag.armor_pose and armor_pose_list tags are deprecated in favor of armor_pose_map."); + + // Added 2020/07/03, made slow 2022/12/31, made normal 2024/01/02, made strong 2025/01/15. + // Safe to remove now. + public static Warning attachToMech = new StrongWarning("attachToMech", "The entity 'attach_to' mechanism is deprecated: use the new 'attach' command instead!"); + + // Added 2020/07/12, made slow 2022/12/31, made normal 2024/01/02, made strong 2025/01/15. + // Safe to remove now. + public static Warning entityEquipmentSubtags = new StrongWarning("entityEquipmentSubtags", pointlessSubtagPrefix + " 'entity.equipment.slotname' is deprecated: use 'entity.equipment_map.get[slotname]' instead."); + + // Added 2021/04/13, made slow 2022/12/31, made normal 2024/01/02, made strong 2025/01/15. + // Safe to remove now. + public static Warning materialHasDataPackTag = new StrongWarning("materialHasDataPackTag", "The tag 'MaterialTag.has_vanilla_data_tag[...]' is deprecated in favor of MaterialTag.vanilla_tags.contains[]"); + public static Warning materialPropertyTags = new StrongWarning("materialPropertyTags", "Old MaterialTag.is_x property tags are deprecated in favor of PropertyHolderObject.supports[property-name]"); + + // Added 2024/04/02, is for a feature that was broken from the start in 2022, made strong 2025/01/15. + // Safe to remove now. + public static Warning forcedNoPersist = new StrongWarning("forcedNoPersist", "The 'forced_no_persist' was misspelled and inverted, use 'force_no_persist' instead."); + // ==================== Normal deprecations ==================== // These show up every time, and should get the server owner's attention quickly if they check their logs. @@ -128,62 +202,71 @@ public class BukkitImplDeprecations { // Recommend never removing. // 2022-year-end commonality: #17 // 2023-year-end commonality: #8 + // 2024-year-end commonality: #10 public static Warning playerByNameWarning = new Warning("playerByNameWarning", "Warning: loading player by name - use the UUID instead (or use tag server.match_player)!"); - // Added 2021/09/08, but was irrelevant years earlier, made normal 2024/01/02. - // 2022-year-end commonality: #31 - public static Warning isValidTag = new Warning("isValidTag", "The 'server.x_is_valid' style tags are deprecated: use '.exists', '.is_spawned.if_null[false]', etc."); - - // Added 2022/05/07, made normal 2024/01/02. - public static Warning armorStandRawSlot = new Warning("armorStandRawSlot", "The EntityTag.disabled_slots.raw tag and EntityTag.disabled_slots_raw mechanism are deprecated, use the EntityTag.disabled_slots_data tag and EntityTag.disabled_slots mechanism instead."); - - // Added 2022/07/28, made normal 2024/01/02. - public static Warning internalEventReflectionContext = new Warning("internalEventReflectionContext", "The context.field_ and fields special tags for 'internal bukkit event' are deprecated in favor of the 'reflect_event' global context."); + // Added 2020/06/13, made slow 2022/12/31, made normal 2024/01/02. + // 2023-year-end commonality: #16 + // 2024-year-end commonality: #18 + public static Warning listStyleTags = new Warning("listStyleTags", "'list_' tags are deprecated: just remove the 'list_' prefix."); - // Added 2022/10/14, made normal 2024/01/02. - public static Warning skeletonSwingArm = new Warning("skeletonSwingArm", "The 'SKELETON_START/STOP_SWING_ARM' animations are deprecated in favor of the 'EntityTag.aggressive' property."); - public static Warning entityArmsRaised = new Warning("entityArmsRaised", "The 'EntityTag.arms_raised' property is deprecated in favor of 'EntityTag.aggressive'."); + // Added 2020/04/19, Relevant for many years now, made slow 2022/12/31, made normal 2025/01/15. + // 2022-year-end commonality: #35 + // 2023-year-end commonality: #32 + // 2024-year-end commonality: #13 + public static Warning interactScriptPriority = new Warning("interactScriptPriority", "Assignment script 'interact scripts' section should not have numbered priority values, these were removed years ago. Check https://guide.denizenscript.com/guides/troubleshooting/updates-since-videos.html#assignment-script-updates for more info."); - // Added 2022/12/16, made normal 2024/01/02. - public static Warning entitySkeletonArmsRaised = new Warning("entitySkeletonArmsRaised", "The 'EntityTag.skeleton_arms_raised' mechanism is deprecated in favor of 'EntityTag.aggressive'."); + // Added 2020/12/25, made slow 2022/12/31, made normal 2025/01/15. + // 2022-year-end commonality: #36 + // Safe to remove now. + public static Warning itemEnchantmentTags = new Warning("itemEnchantmentTags", pointlessSubtagPrefix + "The ItemTag.enchantments.* tags are deprecated: use enchantment_map and relevant MapTag subtags."); - // Added 2021/10/24, made slow 2022/12/31, made normal 2024/01/02. - public static Warning entityArmorPose = new Warning("entityArmorPose", "The old EntityTag.armor_pose and armor_pose_list tags are deprecated in favor of armor_pose_map."); + // Added 2021/02/05, made very-slow 2022/12/31, made slow 2024/01/02, made normal 2025/01/15. + // Safe to remove now. + public static Warning itemProjectile = new Warning("itemProjectile", "The item_projectile custom entity type is deprecated: modern minecraft lets you set the item of any projectile, like 'snowball[item=stick]'"); - // Added 2020/06/13, made slow 2022/12/31, made normal 2024/01/02. - // 2023-year-end commonality: #16 - public static Warning listStyleTags = new Warning("listStyleTags", "'list_' tags are deprecated: just remove the 'list_' prefix."); + // Added 2021/03/02, made very-slow 2022/12/31, made slow 2024/01/02, made normal 2025/01/15. + // Safe to remove now. + public static Warning itemScriptColor = new Warning("itemScriptColor", "The item script 'color' key is deprecated: use the 'color' mechanism under the 'mechanisms' key instead."); - // Added 2020/07/03, made slow 2022/12/31, made normal 2024/01/02. - public static Warning attachToMech = new Warning("attachToMech", "The entity 'attach_to' mechanism is deprecated: use the new 'attach' command instead!"); + // Added 2021/07/26, made very-slow 2022/12/31, made slow 2024/01/02, made normal 2025/01/15. + // Safe to remove now. + public static Warning itemEnchantmentsLegacy = new Warning("itemEnchantmentsLegacy", "The tag 'ItemTag.enchantments' is deprecated: use enchantments_map, or enchantment_types."); + public static Warning echantmentTagUpdate = new Warning("echantmentTagUpdate", "Several legacy enchantment-related tags are deprecated in favor of using EnchantmentTag."); - // Added 2020/07/12, made slow 2022/12/31, made normal 2024/01/02. - public static Warning entityEquipmentSubtags = new Warning("entityEquipmentSubtags", pointlessSubtagPrefix + " 'entity.equipment.slotname' is deprecated: use 'entity.equipment_map.get[slotname]' instead."); + // Added 2022/01/30, made very-slow 2022/12/31, made slow 2024/01/02, made normal 2025/01/15. + // 2023-year-end commonality: #29 + // Safe to remove now. + public static Warning entityItemEnderman = new Warning("entityItemEnderman", "The property 'entity.item' for endermen has been replaced by 'entity.material' due to usage of block materials."); - // Added 2021/04/13, made slow 2022/12/31, made normal 2024/01/02. - public static Warning materialHasDataPackTag = new Warning("materialHasDataPackTag", "The tag 'MaterialTag.has_vanilla_data_tag[...]' is deprecated in favor of MaterialTag.vanilla_tags.contains[]"); - public static Warning materialPropertyTags = new Warning("materialPropertyTags", "Old MaterialTag.is_x property tags are deprecated in favor of PropertyHolderObject.supports[property-name]"); + // Added 2021/06/19, made very-slow 2022/12/31, made slow 2024/01/02, made normal 2025/01/15. + public static Warning entityMapTraceTag = new Warning("entityMapTraceTag", "The tag 'EntityTag.map_trace' is deprecated in favor of EntityTag.trace_framed_map"); - // Added 2024-04-02, is for a feature that was broken from the start in 2022. - public static Warning forcedNoPersist = new Warning("forcedNoPersist", "The 'forced_no_persist' was misspelled and inverted, use 'force_no_persist' instead."); + // Added 2021/06/27, made very-slow 2022/12/31, made slow 2024/01/02, made normal 2025/01/15. + // 2023-year-end commonality: #11 + // 2024-year-end commonality: #12 + public static Warning serverUtilTags = new Warning("serverUtilTags", "Some 'server.' tags for core features are deprecated in favor of 'util.' equivalents, including 'java_version', '*_file', 'ram_*', 'disk_*', 'notes', 'last_reload', 'scripts', 'sql_connections', '*_time_*', ..."); - // ==================== SLOW deprecations ==================== - // These aren't spammed, but will show up repeatedly until fixed. Server owners will probably notice them. + // Added 2021/06/27, made very-slow 2022/12/31, made slow 2024/01/02, made normal 2025/01/15. + // Safe to remove now. + public static Warning serverObjectExistsTags = new Warning("serverObjectExistsTags", "The 'object_is_valid' tag is a historical version of modern '.exists' or '.is_truthy' fallback tags."); - // Added 2020/04/19, Relevant for many years now, made slow 2022/12/31. - // 2022-year-end commonality: #35 - // 2023-year-end commonality: #32 - public static Warning interactScriptPriority = new SlowWarning("interactScriptPriority", "Assignment script 'interact scripts' section should not have numbered priority values, these were removed years ago. Check https://guide.denizenscript.com/guides/troubleshooting/updates-since-videos.html#assignment-script-updates for more info."); + // Added 2021/06/27, made very-slow 2022/12/31, made slow 2024/01/02, made normal 2025/01/15. + // Safe to remove now. + public static Warning hsbColorGradientTag = new Warning("hsbColorGradientTag", "The tag 'ElementTag.hsb_color_gradient' is deprecated: use 'color_gradient' with 'style=hsb'"); - // Added 2020/12/25, made slow 2022/12/31. - // 2022-year-end commonality: #36 - public static Warning itemEnchantmentTags = new SlowWarning("itemEnchantmentTags", pointlessSubtagPrefix + "The ItemTag.enchantments.* tags are deprecated: use enchantment_map and relevant MapTag subtags."); + // Added 2021/11/07, made very-slow 2022/12/31, made slow 2024/01/02, made normal 2025/01/15. + // Safe to remove now. + public static Warning assignmentRemove = new Warning("assignmentRemove", "'assignment remove' without a script is deprecated: use 'clear' to clear all scripts, or 'remove' to remove one at a time."); + public static Warning npcScriptSingle = new Warning("npcScriptSingle", "'npc.script' is deprecated in favor of 'npc.scripts' (plural)."); - // Added 2021/02/05, made very-slow 2022/12/31, made slow 2024/01/02. - public static Warning itemProjectile = new SlowWarning("itemProjectile", "The item_projectile custom entity type is deprecated: modern minecraft lets you set the item of any projectile, like 'snowball[item=stick]'"); + // Added 2024/02/04, made normal 2025/01/15. + // Safe to remove now. + public static Warning oldStructureTypes = new Warning("oldStructureTypes", "'server.structure_types' is based on outdated API and doesn't support modern datapack features. Use 'server.structures' instead."); + public static Warning findStructureTags = new Warning("findStructureTags", "'LocationTag.find.structure' and related tags are deprecated in favor of 'LocationTag.find_structure'."); - // Added 2021/03/02, made very-slow 2022/12/31, made slow 2024/01/02. - public static Warning itemScriptColor = new SlowWarning("itemScriptColor", "The item script 'color' key is deprecated: use the 'color' mechanism under the 'mechanisms' key instead."); + // ==================== SLOW deprecations ==================== + // These aren't spammed, but will show up repeatedly until fixed. Server owners will probably notice them. // In Paper module, Added 2022/03/20 // bump to normal warning and/or past warning after 1.18 is the minimum supported version (change happened in MC 1.18) @@ -194,154 +277,161 @@ public class BukkitImplDeprecations { public static Warning biomeGlobalDownfallType = new SlowWarning("biomeGlobalDownfallType", "The 'BiomeTag.downfall_type' tag is deprecated in favor of 'BiomeTag.downfall_at', as biome downfall is now location-based"); public static Warning biomeSettingDownfallType = new SlowWarning("biomeSettingDownfallType", "The 'BiomeTag.downfall_type' mechanism is removed, as Minecraft no longer allows for this value to be set."); - // Added 2021/07/26, made very-slow 2022/12/31, made slow 2024/01/02. - public static Warning itemEnchantmentsLegacy = new SlowWarning("itemEnchantmentsLegacy", "The tag 'ItemTag.enchantments' is deprecated: use enchantments_map, or enchantment_types."); - public static Warning echantmentTagUpdate = new SlowWarning("echantmentTagUpdate", "Several legacy enchantment-related tags are deprecated in favor of using EnchantmentTag."); - // Added 2023/09/16 // Bump to normal warning after 1.19 is the minimum supported version (change happened in 1.19) public static Warning boatType = new SlowWarning("boatType", "The 'EntityTag.boat_type' property is deprecated in favor of 'EntityTag.color' in 1.19+."); - // Added 2022/01/30, made very-slow 2022/12/31, made slow 2024/01/02. - // 2023-year-end commonality: #29 - public static Warning entityItemEnderman = new SlowWarning("entityItemEnderman", "The property 'entity.item' for endermen has been replaced by 'entity.material' due to usage of block materials."); + // Added 2021/03/29, made very-slow 2022/12/31, made slow 2024/05/09. + // 2022-year-end commonality: #7 + // 2023-year-end commonality: #31 + // Safe to remove now. + public static Warning legacyAttributeProperties = new SlowWarning("legacyAttributeProperties", "The 'attribute' properties are deprecated in favor of the 'attribute_modifiers' properties which more fully implement the attribute system."); - // Added 2021/06/19, made very-slow 2022/12/31, made slow 2024/01/02. - public static Warning entityMapTraceTag = new SlowWarning("entityMapTraceTag", "The tag 'EntityTag.map_trace' is deprecated in favor of EntityTag.trace_framed_map"); + // Added 2024/05/31 + // 2024-year-end commonality: #15 + public static Warning oldNbtProperty = new SlowWarning("oldNbtProperty", "'ItemTag.raw_nbt' is deprecated in favor of 'ItemTag.custom_data', as item NBT was removed by Mojang in favor of item components."); - // Added 2021/06/27, made very-slow 2022/12/31, made slow 2024/01/02. - // 2023-year-end commonality: #11 - public static Warning serverUtilTags = new SlowWarning("serverUtilTags", "Some 'server.' tags for core features are deprecated in favor of 'util.' equivalents, including 'java_version', '*_file', 'ram_*', 'disk_*', 'notes', 'last_reload', 'scripts', 'sql_connections', '*_time_*', ..."); + // In multiple places, Added 2021/11/20, made very-slow 2022/12/31, made slow 2025/01/15. + // 2022-year-end commonality: #15 + // 2023-year-end commonality: #23 + // Safe to remove now. + public static Warning pseudoTagBases = new SlowWarning("pseudoTagBases", "Pseudo-tags like '', '', '', and '' are deprecated in favor of definitions: just replace with <[text]> or similar."); - // Added 2021/06/27, made very-slow 2022/12/31, made slow 2024/01/02. - public static Warning serverObjectExistsTags = new SlowWarning("serverObjectExistsTags", "The 'object_is_valid' tag is a historical version of modern '.exists' or '.is_truthy' fallback tags."); + // Added 2021/10/18, made very-slow 2022/12/31, made slow 2025/01/15. + // 2022-year-end commonality: #10 + // Safe to remove now. + public static Warning entityMechanismsFormat = new SlowWarning("entityMechanismsFormat", "Entity script containers previously allowed mechanisms in the script's root, however they should now be under a 'mechanisms' key."); - // Added 2021/06/27, made very-slow 2022/12/31, made slow 2024/01/02. - public static Warning hsbColorGradientTag = new SlowWarning("hsbColorGradientTag", "The tag 'ElementTag.hsb_color_gradient' is deprecated: use 'color_gradient' with 'style=hsb'"); + // Added 2021/08/30, made very-slow 2022/12/31, made slow 2025/01/15. + // 2022-year-end commonality: #23 + // Safe to remove now. + public static Warning takeMoney = new SlowWarning("takeMoney", "Using the 'take' command to take money is deprecated in favor of the 'money' command."); - // Added 2021/11/07, made very-slow 2022/12/31, made slow 2024/01/02. - public static Warning assignmentRemove = new SlowWarning("assignmentRemove", "'assignment remove' without a script is deprecated: use 'clear' to clear all scripts, or 'remove' to remove one at a time."); - public static Warning npcScriptSingle = new SlowWarning("npcScriptSingle", "'npc.script' is deprecated in favor of 'npc.scripts' (plural)."); + // Added 2021/03/27, made very-slow 2024/01/02, made slow 2025/01/15. + // 2022-year-end commonality: #6 + // 2023-year-end commonality: #13 + // Safe to remove now. + public static Warning locationFindEntities = new SlowWarning("locationFindEntities", "The tag 'LocationTag.find.entities.within' and 'blocks' tags are replaced by the 'find_entities' and 'find_blocks' versions. They are mostly compatible, but now have advanced matcher options."); - // Added 2024/02/04 - public static Warning oldStructureTypes = new SlowWarning("oldStructureTypes", "'server.structure_types' is based on outdated API and doesn't support modern datapack features. Use 'server.structures' instead."); - public static Warning findStructureTags = new SlowWarning("findStructureTags", "'LocationTag.find.structure' and related tags are deprecated in favor of 'LocationTag.find_structure'."); + // Added 2021/03/27, made very-slow 2024/01/02, made slow 2025/01/15. + // 2022-year-end commonality: #16 + // 2023-year-end commonality: #26 + // Safe to remove now. + public static Warning inventoryNonMatcherTags = new SlowWarning("inventoryNonMatcherTags", "The 'InventoryTag' tags 'contains', 'quantity', 'find', 'exclude' with raw items are deprecated and replaced by 'contains_item', 'quantity_item', 'find_item', 'exclude_item' that use advanced matcher logic."); - // Added 2021/03/29, made very-slow 2022/12/31, made slow 2024/05/09. - // 2022-year-end commonality: #7 - // 2023-year-end commonality: #31 - public static Warning legacyAttributeProperties = new SlowWarning("legacyAttributeProperties", "The 'attribute' properties are deprecated in favor of the 'attribute_modifiers' properties which more fully implement the attribute system."); + // Added 2021/03/27, made very-slow 2024/01/02, made slow 2025/01/15. + // 2022-year-end commonality: #14 + // 2023-year-end commonality: #10 + // 2024-year-end commonality: #17 + public static Warning takeRawItems = new SlowWarning("takeRawItems", "The 'take' command's ability to remove raw items without any command prefix, and the 'material' and 'scriptname' options are deprecated: use the 'item:' option."); - // Added 2024/05/31 - public static Warning oldNbtProperty = new SlowWarning("oldNbtProperty", "'ItemTag.raw_nbt' is deprecated in favor of 'ItemTag.custom_data', as item NBT was removed by Mojang in favor of item components."); + // Added 2021/08/30, made very-slow 2024/01/02, made slow 2025/01/15. + // 2022-year-end commonality: #26 + // 2023-year-end commonality: #22 + // Safe to remove now. + public static Warning playerResourcePackMech = new SlowWarning("playerResourcePackMech", "The 'resource_pack' mechanism is deprecated in favor of using the 'resourcepack' command."); + + // Added 2022/02/21, made very-slow 2024/01/02, made slow 2025/01/15. + // 2022-year-end commonality: #8 + // 2023-year-end commonality: #17 + // Safe to remove now. + public static Warning oldPotionEffects = new SlowWarning("oldPotionEffects", "The comma-separated-list potion effect tags like 'list_effects' are deprecated in favor of MapTag based tags - 'effects_data'. Refer to meta documentation for details."); + + // Added 2022/05/07, made very-slow 2024/01/02, made slow 2025/01/15. + // 2022-year-end commonality: #37 + // Safe to remove now. + public static Warning armorStandDisabledSlotsOldFormat = new SlowWarning("armorStandDisabledSlotsOldFormat", "The EntityTag.disabled_slots tag and the SLOT/ACTION format in the EntityTag.disabled_slots mechanism are deprecated in favour of the EntityTag.disabled_slots_data tag and the MapTag format."); + + // Added 2021/06/17, made very-slow 2024/01/02. + // 2022-year-end commonality: #18 + // 2023-year-end commonality: #30 + // Safe to remove now. + public static Warning debugBlockAlpha = new SlowWarning("debugBlockAlpha", "The 'alpha' argument for the 'debugblock' command is deprecated: put the alpha in the color input instead."); // ==================== VERY SLOW deprecations ==================== // These are only shown minimally, so server owners are aware of them but not bugged by them. Only servers with active scripters (using 'ex reload') will see them often. - // In multiple places, Added 2021/11/20, made very-slow 2022/12/31. - // 2022-year-end commonality: #15 - // 2023-year-end commonality: #23 - public static Warning pseudoTagBases = new VerySlowWarning("pseudoTagBases", "Pseudo-tags like '', '', '', and '' are deprecated in favor of definitions: just replace with <[text]> or similar."); + // Added 2021/06/15, made very-slow 2024/01/02 + // Bad candidate for functionality removal - tags have been around a long time and some were used often. + // 2024-year-end commonality: #19 + public static Warning locationOldCursorOn = new VerySlowWarning("locationOldCursorOn", "Several of the old 'LocationTag.cursor_on', 'precise_target_position', 'precise_impact_normal' variants are deprecated in favor of the 'ray_trace' tags."); // Added 2020/10/18, made very-slow 2022/12/31. // Bad candidate for functionality removal due to frequency of use and likelihood of pre-existing data in save files. // 2022-year-end commonality: #2 // 2023-year-end commonality: #3 + // 2024-year-end commonality: #7 public static Warning itemDisplayNameMechanism = new VerySlowWarning("itemDisplayNameMechanism", "The item 'display_name' mechanism is now just the 'display' mechanism."); // Added 2020/12/05, made very-slow 2022/12/31. // Bad candidate for functionality removal due to frequency of use and likelihood of pre-existing data remaining in world data. // 2022-year-end commonality: #4 // 2023-year-end commonality: #14 + // 2024-year-end commonality: #9 public static Warning itemNbt = new VerySlowWarning("itemNbt", "The item 'nbt' property is deprecated: use ItemTag flags instead!"); // Added 2021/02/03, made very-slow 2022/12/31. // Bad candidate for functional removal due to the "scriptname" variant being useful for debugging sometimes. // 2022-year-end commonality: #3 // 2023-year-end commonality: #24 + // Safe to remove now. public static Warning hasScriptTags = new VerySlowWarning("hasScriptTags", "The ItemTag.scriptname and EntityTag.scriptname and ItemTag.has_script and NPCTag.has_script tags are deprecated: use '.script.name' or a null check on .script."); - // Added 2021/10/18, made very-slow 2022/12/31. - // 2022-year-end commonality: #10 - public static Warning entityMechanismsFormat = new VerySlowWarning("entityMechanismsFormat", "Entity script containers previously allowed mechanisms in the script's root, however they should now be under a 'mechanisms' key."); - - // Added 2021/08/30, made very-slow 2022/12/31. - // 2022-year-end commonality: #23 - public static Warning takeMoney = new VerySlowWarning("takeMoney", "Using the 'take' command to take money is deprecated in favor of the 'money' command."); - // Added 2023/07/21, bump when 1.17 is gone. public static Warning chunkRefreshSections = new VerySlowWarning("chunkRefreshSections", "ChunkTag.refresh_chunk_sections, as of MC 1.18, is just a replica of ChunkTag.refresh_chunk, and so that mech should be used instead."); - // Added 2021/03/27, made very-slow 2024/01/02. - // 2022-year-end commonality: #6 - // 2023-year-end commonality: #13 - public static Warning locationFindEntities = new VerySlowWarning("locationFindEntities", "The tag 'LocationTag.find.entities.within' and 'blocks' tags are replaced by the 'find_entities' and 'find_blocks' versions. They are mostly compatible, but now have advanced matcher options."); - // 2022-year-end commonality: #16 - // 2023-year-end commonality: #26 - public static Warning inventoryNonMatcherTags = new VerySlowWarning("inventoryNonMatcherTags", "The 'InventoryTag' tags 'contains', 'quantity', 'find', 'exclude' with raw items are deprecated and replaced by 'contains_item', 'quantity_item', 'find_item', 'exclude_item' that use advanced matcher logic."); - // 2022-year-end commonality: #14 - // 2023-year-end commonality: #10 - public static Warning takeRawItems = new VerySlowWarning("takeRawItems", "The 'take' command's ability to remove raw items without any command prefix, and the 'material' and 'scriptname' options are deprecated: use the 'item:' option."); + // Added 2024/07/13 + // 2024-year-end commonality: #22 + public static Warning pre1_21AttributeFormat = new VerySlowWarning("pre1_21AttributeFormat", "Attribute modifiers were changed in 1.21, now using slot groups instead of slots and namespaced keys instead of UUIDS; check relevant meta docs for more information."); - // Added 2021/08/30, made very-slow 2024/01/02. - // 2022-year-end commonality: #26 - // 2023-year-end commonality: #22 - public static Warning playerResourcePackMech = new VerySlowWarning("playerResourcePackMech", "The 'resource_pack' mechanism is deprecated in favor of using the 'resourcepack' command."); + // Added 2023/01/15, made very-slow 2025/01/15. + // Safe to remove now. + public static Warning entityShootsMaterialEvent = new VerySlowWarning("entityShootsMaterialEvent", "The ' shoots ' event is deprecated in favor of ' hits' with the 'block' and 'shooter' switches."); - // Added 2022/02/21, made very-slow 2024/01/02. - // 2022-year-end commonality: #8 - // 2023-year-end commonality: #17 - public static Warning oldPotionEffects = new VerySlowWarning("oldPotionEffects", "The comma-separated-list potion effect tags like 'list_effects' are deprecated in favor of MapTag based tags - 'effects_data'. Refer to meta documentation for details."); + // Added 2023/01/15, made very-slow 2025/01/15. + // 2023-year-end commonality: #28 + // 2024-year-end commonality: #16 + public static Warning projectileHitsBlockLocationContext = new VerySlowWarning("projectileHitsBlockLocationContext", "'context.location' in the ' hits' event is deprecated in favor of 'context.hit_block'."); - // Added 2022/05/07, made very-slow 2024/01/02. - // 2022-year-end commonality: #37 - public static Warning armorStandDisabledSlotsOldFormat = new VerySlowWarning("armorStandDisabledSlotsOldFormat", "The EntityTag.disabled_slots tag and the SLOT/ACTION format in the EntityTag.disabled_slots mechanism are deprecated in favour of the EntityTag.disabled_slots_data tag and the MapTag format."); + // Added 2023/01/15, made very-slow 2025/01/15. + // 2023-year-end commonality: #5 + // 2024-year-end commonality: #8 + public static Warning projectileHitsEventMatchers = new VerySlowWarning("projectileHitsEventMatchers", "The block/entity matchers in ' hits /' are deprecated in favor of the 'block' and 'entity' switches."); - // Added 2021/06/15, made very-slow 2024/01/02. - // Bad candidate for functionality removal - tags have been around a long time and some were used often. - public static Warning locationOldCursorOn = new VerySlowWarning("locationOldCursorOn", "Several of the old 'LocationTag.cursor_on', 'precise_target_position', 'precise_impact_normal' variants are deprecated in favor of the 'ray_trace' tags."); + // Added 2023/03/05, made very-slow 2025/01/15. + // Safe to remove now. + public static Warning serverSystemMechanisms = new VerySlowWarning("serverSystemMechanisms", "Some 'server' mechanisms for core features are deprecated in favor of 'system' equivalents."); - // Added 2021/06/17, made very-slow 2024/01/02. - // 2022-year-end commonality: #18 - // 2023-year-end commonality: #30 - public static Warning debugBlockAlpha = new VerySlowWarning("debugBlockAlpha", "The 'alpha' argument for the 'debugblock' command is deprecated: put the alpha in the color input instead."); + // Added 2023/03/27, made very-slow 2025/01/15. + // Safe to remove now. + public static Warning oldAgeLockedControls = new VerySlowWarning("oldAgeLockedControls", "Several old ways of controlling whether an entity's age is locked are deprecated in favor of the 'EntityTag.age_locked' tag/mech pair."); - // Added 2024/07/13 - public static Warning pre1_21AttributeFormat = new VerySlowWarning("pre1_21AttributeFormat", "Attribute modifiers were changed in 1.21, now using slot groups instead of slots and namespaced keys instead of UUIDS; check relevant meta docs for more information."); + // Added 2023/10/04, made very-slow 2025/01/15. + // 2023-year-end commonality: #4 + // 2024-year-end commonality: #5 + public static Warning translateLegacySyntax = new VerySlowWarning("translateLegacySyntax", "<&translate[...].with[...]> is deprecated in favor of the modern <&translate[key=...;with=...]> syntax."); + + // Added 2024/02/19, made very-slow 2025/01/15. + // Safe to remove now. + public static Warning lecternPage = new VerySlowWarning("lecternPage", "'LocationTag.lectern_page' is deprecated in favor of 'LocationTag.page'."); // ==================== FUTURE deprecations ==================== - // Added 2023/01/15, deprecate officially by 2026 - public static Warning entityShootsMaterialEvent = new FutureWarning("entityShootsMaterialEvent", "The ' shoots ' event is deprecated in favor of ' hits' with the 'block' and 'shooter' switches."); - // 2023-year-end commonality: #28 - public static Warning projectileHitsBlockLocationContext = new FutureWarning("projectileHitsBlockLocationContext", "'context.location' in the ' hits' event is deprecated in favor of 'context.hit_block'."); - // 2023-year-end commonality: #5 - public static Warning projectileHitsEventMatchers = new FutureWarning("projectileHitsEventMatchers", "The block/entity matchers in ' hits /' are deprecated in favor of the 'block' and 'entity' switches."); + // Added 2023/01/15 // Bump once 1.19 is the minimum supported version, as the change happened on that version. public static Warning projectileCollideEvent = new FutureWarning("projectileCollideEvent", "The ' collides with ' event is deprecated in favor of ' hits' with the 'entity' switch."); - // Added 2023/03/05, deprecate officially by 2026 - public static Warning serverSystemMechanisms = new FutureWarning("serverSystemMechanisms", "Some 'server' mechanisms for core features are deprecated in favor of 'system' equivalents."); - - // Added 2023/03/27, deprecate officially by 2026 - public static Warning oldAgeLockedControls = new FutureWarning("oldAgeLockedControls", "Several old ways of controlling whether an entity's age is locked are deprecated in favor of the 'EntityTag.age_locked' tag/mech pair."); - - // Added 2023/10/04, deprecate officially by 2027 - // 2023-year-end commonality: #4 - public static Warning translateLegacySyntax = new FutureWarning("translateLegacySyntax", "<&translate[...].with[...]> is deprecated in favor of the modern <&translate[key=...;with=...]> syntax."); - - // Added 2023/11/16, deprecate officially by 2027 + // Added 2023/11/16 + // Safe to remove now. public static Warning takeExperience = new FutureWarning("takeExperience", "Using the 'take' command to take experience is deprecated in favor of the 'experience' command."); - // Added 2024/02/19, deprecate officially by 2027. - public static Warning lecternPage = new FutureWarning("lecternPage", "'LocationTag.lectern_page' is deprecated in favor of 'LocationTag.page'."); - // Added 2024/10/12 // Good candidate for bumping, as this is a niche feature only on 1.19+ that already had some issues public static Warning entityStepHeight = new FutureWarning("entityStepHeight", "'EntityTag.step_height' is deprecated in favor of the step height attribute."); // Added 2024/06/17, do not deprecate officially before end-of-year 2025 hitrate commonality review. // Bad candidate for bumping, targets extremely commonly used naming, some of which may be hard to remove (eg stored in flag data). + // 2024-year-end commonality: #3 public static Warning oldSpigotNames = new FutureWarning("oldSpigotNames", "Several features (particles, entities, etc.) had alternative naming added by Spigot, which are now deprecated in favor of the official Minecraft naming; see relevant feature's meta docs for more information."); // Added 2024/11/19 @@ -350,10 +440,10 @@ public class BukkitImplDeprecations { // Added 2024/12/27 public static Warning entityIsSheared = new FutureWarning("entityIsSheared", "'EntityTag.is_sheared' and 'EntityTag.has_pumpkin_head' properties are deprecated in favor of 'EntityTag.sheared'."); - // Added 2025/1/12 + // Added 2025/01/12 public static Warning splashPotionItem = new FutureWarning("splashPotionItem", "Using 'EntityTag.potion' to get a splash potion's item is deprecated in favor of 'EntityTag.item'."); - // Added 2025/1/12 + // Added 2025/01/12 public static Warning arrowBasePotionType = new FutureWarning("arrowBasePotionType", "Using 'EntityTag.potion' to get an arrow's base potion type is deprecated in favor of 'EntityTag.potion_type'."); // ==================== PAST deprecations of things that are already gone but still have a warning left behind ==================== From b251f00b4ebcd7d1e20d5226b329f17e6170cef6 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Thu, 16 Jan 2025 22:09:27 +0000 Subject: [PATCH 126/280] Fix item hovers on 1.20+ (#2695) * Fix item hovers on 1.20+ * Spacing fix * Don't override `getTag` --- .../com/denizenscript/denizen/Denizen.java | 1 + .../denizenscript/denizen/nms/NMSHandler.java | 3 - .../denizen/nms/interfaces/ItemHelper.java | 13 +- .../utilities/FormattedTextHelper.java | 2 +- .../denizen/utilities/HoverFormatHelper.java | 119 ++++++++++++++++-- .../denizen/nms/v1_17/Handler.java | 51 -------- .../nms/v1_17/helpers/ItemHelperImpl.java | 4 +- .../denizen/nms/v1_18/Handler.java | 50 -------- .../nms/v1_18/helpers/ItemHelperImpl.java | 9 -- .../denizen/nms/v1_19/Handler.java | 50 -------- .../nms/v1_19/helpers/ItemHelperImpl.java | 9 -- .../denizen/nms/v1_20/Handler.java | 48 ------- .../nms/v1_20/helpers/ItemHelperImpl.java | 25 +++- .../denizen/nms/v1_21/Handler.java | 53 +------- .../nms/v1_21/helpers/ItemHelperImpl.java | 29 +++-- 15 files changed, 174 insertions(+), 292 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/Denizen.java b/plugin/src/main/java/com/denizenscript/denizen/Denizen.java index 9191902ac9..2818fae6fb 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/Denizen.java +++ b/plugin/src/main/java/com/denizenscript/denizen/Denizen.java @@ -371,6 +371,7 @@ else if (javaVersion.startsWith("21")) { ExSustainedCommandHandler exsCommand = new ExSustainedCommandHandler(); exsCommand.enableFor(getCommand("exs")); FullBlockData.init(); + HoverFormatHelper.tryInitializeItemHoverFix(); // Load script files without processing. DenizenCore.preloadScripts(false, null); // Load the saves.yml into memory diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java b/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java index a7e1becf71..d63dd2a5e8 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java @@ -5,7 +5,6 @@ import com.denizenscript.denizen.nms.util.PlayerProfile; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; import com.denizenscript.denizen.nms.util.jnbt.Tag; -import net.md_5.bungee.api.chat.HoverEvent; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.NamespacedKey; @@ -131,8 +130,6 @@ public void setInventoryTitle(InventoryView view, String title) { throw new UnsupportedOperationException(); } - public abstract String stringForHover(HoverEvent hover); - public abstract ArrayList containerListFlags(PersistentDataContainer container, String prefix); public abstract boolean containerHas(PersistentDataContainer container, String key); diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java index 91dad0210e..53ab054c1c 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java @@ -7,6 +7,7 @@ import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.utilities.nbt.CustomNBT; import com.denizenscript.denizencore.objects.core.MapTag; +import com.google.gson.JsonObject; import org.bukkit.DyeColor; import org.bukkit.Material; import org.bukkit.NamespacedKey; @@ -42,7 +43,17 @@ public abstract class ItemHelper { public abstract String getJsonString(ItemStack itemStack); - public abstract String getRawHoverText(ItemStack itemStack); + public String getLegacyHoverNbt(ItemTag item) { // TODO: once 1.20 is the minimum supported version, remove this + return item.getItemMeta().getAsString(); + } + + public JsonObject getRawHoverComponentsJson(ItemStack item) { + throw new UnsupportedOperationException(); + } + + public ItemStack applyRawHoverComponentsJson(ItemStack item, JsonObject components) { + throw new UnsupportedOperationException(); + } public abstract PlayerProfile getSkullSkin(ItemStack itemStack); diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/FormattedTextHelper.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/FormattedTextHelper.java index 7b0f7482c6..ea5f23417f 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/FormattedTextHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/FormattedTextHelper.java @@ -164,7 +164,7 @@ public static String stringifySub(BaseComponent component, ChatColor parentColor boolean hasHover = component.getHoverEvent() != null; if (hasHover) { HoverEvent hover = component.getHoverEvent(); - builder.append(ChatColor.COLOR_CHAR).append("[hover=").append(hover.getAction().name()).append(";").append(escape(NMSHandler.instance.stringForHover(hover))).append("]"); + builder.append(ChatColor.COLOR_CHAR).append("[hover=").append(hover.getAction().name()).append(";").append(escape(HoverFormatHelper.stringForHover(hover))).append("]"); } boolean hasClick = component.getClickEvent() != null; if (hasClick) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/HoverFormatHelper.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/HoverFormatHelper.java index b6a732e909..21b75f37b0 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/HoverFormatHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/HoverFormatHelper.java @@ -1,17 +1,24 @@ package com.denizenscript.denizen.utilities; import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizencore.utilities.CoreUtilities; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import com.google.gson.*; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.HoverEvent; import net.md_5.bungee.api.chat.TextComponent; -import net.md_5.bungee.api.chat.hover.content.Content; -import net.md_5.bungee.api.chat.hover.content.Entity; -import net.md_5.bungee.api.chat.hover.content.Item; -import net.md_5.bungee.api.chat.hover.content.Text; +import net.md_5.bungee.api.chat.hover.content.*; +import net.md_5.bungee.chat.ComponentSerializer; +import org.bukkit.Bukkit; +import org.bukkit.Registry; +import org.bukkit.inventory.ItemStack; + +import java.lang.reflect.Type; public class HoverFormatHelper { @@ -22,9 +29,12 @@ public static boolean processHoverInput(HoverEvent.Action action, TextComponent if (item == null) { return true; } - // TODO: Why is there not a direct conversion method for Spigot ItemStack -> BungeeChat Item? - String itemNbt = NMSHandler.itemHelper.getRawHoverText(item.getItemStack()); - content = new Item(item.getBukkitMaterial().getKey().toString(), item.getAmount(), net.md_5.bungee.api.chat.ItemTag.ofNbt(itemNbt)); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + content = new FixedItemHover(item.getBukkitMaterial().getKey().toString(), item.getAmount(), NMSHandler.itemHelper.getRawHoverComponentsJson(item.getItemStack())); + } + else { + content = new Item(item.getBukkitMaterial().getKey().toString(), item.getAmount(), net.md_5.bungee.api.chat.ItemTag.ofNbt(NMSHandler.itemHelper.getLegacyHoverNbt(item))); + } } else if (action == HoverEvent.Action.SHOW_ENTITY) { EntityTag entity = EntityTag.valueOf(FormattedTextHelper.unescape(input), CoreUtilities.basicContext); @@ -46,4 +56,99 @@ else if (action == HoverEvent.Action.SHOW_ENTITY) { hoverableText.setHoverEvent(new HoverEvent(action, content)); return false; } + + public static String stringForHover(HoverEvent hover) { + if (hover.getContents().isEmpty()) { + return ""; + } + Content contentObject = hover.getContents().get(0); + if (contentObject instanceof Text textHover) { + Object value = textHover.getValue(); + if (value instanceof BaseComponent[] componentsValue) { + return FormattedTextHelper.stringify(componentsValue); + } + else { + return value.toString(); + } + } + else if (contentObject instanceof Item itemHover) { + ItemStack item = new ItemStack(Registry.MATERIAL.get(Utilities.parseNamespacedKey(itemHover.getId())), itemHover.getCount() == -1 ? 1 : itemHover.getCount()); + if (itemHover instanceof FixedItemHover fixedItemHover && fixedItemHover.getComponents() != null) { + item = NMSHandler.itemHelper.applyRawHoverComponentsJson(item, fixedItemHover.getComponents()); + } + else if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_19) && itemHover.getTag() != null && itemHover.getTag().getNbt() != null) { + item = Bukkit.getUnsafe().modifyItemStack(item, itemHover.getTag().getNbt()); + } + return new ItemTag(item).identify(); + } + else if (contentObject instanceof net.md_5.bungee.api.chat.hover.content.Entity entityHover) { + // TODO: Maybe a stabler way of doing this? + return "e@" + entityHover.getId(); + } + else { + throw new UnsupportedOperationException(); + } + } + + public static void tryInitializeItemHoverFix() { + if (!NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + return; + } + Gson bungeeGson = ReflectionHelper.getFieldValue(ComponentSerializer.class, "gson", null); + if (bungeeGson == null) { + return; + } + Gson fixedGson = bungeeGson.newBuilder() + .registerTypeAdapter(FixedItemHover.class, new FixedItemHoverSerializer()) + .registerTypeAdapter(Item.class, new FixedItemHoverSerializer()) + .create(); + try { + ReflectionHelper.getFinalSetter(ComponentSerializer.class, "gson").invoke(fixedGson); + } + catch (Throwable e) { + Debug.echoError(e); + } + } + + public static class FixedItemHover extends Item { + + private final JsonObject components; + + public FixedItemHover(String id, int count, JsonObject components) { + super(id, count, null); + this.components = components; + } + + public JsonObject getComponents() { + return components; + } + } + + public static class FixedItemHoverSerializer extends ItemSerializer { + + @Override + public Item deserialize(JsonElement element, Type type, JsonDeserializationContext context) throws JsonParseException { + Item deserialized = super.deserialize(element, type, context); + if (deserialized.getTag() != null) { + return deserialized; + } + JsonObject componentsObject = element.getAsJsonObject().getAsJsonObject("components"); + if (componentsObject == null) { + return deserialized; + } + return new FixedItemHover(deserialized.getId(), deserialized.getCount(), componentsObject); + } + + @Override + public JsonElement serialize(Item content, Type type, JsonSerializationContext context) { + JsonElement serialized = super.serialize(content, type, context); + if (!(content instanceof FixedItemHover fixedItemHover) || fixedItemHover.getComponents() == null) { + return serialized; + } + JsonObject serializedObject = serialized.getAsJsonObject(); + serializedObject.remove("tag"); + serializedObject.add("components", fixedItemHover.getComponents()); + return serializedObject; + } + } } diff --git a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/Handler.java b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/Handler.java index c0667ae3e7..494a7005ad 100644 --- a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/Handler.java +++ b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/Handler.java @@ -14,8 +14,6 @@ import com.denizenscript.denizen.nms.v1_17.impl.SidebarImpl; import com.denizenscript.denizen.nms.v1_17.impl.blocks.BlockLightImpl; import com.denizenscript.denizen.nms.v1_17.impl.jnbt.CompoundTagImpl; -import com.denizenscript.denizen.objects.ItemTag; -import com.denizenscript.denizen.utilities.FormattedTextHelper; import com.denizenscript.denizencore.utilities.CoreConfiguration; import com.denizenscript.denizencore.utilities.CoreUtilities; import com.denizenscript.denizencore.utilities.ReflectionHelper; @@ -24,15 +22,10 @@ import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.HoverEvent; -import net.md_5.bungee.api.chat.hover.content.Content; -import net.md_5.bungee.api.chat.hover.content.Item; -import net.md_5.bungee.api.chat.hover.content.Text; import net.md_5.bungee.chat.ComponentSerializer; import net.minecraft.core.Registry; import net.minecraft.nbt.ByteArrayTag; import net.minecraft.nbt.StringTag; -import net.minecraft.nbt.TagParser; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceKey; @@ -42,7 +35,6 @@ import net.minecraft.world.Container; import net.minecraft.world.Nameable; import net.minecraft.world.entity.Entity; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.biome.Biome; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -54,7 +46,6 @@ import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventoryCustom; -import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_17_R1.persistence.CraftPersistentDataContainer; import org.bukkit.craftbukkit.v1_17_R1.util.CraftChatMessage; import org.bukkit.craftbukkit.v1_17_R1.util.CraftMagicNumbers; @@ -259,48 +250,6 @@ public BiomeNMS getBiomeAt(Block block) { return new BiomeNMSImpl(level, CraftNamespacedKey.fromMinecraft(key)); } - @Override - public String stringForHover(HoverEvent hover) { - if (hover.getContents().isEmpty()) { - return ""; - } - Content contentObject = hover.getContents().get(0); - if (contentObject instanceof Text) { - Object value = ((Text) contentObject).getValue(); - if (value instanceof BaseComponent[]) { - return FormattedTextHelper.stringify((BaseComponent[]) value); - } - else { - return value.toString(); - } - } - else if (contentObject instanceof Item) { - Item item = (Item) contentObject; - try { - net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag(); - tag.putString("id", item.getId()); - tag.putByte("Count", (byte) item.getCount()); - if (item.getTag() != null && item.getTag().getNbt() != null) { - tag.put("tag", TagParser.parseTag(item.getTag().getNbt())); - } - ItemStack itemStack = ItemStack.of(tag); - return new ItemTag(CraftItemStack.asBukkitCopy(itemStack)).identify(); - } - catch (Throwable ex) { - Debug.echoError(ex); - return null; - } - } - else if (contentObject instanceof net.md_5.bungee.api.chat.hover.content.Entity) { - net.md_5.bungee.api.chat.hover.content.Entity entity = (net.md_5.bungee.api.chat.hover.content.Entity) contentObject; - // TODO: Maybe a stabler way of doing this? - return "e@" + entity.getId(); - } - else { - throw new UnsupportedOperationException(); - } - } - @Override public ArrayList containerListFlags(PersistentDataContainer container, String prefix) { prefix = "denizen:" + prefix; diff --git a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/ItemHelperImpl.java b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/ItemHelperImpl.java index dafb21d7d2..9554fd02f7 100644 --- a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/ItemHelperImpl.java +++ b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/ItemHelperImpl.java @@ -165,8 +165,8 @@ public String getJsonString(ItemStack itemStack) { } @Override - public String getRawHoverText(ItemStack itemStack) { - net.minecraft.nbt.CompoundTag tag = CraftItemStack.asNMSCopy(itemStack).getTag(); + public String getLegacyHoverNbt(ItemTag item) { + net.minecraft.nbt.CompoundTag tag = CraftItemStack.asNMSCopy(item.getItemStack()).getTag(); if (tag == null) { return null; } diff --git a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/Handler.java b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/Handler.java index 32350a5242..b630e954e3 100644 --- a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/Handler.java +++ b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/Handler.java @@ -15,7 +15,6 @@ import com.denizenscript.denizen.nms.v1_18.impl.SidebarImpl; import com.denizenscript.denizen.nms.v1_18.impl.blocks.BlockLightImpl; import com.denizenscript.denizen.nms.v1_18.impl.jnbt.CompoundTagImpl; -import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.utilities.FormattedTextHelper; import com.denizenscript.denizen.utilities.PaperAPITools; import com.denizenscript.denizencore.utilities.CoreConfiguration; @@ -27,16 +26,11 @@ import com.mojang.authlib.properties.Property; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.HoverEvent; -import net.md_5.bungee.api.chat.hover.content.Content; -import net.md_5.bungee.api.chat.hover.content.Item; -import net.md_5.bungee.api.chat.hover.content.Text; import net.md_5.bungee.chat.ComponentSerializer; import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.minecraft.nbt.ByteArrayTag; import net.minecraft.nbt.StringTag; -import net.minecraft.nbt.TagParser; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceKey; @@ -47,7 +41,6 @@ import net.minecraft.world.Nameable; import net.minecraft.world.entity.Entity; import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.biome.Biome; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -60,7 +53,6 @@ import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftInventoryCustom; import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftInventoryView; -import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_18_R2.persistence.CraftPersistentDataContainer; import org.bukkit.craftbukkit.v1_18_R2.util.CraftChatMessage; import org.bukkit.craftbukkit.v1_18_R2.util.CraftMagicNumbers; @@ -282,48 +274,6 @@ public BiomeNMS getBiomeAt(Block block) { return new BiomeNMSImpl(level, CraftNamespacedKey.fromMinecraft(key)); } - @Override - public String stringForHover(HoverEvent hover) { - if (hover.getContents().isEmpty()) { - return ""; - } - Content contentObject = hover.getContents().get(0); - if (contentObject instanceof Text) { - Object value = ((Text) contentObject).getValue(); - if (value instanceof BaseComponent[]) { - return FormattedTextHelper.stringify((BaseComponent[]) value); - } - else { - return value.toString(); - } - } - else if (contentObject instanceof Item) { - Item item = (Item) contentObject; - try { - net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag(); - tag.putString("id", item.getId()); - tag.putByte("Count", item.getCount() == -1 ? 1 : (byte) item.getCount()); - if (item.getTag() != null && item.getTag().getNbt() != null) { - tag.put("tag", TagParser.parseTag(item.getTag().getNbt())); - } - ItemStack itemStack = ItemStack.of(tag); - return new ItemTag(CraftItemStack.asBukkitCopy(itemStack)).identify(); - } - catch (Throwable ex) { - Debug.echoError(ex); - return null; - } - } - else if (contentObject instanceof net.md_5.bungee.api.chat.hover.content.Entity) { - net.md_5.bungee.api.chat.hover.content.Entity entity = (net.md_5.bungee.api.chat.hover.content.Entity) contentObject; - // TODO: Maybe a stabler way of doing this? - return "e@" + entity.getId(); - } - else { - throw new UnsupportedOperationException(); - } - } - @Override public ArrayList containerListFlags(PersistentDataContainer container, String prefix) { prefix = "denizen:" + prefix; diff --git a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/ItemHelperImpl.java b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/ItemHelperImpl.java index 0e6075d5d1..c3bbaf5deb 100644 --- a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/ItemHelperImpl.java +++ b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/ItemHelperImpl.java @@ -170,15 +170,6 @@ public String getJsonString(ItemStack itemStack) { return json.substring(176, json.length() - 185); } - @Override - public String getRawHoverText(ItemStack itemStack) { - net.minecraft.nbt.CompoundTag tag = CraftItemStack.asNMSCopy(itemStack).getTag(); - if (tag == null) { - return null; - } - return tag.toString(); - } - @Override public PlayerProfile getSkullSkin(ItemStack is) { net.minecraft.world.item.ItemStack itemStack = CraftItemStack.asNMSCopy(is); diff --git a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/Handler.java b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/Handler.java index bf3f92977d..092966dfe9 100644 --- a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/Handler.java +++ b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/Handler.java @@ -15,7 +15,6 @@ import com.denizenscript.denizen.nms.v1_19.impl.SidebarImpl; import com.denizenscript.denizen.nms.v1_19.impl.blocks.BlockLightImpl; import com.denizenscript.denizen.nms.v1_19.impl.jnbt.CompoundTagImpl; -import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.utilities.FormattedTextHelper; import com.denizenscript.denizen.utilities.PaperAPITools; import com.denizenscript.denizencore.utilities.CoreConfiguration; @@ -27,16 +26,11 @@ import com.mojang.authlib.properties.Property; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.HoverEvent; -import net.md_5.bungee.api.chat.hover.content.Content; -import net.md_5.bungee.api.chat.hover.content.Item; -import net.md_5.bungee.api.chat.hover.content.Text; import net.md_5.bungee.chat.ComponentSerializer; import net.minecraft.core.Holder; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.ByteArrayTag; import net.minecraft.nbt.StringTag; -import net.minecraft.nbt.TagParser; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceKey; @@ -48,7 +42,6 @@ import net.minecraft.world.Nameable; import net.minecraft.world.entity.Entity; import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.biome.Biome; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -63,7 +56,6 @@ import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftInventoryCustom; import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftInventoryView; -import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_19_R3.persistence.CraftPersistentDataContainer; import org.bukkit.craftbukkit.v1_19_R3.util.CraftChatMessage; import org.bukkit.craftbukkit.v1_19_R3.util.CraftMagicNumbers; @@ -286,48 +278,6 @@ public BiomeNMS getBiomeAt(Block block) { return new BiomeNMSImpl(level, CraftNamespacedKey.fromMinecraft(key)); } - @Override - public String stringForHover(HoverEvent hover) { - if (hover.getContents().isEmpty()) { - return ""; - } - Content contentObject = hover.getContents().get(0); - if (contentObject instanceof Text) { - Object value = ((Text) contentObject).getValue(); - if (value instanceof BaseComponent[]) { - return FormattedTextHelper.stringify((BaseComponent[]) value); - } - else { - return value.toString(); - } - } - else if (contentObject instanceof Item) { - Item item = (Item) contentObject; - try { - net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag(); - tag.putString("id", item.getId()); - tag.putByte("Count", item.getCount() == -1 ? 1 : (byte) item.getCount()); - if (item.getTag() != null && item.getTag().getNbt() != null) { - tag.put("tag", TagParser.parseTag(item.getTag().getNbt())); - } - ItemStack itemStack = ItemStack.of(tag); - return new ItemTag(CraftItemStack.asBukkitCopy(itemStack)).identify(); - } - catch (Throwable ex) { - Debug.echoError(ex); - return null; - } - } - else if (contentObject instanceof net.md_5.bungee.api.chat.hover.content.Entity) { - net.md_5.bungee.api.chat.hover.content.Entity entity = (net.md_5.bungee.api.chat.hover.content.Entity) contentObject; - // TODO: Maybe a stabler way of doing this? - return "e@" + entity.getId(); - } - else { - throw new UnsupportedOperationException(); - } - } - @Override public ArrayList containerListFlags(PersistentDataContainer container, String prefix) { prefix = "denizen:" + prefix; diff --git a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/ItemHelperImpl.java b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/ItemHelperImpl.java index 9d10fe9153..5987dc44ab 100644 --- a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/ItemHelperImpl.java +++ b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/ItemHelperImpl.java @@ -174,15 +174,6 @@ public String getJsonString(ItemStack itemStack) { return json.substring(176, json.length() - 185); } - @Override - public String getRawHoverText(ItemStack itemStack) { - net.minecraft.nbt.CompoundTag tag = CraftItemStack.asNMSCopy(itemStack).getTag(); - if (tag == null) { - return null; - } - return tag.toString(); - } - @Override public PlayerProfile getSkullSkin(ItemStack is) { net.minecraft.world.item.ItemStack itemStack = CraftItemStack.asNMSCopy(is); diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java index a9c75aae33..4e3fe1d156 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java @@ -37,10 +37,6 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.HoverEvent; -import net.md_5.bungee.api.chat.hover.content.Content; -import net.md_5.bungee.api.chat.hover.content.Item; -import net.md_5.bungee.api.chat.hover.content.Text; import net.md_5.bungee.chat.ComponentSerializer; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; @@ -68,7 +64,6 @@ import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.boss.BossBar; -import org.bukkit.craftbukkit.v1_20_R4.CraftRegistry; import org.bukkit.craftbukkit.v1_20_R4.CraftServer; import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; import org.bukkit.craftbukkit.v1_20_R4.block.data.CraftBlockData; @@ -335,49 +330,6 @@ public BiomeNMS getBiomeAt(Block block) { return new BiomeNMSImpl(level, CraftNamespacedKey.fromMinecraft(key)); } - @Override - public String stringForHover(HoverEvent hover) { - if (hover.getContents().isEmpty()) { - return ""; - } - Content contentObject = hover.getContents().get(0); - if (contentObject instanceof Text) { - Object value = ((Text) contentObject).getValue(); - if (value instanceof BaseComponent[]) { - return FormattedTextHelper.stringify((BaseComponent[]) value); - } - else { - return value.toString(); - } - } - else if (contentObject instanceof Item) { - Item item = (Item) contentObject; - try { - net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag(); - tag.putString("id", item.getId()); - tag.putByte("Count", item.getCount() == -1 ? 1 : (byte) item.getCount()); - if (item.getTag() != null && item.getTag().getNbt() != null) { - tag.put("tag", TagParser.parseTag(item.getTag().getNbt())); - } - // TODO: 1.20.6: use components and fallback to creating item from tag when custom NBT is specified - ItemStack nmsStack = ItemStack.parseOptional(CraftRegistry.getMinecraftRegistry(), tag); - return new ItemTag(CraftItemStack.asBukkitCopy(nmsStack)).identify(); - } - catch (Throwable ex) { - Debug.echoError(ex); - return null; - } - } - else if (contentObject instanceof net.md_5.bungee.api.chat.hover.content.Entity) { - net.md_5.bungee.api.chat.hover.content.Entity entity = (net.md_5.bungee.api.chat.hover.content.Entity) contentObject; - // TODO: Maybe a stabler way of doing this? - return "e@" + entity.getId(); - } - else { - throw new UnsupportedOperationException(); - } - } - @Override public ArrayList containerListFlags(PersistentDataContainer container, String prefix) { prefix = "denizen:" + prefix; diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java index 244e85560b..2e626cd517 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java @@ -20,9 +20,11 @@ import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.google.common.collect.*; +import com.google.gson.JsonObject; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; import com.mojang.serialization.Dynamic; +import com.mojang.serialization.JsonOps; import net.md_5.bungee.api.ChatColor; import net.minecraft.advancements.critereon.BlockPredicate; import net.minecraft.core.*; @@ -203,13 +205,26 @@ public String getJsonString(ItemStack itemStack) { } @Override - public String getRawHoverText(ItemStack itemStack) { - // TODO: 1.20.6: this is relatively hot code, ideally should have some early returns before serializing the item - net.minecraft.nbt.Tag tag = CraftItemStack.asNMSCopy(itemStack).saveOptional(CraftRegistry.getMinecraftRegistry()); - if (tag == null) { + public JsonObject getRawHoverComponentsJson(ItemStack item) { + DataComponentPatch nmsComponents = CraftItemStack.asNMSCopy(item).getComponentsPatch(); + if (nmsComponents.isEmpty()) { return null; } - return tag.toString(); + return DataComponentPatch.CODEC.encodeStart(CraftRegistry.getMinecraftRegistry().createSerializationContext(JsonOps.INSTANCE), nmsComponents).getOrThrow().getAsJsonObject(); + } + + @Override + public ItemStack applyRawHoverComponentsJson(ItemStack item, JsonObject components) { + return DataComponentPatch.CODEC.parse(CraftRegistry.getMinecraftRegistry().createSerializationContext(JsonOps.INSTANCE), components).mapOrElse( + nmsComponents -> { + net.minecraft.world.item.ItemStack nmsItem = CraftItemStack.asNMSCopy(item); + nmsItem.applyComponents(nmsComponents); + return CraftItemStack.asCraftMirror(nmsItem); + }, + error -> { + Debug.echoError("Invalid hover item data '" + components + "': " + error.message()); + return item; + }); } @Override diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java index c7313e842a..4130a8a13a 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java @@ -38,10 +38,6 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.HoverEvent; -import net.md_5.bungee.api.chat.hover.content.Content; -import net.md_5.bungee.api.chat.hover.content.Item; -import net.md_5.bungee.api.chat.hover.content.Text; import net.md_5.bungee.chat.ComponentSerializer; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; @@ -62,10 +58,12 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.state.BlockState; -import org.bukkit.*; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.NamespacedKey; +import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.boss.BossBar; -import org.bukkit.craftbukkit.v1_21_R3.CraftRegistry; import org.bukkit.craftbukkit.v1_21_R3.CraftServer; import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; import org.bukkit.craftbukkit.v1_21_R3.block.data.CraftBlockData; @@ -330,49 +328,6 @@ public BiomeNMS getBiomeAt(Block block) { return new BiomeNMSImpl(level, CraftNamespacedKey.fromMinecraft(key)); } - @Override - public String stringForHover(HoverEvent hover) { - if (hover.getContents().isEmpty()) { - return ""; - } - Content contentObject = hover.getContents().get(0); - if (contentObject instanceof Text) { - Object value = ((Text) contentObject).getValue(); - if (value instanceof BaseComponent[]) { - return FormattedTextHelper.stringify((BaseComponent[]) value); - } - else { - return value.toString(); - } - } - else if (contentObject instanceof Item) { - Item item = (Item) contentObject; - try { - net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag(); - tag.putString("id", item.getId()); - tag.putByte("Count", item.getCount() == -1 ? 1 : (byte) item.getCount()); - if (item.getTag() != null && item.getTag().getNbt() != null) { - tag.put("tag", TagParser.parseTag(item.getTag().getNbt())); - } - // TODO: 1.20.6: use components and fallback to creating item from tag when custom NBT is specified - ItemStack nmsStack = ItemStack.parseOptional(CraftRegistry.getMinecraftRegistry(), tag); - return new ItemTag(CraftItemStack.asBukkitCopy(nmsStack)).identify(); - } - catch (Throwable ex) { - Debug.echoError(ex); - return null; - } - } - else if (contentObject instanceof net.md_5.bungee.api.chat.hover.content.Entity) { - net.md_5.bungee.api.chat.hover.content.Entity entity = (net.md_5.bungee.api.chat.hover.content.Entity) contentObject; - // TODO: Maybe a stabler way of doing this? - return "e@" + entity.getId(); - } - else { - throw new UnsupportedOperationException(); - } - } - @Override public ArrayList containerListFlags(PersistentDataContainer container, String prefix) { prefix = "denizen:" + prefix; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java index 991f94cb58..605481b7fd 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java @@ -20,9 +20,11 @@ import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.google.common.collect.*; +import com.google.gson.JsonObject; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; import com.mojang.serialization.Dynamic; +import com.mojang.serialization.JsonOps; import net.md_5.bungee.api.ChatColor; import net.minecraft.advancements.critereon.BlockPredicate; import net.minecraft.core.*; @@ -48,12 +50,12 @@ import net.minecraft.world.item.component.CustomData; import net.minecraft.world.item.component.ItemLore; import net.minecraft.world.item.component.ResolvableProfile; -import net.minecraft.world.item.crafting.*; import net.minecraft.world.item.crafting.BlastingRecipe; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.ShapelessRecipe; import net.minecraft.world.item.crafting.SmithingTransformRecipe; import net.minecraft.world.item.crafting.SmokingRecipe; +import net.minecraft.world.item.crafting.*; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -81,10 +83,10 @@ import org.bukkit.craftbukkit.v1_21_R3.util.CraftNamespacedKey; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; -import org.bukkit.inventory.*; import org.bukkit.inventory.ShapedRecipe; import org.bukkit.inventory.SmithingTrimRecipe; import org.bukkit.inventory.TransmuteRecipe; +import org.bukkit.inventory.*; import org.bukkit.map.MapView; import java.lang.reflect.Field; @@ -305,13 +307,26 @@ public String getJsonString(ItemStack itemStack) { } @Override - public String getRawHoverText(ItemStack itemStack) { - // TODO: 1.20.6: this is relatively hot code, ideally should have some early returns before serializing the item - net.minecraft.nbt.Tag tag = CraftItemStack.asNMSCopy(itemStack).saveOptional(CraftRegistry.getMinecraftRegistry()); - if (tag == null) { + public JsonObject getRawHoverComponentsJson(ItemStack item) { + DataComponentPatch nmsComponents = CraftItemStack.asNMSCopy(item).getComponentsPatch(); + if (nmsComponents.isEmpty()) { return null; } - return tag.toString(); + return DataComponentPatch.CODEC.encodeStart(CraftRegistry.getMinecraftRegistry().createSerializationContext(JsonOps.INSTANCE), nmsComponents).getOrThrow().getAsJsonObject(); + } + + @Override + public ItemStack applyRawHoverComponentsJson(ItemStack item, JsonObject components) { + return DataComponentPatch.CODEC.parse(CraftRegistry.getMinecraftRegistry().createSerializationContext(JsonOps.INSTANCE), components).mapOrElse( + nmsComponents -> { + net.minecraft.world.item.ItemStack nmsItem = CraftItemStack.asNMSCopy(item); + nmsItem.applyComponents(nmsComponents); + return CraftItemStack.asCraftMirror(nmsItem); + }, + error -> { + Debug.echoError("Invalid hover item data '" + components + "': " + error.message()); + return item; + }); } @Override From e2c66e87c6ccb30d5013df5a7494e4b810834ff5 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Mon, 20 Jan 2025 02:56:06 -0800 Subject: [PATCH 127/280] gitignore dumb mac files --- .gitignore | 1 + .../denizen/utilities/command/ExCommandHandler.java | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 37ce5881cc..4a4c09c7a5 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ dependency-reduced-pom.xml # Temporary/etc. *.bak *.exe +.DS_Store diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/command/ExCommandHandler.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/command/ExCommandHandler.java index 4481773a3f..2714009df1 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/command/ExCommandHandler.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/command/ExCommandHandler.java @@ -91,8 +91,7 @@ public boolean onCommand(CommandSender sender, Command cmd, String alias, String if (Depends.citizens != null && Depends.citizens.getNPCSelector().getSelected(sender) != null) { npc = new NPCTag(Depends.citizens.getNPCSelector().getSelected(sender)); } - List scriptEntries = ScriptBuilder.buildScriptEntries(entries, null, - new BukkitScriptEntryData(sender instanceof Player player ? new PlayerTag(player) : null, npc)); + List scriptEntries = ScriptBuilder.buildScriptEntries(entries, null, new BukkitScriptEntryData(sender instanceof Player player ? new PlayerTag(player) : null, npc)); queue.addEntries(scriptEntries); if (!quiet && sender instanceof Player) { queue.debugOutput = s -> sender.spigot().sendMessage(FormattedTextHelper.parse(s.replace("", ""), net.md_5.bungee.api.ChatColor.WHITE)); From b956d49adca8c24cb1f1dbc47faa8080905a252c Mon Sep 17 00:00:00 2001 From: Hydroxycobalamin <54799651+Hydroxycobalamin@users.noreply.github.com> Date: Fri, 24 Jan 2025 00:18:44 +0100 Subject: [PATCH 128/280] playeffect - support new data types (#2678) * Float, Integer, Color, TargetColor playeffect additions * update meta * fix format * 1.21.4 changes * playeffect cmd part 1 * playeffect cmd part 2 * make also a part 3 * this is the final part * turn special_data into a map * fix typo --- .../commands/world/PlayEffectCommand.java | 241 ++++++++++++++---- .../utilities/BukkitImplDeprecations.java | 3 + 2 files changed, 191 insertions(+), 53 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/PlayEffectCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/PlayEffectCommand.java index 2da37c6516..6677835b3a 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/PlayEffectCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/PlayEffectCommand.java @@ -10,17 +10,12 @@ import com.denizenscript.denizencore.exceptions.InvalidArgumentsException; import com.denizenscript.denizencore.objects.Argument; import com.denizenscript.denizencore.objects.ObjectTag; -import com.denizenscript.denizencore.objects.core.ColorTag; -import com.denizenscript.denizencore.objects.core.DurationTag; -import com.denizenscript.denizencore.objects.core.ElementTag; -import com.denizenscript.denizencore.objects.core.ListTag; +import com.denizenscript.denizencore.objects.core.*; import com.denizenscript.denizencore.scripts.ScriptEntry; import com.denizenscript.denizencore.scripts.commands.AbstractCommand; import com.denizenscript.denizencore.utilities.CoreUtilities; import com.denizenscript.denizencore.utilities.debugging.Debug; -import org.bukkit.Effect; -import org.bukkit.Particle; -import org.bukkit.Vibration; +import org.bukkit.*; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -40,7 +35,7 @@ public class PlayEffectCommand extends AbstractCommand { public PlayEffectCommand() { setName("playeffect"); - setSyntax("playeffect [effect:] [at:|...] (data:<#.#>) (special_data:) (visibility:<#.#>) (quantity:<#>) (offset:<#.#>,<#.#>,<#.#>) (targets:|...) (velocity:)"); + setSyntax("playeffect [effect:] [at:|...] (data:<#.#>) (special_data:) (visibility:<#.#>) (quantity:<#>) (offset:<#.#>,<#.#>,<#.#>) (targets:|...) (velocity:)"); setRequiredArguments(2, 8); isProcedural = false; } @@ -59,7 +54,7 @@ public PlayEffectCommand() { // <--[command] // @Name PlayEffect - // @Syntax playeffect [effect:] [at:|...] (data:<#.#>) (special_data:) (visibility:<#.#>) (quantity:<#>) (offset:<#.#>,<#.#>,<#.#>) (targets:|...) (velocity:) + // @Syntax playeffect [effect:] [at:|...] (data:<#.#>) (special_data:) (visibility:<#.#>) (quantity:<#>) (offset:<#.#>,<#.#>,<#.#>) (targets:|...) (velocity:) // @Required 2 // @Maximum 8 // @Short Plays a visible or audible effect at the location. @@ -80,12 +75,16 @@ public PlayEffectCommand() { // The distinction is in whether you include the (now expected to use) "at:" prefix on your location argument. // If you do not have this prefix, the system will assume your command is older, and will apply the 1-block height offset. // - // Some particles will require input to the "special_data" argument. The data input is unique per particle. - // - For REDSTONE particles, the input is of format: |, for example: "1.2|red". Color input is any valid ColorTag object. - // - For DUST_COLOR_TRANSITION particles, the input is of format ||, for example "1.2|red|blue". Color input is any valid ColorTag object. - // - For BLOCK_MARKER, FALLING_DUST, BLOCK_CRACK, or BLOCK_DUST particles, the input is any valid MaterialTag, eg "stone". - // - For VIBRATION, the input is || where origin is a LocationTag and destination is either LocationTag or EntityTag, for example "5s||" - // - For ITEM_CRACK particles, the input is any valid ItemTag, eg "stick". + // Some particles will require input to the "special_data" argument. The data input is a MapTag with different keys per particle. + // - For DUST particles, the input is of format [size=;color=], e.g. "[size=1.2;color=red]". + // - For DUST_COLOR_TRANSITION particles, the input is of format [size=;from=;to=], e.g "[size=1.2;from=red;to=blue]". + // - For BLOCK, BLOCK_CRUMBLE, BLOCK_MARKER, DUST_PILLAR, or FALLING_DUST particles, the input is of format [material=], e.g. [material=stone] + // - For VIBRATION particles, the input is of format [origin=;destination=;duration=], for example: [origin=;destination=;duration=5s] + // - For ITEM particles, the input is of format [item=], e.g. "[item=stick]". + // - For TRAIL particles, the input is of format [color=;target=;duration=], e.g. "[color=red;target=;duration=20s]". + // - For ENTITY_EFFECT particles, the input is of format [color=], e.g. "[color=green]". + // - For SHRIEK particles, the input is of format [duration=], e.g. "[duration=1m]". + // - For SCULK_CHARGE particles, the input is of format [radians=], e.g. "[radians=]". // // Optionally specify a velocity vector for standard particles to move. Note that this ignores the 'data' input if used. // @@ -104,6 +103,26 @@ public PlayEffectCommand() { // @Usage // Use to play some effects at spawn. // - playeffect effect:FIREWORKS_SPARK at: visibility:100 quantity:375 data:0 offset:50.0 + // + // @Usage + // Use to spawn a cloud of rainbow-colored ENTITY_EFFECT particles around yourself. + // - foreach as:color: + // - playeffect effect:ENTITY_EFFECT at: quantity:25 special_data:[color=<[color]>] + // + // @Usage + // Use to shoot particles in to the direction you're looking at. + // - repeat 10: + // - playeffect effect:TRAIL at: quantity:1 offset:0 special_data:[color=red;target=;duration=5s] + // - wait 1t + // + // @Usage + // Use to spawn a SCULK_CHARGE effect upside down. + // - playeffect effect:SCULK_CHARGE at: quantity:1 offset:0 special_data:[radians=] + // + // @Usage + // Use to play a SHRIEK effect with a 5-second delay. + // - playeffect effect:SHRIEK at: quantity:1 special_data:[duration=5s] + // // --> @Override @@ -292,62 +311,178 @@ else if (particleEffect != null) { Debug.echoError("Missing required special data for particle: " + particleEffect.name()); return; } - else if (clazz == Particle.DustOptions.class) { + MapTag dataMap = MapTag.valueOf(special_data.asString(), scriptEntry.getContext()); + if (dataMap == null) { ListTag dataList = ListTag.valueOf(special_data.asString(), scriptEntry.getContext()); - if (dataList.size() != 2) { - Debug.echoError("DustOptions special_data must have 2 list entries for particle: " + particleEffect.name()); - return; - } - else { + BukkitImplDeprecations.playEffectSpecialDataListInput.warn(scriptEntry.getContext()); + if (clazz == Particle.DustOptions.class) { + if (dataList.size() != 2) { + Debug.echoError("DustOptions special_data must have 2 list entries for particle: " + particleEffect.name()); + return; + } float size = Float.parseFloat(dataList.get(0)); ColorTag color = ColorTag.valueOf(dataList.get(1), scriptEntry.context); dataObject = new Particle.DustOptions(BukkitColorExtensions.getColor(color), size); } - } - else if (clazz == BlockData.class) { - MaterialTag blockMaterial = MaterialTag.valueOf(special_data.asString(), scriptEntry.getContext()); - dataObject = blockMaterial.getModernData(); - } - else if (clazz == ItemStack.class) { - ItemTag itemType = ItemTag.valueOf(special_data.asString(), scriptEntry.getContext()); - dataObject = itemType.getItemStack(); - } - else if (clazz == Particle.DustTransition.class) { - ListTag dataList = ListTag.valueOf(special_data.asString(), scriptEntry.getContext()); - if (dataList.size() != 3) { - Debug.echoError("DustTransition special_data must have 3 list entries for particle: " + particleEffect.name()); - return; + else if (clazz == BlockData.class) { + MaterialTag blockMaterial = MaterialTag.valueOf(special_data.asString(), scriptEntry.getContext()); + dataObject = blockMaterial.getModernData(); + } + else if (clazz == ItemStack.class) { + ItemTag itemType = ItemTag.valueOf(special_data.asString(), scriptEntry.getContext()); + dataObject = itemType.getItemStack(); + } + else if (clazz == Particle.DustTransition.class) { + if (dataList.size() != 3) { + Debug.echoError("DustTransition special_data must have 3 list entries for particle: " + particleEffect.name()); + return; + } + else { + float size = Float.parseFloat(dataList.get(0)); + ColorTag fromColor = ColorTag.valueOf(dataList.get(1), scriptEntry.context); + ColorTag toColor = ColorTag.valueOf(dataList.get(2), scriptEntry.context); + dataObject = new Particle.DustTransition(BukkitColorExtensions.getColor(fromColor), BukkitColorExtensions.getColor(toColor), size); + } + } + else if (clazz == Vibration.class) { + if (dataList.size() != 3) { + Debug.echoError("Vibration special_data must have 3 list entries for particle: " + particleEffect.name()); + return; + } + else { + DurationTag duration = dataList.getObject(0).asType(DurationTag.class, scriptEntry.context); + LocationTag origin = dataList.getObject(1).asType(LocationTag.class, scriptEntry.context); + ObjectTag destination = dataList.getObject(2); + Vibration.Destination destObj; + if (destination.shouldBeType(EntityTag.class)) { + destObj = new Vibration.Destination.EntityDestination(destination.asType(EntityTag.class, scriptEntry.context).getBukkitEntity()); + } + else { + destObj = new Vibration.Destination.BlockDestination(destination.asType(LocationTag.class, scriptEntry.context)); + } + dataObject = new Vibration(origin, destObj, duration.getTicksAsInt()); + } } else { - float size = Float.parseFloat(dataList.get(0)); - ColorTag fromColor = ColorTag.valueOf(dataList.get(1), scriptEntry.context); - ColorTag toColor = ColorTag.valueOf(dataList.get(2), scriptEntry.context); - dataObject = new Particle.DustTransition(BukkitColorExtensions.getColor(fromColor), BukkitColorExtensions.getColor(toColor), size); + Debug.echoError("Unknown particle data type: " + clazz.getCanonicalName() + " for particle: " + particleEffect.name() + ". Are you sure it exists and are not using a legacy format?"); + return; } } - else if (clazz == Vibration.class) { - ListTag dataList = ListTag.valueOf(special_data.asString(), scriptEntry.getContext()); - if (dataList.size() != 3) { - Debug.echoError("Vibration special_data must have 3 list entries for particle: " + particleEffect.name()); - return; + else { + if (clazz == Particle.DustOptions.class) { + ElementTag size = dataMap.getObjectAs("size", ElementTag.class, scriptEntry.context); + if (size == null || !size.isFloat()) { + Debug.echoError("special_data input must have a 'size' key with a valid number, for particle " + particleEffect.name()); + return; + } + ColorTag color = dataMap.getObjectAs("color", ColorTag.class, scriptEntry.context); + if (color == null) { + Debug.echoError("special_data input must have a 'color' key with a valid ColorTag, for particle: " + particleEffect.name()); + return; + } + dataObject = new Particle.DustOptions(BukkitColorExtensions.getColor(color), size.asFloat()); } - else { - DurationTag duration = dataList.getObject(0).asType(DurationTag.class, scriptEntry.context); - LocationTag origin = dataList.getObject(1).asType(LocationTag.class, scriptEntry.context); - ObjectTag destination = dataList.getObject(2); + else if (clazz == BlockData.class) { + MaterialTag blockMaterial = dataMap.getObjectAs("material", MaterialTag.class, scriptEntry.context); + if (blockMaterial == null) { + Debug.echoError("special_data input must have a 'material' key with a valid MaterialTag, for particle: " + particleEffect.name()); + return; + } + dataObject = blockMaterial.getModernData(); + } + else if (clazz == ItemStack.class) { + ItemTag itemType = dataMap.getObjectAs("item", ItemTag.class, scriptEntry.context); + if (itemType == null) { + Debug.echoError("special_data input must have a 'item' key with a valid ItemTag, for particle: " + particleEffect.name()); + return; + } + dataObject = itemType.getItemStack(); + } + else if (clazz == Particle.DustTransition.class) { + ElementTag size = dataMap.getObjectAs("size", ElementTag.class, scriptEntry.context); + if (size == null || !size.isFloat()) { + Debug.echoError("special_data input must have a 'size' key with a valid number, for particle: " + particleEffect.name()); + return; + } + ColorTag fromColor = dataMap.getObjectAs("from", ColorTag.class, scriptEntry.context); + ColorTag toColor = dataMap.getObjectAs("to", ColorTag.class, scriptEntry.context); + if (fromColor == null || toColor == null) { + Debug.echoError("special_data input must have a 'to' and 'size' key with a valid ColorTag, for particle: " + particleEffect.name()); + return; + } + dataObject = new Particle.DustTransition(BukkitColorExtensions.getColor(fromColor), BukkitColorExtensions.getColor(toColor), size.asFloat()); + } + else if (clazz == Vibration.class) { + DurationTag duration = dataMap.getObjectAs("duration", DurationTag.class, scriptEntry.context); + if (duration == null) { + Debug.echoError("special_data input must have a 'duration' key with a valid LocationTag, for particle: " + particleEffect.name()); + return; + } + LocationTag origin = dataMap.getObjectAs("origin", LocationTag.class, scriptEntry.context); + if (origin == null) { + Debug.echoError("special_data input must have a 'origin' key with a valid LocationTag, for particle: " + particleEffect.name()); + return; + } + ObjectTag destination = dataMap.getObjectAs("destination", ObjectTag.class, scriptEntry.context); Vibration.Destination destObj; if (destination.shouldBeType(EntityTag.class)) { destObj = new Vibration.Destination.EntityDestination(destination.asType(EntityTag.class, scriptEntry.context).getBukkitEntity()); } - else { + else if (destination.shouldBeType(LocationTag.class)) { destObj = new Vibration.Destination.BlockDestination(destination.asType(LocationTag.class, scriptEntry.context)); } + else { + Debug.echoError("special_data input must have a 'destination' key with a valid LocationTag or EntityTag, for particle: " + particleEffect.name()); + return; + } dataObject = new Vibration(origin, destObj, duration.getTicksAsInt()); } - } - else { - Debug.echoError("Unknown particle data type: " + clazz.getCanonicalName() + " for particle: " + particleEffect.name()); - return; + else if (clazz == Particle.Trail.class) { + ColorTag color = dataMap.getObjectAs("color", ColorTag.class, scriptEntry.context); + if (color == null) { + Debug.echoError("special_data input must have a 'color' key with a valid ColorTag, for particle: " + particleEffect.name()); + return; + } + LocationTag target = dataMap.getObjectAs("target", LocationTag.class, scriptEntry.context); + if (target == null) { + Debug.echoError("special_data input must have a 'target' key with a valid LocationTag, for particle: " + particleEffect.name()); + return; + } + DurationTag duration = dataMap.getObjectAs("duration", DurationTag.class, scriptEntry.context); + if (duration == null) { + Debug.echoError("special_data input must have a 'duration' key with a valid DurationTag, for particle: " + particleEffect.name()); + return; + } + dataObject = new Particle.Trail(target, BukkitColorExtensions.getColor(color), duration.getTicksAsInt()); + } + else if (clazz == Color.class) { + ColorTag color = dataMap.getObjectAs("color", ColorTag.class, scriptEntry.context); + if (!dataMap.getObject("color").canBeType(ColorTag.class)) { + Debug.echoError("special_data input must have a 'color' key with a valid ColorTag, for particle: " + particleEffect.name()); + return; + } + dataObject = BukkitColorExtensions.getColor(color); + } + else if (clazz == Integer.class) { + DurationTag duration = dataMap.getObjectAs("duration", DurationTag.class, scriptEntry.context); + if (duration == null) { + Debug.echoError("special_data input must have a 'duration' key with a valid DurationTag, for particle: " + particleEffect.name()); + return; + } + dataObject = duration.getTicksAsInt(); + } + else if (clazz == Float.class) { + ElementTag radians = dataMap.getObjectAs("radians", ElementTag.class, scriptEntry.context); + if (radians == null || !radians.isFloat()) { + Debug.echoError("special_data input must have a 'radians' key with a valid number, for particle: " + particleEffect.name()); + return; + } + dataObject = radians.asFloat(); + } + else { + Debug.echoError("Unknown particle data type: " + clazz.getCanonicalName() + " for particle: " + particleEffect.name()); + return; + } } } else if (special_data != null) { 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 235cc0d677..d7e3d01336 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java @@ -446,6 +446,9 @@ public class BukkitImplDeprecations { // Added 2025/01/12 public static Warning arrowBasePotionType = new FutureWarning("arrowBasePotionType", "Using 'EntityTag.potion' to get an arrow's base potion type is deprecated in favor of 'EntityTag.potion_type'."); + // Added 2025/01/04 + public static Warning playEffectSpecialDataListInput = new FutureWarning("playEffectSpecialDataListInput", "List input for the special_data argument in playeffect command is now deprecated. Please use a MapTag instead."); + // ==================== PAST deprecations of things that are already gone but still have a warning left behind ==================== // Removed upstream 2023/10/29 without warning. From 2ed9cea18f0878ba62e63905da543e9d252088f0 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Thu, 23 Jan 2025 23:28:35 +0000 Subject: [PATCH 129/280] 1.20 Networking cleanups (#2698) * 1.20 Networking fixes * Imports --- .../nms/interfaces/packets/PacketOutChat.java | 1 + .../handlers/DenizenNetworkManagerImpl.java | 8 +++----- .../network/handlers/FakeBlockHelper.java | 2 +- .../handlers/packet/AttachPacketHandlers.java | 4 ++-- .../packet/DisguisePacketHandlers.java | 2 +- .../packet/FakeBlocksPacketHandlers.java | 10 +++++----- .../network/packets/PacketOutChatImpl.java | 19 ------------------- .../handlers/DenizenNetworkManagerImpl.java | 7 +++---- .../network/handlers/FakeBlockHelper.java | 2 +- .../handlers/packet/AttachPacketHandlers.java | 2 +- .../packet/FakeBlocksPacketHandlers.java | 10 +++++----- .../network/packets/PacketOutChatImpl.java | 19 ------------------- 12 files changed, 23 insertions(+), 63 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/packets/PacketOutChat.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/packets/PacketOutChat.java index 257a449174..f7218dbc8e 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/packets/PacketOutChat.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/packets/PacketOutChat.java @@ -12,5 +12,6 @@ public abstract class PacketOutChat { public abstract String getRawJson(); + // TODO: once 1.20 is the minimum supported version, remove this public static Function convertComponentToJsonString; } diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenNetworkManagerImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenNetworkManagerImpl.java index c1519597d8..455b140108 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenNetworkManagerImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -49,14 +49,12 @@ import java.util.stream.Collectors; public class DenizenNetworkManagerImpl extends Connection { - // TODO: 1.20.6: there are some new methods that should potentially be overriden - // TODO: 1.20.6: this can be cleaned up by decoding with the codec and returning the new packet - public static , B extends FriendlyByteBuf> RegistryFriendlyByteBuf copyPacket(T original, StreamCodec packetCodec) { + public static > T copyPacket(T original, StreamCodec packetCodec) { try { RegistryFriendlyByteBuf copier = new RegistryFriendlyByteBuf(Unpooled.buffer(), CraftRegistry.getMinecraftRegistry()); - packetCodec.encode((B) copier, original); - return copier; + packetCodec.encode(copier, original); + return packetCodec.decode(copier); } catch (Throwable ex) { Debug.echoError(ex); diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/FakeBlockHelper.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/FakeBlockHelper.java index f52d7971f5..c30e01c550 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/FakeBlockHelper.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/FakeBlockHelper.java @@ -90,7 +90,7 @@ public static void copyPacketPaperPatch(ClientboundLevelChunkWithLightPacket new public static ClientboundLevelChunkWithLightPacket handleMapChunkPacket(World world, ClientboundLevelChunkWithLightPacket originalPacket, int chunkX, int chunkZ, List blocks) { try { - ClientboundLevelChunkWithLightPacket duplicateCorePacket = ClientboundLevelChunkWithLightPacket.STREAM_CODEC.decode(DenizenNetworkManagerImpl.copyPacket(originalPacket, ClientboundLevelChunkWithLightPacket.STREAM_CODEC)); + ClientboundLevelChunkWithLightPacket duplicateCorePacket = DenizenNetworkManagerImpl.copyPacket(originalPacket, ClientboundLevelChunkWithLightPacket.STREAM_CODEC); copyPacketPaperPatch(duplicateCorePacket, originalPacket); RegistryFriendlyByteBuf copier = new RegistryFriendlyByteBuf(Unpooled.buffer(), CraftRegistry.getMinecraftRegistry()); originalPacket.getChunkData().write(copier); diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/AttachPacketHandlers.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/AttachPacketHandlers.java index 0a0aceef29..862df8015c 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/AttachPacketHandlers.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/AttachPacketHandlers.java @@ -181,7 +181,7 @@ public static void tryProcessVelocityPacketForAttach(DenizenNetworkManagerImpl n for (EntityAttachmentHelper.PlayerAttachMap attMap : attList.attachedToMap.values()) { EntityAttachmentHelper.AttachmentData att = attMap.getAttachment(networkManager.player.getUUID()); if (attMap.attached.isValid() && att != null) { - ClientboundSetEntityMotionPacket pNew = ClientboundSetEntityMotionPacket.STREAM_CODEC.decode(DenizenNetworkManagerImpl.copyPacket(packet, ClientboundSetEntityMotionPacket.STREAM_CODEC)); + ClientboundSetEntityMotionPacket pNew = DenizenNetworkManagerImpl.copyPacket(packet, ClientboundSetEntityMotionPacket.STREAM_CODEC); ENTITY_ID_PACKVELENT.setInt(pNew, att.attached.getBukkitEntity().getEntityId()); if (NMSHandler.debugPackets) { DenizenNetworkManagerImpl.doPacketOutput("Attach Velocity Packet: " + pNew.getClass().getCanonicalName() + " for " + att.attached.getUUID() + " sent to " + networkManager.player.getScoreboardName()); @@ -203,7 +203,7 @@ public static void tryProcessTeleportPacketForAttach(DenizenNetworkManagerImpl n for (EntityAttachmentHelper.PlayerAttachMap attMap : attList.attachedToMap.values()) { EntityAttachmentHelper.AttachmentData att = attMap.getAttachment(networkManager.player.getUUID()); if (attMap.attached.isValid() && att != null) { - ClientboundTeleportEntityPacket pNew = ClientboundTeleportEntityPacket.STREAM_CODEC.decode(DenizenNetworkManagerImpl.copyPacket(packet, ClientboundTeleportEntityPacket.STREAM_CODEC)); + ClientboundTeleportEntityPacket pNew = DenizenNetworkManagerImpl.copyPacket(packet, ClientboundTeleportEntityPacket.STREAM_CODEC); ENTITY_ID_PACKTELENT.setInt(pNew, att.attached.getBukkitEntity().getEntityId()); Vector resultPos = new Vector(POS_X_PACKTELENT.getDouble(pNew), POS_Y_PACKTELENT.getDouble(pNew), POS_Z_PACKTELENT.getDouble(pNew)).add(relative); if (att.positionalOffset != null) { diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DisguisePacketHandlers.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DisguisePacketHandlers.java index 8679efd8b8..a0496193dd 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DisguisePacketHandlers.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/DisguisePacketHandlers.java @@ -114,7 +114,7 @@ public static ClientboundUpdateAttributesPacket processAttributesPacket(DenizenN public static ClientboundTeleportEntityPacket processTeleportPacket(DenizenNetworkManagerImpl networkManager, ClientboundTeleportEntityPacket teleportEntityPacket, DisguiseCommand.TrackedDisguise disguise) throws IllegalAccessException { if (disguise.as.getBukkitEntityType() == EntityType.ENDER_DRAGON) { - ClientboundTeleportEntityPacket pNew = ClientboundTeleportEntityPacket.STREAM_CODEC.decode(DenizenNetworkManagerImpl.copyPacket(teleportEntityPacket, ClientboundTeleportEntityPacket.STREAM_CODEC)); + ClientboundTeleportEntityPacket pNew = DenizenNetworkManagerImpl.copyPacket(teleportEntityPacket, ClientboundTeleportEntityPacket.STREAM_CODEC); TELEPORT_PACKET_YAW.setByte(pNew, EntityAttachmentHelper.adaptedCompressedAngle(teleportEntityPacket.getyRot(), 180)); return pNew; } diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeBlocksPacketHandlers.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeBlocksPacketHandlers.java index 49b1c856f5..1cc27ce21d 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeBlocksPacketHandlers.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/handlers/packet/FakeBlocksPacketHandlers.java @@ -50,17 +50,17 @@ public static Packet processShowFakeForPacket(DenizenN ClientboundLevelChunkWithLightPacket newPacket = FakeBlockHelper.handleMapChunkPacket(networkManager.player.getBukkitEntity().getWorld(), (ClientboundLevelChunkWithLightPacket) packet, chunkX, chunkZ, blocks); return newPacket; } - else if (packet instanceof ClientboundSectionBlocksUpdatePacket) { + else if (packet instanceof ClientboundSectionBlocksUpdatePacket sectionBlocksUpdatePacket) { FakeBlock.FakeBlockMap map = FakeBlock.blocks.get(networkManager.player.getUUID()); if (map == null) { - return packet; + return sectionBlocksUpdatePacket; } - SectionPos coord = (SectionPos) SECTIONPOS_MULTIBLOCKCHANGE.get(packet); + SectionPos coord = (SectionPos) SECTIONPOS_MULTIBLOCKCHANGE.get(sectionBlocksUpdatePacket); ChunkCoordinate coordinateDenizen = new ChunkCoordinate(coord.getX(), coord.getZ(), networkManager.player.level().getWorld().getName()); if (!map.byChunk.containsKey(coordinateDenizen)) { - return packet; + return sectionBlocksUpdatePacket; } - ClientboundSectionBlocksUpdatePacket newPacket = ClientboundSectionBlocksUpdatePacket.STREAM_CODEC.decode(DenizenNetworkManagerImpl.copyPacket((ClientboundSectionBlocksUpdatePacket) packet, ClientboundSectionBlocksUpdatePacket.STREAM_CODEC)); + ClientboundSectionBlocksUpdatePacket newPacket = DenizenNetworkManagerImpl.copyPacket(sectionBlocksUpdatePacket, ClientboundSectionBlocksUpdatePacket.STREAM_CODEC); LocationTag location = new LocationTag(networkManager.player.level().getWorld(), 0, 0, 0); short[] originalOffsetArray = (short[])OFFSETARRAY_MULTIBLOCKCHANGE.get(newPacket); BlockState[] originalDataArray = (BlockState[])BLOCKARRAY_MULTIBLOCKCHANGE.get(newPacket); diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketOutChatImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketOutChatImpl.java index f4ba9350ee..f8e82c3183 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketOutChatImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/impl/network/packets/PacketOutChatImpl.java @@ -2,15 +2,11 @@ import com.denizenscript.denizen.nms.interfaces.packets.PacketOutChat; import com.denizenscript.denizen.utilities.FormattedTextHelper; -import com.denizenscript.denizencore.utilities.ReflectionHelper; -import com.denizenscript.denizencore.utilities.debugging.Debug; import net.md_5.bungee.chat.ComponentSerializer; import net.minecraft.network.protocol.game.ClientboundPlayerChatPacket; import net.minecraft.network.protocol.game.ClientboundSystemChatPacket; import org.bukkit.craftbukkit.v1_20_R4.util.CraftChatMessage; -import java.lang.reflect.Field; - public class PacketOutChatImpl extends PacketOutChat { public ClientboundPlayerChatPacket playerPacket; @@ -19,24 +15,9 @@ public class PacketOutChatImpl extends PacketOutChat { public String rawJson; public boolean isOverlayActionbar; - public static Field paperTextField; - public PacketOutChatImpl(ClientboundSystemChatPacket internal) { systemPacket = internal; rawJson = CraftChatMessage.toJSON(internal.content()); - if (rawJson == null && convertComponentToJsonString != null) { - try { - if (paperTextField == null) { - paperTextField = ReflectionHelper.getFields(ClientboundSystemChatPacket.class).get("adventure$content"); - } - if (paperTextField != null) { - rawJson = convertComponentToJsonString.apply(paperTextField.get(internal)); - } - } - catch (Throwable ex) { - Debug.echoError(ex); - } - } message = FormattedTextHelper.stringify(ComponentSerializer.parse(rawJson)); isOverlayActionbar = internal.overlay(); } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java index 80dce3bd17..de41ede63c 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -51,12 +51,11 @@ public class DenizenNetworkManagerImpl extends Connection { - // TODO: 1.20.6: this can be cleaned up by decoding with the codec and returning the new packet - public static , B extends FriendlyByteBuf> RegistryFriendlyByteBuf copyPacket(T original, StreamCodec packetCodec) { + public static > T copyPacket(T original, StreamCodec packetCodec) { try { RegistryFriendlyByteBuf copier = new RegistryFriendlyByteBuf(Unpooled.buffer(), CraftRegistry.getMinecraftRegistry()); - packetCodec.encode((B) copier, original); - return copier; + packetCodec.encode(copier, original); + return packetCodec.decode(copier); } catch (Throwable ex) { Debug.echoError(ex); diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java index 221c4a1f03..28ff71552e 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java @@ -90,7 +90,7 @@ public static void copyPacketPaperPatch(ClientboundLevelChunkWithLightPacket new public static ClientboundLevelChunkWithLightPacket handleMapChunkPacket(World world, ClientboundLevelChunkWithLightPacket originalPacket, int chunkX, int chunkZ, List blocks) { try { - ClientboundLevelChunkWithLightPacket duplicateCorePacket = ClientboundLevelChunkWithLightPacket.STREAM_CODEC.decode(DenizenNetworkManagerImpl.copyPacket(originalPacket, ClientboundLevelChunkWithLightPacket.STREAM_CODEC)); + ClientboundLevelChunkWithLightPacket duplicateCorePacket = DenizenNetworkManagerImpl.copyPacket(originalPacket, ClientboundLevelChunkWithLightPacket.STREAM_CODEC); copyPacketPaperPatch(duplicateCorePacket, originalPacket); RegistryFriendlyByteBuf copier = new RegistryFriendlyByteBuf(Unpooled.buffer(), CraftRegistry.getMinecraftRegistry()); originalPacket.getChunkData().write(copier); diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java index 70f369b245..e43461586f 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java @@ -177,7 +177,7 @@ public static void tryProcessVelocityPacketForAttach(DenizenNetworkManagerImpl n for (EntityAttachmentHelper.PlayerAttachMap attMap : attList.attachedToMap.values()) { EntityAttachmentHelper.AttachmentData att = attMap.getAttachment(networkManager.player.getUUID()); if (attMap.attached.isValid() && att != null) { - ClientboundSetEntityMotionPacket pNew = ClientboundSetEntityMotionPacket.STREAM_CODEC.decode(DenizenNetworkManagerImpl.copyPacket(packet, ClientboundSetEntityMotionPacket.STREAM_CODEC)); + ClientboundSetEntityMotionPacket pNew = DenizenNetworkManagerImpl.copyPacket(packet, ClientboundSetEntityMotionPacket.STREAM_CODEC); ENTITY_ID_PACKVELENT.setInt(pNew, att.attached.getBukkitEntity().getEntityId()); if (NMSHandler.debugPackets) { DenizenNetworkManagerImpl.doPacketOutput("Attach Velocity Packet: " + pNew.getClass().getCanonicalName() + " for " + att.attached.getUUID() + " sent to " + networkManager.player.getScoreboardName()); diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeBlocksPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeBlocksPacketHandlers.java index ae32c92202..4938114cac 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeBlocksPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeBlocksPacketHandlers.java @@ -50,17 +50,17 @@ public static Packet processShowFakeForPacket(DenizenN ClientboundLevelChunkWithLightPacket newPacket = FakeBlockHelper.handleMapChunkPacket(networkManager.player.getBukkitEntity().getWorld(), (ClientboundLevelChunkWithLightPacket) packet, chunkX, chunkZ, blocks); return newPacket; } - else if (packet instanceof ClientboundSectionBlocksUpdatePacket) { + else if (packet instanceof ClientboundSectionBlocksUpdatePacket sectionBlocksUpdatePacket) { FakeBlock.FakeBlockMap map = FakeBlock.blocks.get(networkManager.player.getUUID()); if (map == null) { - return packet; + return sectionBlocksUpdatePacket; } - SectionPos coord = (SectionPos) SECTIONPOS_MULTIBLOCKCHANGE.get(packet); + SectionPos coord = (SectionPos) SECTIONPOS_MULTIBLOCKCHANGE.get(sectionBlocksUpdatePacket); ChunkCoordinate coordinateDenizen = new ChunkCoordinate(coord.getX(), coord.getZ(), networkManager.player.level().getWorld().getName()); if (!map.byChunk.containsKey(coordinateDenizen)) { - return packet; + return sectionBlocksUpdatePacket; } - ClientboundSectionBlocksUpdatePacket newPacket = ClientboundSectionBlocksUpdatePacket.STREAM_CODEC.decode(DenizenNetworkManagerImpl.copyPacket((ClientboundSectionBlocksUpdatePacket) packet, ClientboundSectionBlocksUpdatePacket.STREAM_CODEC)); + ClientboundSectionBlocksUpdatePacket newPacket = DenizenNetworkManagerImpl.copyPacket(sectionBlocksUpdatePacket, ClientboundSectionBlocksUpdatePacket.STREAM_CODEC); LocationTag location = new LocationTag(networkManager.player.level().getWorld(), 0, 0, 0); short[] originalOffsetArray = (short[])OFFSETARRAY_MULTIBLOCKCHANGE.get(newPacket); BlockState[] originalDataArray = (BlockState[])BLOCKARRAY_MULTIBLOCKCHANGE.get(newPacket); diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java index fdd2032e3e..3e4b7e5542 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java @@ -2,15 +2,11 @@ import com.denizenscript.denizen.nms.interfaces.packets.PacketOutChat; import com.denizenscript.denizen.utilities.FormattedTextHelper; -import com.denizenscript.denizencore.utilities.ReflectionHelper; -import com.denizenscript.denizencore.utilities.debugging.Debug; import net.md_5.bungee.chat.ComponentSerializer; import net.minecraft.network.protocol.game.ClientboundPlayerChatPacket; import net.minecraft.network.protocol.game.ClientboundSystemChatPacket; import org.bukkit.craftbukkit.v1_21_R3.util.CraftChatMessage; -import java.lang.reflect.Field; - public class PacketOutChatImpl extends PacketOutChat { public ClientboundPlayerChatPacket playerPacket; @@ -19,24 +15,9 @@ public class PacketOutChatImpl extends PacketOutChat { public String rawJson; public boolean isOverlayActionbar; - public static Field paperTextField; - public PacketOutChatImpl(ClientboundSystemChatPacket internal) { systemPacket = internal; rawJson = CraftChatMessage.toJSON(internal.content()); - if (rawJson == null && convertComponentToJsonString != null) { - try { - if (paperTextField == null) { - paperTextField = ReflectionHelper.getFields(ClientboundSystemChatPacket.class).get("adventure$content"); - } - if (paperTextField != null) { - rawJson = convertComponentToJsonString.apply(paperTextField.get(internal)); - } - } - catch (Throwable ex) { - Debug.echoError(ex); - } - } message = FormattedTextHelper.stringify(ComponentSerializer.parse(rawJson)); isOverlayActionbar = internal.overlay(); } From f62bf52ce024935c2090e8fd1cc1270fe6213712 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Fri, 24 Jan 2025 00:19:10 +0000 Subject: [PATCH 130/280] Don't try adding fluid tags as material ones (#2700) --- .../com/denizenscript/denizen/utilities/VanillaTagHelper.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/VanillaTagHelper.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/VanillaTagHelper.java index c4b02d6451..c270b47361 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/VanillaTagHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/VanillaTagHelper.java @@ -89,9 +89,6 @@ static void addEntityTag(Tag tag) { addMaterialTag(tag); } if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_18)) { // Note: existed on prior versions, but was bugged - for (Tag tag : Bukkit.getTags("fluids", Material.class)) { - addMaterialTag(tag); - } for (Tag tag : Bukkit.getTags("entity_types", EntityType.class)) { addEntityTag(tag); } From e96c20967df08c480ac5f64a33cab646eb9b7709 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Fri, 24 Jan 2025 18:22:33 -0800 Subject: [PATCH 131/280] minor format fixes --- .../denizen/paper/properties/PaperEntityExtensions.java | 1 + .../denizen/objects/properties/entity/EntitySheared.java | 3 +-- .../denizen/scripts/commands/BukkitCommandRegistry.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperEntityExtensions.java b/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperEntityExtensions.java index 2cc1573296..94bcb7f641 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperEntityExtensions.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperEntityExtensions.java @@ -190,6 +190,7 @@ public static void register() { // <--[mechanism] // @object EntityTag // @name shear + // @input None // @Plugin paper // @group paper // @description diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntitySheared.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntitySheared.java index 4b200237bd..91e437f57a 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntitySheared.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntitySheared.java @@ -100,8 +100,8 @@ public static void register() { // @object EntityTag // @name has_pumpkin_head // @input ElementTag(Boolean) - // @description // @deprecated use 'EntityTag.sheared' + // @description // Deprecated in favor of <@link mechanism EntityTag.sheared>. // @tags // @@ -115,4 +115,3 @@ public static void register() { }); } } - diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/BukkitCommandRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/BukkitCommandRegistry.java index 3be94dbab9..63be0127f2 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/BukkitCommandRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/BukkitCommandRegistry.java @@ -82,7 +82,7 @@ public static void registerCitizensCommands() { } public static void registerCommands() { - //core + // core registerCommand(CooldownCommand.class); registerCommand(ResetCommand.class); registerCommand(ZapCommand.class); From c2edf71acf1fabc0f8453407084b68d7a3fcdfb1 Mon Sep 17 00:00:00 2001 From: david <89749147+davight@users.noreply.github.com> Date: Wed, 29 Jan 2025 12:05:27 +0100 Subject: [PATCH 132/280] Add `PlayerTag.view_distance` tag & mech (#2694) * add view_distance mech & tag * add reset option * remove required param --- .../properties/PaperPlayerExtensions.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperPlayerExtensions.java b/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperPlayerExtensions.java index be56152901..d0d3806724 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperPlayerExtensions.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperPlayerExtensions.java @@ -79,6 +79,19 @@ public static void register() { return map; }); + // <--[tag] + // @attribute + // @returns ElementTag(Number) + // @mechanism PlayerTag.view_distance + // @group paper + // @Plugin Paper + // @description + // Returns this player's view distance, or the view distance of the world they're in if unset. + // --> + PlayerTag.registerOnlineOnlyTag(ElementTag.class, "view_distance", (attribute, object) -> { + return new ElementTag(object.getPlayerEntity().getViewDistance()); + }); + // <--[mechanism] // @object PlayerTag // @name affects_monster_spawning @@ -136,6 +149,32 @@ public static void register() { } }); + // <--[mechanism] + // @object PlayerTag + // @name view_distance + // @input ElementTag(Number) + // @Plugin Paper + // @group paper + // @description + // Sets this player's view distance. Input must be a number between 2 and 32. + // This will be reset when a player rejoins. Provide no input to unset. + // @tags + // + // --> + PlayerTag.registerOnlineOnlyMechanism("view_distance", (object, mechanism) -> { + if (!mechanism.hasValue()) { + object.getPlayerEntity().setViewDistance(-1); + } + else if (mechanism.requireInteger()) { + int distance = mechanism.getValue().asInt(); + if (distance < 2 || distance > 32) { + mechanism.echoError("Invalid view distance '" + distance + "': must be between 2 and 32."); + return; + } + object.getPlayerEntity().setViewDistance(distance); + } + }); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { // <--[tag] From 07fe6d9c6c1040ded389a4076816f8faf4e88e30 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Sun, 9 Feb 2025 06:12:28 -0800 Subject: [PATCH 133/280] match for core deprecation text public --- .../denizen/utilities/BukkitImplDeprecations.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 d7e3d01336..aa86bbeb22 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java @@ -2,9 +2,9 @@ import com.denizenscript.denizencore.utilities.debugging.*; -public class BukkitImplDeprecations { +import static com.denizenscript.denizencore.utilities.Deprecations.pointlessSubtagPrefix; - private static final String pointlessSubtagPrefix = "Most pointless sub-tags are deprecated in favor of explicit unique tags. "; +public class BukkitImplDeprecations { // ==================== REMOVE THESE ==================== // Every warning inside this section should be removed from the codebase. From e30c2513930490c6430631645dca9b95cb3beb5e Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Sun, 16 Feb 2025 15:49:24 -0800 Subject: [PATCH 134/280] minor fix on crafter crafts event --- .../denizen/events/block/CrafterCraftsScriptEvent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/block/CrafterCraftsScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/block/CrafterCraftsScriptEvent.java index d7f7c3c721..6a931f0591 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/block/CrafterCraftsScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/block/CrafterCraftsScriptEvent.java @@ -61,7 +61,7 @@ public ObjectTag getContext(String name) { return switch (name) { case "item" -> new ItemTag(event.getResult()); case "location" -> location; - case "recipe_id" -> new ElementTag(Utilities.namespacedKeyToString(event.getRecipe().getKey()), true); + case "recipe_id" -> new ElementTag(event.getRecipe().getKey().toString(), true); default -> super.getContext(name); }; } From bd76c2a110751a8dbcbc628ecd9814beed5dcd41 Mon Sep 17 00:00:00 2001 From: Zozer Firehood Date: Sat, 1 Mar 2025 13:32:35 -0500 Subject: [PATCH 135/280] `MaterialTag.count`: pink petals support (#2632) * added count to pink petals * accidently messed with imports * added newlines * moved from multiversion helper to main function * clean up imports * remove excess brackets --- .../properties/material/MaterialCount.java | 33 ++++++++++++------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialCount.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialCount.java index 560c24d862..398d1c5b27 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialCount.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialCount.java @@ -1,5 +1,7 @@ package com.denizenscript.denizen.objects.properties.material; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.MaterialTag; import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.ObjectTag; @@ -7,18 +9,14 @@ import com.denizenscript.denizencore.objects.properties.Property; import com.denizenscript.denizencore.objects.properties.PropertyParser; import org.bukkit.block.data.BlockData; -import org.bukkit.block.data.type.Candle; -import org.bukkit.block.data.type.RespawnAnchor; -import org.bukkit.block.data.type.SeaPickle; -import org.bukkit.block.data.type.TurtleEgg; +import org.bukkit.block.data.type.*; public class MaterialCount implements Property { public static boolean describes(ObjectTag material) { - if (!(material instanceof MaterialTag)) { + if (!(material instanceof MaterialTag mat)) { return false; } - MaterialTag mat = (MaterialTag) material; if (!mat.hasModernData()) { return false; } @@ -26,7 +24,8 @@ public static boolean describes(ObjectTag material) { return data instanceof SeaPickle || data instanceof TurtleEgg || data instanceof RespawnAnchor - || data instanceof Candle; + || data instanceof Candle + || (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19) && data instanceof PinkPetals); } public static MaterialCount getFrom(ObjectTag _material) { @@ -56,7 +55,7 @@ public static void register() { // @mechanism MaterialTag.count // @group properties // @description - // Returns the amount of pickles in a Sea Pickle material, eggs in a Turtle Egg material, charges in a Respawn Anchor material, or candles in a Candle material. + // Returns the amount of pickles in a Sea Pickle material, eggs in a Turtle Egg material, charges in a Respawn Anchor material, candles in a Candle material, or petals in a Pink Petals material. // --> PropertyParser.registerStaticTag(MaterialCount.class, ElementTag.class, "count", (attribute, material) -> { return new ElementTag(material.getCurrent()); @@ -68,7 +67,7 @@ public static void register() { // @mechanism MaterialTag.count // @group properties // @description - // Returns the maximum amount of pickles allowed in a Sea Pickle material, eggs in a Turtle Egg material, charges in a Respawn Anchor material, or candles in a Candle material. + // Returns the maximum amount of pickles allowed in a Sea Pickle material, eggs in a Turtle Egg material, charges in a Respawn Anchor material, candles in a Candle material, or petals in a Pink Petals material. // --> PropertyParser.registerStaticTag(MaterialCount.class, ElementTag.class, "count_max", (attribute, material) -> { return new ElementTag(material.getMax()); @@ -80,7 +79,7 @@ public static void register() { // @mechanism MaterialTag.count // @group properties // @description - // Returns the minimum amount of pickles allowed in a Sea Pickle material, eggs in a Turtle Egg material, charges in a Respawn Anchor material, or candles in a Candle material. + // Returns the minimum amount of pickles allowed in a Sea Pickle material, eggs in a Turtle Egg material, charges in a Respawn Anchor material, candles in a Candle material, or petals in a Pink Petals material. // --> PropertyParser.registerStaticTag(MaterialCount.class, ElementTag.class, "count_min", (attribute, material) -> { return new ElementTag(material.getMin()); @@ -132,6 +131,9 @@ else if (isRespawnAnchor()) { else if (isCandle()) { return getCandle().getCandles(); } + else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19) && material.getModernData() instanceof PinkPetals pinkPetals) { + return pinkPetals.getFlowerAmount(); + } throw new UnsupportedOperationException(); } @@ -148,6 +150,9 @@ else if (isRespawnAnchor()) { else if (isCandle()) { return getCandle().getMaximumCandles(); } + else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19) && material.getModernData() instanceof PinkPetals pinkPetals) { + return pinkPetals.getMaximumFlowerAmount(); + } throw new UnsupportedOperationException(); } @@ -164,6 +169,9 @@ else if (isRespawnAnchor()) { else if (isCandle()) { return 1; } + else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19) && material.getModernData() instanceof PinkPetals) { + return 1; + } throw new UnsupportedOperationException(); } @@ -185,7 +193,7 @@ public void adjust(Mechanism mechanism) { // @name count // @input ElementTag(Number) // @description - // Sets the amount of pickles in a Sea Pickle material, eggs in a Turtle Egg material, charges in a Respawn Anchor material, or candles in a Candle material. + // Sets the amount of pickles in a Sea Pickle material, eggs in a Turtle Egg material, charges in a Respawn Anchor material, candles in a Candle material, or petals in a Pink Petals material. // @tags // // @@ -209,6 +217,9 @@ else if (isRespawnAnchor()) { else if (isCandle()) { getCandle().setCandles(count); } + else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19) && material.getModernData() instanceof PinkPetals pinkPetals) { + pinkPetals.setFlowerAmount(count); + } } } } From 44568ca48c6e2e28d5441a129b010f06fcd8059c Mon Sep 17 00:00:00 2001 From: MCSamuel Date: Sat, 1 Mar 2025 14:19:28 -0500 Subject: [PATCH 136/280] `EntityKnocksbackEntityScriptEvent` added (#2697) * `EntityKnocksbackEntityScriptEvent` added * version clarification * double-fire warning added * Aya update * MC clarified --- .../EntityKnocksbackEntityScriptEvent.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/EntityKnocksbackEntityScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/EntityKnocksbackEntityScriptEvent.java index 167a3423b2..a1489967eb 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/events/EntityKnocksbackEntityScriptEvent.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/EntityKnocksbackEntityScriptEvent.java @@ -5,6 +5,7 @@ import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; +import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; import com.destroystokyo.paper.event.entity.EntityKnockbackByEntityEvent; @@ -19,6 +20,8 @@ public class EntityKnocksbackEntityScriptEvent extends BukkitScriptEvent impleme // // @Location true // + // @Warning this event may in some cases double-fire, requiring usage of the 'ratelimit' command (like 'ratelimit 1t') to prevent doubling actions. + // // @Switch with: to only process the event when the item used to cause damage (in the damager's hand) is a specified item. // // @Plugin Paper @@ -33,6 +36,7 @@ public class EntityKnocksbackEntityScriptEvent extends BukkitScriptEvent impleme // returns the EntityTag that was knocked back. // returns the EntityTag of the one who knocked. // returns the knockback applied as a vector. + // returns the cause of the knockback (only on MC 1.20+). Causes list: <@link url https://jd.papermc.io/paper/1.21.1/io/papermc/paper/event/entity/EntityKnockbackEvent.Cause.html> // // @Determine // LocationTag as a vector to change the acceleration applied. @@ -88,15 +92,13 @@ public ScriptEntryData getScriptEntryData() { @Override public ObjectTag getContext(String name) { - switch (name) { - case "entity": - return entity.getDenizenObject(); - case "damager": - return hitBy.getDenizenObject(); - case "acceleration": - return new LocationTag(event.getAcceleration()); - } - return super.getContext(name); + return switch (name) { + case "entity" -> entity.getDenizenObject(); + case "damager" -> hitBy.getDenizenObject(); + case "acceleration" -> new LocationTag(event.getAcceleration()); + case "cause" -> new ElementTag(event.getCause()); + default -> super.getContext(name); + }; } @EventHandler From 28fed1329b6b510eb9f9b40708f274404ce9cad4 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Sat, 1 Mar 2025 13:11:05 -0800 Subject: [PATCH 137/280] modernize ItemCustomModel and fix describes --- .../properties/item/ItemCustomModel.java | 128 +++++------------- 1 file changed, 37 insertions(+), 91 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemCustomModel.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemCustomModel.java index 6649ceaacc..0360bb63de 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemCustomModel.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemCustomModel.java @@ -3,89 +3,44 @@ import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.Mechanism; -import com.denizenscript.denizencore.objects.ObjectTag; -import com.denizenscript.denizencore.objects.properties.Property; -import com.denizenscript.denizencore.tags.Attribute; +import com.denizenscript.denizencore.objects.properties.PropertyParser; import org.bukkit.inventory.meta.ItemMeta; -public class ItemCustomModel implements Property { - - public static boolean describes(ObjectTag item) { - return item instanceof ItemTag; - } - - public static ItemCustomModel getFrom(ObjectTag _item) { - if (!describes(_item)) { - return null; - } - else { - return new ItemCustomModel((ItemTag) _item); - } - } - - public static final String[] handledTags = new String[] { - "custom_model_data", "has_custom_model_data" - }; - - public static final String[] handledMechs = new String[] { - "custom_model_data" - }; - - public ItemCustomModel(ItemTag _item) { - item = _item; +public class ItemCustomModel extends ItemProperty { + + // <--[property] + // @object ItemTag + // @name custom_model_data + // @input ElementTag(Number) + // @description + // Controls the custom model data ID number of the item. + // Use with no input to remove the custom model data. + // @tags + // + // + // --> + public static boolean describes(ItemTag item) { + return !item.getBukkitMaterial().isAir(); } - ItemTag item; - @Override - public ObjectTag getObjectAttribute(Attribute attribute) { - - if (attribute == null) { - return null; - } - - // <--[tag] - // @attribute - // @returns ElementTag(Boolean) - // @mechanism ItemTag.custom_model_data - // @group properties - // @description - // Returns whether the item has a custom model data ID number set on it. - // Also see <@link tag ItemTag.custom_model_data>. - // --> - if (attribute.startsWith("has_custom_model_data")) { - return new ElementTag(item.getItemMeta().hasCustomModelData()) - .getObjectAttribute(attribute.fulfill(1)); - } - - // <--[tag] - // @attribute - // @returns ElementTag(Number) - // @mechanism ItemTag.custom_model_data - // @group properties - // @description - // Returns the custom model data ID number of the item. - // This tag is invalid for items that do not have a custom model data ID. - // Also see <@link tag ItemTag.has_custom_model_data>. - // --> - if (attribute.startsWith("custom_model_data")) { - if (item.getItemMeta().hasCustomModelData()) { - return new ElementTag(item.getItemMeta().getCustomModelData()) - .getObjectAttribute(attribute.fulfill(1)); - } + public ElementTag getPropertyValue() { + if (getItemMeta().hasCustomModelData()) { + return new ElementTag(getItemMeta().getCustomModelData()); } - return null; } @Override - public String getPropertyString() { - if (item.getItemMeta().hasCustomModelData()) { - return String.valueOf(item.getItemMeta().getCustomModelData()); + public void setPropertyValue(ElementTag value, Mechanism mechanism) { + ItemMeta meta = getItemMeta(); + if (mechanism.hasValue() && mechanism.requireInteger()) { + meta.setCustomModelData(value.asInt()); } else { - return null; + meta.setCustomModelData(null); } + setItemMeta(meta); } @Override @@ -93,29 +48,20 @@ public String getPropertyId() { return "custom_model_data"; } - @Override - public void adjust(Mechanism mechanism) { + public static void register() { + autoRegisterNullable("custom_model_data", ItemCustomModel.class, ElementTag.class, false); - // <--[mechanism] - // @object ItemTag - // @name custom_model_data - // @input ElementTag(Number) + // <--[tag] + // @attribute + // @returns ElementTag(Boolean) + // @mechanism ItemTag.custom_model_data + // @group properties // @description - // Changes the custom model data ID number of the item. - // Use with no input to remove the custom model data. - // @tags - // - // + // Returns whether the item has a custom model data ID number set on it. + // See also <@link tag ItemTag.custom_model_data>. // --> - if (mechanism.matches("custom_model_data")) { - ItemMeta meta = (item.getItemMeta()); - if (mechanism.hasValue() && mechanism.requireInteger()) { - meta.setCustomModelData(mechanism.getValue().asInt()); - } - else { - meta.setCustomModelData(null); - } - item.setItemMeta(meta); - } + PropertyParser.registerTag(ItemCustomModel.class, ElementTag.class, "has_custom_model_data", (attribute, prop) -> { + return new ElementTag(prop.getItemMeta().hasCustomModelData()); + }); } } From 8b64f9c02324c19db43ff6b5016876a039c3269f Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Sat, 1 Mar 2025 13:22:23 -0800 Subject: [PATCH 138/280] update Citizens version link and targetable --- paper/pom.xml | 2 +- plugin/pom.xml | 2 +- .../java/com/denizenscript/denizen/objects/NPCTag.java | 9 ++++++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/paper/pom.xml b/paper/pom.xml index 2ea638249e..1f4c4e1d40 100644 --- a/paper/pom.xml +++ b/paper/pom.xml @@ -31,7 +31,7 @@ net.citizensnpcs citizens-main - 2.0.35-SNAPSHOT + 2.0.37-SNAPSHOT jar provided diff --git a/plugin/pom.xml b/plugin/pom.xml index cf1d33be28..98319c89a9 100644 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -44,7 +44,7 @@ net.citizensnpcs citizens-main - 2.0.35-SNAPSHOT + 2.0.37-SNAPSHOT jar provided 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 5dfbc9cec7..a99fa9ec70 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/NPCTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/NPCTag.java @@ -985,8 +985,11 @@ else if (attribute.startsWith("list", 2)) { // Returns whether the NPC is targetable. // --> tagProcessor.registerTag(ElementTag.class, "targetable", (attribute, object) -> { - boolean targetable = object.getCitizen().data().get(NPC.Metadata.TARGETABLE, object.getCitizen().data().get(NPC.Metadata.DEFAULT_PROTECTED, true)); - return new ElementTag(targetable); + TargetableTrait trait = object.getCitizen().getTraitNullable(TargetableTrait.class); + if (trait != null) { + return new ElementTag(trait.isTargetable()); + } + return new ElementTag(object.getCitizen().data().get(NPC.Metadata.DEFAULT_PROTECTED, true)); }); // <--[tag] @@ -1879,7 +1882,7 @@ else if (!trait.isSneaking() && mechanism.getValue().asBoolean()) { // // --> if (mechanism.matches("targetable") && mechanism.requireBoolean()) { - getCitizen().data().setPersistent(NPC.Metadata.TARGETABLE, mechanism.getValue().asBoolean()); + getCitizen().getOrAddTrait(TargetableTrait.class).setTargetable(mechanism.getValue().asBoolean()); } // <--[mechanism] From dc0e487dcb20834e5853c8c8d07259c0d9e05435 Mon Sep 17 00:00:00 2001 From: MCSamuel Date: Thu, 6 Mar 2025 10:36:02 -0500 Subject: [PATCH 139/280] `projectile launched`: shooter support (#2701) * - added to "ProjectileLaunchedScriptEvent" - deprecated and replaced with since there are technically multiple entities. * fixes * matcher removal * Aya update --- .../entity/ProjectileLaunchedScriptEvent.java | 54 ++++++++++--------- .../utilities/BukkitImplDeprecations.java | 3 ++ 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/ProjectileLaunchedScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/ProjectileLaunchedScriptEvent.java index ef0cc8b83d..f39f345f10 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/ProjectileLaunchedScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/ProjectileLaunchedScriptEvent.java @@ -1,8 +1,9 @@ package com.denizenscript.denizen.events.entity; import com.denizenscript.denizen.objects.EntityTag; -import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.objects.LocationTag; +import com.denizenscript.denizen.utilities.BukkitImplDeprecations; import com.denizenscript.denizencore.objects.ObjectTag; import org.bukkit.entity.Entity; import org.bukkit.event.EventHandler; @@ -16,10 +17,10 @@ public class ProjectileLaunchedScriptEvent extends BukkitScriptEvent implements // projectile launched // launched // - // @Regex ^on [^\s]+ launched$ - // // @Group Entity // + // @Switch by: to only process the event if the projectile shooter matches the specified entity matcher. + // // @Location true // // @Cancellable true @@ -27,35 +28,30 @@ public class ProjectileLaunchedScriptEvent extends BukkitScriptEvent implements // @Triggers when a projectile is launched. // // @Context - // returns the projectile. + // returns an EntityTag of the projectile. + // returns an EntityTag of the entity that shot the projectile, if any. // // --> public ProjectileLaunchedScriptEvent() { + registerCouldMatcher(" launched"); + registerSwitches("by"); } public EntityTag projectile; private LocationTag location; public ProjectileLaunchEvent event; + public EntityTag shooter; @Override - public boolean couldMatch(ScriptPath path) { - if (!path.eventArgLowerAt(1).equals("launched")) { - return false; - } - if (!couldMatchEntity(path.eventArgLowerAt(0))) { + public boolean matches(ScriptPath path) { + if (!runInCheck(path, location)) { return false; } - return true; - } - - @Override - public boolean matches(ScriptPath path) { - String projTest = path.eventArgLowerAt(0); - if (!projTest.equals("projectile") && !projectile.tryAdvancedMatcher(projTest, path.context)) { + if (!path.tryArgObject(0, projectile)) { return false; } - if (!runInCheck(path, location)) { + if (!path.tryObjectSwitch("by", shooter)) { return false; } return super.matches(path); @@ -63,20 +59,26 @@ public boolean matches(ScriptPath path) { @Override public ObjectTag getContext(String name) { - if (name.equals("entity")) { - return projectile.getDenizenObject(); - } - return super.getContext(name); + return switch (name) { + case "entity" -> { + BukkitImplDeprecations.projectileLaunchedEntityContext.warn(); + yield projectile; + } + case "projectile" -> projectile; + case "shooter" -> shooter.getDenizenObject(); + default -> super.getContext(name); + }; } @EventHandler public void onProjectileLaunched(ProjectileLaunchEvent event) { - Entity projectile = event.getEntity(); - EntityTag.rememberEntity(projectile); - this.projectile = new EntityTag(projectile); - location = new LocationTag(event.getEntity().getLocation()); + Entity entity = event.getEntity(); + EntityTag.rememberEntity(entity); this.event = event; + projectile = new EntityTag(entity); + location = projectile.getLocation(); + shooter = projectile.getShooter(); fire(event); - EntityTag.forgetEntity(projectile); + EntityTag.forgetEntity(entity); } } 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 aa86bbeb22..a35517588f 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java @@ -449,6 +449,9 @@ public class BukkitImplDeprecations { // Added 2025/01/04 public static Warning playEffectSpecialDataListInput = new FutureWarning("playEffectSpecialDataListInput", "List input for the special_data argument in playeffect command is now deprecated. Please use a MapTag instead."); + // Added 2025/01/23 + public static Warning projectileLaunchedEntityContext = new FutureWarning("projectileLaunchedEntityContext", "'context.entity' in the 'projectile launched' event is deprecated in favor of 'context.projectile'."); + // ==================== PAST deprecations of things that are already gone but still have a warning left behind ==================== // Removed upstream 2023/10/29 without warning. From 408a478aca1eeea95c2d314c0ca7ab2c89d051b6 Mon Sep 17 00:00:00 2001 From: MCSamuel Date: Thu, 6 Mar 2025 10:48:57 -0500 Subject: [PATCH 140/280] Fix example `TradeTag`s in meta (#2705) --- .../main/java/com/denizenscript/denizen/objects/TradeTag.java | 4 ++-- .../denizen/scripts/commands/player/OpenTradesCommand.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/TradeTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/TradeTag.java index c1d695e288..f8a019f3ca 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/TradeTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/TradeTag.java @@ -41,9 +41,9 @@ public class TradeTag implements ObjectTag, Adjustable { // For example, the following command opens a virtual merchant inventory with two merchant trades. // The first trade offers a sponge for two emeralds, can be used up to 10 times, // and offers XP upon a successful transaction. - // The second trade has zero maximum uses and displays a barrier. + // The second trade has zero maximum uses and displays a barrier in the input and output slots. // - // - opentrades trade[max_uses=10;inputs=emerald[quantity=2];result=sponge]|trade[result=barrier] + // - opentrades trade[max_uses=10;inputs=emerald[quantity=2];result=sponge]|trade[inputs=barrier;result=barrier] // // // --> diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/player/OpenTradesCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/player/OpenTradesCommand.java index 3895fc7089..0d09f405d2 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/player/OpenTradesCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/player/OpenTradesCommand.java @@ -55,7 +55,7 @@ public OpenTradesCommand() { // // @Usage // Use to open a list of trades with an optional title. - // - opentrades trade[result=stone;inputs=stone;max_uses=9999]|trade[result=barrier] "title:Useless Trades" + // - opentrades trade[result=stone;inputs=stone;max_uses=9999]|trade[inputs=barrier;result=barrier] "title:Useless Trades" // // @Usage // Use to force a player to trade with a villager. From a7d9c489a796d1b4eb5975463f9bc61019f05112 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Wed, 19 Mar 2025 22:07:47 +0000 Subject: [PATCH 141/280] `MaterialTag.vanilla_tags` 1.21 fixes (#2706) * Use `NamespacedKey`s instead of `String`s for tags * `BlockTagsSetter` * Re-fill `VanillaTagHelper` on resources reload * TODOs * Fixup some TODO comments * Method order fixup * Batch reloads to handle lots of modifications * Cleanup `Plugin#getFile` Usage * Typo --- .../denizen/paper/PaperEventHelpers.java | 8 ++ .../paper/utilities/BlockTagsSetter.java | 94 +++++++++++++++++++ .../paper/utilities/PaperAPIToolsImpl.java | 9 ++ .../com/denizenscript/denizen/Denizen.java | 5 + .../denizen/nms/interfaces/BlockHelper.java | 7 +- .../denizen/nms/interfaces/EntityHelper.java | 4 +- .../denizen/nms/interfaces/PacketHelper.java | 2 +- .../denizen/nms/interfaces/PlayerHelper.java | 2 +- .../denizen/objects/MaterialTag.java | 12 ++- .../denizen/utilities/PaperAPITools.java | 5 + .../denizen/utilities/VanillaTagHelper.java | 20 ++-- .../nms/v1_18/helpers/BlockHelperImpl.java | 8 +- .../nms/v1_19/helpers/BlockHelperImpl.java | 8 +- .../nms/v1_20/helpers/BlockHelperImpl.java | 13 +-- .../nms/v1_21/helpers/BlockHelperImpl.java | 50 +--------- 15 files changed, 162 insertions(+), 85 deletions(-) create mode 100644 paper/src/main/java/com/denizenscript/denizen/paper/utilities/BlockTagsSetter.java diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/PaperEventHelpers.java b/paper/src/main/java/com/denizenscript/denizen/paper/PaperEventHelpers.java index e727515ad0..d8a0773ccf 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/PaperEventHelpers.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/PaperEventHelpers.java @@ -2,10 +2,13 @@ import com.denizenscript.denizen.objects.InventoryTag; import com.denizenscript.denizen.scripts.containers.core.InventoryScriptContainer; +import com.denizenscript.denizen.utilities.VanillaTagHelper; import com.denizenscript.denizen.utilities.inventory.InventoryViewUtil; import com.denizenscript.denizencore.objects.core.ScriptTag; import com.destroystokyo.paper.event.player.PlayerRecipeBookClickEvent; +import io.papermc.paper.event.server.ServerResourcesReloadedEvent; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; public class PaperEventHelpers implements Listener { @@ -19,4 +22,9 @@ public void onRecipeBookClick(PlayerRecipeBookClickEvent event) { } } } + + @EventHandler(priority = EventPriority.LOWEST) + public void onServerResourcesReloaded(ServerResourcesReloadedEvent event) { + VanillaTagHelper.loadTagsCache(); + } } diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/utilities/BlockTagsSetter.java b/paper/src/main/java/com/denizenscript/denizen/paper/utilities/BlockTagsSetter.java new file mode 100644 index 0000000000..0215cd070e --- /dev/null +++ b/paper/src/main/java/com/denizenscript/denizen/paper/utilities/BlockTagsSetter.java @@ -0,0 +1,94 @@ +package com.denizenscript.denizen.paper.utilities; + +import com.denizenscript.denizen.Denizen; +import com.denizenscript.denizen.utilities.Utilities; +import com.denizenscript.denizen.utilities.VanillaTagHelper; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import com.destroystokyo.paper.event.server.ServerTickEndEvent; +import io.papermc.paper.plugin.bootstrap.BootstrapContext; +import io.papermc.paper.plugin.configuration.PluginMeta; +import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents; +import io.papermc.paper.registry.RegistryKey; +import io.papermc.paper.registry.TypedKey; +import io.papermc.paper.registry.tag.TagKey; +import net.kyori.adventure.text.logger.slf4j.ComponentLogger; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.block.BlockType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +import java.lang.invoke.MethodHandle; +import java.nio.file.Path; +import java.util.*; +import java.util.stream.Collectors; + +public class BlockTagsSetter implements Listener { + + public static final MethodHandle BOOTSTRAP_CONTEXT_CONSTRUCTOR; + + static { + try { + Class bootstrapContextImplClass = Class.forName("io.papermc.paper.plugin.bootstrap.PluginBootstrapContextImpl"); + BOOTSTRAP_CONTEXT_CONSTRUCTOR = ReflectionHelper.getConstructor(bootstrapContextImplClass, PluginMeta.class, Path.class, ComponentLogger.class, Path.class); + } + catch (Throwable e) { + throw new RuntimeException("Failed to initialize BlockTagsSetter", e); + } + } + + public static final BlockTagsSetter INSTANCE = new BlockTagsSetter(Denizen.getInstance()); + + public Map, Set>> modifiedTags = new HashMap<>(); + public boolean batchReloadNeeded; + + public BlockTagsSetter(Denizen plugin) { + Bukkit.getPluginManager().registerEvents(this, plugin); + try { + BootstrapContext fakeContext = (BootstrapContext) BOOTSTRAP_CONTEXT_CONSTRUCTOR.invoke(plugin.getPluginMeta(), plugin.getDataPath(), plugin.getComponentLogger(), plugin.getFile().toPath()); + fakeContext.getLifecycleManager().registerEventHandler(LifecycleEvents.TAGS.postFlatten(RegistryKey.BLOCK), event -> { + Map, Collection>> allTags = event.registrar().getAllTags(); + for (Map.Entry, Set>> entry : modifiedTags.entrySet()) { + TypedKey blockType = entry.getKey(); + Set> tags = entry.getValue(); + for (Map.Entry, Collection>> tagEntry : allTags.entrySet()) { + TagKey tagKey = tagEntry.getKey(); + Collection> values = tagEntry.getValue(); + if (values.contains(blockType) && !tags.contains(tagKey)) { + List> modifiedValues = new ArrayList<>(values); + modifiedValues.remove(blockType); + event.registrar().setTag(tagKey, modifiedValues); + } + } + for (TagKey tag : tags) { + event.registrar().addToTag(tag, List.of(blockType)); + } + } + }); + } + catch (Throwable e) { + Debug.echoError(e); + } + } + + @EventHandler + public void onServerTickEnd(ServerTickEndEvent event) { + if (batchReloadNeeded) { + batchReloadNeeded = false; + Bukkit.reloadData(); + } + } + + public void setTags(Material material, Set tags) { + TypedKey blockKey = TypedKey.create(RegistryKey.BLOCK, material.getKey()); + Set> tagKeys = tags.stream().map(tag -> TagKey.create(RegistryKey.BLOCK, tag)).collect(Collectors.toCollection(HashSet::new)); + Set> oldTagKeys = modifiedTags.put(blockKey, tagKeys); + if (tagKeys.equals(oldTagKeys)) { + return; + } + VanillaTagHelper.tagsByMaterial.put(material, tags.stream().map(Utilities::namespacedKeyToString).collect(Collectors.toCollection(HashSet::new))); + batchReloadNeeded = true; + } +} diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/utilities/PaperAPIToolsImpl.java b/paper/src/main/java/com/denizenscript/denizen/paper/utilities/PaperAPIToolsImpl.java index d6499b8c1e..97d6c9b23c 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/utilities/PaperAPIToolsImpl.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/utilities/PaperAPIToolsImpl.java @@ -393,4 +393,13 @@ public boolean canUseEquipmentSlot(LivingEntity entity, EquipmentSlot slot) { public boolean hasCustomName(PotionMeta meta) { return meta.hasCustomPotionName(); } + + @Override + public void setMaterialTags(Material type, Set tags) { + if (!NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + super.setMaterialTags(type, tags); + return; + } + BlockTagsSetter.INSTANCE.setTags(type, tags); + } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/Denizen.java b/plugin/src/main/java/com/denizenscript/denizen/Denizen.java index 2818fae6fb..1c8699866c 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/Denizen.java +++ b/plugin/src/main/java/com/denizenscript/denizen/Denizen.java @@ -618,4 +618,9 @@ public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) { default -> null; }; } + + @Override + public File getFile() { + return super.getFile(); + } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/BlockHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/BlockHelper.java index 5d4ca46160..64c22afca5 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/BlockHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/BlockHelper.java @@ -3,10 +3,7 @@ import com.denizenscript.denizen.nms.util.PlayerProfile; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; import com.denizenscript.denizen.objects.EntityTag; -import org.bukkit.Color; -import org.bukkit.Instrument; -import org.bukkit.Location; -import org.bukkit.Material; +import org.bukkit.*; import org.bukkit.block.*; import org.bukkit.block.data.BlockData; import org.bukkit.inventory.ItemStack; @@ -92,7 +89,7 @@ default Color getMapColor(Block block) { // TODO: once 1.20 is the minimum suppo return block.getBlockData().getMapColor(); } - default void setVanillaTags(Material material, Set tags) { + default void setVanillaTags(Material material, Set tags) { // TODO: once 1.21 is the minimum supported version, remove this throw new UnsupportedOperationException(); } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java index 39fcc47173..f51d93531a 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java @@ -394,7 +394,7 @@ public void clientResetLoc(Entity entity) { public abstract void setBoundingBox(Entity entity, BoundingBox box); - public List getPlayersThatSee(Entity entity) { // TODO: once the minimum supported version is 1.20, remove from NMS + public List getPlayersThatSee(Entity entity) { // TODO: once 1.20 is the minimum supported version, remove from NMS return List.copyOf(entity.getTrackedBy()); } @@ -406,7 +406,7 @@ public void sendAllUpdatePackets(Entity entity) { public abstract void setHeadAngle(LivingEntity entity, float angle); - public void setGhastAttacking(Ghast ghast, boolean attacking) { // TODO: once minimum version is 1.19 or higher, remove from NMS + public void setGhastAttacking(Ghast ghast, boolean attacking) { // TODO: once 1.19 is the minimum supported version, remove from NMS ghast.setCharging(attacking); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/PacketHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/PacketHelper.java index 440671baec..9d9ae6ed1d 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/PacketHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/PacketHelper.java @@ -90,7 +90,7 @@ default void showEquipment(Player player, LivingEntity entity, EquipmentSlot equ player.sendEquipmentChange(entity, equipmentSlot, itemStack); } - default void resetEquipment(Player player, LivingEntity entity) { // TODO: once minimum version is 1.19 or higher, remove from NMS + default void resetEquipment(Player player, LivingEntity entity) { // TODO: once 1.19 is the minimum supported version, remove from NMS EntityEquipment equipment = entity.getEquipment(); Map equipmentMap = new EnumMap<>(EquipmentSlot.class); for (EquipmentSlot slot : EquipmentSlot.values()) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/PlayerHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/PlayerHelper.java index ae8714eb67..bf5eeeca42 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/PlayerHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/PlayerHelper.java @@ -86,7 +86,7 @@ public enum SkinLayer { public enum ProfileEditMode { ADD, UPDATE_DISPLAY, UPDATE_LATENCY, UPDATE_GAME_MODE, UPDATE_LISTED } - public void sendPlayerInfoAddPacket(Player player, EnumSet editModes, String name, String display, UUID id, String texture, String signature, int latency, GameMode gameMode, boolean listed) { // TODO: once minimum version is 1.19 or higher, rename to 'sendPlayerInfoUpdatePacket' + public void sendPlayerInfoAddPacket(Player player, EnumSet editModes, String name, String display, UUID id, String texture, String signature, int latency, GameMode gameMode, boolean listed) { // TODO: once 1.19 is the minimum supported version, rename to 'sendPlayerInfoUpdatePacket' throw new UnsupportedOperationException(); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/MaterialTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/MaterialTag.java index 851e965d4d..dd5cd4b5ec 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/MaterialTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/MaterialTag.java @@ -5,6 +5,7 @@ import com.denizenscript.denizen.nms.interfaces.BlockHelper; import com.denizenscript.denizen.objects.properties.material.*; import com.denizenscript.denizen.utilities.BukkitImplDeprecations; +import com.denizenscript.denizen.utilities.PaperAPITools; import com.denizenscript.denizen.utilities.VanillaTagHelper; import com.denizenscript.denizencore.DenizenCore; import com.denizenscript.denizencore.events.ScriptEvent; @@ -710,7 +711,7 @@ public void adjust(Mechanism mechanism) { // @description // Sets a material's vanilla tags. // Any tag name will be accepted - meaning, any tag name input will be added to the material, regardless of whether it previously existed or not. - // Note that this gets reset once server resources are reloaded (see <@link event server resources reloaded>). + // This will work at any time, but applying your changes once during <@link event server prestart> is recommended, as usages require a server resources reload. // @tags // // @example @@ -725,15 +726,16 @@ public void adjust(Mechanism mechanism) { // --> if (!mechanism.isProperty && mechanism.matches("vanilla_tags") && mechanism.requireObject(ListTag.class)) { ListTag input = mechanism.valueAsType(ListTag.class); - Set tags = new HashSet<>(); + Set tags = new HashSet<>(); for (String tag : input) { - if (!VanillaTagHelper.isValidTagName(tag)) { + NamespacedKey tagKey = NamespacedKey.fromString(tag); + if (tagKey == null) { mechanism.echoError("Invalid tag name '" + tag + "' inputted."); continue; } - tags.add(tag); + tags.add(tagKey); } - NMSHandler.blockHelper.setVanillaTags(material, tags); + PaperAPITools.instance.setMaterialTags(material, tags); } // TODO: 1.20.6: need an ItemTag variant providing the proper functionality, and then deprecate this diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/PaperAPITools.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/PaperAPITools.java index 3eb86b9e5c..27fc137532 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/PaperAPITools.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/PaperAPITools.java @@ -26,6 +26,7 @@ import java.lang.invoke.MethodHandle; import java.util.List; +import java.util.Set; import java.util.function.Predicate; public class PaperAPITools { @@ -223,4 +224,8 @@ public boolean canUseEquipmentSlot(LivingEntity entity, EquipmentSlot slot) { public boolean hasCustomName(PotionMeta meta) { return meta.hasCustomName(); } + + public void setMaterialTags(Material type, Set tags) { + NMSHandler.blockHelper.setVanillaTags(type, tags); + } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/VanillaTagHelper.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/VanillaTagHelper.java index c270b47361..5d5130ddb1 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/VanillaTagHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/VanillaTagHelper.java @@ -2,7 +2,10 @@ import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.NMSVersion; -import org.bukkit.*; +import org.bukkit.Bukkit; +import org.bukkit.Keyed; +import org.bukkit.Material; +import org.bukkit.Tag; import org.bukkit.entity.EntityType; import java.util.HashMap; @@ -19,6 +22,10 @@ public class VanillaTagHelper { public static HashMap> entityTagsByKey = new HashMap<>(); + static { + loadTagsCache(); + } + public static void addOrUpdateMaterialTag(Tag tag) { if (materialTagsByKey.containsKey(tag.getKey().getKey())) { updateMaterialTag(tag); @@ -37,6 +44,7 @@ public static void addOrUpdateEntityTag(Tag tag) { } } + // TODO: once 1.21 is the minimum supported version, remove this and related methods static void update(Tag tag, HashMap> tagByObj, HashMap> objByTag) { String tagName = Utilities.namespacedKeyToString(tag.getKey()); Set objs = objByTag.get(tagName); @@ -84,7 +92,11 @@ static void addEntityTag(Tag tag) { add(tag, tagsByEntity, entityTagsByKey); } - static { + public static void loadTagsCache() { + tagsByMaterial.clear(); + materialTagsByKey.clear(); + tagsByEntity.clear(); + entityTagsByKey.clear(); for (Tag tag : Bukkit.getTags("blocks", Material.class)) { addMaterialTag(tag); } @@ -97,8 +109,4 @@ static void addEntityTag(Tag tag) { addMaterialTag(tag); } } - - public static boolean isValidTagName(String name) { - return name != null && !name.isEmpty() && NamespacedKey.fromString(name) != null; - } } diff --git a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/BlockHelperImpl.java b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/BlockHelperImpl.java index 164ed9cf1e..3945af6a4b 100644 --- a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/BlockHelperImpl.java +++ b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/BlockHelperImpl.java @@ -17,7 +17,6 @@ import net.minecraft.core.Registry; import net.minecraft.core.*; import net.minecraft.network.protocol.game.ClientboundUpdateTagsPacket; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.tags.TagKey; import net.minecraft.tags.TagNetworkSerialization; @@ -48,6 +47,7 @@ import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_18_R2.tag.CraftBlockTag; import org.bukkit.craftbukkit.v1_18_R2.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_18_R2.util.CraftNamespacedKey; import org.bukkit.entity.Player; import java.lang.invoke.MethodHandle; @@ -337,7 +337,7 @@ public Color getMapColor(Block block) { public static MethodHandle Holder_Reference_bindTags = ReflectionHelper.getMethodHandle(Holder.Reference.class, ReflectionMappingsInfo.Holder_Reference_bindTags, Collection.class); @Override - public void setVanillaTags(Material material, Set tags) { + public void setVanillaTags(Material material, Set tags) { Holder nmsHolder = getMaterialBlock(material).builtInRegistryHolder(); nmsHolder.tags().forEach(nmsTag -> { HolderSet.Named nmsHolderSet = Registry.BLOCK.getTag(nmsTag).orElse(null); @@ -355,8 +355,8 @@ public void setVanillaTags(Material material, Set tags) { VanillaTagHelper.updateMaterialTag(new CraftBlockTag(Registry.BLOCK, nmsTag)); }); List> newNmsTags = new ArrayList<>(); - for (String tag : tags) { - TagKey newNmsTag = TagKey.create(Registry.BLOCK_REGISTRY, new ResourceLocation(tag)); + for (NamespacedKey tag : tags) { + TagKey newNmsTag = TagKey.create(Registry.BLOCK_REGISTRY, CraftNamespacedKey.toMinecraft(tag)); HolderSet.Named nmsHolderSet = Registry.BLOCK.getOrCreateTag(newNmsTag); List> nmsHolders = nmsHolderSet.stream().collect(Collectors.toCollection(ArrayList::new)); nmsHolders.add(nmsHolder); diff --git a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/BlockHelperImpl.java b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/BlockHelperImpl.java index 545112f4ae..16662252dc 100644 --- a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/BlockHelperImpl.java +++ b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/BlockHelperImpl.java @@ -19,7 +19,6 @@ import net.minecraft.core.HolderSet; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.protocol.game.ClientboundUpdateTagsPacket; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.tags.TagKey; import net.minecraft.tags.TagNetworkSerialization; @@ -53,6 +52,7 @@ import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_19_R3.tag.CraftBlockTag; import org.bukkit.craftbukkit.v1_19_R3.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_19_R3.util.CraftNamespacedKey; import org.bukkit.entity.Player; import java.lang.invoke.MethodHandle; @@ -316,7 +316,7 @@ public Color getMapColor(Block block) { public static MethodHandle Holder_Reference_bindTags = ReflectionHelper.getMethodHandle(Holder.Reference.class, ReflectionMappingsInfo.HolderReference_bindTags_method, Collection.class); @Override - public void setVanillaTags(Material material, Set tags) { + public void setVanillaTags(Material material, Set tags) { Holder nmsHolder = getMaterialBlock(material).builtInRegistryHolder(); nmsHolder.tags().forEach(nmsTag -> { HolderSet.Named nmsHolderSet = BuiltInRegistries.BLOCK.getTag(nmsTag).orElse(null); @@ -334,8 +334,8 @@ public void setVanillaTags(Material material, Set tags) { VanillaTagHelper.updateMaterialTag(new CraftBlockTag(BuiltInRegistries.BLOCK, nmsTag)); }); List> newNmsTags = new ArrayList<>(); - for (String tag : tags) { - TagKey newNmsTag = TagKey.create(BuiltInRegistries.BLOCK.key(), new ResourceLocation(tag)); + for (NamespacedKey tag : tags) { + TagKey newNmsTag = TagKey.create(BuiltInRegistries.BLOCK.key(), CraftNamespacedKey.toMinecraft(tag)); HolderSet.Named nmsHolderSet = BuiltInRegistries.BLOCK.getOrCreateTag(newNmsTag); List> nmsHolders = nmsHolderSet.stream().collect(Collectors.toCollection(ArrayList::new)); nmsHolders.add(nmsHolder); diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java index 496ab68789..f7f8b114f0 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java @@ -19,7 +19,6 @@ import net.minecraft.core.HolderSet; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.protocol.common.ClientboundUpdateTagsPacket; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.tags.TagKey; import net.minecraft.tags.TagNetworkSerialization; @@ -36,10 +35,7 @@ import net.minecraft.world.level.chunk.status.ChunkStatus; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.PushReaction; -import org.bukkit.Bukkit; -import org.bukkit.Instrument; -import org.bukkit.Location; -import org.bukkit.Material; +import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.block.CreatureSpawner; @@ -57,6 +53,7 @@ import org.bukkit.craftbukkit.v1_20_R4.tag.CraftBlockTag; import org.bukkit.craftbukkit.v1_20_R4.util.CraftLocation; import org.bukkit.craftbukkit.v1_20_R4.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftNamespacedKey; import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; @@ -272,7 +269,7 @@ public void setSpawnerCustomRules(CreatureSpawner spawner, int skyMin, int skyMa public static final MethodHandle HOLDER_REFERENCE_BINDTAGS = ReflectionHelper.getMethodHandle(Holder.Reference.class, ReflectionMappingsInfo.HolderReference_bindTags_method, Collection.class); @Override - public void setVanillaTags(Material material, Set tags) { + public void setVanillaTags(Material material, Set tags) { Holder nmsHolder = CraftMagicNumbers.getBlock(material).builtInRegistryHolder(); nmsHolder.tags().forEach(nmsTag -> { HolderSet.Named nmsHolderSet = BuiltInRegistries.BLOCK.getTag(nmsTag).orElse(null); @@ -290,8 +287,8 @@ public void setVanillaTags(Material material, Set tags) { VanillaTagHelper.updateMaterialTag(new CraftBlockTag(BuiltInRegistries.BLOCK, nmsTag)); }); List> newNmsTags = new ArrayList<>(); - for (String tag : tags) { - TagKey newNmsTag = TagKey.create(BuiltInRegistries.BLOCK.key(), new ResourceLocation(tag)); + for (NamespacedKey tag : tags) { + TagKey newNmsTag = TagKey.create(BuiltInRegistries.BLOCK.key(), CraftNamespacedKey.toMinecraft(tag)); HolderSet.Named nmsHolderSet = BuiltInRegistries.BLOCK.getOrCreateTag(newNmsTag); List> nmsHolders = nmsHolderSet.stream().collect(Collectors.toCollection(ArrayList::new)); nmsHolders.add(nmsHolder); diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java index b828715671..4d4ff986fe 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java @@ -14,8 +14,6 @@ import com.google.common.collect.Iterables; import com.mojang.authlib.GameProfile; import net.minecraft.core.BlockPos; -import net.minecraft.core.Holder; -import net.minecraft.core.HolderSet; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.InclusiveRange; import net.minecraft.util.random.SimpleWeightedRandomList; @@ -51,7 +49,7 @@ import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; -import java.util.*; +import java.util.Optional; public class BlockHelperImpl implements BlockHelper { @@ -257,50 +255,4 @@ public void setSpawnerCustomRules(CreatureSpawner spawner, int skyMin, int skyMa Debug.echoError(ex); } } - - public static final MethodHandle HOLDERSET_NAMED_BIND = ReflectionHelper.getMethodHandle(HolderSet.Named.class, ReflectionMappingsInfo.HolderSetNamed_bind_method, List.class); - public static final MethodHandle HOLDER_REFERENCE_BINDTAGS = ReflectionHelper.getMethodHandle(Holder.Reference.class, ReflectionMappingsInfo.HolderReference_bindTags_method, Collection.class); - - // TODO: 1.21.3: decently large internal changes - should probably look into implementing with Paper's API? -// @Override -// public void setVanillaTags(Material material, Set tags) { -// Holder nmsHolder = CraftMagicNumbers.getBlock(material).builtInRegistryHolder(); -// nmsHolder.tags().forEach(nmsTag -> { -// HolderSet.Named nmsHolderSet = BuiltInRegistries.BLOCK.get(nmsTag).orElse(null); -// if (nmsHolderSet == null) { -// return; -// } -// List> nmsHolders = nmsHolderSet.stream().collect(Collectors.toCollection(ArrayList::new)); -// nmsHolders.remove(nmsHolder); -// try { -// HOLDERSET_NAMED_BIND.invoke(nmsHolderSet, nmsHolders); -// } -// catch (Throwable ex) { -// Debug.echoError(ex); -// } -// VanillaTagHelper.updateMaterialTag(new CraftBlockTag(BuiltInRegistries.BLOCK, nmsTag)); -// }); -// List> newNmsTags = new ArrayList<>(); -// for (String tag : tags) { -// TagKey newNmsTag = TagKey.create(BuiltInRegistries.BLOCK.key(), ResourceLocation.withDefaultNamespace(tag)); -// HolderSet.Named nmsHolderSet = BuiltInRegistries.BLOCK.getOrCreateTag(newNmsTag); -// List> nmsHolders = nmsHolderSet.stream().collect(Collectors.toCollection(ArrayList::new)); -// nmsHolders.add(nmsHolder); -// try { -// HOLDERSET_NAMED_BIND.invoke(nmsHolderSet, nmsHolders); -// } -// catch (Throwable ex) { -// Debug.echoError(ex); -// } -// newNmsTags.add(newNmsTag); -// VanillaTagHelper.addOrUpdateMaterialTag(new CraftBlockTag(BuiltInRegistries.BLOCK, newNmsTag)); -// } -// try { -// HOLDER_REFERENCE_BINDTAGS.invoke(nmsHolder, newNmsTags); -// } -// catch (Throwable ex) { -// Debug.echoError(ex); -// } -// PacketHelperImpl.broadcast(new ClientboundUpdateTagsPacket(TagNetworkSerialization.serializeTagsToNetwork(((CraftServer) Bukkit.getServer()).getServer().registries()))); -// } } From 2c1c79d5c33e3ee607cf8beac0fa514091ebec57 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Thu, 27 Mar 2025 05:46:14 -0700 Subject: [PATCH 142/280] 1.21.5 part 1: versions n stuff --- README.md | 2 +- paper/pom.xml | 2 +- plugin/pom.xml | 4 ++-- v1_21/pom.xml | 12 ++++++------ 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 7200fd8682..6ed59e5f36 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ The Denizen Scripting Language - Spigot Impl An implementation of the Denizen Scripting Language for Spigot servers, with strong Citizens interlinks to emphasize the power of using Denizen with NPCs! -**Version 1.3.1**: Compatible with Spigot 1.17.1, 1.18.2, 1.19.4, 1.20.6, and 1.21.4! +**Version 1.3.1**: Compatible with Spigot 1.17.1, 1.18.2, 1.19.4, 1.20.6, and 1.21.5! **Learn about Denizen from the Beginner's guide:** https://guide.denizenscript.com/guides/background/index.html diff --git a/paper/pom.xml b/paper/pom.xml index 1f4c4e1d40..e6fc8d975a 100644 --- a/paper/pom.xml +++ b/paper/pom.xml @@ -31,7 +31,7 @@ net.citizensnpcs citizens-main - 2.0.37-SNAPSHOT + 2.0.38-SNAPSHOT jar provided diff --git a/plugin/pom.xml b/plugin/pom.xml index 98319c89a9..859951698d 100644 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -30,7 +30,7 @@ org.spigotmc spigot-api - 1.21.4-R0.1-SNAPSHOT + 1.21.5-R0.1-SNAPSHOT jar provided @@ -44,7 +44,7 @@ net.citizensnpcs citizens-main - 2.0.37-SNAPSHOT + 2.0.38-SNAPSHOT jar provided diff --git a/v1_21/pom.xml b/v1_21/pom.xml index 680fa5aeab..bdfa91e164 100644 --- a/v1_21/pom.xml +++ b/v1_21/pom.xml @@ -19,13 +19,13 @@ org.spigotmc spigot-api - 1.21.4-R0.1-SNAPSHOT + 1.21.5-R0.1-SNAPSHOT provided org.spigotmc spigot - 1.21.4-R0.1-SNAPSHOT + 1.21.5-R0.1-SNAPSHOT remapped-mojang provided @@ -45,9 +45,9 @@ remap-obf - org.spigotmc:minecraft-server:1.21.4-R0.1-SNAPSHOT:txt:maps-mojang + org.spigotmc:minecraft-server:1.21.5-R0.1-SNAPSHOT:txt:maps-mojang true - org.spigotmc:spigot:1.21.4-R0.1-SNAPSHOT:jar:remapped-mojang + org.spigotmc:spigot:1.21.5-R0.1-SNAPSHOT:jar:remapped-mojang true remapped-obf @@ -60,8 +60,8 @@ remap-spigot ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar - org.spigotmc:minecraft-server:1.21.4-R0.1-SNAPSHOT:csrg:maps-spigot - org.spigotmc:spigot:1.21.4-R0.1-SNAPSHOT:jar:remapped-obf + org.spigotmc:minecraft-server:1.21.5-R0.1-SNAPSHOT:csrg:maps-spigot + org.spigotmc:spigot:1.21.5-R0.1-SNAPSHOT:jar:remapped-obf From cc76fad70ba32a3e88a46176f70aa4c647ab1f1c Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Thu, 27 Mar 2025 05:46:56 -0700 Subject: [PATCH 143/280] 1.21.5 part 2: import vers --- .../denizen/nms/v1_21/Handler.java | 24 +++++++++---------- .../v1_21/helpers/AdvancementHelperImpl.java | 8 +++---- .../v1_21/helpers/AnimationHelperImpl.java | 6 ++--- .../nms/v1_21/helpers/BlockHelperImpl.java | 22 ++++++++--------- .../nms/v1_21/helpers/ChunkHelperImpl.java | 4 ++-- .../v1_21/helpers/CustomEntityHelperImpl.java | 4 ++-- .../nms/v1_21/helpers/EntityHelperImpl.java | 16 ++++++------- .../nms/v1_21/helpers/FishingHelperImpl.java | 8 +++---- .../nms/v1_21/helpers/ItemHelperImpl.java | 18 +++++++------- .../nms/v1_21/helpers/PacketHelperImpl.java | 16 ++++++------- .../nms/v1_21/helpers/PlayerHelperImpl.java | 16 ++++++------- .../nms/v1_21/helpers/WorldHelperImpl.java | 2 +- .../denizen/nms/v1_21/impl/BiomeNMSImpl.java | 8 +++---- .../v1_21/impl/ImprovedOfflinePlayerImpl.java | 10 ++++---- .../nms/v1_21/impl/ProfileEditorImpl.java | 4 ++-- .../nms/v1_21/impl/blocks/BlockLightImpl.java | 4 ++-- .../impl/entities/CraftFakeArrowImpl.java | 4 ++-- .../impl/entities/CraftFakePlayerImpl.java | 4 ++-- .../entities/CraftItemProjectileImpl.java | 6 ++--- .../impl/entities/EntityFakeArrowImpl.java | 4 ++-- .../impl/entities/EntityFakePlayerImpl.java | 2 +- .../entities/EntityItemProjectileImpl.java | 2 +- .../handlers/AbstractListenerPlayInImpl.java | 2 +- .../handlers/DenizenNetworkManagerImpl.java | 6 ++--- .../handlers/DenizenPacketListenerImpl.java | 2 +- .../network/handlers/FakeBlockHelper.java | 8 +++---- .../packet/ActionBarEventPacketHandlers.java | 2 +- .../handlers/packet/AttachPacketHandlers.java | 4 ++-- .../packet/DisguisePacketHandlers.java | 2 +- .../packet/FakeEquipmentPacketHandlers.java | 2 +- .../packet/HideParticlesPacketHandlers.java | 2 +- .../network/packets/PacketOutChatImpl.java | 2 +- 32 files changed, 112 insertions(+), 112 deletions(-) diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java index 4130a8a13a..f69c3b14d8 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java @@ -64,18 +64,18 @@ import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.boss.BossBar; -import org.bukkit.craftbukkit.v1_21_R3.CraftServer; -import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R3.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_21_R3.boss.CraftBossBar; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftInventory; -import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftInventoryCustom; -import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftInventoryView; -import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R3.legacy.FieldRename; -import org.bukkit.craftbukkit.v1_21_R3.persistence.CraftPersistentDataContainer; -import org.bukkit.craftbukkit.v1_21_R3.util.*; +import org.bukkit.craftbukkit.v1_21_R4.CraftServer; +import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R4.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_21_R4.boss.CraftBossBar; +import org.bukkit.craftbukkit.v1_21_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftInventory; +import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftInventoryCustom; +import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftInventoryView; +import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R4.legacy.FieldRename; +import org.bukkit.craftbukkit.v1_21_R4.persistence.CraftPersistentDataContainer; +import org.bukkit.craftbukkit.v1_21_R4.util.*; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java index 9b001676ad..663e034d97 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java @@ -13,10 +13,10 @@ import net.minecraft.server.ServerAdvancementManager; import net.minecraft.server.level.ServerPlayer; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_21_R3.CraftServer; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R3.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.v1_21_R4.CraftServer; +import org.bukkit.craftbukkit.v1_21_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R4.util.CraftNamespacedKey; import org.bukkit.entity.Player; import java.util.*; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AnimationHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AnimationHelperImpl.java index 456a1ef965..bbaf261e83 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AnimationHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AnimationHelperImpl.java @@ -2,9 +2,9 @@ import com.denizenscript.denizen.nms.abstracts.AnimationHelper; import net.minecraft.world.entity.Entity; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftHorse; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPolarBear; +import org.bukkit.craftbukkit.v1_21_R4.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R4.entity.CraftHorse; +import org.bukkit.craftbukkit.v1_21_R4.entity.CraftPolarBear; import org.bukkit.entity.EntityType; import org.bukkit.entity.Horse; import org.bukkit.entity.IronGolem; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java index 4d4ff986fe..7263f2529d 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java @@ -35,17 +35,17 @@ import org.bukkit.block.BlockState; import org.bukkit.block.CreatureSpawner; import org.bukkit.block.Skull; -import org.bukkit.craftbukkit.v1_21_R3.CraftChunk; -import org.bukkit.craftbukkit.v1_21_R3.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R3.block.CraftBlock; -import org.bukkit.craftbukkit.v1_21_R3.block.CraftBlockEntityState; -import org.bukkit.craftbukkit.v1_21_R3.block.CraftCreatureSpawner; -import org.bukkit.craftbukkit.v1_21_R3.block.CraftSkull; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R3.util.CraftLocation; -import org.bukkit.craftbukkit.v1_21_R3.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_21_R4.CraftChunk; +import org.bukkit.craftbukkit.v1_21_R4.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R4.block.CraftBlock; +import org.bukkit.craftbukkit.v1_21_R4.block.CraftBlockEntityState; +import org.bukkit.craftbukkit.v1_21_R4.block.CraftCreatureSpawner; +import org.bukkit.craftbukkit.v1_21_R4.block.CraftSkull; +import org.bukkit.craftbukkit.v1_21_R4.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R4.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R4.util.CraftMagicNumbers; import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ChunkHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ChunkHelperImpl.java index 883a644e12..bca77a8ee6 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ChunkHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ChunkHelperImpl.java @@ -20,8 +20,8 @@ import net.minecraft.world.level.levelgen.Heightmap; import org.bukkit.Chunk; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_21_R3.CraftChunk; -import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R4.CraftChunk; +import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/CustomEntityHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/CustomEntityHelperImpl.java index 9ee131436a..ebb2becbeb 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/CustomEntityHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/CustomEntityHelperImpl.java @@ -20,8 +20,8 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftItemStack; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.scoreboard.Scoreboard; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java index 26bdd1c342..49fca76853 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java @@ -66,14 +66,14 @@ import org.bukkit.attribute.AttributeInstance; import org.bukkit.block.CreatureSpawner; import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_21_R3.CraftServer; -import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R3.block.CraftBlock; -import org.bukkit.craftbukkit.v1_21_R3.block.CraftCreatureSpawner; -import org.bukkit.craftbukkit.v1_21_R3.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_21_R3.entity.*; -import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R3.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R4.CraftServer; +import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R4.block.CraftBlock; +import org.bukkit.craftbukkit.v1_21_R4.block.CraftCreatureSpawner; +import org.bukkit.craftbukkit.v1_21_R4.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_21_R4.entity.*; +import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R4.util.CraftLocation; import org.bukkit.entity.*; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.inventory.EquipmentSlot; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java index badb0998db..17a1111dab 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java @@ -18,10 +18,10 @@ import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.phys.Vec3; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftFishHook; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R4.entity.CraftFishHook; +import org.bukkit.craftbukkit.v1_21_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftItemStack; import org.bukkit.entity.FishHook; import org.bukkit.entity.Player; import org.bukkit.event.entity.CreatureSpawnEvent; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java index 605481b7fd..b3bd434e93 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java @@ -72,15 +72,15 @@ import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_21_R3.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R3.CraftServer; -import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R3.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R3.inventory.*; -import org.bukkit.craftbukkit.v1_21_R3.map.CraftMapView; -import org.bukkit.craftbukkit.v1_21_R3.util.CraftMagicNumbers; -import org.bukkit.craftbukkit.v1_21_R3.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.v1_21_R4.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R4.CraftServer; +import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R4.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_21_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R4.inventory.*; +import org.bukkit.craftbukkit.v1_21_R4.map.CraftMapView; +import org.bukkit.craftbukkit.v1_21_R4.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_21_R4.util.CraftNamespacedKey; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.inventory.ShapedRecipe; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java index 900146fd23..6415ae381e 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java @@ -50,14 +50,14 @@ import org.bukkit.block.Sign; import org.bukkit.block.sign.Side; import org.bukkit.block.sign.SignSide; -import org.bukkit.craftbukkit.v1_21_R3.CraftServer; -import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R3.map.CraftMapCanvas; -import org.bukkit.craftbukkit.v1_21_R3.map.CraftMapView; -import org.bukkit.craftbukkit.v1_21_R3.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R4.CraftServer; +import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R4.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R4.map.CraftMapCanvas; +import org.bukkit.craftbukkit.v1_21_R4.map.CraftMapView; +import org.bukkit.craftbukkit.v1_21_R4.util.CraftLocation; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java index f5dc481589..4e49f8c547 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java @@ -57,14 +57,14 @@ import net.minecraft.world.phys.AABB; import org.bukkit.*; import org.bukkit.boss.BossBar; -import org.bukkit.craftbukkit.v1_21_R3.CraftServer; -import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R3.boss.CraftBossBar; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R3.util.CraftMagicNumbers; -import org.bukkit.craftbukkit.v1_21_R3.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.v1_21_R4.CraftServer; +import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R4.boss.CraftBossBar; +import org.bukkit.craftbukkit.v1_21_R4.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R4.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_21_R4.util.CraftNamespacedKey; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java index f97dff634d..fd64fca79e 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java @@ -16,7 +16,7 @@ import net.minecraft.world.level.storage.PrimaryLevelData; import org.bukkit.Location; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; public class WorldHelperImpl implements WorldHelper { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java index b978537b17..48f7351f98 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java @@ -19,10 +19,10 @@ import org.bukkit.Location; import org.bukkit.NamespacedKey; import org.bukkit.block.Block; -import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftEntityType; -import org.bukkit.craftbukkit.v1_21_R3.util.CraftLocation; -import org.bukkit.craftbukkit.v1_21_R3.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R4.entity.CraftEntityType; +import org.bukkit.craftbukkit.v1_21_R4.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R4.util.CraftNamespacedKey; import org.bukkit.entity.EntityType; import java.lang.invoke.MethodHandle; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java index 4f20342632..15cfdceeff 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java @@ -21,11 +21,11 @@ import net.minecraft.world.inventory.PlayerEnderChestContainer; import org.bukkit.Bukkit; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_21_R3.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R3.CraftServer; -import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftInventory; -import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftInventoryPlayer; +import org.bukkit.craftbukkit.v1_21_R4.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R4.CraftServer; +import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftInventory; +import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftInventoryPlayer; import org.bukkit.entity.HumanEntity; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java index 6ec362989b..2ab19482e9 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java @@ -19,8 +19,8 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_21_R3.CraftServer; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R4.CraftServer; +import org.bukkit.craftbukkit.v1_21_R4.entity.CraftPlayer; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerRespawnEvent; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/blocks/BlockLightImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/blocks/BlockLightImpl.java index a594380a30..46bfabb0c5 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/blocks/BlockLightImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/blocks/BlockLightImpl.java @@ -21,8 +21,8 @@ import net.minecraft.world.level.lighting.LevelLightEngine; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R3.CraftChunk; -import org.bukkit.craftbukkit.v1_21_R3.block.CraftBlock; +import org.bukkit.craftbukkit.v1_21_R4.CraftChunk; +import org.bukkit.craftbukkit.v1_21_R4.block.CraftBlock; import org.bukkit.util.Vector; import java.lang.invoke.MethodHandle; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakeArrowImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakeArrowImpl.java index a6ce25b9ed..dd58b19bb1 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakeArrowImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakeArrowImpl.java @@ -2,8 +2,8 @@ import com.denizenscript.denizen.nms.interfaces.FakeArrow; import net.minecraft.world.entity.projectile.AbstractArrow; -import org.bukkit.craftbukkit.v1_21_R3.CraftServer; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftAbstractArrow; +import org.bukkit.craftbukkit.v1_21_R4.CraftServer; +import org.bukkit.craftbukkit.v1_21_R4.entity.CraftAbstractArrow; public class CraftFakeArrowImpl extends CraftAbstractArrow implements FakeArrow { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakePlayerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakePlayerImpl.java index 4d8f9fac7d..723d99e8f4 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakePlayerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakePlayerImpl.java @@ -4,8 +4,8 @@ import com.denizenscript.denizen.nms.NMSHandler; import org.bukkit.Material; import org.bukkit.block.Block; -import org.bukkit.craftbukkit.v1_21_R3.CraftServer; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R4.CraftServer; +import org.bukkit.craftbukkit.v1_21_R4.entity.CraftPlayer; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.metadata.MetadataValue; import org.bukkit.plugin.Plugin; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftItemProjectileImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftItemProjectileImpl.java index ba0e570a90..cebab39c5c 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftItemProjectileImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftItemProjectileImpl.java @@ -3,9 +3,9 @@ import com.denizenscript.denizen.nms.interfaces.ItemProjectile; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; -import org.bukkit.craftbukkit.v1_21_R3.CraftServer; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R4.CraftServer; +import org.bukkit.craftbukkit.v1_21_R4.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftItemStack; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; import org.bukkit.projectiles.ProjectileSource; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakeArrowImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakeArrowImpl.java index b8e31cba26..0f08e5d04f 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakeArrowImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakeArrowImpl.java @@ -7,8 +7,8 @@ import net.minecraft.world.item.Items; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R3.CraftServer; -import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R4.CraftServer; +import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; import org.bukkit.event.entity.CreatureSpawnEvent; public class EntityFakeArrowImpl extends SpectralArrow { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakePlayerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakePlayerImpl.java index 69754b932e..cd7e94c98c 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakePlayerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakePlayerImpl.java @@ -15,7 +15,7 @@ import net.minecraft.server.network.CommonListenerCookie; import net.minecraft.world.entity.player.Player; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_21_R3.CraftServer; +import org.bukkit.craftbukkit.v1_21_R4.CraftServer; import org.bukkit.event.entity.CreatureSpawnEvent; public class EntityFakePlayerImpl extends ServerPlayer { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java index e138391cb3..c38740bb18 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java @@ -14,7 +14,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R3.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R4.CraftRegistry; import java.lang.invoke.MethodHandle; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java index 79af1a511d..d0aebda88d 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java @@ -28,7 +28,7 @@ import net.minecraft.world.entity.Relative; import net.minecraft.world.phys.Vec3; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R4.entity.CraftPlayer; import org.bukkit.event.player.PlayerTeleportEvent; import java.lang.reflect.Field; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java index de41ede63c..4917e1b4ef 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -31,9 +31,9 @@ import net.minecraft.util.debugchart.LocalSampleLogger; import org.bukkit.Bukkit; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_21_R3.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R4.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R4.entity.CraftPlayer; import org.bukkit.entity.Player; import javax.annotation.Nullable; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java index 21d9751669..0818313739 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java @@ -18,7 +18,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.CommonListenerCookie; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_21_R3.block.CraftBlock; +import org.bukkit.craftbukkit.v1_21_R4.block.CraftBlock; import org.bukkit.event.block.SignChangeEvent; public class DenizenPacketListenerImpl extends AbstractListenerPlayInImpl { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java index 28ff71552e..697d008584 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java @@ -23,10 +23,10 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.PalettedContainer; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_21_R3.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R3.block.CraftBlockStates; -import org.bukkit.craftbukkit.v1_21_R3.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_21_R4.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R4.block.CraftBlockStates; +import org.bukkit.craftbukkit.v1_21_R4.block.data.CraftBlockData; import java.lang.invoke.MethodHandle; import java.lang.reflect.Constructor; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/ActionBarEventPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/ActionBarEventPacketHandlers.java index cbd336cbfe..c83a82bb4d 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/ActionBarEventPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/ActionBarEventPacketHandlers.java @@ -8,7 +8,7 @@ import com.denizenscript.denizencore.objects.core.ElementTag; import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundSetActionBarTextPacket; -import org.bukkit.craftbukkit.v1_21_R3.util.CraftChatMessage; +import org.bukkit.craftbukkit.v1_21_R4.util.CraftChatMessage; public class ActionBarEventPacketHandlers { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java index e43461586f..c854fffca9 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java @@ -13,8 +13,8 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.PositionMoveRotation; import net.minecraft.world.phys.Vec3; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R3.util.CraftVector; +import org.bukkit.craftbukkit.v1_21_R4.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R4.util.CraftVector; import org.bukkit.util.Vector; import java.lang.reflect.Field; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java index c9a71b1573..635331b1a9 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java @@ -14,7 +14,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.PositionMoveRotation; import net.minecraft.world.level.Level; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R4.entity.CraftEntity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java index c319db2ec6..c211f4f9dc 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java @@ -12,7 +12,7 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; -import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftItemStack; import java.util.ArrayList; import java.util.List; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HideParticlesPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HideParticlesPacketHandlers.java index 5317f47957..cf1c5b035e 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HideParticlesPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HideParticlesPacketHandlers.java @@ -4,7 +4,7 @@ import com.denizenscript.denizen.utilities.packets.HideParticles; import net.minecraft.network.protocol.game.ClientboundLevelParticlesPacket; import org.bukkit.Particle; -import org.bukkit.craftbukkit.v1_21_R3.CraftParticle; +import org.bukkit.craftbukkit.v1_21_R4.CraftParticle; import java.util.Set; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java index 3e4b7e5542..1d940c4e69 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java @@ -5,7 +5,7 @@ import net.md_5.bungee.chat.ComponentSerializer; import net.minecraft.network.protocol.game.ClientboundPlayerChatPacket; import net.minecraft.network.protocol.game.ClientboundSystemChatPacket; -import org.bukkit.craftbukkit.v1_21_R3.util.CraftChatMessage; +import org.bukkit.craftbukkit.v1_21_R4.util.CraftChatMessage; public class PacketOutChatImpl extends PacketOutChat { From eaff1764fd52b54622b9a974e2bf36ab9718d85f Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Thu, 27 Mar 2025 06:27:53 -0700 Subject: [PATCH 144/280] 1.21.5 part 3: compiler fixes with a few todo holes --- .../denizen/nms/interfaces/ItemHelper.java | 4 --- .../nms/v1_17/helpers/ItemHelperImpl.java | 10 ------ .../nms/v1_18/helpers/ItemHelperImpl.java | 10 ------ .../nms/v1_19/helpers/ItemHelperImpl.java | 10 ------ .../nms/v1_20/helpers/ItemHelperImpl.java | 10 ------ .../denizen/nms/v1_21/Handler.java | 6 ++-- .../nms/v1_21/ReflectionMappingsInfo.java | 25 ++++++++------- .../v1_21/helpers/AdvancementHelperImpl.java | 31 ++++++------------ .../nms/v1_21/helpers/BlockHelperImpl.java | 4 +-- .../v1_21/helpers/EntityDataNameMapper.java | 2 ++ .../nms/v1_21/helpers/ItemHelperImpl.java | 22 ++++++------- .../nms/v1_21/helpers/PlayerHelperImpl.java | 17 ++++++---- .../nms/v1_21/helpers/WorldHelperImpl.java | 4 +-- .../denizen/nms/v1_21/impl/BiomeNMSImpl.java | 9 +++--- .../v1_21/impl/ImprovedOfflinePlayerImpl.java | 9 +++--- .../entities/EntityItemProjectileImpl.java | 5 +-- .../nms/v1_21/impl/jnbt/CompoundTagImpl.java | 16 +++++----- .../handlers/AbstractListenerPlayInImpl.java | 32 ++++++++++++++++--- .../handlers/DenizenPacketListenerImpl.java | 2 +- .../handlers/packet/AttachPacketHandlers.java | 8 ++--- .../packet/DisguisePacketHandlers.java | 8 ++--- .../packet/FakeEquipmentPacketHandlers.java | 9 +++--- .../packet/HiddenEntitiesPacketHandlers.java | 6 ++-- 23 files changed, 117 insertions(+), 142 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java index 53ab054c1c..e5ee523643 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java @@ -131,10 +131,6 @@ public ItemStack setRawComponentsPatch(ItemStack item, MapTag rawComponentsMap, public abstract void setInventoryItem(Inventory inventory, ItemStack item, int slot); - public abstract IntArrayTag convertUuidToNbt(UUID id); - - public abstract UUID convertNbtToUuid(IntArrayTag id); - public abstract String getDisplayName(ItemTag item); public abstract List getLore(ItemTag item); diff --git a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/ItemHelperImpl.java b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/ItemHelperImpl.java index 9554fd02f7..64f84d2af7 100644 --- a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/ItemHelperImpl.java +++ b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/ItemHelperImpl.java @@ -245,16 +245,6 @@ public void setInventoryItem(Inventory inventory, ItemStack item, int slot) { } } - @Override - public IntArrayTag convertUuidToNbt(UUID id) { - return new IntArrayTag(NbtUtils.createUUID(id).getAsIntArray()); - } - - @Override - public UUID convertNbtToUuid(IntArrayTag id) { - return NbtUtils.loadUUID(new net.minecraft.nbt.IntArrayTag(id.getValue())); - } - @Override public String getDisplayName(ItemTag item) { if (!item.getItemMeta().hasDisplayName()) { diff --git a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/ItemHelperImpl.java b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/ItemHelperImpl.java index c3bbaf5deb..ebf5a6ba37 100644 --- a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/ItemHelperImpl.java +++ b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/ItemHelperImpl.java @@ -242,16 +242,6 @@ public void setInventoryItem(Inventory inventory, ItemStack item, int slot) { } } - @Override - public IntArrayTag convertUuidToNbt(UUID id) { - return new IntArrayTag(NbtUtils.createUUID(id).getAsIntArray()); - } - - @Override - public UUID convertNbtToUuid(IntArrayTag id) { - return NbtUtils.loadUUID(new net.minecraft.nbt.IntArrayTag(id.getValue())); - } - @Override public String getDisplayName(ItemTag item) { if (!item.getItemMeta().hasDisplayName()) { diff --git a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/ItemHelperImpl.java b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/ItemHelperImpl.java index 5987dc44ab..9505e85187 100644 --- a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/ItemHelperImpl.java +++ b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/ItemHelperImpl.java @@ -246,16 +246,6 @@ public void setInventoryItem(Inventory inventory, ItemStack item, int slot) { } } - @Override - public IntArrayTag convertUuidToNbt(UUID id) { - return new IntArrayTag(NbtUtils.createUUID(id).getAsIntArray()); - } - - @Override - public UUID convertNbtToUuid(IntArrayTag id) { - return NbtUtils.loadUUID(new net.minecraft.nbt.IntArrayTag(id.getValue())); - } - @Override public String getDisplayName(ItemTag item) { if (!item.getItemMeta().hasDisplayName()) { diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java index 2e626cd517..651dbe003e 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/ItemHelperImpl.java @@ -443,16 +443,6 @@ public void setInventoryItem(Inventory inventory, ItemStack item, int slot) { } } - @Override - public IntArrayTag convertUuidToNbt(UUID id) { - return new IntArrayTag(NbtUtils.createUUID(id).getAsIntArray()); - } - - @Override - public UUID convertNbtToUuid(IntArrayTag id) { - return NbtUtils.loadUUID(new net.minecraft.nbt.IntArrayTag(id.getValue())); - } - @Override public String getDisplayName(ItemTag item) { if (!item.getItemMeta().hasDisplayName()) { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java index f69c3b14d8..878efc32c3 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java @@ -144,7 +144,7 @@ public void undisableAsyncCatcher() { @Override public boolean isCorrectMappingsCode() { - return CraftMagicNumbers.INSTANCE.getMappingsVersion().equals("60ac387ca8007aa018e6aeb394a6988c"); + return CraftMagicNumbers.INSTANCE.getMappingsVersion().equals("7ecad754373a5fbc43d381d7450c53a5"); } @Override @@ -160,7 +160,7 @@ public CompoundTag createCompoundTag(Map value) { @Override public CompoundTag parseSNBT(String snbt) { try { - return CompoundTagImpl.fromNMSTag(TagParser.parseTag(snbt)); + return CompoundTagImpl.fromNMSTag(TagParser.parseCompoundFully(snbt)); } catch (CommandSyntaxException e) { return null; @@ -349,7 +349,7 @@ public boolean containerHas(PersistentDataContainer container, String key) { public String containerGetString(PersistentDataContainer container, String key) { net.minecraft.nbt.Tag base = ((CraftPersistentDataContainer) container).getRaw().get(key); if (base instanceof StringTag) { - return base.getAsString(); + return base.asString().get(); } else if (base instanceof ByteArrayTag) { return new String(((ByteArrayTag) base).getAsByteArray(), StandardCharsets.UTF_8); diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java index 6a4717e85e..d99843b208 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java @@ -5,35 +5,35 @@ public class ReflectionMappingsInfo { // Content generated by ReflectionMappingsGenerator - https://github.com/DenizenScript/ReflectionMappingsGenerator // net.minecraft.world.level.block.state.BlockBehaviour - public static String BlockBehaviour_explosionResistance = "aI"; + public static String BlockBehaviour_explosionResistance = "G"; // net.minecraft.core.MappedRegistry public static String MappedRegistry_frozen = "l"; public static String MappedRegistry_unregisteredIntrusiveHolders = "m"; // net.minecraft.world.entity.Entity - public static String Entity_onGround = "aD"; + public static String Entity_onGround = "aH"; public static String Entity_DATA_SHARED_FLAGS_ID = "am"; - public static String Entity_DATA_CUSTOM_NAME = "aO"; - public static String Entity_DATA_CUSTOM_NAME_VISIBLE = "aP"; + public static String Entity_DATA_CUSTOM_NAME = "aR"; + public static String Entity_DATA_CUSTOM_NAME_VISIBLE = "aS"; // net.minecraft.world.entity.LivingEntity public static String LivingEntity_attackStrengthTicker = "aS"; - public static String LivingEntity_autoSpinAttackTicks = "bB"; + public static String LivingEntity_autoSpinAttackTicks = "bp"; public static String LivingEntity_setLivingEntityFlag_method = "c"; // net.minecraft.world.entity.player.Player - public static String Player_DATA_PLAYER_ABSORPTION_ID = "d"; - public static String Player_DATA_PLAYER_MODE_CUSTOMISATION = "bW"; + public static String Player_DATA_PLAYER_ABSORPTION_ID = "c"; + public static String Player_DATA_PLAYER_MODE_CUSTOMISATION = "bK"; // net.minecraft.server.level.ServerPlayer - public static String ServerPlayer_respawnForced = "dn"; + public static String ServerPlayer_respawnConfig = "dc"; // net.minecraft.world.entity.monster.EnderMan - public static String EnderMan_DATA_CREEPY = "cb"; + public static String EnderMan_DATA_CREEPY = "bJ"; // net.minecraft.world.entity.monster.Zombie - public static String Zombie_inWaterTime = "cm"; + public static String Zombie_inWaterTime = "bY"; // net.minecraft.world.item.Item public static String Item_components = "c"; @@ -48,7 +48,7 @@ public class ReflectionMappingsInfo { public static String ThreadedLevelLightEngineTaskType_PRE_UPDATE = "a"; // net.minecraft.world.entity.ExperienceOrb - public static String ExperienceOrb_age = "f"; + public static String ExperienceOrb_age = "k"; // net.minecraft.world.entity.item.ItemEntity public static String ItemEntity_DATA_ITEM = "c"; @@ -121,8 +121,9 @@ public class ReflectionMappingsInfo { public static String ServerLevel_sleepStatus = "Q"; // net.minecraft.world.item.AdventureModePredicate - public static String AdventureModePredicate_predicates = "h"; + public static String AdventureModePredicate_predicates = "f"; // net.minecraft.stats.ServerRecipeBook public static String ServerRecipeBook_addHighlight_method = "e"; + } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java index 663e034d97..7b12e6a6ff 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java @@ -7,6 +7,7 @@ import net.md_5.bungee.api.ChatColor; import net.minecraft.advancements.*; import net.minecraft.advancements.critereon.ImpossibleTrigger; +import net.minecraft.core.ClientAsset; import net.minecraft.network.protocol.game.ClientboundUpdateAdvancementsPacket; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.PlayerAdvancements; @@ -55,8 +56,7 @@ public void register(com.denizenscript.denizen.nms.util.Advancement advancement) } advancement.registered = true; if (!advancement.hidden && advancement.parent != null) { - PacketHelperImpl.broadcast(new ClientboundUpdateAdvancementsPacket(false, - List.of(nmsAdvancementHolder), Set.of(), Map.of())); + PacketHelperImpl.broadcast(new ClientboundUpdateAdvancementsPacket(false, List.of(nmsAdvancementHolder), Set.of(), Map.of(), false)); } } @@ -76,7 +76,7 @@ public void unregister(com.denizenscript.denizen.nms.util.Advancement advancemen getNMSAdvancementManager().advancements = mapBuilder.build(); getNMSAdvancementManager().tree().remove(Set.of(nmsKey)); advancement.registered = false; - PacketHelperImpl.broadcast(new ClientboundUpdateAdvancementsPacket(false, List.of(), Set.of(nmsKey), Map.of())); + PacketHelperImpl.broadcast(new ClientboundUpdateAdvancementsPacket(false, List.of(), Set.of(nmsKey), Map.of(), false)); } @Override @@ -92,10 +92,7 @@ public void grantPartial(com.denizenscript.denizen.nms.util.Advancement advancem for (int i = 0; i < len; i++) { progress.grantProgress(IMPOSSIBLE_KEY + i); // complete impossible criteria } - PacketHelperImpl.send(player, new ClientboundUpdateAdvancementsPacket(false, - Collections.singleton(nmsAdvancement), - Collections.emptySet(), - Collections.singletonMap(nmsAdvancement.id(), progress))); + PacketHelperImpl.send(player, new ClientboundUpdateAdvancementsPacket(false, List.of(nmsAdvancement), Set.of(), Map.of(nmsAdvancement.id(), progress), false)); } else { AdvancementHolder nmsAdvancement = getNMSAdvancementManager().advancements.get(CraftNamespacedKey.toMinecraft(advancement.key)); @@ -116,10 +113,7 @@ public void grant(com.denizenscript.denizen.nms.util.Advancement advancement, Pl AdvancementProgress progress = new AdvancementProgress(); progress.update(new AdvancementRequirements(IMPOSSIBLE_REQUIREMENTS)); progress.grantProgress(IMPOSSIBLE_KEY); // complete impossible criteria - PacketHelperImpl.send(player, new ClientboundUpdateAdvancementsPacket(false, - Collections.singleton(nmsAdvancement), - Collections.emptySet(), - Collections.singletonMap(nmsAdvancement.id(), progress))); + PacketHelperImpl.send(player, new ClientboundUpdateAdvancementsPacket(false, List.of(nmsAdvancement), Set.of(), Map.of(nmsAdvancement.id(), progress), false)); } else { AdvancementHolder nmsAdvancement = getNMSAdvancementManager().advancements.get(CraftNamespacedKey.toMinecraft(advancement.key)); @@ -130,10 +124,7 @@ public void grant(com.denizenscript.denizen.nms.util.Advancement advancement, Pl @Override public void revoke(com.denizenscript.denizen.nms.util.Advancement advancement, Player player) { if (advancement.temporary) { - PacketHelperImpl.send(player, new ClientboundUpdateAdvancementsPacket(false, - Collections.emptySet(), - Collections.singleton(CraftNamespacedKey.toMinecraft(advancement.key)), - Collections.emptyMap())); + PacketHelperImpl.send(player, new ClientboundUpdateAdvancementsPacket(false, List.of(), Set.of(CraftNamespacedKey.toMinecraft(advancement.key)), Map.of(), false)); } else { AdvancementHolder nmsAdvancement = getNMSAdvancementManager().advancements.get(CraftNamespacedKey.toMinecraft(advancement.key)); @@ -143,15 +134,13 @@ public void revoke(com.denizenscript.denizen.nms.util.Advancement advancement, P @Override public void update(Player player) { + // TODO: 1.21.5: should showAdvancements be true? ServerPlayer nmsPlayer = ((CraftPlayer) player).getHandle(); - nmsPlayer.connection.send(new ClientboundUpdateAdvancementsPacket(true, - Collections.emptySet(), - Collections.emptySet(), - Collections.emptyMap())); + nmsPlayer.connection.send(new ClientboundUpdateAdvancementsPacket(true, List.of(), Set.of(), Map.of(), false)); PlayerAdvancements data = nmsPlayer.getAdvancements(); data.save(); // save progress data.reload(getNMSAdvancementManager()); // clear progress - data.flushDirty(nmsPlayer); // load progress and update client + data.flushDirty(nmsPlayer, false); // load progress and update client } private static AdvancementHolder asNMSCopy(com.denizenscript.denizen.nms.util.Advancement advancement) { @@ -160,7 +149,7 @@ private static AdvancementHolder asNMSCopy(com.denizenscript.denizen.nms.util.Ad : null; DisplayInfo display = new DisplayInfo(CraftItemStack.asNMSCopy(advancement.icon), Handler.componentToNMS(FormattedTextHelper.parse(advancement.title, ChatColor.WHITE)), Handler.componentToNMS(FormattedTextHelper.parse(advancement.description, ChatColor.WHITE)), - Optional.ofNullable(advancement.background).map(CraftNamespacedKey::toMinecraft), AdvancementType.valueOf(advancement.frame.name()), + Optional.ofNullable(advancement.background).map(CraftNamespacedKey::toMinecraft).map(ClientAsset::new), AdvancementType.valueOf(advancement.frame.name()), advancement.toast, advancement.announceToChat, advancement.hidden); display.setLocation(advancement.xOffset, advancement.yOffset); Map> criteria = IMPOSSIBLE_CRITERIA; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java index 7263f2529d..6127827269 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java @@ -16,7 +16,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.InclusiveRange; -import net.minecraft.util.random.SimpleWeightedRandomList; +import net.minecraft.util.random.WeightedList; import net.minecraft.world.entity.Entity; import net.minecraft.world.item.component.ResolvableProfile; import net.minecraft.world.level.BaseSpawner; @@ -249,7 +249,7 @@ public void setSpawnerCustomRules(CreatureSpawner spawner, int skyMin, int skyMa SpawnData toSpawn = nmsSpawner.nextSpawnData; SpawnData.CustomSpawnRules rules = skyMin == -1 ? null : new SpawnData.CustomSpawnRules(new InclusiveRange<>(skyMin, skyMax), new InclusiveRange<>(blockMin, blockMax)); nmsSpawner.nextSpawnData = new SpawnData(toSpawn.entityToSpawn(), Optional.ofNullable(rules), toSpawn.equipment()); - nmsSpawner.spawnPotentials = SimpleWeightedRandomList.empty(); + nmsSpawner.spawnPotentials = WeightedList.of(); } catch (Throwable ex) { Debug.echoError(ex); diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityDataNameMapper.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityDataNameMapper.java index e0f4a7ac40..f55647bb01 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityDataNameMapper.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityDataNameMapper.java @@ -14,7 +14,9 @@ import net.minecraft.world.entity.animal.horse.AbstractHorse; import net.minecraft.world.entity.animal.horse.Horse; import net.minecraft.world.entity.animal.horse.Llama; +import net.minecraft.world.entity.animal.sheep.Sheep; import net.minecraft.world.entity.animal.sniffer.Sniffer; +import net.minecraft.world.entity.animal.wolf.Wolf; import net.minecraft.world.entity.boss.enderdragon.EndCrystal; import net.minecraft.world.entity.boss.enderdragon.EnderDragon; import net.minecraft.world.entity.boss.wither.WitherBoss; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java index b3bd434e93..d7dcb49df3 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java @@ -235,9 +235,12 @@ public void registerSmithingRecipe(String keyName, ItemStack result, ItemStack[] Ingredient templateItemRecipe = itemArrayToRecipe(templateItem, templateExact); Ingredient baseItemRecipe = itemArrayToRecipe(baseItem, baseExact); Ingredient upgradeItemRecipe = itemArrayToRecipe(upgradeItem, upgradeExact); - SmithingTransformRecipe recipe = new SmithingTransformRecipe(Optional.of(templateItemRecipe), Optional.of(baseItemRecipe), Optional.of(upgradeItemRecipe), CraftItemStack.asNMSCopy(result)); + // TODO: 1.21.5: TransmuteRecipe? + /* + SmithingTransformRecipe recipe = new SmithingTransformRecipe(Optional.of(templateItemRecipe), baseItemRecipe, Optional.of(upgradeItemRecipe), CraftItemStack.asNMSCopy(result)); RecipeHolder holder = new RecipeHolder<>(key, recipe); getRecipeManager().addRecipe(holder); + */ } @Override @@ -374,7 +377,7 @@ public CompoundTag getNbtData(ItemStack itemStack) { // TODO: 1.20.6: same as getNbtData, ideally needs to only set custom NBT data and have specialized methods for other usages @Override public ItemStack setNbtData(ItemStack itemStack, CompoundTag compoundTag) { - net.minecraft.world.item.ItemStack nmsItemStack = net.minecraft.world.item.ItemStack.parseOptional(CraftRegistry.getMinecraftRegistry(), ((CompoundTagImpl) compoundTag).toNMSTag()); + net.minecraft.world.item.ItemStack nmsItemStack = net.minecraft.world.item.ItemStack.parse(CraftRegistry.getMinecraftRegistry(), ((CompoundTagImpl) compoundTag).toNMSTag()).orElse(net.minecraft.world.item.ItemStack.EMPTY); return CraftItemStack.asBukkitCopy(nmsItemStack); } @@ -463,7 +466,7 @@ public ItemStack setRawComponentsPatch(ItemStack item, MapTag rawComponentsMap, legacyItemData.putInt("count", item.getAmount()); legacyItemData.put("components", nmsRawComponents); net.minecraft.nbt.CompoundTag nmsUpdatedTag = (net.minecraft.nbt.CompoundTag) MinecraftServer.getServer().fixerUpper.update(References.ITEM_STACK, new Dynamic<>(registryOps, legacyItemData), dataVersion, currentDataVersion).getValue(); - nmsRawComponents = nmsUpdatedTag.getCompound("components"); + nmsRawComponents = nmsUpdatedTag.getCompound("components").orElseGet(net.minecraft.nbt.CompoundTag::new); } net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item); DataComponentPatch.CODEC.parse(registryOps, nmsRawComponents) @@ -528,10 +531,13 @@ private ItemStack setAdventureModePredicateMaterials(ItemStack item, DataCompone nmsItemStack.remove(nmsComponent); return CraftItemStack.asBukkitCopy(nmsItemStack); } + // TODO: 1.21.5: upstream code change + /* BlockPredicate nmsPredicate = new BlockPredicate(Optional.of( HolderSet.direct(material -> BuiltInRegistries.BLOCK.get(CraftNamespacedKey.toMinecraft(material.getKey())).orElseThrow(), materials) ), Optional.empty(), Optional.empty()); nmsItemStack.set(nmsComponent, new AdventureModePredicate(List.of(nmsPredicate), nmsAdventurePredicate == null || nmsAdventurePredicate.showInTooltip())); + */ return CraftItemStack.asBukkitCopy(nmsItemStack); } @@ -545,16 +551,6 @@ public void setInventoryItem(Inventory inventory, ItemStack item, int slot) { } } - @Override - public IntArrayTag convertUuidToNbt(UUID id) { - return new IntArrayTag(NbtUtils.createUUID(id).getAsIntArray()); - } - - @Override - public UUID convertNbtToUuid(IntArrayTag id) { - return NbtUtils.loadUUID(new net.minecraft.nbt.IntArrayTag(id.getValue())); - } - @Override public String getDisplayName(ItemTag item) { if (!item.getItemMeta().hasDisplayName()) { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java index 4e49f8c547..e74cbf4f68 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java @@ -81,7 +81,7 @@ public class PlayerHelperImpl extends PlayerHelper { public static final Field FLY_TICKS = ReflectionHelper.getFields(ServerGamePacketListenerImpl.class).get(ReflectionMappingsInfo.ServerGamePacketListenerImpl_aboveGroundTickCount, int.class); public static final Field VEHICLE_FLY_TICKS = ReflectionHelper.getFields(ServerGamePacketListenerImpl.class).get(ReflectionMappingsInfo.ServerGamePacketListenerImpl_aboveGroundVehicleTickCount, int.class); public static final Field PASSENGERS_PACKET_PASSENGERS = ReflectionHelper.getFields(ClientboundSetPassengersPacket.class).get(ReflectionMappingsInfo.ClientboundSetPassengersPacket_passengers, int[].class); - public static final MethodHandle PLAYER_RESPAWNFORCED_SETTER = ReflectionHelper.getFinalSetter(ServerPlayer.class, ReflectionMappingsInfo.ServerPlayer_respawnForced, boolean.class); + public static final MethodHandle PLAYER_RESPAWNCONFIG_SETTER = ReflectionHelper.getFinalSetter(ServerPlayer.class, ReflectionMappingsInfo.ServerPlayer_respawnConfig, ServerPlayer.RespawnConfig.class); public static final MethodHandle SERVER_RECIPE_BOOK_ADD_HIGHLIGHT = ReflectionHelper.getMethodHandle(ServerRecipeBook.class, ReflectionMappingsInfo.ServerRecipeBook_addHighlight_method, ResourceKey.class); public static final EntityDataAccessor PLAYER_DATA_ACCESSOR_SKINLAYERS = ReflectionHelper.getFieldValue(net.minecraft.world.entity.player.Player.class, ReflectionMappingsInfo.Player_DATA_PLAYER_MODE_CUSTOMISATION, null); @@ -187,7 +187,8 @@ else if (mechanism.matches("skin_blob")) { fake.triggerSpawnPacket = (player) -> { ServerPlayer nmsPlayer = ((CraftPlayer) player.getPlayerEntity()).getHandle(); ServerGamePacketListenerImpl conn = nmsPlayer.connection; - final ServerEntity tracker = new ServerEntity(world.getHandle(), nmsEntity, 1, true, conn::send, Collections.singleton(nmsPlayer.connection)); + // TODO: 1.21.5: what's the correct input for `BiConsumer, List> biconsumer`? + final ServerEntity tracker = new ServerEntity(world.getHandle(), nmsEntity, 1, true, conn::send, (p, u) -> conn.send(p), Collections.singleton(nmsPlayer.connection)); tracker.addPairing(nmsPlayer); final TrackerData data = new TrackerData(player, tracker); trackers.add(data); @@ -378,14 +379,16 @@ public void setBossBarTitle(BossBar bar, String title) { @Override public boolean getSpawnForced(Player player) { - return ((CraftPlayer) player).getHandle().isRespawnForced(); + return ((CraftPlayer) player).getHandle().getRespawnConfig().forced(); } @Override public void setSpawnForced(Player player, boolean forced) { ServerPlayer nmsPlayer = ((CraftPlayer) player).getHandle(); try { - PLAYER_RESPAWNFORCED_SETTER.invoke(nmsPlayer, forced); + ServerPlayer.RespawnConfig config = nmsPlayer.getRespawnConfig(); + config = new ServerPlayer.RespawnConfig(config.dimension(), config.pos(), config.angle(), forced); + PLAYER_RESPAWNCONFIG_SETTER.invoke(nmsPlayer, config); } catch (Throwable ex) { Debug.echoError(ex); @@ -395,15 +398,15 @@ public void setSpawnForced(Player player, boolean forced) { @Override public Location getBedSpawnLocation(Player player) { ServerPlayer nmsPlayer = ((CraftPlayer) player).getHandle(); - BlockPos spawnPosition = nmsPlayer.getRespawnPosition(); + BlockPos spawnPosition = nmsPlayer.getRespawnConfig().pos(); if (spawnPosition == null) { return null; } - Level nmsWorld = MinecraftServer.getServer().getLevel(nmsPlayer.getRespawnDimension()); + Level nmsWorld = MinecraftServer.getServer().getLevel(nmsPlayer.getRespawnConfig().dimension()); if (nmsWorld == null) { return null; } - return new Location(nmsWorld.getWorld(), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ(), nmsPlayer.getRespawnAngle(), 0); + return new Location(nmsWorld.getWorld(), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ(), nmsPlayer.getRespawnConfig().angle(), 0); } @Override diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java index fd64fca79e..3f41d972e2 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java @@ -68,12 +68,12 @@ public int getSkyDarken(World world) { @Override public boolean isDay(World world) { - return ((CraftWorld) world).getHandle().isDay(); + return ((CraftWorld) world).getHandle().isBrightOutside(); } @Override public boolean isNight(World world) { - return ((CraftWorld) world).getHandle().isNight(); + return ((CraftWorld) world).getHandle().isDarkOutside(); } @Override diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java index 48f7351f98..4ae5750ca0 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java @@ -10,7 +10,8 @@ import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; import net.minecraft.server.level.ServerLevel; -import net.minecraft.util.random.WeightedRandomList; +import net.minecraft.util.random.Weighted; +import net.minecraft.util.random.WeightedList; import net.minecraft.world.entity.MobCategory; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeSpecialEffects; @@ -162,13 +163,13 @@ public void setWaterFogColor(int color) { private List getSpawnableEntities(MobCategory creatureType) { MobSpawnSettings mobs = biomeHolder.value().getMobSettings(); - WeightedRandomList typeSettingList = mobs.getMobs(creatureType); + WeightedList typeSettingList = mobs.getMobs(creatureType); List entityTypes = new ArrayList<>(); if (typeSettingList == null) { return entityTypes; } - for (MobSpawnSettings.SpawnerData meta : typeSettingList.unwrap()) { - entityTypes.add(CraftEntityType.minecraftToBukkit(meta.type)); + for (Weighted meta : typeSettingList.unwrap()) { + entityTypes.add(CraftEntityType.minecraftToBukkit(meta.value().type())); } return entityTypes; } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java index 15cfdceeff..48bcde5234 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java @@ -12,6 +12,7 @@ import net.minecraft.server.level.ClientInformation; import net.minecraft.server.level.ParticleStatus; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.EntityEquipment; import net.minecraft.world.entity.HumanoidArm; import net.minecraft.world.entity.ai.attributes.AttributeInstance; import net.minecraft.world.entity.ai.attributes.AttributeMap; @@ -44,7 +45,7 @@ public ImprovedOfflinePlayerImpl(UUID playeruuid) { public static class OfflinePlayerInventory extends net.minecraft.world.entity.player.Inventory { public OfflinePlayerInventory(net.minecraft.world.entity.player.Player entityhuman) { - super(entityhuman); + super(entityhuman, new EntityEquipment()); // TODO: 1.21.5: is the new Equipment right here? } @Override @@ -82,7 +83,7 @@ public static ServerPlayer getFakeNmsPlayer() { public org.bukkit.inventory.PlayerInventory getInventory() { if (inventory == null) { net.minecraft.world.entity.player.Inventory newInv = new OfflinePlayerInventory(getFakeNmsPlayer()); - newInv.load(((CompoundTagImpl) this.compound).toNMSTag().getList("Inventory", 10)); + newInv.load(((CompoundTagImpl) this.compound).toNMSTag().getList("Inventory").orElseGet(ListTag::new)); inventory = new OfflineCraftInventoryPlayer(newInv); } return inventory; @@ -101,7 +102,7 @@ public void setInventory(org.bukkit.inventory.PlayerInventory inventory) { public Inventory getEnderChest() { if (enderchest == null) { PlayerEnderChestContainer endchest = new PlayerEnderChestContainer(null); - endchest.fromTag(((CompoundTagImpl) this.compound).toNMSTag().getList("EnderItems", 10), CraftRegistry.getMinecraftRegistry()); + endchest.fromTag(((CompoundTagImpl) this.compound).toNMSTag().getList("EnderItems").orElseGet(ListTag::new), CraftRegistry.getMinecraftRegistry()); enderchest = new CraftInventory(endchest); } return enderchest; @@ -131,7 +132,7 @@ public void setMaxHealth(double input) { private AttributeMap getAttributes() { AttributeMap amb = new AttributeMap(DefaultAttributes.getSupplier(net.minecraft.world.entity.EntityType.PLAYER)); - amb.load(((CompoundTagImpl) this.compound).toNMSTag().getList("Attributes", 10)); + amb.load(((CompoundTagImpl) this.compound).toNMSTag().getList("Attributes").orElseGet(ListTag::new)); return amb; } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java index c38740bb18..9d4776cf42 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java @@ -4,6 +4,7 @@ import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.google.common.base.Preconditions; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.level.ServerLevel; @@ -88,8 +89,8 @@ public boolean save(net.minecraft.nbt.CompoundTag nbttagcompound) { @Override public void load(net.minecraft.nbt.CompoundTag nbttagcompound) { - net.minecraft.nbt.CompoundTag nbttagcompound1 = nbttagcompound.getCompound("Item"); - this.setItemStack(ItemStack.parseOptional(CraftRegistry.getMinecraftRegistry(), nbttagcompound1)); + net.minecraft.nbt.CompoundTag nbttagcompound1 = nbttagcompound.getCompound("Item").orElseGet(CompoundTag::new); + this.setItemStack(ItemStack.parse(CraftRegistry.getMinecraftRegistry(), nbttagcompound1).orElse(ItemStack.EMPTY)); if (this.getItemStack().isEmpty()) { this.remove(RemovalReason.KILLED); } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/jnbt/CompoundTagImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/jnbt/CompoundTagImpl.java index 9344210285..c91ab8591c 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/jnbt/CompoundTagImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/jnbt/CompoundTagImpl.java @@ -80,19 +80,19 @@ else if (entry.getValue() instanceof StringTag) { public static CompoundTag fromNMSTag(net.minecraft.nbt.CompoundTag tag) { HashMap tags = new HashMap<>(); - for (String key : tag.getAllKeys()) { + for (String key : tag.keySet()) { net.minecraft.nbt.Tag base = tag.get(key); if (base instanceof net.minecraft.nbt.IntTag) { - tags.put(key, new IntTag(((net.minecraft.nbt.IntTag) base).getAsInt())); + tags.put(key, new IntTag(base.asInt().get())); } else if (base instanceof net.minecraft.nbt.ByteTag) { - tags.put(key, new ByteTag(((net.minecraft.nbt.ByteTag) base).getAsByte())); + tags.put(key, new ByteTag(base.asByte().get())); } else if (base instanceof net.minecraft.nbt.FloatTag) { - tags.put(key, new FloatTag(((net.minecraft.nbt.FloatTag) base).getAsFloat())); + tags.put(key, new FloatTag(base.asFloat().get())); } else if (base instanceof net.minecraft.nbt.DoubleTag) { - tags.put(key, new DoubleTag(((net.minecraft.nbt.DoubleTag) base).getAsDouble())); + tags.put(key, new DoubleTag(base.asDouble().get())); } else if (base instanceof net.minecraft.nbt.ByteArrayTag) { tags.put(key, new ByteArrayTag(((net.minecraft.nbt.ByteArrayTag) base).getAsByteArray())); @@ -107,13 +107,13 @@ else if (base instanceof net.minecraft.nbt.EndTag) { tags.put(key, new EndTag()); } else if (base instanceof net.minecraft.nbt.LongTag) { - tags.put(key, new LongTag(((net.minecraft.nbt.LongTag) base).getAsLong())); + tags.put(key, new LongTag(base.asLong().get())); } else if (base instanceof net.minecraft.nbt.ShortTag) { - tags.put(key, new ShortTag(((net.minecraft.nbt.ShortTag) base).getAsShort())); + tags.put(key, new ShortTag(base.asShort().get())); } else if (base instanceof net.minecraft.nbt.StringTag) { - tags.put(key, new StringTag(base.getAsString())); + tags.put(key, new StringTag(base.asString().get())); } else if (base instanceof ListTag) { List list = (List) base; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java index d0aebda88d..507a90fd48 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java @@ -84,6 +84,11 @@ public void teleport(Location dest) { oldListener.teleport(dest); } + @Override + public void internalTeleport(PositionMoveRotation positionmoverotation, Set set) { + oldListener.internalTeleport(positionmoverotation, set); + } + @Override public CraftPlayer getCraftPlayer() { return oldListener.getCraftPlayer(); @@ -104,6 +109,11 @@ public boolean isAcceptingMessages() { return oldListener.isAcceptingMessages(); } + @Override + public boolean shouldHandleMessage(Packet packet) { + return oldListener.shouldHandleMessage(packet); + } + @Override public void fillCrashReport(CrashReport var0) { oldListener.fillCrashReport(var0); @@ -282,6 +292,18 @@ public void handleSetStructureBlock(ServerboundSetStructureBlockPacket packet) { oldListener.handleSetStructureBlock(packet); } + @Override + public void handleSetTestBlock(ServerboundSetTestBlockPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleSetTestBlock(packet); + } + + @Override + public void handleTestInstanceBlockAction(ServerboundTestInstanceBlockActionPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleTestInstanceBlockAction(packet); + } + @Override public void handleSetJigsawBlock(ServerboundSetJigsawBlockPacket packet) { if (handlePacketIn(packet)) { return; } @@ -404,11 +426,6 @@ public void handlePlayerCommand(ServerboundPlayerCommandPacket packet) { oldListener.handlePlayerCommand(packet); } - @Override - public void addPendingMessage(PlayerChatMessage playerchatmessage) { - oldListener.addPendingMessage(playerchatmessage); - } - @Override public void sendPlayerChatMessage(PlayerChatMessage playerchatmessage, ChatType.Bound chatmessagetype_a) { oldListener.sendPlayerChatMessage(playerchatmessage, chatmessagetype_a); @@ -554,6 +571,11 @@ public void handleClientTickEnd(ServerboundClientTickEndPacket packet) { oldListener.handleClientTickEnd(packet); } + @Override + public boolean hasInfiniteMaterials() { + return oldListener.hasInfiniteMaterials(); + } + @Override public void handleContainerSlotStateChanged(ServerboundContainerSlotStateChangedPacket packet) { if (handlePacketIn(packet)) { return; } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java index 0818313739..ba9a8b79d4 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java @@ -79,7 +79,7 @@ public void handleSetCarriedItem(ServerboundSetCarriedItemPacket packet) { @Override public void handleContainerClick(ServerboundContainerClickPacket packet) { FakeEquipCommand.EquipmentOverride override = FakeEquipCommand.getOverrideFor(player.getUUID(), getCraftPlayer()); - if (override != null && packet.getContainerId() == 0) { + if (override != null && packet.containerId() == 0) { Bukkit.getScheduler().runTaskLater(NMSHandler.getJavaPlugin(), player.getBukkitEntity()::updateInventory, 1); } super.handleContainerClick(packet); diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java index c854fffca9..8190591f32 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java @@ -51,10 +51,10 @@ public static void tryProcessMovePacketForAttach(DenizenNetworkManagerImpl netwo pNew = new ClientboundMoveEntityPacket.Pos(newId, packet.getXa(), packet.getYa(), packet.getZa(), packet.isOnGround()); } else if (packet instanceof ClientboundMoveEntityPacket.Rot) { - pNew = new ClientboundMoveEntityPacket.Rot(newId, Mth.packDegrees(packet.getyRot()), Mth.packDegrees(packet.getxRot()), packet.isOnGround()); + pNew = new ClientboundMoveEntityPacket.Rot(newId, Mth.packDegrees(packet.getYRot()), Mth.packDegrees(packet.getXRot()), packet.isOnGround()); } else if (packet instanceof ClientboundMoveEntityPacket.PosRot) { - pNew = new ClientboundMoveEntityPacket.PosRot(newId, packet.getXa(), packet.getYa(), packet.getZa(), Mth.packDegrees(packet.getyRot()), Mth.packDegrees(packet.getxRot()), packet.isOnGround()); + pNew = new ClientboundMoveEntityPacket.PosRot(newId, packet.getXa(), packet.getYa(), packet.getZa(), Mth.packDegrees(packet.getYRot()), Mth.packDegrees(packet.getXRot()), packet.isOnGround()); } else { if (CoreConfiguration.debugVerbose) { @@ -71,8 +71,8 @@ else if (packet instanceof ClientboundMoveEntityPacket.PosRot) { pitch = attachedEntity.getXRot(); } else if (isRotate) { - yaw = packet.getyRot(); - pitch = packet.getxRot(); + yaw = packet.getYRot(); + pitch = packet.getXRot(); } else { yaw = e.getYRot(); diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java index 635331b1a9..ac1d22b47e 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java @@ -127,8 +127,8 @@ public static ClientboundMoveEntityPacket.Rot processMoveEntityRotPacket(Denizen if (disguise.as.getBukkitEntityType() == EntityType.ENDER_DRAGON) { return new ClientboundMoveEntityPacket.Rot( disguise.entity.getBukkitEntity().getEntityId(), - EntityAttachmentHelper.compressAngle(rotPacket.getyRot() + 180), - Mth.packDegrees(rotPacket.getxRot()), + EntityAttachmentHelper.compressAngle(rotPacket.getYRot() + 180), + Mth.packDegrees(rotPacket.getXRot()), rotPacket.isOnGround() ); } @@ -143,8 +143,8 @@ public static ClientboundMoveEntityPacket.PosRot processMoveEntityPosRotPacket(D posRotPacket.getXa(), posRotPacket.getYa(), posRotPacket.getZa(), - EntityAttachmentHelper.compressAngle(posRotPacket.getyRot() + 180), - Mth.packDegrees(posRotPacket.getxRot()), + EntityAttachmentHelper.compressAngle(posRotPacket.getYRot() + 180), + Mth.packDegrees(posRotPacket.getXRot()), posRotPacket.isOnGround() ); } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java index c211f4f9dc..ea9ad7882a 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java @@ -49,6 +49,7 @@ public static ClientboundSetEquipmentPacket processSetEquipmentPacket(DenizenNet case LEGS -> override.legs == null ? pair.getSecond() : CraftItemStack.asNMSCopy(override.legs.getItemStack()); case FEET -> override.boots == null ? pair.getSecond() : CraftItemStack.asNMSCopy(override.boots.getItemStack()); case BODY -> pair.getSecond(); // TODO: 1.20.6: is this actually used here? do we want to allow overriding it? + case SADDLE -> pair.getSecond(); // TODO: 1.21.5: same as above }; equipment.set(i, new Pair<>(pair.getFirst(), use)); } @@ -78,14 +79,14 @@ public static ClientboundContainerSetContentPacket processContainerSetContentPac if (FakeEquipCommand.overrides.isEmpty()) { return setContentPacket; } - if (setContentPacket.getContainerId() != 0) { + if (setContentPacket.containerId() != 0) { return setContentPacket; } FakeEquipCommand.EquipmentOverride override = FakeEquipCommand.getOverrideFor(networkManager.player.getUUID(), networkManager.player.getBukkitEntity()); if (override == null) { return setContentPacket; } - NonNullList items = (NonNullList) setContentPacket.getItems(); + NonNullList items = (NonNullList) setContentPacket.items(); if (override.head != null) { items.set(5, CraftItemStack.asNMSCopy(override.head.getItemStack())); } @@ -104,7 +105,7 @@ public static ClientboundContainerSetContentPacket processContainerSetContentPac if (override.hand != null) { items.set(getMainHandSlot(networkManager.player), CraftItemStack.asNMSCopy(override.hand.getItemStack())); } - return new ClientboundContainerSetContentPacket(setContentPacket.getContainerId(), setContentPacket.getStateId(), items, setContentPacket.getCarriedItem()); + return new ClientboundContainerSetContentPacket(setContentPacket.containerId(), setContentPacket.stateId(), items, setContentPacket.carriedItem()); } public static ClientboundContainerSetSlotPacket processContainerSetSlotPacket(DenizenNetworkManagerImpl networkManager, ClientboundContainerSetSlotPacket setSlotPacket) { @@ -133,6 +134,6 @@ public static ClientboundContainerSetSlotPacket processContainerSetSlotPacket(De } public static int getMainHandSlot(ServerPlayer player) { - return player.getInventory().selected + 36; + return player.getInventory().getSelectedSlot() + 36; } } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java index 76c974b059..cac24bc7d8 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java @@ -12,7 +12,7 @@ public class HiddenEntitiesPacketHandlers { public static void registerHandlers() { DenizenNetworkManagerImpl.registerPacketHandler(ClientboundAddEntityPacket.class, HiddenEntitiesPacketHandlers::processHiddenEntitiesForPacket); - DenizenNetworkManagerImpl.registerPacketHandler(ClientboundAddExperienceOrbPacket.class, HiddenEntitiesPacketHandlers::processHiddenEntitiesForPacket); + //DenizenNetworkManagerImpl.registerPacketHandler(ClientboundAddExperienceOrbPacket.class, HiddenEntitiesPacketHandlers::processHiddenEntitiesForPacket); DenizenNetworkManagerImpl.registerPacketHandler(ClientboundMoveEntityPacket.Rot.class, HiddenEntitiesPacketHandlers::processHiddenEntitiesForPacket); DenizenNetworkManagerImpl.registerPacketHandler(ClientboundMoveEntityPacket.Pos.class, HiddenEntitiesPacketHandlers::processHiddenEntitiesForPacket); DenizenNetworkManagerImpl.registerPacketHandler(ClientboundMoveEntityPacket.PosRot.class, HiddenEntitiesPacketHandlers::processHiddenEntitiesForPacket); @@ -35,9 +35,11 @@ public static Packet processHiddenEntitiesForPacket(De if (packet instanceof ClientboundAddEntityPacket) { ider = ((ClientboundAddEntityPacket) packet).getId(); } + //TODO: 1.21.5: check this packet list + /* else if (packet instanceof ClientboundAddExperienceOrbPacket) { ider = ((ClientboundAddExperienceOrbPacket) packet).getId(); - } + }*/ else if (packet instanceof ClientboundMoveEntityPacket) { e = ((ClientboundMoveEntityPacket) packet).getEntity(networkManager.player.level()); } From 38b35c3665d33acf23c518c342dac1b608257339 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Fri, 28 Mar 2025 16:41:53 +0000 Subject: [PATCH 145/280] Several minor 1.20/21 fixes (#2711) * Several minor 1.20/21 updates * Fully fixup boat type deprecation * Wording --- .../denizen/objects/EntityTag.java | 5 ++- .../properties/entity/EntityBoatType.java | 37 ++++++++++++------- .../properties/entity/EntityColor.java | 18 +++++++-- .../utilities/BukkitImplDeprecations.java | 7 ++++ .../utilities/MultiVersionHelper1_19.java | 18 ++++++++- .../nms/v1_20/helpers/BlockHelperImpl.java | 1 - .../nms/v1_20/helpers/EntityHelperImpl.java | 7 ++-- .../nms/v1_21/helpers/BlockHelperImpl.java | 1 - .../nms/v1_21/helpers/EntityHelperImpl.java | 6 +-- 9 files changed, 70 insertions(+), 30 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java index d52e4a68b0..aef327f0a2 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java @@ -3874,12 +3874,13 @@ public void adjust(Mechanism mechanism) { // Makes a player-type entity interact with a block. // --> if (mechanism.matches("interact_with") && mechanism.requireObject(LocationTag.class)) { - if (!isPlayer()) { + Player player = getPlayer(); + if (player == null) { mechanism.echoError("Only player-type entities can interact with blocks!"); return; } LocationTag interactLocation = mechanism.valueAsType(LocationTag.class); - NMSHandler.entityHelper.forceInteraction(getPlayer(), interactLocation); + NMSHandler.entityHelper.forceInteraction(player, interactLocation); } if (mechanism.matches("play_death")) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityBoatType.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityBoatType.java index 7eb5b1138e..54d055b15d 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityBoatType.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityBoatType.java @@ -6,7 +6,7 @@ import com.denizenscript.denizen.utilities.BukkitImplDeprecations; import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.core.ElementTag; -import com.denizenscript.denizencore.objects.properties.PropertyParser; +import com.denizenscript.denizencore.tags.Attribute; import org.bukkit.TreeSpecies; import org.bukkit.entity.Boat; @@ -28,6 +28,20 @@ public static boolean describes(EntityTag boat) { @Override public ElementTag getPropertyValue() { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + return null; + } + return new ElementTag(as(Boat.class).getWoodType()); + } + + @Override + public ElementTag getTagValue(Attribute attribute) { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { + BukkitImplDeprecations.boatType.warn(attribute.context); + } + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + BukkitImplDeprecations.gettingBoatType.warn(attribute.context); + } return new ElementTag(as(Boat.class).getWoodType()); } @@ -38,24 +52,19 @@ public String getPropertyId() { @Override public void setPropertyValue(ElementTag type, Mechanism mechanism) { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { + BukkitImplDeprecations.boatType.warn(mechanism.context); + } + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + BukkitImplDeprecations.settingBoatType.warn(mechanism.context); + return; + } if (mechanism.requireEnum(TreeSpecies.class)) { as(Boat.class).setWoodType(type.asEnum(TreeSpecies.class)); } } public static void register() { - PropertyParser.registerTag(EntityBoatType.class, ElementTag.class, "boat_type", (attribute, object) -> { - if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { - BukkitImplDeprecations.boatType.warn(attribute.context); - } - return object.getPropertyValue(); - }); - - PropertyParser.registerMechanism(EntityBoatType.class, ElementTag.class, "boat_type", (object, mechanism, type) -> { - if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { - BukkitImplDeprecations.boatType.warn(mechanism.context); - } - object.setPropertyValue(type, mechanism); - }); + autoRegister("boat_type", EntityBoatType.class, ElementTag.class, false); } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityColor.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityColor.java index 3960841ecb..bdb30e6b17 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityColor.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityColor.java @@ -11,8 +11,11 @@ import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.ListTag; import com.denizenscript.denizencore.objects.properties.PropertyParser; +import com.denizenscript.denizencore.tags.Attribute; import com.denizenscript.denizencore.utilities.CoreUtilities; -import org.bukkit.*; +import org.bukkit.DyeColor; +import org.bukkit.NamespacedKey; +import org.bukkit.Registry; import org.bukkit.entity.*; import java.util.Arrays; @@ -57,7 +60,16 @@ public static boolean describes(EntityTag entity) { @Override public ElementTag getPropertyValue() { - String color = getColor(true); + return getCleanedValue(false); + } + + @Override + public ElementTag getTagValue(Attribute attribute) { + return getCleanedValue(true); + } + + public ElementTag getCleanedValue(boolean includeDeprecated) { + String color = getColor(includeDeprecated); return color == null ? null : new ElementTag(CoreUtilities.toLowerCase(color)); } @@ -210,7 +222,7 @@ else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19) && MultiVersionHelp public String getColor(boolean includeDeprecated) { EntityType type = getType(); if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19) && MultiVersionHelper1_19.colorIsApplicable(type)) { - return MultiVersionHelper1_19.getColor(getEntity()); + return MultiVersionHelper1_19.getColor(getEntity(), includeDeprecated); } if (getEntity() instanceof MushroomCow mushroomCow) { return mushroomCow.getVariant().name(); 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 a35517588f..45178570eb 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java @@ -265,6 +265,9 @@ public class BukkitImplDeprecations { public static Warning oldStructureTypes = new Warning("oldStructureTypes", "'server.structure_types' is based on outdated API and doesn't support modern datapack features. Use 'server.structures' instead."); public static Warning findStructureTags = new Warning("findStructureTags", "'LocationTag.find.structure' and related tags are deprecated in favor of 'LocationTag.find_structure'."); + // Added 2025/03/14 + public static Warning settingBoatType = new Warning("settingBoatType", "As of MC 1.21, separate boat wood types are separate entity types, meaning the wood type of an existing boat entity cannot be changed without spawning a new one."); + // ==================== SLOW deprecations ==================== // These aren't spammed, but will show up repeatedly until fixed. Server owners will probably notice them. @@ -348,6 +351,10 @@ public class BukkitImplDeprecations { // Safe to remove now. public static Warning debugBlockAlpha = new SlowWarning("debugBlockAlpha", "The 'alpha' argument for the 'debugblock' command is deprecated: put the alpha in the color input instead."); + // Added 2025/03/16 + // Bump once 1.21 is the minimum supported version (as that is where boat types were split) + public static Warning gettingBoatType = new SlowWarning("gettingBoatType", "Getting boat wood types is deprecated, as separate boat types are separate entity types now: should check the entity type."); + // ==================== VERY SLOW deprecations ==================== // These are only shown minimally, so server owners are aware of them but not bugged by them. Only servers with active scripters (using 'ex reload') will see them often. diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/MultiVersionHelper1_19.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/MultiVersionHelper1_19.java index 073e093230..e649c9aec1 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/MultiVersionHelper1_19.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/MultiVersionHelper1_19.java @@ -1,5 +1,7 @@ package com.denizenscript.denizen.utilities; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.PlayerTag; import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.core.DurationTag; @@ -16,11 +18,17 @@ public static boolean colorIsApplicable(EntityType type) { } // TODO Frog variants technically have registries on all supported versions - public static String getColor(Entity entity) { + public static String getColor(Entity entity, boolean includeDeprecated) { if (entity instanceof Frog frog) { return String.valueOf(frog.getVariant()); } else if (entity instanceof Boat boat) { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + if (!includeDeprecated) { + return null; + } + BukkitImplDeprecations.gettingBoatType.warn(); + } return boat.getBoatType().name(); } return null; @@ -31,6 +39,9 @@ public static ListTag getAllowedColors(EntityType type) { return Utilities.listTypes(Frog.Variant.class); } else if (Boat.class.isAssignableFrom(type.getEntityClass())) { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + BukkitImplDeprecations.gettingBoatType.warn(); + } return Utilities.listTypes(Boat.Type.class); } return null; @@ -41,7 +52,10 @@ public static void setColor(Entity entity, Mechanism mech) { frog.setVariant(Utilities.elementToEnumlike(mech.getValue(), Frog.Variant.class)); } else if (entity instanceof Boat boat && mech.requireEnum(Boat.Type.class)) { - // TODO: 1.21.3: Deprecate setting boat types + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + BukkitImplDeprecations.settingBoatType.warn(mech.context); + return; + } boat.setBoatType(mech.getValue().asEnum(Boat.Type.class)); } } diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java index f7f8b114f0..aeaf6e4b27 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java @@ -93,7 +93,6 @@ public static T getTE(CraftBlockEntityState cbs) { @Override public PlayerProfile getPlayerProfile(Skull skull) { - // TODO: 1.20.6: Seems to be a holder for data that can make the request to complete it later - do we want to do that here? ResolvableProfile profile = getTE(((CraftSkull) skull)).owner; if (profile == null) { return null; diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java index 925f2a7643..a3b57a8fc5 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/EntityHelperImpl.java @@ -172,10 +172,9 @@ public void setRiptide(Entity entity, boolean state) { @Override public void forceInteraction(Player player, Location location) { - CraftPlayer craftPlayer = (CraftPlayer) player; - // TODO: 1.20.6: passing a null player isn't valid (and seemingly never was) - need to require HumanEntity in the mechanism - ((CraftBlock) location.getBlock()).getNMS().useItemOn(craftPlayer.getHandle().getMainHandItem(), ((CraftWorld) location.getWorld()).getHandle(), - craftPlayer.getHandle(), InteractionHand.MAIN_HAND, + ServerPlayer nmsPlayer = ((CraftPlayer) player).getHandle(); + ((CraftBlock) location.getBlock()).getNMS().useItemOn(nmsPlayer.getMainHandItem(), ((CraftWorld) location.getWorld()).getHandle(), + nmsPlayer, InteractionHand.MAIN_HAND, new BlockHitResult(new Vec3(0, 0, 0), null, CraftLocation.toBlockPosition(location), false)); } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java index 6127827269..4d1454cddd 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java @@ -84,7 +84,6 @@ public static T getTE(CraftBlockEntityState cbs) { @Override public PlayerProfile getPlayerProfile(Skull skull) { - // TODO: 1.20.6: Seems to be a holder for data that can make the request to complete it later - do we want to do that here? ResolvableProfile profile = getTE(((CraftSkull) skull)).owner; if (profile == null) { return null; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java index 49fca76853..52601c2dd4 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java @@ -166,9 +166,9 @@ public void setRiptide(Entity entity, boolean state) { @Override public void forceInteraction(Player player, Location location) { - CraftPlayer craftPlayer = (CraftPlayer) player; - ((CraftBlock) location.getBlock()).getNMS().useItemOn(craftPlayer.getHandle().getMainHandItem(), ((CraftWorld) location.getWorld()).getHandle(), - craftPlayer.getHandle(), InteractionHand.MAIN_HAND, + ServerPlayer nmsPlayer = ((CraftPlayer) player).getHandle(); + ((CraftBlock) location.getBlock()).getNMS().useItemOn(nmsPlayer.getMainHandItem(), ((CraftWorld) location.getWorld()).getHandle(), + nmsPlayer, InteractionHand.MAIN_HAND, new BlockHitResult(new Vec3(0, 0, 0), null, CraftLocation.toBlockPosition(location), false)); } From 1c81ce6c0d9fe966a0c0b7dc85424af2c842df9f Mon Sep 17 00:00:00 2001 From: MCSamuel Date: Fri, 28 Mar 2025 11:01:54 -0700 Subject: [PATCH 146/280] Add `player discovers recipe` event (#2704) * PlayerRecipeDiscoverScriptEvent created * Namespace Context clarification * Context changes * context marked as plain * space --- .../denizen/events/ScriptEventRegistry.java | 1 + .../PlayerRecipeDiscoverScriptEvent.java | 65 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerRecipeDiscoverScriptEvent.java diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java index 55c8625b28..06a4cf001e 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java @@ -238,6 +238,7 @@ public static void registerMainEvents() { ScriptEvent.registerScriptEvent(PlayerReceivesMessageScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerReceivesPacketScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerReceivesTablistUpdateScriptEvent.class); + ScriptEvent.registerScriptEvent(PlayerRecipeDiscoverScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerRespawnsScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerRightClicksEntityScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerRiptideScriptEvent.class); diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerRecipeDiscoverScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerRecipeDiscoverScriptEvent.java new file mode 100644 index 0000000000..ead7bf20c6 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerRecipeDiscoverScriptEvent.java @@ -0,0 +1,65 @@ +package com.denizenscript.denizen.events.player; + +import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.scripts.ScriptEntryData; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerRecipeDiscoverEvent; + +public class PlayerRecipeDiscoverScriptEvent extends BukkitScriptEvent implements Listener { + + // <--[event] + // @Events + // player discovers recipe + // + // @Group Player + // + // @Location true + // + // @Cancellable true + // + // @Triggers when a player discovers a new item in the recipe book. + // + // @Context + // returns the ID of the recipe discovered. + // + // @Player Always. + // + // --> + + public PlayerRecipeDiscoverScriptEvent() { + registerCouldMatcher("player discovers recipe"); + } + + public PlayerRecipeDiscoverEvent event; + + @Override + public boolean matches(ScriptPath path) { + if (!runInCheck(path, event.getPlayer().getLocation())) { + return false; + } + return super.matches(path); + } + + @Override + public ScriptEntryData getScriptEntryData() { + return new BukkitScriptEntryData(event.getPlayer()); + } + + @Override + public ObjectTag getContext(String name) { + return switch (name) { + case "recipe_id" -> new ElementTag(event.getRecipe().toString(), true); + default -> super.getContext(name); + }; + } + + @EventHandler + public void onPlayerDiscoversRecipe(PlayerRecipeDiscoverEvent event) { + this.event = event; + fire(event); + } +} From ade2fd5ca6579161707c256255c91082d8d33216 Mon Sep 17 00:00:00 2001 From: MCSamuel Date: Sat, 29 Mar 2025 05:15:40 -0700 Subject: [PATCH 147/280] Update 6 entity properties (#2703) Properties: `EntityAnger`, `EntityAngry`, `EntityArms`, `EntityBasePlate`, `EntityCharged`, `EntityChestCarrier` * Modernized 6 properties * Aya update * Removed `as` calls when necessary Minor format fixes * meta updates & redundant `else` removed * () in meta notes removed * EntityCharged meta changes * ghast visual effect clarified * Ghast removed * defaults --- .../properties/entity/EntityAnger.java | 121 ++++--------- .../properties/entity/EntityAngry.java | 142 ++++------------ .../objects/properties/entity/EntityArms.java | 79 +++------ .../properties/entity/EntityBasePlate.java | 77 +++------ .../properties/entity/EntityCharged.java | 159 ++++++------------ .../properties/entity/EntityChestCarrier.java | 76 ++------- 6 files changed, 175 insertions(+), 479 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAnger.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAnger.java index 1b554ceb88..8bc409a30b 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAnger.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAnger.java @@ -3,115 +3,56 @@ import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizencore.objects.core.DurationTag; import com.denizenscript.denizencore.objects.Mechanism; -import com.denizenscript.denizencore.objects.ObjectTag; -import com.denizenscript.denizencore.objects.properties.Property; -import com.denizenscript.denizencore.objects.properties.PropertyParser; import org.bukkit.entity.Bee; -import org.bukkit.entity.Entity; import org.bukkit.entity.PigZombie; -public class EntityAnger implements Property { +public class EntityAnger extends EntityProperty { - public static boolean describes(ObjectTag entity) { - if (!(entity instanceof EntityTag)) { - return false; - } - Entity bukkitEntity = ((EntityTag) entity).getBukkitEntity(); - return bukkitEntity instanceof PigZombie - || bukkitEntity instanceof Bee; + // <--[property] + // @object EntityTag + // @name anger + // @input DurationTag + // @description + // Controls the remaining anger time of a PigZombie or Bee. + // --> + + public static boolean describes(EntityTag entity) { + return entity.getBukkitEntity() instanceof PigZombie + || entity.getBukkitEntity() instanceof Bee; } - public static EntityAnger getFrom(ObjectTag entity) { - if (!describes(entity)) { - return null; + @Override + public DurationTag getPropertyValue() { + if (getEntity() instanceof PigZombie entity) { + return new DurationTag((long) entity.getAnger()); + } + else if (getEntity() instanceof Bee entity) { + return new DurationTag((long) entity.getAnger()); } else { - return new EntityAnger((EntityTag) entity); + return null; } } - public static final String[] handledMechs = new String[] { - "anger" - }; - - public EntityAnger(EntityTag entity) { - this.entity = entity; - } - - EntityTag entity; - - @Override - public String getPropertyString() { - return new DurationTag((long) getAnger()).identify(); - } - @Override - public String getPropertyId() { - return "anger"; - } - - public int getAnger() { - if (isPigZombie()) { - return getPigZombie().getAnger(); + public void setPropertyValue(DurationTag param, Mechanism mechanism) { + if (mechanism.getValue().isInt()) { // Soft-deprecated - backwards compatibility, as this used to use a tick count + param = new DurationTag(mechanism.getValue().asLong()); + } + if (getEntity() instanceof PigZombie entity) { + entity.setAnger(param.getTicksAsInt()); } else { - return getBee().getAnger(); + as(Bee.class).setAnger(param.getTicksAsInt()); } } - public boolean isPigZombie() { - return entity.getBukkitEntity() instanceof PigZombie; - } - - public PigZombie getPigZombie() { - return (PigZombie) entity.getBukkitEntity(); - } - - public Bee getBee() { - return (Bee) entity.getBukkitEntity(); + @Override + public String getPropertyId() { + return "anger"; } public static void register() { - - // <--[tag] - // @attribute - // @returns DurationTag - // @mechanism EntityTag.anger - // @group properties - // @description - // Returns the remaining anger time of a PigZombie or Bee. - // --> - PropertyParser.registerTag(EntityAnger.class, DurationTag.class, "anger", (attribute, object) -> { - return new DurationTag((long) object.getAnger()); - }); - } - - @Override - public void adjust(Mechanism mechanism) { - - // <--[mechanism] - // @object EntityTag - // @name anger - // @input DurationTag - // @description - // Changes the remaining anger time of a PigZombie or Bee. - // @tags - // - // --> - if (mechanism.matches("anger") && mechanism.requireObject(DurationTag.class)) { - DurationTag duration; - if (mechanism.getValue().isInt()) { // Soft-deprecated - backwards compatibility, as this used to use a tick count - duration = new DurationTag(mechanism.getValue().asLong()); - } - else { - duration = mechanism.valueAsType(DurationTag.class); - } - if (isPigZombie()) { - getPigZombie().setAnger(duration.getTicksAsInt()); - } - else { - getBee().setAnger(duration.getTicksAsInt()); - } - } + autoRegister("anger", EntityAnger.class, DurationTag.class, false); } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAngry.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAngry.java index ad480d38df..f98638f789 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAngry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAngry.java @@ -5,136 +5,66 @@ import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.Mechanism; -import com.denizenscript.denizencore.objects.ObjectTag; -import com.denizenscript.denizencore.objects.properties.Property; -import com.denizenscript.denizencore.objects.properties.PropertyParser; -import org.bukkit.entity.Entity; import org.bukkit.entity.PigZombie; import org.bukkit.entity.Vindicator; import org.bukkit.entity.Wolf; -public class EntityAngry implements Property { +public class EntityAngry extends EntityProperty { - public static boolean describes(ObjectTag object) { - if (!(object instanceof EntityTag)) { - return false; - } - Entity entity = ((EntityTag) object).getBukkitEntity(); - return entity instanceof Wolf - || entity instanceof PigZombie - || (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_18) && entity instanceof Vindicator); - } + // <--[property] + // @object EntityTag + // @name angry + // @input ElementTag(Boolean) + // @description + // Controls whether a Wolf or PigZombie is angry, or whether a Vindicator is in "Johnny" mode. + // --> - public static EntityAngry getFrom(ObjectTag entity) { - if (!describes(entity)) { - return null; - } - else { - return new EntityAngry((EntityTag) entity); - } + public static boolean describes(EntityTag entity) { + return entity.getBukkitEntity() instanceof PigZombie + || entity.getBukkitEntity() instanceof Wolf + || (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_18) && entity.getBukkitEntity() instanceof Vindicator); } - public static final String[] handledMechs = new String[] { - "angry" - }; - - public EntityAngry(EntityTag entity) { - this.entity = entity; + @Override + public boolean isDefaultValue(ElementTag val) { + return !val.asBoolean(); } - EntityTag entity; - @Override - public String getPropertyString() { - if (isWolf()) { - return getWolf().isAngry() ? "true" : null; + public ElementTag getPropertyValue() { + if (getEntity() instanceof PigZombie entity) { + return new ElementTag(entity.isAngry()); } - else if (isPigZombie()) { - return getPigZombie().isAngry() ? "true" : null; + else if (getEntity() instanceof Wolf entity) { + return new ElementTag(entity.isAngry()); } - else if (isVindicator()) { - return getVindicator().isJohnny() ? "true" : null; + else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_18) && getEntity() instanceof Vindicator entity) { + return new ElementTag(entity.isJohnny()); } return null; } @Override - public String getPropertyId() { - return "angry"; - } - - public static void register() { - - // <--[tag] - // @attribute - // @returns ElementTag(Boolean) - // @mechanism EntityTag.angry - // @group properties - // @description - // If the entity is a wolf or PigZombie, returns whether the entity is angry. - // If the entity is a Vindicator, returns whether it is in "Johnny" mode. - // --> - PropertyParser.registerTag(EntityAngry.class, ElementTag.class, "angry", (attribute, entity) -> { - if (entity.isWolf()) { - return new ElementTag(entity.getWolf().isAngry()); + public void setPropertyValue(ElementTag param, Mechanism mechanism) { + if (mechanism.requireBoolean()) { + if (getEntity() instanceof PigZombie entity) { + entity.setAngry(param.asBoolean()); } - else if (entity.isPigZombie()) { - return new ElementTag(entity.getPigZombie().isAngry()); + else if (getEntity() instanceof Wolf entity) { + entity.setAngry(param.asBoolean()); } - else if (entity.isVindicator()) { - return new ElementTag(entity.getVindicator().isJohnny()); + else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_18) && getEntity() instanceof Vindicator entity) { + entity.setJohnny(param.asBoolean()); } - return null; - }); - } - - public boolean isWolf() { - return entity.getBukkitEntity() instanceof Wolf; - } - - public boolean isPigZombie() { - return entity.getBukkitEntity() instanceof PigZombie; - } - - public boolean isVindicator() { - return NMSHandler.getVersion().isAtLeast(NMSVersion.v1_18) && entity.getBukkitEntity() instanceof Vindicator; - } - - public Wolf getWolf() { - return (Wolf) entity.getBukkitEntity(); - } - - public PigZombie getPigZombie() { - return (PigZombie) entity.getBukkitEntity(); - } - - public Vindicator getVindicator() { - return (Vindicator) entity.getBukkitEntity(); + } } @Override - public void adjust(Mechanism mechanism) { + public String getPropertyId() { + return "angry"; + } - // <--[mechanism] - // @object EntityTag - // @name angry - // @input ElementTag(Boolean) - // @description - // If the entity is wolf or PigZombie, sets whether the entity is angry. - // If the entity is a Vindicator, returns whether it is in "Johnny" mode. - // @tags - // - // --> - if (mechanism.matches("angry") && mechanism.requireBoolean()) { - if (isWolf()) { - getWolf().setAngry(mechanism.getValue().asBoolean()); - } - else if (isPigZombie()) { - getPigZombie().setAngry(mechanism.getValue().asBoolean()); - } - else if (isVindicator()) { - getVindicator().setJohnny(mechanism.getValue().asBoolean()); - } - } + public static void register() { + autoRegister("angry", EntityAngry.class, ElementTag.class, false); } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityArms.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityArms.java index f021757122..e12e8b48f6 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityArms.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityArms.java @@ -3,40 +3,37 @@ import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.Mechanism; -import com.denizenscript.denizencore.objects.ObjectTag; -import com.denizenscript.denizencore.objects.properties.Property; -import com.denizenscript.denizencore.objects.properties.PropertyParser; import org.bukkit.entity.ArmorStand; -public class EntityArms implements Property { +public class EntityArms extends EntityProperty { - public static boolean describes(ObjectTag entity) { - return entity instanceof EntityTag - && ((EntityTag) entity).getBukkitEntity() instanceof ArmorStand; - } + // <--[property] + // @object EntityTag + // @name arms + // @input ElementTag(Boolean) + // @description + // Controls whether an armor stand has arms. + // --> - public static EntityArms getFrom(ObjectTag entity) { - if (!describes(entity)) { - return null; - } - else { - return new EntityArms((EntityTag) entity); - } + public static boolean describes(EntityTag entity) { + return entity.getBukkitEntity() instanceof ArmorStand; } - public static final String[] handledMechs = new String[] { - "arms" - }; - - public EntityArms(EntityTag entity) { - dentity = entity; + @Override + public boolean isDefaultValue(ElementTag val) { + return !val.asBoolean(); } - EntityTag dentity; + @Override + public ElementTag getPropertyValue() { + return new ElementTag(as(ArmorStand.class).hasArms()); + } @Override - public String getPropertyString() { - return getStand().hasArms() ? "true" : null; + public void setPropertyValue(ElementTag param, Mechanism mechanism) { + if (mechanism.requireBoolean()) { + as(ArmorStand.class).setArms(param.asBoolean()); + } } @Override @@ -44,39 +41,7 @@ public String getPropertyId() { return "arms"; } - public ArmorStand getStand() { - return (ArmorStand) dentity.getBukkitEntity(); - } - public static void register() { - - // <--[tag] - // @attribute - // @returns ElementTag(Boolean) - // @mechanism EntityTag.arms - // @group properties - // @description - // If the entity is an armor stand, returns whether the armor stand has arms. - // --> - PropertyParser.registerTag(EntityArms.class, ElementTag.class, "arms", (attribute, object) -> { - return new ElementTag(object.getStand().hasArms()); - }); - } - - @Override - public void adjust(Mechanism mechanism) { - - // <--[mechanism] - // @object EntityTag - // @name arms - // @input ElementTag(Boolean) - // @description - // Changes the arms state of an armor stand. - // @tags - // - // --> - if (mechanism.matches("arms") && mechanism.requireBoolean()) { - getStand().setArms(mechanism.getValue().asBoolean()); - } + autoRegister("arms", EntityArms.class, ElementTag.class, false); } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityBasePlate.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityBasePlate.java index 7f1f3c606a..185db5280f 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityBasePlate.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityBasePlate.java @@ -3,44 +3,37 @@ import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.Mechanism; -import com.denizenscript.denizencore.objects.ObjectTag; -import com.denizenscript.denizencore.objects.properties.Property; -import com.denizenscript.denizencore.objects.properties.PropertyParser; import org.bukkit.entity.ArmorStand; -public class EntityBasePlate implements Property { +public class EntityBasePlate extends EntityProperty { - public static boolean describes(ObjectTag entity) { - return entity instanceof EntityTag - && ((EntityTag) entity).getBukkitEntity() instanceof ArmorStand; - } + // <--[property] + // @object EntityTag + // @name base_plate + // @input ElementTag(Boolean) + // @description + // Controls whether an armor stand has a base plate. + // --> - public static EntityBasePlate getFrom(ObjectTag entity) { - if (!describes(entity)) { - return null; - } - else { - return new EntityBasePlate((EntityTag) entity); - } + public static boolean describes(EntityTag entity) { + return entity.getBukkitEntity() instanceof ArmorStand; } - public static final String[] handledMechs = new String[] { - "base_plate" - }; - - public EntityBasePlate(EntityTag entity) { - dentity = entity; + @Override + public boolean isDefaultValue(ElementTag val) { + return val.asBoolean(); } - EntityTag dentity; - - public ArmorStand getStand() { - return (ArmorStand) dentity.getBukkitEntity(); + @Override + public ElementTag getPropertyValue() { + return new ElementTag(as(ArmorStand.class).hasBasePlate()); } @Override - public String getPropertyString() { - return getStand().hasBasePlate() ? null : "false"; + public void setPropertyValue(ElementTag param, Mechanism mechanism) { + if (mechanism.requireBoolean()) { + as(ArmorStand.class).setBasePlate(param.asBoolean()); + } } @Override @@ -49,34 +42,6 @@ public String getPropertyId() { } public static void register() { - - // <--[tag] - // @attribute - // @returns ElementTag(Boolean) - // @mechanism EntityTag.base_plate - // @group properties - // @description - // If the entity is an armor stand, returns whether the armor stand has a base plate. - // --> - PropertyParser.registerTag(EntityBasePlate.class, ElementTag.class, "base_plate", (attribute, object) -> { - return new ElementTag(object.getStand().hasBasePlate()); - }); - } - - @Override - public void adjust(Mechanism mechanism) { - - // <--[mechanism] - // @object EntityTag - // @name base_plate - // @input ElementTag(Boolean) - // @description - // Changes the base plate state of an armor stand. - // @tags - // - // --> - if (mechanism.matches("base_plate") && mechanism.requireBoolean()) { - getStand().setBasePlate(mechanism.getValue().asBoolean()); - } + autoRegister("base_plate", EntityBasePlate.class, ElementTag.class, false); } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityCharged.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityCharged.java index 6cb3d99c79..50e6072ce4 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityCharged.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityCharged.java @@ -1,48 +1,62 @@ package com.denizenscript.denizen.objects.properties.entity; import com.denizenscript.denizen.objects.EntityTag; -import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.core.ElementTag; -import com.denizenscript.denizencore.objects.properties.Property; -import com.denizenscript.denizencore.objects.properties.PropertyParser; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Guardian; -import org.bukkit.entity.Vex; -import org.bukkit.entity.WitherSkull; - -public class EntityCharged implements Property { +import org.bukkit.entity.*; + +public class EntityCharged extends EntityProperty { + + // <--[property] + // @object EntityTag + // @name charged + // @input ElementTag(Boolean) + // @description + // If the entity is wither_skull, controls whether the skull is charged. Charged skulls are blue. + // If the entity is a vex, controls whether the vex is charging. Charging vexes have red lines. + // This is a visual effect, and does not cause the vex to actually charge at anyone. + // If the entity is a guardian, controls whether the guardian's laser is active. + // Note that guardians also require a target to use their laser, see <@link command attack>. + // --> + + public static boolean describes(EntityTag entity) { + return entity.getBukkitEntity() instanceof WitherSkull + || entity.getBukkitEntity() instanceof Vex + || entity.getBukkitEntity() instanceof Guardian; + } - public static boolean describes(ObjectTag object) { - if (!(object instanceof EntityTag)) { - return false; - } - Entity entity = ((EntityTag) object).getBukkitEntity(); - return entity instanceof WitherSkull - || entity instanceof Vex - || entity instanceof Guardian; + @Override + public boolean isDefaultValue(ElementTag val) { + return !val.asBoolean(); } - public static EntityCharged getFrom(ObjectTag entity) { - if (!describes(entity)) { - return null; + @Override + public ElementTag getPropertyValue() { + if (getEntity() instanceof WitherSkull entity) { + return new ElementTag(entity.isCharged()); } - else { - return new EntityCharged((EntityTag) entity); + else if (getEntity() instanceof Vex entity) { + return new ElementTag(entity.isCharging()); } + else if (getEntity() instanceof Guardian entity) { + return new ElementTag(entity.hasLaser()); + } + return null; } - public EntityCharged(EntityTag entity) { - this.entity = entity; - } - - EntityTag entity; - @Override - public String getPropertyString() { - if (isGuardian()) { - return getGuardian().hasLaser() ? "true" : null; + public void setPropertyValue(ElementTag param, Mechanism mechanism) { + if (mechanism.requireBoolean()) { + if (getEntity() instanceof WitherSkull entity) { + entity.setCharged(param.asBoolean()); + } + else if (getEntity() instanceof Vex entity) { + entity.setCharging(param.asBoolean()); + } + else if (getEntity() instanceof Guardian entity) { + entity.setLaser(param.asBoolean()); + } } - return String.valueOf(isCharged()); } @Override @@ -51,85 +65,6 @@ public String getPropertyId() { } public static void register() { - - // <--[tag] - // @attribute - // @returns ElementTag(Boolean) - // @mechanism EntityTag.charged - // @group properties - // @description - // If the entity is wither_skull, returns whether the skull is charged. Charged skulls are blue. - // If the entity is a vex, returns whether the vex is charging. Charging vexes have red lines. - // If the entity is a guardian, returns whether the guardian's laser is active. - // --> - PropertyParser.registerTag(EntityCharged.class, ElementTag.class, "charged", (attribute, object) -> { - return new ElementTag(object.isCharged()); - }); - - - // <--[mechanism] - // @object EntityTag - // @name charged - // @input ElementTag(Boolean) - // @description - // If the entity is wither_skull, sets whether the skull is charged. Charged skulls are blue. - // If the entity is a vex, sets whether the vex is charging. Charging vexes have red lines. - // This is a visual effect, and does not cause the vex to actually charge at anyone. - // If the entity is a guardian, sets whether the guardian's laser is active. - // Note that guardians require a target to use their laser, see <@link command attack>. - // @tags - // - // --> - PropertyParser.registerMechanism(EntityCharged.class, ElementTag.class, "charged", (object, mechanism, input) -> { - if (!mechanism.requireBoolean()) { - return; - } - if (object.isWitherSkull()) { - object.getWitherSkull().setCharged(input.asBoolean()); - } - else if (object.isVex()) { - object.getVex().setCharging(input.asBoolean()); - } - else if (object.isGuardian()) { - object.getGuardian().setLaser(input.asBoolean()); - } - }); - } - - public boolean isWitherSkull() { - return entity.getBukkitEntity() instanceof WitherSkull; - } - - public boolean isVex() { - return entity.getBukkitEntity() instanceof Vex; - } - - public boolean isGuardian() { - return entity.getBukkitEntity() instanceof Guardian; - } - - public WitherSkull getWitherSkull() { - return (WitherSkull) entity.getBukkitEntity(); - } - - public Vex getVex() { - return (Vex) entity.getBukkitEntity(); - } - - public Guardian getGuardian() { - return (Guardian) entity.getBukkitEntity(); - } - - public boolean isCharged() { - if (isWitherSkull()) { - return getWitherSkull().isCharged(); - } - else if (isVex()) { - return getVex().isCharging(); - } - else if (isGuardian()) { - return getGuardian().hasLaser(); - } - return false; + autoRegister("charged", EntityCharged.class, ElementTag.class, false); } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityChestCarrier.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityChestCarrier.java index 33446b2b52..91b5d08396 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityChestCarrier.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityChestCarrier.java @@ -3,40 +3,32 @@ import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.Mechanism; -import com.denizenscript.denizencore.objects.ObjectTag; -import com.denizenscript.denizencore.objects.properties.Property; -import com.denizenscript.denizencore.objects.properties.PropertyParser; import org.bukkit.entity.ChestedHorse; -public class EntityChestCarrier implements Property { +public class EntityChestCarrier extends EntityProperty { - public static boolean describes(ObjectTag entity) { - return entity instanceof EntityTag - && ((EntityTag) entity).getBukkitEntity() instanceof ChestedHorse; - } + // <--[property] + // @object EntityTag + // @name carries_chest + // @input ElementTag(Boolean) + // @description + // Controls whether a horse-like entity is carrying a chest. + // --> - public static EntityChestCarrier getFrom(ObjectTag entity) { - if (!describes(entity)) { - return null; - } - else { - return new EntityChestCarrier((EntityTag) entity); - } + public static boolean describes(EntityTag entity) { + return entity.getBukkitEntity() instanceof ChestedHorse; } - public static final String[] handledMechs = new String[] { - "carries_chest" - }; - - public EntityChestCarrier(EntityTag entity) { - this.entity = entity; + @Override + public ElementTag getPropertyValue() { + return new ElementTag(as(ChestedHorse.class).isCarryingChest()); } - EntityTag entity; - @Override - public String getPropertyString() { - return String.valueOf(getChestedHorse().isCarryingChest()); + public void setPropertyValue(ElementTag param, Mechanism mechanism) { + if (mechanism.requireBoolean()) { + as(ChestedHorse.class).setCarryingChest(param.asBoolean()); + } } @Override @@ -44,39 +36,7 @@ public String getPropertyId() { return "carries_chest"; } - public ChestedHorse getChestedHorse() { - return (ChestedHorse) entity.getBukkitEntity(); - } - public static void register() { - - // <--[tag] - // @attribute - // @returns ElementTag(Boolean) - // @mechanism EntityTag.carries_chest - // @group properties - // @description - // Returns whether a horse-like entity is carrying a chest. - // --> - PropertyParser.registerTag(EntityChestCarrier.class, ElementTag.class, "carries_chest", (attribute, object) -> { - return new ElementTag(object.getChestedHorse().isCarryingChest()); - }); - } - - @Override - public void adjust(Mechanism mechanism) { - - // <--[mechanism] - // @object EntityTag - // @name carries_chest - // @input ElementTag(Boolean) - // @description - // Sets whether a horse-like entity is carrying a chest. - // @tags - // - // --> - if (mechanism.matches("carries_chest") && mechanism.requireBoolean()) { - getChestedHorse().setCarryingChest(mechanism.getValue().asBoolean()); - } + autoRegister("carries_chest", EntityChestCarrier.class, ElementTag.class, false); } } From 56e98814f18f87f00f5dec58baec6d6b385fce09 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Wed, 9 Apr 2025 14:38:41 -0700 Subject: [PATCH 148/280] removed outdated hackarounds --- .../denizen/npc/DenizenNPCHelper.java | 26 +------------------ 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/npc/DenizenNPCHelper.java b/plugin/src/main/java/com/denizenscript/denizen/npc/DenizenNPCHelper.java index 92390cc044..d3ac796812 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/npc/DenizenNPCHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/npc/DenizenNPCHelper.java @@ -8,21 +8,17 @@ import com.denizenscript.denizencore.utilities.debugging.Debug; import com.denizenscript.denizen.utilities.depends.Depends; import com.denizenscript.denizencore.objects.core.ElementTag; -import com.denizenscript.denizencore.utilities.ReflectionHelper; import net.citizensnpcs.api.event.NPCDespawnEvent; import net.citizensnpcs.api.event.NPCRemoveEvent; import net.citizensnpcs.api.event.NPCSpawnEvent; import net.citizensnpcs.api.npc.NPC; -import net.citizensnpcs.api.trait.trait.Equipment; import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; -import java.lang.reflect.Field; import java.util.*; public class DenizenNPCHelper implements Listener { @@ -32,7 +28,6 @@ public class DenizenNPCHelper implements Listener { public DenizenNPCHelper() { if (Depends.citizens != null) { Bukkit.getPluginManager().registerEvents(this, Denizen.getInstance()); - INVENTORY_TRAIT_VIEW = ReflectionHelper.getFields(net.citizensnpcs.api.trait.trait.Inventory.class).get("view"); } actionHandler = new ActionHandler(); } @@ -56,17 +51,13 @@ public static Inventory getInventory(NPC npc) { if (npc == null) { return null; } - /*if (!npcInventories.containsKey(npc.getId())) { - _registerNPC(npc); - } - return npcInventories.get(npc.getId());*/ if (npc.isSpawned() && npc.getEntity() instanceof InventoryHolder) { return ((InventoryHolder) npc.getEntity()).getInventory(); } else { try { NPCTag npcTag = new NPCTag(npc); - Inventory inv = (Inventory) INVENTORY_TRAIT_VIEW.get(npcTag.getInventoryTrait()); + Inventory inv = npcTag.getInventoryTrait().getInventoryView(); if (inv != null) { return inv; } @@ -84,8 +75,6 @@ public static Inventory getInventory(NPC npc) { } } - public static Field INVENTORY_TRAIT_VIEW; - // <--[action] // @Actions // spawn @@ -156,17 +145,4 @@ public void onRemove(NPCRemoveEvent event) { NPC npc = event.getNPC(); new NPCTag(npc).action("remove", null); } - - @EventHandler - public void onInventoryClick(InventoryClickEvent event) { - Inventory inventory = event.getInventory(); - if (inventory.getHolder() instanceof NPCTag) { - NPCTag npc = (NPCTag) inventory.getHolder(); - npc.getInventory().setContents(inventory.getContents()); - Equipment equipment = npc.getEquipmentTrait(); - for (int i = 0; i < 5; i++) { - equipment.set(i, inventory.getItem(i)); - } - } - } } From eb581dd8a6b319d79b145a10009fdc534a6c136b Mon Sep 17 00:00:00 2001 From: david <89749147+davight@users.noreply.github.com> Date: Wed, 9 Apr 2025 23:43:02 +0200 Subject: [PATCH 149/280] `ItemTag.firework_power` property (#2715) * add firework_power property * remove old * fixes --- .../objects/properties/PropertyRegistry.java | 1 + .../objects/properties/item/ItemFirework.java | 36 +--------------- .../properties/item/ItemFireworkPower.java | 43 +++++++++++++++++++ 3 files changed, 45 insertions(+), 35 deletions(-) create mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFireworkPower.java diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java index 8bf9b31087..1740b8cd77 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java @@ -236,6 +236,7 @@ public static void registerMainProperties() { registerItemProperty(ItemCustomModel.class, "custom_model_data"); registerItemProperty(ItemChargedProjectile.class, "charged_projectiles"); registerItemProperty(ItemEnchantments.class, "enchantments", "stored_enchantments"); + registerItemProperty(ItemFireworkPower.class, "fireworks"); registerItemProperty(ItemFirework.class, "fireworks", "firework_explosion"); PropertyParser.registerProperty(ItemFlags.class, ItemTag.class); PropertyParser.registerProperty(ItemFrameInvisible.class, ItemTag.class); // Special case handling in ItemComponentsPatch diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFirework.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFirework.java index e1be0ec0cf..69afbc89ce 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFirework.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFirework.java @@ -40,7 +40,7 @@ public static ItemFirework getFrom(ObjectTag _item) { } public static final String[] handledMechs = new String[] { - "firework", "firework_power" + "firework" }; public ItemFirework(ItemTag _item) { @@ -141,20 +141,6 @@ public static void register() { PropertyParser.registerTag(ItemFirework.class, ListTag.class, "firework_data", (attribute, object) -> { return object.getFireworkDataMap(); }); - - // <--[tag] - // @attribute - // @returns ElementTag(Number) - // @group properties - // @mechanism ItemTag.firework_power - // @description - // Returns the firework's power. - // Power primarily affects how high the firework flies, with each level of power corresponding to approximately half a second of additional flight them. - // --> - PropertyParser.registerTag(ItemFirework.class, ElementTag.class, "firework_power", (attribute, object) -> { - ItemMeta meta = object.item.getItemMeta(); - return meta instanceof FireworkMeta ? new ElementTag(((FireworkMeta) meta).getPower()) : null; - }); } @Override @@ -171,26 +157,6 @@ public String getPropertyId() { @Override public void adjust(Mechanism mechanism) { - // <--[mechanism] - // @object ItemTag - // @name firework_power - // @input ElementTag(Number) - // @description - // Sets the power of a firework. - // @tags - // - // --> - if (mechanism.matches("firework_power") && mechanism.requireInteger()) { - if (item.getItemMeta() instanceof FireworkMeta) { - ItemMeta meta = item.getItemMeta(); - ((FireworkMeta) meta).setPower(mechanism.getValue().asInt()); - item.setItemMeta(meta); - } - else { - mechanism.echoError("Cannot set the power of a firework effect!"); - } - } - // <--[mechanism] // @object ItemTag // @name firework diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFireworkPower.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFireworkPower.java new file mode 100644 index 0000000000..77ddd4867a --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemFireworkPower.java @@ -0,0 +1,43 @@ +package com.denizenscript.denizen.objects.properties.item; + +import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; +import org.bukkit.inventory.meta.FireworkMeta; + +public class ItemFireworkPower extends ItemProperty { + + // <--[property] + // @object ItemTag + // @name firework_power + // @input ElementTag(Number) + // @description + // Controls the firework's power. + // Power primarily affects how high the firework flies, with each level of power corresponding to approximately half a second of additional flight time. + // --> + + public static boolean describes(ItemTag item) { + return item.getItemMeta() instanceof FireworkMeta; + } + + @Override + public ElementTag getPropertyValue() { + return new ElementTag(as(FireworkMeta.class).getPower()); + } + + @Override + public String getPropertyId() { + return "firework_power"; + } + + @Override + public void setPropertyValue(ElementTag value, Mechanism mechanism) { + if (mechanism.requireInteger()) { + editMeta(FireworkMeta.class, fireworkMeta -> fireworkMeta.setPower(value.asInt())); + } + } + + public static void register() { + autoRegister("firework_power", ItemFireworkPower.class, ElementTag.class, false); + } +} From 3f8cb80fc025583a5500496fe24db0a907dec4e9 Mon Sep 17 00:00:00 2001 From: MCSamuel Date: Wed, 9 Apr 2025 14:47:57 -0700 Subject: [PATCH 150/280] Fixed issues stemming from update in CitizensAPI (#2716) * Fixed issues stemming from update in CitizensAPI * removed changes from DenizenNPCHelper file * original version --- .../scripts/commands/entity/EquipCommand.java | 12 ++++++------ .../denizen/scripts/commands/entity/HeadCommand.java | 2 +- .../denizen/scripts/commands/npc/FishCommand.java | 3 ++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/EquipCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/EquipCommand.java index 59f35cdbca..ffdc4e0dc3 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/EquipCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/EquipCommand.java @@ -141,22 +141,22 @@ else if (entity.isCitizensNPC()) { if (npc != null) { Equipment trait = npc.getEquipmentTrait(); if (equipment.get("hand") != null) { - trait.set(0, equipment.get("hand").getItemStack()); + trait.set(Equipment.EquipmentSlot.HAND, equipment.get("hand").getItemStack()); } if (equipment.get("head") != null) { - trait.set(1, equipment.get("head").getItemStack()); + trait.set(Equipment.EquipmentSlot.HELMET, equipment.get("head").getItemStack()); } if (equipment.get("chest") != null) { - trait.set(2, equipment.get("chest").getItemStack()); + trait.set(Equipment.EquipmentSlot.CHESTPLATE, equipment.get("chest").getItemStack()); } if (equipment.get("legs") != null) { - trait.set(3, equipment.get("legs").getItemStack()); + trait.set(Equipment.EquipmentSlot.LEGGINGS, equipment.get("legs").getItemStack()); } if (equipment.get("boots") != null) { - trait.set(4, equipment.get("boots").getItemStack()); + trait.set(Equipment.EquipmentSlot.BOOTS, equipment.get("boots").getItemStack()); } if (equipment.get("offhand") != null) { - trait.set(5, equipment.get("offhand").getItemStack()); + trait.set(Equipment.EquipmentSlot.OFF_HAND, equipment.get("offhand").getItemStack()); } if (npc.isSpawned()) { LivingEntity livingEntity = npc.getLivingEntity(); diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/HeadCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/HeadCommand.java index 7fdb1618f6..3dfc39660b 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/HeadCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/HeadCommand.java @@ -85,7 +85,7 @@ else if (material != null) { entity.getDenizenNPC().getCitizen().addTrait(Equipment.class); } Equipment trait = entity.getDenizenNPC().getCitizen().getOrAddTrait(Equipment.class); - trait.set(1, item); + trait.set(Equipment.EquipmentSlot.HELMET, item); } else if (entity.isPlayer()) { entity.getPlayer().getInventory().setHelmet(item); diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/FishCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/FishCommand.java index 6021e2814b..414559a7e9 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/FishCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/FishCommand.java @@ -11,6 +11,7 @@ import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.scripts.ScriptEntry; import com.denizenscript.denizencore.scripts.commands.AbstractCommand; +import net.citizensnpcs.api.trait.trait.Equipment; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; @@ -96,7 +97,7 @@ public void execute(ScriptEntry scriptEntry) { trait.stopFishing(); return; } - npc.getEquipmentTrait().set(0, new ItemStack(Material.FISHING_ROD)); + npc.getEquipmentTrait().set(Equipment.EquipmentSlot.HAND, new ItemStack(Material.FISHING_ROD)); trait.setCatchPercent(percent.asInt()); trait.setCatchType(FishingHelper.CatchType.valueOf(catchtype.asString().toUpperCase())); trait.startFishing(location); From 7f9f2c8befe9d3f2cc059cef61a8d1f65d1f4a2f Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Sat, 12 Apr 2025 16:24:13 -0700 Subject: [PATCH 151/280] patch build error from Bungee-Chat api change --- .../denizenscript/denizen/nms/NMSHandler.java | 3 +++ .../utilities/FormattedTextHelper.java | 21 ++++------------ .../denizen/nms/v1_17/Handler.java | 24 +++++++++++++++++-- .../denizen/nms/v1_18/Handler.java | 24 +++++++++++++++++-- .../denizen/nms/v1_19/Handler.java | 24 +++++++++++++++++-- .../denizen/nms/v1_20/Handler.java | 24 +++++++++++++++++-- .../denizen/nms/v1_21/Handler.java | 24 +++++++++++++++++-- 7 files changed, 117 insertions(+), 27 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java b/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java index d63dd2a5e8..11b598603c 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java @@ -5,6 +5,7 @@ import com.denizenscript.denizen.nms.util.PlayerProfile; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; import com.denizenscript.denizen.nms.util.jnbt.Tag; +import com.google.gson.Gson; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.NamespacedKey; @@ -146,4 +147,6 @@ public void setBossbarUUID(BossBar bar, UUID id) { public String updateLegacyName(Class type, String legacyName) { return legacyName; } + + public abstract Gson getVanillaStyleSpigotComponentGSON(); // TODO: Once 1.21 is the minimum version, de-module this } diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/FormattedTextHelper.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/FormattedTextHelper.java index ea5f23417f..17f0fe1d06 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/FormattedTextHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/FormattedTextHelper.java @@ -12,11 +12,8 @@ import com.denizenscript.denizencore.utilities.CoreUtilities; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.*; -import net.md_5.bungee.api.chat.hover.content.*; -import net.md_5.bungee.chat.*; import java.util.List; @@ -860,22 +857,12 @@ public static String bukkitSafeDebugTrimming(String message) { return message; } - // Spigot ComponentSerializer - public static final Gson vanillaStyleSpigotComponentGSON = new GsonBuilder() - .registerTypeAdapter(BaseComponent.class, new ComponentSerializer()) - .registerTypeAdapter(TextComponent.class, new TextComponentSerializer()) - .registerTypeAdapter(TranslatableComponent.class, new TranslatableComponentSerializer()) - .registerTypeAdapter(KeybindComponent.class, new KeybindComponentSerializer()) - .registerTypeAdapter(ScoreComponent.class, new ScoreComponentSerializer()) - .registerTypeAdapter(SelectorComponent.class, new SelectorComponentSerializer()) - .registerTypeAdapter(Entity.class, new EntitySerializer()) - .registerTypeAdapter(Text.class, new TextSerializer()) - .registerTypeAdapter(Item.class, new ItemSerializer()) - .registerTypeAdapter(ItemTag.class, new ItemTag.Serializer()) - .disableHtmlEscaping() // Mojang - .create(); + public static Gson vanillaStyleSpigotComponentGSON = null; public static String componentToJson(BaseComponent[] components) { + if (vanillaStyleSpigotComponentGSON == null) { + vanillaStyleSpigotComponentGSON = NMSHandler.instance.getVanillaStyleSpigotComponentGSON(); + } if (components.length == 1) { return vanillaStyleSpigotComponentGSON.toJson(components[0]); } diff --git a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/Handler.java b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/Handler.java index 494a7005ad..8ade3871e7 100644 --- a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/Handler.java +++ b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/Handler.java @@ -19,10 +19,13 @@ import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.google.common.collect.Iterables; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.chat.ComponentSerializer; +import net.md_5.bungee.api.chat.*; +import net.md_5.bungee.api.chat.hover.content.*; +import net.md_5.bungee.chat.*; import net.minecraft.core.Registry; import net.minecraft.nbt.ByteArrayTag; import net.minecraft.nbt.StringTag; @@ -288,4 +291,21 @@ public static MutableComponent componentToNMS(BaseComponent[] spigot) { String json = ComponentSerializer.toString(spigot); return Component.Serializer.fromJson(json); } + + @Override + public Gson getVanillaStyleSpigotComponentGSON() { + return new GsonBuilder() + .registerTypeAdapter(BaseComponent.class, new ComponentSerializer()) + .registerTypeAdapter(TextComponent.class, new TextComponentSerializer()) + .registerTypeAdapter(TranslatableComponent.class, new TranslatableComponentSerializer()) + .registerTypeAdapter(KeybindComponent.class, new KeybindComponentSerializer()) + .registerTypeAdapter(ScoreComponent.class, new ScoreComponentSerializer()) + .registerTypeAdapter(SelectorComponent.class, new SelectorComponentSerializer()) + .registerTypeAdapter(net.md_5.bungee.api.chat.hover.content.Entity.class, new EntitySerializer()) + .registerTypeAdapter(Text.class, new TextSerializer()) + .registerTypeAdapter(Item.class, new ItemSerializer()) + .registerTypeAdapter(ItemTag.class, new ItemTag.Serializer()) + .disableHtmlEscaping() // Mojang + .create(); + } } diff --git a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/Handler.java b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/Handler.java index b630e954e3..6d54647e0c 100644 --- a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/Handler.java +++ b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/Handler.java @@ -22,11 +22,14 @@ import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.google.common.collect.Iterables; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.chat.ComponentSerializer; +import net.md_5.bungee.api.chat.*; +import net.md_5.bungee.api.chat.hover.content.*; +import net.md_5.bungee.chat.*; import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.minecraft.nbt.ByteArrayTag; @@ -318,4 +321,21 @@ public static MutableComponent componentToNMS(BaseComponent[] spigot) { String json = ComponentSerializer.toString(spigot); return Component.Serializer.fromJson(json); } + + @Override + public Gson getVanillaStyleSpigotComponentGSON() { + return new GsonBuilder() + .registerTypeAdapter(BaseComponent.class, new ComponentSerializer()) + .registerTypeAdapter(TextComponent.class, new TextComponentSerializer()) + .registerTypeAdapter(TranslatableComponent.class, new TranslatableComponentSerializer()) + .registerTypeAdapter(KeybindComponent.class, new KeybindComponentSerializer()) + .registerTypeAdapter(ScoreComponent.class, new ScoreComponentSerializer()) + .registerTypeAdapter(SelectorComponent.class, new SelectorComponentSerializer()) + .registerTypeAdapter(net.md_5.bungee.api.chat.hover.content.Entity.class, new EntitySerializer()) + .registerTypeAdapter(Text.class, new TextSerializer()) + .registerTypeAdapter(Item.class, new ItemSerializer()) + .registerTypeAdapter(ItemTag.class, new ItemTag.Serializer()) + .disableHtmlEscaping() // Mojang + .create(); + } } diff --git a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/Handler.java b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/Handler.java index 092966dfe9..0206d31c2f 100644 --- a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/Handler.java +++ b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/Handler.java @@ -22,11 +22,14 @@ import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.google.common.collect.Iterables; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.chat.ComponentSerializer; +import net.md_5.bungee.api.chat.*; +import net.md_5.bungee.api.chat.hover.content.*; +import net.md_5.bungee.chat.*; import net.minecraft.core.Holder; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.ByteArrayTag; @@ -339,4 +342,21 @@ public static MutableComponent componentToNMS(BaseComponent[] spigot) { String json = FormattedTextHelper.componentToJson(spigot); return Component.Serializer.fromJson(json); } + + @Override + public Gson getVanillaStyleSpigotComponentGSON() { + return new GsonBuilder() + .registerTypeAdapter(BaseComponent.class, new ComponentSerializer()) + .registerTypeAdapter(TextComponent.class, new TextComponentSerializer()) + .registerTypeAdapter(TranslatableComponent.class, new TranslatableComponentSerializer()) + .registerTypeAdapter(KeybindComponent.class, new KeybindComponentSerializer()) + .registerTypeAdapter(ScoreComponent.class, new ScoreComponentSerializer()) + .registerTypeAdapter(SelectorComponent.class, new SelectorComponentSerializer()) + .registerTypeAdapter(net.md_5.bungee.api.chat.hover.content.Entity.class, new EntitySerializer()) + .registerTypeAdapter(Text.class, new TextSerializer()) + .registerTypeAdapter(Item.class, new ItemSerializer()) + .registerTypeAdapter(ItemTag.class, new ItemTag.Serializer()) + .disableHtmlEscaping() // Mojang + .create(); + } } diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java index 4e3fe1d156..074b027c27 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java @@ -31,13 +31,16 @@ import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.google.common.collect.Iterables; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; import com.mojang.authlib.yggdrasil.ProfileResult; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.chat.ComponentSerializer; +import net.md_5.bungee.api.chat.*; +import net.md_5.bungee.api.chat.hover.content.*; +import net.md_5.bungee.chat.*; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.core.Rotations; @@ -389,4 +392,21 @@ public static Component componentToNMS(BaseComponent[] spigot) { } return CraftChatMessage.fromJSONOrNull(FormattedTextHelper.componentToJson(spigot)); } + + @Override + public Gson getVanillaStyleSpigotComponentGSON() { + return new GsonBuilder() + .registerTypeAdapter(BaseComponent.class, new ComponentSerializer()) + .registerTypeAdapter(TextComponent.class, new TextComponentSerializer()) + .registerTypeAdapter(TranslatableComponent.class, new TranslatableComponentSerializer()) + .registerTypeAdapter(KeybindComponent.class, new KeybindComponentSerializer()) + .registerTypeAdapter(ScoreComponent.class, new ScoreComponentSerializer()) + .registerTypeAdapter(SelectorComponent.class, new SelectorComponentSerializer()) + .registerTypeAdapter(net.md_5.bungee.api.chat.hover.content.Entity.class, new EntitySerializer()) + .registerTypeAdapter(Text.class, new TextSerializer()) + .registerTypeAdapter(Item.class, new ItemSerializer()) + .registerTypeAdapter(net.md_5.bungee.api.chat.ItemTag.class, new net.md_5.bungee.api.chat.ItemTag.Serializer()) + .disableHtmlEscaping() // Mojang + .create(); + } } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java index 878efc32c3..2a4e76d9d0 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java @@ -32,13 +32,16 @@ import com.denizenscript.denizencore.utilities.debugging.Debug; import com.denizenscript.denizencore.utilities.debugging.DebugInternals; import com.google.common.collect.Iterables; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; import com.mojang.authlib.yggdrasil.ProfileResult; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.chat.ComponentSerializer; +import net.md_5.bungee.api.chat.*; +import net.md_5.bungee.api.chat.hover.content.*; +import net.md_5.bungee.chat.*; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.core.Rotations; @@ -392,4 +395,21 @@ public static Component componentToNMS(BaseComponent[] spigot) { public String updateLegacyName(Class type, String legacyName) { return FieldRename.rename(ApiVersion.FIELD_NAME_PARITY, DebugInternals.getFullClassNameOpti(type).replace('.', '/'), legacyName); } + + @Override + public Gson getVanillaStyleSpigotComponentGSON() { + return new GsonBuilder() + .registerTypeAdapter(BaseComponent.class, new ComponentSerializer()) + .registerTypeAdapter(TextComponent.class, new TextComponentSerializer(VersionedComponentSerializer.getDefault())) + .registerTypeAdapter(TranslatableComponent.class, new TranslatableComponentSerializer(VersionedComponentSerializer.getDefault())) + .registerTypeAdapter(KeybindComponent.class, new KeybindComponentSerializer(VersionedComponentSerializer.getDefault())) + .registerTypeAdapter(ScoreComponent.class, new ScoreComponentSerializer(VersionedComponentSerializer.getDefault())) + .registerTypeAdapter(SelectorComponent.class, new SelectorComponentSerializer(VersionedComponentSerializer.getDefault())) + .registerTypeAdapter(net.md_5.bungee.api.chat.hover.content.Entity.class, new EntitySerializer(VersionedComponentSerializer.getDefault())) + .registerTypeAdapter(Text.class, new TextSerializer()) + .registerTypeAdapter(Item.class, new ItemSerializer()) + .registerTypeAdapter(net.md_5.bungee.api.chat.ItemTag.class, new net.md_5.bungee.api.chat.ItemTag.Serializer()) + .disableHtmlEscaping() // Mojang + .create(); + } } From 26eb476c6af0193c9a20e3a1e6adcbdca7597adf Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Sun, 13 Apr 2025 02:28:46 -0700 Subject: [PATCH 152/280] fix meta mistake --- .../denizen/objects/properties/item/ItemCustomModel.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemCustomModel.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemCustomModel.java index 0360bb63de..c47897271e 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemCustomModel.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemCustomModel.java @@ -15,9 +15,7 @@ public class ItemCustomModel extends ItemProperty { // @description // Controls the custom model data ID number of the item. // Use with no input to remove the custom model data. - // @tags - // - // + // See also <@link tag ItemTag.has_custom_model_data> // --> public static boolean describes(ItemTag item) { return !item.getBukkitMaterial().isAir(); From 3c81361052e37bab46a3eb3e41f9e05ed0fce611 Mon Sep 17 00:00:00 2001 From: MCSamuel Date: Sun, 13 Apr 2025 02:57:34 -0700 Subject: [PATCH 153/280] `EntityTag.temper/max_temper` properties (#2707) * Domesticaion and max_domestication properties added * Meta updates * more meta updates and property renaming * taming calculation and method clarified * taming calculation and meta changes * more meta changes --- .../objects/properties/PropertyRegistry.java | 2 + .../properties/entity/EntityMaxTemper.java | 53 ++++++++++++++++++ .../properties/entity/EntityTemper.java | 54 +++++++++++++++++++ 3 files changed, 109 insertions(+) create mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityMaxTemper.java create mode 100644 plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityTemper.java diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java index 1740b8cd77..f981c2a8db 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java @@ -126,6 +126,7 @@ public static void registerMainProperties() { PropertyParser.registerProperty(EntityMarker.class, EntityTag.class); PropertyParser.registerProperty(EntityMaterial.class, EntityTag.class); PropertyParser.registerProperty(EntityMaxFuseTicks.class, EntityTag.class); + PropertyParser.registerProperty(EntityMaxTemper.class, EntityTag.class); if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { PropertyParser.registerProperty(EntityOnBack.class, EntityTag.class); PropertyParser.registerProperty(EntityOpacity.class, EntityTag.class); @@ -182,6 +183,7 @@ public static void registerMainProperties() { if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { PropertyParser.registerProperty(EntityTeleportDuration.class, EntityTag.class); } + PropertyParser.registerProperty(EntityTemper.class, EntityTag.class); if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { PropertyParser.registerProperty(EntityText.class, EntityTag.class); PropertyParser.registerProperty(EntityTextShadowed.class, EntityTag.class); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityMaxTemper.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityMaxTemper.java new file mode 100644 index 0000000000..d580d03054 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityMaxTemper.java @@ -0,0 +1,53 @@ +package com.denizenscript.denizen.objects.properties.entity; + +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; +import org.bukkit.entity.AbstractHorse; + +public class EntityMaxTemper extends EntityProperty { + + // <--[property] + // @object EntityTag + // @name max_temper + // @input ElementTag(Number) + // @description + // Controls the upper-bound for a horse-type entity's chance to be tamed. + // + // When a player mounts an entity, a number between 0 and the entity's max temper is generated. + // The entity becomes tamed if this value is less than the entity's temper value. + // Otherwise, the player gets bucked and increases the entity's temper by 5. + // + // Because an entity must have a level to reach before it can be tamed, value must be 1 or higher. + // Default value for llamas and trader llamas is 30. + // Default value for all other entities is 100. + // + // To control the entity's current temper, see <@link mechanism EntityTag.temper>. + // To automatically tame an entity, see <@link mechanism EntityTag.tame>. + // --> + + public static boolean describes(EntityTag entity) { + return entity.getBukkitEntity() instanceof AbstractHorse; + } + + @Override + public ElementTag getPropertyValue() { + return new ElementTag(as(AbstractHorse.class).getMaxDomestication()); + } + + @Override + public void setPropertyValue(ElementTag param, Mechanism mechanism) { + if (mechanism.requireInteger()) { + as(AbstractHorse.class).setMaxDomestication(param.asInt()); + } + } + + @Override + public String getPropertyId() { + return "max_temper"; + } + + public static void register() { + autoRegister("max_temper", EntityMaxTemper.class, ElementTag.class, false); + } +} diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityTemper.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityTemper.java new file mode 100644 index 0000000000..54ee4b5a1a --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityTemper.java @@ -0,0 +1,54 @@ +package com.denizenscript.denizen.objects.properties.entity; + +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; +import org.bukkit.entity.AbstractHorse; + +public class EntityTemper extends EntityProperty { + + // <--[property] + // @object EntityTag + // @name temper + // @input ElementTag(Number) + // @description + // Controls the temper of a horse-type entity. + // A value of 0 indicates that no action has been done to try to domesticate this entity. + // + // When a player mounts an entity, a number between 0 and the entity's max temper is generated. + // The entity becomes tamed if this value is less than the entity's temper value. + // Otherwise, the player gets bucked and increases the entity's temper by 5. + // Temper can also be increased by feeding the entity. + // - Apples, sugar, and wheat increase temper by 3. + // - Golden carrots increase temper by 5. + // - Golden apples increase temper by 10. + // + // To control the entity's max temper, see <@link mechanism EntityTag.max_temper>. + // To automatically tame an entity, see <@link mechanism EntityTag.tame>. + // --> + + public static boolean describes(EntityTag entity) { + return entity.getBukkitEntity() instanceof AbstractHorse; + } + + @Override + public ElementTag getPropertyValue() { + return new ElementTag(as(AbstractHorse.class).getDomestication()); + } + + @Override + public void setPropertyValue(ElementTag param, Mechanism mechanism) { + if (mechanism.requireInteger()) { + as(AbstractHorse.class).setDomestication(param.asInt()); + } + } + + @Override + public String getPropertyId() { + return "temper"; + } + + public static void register() { + autoRegister("temper", EntityTemper.class, ElementTag.class, false); + } +} From 1ebbea027723d1444f818e0a1e29211676884cc0 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Wed, 16 Apr 2025 19:53:52 +0100 Subject: [PATCH 154/280] 1.21.5 Bungee chat fixes (#2718) * Revert "patch build error from Bungee-Chat api change" This reverts commit 7f9f2c8befe9d3f2cc059cef61a8d1f65d1f4a2f. * Make `NMSHandler#getVersion` work during startup * Use correct serializer for parsing components JSON * Fix `vanillaStyleSpigotComponentGSON` creation * Fix `HoverFormatHelper` serialization workarounds --- .../denizen/paper/PaperModule.java | 3 +- .../com/denizenscript/denizen/Denizen.java | 1 - .../PlayerReceivesMessageScriptEvent.java | 9 +++--- .../denizenscript/denizen/nms/NMSHandler.java | 12 ++++---- .../bukkit/BukkitElementExtensions.java | 3 +- .../objects/properties/item/ItemBook.java | 3 +- .../utilities/FormattedTextHelper.java | 30 ++++++++++++++++--- .../denizen/utilities/HoverFormatHelper.java | 11 +++++-- .../denizen/nms/v1_17/Handler.java | 24 ++------------- .../denizen/nms/v1_18/Handler.java | 24 ++------------- .../denizen/nms/v1_19/Handler.java | 24 ++------------- .../denizen/nms/v1_20/Handler.java | 24 ++------------- .../denizen/nms/v1_21/Handler.java | 25 ++-------------- .../network/packets/PacketOutChatImpl.java | 4 +-- 14 files changed, 61 insertions(+), 136 deletions(-) diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java index 6b59784a02..2771e225b4 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java @@ -18,7 +18,6 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.chat.ComponentSerializer; import org.bukkit.Bukkit; public class PaperModule { @@ -156,7 +155,7 @@ public static String stringifyComponent(Component component) { if (component == null) { return null; } - return FormattedTextHelper.stringify(ComponentSerializer.parse(componentToJson(component))); + return FormattedTextHelper.stringify(FormattedTextHelper.parseJson(componentToJson(component))); } public static Component jsonToComponent(String json) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/Denizen.java b/plugin/src/main/java/com/denizenscript/denizen/Denizen.java index 1c8699866c..dd001d7fb1 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/Denizen.java +++ b/plugin/src/main/java/com/denizenscript/denizen/Denizen.java @@ -371,7 +371,6 @@ else if (javaVersion.startsWith("21")) { ExSustainedCommandHandler exsCommand = new ExSustainedCommandHandler(); exsCommand.enableFor(getCommand("exs")); FullBlockData.init(); - HoverFormatHelper.tryInitializeItemHoverFix(); // Load script files without processing. DenizenCore.preloadScripts(false, null); // Load the saves.yml into memory diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerReceivesMessageScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerReceivesMessageScriptEvent.java index a631abc8d8..46efe9d46f 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerReceivesMessageScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerReceivesMessageScriptEvent.java @@ -1,17 +1,16 @@ package com.denizenscript.denizen.events.player; +import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizen.objects.PlayerTag; import com.denizenscript.denizen.utilities.FormattedTextHelper; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; -import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizen.utilities.packets.NetworkInterceptHelper; -import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; import com.denizenscript.denizencore.utilities.CoreUtilities; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.chat.ComponentSerializer; public class PlayerReceivesMessageScriptEvent extends BukkitScriptEvent { @@ -97,7 +96,7 @@ public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) { if (lower.startsWith("raw_json:")) { rawJson = new ElementTag(determination.substring("raw_json:".length())); altMessageDetermination = null; - message = new ElementTag(FormattedTextHelper.stringify(ComponentSerializer.parse(rawJson.asString())), true); + message = new ElementTag(FormattedTextHelper.stringify(FormattedTextHelper.parseJson(rawJson.asString())), true); modified = true; return true; } @@ -127,7 +126,7 @@ public ObjectTag getContext(String name) { public PlayerReceivesMessageScriptEvent triggerNow() { PlayerReceivesMessageScriptEvent event = (PlayerReceivesMessageScriptEvent) fire(); if (event.modified && event.altMessageDetermination == null) { - event.altMessageDetermination = ComponentSerializer.parse(event.rawJson.asString()); + event.altMessageDetermination = FormattedTextHelper.parseJson(event.rawJson.asString()); } return event; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java b/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java index 11b598603c..e24e339067 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java @@ -5,7 +5,6 @@ import com.denizenscript.denizen.nms.util.PlayerProfile; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; import com.denizenscript.denizen.nms.util.jnbt.Tag; -import com.google.gson.Gson; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.NamespacedKey; @@ -32,8 +31,7 @@ public abstract class NMSHandler { public static boolean debugPackets = false; public static String debugPacketFilter = ""; - public static boolean initialize(JavaPlugin plugin) { - javaPlugin = plugin; + static { String bukkitVersion = Bukkit.getBukkitVersion(); for (NMSVersion potentialVersion : NMSVersion.values()) { if (bukkitVersion.startsWith(potentialVersion.minecraftVersion)) { @@ -43,6 +41,12 @@ public static boolean initialize(JavaPlugin plugin) { } if (version == null) { version = NMSVersion.NOT_SUPPORTED; + } + } + + public static boolean initialize(JavaPlugin plugin) { + javaPlugin = plugin; + if (getVersion() == NMSVersion.NOT_SUPPORTED) { instance = null; return false; } @@ -147,6 +151,4 @@ public void setBossbarUUID(BossBar bar, UUID id) { public String updateLegacyName(Class type, String legacyName) { return legacyName; } - - public abstract Gson getVanillaStyleSpigotComponentGSON(); // TODO: Once 1.21 is the minimum version, de-module this } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/bukkit/BukkitElementExtensions.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/bukkit/BukkitElementExtensions.java index 380212be83..036b48d362 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/bukkit/BukkitElementExtensions.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/bukkit/BukkitElementExtensions.java @@ -19,7 +19,6 @@ import com.denizenscript.denizencore.utilities.CoreUtilities; import com.denizenscript.denizencore.utilities.Deprecations; import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.chat.ComponentSerializer; import java.nio.charset.StandardCharsets; @@ -442,7 +441,7 @@ public static void register() { // Inverts <@link tag ElementTag.to_raw_json>. // --> ElementTag.tagProcessor.registerStaticTag(ElementTag.class, "from_raw_json", (attribute, object) -> { - return new ElementTag(FormattedTextHelper.stringify(ComponentSerializer.parse(object.asString()))); + return new ElementTag(FormattedTextHelper.stringify(FormattedTextHelper.parseJson(object.asString()))); }); // <--[tag] diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemBook.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemBook.java index b2947996d8..b428803ccf 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemBook.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemBook.java @@ -12,7 +12,6 @@ import com.denizenscript.denizencore.tags.core.EscapeTagUtil; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.chat.ComponentSerializer; import org.bukkit.Material; import org.bukkit.inventory.meta.BookMeta; @@ -277,7 +276,7 @@ public static void register() { if (data.get(0).equalsIgnoreCase("raw_pages")) { List newPages = new ArrayList<>(data.size()); for (int i = 1; i < data.size(); i++) { - newPages.add(ComponentSerializer.parse(EscapeTagUtil.unEscape(data.get(i)))); + newPages.add(FormattedTextHelper.parseJson(EscapeTagUtil.unEscape(data.get(i)))); } bookMeta.spigot().setPages(newPages); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/FormattedTextHelper.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/FormattedTextHelper.java index 17f0fe1d06..67392b5fa9 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/FormattedTextHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/FormattedTextHelper.java @@ -10,10 +10,14 @@ import com.denizenscript.denizencore.utilities.AsciiMatcher; import com.denizenscript.denizencore.utilities.CoreConfiguration; import com.denizenscript.denizencore.utilities.CoreUtilities; +import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.google.gson.Gson; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.*; +import net.md_5.bungee.chat.ChatVersion; +import net.md_5.bungee.chat.ComponentSerializer; +import net.md_5.bungee.chat.VersionedComponentSerializer; import java.util.List; @@ -857,15 +861,33 @@ public static String bukkitSafeDebugTrimming(String message) { return message; } - public static Gson vanillaStyleSpigotComponentGSON = null; + public static Gson getBungeeGson() { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + return VersionedComponentSerializer.forVersion(ChatVersion.V1_21_5).getGson(); + } + else { + return ReflectionHelper.getFieldValue(ComponentSerializer.class, "gson", null); + } + } + + static { + // Explicitly before initializing vanillaStyleSpigotComponentGSON + HoverFormatHelper.tryInitializeItemHoverFix(); + } + + public static final Gson vanillaStyleSpigotComponentGSON = getBungeeGson().newBuilder().disableHtmlEscaping().create(); public static String componentToJson(BaseComponent[] components) { - if (vanillaStyleSpigotComponentGSON == null) { - vanillaStyleSpigotComponentGSON = NMSHandler.instance.getVanillaStyleSpigotComponentGSON(); - } if (components.length == 1) { return vanillaStyleSpigotComponentGSON.toJson(components[0]); } return vanillaStyleSpigotComponentGSON.toJson(new TextComponent(components)); } + + public static BaseComponent[] parseJson(String json) { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + return VersionedComponentSerializer.forVersion(ChatVersion.V1_21_5).parse(json); + } + return ComponentSerializer.parse(json); + } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/HoverFormatHelper.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/HoverFormatHelper.java index 21b75f37b0..e28d5c072d 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/HoverFormatHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/HoverFormatHelper.java @@ -13,7 +13,9 @@ import net.md_5.bungee.api.chat.HoverEvent; import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.chat.hover.content.*; +import net.md_5.bungee.chat.ChatVersion; import net.md_5.bungee.chat.ComponentSerializer; +import net.md_5.bungee.chat.VersionedComponentSerializer; import org.bukkit.Bukkit; import org.bukkit.Registry; import org.bukkit.inventory.ItemStack; @@ -94,7 +96,7 @@ public static void tryInitializeItemHoverFix() { if (!NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { return; } - Gson bungeeGson = ReflectionHelper.getFieldValue(ComponentSerializer.class, "gson", null); + Gson bungeeGson = FormattedTextHelper.getBungeeGson(); if (bungeeGson == null) { return; } @@ -103,7 +105,12 @@ public static void tryInitializeItemHoverFix() { .registerTypeAdapter(Item.class, new FixedItemHoverSerializer()) .create(); try { - ReflectionHelper.getFinalSetter(ComponentSerializer.class, "gson").invoke(fixedGson); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + ReflectionHelper.setFieldValue(VersionedComponentSerializer.class, "gson", VersionedComponentSerializer.forVersion(ChatVersion.V1_21_5), fixedGson); + } + else { + ReflectionHelper.getFinalSetter(ComponentSerializer.class, "gson").invoke(fixedGson); + } } catch (Throwable e) { Debug.echoError(e); diff --git a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/Handler.java b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/Handler.java index 8ade3871e7..494a7005ad 100644 --- a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/Handler.java +++ b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/Handler.java @@ -19,13 +19,10 @@ import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.google.common.collect.Iterables; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; -import net.md_5.bungee.api.chat.*; -import net.md_5.bungee.api.chat.hover.content.*; -import net.md_5.bungee.chat.*; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.chat.ComponentSerializer; import net.minecraft.core.Registry; import net.minecraft.nbt.ByteArrayTag; import net.minecraft.nbt.StringTag; @@ -291,21 +288,4 @@ public static MutableComponent componentToNMS(BaseComponent[] spigot) { String json = ComponentSerializer.toString(spigot); return Component.Serializer.fromJson(json); } - - @Override - public Gson getVanillaStyleSpigotComponentGSON() { - return new GsonBuilder() - .registerTypeAdapter(BaseComponent.class, new ComponentSerializer()) - .registerTypeAdapter(TextComponent.class, new TextComponentSerializer()) - .registerTypeAdapter(TranslatableComponent.class, new TranslatableComponentSerializer()) - .registerTypeAdapter(KeybindComponent.class, new KeybindComponentSerializer()) - .registerTypeAdapter(ScoreComponent.class, new ScoreComponentSerializer()) - .registerTypeAdapter(SelectorComponent.class, new SelectorComponentSerializer()) - .registerTypeAdapter(net.md_5.bungee.api.chat.hover.content.Entity.class, new EntitySerializer()) - .registerTypeAdapter(Text.class, new TextSerializer()) - .registerTypeAdapter(Item.class, new ItemSerializer()) - .registerTypeAdapter(ItemTag.class, new ItemTag.Serializer()) - .disableHtmlEscaping() // Mojang - .create(); - } } diff --git a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/Handler.java b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/Handler.java index 6d54647e0c..b630e954e3 100644 --- a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/Handler.java +++ b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/Handler.java @@ -22,14 +22,11 @@ import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.google.common.collect.Iterables; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.chat.*; -import net.md_5.bungee.api.chat.hover.content.*; -import net.md_5.bungee.chat.*; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.chat.ComponentSerializer; import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.minecraft.nbt.ByteArrayTag; @@ -321,21 +318,4 @@ public static MutableComponent componentToNMS(BaseComponent[] spigot) { String json = ComponentSerializer.toString(spigot); return Component.Serializer.fromJson(json); } - - @Override - public Gson getVanillaStyleSpigotComponentGSON() { - return new GsonBuilder() - .registerTypeAdapter(BaseComponent.class, new ComponentSerializer()) - .registerTypeAdapter(TextComponent.class, new TextComponentSerializer()) - .registerTypeAdapter(TranslatableComponent.class, new TranslatableComponentSerializer()) - .registerTypeAdapter(KeybindComponent.class, new KeybindComponentSerializer()) - .registerTypeAdapter(ScoreComponent.class, new ScoreComponentSerializer()) - .registerTypeAdapter(SelectorComponent.class, new SelectorComponentSerializer()) - .registerTypeAdapter(net.md_5.bungee.api.chat.hover.content.Entity.class, new EntitySerializer()) - .registerTypeAdapter(Text.class, new TextSerializer()) - .registerTypeAdapter(Item.class, new ItemSerializer()) - .registerTypeAdapter(ItemTag.class, new ItemTag.Serializer()) - .disableHtmlEscaping() // Mojang - .create(); - } } diff --git a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/Handler.java b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/Handler.java index 0206d31c2f..092966dfe9 100644 --- a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/Handler.java +++ b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/Handler.java @@ -22,14 +22,11 @@ import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.google.common.collect.Iterables; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.chat.*; -import net.md_5.bungee.api.chat.hover.content.*; -import net.md_5.bungee.chat.*; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.chat.ComponentSerializer; import net.minecraft.core.Holder; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.ByteArrayTag; @@ -342,21 +339,4 @@ public static MutableComponent componentToNMS(BaseComponent[] spigot) { String json = FormattedTextHelper.componentToJson(spigot); return Component.Serializer.fromJson(json); } - - @Override - public Gson getVanillaStyleSpigotComponentGSON() { - return new GsonBuilder() - .registerTypeAdapter(BaseComponent.class, new ComponentSerializer()) - .registerTypeAdapter(TextComponent.class, new TextComponentSerializer()) - .registerTypeAdapter(TranslatableComponent.class, new TranslatableComponentSerializer()) - .registerTypeAdapter(KeybindComponent.class, new KeybindComponentSerializer()) - .registerTypeAdapter(ScoreComponent.class, new ScoreComponentSerializer()) - .registerTypeAdapter(SelectorComponent.class, new SelectorComponentSerializer()) - .registerTypeAdapter(net.md_5.bungee.api.chat.hover.content.Entity.class, new EntitySerializer()) - .registerTypeAdapter(Text.class, new TextSerializer()) - .registerTypeAdapter(Item.class, new ItemSerializer()) - .registerTypeAdapter(ItemTag.class, new ItemTag.Serializer()) - .disableHtmlEscaping() // Mojang - .create(); - } } diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java index 074b027c27..4e3fe1d156 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java @@ -31,16 +31,13 @@ import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.google.common.collect.Iterables; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; import com.mojang.authlib.yggdrasil.ProfileResult; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.chat.*; -import net.md_5.bungee.api.chat.hover.content.*; -import net.md_5.bungee.chat.*; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.chat.ComponentSerializer; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.core.Rotations; @@ -392,21 +389,4 @@ public static Component componentToNMS(BaseComponent[] spigot) { } return CraftChatMessage.fromJSONOrNull(FormattedTextHelper.componentToJson(spigot)); } - - @Override - public Gson getVanillaStyleSpigotComponentGSON() { - return new GsonBuilder() - .registerTypeAdapter(BaseComponent.class, new ComponentSerializer()) - .registerTypeAdapter(TextComponent.class, new TextComponentSerializer()) - .registerTypeAdapter(TranslatableComponent.class, new TranslatableComponentSerializer()) - .registerTypeAdapter(KeybindComponent.class, new KeybindComponentSerializer()) - .registerTypeAdapter(ScoreComponent.class, new ScoreComponentSerializer()) - .registerTypeAdapter(SelectorComponent.class, new SelectorComponentSerializer()) - .registerTypeAdapter(net.md_5.bungee.api.chat.hover.content.Entity.class, new EntitySerializer()) - .registerTypeAdapter(Text.class, new TextSerializer()) - .registerTypeAdapter(Item.class, new ItemSerializer()) - .registerTypeAdapter(net.md_5.bungee.api.chat.ItemTag.class, new net.md_5.bungee.api.chat.ItemTag.Serializer()) - .disableHtmlEscaping() // Mojang - .create(); - } } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java index 2a4e76d9d0..f0c9da8d0b 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java @@ -32,16 +32,12 @@ import com.denizenscript.denizencore.utilities.debugging.Debug; import com.denizenscript.denizencore.utilities.debugging.DebugInternals; import com.google.common.collect.Iterables; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; import com.mojang.authlib.yggdrasil.ProfileResult; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.chat.*; -import net.md_5.bungee.api.chat.hover.content.*; -import net.md_5.bungee.chat.*; +import net.md_5.bungee.api.chat.BaseComponent; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.core.Rotations; @@ -381,7 +377,7 @@ public static BaseComponent[] componentToSpigot(Component nms) { if (nms == null) { return null; } - return ComponentSerializer.parse(CraftChatMessage.toJSON(nms)); + return FormattedTextHelper.parseJson(CraftChatMessage.toJSON(nms)); } public static Component componentToNMS(BaseComponent[] spigot) { @@ -395,21 +391,4 @@ public static Component componentToNMS(BaseComponent[] spigot) { public String updateLegacyName(Class type, String legacyName) { return FieldRename.rename(ApiVersion.FIELD_NAME_PARITY, DebugInternals.getFullClassNameOpti(type).replace('.', '/'), legacyName); } - - @Override - public Gson getVanillaStyleSpigotComponentGSON() { - return new GsonBuilder() - .registerTypeAdapter(BaseComponent.class, new ComponentSerializer()) - .registerTypeAdapter(TextComponent.class, new TextComponentSerializer(VersionedComponentSerializer.getDefault())) - .registerTypeAdapter(TranslatableComponent.class, new TranslatableComponentSerializer(VersionedComponentSerializer.getDefault())) - .registerTypeAdapter(KeybindComponent.class, new KeybindComponentSerializer(VersionedComponentSerializer.getDefault())) - .registerTypeAdapter(ScoreComponent.class, new ScoreComponentSerializer(VersionedComponentSerializer.getDefault())) - .registerTypeAdapter(SelectorComponent.class, new SelectorComponentSerializer(VersionedComponentSerializer.getDefault())) - .registerTypeAdapter(net.md_5.bungee.api.chat.hover.content.Entity.class, new EntitySerializer(VersionedComponentSerializer.getDefault())) - .registerTypeAdapter(Text.class, new TextSerializer()) - .registerTypeAdapter(Item.class, new ItemSerializer()) - .registerTypeAdapter(net.md_5.bungee.api.chat.ItemTag.class, new net.md_5.bungee.api.chat.ItemTag.Serializer()) - .disableHtmlEscaping() // Mojang - .create(); - } } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java index 1d940c4e69..5fc93ea5cd 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java @@ -18,14 +18,14 @@ public class PacketOutChatImpl extends PacketOutChat { public PacketOutChatImpl(ClientboundSystemChatPacket internal) { systemPacket = internal; rawJson = CraftChatMessage.toJSON(internal.content()); - message = FormattedTextHelper.stringify(ComponentSerializer.parse(rawJson)); + message = FormattedTextHelper.stringify(FormattedTextHelper.parseJson(rawJson)); isOverlayActionbar = internal.overlay(); } public PacketOutChatImpl(ClientboundPlayerChatPacket internal) { playerPacket = internal; rawJson = ComponentSerializer.toString(internal.body().content()); - message = FormattedTextHelper.stringify(ComponentSerializer.parse(rawJson)); + message = FormattedTextHelper.stringify(FormattedTextHelper.parseJson(rawJson)); } @Override From 2d9a304f20de66309569a0b97a1bc74b776dce89 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Wed, 16 Apr 2025 14:27:36 -0700 Subject: [PATCH 155/280] typo fixes --- .../com/denizenscript/denizen/events/ScriptEventRegistry.java | 2 +- ...Event.java => PlayerPreparesSmithingTableScriptEvent.java} | 4 ++-- .../denizen/utilities/BukkitImplDeprecations.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename plugin/src/main/java/com/denizenscript/denizen/events/player/{PlayersPrepareSmithingTableScriptEvent.java => PlayerPreparesSmithingTableScriptEvent.java} (93%) diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java index 06a4cf001e..587965644d 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java @@ -245,7 +245,7 @@ public static void registerMainEvents() { ScriptEvent.registerScriptEvent(PlayerSendPacketScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerShearsScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerSmithsItemScriptEvent.class); - ScriptEvent.registerScriptEvent(PlayersPrepareSmithingTableScriptEvent.class); + ScriptEvent.registerScriptEvent(PlayerPreparesSmithingTableScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerSneakScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerSprintScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerStandsOnScriptEvent.class); diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayersPrepareSmithingTableScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerPreparesSmithingTableScriptEvent.java similarity index 93% rename from plugin/src/main/java/com/denizenscript/denizen/events/player/PlayersPrepareSmithingTableScriptEvent.java rename to plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerPreparesSmithingTableScriptEvent.java index 2ede016d86..4892369443 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayersPrepareSmithingTableScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerPreparesSmithingTableScriptEvent.java @@ -13,7 +13,7 @@ import org.bukkit.event.Listener; import org.bukkit.event.inventory.PrepareSmithingEvent; -public class PlayersPrepareSmithingTableScriptEvent extends BukkitScriptEvent implements Listener { +public class PlayerPreparesSmithingTableScriptEvent extends BukkitScriptEvent implements Listener { // <--[event] // @Events @@ -39,7 +39,7 @@ public class PlayersPrepareSmithingTableScriptEvent extends BukkitScriptEvent im // // --> - public PlayersPrepareSmithingTableScriptEvent() { + public PlayerPreparesSmithingTableScriptEvent() { } public PrepareSmithingEvent event; 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 45178570eb..0e59816e44 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java @@ -231,7 +231,7 @@ public class BukkitImplDeprecations { // Added 2021/07/26, made very-slow 2022/12/31, made slow 2024/01/02, made normal 2025/01/15. // Safe to remove now. - public static Warning itemEnchantmentsLegacy = new Warning("itemEnchantmentsLegacy", "The tag 'ItemTag.enchantments' is deprecated: use enchantments_map, or enchantment_types."); + public static Warning itemEnchantmentsLegacy = new Warning("itemEnchantmentsLegacy", "The tag 'ItemTag.enchantments' is deprecated: use enchantment_map, or enchantment_types."); public static Warning echantmentTagUpdate = new Warning("echantmentTagUpdate", "Several legacy enchantment-related tags are deprecated in favor of using EnchantmentTag."); // Added 2022/01/30, made very-slow 2022/12/31, made slow 2024/01/02, made normal 2025/01/15. From 28d325c5f4604c8e4911b5448a4a3dff3f537188 Mon Sep 17 00:00:00 2001 From: MCSamuel Date: Thu, 24 Apr 2025 12:47:29 -0700 Subject: [PATCH 156/280] Bug fix for villager breeding not being cancellable (#2714) * Fixed villager breeding not being cancellable * aya update --- .../events/entity/EntityBreedScriptEvent.java | 54 ++++++++----------- 1 file changed, 22 insertions(+), 32 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityBreedScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityBreedScriptEvent.java index c90b4574c9..ab81c574d4 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityBreedScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityBreedScriptEvent.java @@ -5,8 +5,7 @@ import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.ObjectTag; -import org.bukkit.entity.Animals; -import org.bukkit.entity.Entity; +import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityBreedEvent; @@ -40,6 +39,13 @@ public class EntityBreedScriptEvent extends BukkitScriptEvent implements Listene public EntityBreedScriptEvent() { registerCouldMatcher(" breeds"); + this.registerOptionalDetermination(null, ElementTag.class, (evt, context, determination) -> { + if (determination.isInt()) { + evt.event.setExperience(determination.asInt()); + return true; + } + return false; + }); } private EntityTag entity; @@ -61,46 +67,30 @@ public boolean matches(ScriptPath path) { return super.matches(path); } - @Override - public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) { - if (determinationObj instanceof ElementTag element && element.isInt()) { - experience = element.asInt(); - event.setExperience(experience); - return true; - } - return super.applyDetermination(path, determinationObj); - } - @Override public ObjectTag getContext(String name) { - if (name.equals("child")) { - return entity.getDenizenObject(); - } - else if (name.equals("breeder") && breeder != null) { - return breeder.getDenizenObject(); - } - else if (name.equals("father")) { - return father.getDenizenObject(); - } - else if (name.equals("mother")) { - return mother.getDenizenObject(); - } - else if (name.equals("item") && item != null) { - return item; - } - else if (name.equals("experience")) { - return new ElementTag(experience); - } - return super.getContext(name); + return switch (name) { + case "child" -> entity.getDenizenObject(); + case "breeder" -> breeder == null ? null : breeder.getDenizenObject(); + case "father" -> father.getDenizenObject(); + case "mother" -> mother.getDenizenObject(); + case "item" -> item; + case "experience" -> new ElementTag(experience); + default -> super.getContext(name); + }; } @Override public void cancellationChanged() { // Prevent entities from continuing to breed with each other - if (cancelled) { + if (cancelled && entity.getBukkitEntity() instanceof Animals) { ((Animals) father.getLivingEntity()).setLoveModeTicks(0); ((Animals) mother.getLivingEntity()).setLoveModeTicks(0); } + else if (cancelled && entity.getBukkitEntity() instanceof Villager) { + ((Villager) father.getLivingEntity()).getInventory().clear(); + ((Villager) mother.getLivingEntity()).getInventory().clear(); + } super.cancellationChanged(); } From e3a942772f1feb4712d01bf62762582e0675dc74 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Thu, 24 Apr 2025 20:49:07 +0100 Subject: [PATCH 157/280] Paper fixes (#2719) * Some Paper fixes * Minor cleanup * Bump Paper API --- paper/pom.xml | 2 +- .../EntityKnocksbackEntityScriptEvent.java | 2 +- .../denizen/nms/interfaces/BlockHelper.java | 2 +- .../denizen/objects/LocationTag.java | 21 ++++++++++--------- .../nms/v1_19/helpers/BlockHelperImpl.java | 11 ---------- .../nms/v1_20/helpers/BlockHelperImpl.java | 11 ---------- .../nms/v1_21/helpers/BlockHelperImpl.java | 15 ++++++------- 7 files changed, 20 insertions(+), 44 deletions(-) diff --git a/paper/pom.xml b/paper/pom.xml index e6fc8d975a..0596d19965 100644 --- a/paper/pom.xml +++ b/paper/pom.xml @@ -25,7 +25,7 @@ io.papermc.paper paper-api - 1.21.4-R0.1-SNAPSHOT + 1.21.5-R0.1-SNAPSHOT provided diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/EntityKnocksbackEntityScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/EntityKnocksbackEntityScriptEvent.java index a1489967eb..09ec78f7c8 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/events/EntityKnocksbackEntityScriptEvent.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/EntityKnocksbackEntityScriptEvent.java @@ -96,7 +96,7 @@ public ObjectTag getContext(String name) { case "entity" -> entity.getDenizenObject(); case "damager" -> hitBy.getDenizenObject(); case "acceleration" -> new LocationTag(event.getAcceleration()); - case "cause" -> new ElementTag(event.getCause()); + case "cause" -> new ElementTag(event.getCause().name(), true); // TODO: once 1.20 is the minimum supported version, use the enum constructor default -> super.getContext(name); }; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/BlockHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/BlockHelper.java index 64c22afca5..954f4d0fdc 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/BlockHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/BlockHelper.java @@ -65,7 +65,7 @@ default BlockData parseBlockData(String text) { return Material.matchMaterial(material).createBlockData(otherData); } - void makeBlockStateRaw(BlockState state); + default void makeBlockStateRaw(BlockState state) {} // TODO: once 1.19 is the minimum supported version, remove this void doRandomTick(Location location); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java index 0161f53a4f..e686ef7c92 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java @@ -5252,20 +5252,21 @@ else if (state instanceof Dropper) { // // --> if (mechanism.matches("jukebox_record")) { - BlockState state = getBlockState(); - if (state instanceof Jukebox) { - if (mechanism.hasValue() && mechanism.requireObject(ItemTag.class)) { - ((Jukebox) state).setRecord(mechanism.valueAsType(ItemTag.class).getItemStack()); - } - else { - NMSHandler.blockHelper.makeBlockStateRaw(state); - ((Jukebox) state).setRecord(null); + if (!(getBlockState() instanceof Jukebox jukebox)) { + mechanism.echoError("'jukebox_record' mechanism can only be called on a jukebox block."); + return; + } + if (mechanism.hasValue()) { + if (!mechanism.requireObject(ItemTag.class)) { + return; } - state.update(); + jukebox.setRecord(mechanism.valueAsType(ItemTag.class).getItemStack()); } else { - mechanism.echoError("'jukebox_record' mechanism can only be called on a jukebox block."); + NMSHandler.blockHelper.makeBlockStateRaw(jukebox); + jukebox.setRecord(null); } + jukebox.update(); } // <--[mechanism] diff --git a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/BlockHelperImpl.java b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/BlockHelperImpl.java index 16662252dc..f5dfd35cfe 100644 --- a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/BlockHelperImpl.java +++ b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/helpers/BlockHelperImpl.java @@ -38,7 +38,6 @@ import net.minecraft.world.level.material.PushReaction; import org.bukkit.*; import org.bukkit.block.Block; -import org.bukkit.block.BlockState; import org.bukkit.block.CreatureSpawner; import org.bukkit.block.Skull; import org.bukkit.craftbukkit.v1_19_R3.CraftChunk; @@ -66,16 +65,6 @@ public class BlockHelperImpl implements BlockHelper { public static final Field craftBlockEntityState_snapshot = ReflectionHelper.getFields(CraftBlockEntityState.class).get("snapshot"); public static final Field craftSkull_profile = ReflectionHelper.getFields(CraftSkull.class).get("profile"); - @Override - public void makeBlockStateRaw(BlockState state) { - try { - craftBlockEntityState_snapshot.set(state, craftBlockEntityState_tileEntity.get(state)); - } - catch (Throwable ex) { - Debug.echoError(ex); - } - } - @Override public void applyPhysics(Location location) { BlockPos pos = new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()); diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java index aeaf6e4b27..43418740b8 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/helpers/BlockHelperImpl.java @@ -37,7 +37,6 @@ import net.minecraft.world.level.material.PushReaction; import org.bukkit.*; import org.bukkit.block.Block; -import org.bukkit.block.BlockState; import org.bukkit.block.CreatureSpawner; import org.bukkit.block.Skull; import org.bukkit.craftbukkit.v1_20_R4.CraftChunk; @@ -66,16 +65,6 @@ public class BlockHelperImpl implements BlockHelper { public static final Field craftBlockEntityState_snapshot = ReflectionHelper.getFields(CraftBlockEntityState.class).get("snapshot"); public static final Field craftSkull_profile = ReflectionHelper.getFields(CraftSkull.class).get("profile"); - @Override - public void makeBlockStateRaw(BlockState state) { - try { - craftBlockEntityState_snapshot.set(state, craftBlockEntityState_tileEntity.get(state)); - } - catch (Throwable ex) { - Debug.echoError(ex); - } - } - @Override public void applyPhysics(Location location) { ((CraftWorld) location.getWorld()).getHandle().updateNeighborsAt(CraftLocation.toBlockPosition(location), CraftMagicNumbers.getBlock(location.getBlock().getType())); diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java index 4d1454cddd..fac520f4af 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java @@ -32,7 +32,6 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; -import org.bukkit.block.BlockState; import org.bukkit.block.CreatureSpawner; import org.bukkit.block.Skull; import org.bukkit.craftbukkit.v1_21_R4.CraftChunk; @@ -53,18 +52,16 @@ public class BlockHelperImpl implements BlockHelper { - public static final Field craftBlockEntityState_tileEntity = ReflectionHelper.getFields(CraftBlockEntityState.class).get("tileEntity"); + public static final Field craftBlockEntityState_tileEntity; public static final Field craftBlockEntityState_snapshot = ReflectionHelper.getFields(CraftBlockEntityState.class).get("snapshot"); public static final Field craftSkull_profile = ReflectionHelper.getFields(CraftSkull.class).get("profile"); - @Override - public void makeBlockStateRaw(BlockState state) { - try { - craftBlockEntityState_snapshot.set(state, craftBlockEntityState_tileEntity.get(state)); - } - catch (Throwable ex) { - Debug.echoError(ex); + static { + Field blockEntityField = ReflectionHelper.getFields(CraftBlockEntityState.class).getNoCheck("blockEntity"); + if (blockEntityField == null) { + blockEntityField = ReflectionHelper.getFields(CraftBlockEntityState.class).get("tileEntity"); } + craftBlockEntityState_tileEntity = blockEntityField; } @Override From eed48457b364121b2927000851b286afb5d46643 Mon Sep 17 00:00:00 2001 From: MCSamuel Date: Sat, 26 Apr 2025 09:40:19 -0700 Subject: [PATCH 158/280] Add `player names ` event (#2708) * Added PlayerNameEntityScriptEvent * persistence, meta, and no old_name changes * `old_name` method changed * `old_name` method changed * removed redundant check in old_name context * oldName restructuring * persistent determination meta clarified * persistent determination changed * persistent meta * fix * aya update * aya update --- .../denizen/paper/PaperModule.java | 1 + .../events/PlayerNameEntityScriptEvent.java | 99 +++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerNameEntityScriptEvent.java diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java index 2771e225b4..31119de91f 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java @@ -66,6 +66,7 @@ public static void init() { ScriptEvent.registerScriptEvent(PlayerJumpsScriptEventPaperImpl.class); ScriptEvent.registerScriptEvent(PlayerLecternPageChangeScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerLoomPatternSelectScriptEvent.class); + ScriptEvent.registerScriptEvent(PlayerNameEntityScriptEvent.class); if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { ScriptEvent.registerScriptEvent(PlayerOpenSignScriptEvent.class); } diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerNameEntityScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerNameEntityScriptEvent.java new file mode 100644 index 0000000000..41d421bd78 --- /dev/null +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerNameEntityScriptEvent.java @@ -0,0 +1,99 @@ +package com.denizenscript.denizen.paper.events; + +import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.paper.PaperModule; +import com.denizenscript.denizen.utilities.PaperAPITools; +import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.scripts.ScriptEntryData; +import io.papermc.paper.event.player.PlayerNameEntityEvent; +import net.md_5.bungee.api.ChatColor; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class PlayerNameEntityScriptEvent extends BukkitScriptEvent implements Listener { + + // <--[event] + // @Events + // player names + // + // @Location true + // + // @Plugin Paper + // + // @Group Paper + // + // @Cancellable true + // + // @Triggers when a player attempts to rename an entity with a name tag. + // + // @Context + // returns an EntityTag of the renamed entity. + // returns the old name of the entity, if any. + // returns the new name of the entity. + // returns whether this will cause the entity to persist through server restarts. + // + // @Determine + // "NAME:" to set a different name for the entity. + // "PERSISTENT:" to set whether the event will cause the entity to persist through restarts. NOTE: Entities may still persist for other reasons. To ensure they do not, use <@link mechanism EntityTag.force_no_persist>. + // + // @Player Always. + // + // --> + + public PlayerNameEntityScriptEvent() { + registerCouldMatcher("player names "); + this.registerOptionalDetermination("persistent", ElementTag.class, (evt, context, determination) -> { + if (determination.isBoolean()) { + evt.event.setPersistent(determination.asBoolean()); + return true; + } + return false; + }); + this.registerDetermination("name", ElementTag.class, (evt, context, determination) -> { + evt.event.setName(PaperModule.parseFormattedText(determination.toString(), ChatColor.WHITE)); + }); + } + + public PlayerNameEntityEvent event; + public EntityTag entity; + public ElementTag oldName; + + @Override + public boolean matches(ScriptPath path) { + if (!runInCheck(path, entity.getLocation())) { + return false; + } + if (!path.tryArgObject(2, entity)) { + return false; + } + return super.matches(path); + } + + @Override + public ScriptEntryData getScriptEntryData() { + return new BukkitScriptEntryData(event.getPlayer()); + } + + @Override + public ObjectTag getContext(String name) { + return switch (name) { + case "entity" -> entity.getDenizenObject(); + case "name" -> new ElementTag(PaperModule.stringifyComponent(event.getName()), true); + case "old_name" -> oldName; + case "persistent" -> new ElementTag(event.isPersistent()); + default -> super.getContext(name); + }; + } + + @EventHandler + public void playerNamesEntity(PlayerNameEntityEvent event) { + this.event = event; + entity = new EntityTag(event.getEntity()); + String name = PaperAPITools.instance.getCustomName(entity.getBukkitEntity()); + oldName = name == null ? null : new ElementTag(name, true); + fire(event); + } +} From 21db894e4562542102827f6a65a976616eea87e1 Mon Sep 17 00:00:00 2001 From: MCSamuel Date: Sat, 26 Apr 2025 14:08:31 -0700 Subject: [PATCH 159/280] `EntityTag.is_sleeping`: foxes support + new mech (#2709) * Redo of `is_sleeping` tag, and addition of `is_sleeping` mechanism for foxes * fixes * moved to separate file * reverted previous commit and updated register method * aya update * mechanism execution cleaned * pattern matching --- .../denizen/objects/EntityTag.java | 32 +++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java index aef327f0a2..caca5d09eb 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java @@ -1975,15 +1975,14 @@ else if (object.getLivingEntity() instanceof Steerable) { // <--[tag] // @attribute // @returns ElementTag(Boolean) + // @mechanism EntityTag.is_sleeping // @description - // Returns whether the player, NPC, or villager is currently sleeping. + // Returns whether a living entity is currently sleeping. + // If the entity is not a fox, player, or villager, this will always return 'false'. // --> registerSpawnedOnlyTag(ElementTag.class, "is_sleeping", (attribute, object) -> { - if (object.getBukkitEntity() instanceof Player) { - return new ElementTag(((Player) object.getBukkitEntity()).isSleeping()); - } - else if (object.getBukkitEntity() instanceof Villager) { - return new ElementTag(((Villager) object.getBukkitEntity()).isSleeping()); + if (object.getBukkitEntity() instanceof LivingEntity livingEntity) { + return new ElementTag(livingEntity.isSleeping()); } return null; }); @@ -3159,6 +3158,27 @@ else if (object.getBukkitEntity() instanceof Hanging hanging) { } }); + // <--[mechanism] + // @object EntityTag + // @name is_sleeping + // @input ElementTag(Boolean) + // @description + // Sets whether a fox is sleeping. + // The entity may wake up immediately after setting this to true. If this is not desired, disable <@link mechanism EntityTag.has_ai>. + // @tags + // + // --> + tagProcessor.registerMechanism("is_sleeping", false, ElementTag.class, (object, mechanism, input) -> { + if (!mechanism.requireBoolean()) { + return; + } + if (!(object.getBukkitEntity() instanceof Fox fox)) { + mechanism.echoError("'is_sleeping' mechanism is only valid for Fox entities."); + return; + } + fox.setSleeping(input.asBoolean()); + }); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { // <--[mechanism] From 650c130b0ca6a2e11b0f56855e1eeb03acb897de Mon Sep 17 00:00:00 2001 From: MCSamuel Date: Sat, 3 May 2025 05:48:35 -0700 Subject: [PATCH 160/280] `PlayerChangesWorldScriptEvent`: add switches (#2721) * PlayerChangesWorldScriptEvent switches * deprecation message fix * in favor of --- .../player/PlayerChangesWorldScriptEvent.java | 48 +++++++++++-------- .../utilities/BukkitImplDeprecations.java | 3 ++ 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerChangesWorldScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerChangesWorldScriptEvent.java index 5e6e99c601..9a702c0c1a 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerChangesWorldScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerChangesWorldScriptEvent.java @@ -3,6 +3,7 @@ import com.denizenscript.denizen.events.BukkitScriptEvent; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.WorldTag; +import com.denizenscript.denizen.utilities.BukkitImplDeprecations; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; @@ -14,14 +15,15 @@ public class PlayerChangesWorldScriptEvent extends BukkitScriptEvent implements // <--[event] // @Events - // player changes world (from ) (to ) - // - // @Regex ^on player changes world( from [^\s]+)?( to [^\s]+)?$ + // player changes world // // @Group Player // // @Location true // + // @Switch from: to only run if the player came from the specified world. + // @Switch to: to only run if the player is going to the specified world. + // // @Triggers when a player moves to a different world. // // @Context @@ -33,29 +35,37 @@ public class PlayerChangesWorldScriptEvent extends BukkitScriptEvent implements // --> public PlayerChangesWorldScriptEvent() { + registerCouldMatcher("player changes world (from ) (to )"); + registerSwitches("from", "to"); } public WorldTag origin_world; public WorldTag destination_world; public PlayerChangedWorldEvent event; - @Override - public boolean couldMatch(ScriptPath path) { - return path.eventLower.startsWith("player changes world"); - } - @Override public boolean matches(ScriptPath path) { String[] data = path.eventArgsLower; - // TODO: Switches for (int index = 3; index < data.length; index++) { - if (data[index].equals("from") && !origin_world.tryAdvancedMatcher(data[index + 1], path.context)) { - return false; + if (data[index].equals("from")) { + BukkitImplDeprecations.playerChangesWorldSwitches.warn(getTagContext(path)); + if (!origin_world.tryAdvancedMatcher(data[index + 1], path.context)) { + return false; + } } - else if (data[index].equals("to") && !destination_world.tryAdvancedMatcher(data[index + 1], path.context)) { - return false; + else if (data[index].equals("to")) { + BukkitImplDeprecations.playerChangesWorldSwitches.warn(getTagContext(path)); + if (!destination_world.tryAdvancedMatcher(data[index + 1], path.context)) { + return false; + } } } + if (!path.tryObjectSwitch("from", origin_world)) { + return false; + } + if (!path.tryObjectSwitch("to", destination_world)) { + return false; + } return super.matches(path); } @@ -66,13 +76,11 @@ public ScriptEntryData getScriptEntryData() { @Override public ObjectTag getContext(String name) { - if (name.equals("origin_world")) { - return origin_world; - } - else if (name.equals("destination_world")) { - return destination_world; - } - return super.getContext(name); + return switch (name) { + case "origin_world" -> origin_world; + case "destination_world" -> destination_world; + default -> super.getContext(name); + }; } @EventHandler 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 0e59816e44..c2c88362ff 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java @@ -459,6 +459,9 @@ public class BukkitImplDeprecations { // Added 2025/01/23 public static Warning projectileLaunchedEntityContext = new FutureWarning("projectileLaunchedEntityContext", "'context.entity' in the 'projectile launched' event is deprecated in favor of 'context.projectile'."); + // Added 2025/04/27 + public static Warning playerChangesWorldSwitches = new FutureWarning("playerChangesWorldSwitches", "The 'from' and 'to' arguments in the 'player changes world' script event have been deprecated in favor of the 'from' and 'to' switches."); + // ==================== PAST deprecations of things that are already gone but still have a warning left behind ==================== // Removed upstream 2023/10/29 without warning. From db9d63834db7c84550ba1c0159eaffc49d297198 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Sat, 3 May 2025 14:11:27 +0100 Subject: [PATCH 161/280] `1.21.5` Item/NBT cleanups (#2723) --- .../denizen/nms/interfaces/ItemHelper.java | 20 +++++++++--- .../objects/properties/item/ItemRawNBT.java | 1 - .../denizen/utilities/nbt/CustomNBT.java | 3 ++ .../nms/v1_21/helpers/ItemHelperImpl.java | 31 ++++--------------- 4 files changed, 25 insertions(+), 30 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java index e5ee523643..2b4fd0bc45 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java @@ -1,8 +1,9 @@ package com.denizenscript.denizen.nms.interfaces; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.nms.util.PlayerProfile; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; -import com.denizenscript.denizen.nms.util.jnbt.IntArrayTag; import com.denizenscript.denizen.nms.util.jnbt.Tag; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.utilities.nbt.CustomNBT; @@ -20,11 +21,11 @@ import org.bukkit.inventory.RecipeChoice; import org.bukkit.inventory.ShapedRecipe; import org.bukkit.inventory.meta.BlockStateMeta; +import org.bukkit.inventory.meta.ShieldMeta; import org.bukkit.map.MapView; import java.util.List; import java.util.Map; -import java.util.UUID; import java.util.function.Consumer; public abstract class ItemHelper { @@ -163,12 +164,23 @@ public int getFoodPoints(Material itemType) { throw new UnsupportedOperationException(); } - public DyeColor getShieldColor(ItemStack item) { // TODO: once 1.20 is the minimum supported version, remove default impl + public DyeColor getShieldColor(ItemStack item) { // TODO: once 1.21 is the minimum supported version, remove from NMS + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + return ((ShieldMeta) item.getItemMeta()).getBaseColor(); + } + // TODO: once 1.20 is the minimum supported version, remove legacy code ↓ BlockStateMeta stateMeta = (BlockStateMeta) item.getItemMeta(); return stateMeta.hasBlockState() ? ((Banner) stateMeta.getBlockState()).getBaseColor() : null; } - public ItemStack setShieldColor(ItemStack item, DyeColor color) { // TODO: once 1.20 is the minimum supported version, remove default impl + public ItemStack setShieldColor(ItemStack item, DyeColor color) { // TODO: once 1.21 is the minimum supported version, remove from NMS + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + ShieldMeta shieldMeta = (ShieldMeta) item.getItemMeta(); + shieldMeta.setBaseColor(color); + item.setItemMeta(shieldMeta); + return item; + } + // TODO: once 1.20 is the minimum supported version, remove legacy code ↓ if (color == null) { CompoundTag noStateNbt = getNbtData(item).createBuilder().remove("BlockEntityTag").build(); return setNbtData(item, noStateNbt); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRawNBT.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRawNBT.java index bd35663dc6..ea1203f2ad 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRawNBT.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRawNBT.java @@ -354,7 +354,6 @@ public static void register() { // Returns a map of all raw NBT on this item, including default values. // Refer to format details at <@link language Raw NBT Encoding>. // --> - // TODO: deprecate when raw properties property is added PropertyParser.registerTag(ItemRawNBT.class, MapTag.class, "all_raw_nbt", (attribute, prop) -> { return prop.getFullNBTMap(); }); diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/nbt/CustomNBT.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/nbt/CustomNBT.java index 6106a4423b..86f777b1da 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/nbt/CustomNBT.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/nbt/CustomNBT.java @@ -38,6 +38,7 @@ public class CustomNBT { * custom NBT. */ + // TODO: once 1.20 is the minimum supported version, remove this public static List getNBTMaterials(ItemStack itemStack, String key) { if (itemStack == null || itemStack.getType() == Material.AIR) { return null; @@ -53,6 +54,7 @@ public static List getNBTMaterials(ItemStack itemStack, String key) { return materials; } + // TODO: once 1.20 is the minimum supported version, remove this public static ItemStack setNBTMaterials(ItemStack itemStack, String key, List materials) { if (itemStack == null || itemStack.getType() == Material.AIR) { return null; @@ -82,6 +84,7 @@ public static ItemStack addCustomNBT(ItemStack itemStack, String key, String val return NMSHandler.itemHelper.setCustomData(itemStack, customData); } + // TODO: once 1.20 is the minimum supported version, remove this public static ItemStack clearNBT(ItemStack itemStack, String key) { if (itemStack == null || itemStack.getType() == Material.AIR) { return null; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java index d7dcb49df3..06d6535cb9 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java @@ -3,7 +3,6 @@ import com.denizenscript.denizen.nms.interfaces.ItemHelper; import com.denizenscript.denizen.nms.util.PlayerProfile; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; -import com.denizenscript.denizen.nms.util.jnbt.IntArrayTag; import com.denizenscript.denizen.nms.util.jnbt.Tag; import com.denizenscript.denizen.nms.v1_21.Handler; import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; @@ -27,7 +26,10 @@ import com.mojang.serialization.JsonOps; import net.md_5.bungee.api.ChatColor; import net.minecraft.advancements.critereon.BlockPredicate; -import net.minecraft.core.*; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Holder; +import net.minecraft.core.NonNullList; import net.minecraft.core.component.DataComponentMap; import net.minecraft.core.component.DataComponentPatch; import net.minecraft.core.component.DataComponentType; @@ -35,7 +37,6 @@ import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.NbtOps; -import net.minecraft.nbt.NbtUtils; import net.minecraft.network.chat.Component; import net.minecraft.resources.RegistryOps; import net.minecraft.resources.ResourceKey; @@ -50,12 +51,11 @@ import net.minecraft.world.item.component.CustomData; import net.minecraft.world.item.component.ItemLore; import net.minecraft.world.item.component.ResolvableProfile; +import net.minecraft.world.item.crafting.*; import net.minecraft.world.item.crafting.BlastingRecipe; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.ShapelessRecipe; -import net.minecraft.world.item.crafting.SmithingTransformRecipe; import net.minecraft.world.item.crafting.SmokingRecipe; -import net.minecraft.world.item.crafting.*; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -68,7 +68,6 @@ import net.minecraft.world.level.saveddata.maps.MapId; import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import org.bukkit.Bukkit; -import org.bukkit.DyeColor; import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.block.data.BlockData; @@ -83,10 +82,10 @@ import org.bukkit.craftbukkit.v1_21_R4.util.CraftNamespacedKey; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; +import org.bukkit.inventory.*; import org.bukkit.inventory.ShapedRecipe; import org.bukkit.inventory.SmithingTrimRecipe; import org.bukkit.inventory.TransmuteRecipe; -import org.bukkit.inventory.*; import org.bukkit.map.MapView; import java.lang.reflect.Field; @@ -770,22 +769,4 @@ public byte[] renderMap(MapView mapView, Player player) { public int getFoodPoints(Material itemType) { return CraftMagicNumbers.getItem(itemType).components().get(DataComponents.FOOD).nutrition(); } - - @Override - public DyeColor getShieldColor(ItemStack item) { - net.minecraft.world.item.DyeColor nmsColor = CraftItemStack.asNMSCopy(item).get(DataComponents.BASE_COLOR); - return nmsColor != null ? DyeColor.getByWoolData((byte) nmsColor.getId()) : null; - } - - @Override - public ItemStack setShieldColor(ItemStack item, DyeColor color) { - net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item); - if (color != null) { - nmsItemStack.set(DataComponents.BASE_COLOR, net.minecraft.world.item.DyeColor.byId(color.getWoolData())); - } - else { - nmsItemStack.remove(DataComponents.BASE_COLOR); - } - return CraftItemStack.asBukkitCopy(nmsItemStack); - } } From 01a7819f2bb291e2567e7c456111f2128445ebfa Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Sat, 3 May 2025 14:32:00 +0100 Subject: [PATCH 162/280] Add `Utilities#elementToRequiredEnumLike` (#2725) --- .../com/denizenscript/denizen/utilities/Utilities.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java index 59af417c06..1487700384 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java @@ -615,6 +615,15 @@ public static T elementToEnumlike(ElementTag element, Class type, boolean return (T) registry.get(parseNamespacedKey(updatedName)); } + public static T elementToRequiredEnumLike(ElementTag element, Class type, Mechanism mechanism) { + T converted = elementToEnumlike(element, type); + if (converted == null) { + mechanism.echoError("Invalid " + DebugInternals.getClassNameOpti(type) + " specified."); + return null; + } + return converted; + } + public static T findBestEnumlike(Class type, String... names) { for (String name : names) { T val = elementToEnumlike(new ElementTag(name), type, false); From a8d563f2aa7e8ca6505336763d68bfa2de46598a Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Sat, 3 May 2025 14:50:11 +0100 Subject: [PATCH 163/280] `1.21.5` Area effect cloud fixes (#2722) * Base potion type controls * Custom effect controls * Particle color controls * Backsupport particle names + TODO * Wrap up * Fix meta syntax * Fix meta syntax x2 * Final fixups --- .../objects/properties/PropertyRegistry.java | 4 +- .../entity/EntityAreaEffectCloud.java | 129 ++++++++++-------- .../properties/entity/EntityColor.java | 9 +- .../entity/EntityPotionEffects.java | 29 +++- .../properties/entity/EntityPotionType.java | 25 ++-- .../utilities/BukkitImplDeprecations.java | 3 + .../entity/AreaEffectCloudHelper.java | 6 +- 7 files changed, 123 insertions(+), 82 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java index f981c2a8db..477c8bb129 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/PropertyRegistry.java @@ -34,9 +34,7 @@ public static void registerMainProperties() { PropertyParser.registerProperty(EntityAI.class, EntityTag.class); PropertyParser.registerProperty(EntityAnger.class, EntityTag.class); PropertyParser.registerProperty(EntityAngry.class, EntityTag.class); - if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_19)) { - PropertyParser.registerProperty(EntityAreaEffectCloud.class, EntityTag.class); - } + PropertyParser.registerProperty(EntityAreaEffectCloud.class, EntityTag.class); PropertyParser.registerProperty(EntityArmorBonus.class, EntityTag.class); PropertyParser.registerProperty(EntityArrowDamage.class, EntityTag.class); PropertyParser.registerProperty(EntityArrowPierceLevel.class, EntityTag.class); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAreaEffectCloud.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAreaEffectCloud.java index b3e1e310db..60ccf18e46 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAreaEffectCloud.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityAreaEffectCloud.java @@ -1,9 +1,14 @@ package com.denizenscript.denizen.objects.properties.entity; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; +import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.properties.bukkit.BukkitColorExtensions; +import com.denizenscript.denizen.utilities.BukkitImplDeprecations; +import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizen.utilities.entity.AreaEffectCloudHelper; -import com.denizenscript.denizencore.objects.*; -import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ColorTag; import com.denizenscript.denizencore.objects.core.DurationTag; import com.denizenscript.denizencore.objects.core.ElementTag; @@ -11,6 +16,7 @@ import com.denizenscript.denizencore.objects.properties.Property; import com.denizenscript.denizencore.tags.Attribute; import com.denizenscript.denizencore.utilities.CoreUtilities; +import org.bukkit.Particle; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; import org.bukkit.potion.PotionEffect; @@ -20,7 +26,7 @@ import java.util.List; -// TODO: 1.20.6: PotionData API +// TODO: most of the tags and mechs here need to become properties/be merged into existing properties public class EntityAreaEffectCloud implements Property { public static boolean describes(ObjectTag entity) { @@ -75,20 +81,22 @@ public ObjectTag getObjectAttribute(Attribute attribute) { // @attribute // @returns ElementTag // @mechanism EntityTag.base_potion - // @group properties + // @deprecated use 'EntityTag.potion_type' on MC 1.20+. // @description - // Returns the Area Effect Cloud's base potion data. - // In the format Type,Upgraded,Extended + // Deprecated in favor of <@link property EntityTag.potion_type> on MC 1.20+. // --> if (attribute.startsWith("base_potion")) { attribute = attribute.fulfill(1); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + BukkitImplDeprecations.areaEffectCloudControls.warn(attribute.context); + } // <--[tag] // @attribute // @returns ElementTag - // @group properties + // @deprecated use 'EntityTag.potion_type' on MC 1.20+. // @description - // Returns the Area Effect Cloud's base potion type. + // Deprecated in favor of <@link property EntityTag.potion_type> on MC 1.20+. // --> if (attribute.startsWith("type")) { return new ElementTag(getHelper().getBPName()) @@ -98,9 +106,9 @@ public ObjectTag getObjectAttribute(Attribute attribute) { // <--[tag] // @attribute // @returns ElementTag(Boolean) - // @group properties + // @deprecated use 'EntityTag.potion_type' on MC 1.20+. // @description - // Returns whether the Area Effect Cloud's base potion is upgraded. + // Deprecated in favor of <@link property EntityTag.potion_type> on MC 1.20+. // --> if (attribute.startsWith("is_upgraded")) { return new ElementTag(getHelper().getBPUpgraded()) @@ -110,9 +118,9 @@ public ObjectTag getObjectAttribute(Attribute attribute) { // <--[tag] // @attribute // @returns ElementTag(Boolean) - // @group properties + // @deprecated use 'EntityTag.potion_type' on MC 1.20+. // @description - // Returns whether the Area Effect Cloud's base potion is extended. + // Deprecated in favor of <@link property EntityTag.potion_type> on MC 1.20+. // --> if (attribute.startsWith("is_extended")) { return new ElementTag(getHelper().getBPExtended()) @@ -136,11 +144,12 @@ public ObjectTag getObjectAttribute(Attribute attribute) { // <--[tag] // @attribute // @returns ColorTag - // @group properties + // @deprecated use 'EntityTag.color'. // @description - // Returns the Area Effect Cloud's particle color. + // Deprecated in favor of <@link property EntityTag.color>. // --> if (attribute.startsWith("color")) { + BukkitImplDeprecations.areaEffectCloudControls.warn(attribute.context); return BukkitColorExtensions.fromColor(getHelper().getColor()) .getObjectAttribute(attribute.fulfill(1)); } @@ -246,12 +255,12 @@ public ObjectTag getObjectAttribute(Attribute attribute) { // @attribute )]> // @returns ElementTag(Boolean) // @mechanism EntityTag.custom_effects - // @group properties + // @deprecated use 'EntityTag.has_effect'. // @description - // Returns whether the Area Effect Cloud has a specified effect. - // If no effect is specified, returns whether it has any custom effect. + // Deprecated in favor of <@link tag EntityTag.has_effect>. // --> if (attribute.startsWith("has_custom_effect")) { + BukkitImplDeprecations.areaEffectCloudControls.warn(attribute.context); if (attribute.hasParam()) { PotionEffectType effectType = PotionEffectType.getByName(attribute.getParam()); for (PotionEffect effect : getHelper().getCustomEffects()) { @@ -285,12 +294,12 @@ public ObjectTag getObjectAttribute(Attribute attribute) { // @attribute // @returns ListTag // @mechanism EntityTag.custom_effects - // @group properties + // @deprecated use 'EntityTag.effects_data'. // @description - // Returns a ListTag of the Area Effect Cloud's custom effects - // In the form Type,Amplifier,Duration,Ambient,Particles|... + // Deprecated in favor of <@link tag EntityTag.effects_data>. // --> if (attribute.startsWith("custom_effects")) { + BukkitImplDeprecations.areaEffectCloudControls.warn(attribute.context); List effects = getHelper().getCustomEffects(); if (!attribute.hasParam()) { ListTag list = new ListTag(); @@ -313,9 +322,9 @@ public ObjectTag getObjectAttribute(Attribute attribute) { // <--[tag] // @attribute ].type> // @returns ElementTag - // @group properties + // @deprecated use 'EntityTag.effects_data'. // @description - // Returns the specified Area Effect Cloud potion effect type. + // Deprecated in favor of <@link tag EntityTag.effects_data>. // --> if (attribute.startsWith("type")) { return new ElementTag(effect.getType().getName()) @@ -325,9 +334,9 @@ public ObjectTag getObjectAttribute(Attribute attribute) { // <--[tag] // @attribute ].amplifier> // @returns ElementTag(Number) - // @group properties + // @deprecated use 'EntityTag.effects_data'. // @description - // Returns the specified Area Effect Cloud potion effect amplifier. + // Deprecated in favor of <@link tag EntityTag.effects_data>. // --> if (attribute.startsWith("amplifier")) { return new ElementTag(effect.getAmplifier()) @@ -337,9 +346,9 @@ public ObjectTag getObjectAttribute(Attribute attribute) { // <--[tag] // @attribute ].duration> // @returns DurationTag - // @group properties + // @deprecated use 'EntityTag.effects_data'. // @description - // Returns the specified Area Effect Cloud potion effect duration. + // Deprecated in favor of <@link tag EntityTag.effects_data>. // --> if (attribute.startsWith("duration")) { return new DurationTag((long) effect.getDuration()) @@ -349,9 +358,9 @@ public ObjectTag getObjectAttribute(Attribute attribute) { // <--[tag] // @attribute ].has_particles> // @returns ElementTag(Boolean) - // @group properties + // @deprecated use 'EntityTag.effects_data'. // @description - // Returns whether the specified Area Effect Cloud potion effect has particles. + // Deprecated in favor of <@link tag EntityTag.effects_data>. // --> if (attribute.startsWith("has_particles")) { return new ElementTag(effect.hasParticles()) @@ -361,9 +370,9 @@ public ObjectTag getObjectAttribute(Attribute attribute) { // <--[tag] // @attribute ].is_ambient> // @returns ElementTag(Boolean) - // @group properties + // @deprecated use 'EntityTag.effects_data'. // @description - // Returns whether the specified Area Effect Cloud potion effect is ambient. + // Deprecated in favor of <@link tag EntityTag.effects_data>. // --> if (attribute.startsWith("is_ambient")) { return new ElementTag(effect.isAmbient()) @@ -391,12 +400,14 @@ public void adjust(Mechanism mechanism) { // @object EntityTag // @name clear_custom_effects // @input None + // @deprecated use 'EntityTag.potion_effects'. // @description - // Clears all custom effects from the Area Effect Cloud + // Deprecated in favor of <@link mechanism EntityTag.potion_effects>. // @tags // // --> if (mechanism.matches("clear_custom_effects")) { + BukkitImplDeprecations.areaEffectCloudControls.warn(mechanism.context); getHelper().clearEffects(); } @@ -404,12 +415,14 @@ public void adjust(Mechanism mechanism) { // @object EntityTag // @name remove_custom_effect // @input ElementTag + // @deprecated use 'EntityTag.potion_effects'. // @description - // Removes the specified custom effect from the Area Effect Cloud + // Deprecated in favor of <@link mechanism EntityTag.potion_effects>. // @tags // // --> if (mechanism.matches("remove_custom_effect")) { + BukkitImplDeprecations.areaEffectCloudControls.warn(mechanism.context); PotionEffectType type = PotionEffectType.getByName(mechanism.getValue().asString().toUpperCase()); if (type != null) { getHelper().removeEffect(type); @@ -420,13 +433,14 @@ public void adjust(Mechanism mechanism) { // @object EntityTag // @name custom_effects // @input ListTag + // @deprecated use 'EntityTag.potion_effects'. // @description - // Adds a list of custom potion effects to the Area Effect Cloud - // In the form Type,Amplifier,Duration(,Ambient,Particles)|... + // Deprecated in favor of <@link mechanism EntityTag.potion_effects>. // @tags // // --> if (mechanism.matches("custom_effects")) { + BukkitImplDeprecations.areaEffectCloudControls.warn(mechanism.context); ListTag list = mechanism.valueAsType(ListTag.class); getHelper().clearEffects(); @@ -458,12 +472,14 @@ public void adjust(Mechanism mechanism) { // @object EntityTag // @name particle_color // @input ColorTag + // @deprecated use 'EntityTag.color'. // @description - // Sets the Area Effect Cloud's particle color. + // Deprecated in favor of <@link property EntityTag.color>. // @tags // // --> if (mechanism.matches("particle_color") && mechanism.requireObject(ColorTag.class)) { + BukkitImplDeprecations.areaEffectCloudControls.warn(mechanism.context); getHelper().setColor(BukkitColorExtensions.getColor(mechanism.valueAsType(ColorTag.class))); } @@ -471,37 +487,33 @@ public void adjust(Mechanism mechanism) { // @object EntityTag // @name base_potion // @input ElementTag + // @deprecated use 'EntityTag.potion_type' on MC 1.20+. // @description - // Sets the Area Effect Cloud's base potion. - // In the form: Type,Upgraded,Extended - // NOTE: Potion cannot be both upgraded and extended + // Deprecated in favor of <@link property EntityTag.potion_type> on MC 1.20+. // @tags // - // - // - // - // // --> if (mechanism.matches("base_potion")) { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { + BukkitImplDeprecations.areaEffectCloudControls.warn(mechanism.context); + } List data = CoreUtilities.split(mechanism.getValue().asString().toUpperCase(), ','); if (data.size() != 3) { - mechanism.echoError(mechanism.getValue().asString() + " is not a valid base potion!"); + mechanism.echoError(mechanism.getValue() + " is not a valid base potion!"); + return; + } + PotionType type = Utilities.elementToEnumlike(new ElementTag(data.get(0), true), PotionType.class); + if (type == null) { + mechanism.echoError(mechanism.getValue() + " is not a valid base potion!"); + return; + } + boolean upgraded = type.isUpgradeable() && CoreUtilities.equalsIgnoreCase(data.get(1), "true"); + boolean extended = type.isExtendable() && CoreUtilities.equalsIgnoreCase(data.get(2), "true"); + if (extended && upgraded) { + mechanism.echoError("Potion cannot be both upgraded and extended"); } else { - try { - PotionType type = PotionType.valueOf(data.get(0)); - boolean upgraded = type.isUpgradeable() && CoreUtilities.equalsIgnoreCase(data.get(1), "true"); - boolean extended = type.isExtendable() && CoreUtilities.equalsIgnoreCase(data.get(2), "true"); - if (extended && upgraded) { - mechanism.echoError("Potion cannot be both upgraded and extended"); - } - else { - getHelper().setBP(type, extended, upgraded); - } - } - catch (Exception e) { - mechanism.echoError(mechanism.getValue().asString() + " is not a valid base potion!"); - } + getHelper().setBP(type, extended, upgraded); } } @@ -541,7 +553,8 @@ public void adjust(Mechanism mechanism) { // @tags // // --> - if (mechanism.matches("particle") && mechanism.hasValue()) { + // TODO: some particles require additional data - need a new property that supports playeffect's special_data input + if (mechanism.matches("particle") && Utilities.requireEnumlike(mechanism, Particle.class)) { getHelper().setParticle(mechanism.getValue().asString().toUpperCase()); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityColor.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityColor.java index bdb30e6b17..75fbf49b06 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityColor.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityColor.java @@ -55,6 +55,7 @@ public static boolean describes(EntityTag entity) { type == EntityType.TROPICAL_FISH || type == EntityType.GOAT || type == EntityType.AXOLOTL || + type == EntityType.AREA_EFFECT_CLOUD || (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19) && MultiVersionHelper1_19.colorIsApplicable(type)); } @@ -214,6 +215,9 @@ else if (type == EntityType.GOAT) { else if (type == EntityType.AXOLOTL && mechanism.requireEnum(Axolotl.Variant.class)) { as(Axolotl.class).setVariant(color.asEnum(Axolotl.Variant.class)); } + else if (type == EntityType.AREA_EFFECT_CLOUD && mechanism.requireObject(ColorTag.class)) { + as(AreaEffectCloud.class).setColor(BukkitColorExtensions.getColor(mechanism.valueAsType(ColorTag.class))); + } else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19) && MultiVersionHelper1_19.colorIsApplicable(type)) { MultiVersionHelper1_19.setColor(getEntity(), mechanism); } @@ -274,6 +278,7 @@ public String getColor(boolean includeDeprecated) { } case GOAT -> as(Goat.class).isScreaming() ? "screaming" : "normal"; case AXOLOTL -> as(Axolotl.class).getVariant().name(); + case AREA_EFFECT_CLOUD -> BukkitColorExtensions.fromColor(as(AreaEffectCloud.class).getColor()).identify(); default -> null; }; } @@ -313,7 +318,7 @@ public ListTag getAllowedColors() { yield result; } case AXOLOTL -> Utilities.listTypes(Axolotl.Variant.class); - default -> null; // includes Ocelot (deprecated) and arrow (ColorTag) + default -> null; // includes Ocelot (deprecated) and arrow/area effect cloud (ColorTag) }; } @@ -340,7 +345,7 @@ public ListTag getAllowedColors() { // For tropical_fish, the input is PATTERN|BODYCOLOR|PATTERNCOLOR, where BodyColor and PatterenColor are both DyeColor (see below), // and PATTERN is KOB, SUNSTREAK, SNOOPER, DASHER, BRINELY, SPOTTY, FLOPPER, STRIPEY, GLITTER, BLOCKFISH, BETTY, is CLAYFISH. // For sheep, wolf, and shulker entities, the input is a Dye Color. - // For Tipped Arrow entities, the input is a ColorTag. + // For Tipped Arrow and Area effect cloud entities, the input is a ColorTag. // For goats, the input is SCREAMING or NORMAL. // For axolotl, the types are BLUE, CYAN, GOLD, LUCY, or WILD. // For frogs, the types are TEMPERATE, WARM, or COLD. diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotionEffects.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotionEffects.java index 8b7f1c08e5..d6c4ea94c2 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotionEffects.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotionEffects.java @@ -12,6 +12,7 @@ import com.denizenscript.denizencore.tags.TagContext; import com.denizenscript.denizencore.utilities.CoreUtilities; import com.denizenscript.denizen.utilities.BukkitImplDeprecations; +import org.bukkit.entity.AreaEffectCloud; import org.bukkit.entity.Arrow; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; @@ -22,11 +23,12 @@ public class EntityPotionEffects implements Property { public static boolean describes(ObjectTag object) { - if (!(object instanceof EntityTag)) { + if (!(object instanceof EntityTag entity)) { return false; } - return ((EntityTag) object).isLivingEntity() - || ((EntityTag) object).getBukkitEntity() instanceof Arrow; + return entity.isLivingEntity() + || entity.getBukkitEntity() instanceof Arrow + || entity.getBukkitEntity() instanceof AreaEffectCloud; } public static EntityPotionEffects getFrom(ObjectTag object) { @@ -55,7 +57,9 @@ public Collection getEffectsList() { else if (isArrow()) { return getArrow().getCustomEffects(); } - return new ArrayList<>(); + else { + return getAreaEffectCloud().getCustomEffects(); + } } public ListTag getEffectsListTag(TagContext context) { @@ -82,6 +86,10 @@ public Arrow getArrow() { return (Arrow) entity.getBukkitEntity(); } + public AreaEffectCloud getAreaEffectCloud() { + return (AreaEffectCloud) entity.getBukkitEntity(); + } + public String getPropertyString() { ListTag effects = getEffectsMapTag(false); return effects.isEmpty() ? null : effects.identify(); @@ -114,7 +122,8 @@ public static void register() { // @group attribute // @mechanism EntityTag.potion_effects // @description - // Returns the active potion effects on the entity, as a list of maps in <@link language Potion Effect Format>. + // Returns the active potion effects on the entity, or the potion effects an arrow/area effect cloud will apply. + // The effects returned are a list of maps in <@link language Potion Effect Format>. // --> PropertyParser.registerTag(EntityPotionEffects.class, ListTag.class, "effects_data", (attribute, object) -> { return object.getEffectsMapTag(true); @@ -126,7 +135,7 @@ public static void register() { // @group attributes // @mechanism EntityTag.potion_effects // @description - // Returns whether the entity has a specified effect. + // Returns whether the entity has a specified effect, or whether an arrow/area effect cloud will apply a certain effect. // If no effect is specified, returns whether the entity has any effect. // The effect type must be from <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/potion/PotionEffectType.html>. // --> @@ -144,6 +153,9 @@ public static void register() { else if (object.isArrow()) { returnElement = object.getArrow().hasCustomEffect(effectType); } + else { + returnElement = object.getAreaEffectCloud().hasCustomEffect(effectType); + } } else if (!object.getEffectsList().isEmpty()) { returnElement = true; @@ -159,7 +171,7 @@ public void adjust(Mechanism mechanism) { // @name potion_effects // @input ListTag // @description - // Set the entity's active potion effects. + // Set the entity's active potion effects, or the potion effects an arrow/area effect cloud will apply. // Each item in the list must be a MapTag in <@link language Potion Effect Format>. // @tags // @@ -186,6 +198,9 @@ public void adjust(Mechanism mechanism) { else if (isArrow()) { getArrow().addCustomEffect(effect, true); } + else { + getAreaEffectCloud().addCustomEffect(effect, true); + } } } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotionType.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotionType.java index e98a7f0a7c..3f3d217723 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotionType.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityPotionType.java @@ -4,6 +4,7 @@ import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.core.ElementTag; +import org.bukkit.entity.AreaEffectCloud; import org.bukkit.entity.Arrow; import org.bukkit.potion.PotionType; @@ -14,31 +15,37 @@ public class EntityPotionType extends EntityProperty { // @name potion_type // @input ElementTag // @description - // Controls an Arrow's base potion type, if any. + // Controls an Arrow or Area Effect Cloud's base potion type, if any. // See <@link url https://minecraft.wiki/w/Potion#Item_data> for a list of potion types. - // See <@link property EntityTag.potion_effects> to control the potion effects an arrow applies. + // See <@link property EntityTag.potion_effects> to control the potion effects applied. // @mechanism // Specify no input to remove the base potion type. // --> public static boolean describes(EntityTag entity) { - return entity.getBukkitEntity() instanceof Arrow; + return entity.getBukkitEntity() instanceof Arrow || entity.getBukkitEntity() instanceof AreaEffectCloud; } @Override public ElementTag getPropertyValue() { - PotionType type = as(Arrow.class).getBasePotionType(); + PotionType type = getEntity() instanceof Arrow arrow ? arrow.getBasePotionType() : as(AreaEffectCloud.class).getBasePotionType(); return type != null ? new ElementTag(Utilities.namespacedKeyToString(type.getKey()), true) : null; } @Override public void setPropertyValue(ElementTag value, Mechanism mechanism) { - if (value == null) { - as(Arrow.class).setBasePotionType(null); - return; + PotionType type = null; + if (value != null) { + if (!Utilities.requireEnumlike(mechanism, PotionType.class)) { + return; + } + type = Utilities.elementToEnumlike(value, PotionType.class); } - if (Utilities.requireEnumlike(mechanism, PotionType.class)) { - as(Arrow.class).setBasePotionType(Utilities.elementToEnumlike(value, PotionType.class)); + if (getEntity() instanceof Arrow arrow) { + arrow.setBasePotionType(type); + } + else { + as(AreaEffectCloud.class).setBasePotionType(type); } } 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 c2c88362ff..f2227b4f14 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java @@ -459,6 +459,9 @@ public class BukkitImplDeprecations { // Added 2025/01/23 public static Warning projectileLaunchedEntityContext = new FutureWarning("projectileLaunchedEntityContext", "'context.entity' in the 'projectile launched' event is deprecated in favor of 'context.projectile'."); + // Added 2025/03/29 + public static Warning areaEffectCloudControls = new FutureWarning("areaEffectCloudControls", "Several tags/mechanisms for controlling area effect clouds have been merged into existing properties, check relevant meta docs for more information."); + // Added 2025/04/27 public static Warning playerChangesWorldSwitches = new FutureWarning("playerChangesWorldSwitches", "The 'from' and 'to' arguments in the 'player changes world' script event have been deprecated in favor of the 'from' and 'to' switches."); diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/AreaEffectCloudHelper.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/AreaEffectCloudHelper.java index 0ee9f1855a..90b9279c73 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/AreaEffectCloudHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/AreaEffectCloudHelper.java @@ -1,5 +1,7 @@ package com.denizenscript.denizen.utilities.entity; +import com.denizenscript.denizen.utilities.Utilities; +import com.denizenscript.denizencore.objects.core.ElementTag; import org.bukkit.Color; import org.bukkit.Particle; import org.bukkit.entity.AreaEffectCloud; @@ -12,7 +14,6 @@ import java.util.List; -// TODO: 1.20.6: PotionData API public class AreaEffectCloudHelper { private AreaEffectCloud entity; @@ -24,7 +25,6 @@ public AreaEffectCloudHelper(Entity entity) { // Base Potion Data ///////// - // TODO: 1.20.6: PotionData API private PotionData getBPData() { return entity.getBasePotionData(); } @@ -62,7 +62,7 @@ public String getParticle() { } public void setParticle(String name) { - Particle particle = Particle.valueOf(name); + Particle particle = Utilities.elementToEnumlike(new ElementTag(name, true), Particle.class); if (particle != null) { entity.setParticle(particle); } From 87846d6a6bc3215b09591102eaba1cbba9e31f3b Mon Sep 17 00:00:00 2001 From: MCSamuel Date: Sun, 4 May 2025 04:30:32 -0700 Subject: [PATCH 164/280] EntityBeeStingers property creation (#2724) * EntityBeeStingers property creation * alignment * isDefaultValue * null check removal --- .../denizen/paper/PaperModule.java | 1 + .../paper/properties/EntityBodyStingers.java | 49 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 paper/src/main/java/com/denizenscript/denizen/paper/properties/EntityBodyStingers.java diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java index 31119de91f..64a6edae1d 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java @@ -108,6 +108,7 @@ public static void init() { if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_18)) { PropertyParser.registerProperty(EntityAutoExpire.class, EntityTag.class); } + PropertyParser.registerProperty(EntityBodyStingers.class, EntityTag.class); PropertyParser.registerProperty(EntityCarryingEgg.class, EntityTag.class); PropertyParser.registerProperty(EntityCanTick.class, EntityTag.class); PropertyParser.registerProperty(EntityDrinkingPotion.class, EntityTag.class); diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/properties/EntityBodyStingers.java b/paper/src/main/java/com/denizenscript/denizen/paper/properties/EntityBodyStingers.java new file mode 100644 index 0000000000..209b08520f --- /dev/null +++ b/paper/src/main/java/com/denizenscript/denizen/paper/properties/EntityBodyStingers.java @@ -0,0 +1,49 @@ +package com.denizenscript.denizen.paper.properties; + +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.objects.properties.entity.EntityProperty; +import com.denizenscript.denizencore.objects.Mechanism; +import com.denizenscript.denizencore.objects.core.ElementTag; + +public class EntityBodyStingers extends EntityProperty { + + // <--[property] + // @object EntityTag + // @name body_stingers + // @input ElementTag(Number) + // @plugin Paper + // @description + // Controls the number of bee stingers stuck in an entity's body. + // Note: Bee stingers will only be visible for players or player-type npcs. + // --> + + public static boolean describes(EntityTag entity) { + return entity.isLivingEntity(); + } + + @Override + public boolean isDefaultValue(ElementTag value) { + return value.asInt() == 0; + } + + @Override + public ElementTag getPropertyValue() { + return new ElementTag(getLivingEntity().getBeeStingersInBody()); + } + + @Override + public String getPropertyId() { + return "body_stingers"; + } + + @Override + public void setPropertyValue(ElementTag param, Mechanism mechanism) { + if (mechanism.requireInteger()) { + getLivingEntity().setBeeStingersInBody(param.asInt()); + } + } + + public static void register() { + autoRegister("body_stingers", EntityBodyStingers.class, ElementTag.class, false); + } +} From 39078d3a4a4bca4cebcf0e1e299a67b3af1e54fa Mon Sep 17 00:00:00 2001 From: hyper <39167664+heypr@users.noreply.github.com> Date: Sun, 4 May 2025 07:41:14 -0400 Subject: [PATCH 165/280] Add Paper-only `dragon egg forms` event (#2669) * Added event * Update meta * Add new meta entry + context tag * Enum constructor * remember --- .../denizen/paper/PaperModule.java | 1 + .../events/DragonEggFormScriptEvent.java | 77 +++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 paper/src/main/java/com/denizenscript/denizen/paper/events/DragonEggFormScriptEvent.java diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java index 64a6edae1d..853fe7084e 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java @@ -34,6 +34,7 @@ public static void init() { } ScriptEvent.registerScriptEvent(BlockPreDispenseScriptEvent.class); ScriptEvent.registerScriptEvent(CreeperIgnitesScriptEvent.class); + ScriptEvent.registerScriptEvent(DragonEggFormScriptEvent.class); ScriptEvent.registerScriptEvent(EntityAddToWorldScriptEvent.class); ScriptEvent.registerScriptEvent(EntityKnocksbackEntityScriptEvent.class); ScriptEvent.registerScriptEvent(EntityLoadCrossbowScriptEvent.class); diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/DragonEggFormScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/DragonEggFormScriptEvent.java new file mode 100644 index 0000000000..944edf8062 --- /dev/null +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/DragonEggFormScriptEvent.java @@ -0,0 +1,77 @@ +package com.denizenscript.denizen.paper.events; + +import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.objects.LocationTag; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.objects.core.ListTag; +import io.papermc.paper.event.block.DragonEggFormEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class DragonEggFormScriptEvent extends BukkitScriptEvent implements Listener { + + // <--[event] + // @Events + // dragon egg forms + // + // @Plugin Paper + // + // @Group Paper + // + // @Location true + // + // @Triggers when the ender dragon is defeated and the dragon egg forms. + // + // @Context + // returns the EntityTag of the ender dragon right before it's removed. + // returns the LocationTag of the dragon egg. + // returns the LocationTag of the end portal. + // returns an ElementTag(Boolean) of whether the dragon has been previously killed. + // returns an ElementTag of the respawn phase. Valid values can be found at <@link url https://jd.papermc.io/paper/1.21.3/org/bukkit/boss/DragonBattle.RespawnPhase.html>. + // returns a ListTag(EntityTag) of the healing end crystals. + // returns a ListTag(EntityTag) of the respawn end crystals. + // + // --> + + public DragonEggFormScriptEvent() { + registerCouldMatcher("dragon egg forms"); + } + + public LocationTag location; + public EntityTag entity; + public DragonEggFormEvent event; + + @Override + public boolean matches(ScriptPath path) { + if (!runInCheck(path, location)) { + return false; + } + return super.matches(path); + } + + @Override + public ObjectTag getContext(String name) { + return switch (name) { + case "entity" -> entity; + case "location" -> location; + case "end_portal_location" -> new LocationTag(event.getDragonBattle().getEndPortalLocation()); + case "previously_killed" -> new ElementTag(event.getDragonBattle().hasBeenPreviouslyKilled()); + case "respawn_phase" -> new ElementTag(event.getDragonBattle().getRespawnPhase()); + case "healing_crystals" -> new ListTag(event.getDragonBattle().getHealingCrystals(), EntityTag::new); + case "respawn_crystals" -> new ListTag(event.getDragonBattle().getRespawnCrystals(), EntityTag::new); + default -> super.getContext(name); + }; + } + + @EventHandler + public void onDragonEggForms(DragonEggFormEvent event) { + location = new LocationTag(event.getBlock().getLocation()); + entity = new EntityTag(event.getDragonBattle().getEnderDragon()); + this.event = event; + EntityTag.rememberEntity(entity.getBukkitEntity()); + fire(event); + EntityTag.forgetEntity(entity.getBukkitEntity()); + } +} From 75f7c61509882ebaf7132625d3956465957b8c1c Mon Sep 17 00:00:00 2001 From: MCSamuel Date: Thu, 8 May 2025 15:03:42 -0700 Subject: [PATCH 166/280] `EntityTag.variant`: pig, cow, and chicken support (#2717) * Updated Variant property to include chickens, cows, and pigs for 1.21+ * aya update * elementToRequiredEnumLike usage --- .../properties/entity/EntityVariant.java | 57 +++++++++++++++---- 1 file changed, 47 insertions(+), 10 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityVariant.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityVariant.java index e912bc4790..c009c6a16d 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityVariant.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityVariant.java @@ -1,10 +1,12 @@ package com.denizenscript.denizen.objects.properties.entity; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.core.ElementTag; -import org.bukkit.entity.Wolf; +import org.bukkit.entity.*; public class EntityVariant extends EntityProperty { @@ -13,27 +15,62 @@ public class EntityVariant extends EntityProperty { // @name variant // @input ElementTag // @description - // Controls which variant a wolf is. - // A list of valid variants can be found at <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/entity/Wolf.Variant.html>. + // Controls which variant a chicken, cow, pig, or wolf is. + // A list of valid chicken variants can be found at <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/entity/Chicken.Variant.html>. + // A list of valid cow variants can be found at <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/entity/Cow.Variant.html>. + // A list of valid pig variants can be found at <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/entity/Pig.Variant.html>. + // A list of valid wolf variants can be found at <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/entity/Wolf.Variant.html>. // --> public static boolean describes(EntityTag entity) { - return entity.getBukkitEntity() instanceof Wolf; + return entity.getBukkitEntity() instanceof Wolf + || (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && entity.getBukkitEntity() instanceof Chicken) + || (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && entity.getBukkitEntity() instanceof Cow) + || (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && entity.getBukkitEntity() instanceof Pig); } @Override public ElementTag getPropertyValue() { - return new ElementTag(Utilities.namespacedKeyToString(as(Wolf.class).getVariant().getKey())); + if (getEntity() instanceof Wolf wolf) { + return new ElementTag(Utilities.namespacedKeyToString(wolf.getVariant().getKey()), true); + } + else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && getEntity() instanceof Chicken chicken) { + return new ElementTag(Utilities.namespacedKeyToString(chicken.getVariant().getKey()), true); + } + else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && getEntity() instanceof Cow cow) { + return new ElementTag(Utilities.namespacedKeyToString(cow.getVariant().getKey()), true); + } + else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && getEntity() instanceof Pig pig) { + return new ElementTag(Utilities.namespacedKeyToString(pig.getVariant().getKey()), true); + } + return null; } @Override public void setPropertyValue(ElementTag variant, Mechanism mechanism) { - Wolf.Variant wolfVariety = Utilities.elementToEnumlike(variant, Wolf.Variant.class); - if (wolfVariety != null) { - as(Wolf.class).setVariant(wolfVariety); + if (getEntity() instanceof Wolf wolf) { + Wolf.Variant wolfVariant = Utilities.elementToRequiredEnumLike(variant, Wolf.Variant.class, mechanism); + if (wolfVariant != null) { + wolf.setVariant(wolfVariant); + } + } + else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && getEntity() instanceof Chicken chicken) { + Chicken.Variant chickenVariant = Utilities.elementToRequiredEnumLike(variant, Chicken.Variant.class, mechanism); + if (chickenVariant != null) { + chicken.setVariant(chickenVariant); + } + } + else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && getEntity() instanceof Cow cow) { + Cow.Variant cowVariant = Utilities.elementToRequiredEnumLike(variant, Cow.Variant.class, mechanism); + if (cowVariant != null) { + cow.setVariant(cowVariant); + } } - else { - mechanism.echoError("Invalid wolf variant specified: " + variant); + else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && getEntity() instanceof Pig pig) { + Pig.Variant pigVariant = Utilities.elementToRequiredEnumLike(variant, Pig.Variant.class, mechanism); + if (pigVariant != null) { + pig.setVariant(pigVariant); + } } } From e10a65f742891eb2a9d49bbd4cb9c38f5d42bb95 Mon Sep 17 00:00:00 2001 From: hyper <39167664+heypr@users.noreply.github.com> Date: Thu, 8 May 2025 18:13:26 -0400 Subject: [PATCH 167/280] `EntityTag.should_burn`: bogged and stray support (#2638) * Unburnable strays * Changed to cover all skeleton types * Update EntityShouldBurn.java * Updated property again yay * Removed TODO --- .../paper/properties/EntityShouldBurn.java | 32 +++++++++++++------ 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/properties/EntityShouldBurn.java b/paper/src/main/java/com/denizenscript/denizen/paper/properties/EntityShouldBurn.java index 93a216dcc8..32af74348e 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/properties/EntityShouldBurn.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/properties/EntityShouldBurn.java @@ -1,12 +1,12 @@ package com.denizenscript.denizen.paper.properties; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.properties.entity.EntityProperty; import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.core.ElementTag; -import org.bukkit.entity.Phantom; -import org.bukkit.entity.Skeleton; -import org.bukkit.entity.Zombie; +import org.bukkit.entity.*; public class EntityShouldBurn extends EntityProperty { @@ -16,13 +16,15 @@ public class EntityShouldBurn extends EntityProperty { // @input ElementTag(Boolean) // @plugin Paper // @description - // If the entity is a Zombie, Skeleton, or Phantom, controls whether it should burn in daylight. + // If the entity is a Zombie, Skeleton, Stray, Bogged, or Phantom, controls whether it should burn in daylight. // --> public static boolean describes(EntityTag entity) { return entity.getBukkitEntity() instanceof Zombie + || entity.getBukkitEntity() instanceof Phantom || entity.getBukkitEntity() instanceof Skeleton - || entity.getBukkitEntity() instanceof Phantom; + || entity.getBukkitEntity() instanceof Stray + || (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20) && entity.getBukkitEntity() instanceof Bogged); } @Override @@ -30,11 +32,17 @@ public ElementTag getPropertyValue() { if (getEntity() instanceof Zombie zombie) { return new ElementTag(zombie.shouldBurnInDay()); } + else if (getEntity() instanceof Phantom phantom) { + return new ElementTag(phantom.shouldBurnInDay()); + } else if (getEntity() instanceof Skeleton skeleton) { return new ElementTag(skeleton.shouldBurnInDay()); } - else { // phantom - return new ElementTag(as(Phantom.class).shouldBurnInDay()); + else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20) && getEntity() instanceof Bogged bogged) { + return new ElementTag(bogged.shouldBurnInDay()); + } + else { // stray + return new ElementTag(as(Stray.class).shouldBurnInDay()); } } @@ -49,11 +57,17 @@ public void setPropertyValue(ElementTag param, Mechanism mechanism) { if (getEntity() instanceof Zombie zombie) { zombie.setShouldBurnInDay(param.asBoolean()); } + else if (getEntity() instanceof Phantom phantom) { + phantom.setShouldBurnInDay(param.asBoolean()); + } else if (getEntity() instanceof Skeleton skeleton) { skeleton.setShouldBurnInDay(param.asBoolean()); } - else { // phantom - as(Phantom.class).setShouldBurnInDay(param.asBoolean()); + else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20) && getEntity() instanceof Bogged bogged) { + bogged.setShouldBurnInDay(param.asBoolean()); + } + else { // stray + as(Stray.class).setShouldBurnInDay(param.asBoolean()); } } } From 7973eb955953ea29c5109e497b62d98f74e152ef Mon Sep 17 00:00:00 2001 From: MCSamuel Date: Wed, 14 May 2025 03:50:54 -0700 Subject: [PATCH 168/280] PlayerSpawnChangeScriptEvent Creation (#2720) * PlayerSpawnChangeScriptEvent creation * minor change * version check in registry * . * enum constructor * enum constructor * Moved to Paper-exclusive * PaperModule update * location switch compatibility * event name change --- .../denizen/paper/PaperModule.java | 1 + .../events/PlayerSetSpawnScriptEvent.java | 111 ++++++++++++++++++ .../denizen/events/ScriptEventRegistry.java | 6 +- 3 files changed, 115 insertions(+), 3 deletions(-) create mode 100644 paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerSetSpawnScriptEvent.java diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java index 853fe7084e..58ff60ed66 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java @@ -77,6 +77,7 @@ public static void init() { ScriptEvent.registerScriptEvent(PlayerRaiseLowerItemScriptEventPaperImpl.class); } ScriptEvent.registerScriptEvent(PlayerSelectsStonecutterRecipeScriptEvent.class); + ScriptEvent.registerScriptEvent(PlayerSetSpawnScriptEvent.class); if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) { ScriptEvent.registerScriptEvent(PlayerShieldDisableScriptEvent.class); } diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerSetSpawnScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerSetSpawnScriptEvent.java new file mode 100644 index 0000000000..7f68012369 --- /dev/null +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerSetSpawnScriptEvent.java @@ -0,0 +1,111 @@ +package com.denizenscript.denizen.paper.events; + +import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.objects.LocationTag; +import com.denizenscript.denizen.paper.PaperModule; +import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.scripts.ScriptEntryData; +import com.destroystokyo.paper.event.player.PlayerSetSpawnEvent; +import net.md_5.bungee.api.ChatColor; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class PlayerSetSpawnScriptEvent extends BukkitScriptEvent implements Listener { + + // <--[event] + // @Events + // player sets spawn + // + // @Cancellable true + // + // @Location true + // + // @Plugin Paper + // + // @Group Paper + // + // @Triggers when a player's spawn point changes. + // + // @Switch cause: to only process when the cause for the event matches the input. + // + // @Context + // returns the reason the player's spawn point changed. A list of causes can be found at <@link url https://jd.papermc.io/paper/1.21.5/com/destroystokyo/paper/event/player/PlayerSetSpawnEvent.Cause.html>. + // returns whether this event will persist through source block (bed or respawn anchor) removal. + // returns a LocationTag of the new respawn location, if any. + // returns the notification message that is sent to the player. + // returns whether the player will be notified their spawn point changed. + // + // @Determine + // "FORCED:" to set whether the player's new spawnpoint will persist even if the bed or respawn anchor that triggered the event is removed. + // "MESSAGE:" to set the notification message that is sent to the player. + // "NOTIFY:" to set whether the player will be notified their spawnpoint changed. + // LocationTag to change the respawn location. + // + // @Player Always. + // + // --> + + public PlayerSetSpawnScriptEvent() { + registerCouldMatcher("player sets spawn"); + registerSwitches("cause"); + this.registerOptionalDetermination("forced", ElementTag.class, (evt, context, value) -> { + if (value.isBoolean()) { + evt.event.setForced(value.asBoolean()); + return true; + } + return false; + }); + this.registerDetermination("message", ElementTag.class, (evt, context, message) -> { + evt.event.setNotification(PaperModule.parseFormattedText(message.toString(), ChatColor.WHITE)); + }); + this.registerOptionalDetermination("notify", ElementTag.class, (evt, context, value) -> { + if (value.isBoolean()) { + evt.event.setNotifyPlayer(value.asBoolean()); + return true; + } + return false; + }); + this.registerDetermination(null, LocationTag.class, (evt, context, location) -> { + evt.event.setLocation(location); + evt.event.setForced(true); // required if the cause is a bed or respawn anchor + }); + } + + public PlayerSetSpawnEvent event; + + @Override + public boolean matches(ScriptPath path) { + if (!runInCheck(path, event.getLocation())) { + return false; + } + if (!runGenericSwitchCheck(path, "cause", event.getCause().toString())) { + return false; + } + return super.matches(path); + } + + @Override + public ScriptEntryData getScriptEntryData() { + return new BukkitScriptEntryData(event.getPlayer()); + } + + @Override + public ObjectTag getContext(String name) { + return switch (name) { + case "cause" -> new ElementTag(event.getCause()); + case "forced" -> new ElementTag(event.isForced()); + case "location" -> event.getLocation() != null ? new LocationTag(event.getLocation()) : null; + case "message" -> event.getNotification() != null ? new ElementTag(PaperModule.stringifyComponent(event.getNotification()), true) : null; + case "notify" -> new ElementTag(event.willNotifyPlayer()); + default -> super.getContext(name); + }; + } + + @EventHandler + public void onPlayerSetsSpawn(PlayerSetSpawnEvent event) { + this.event = event; + fire(event); + } +} diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java index 587965644d..b5341a3713 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java @@ -177,14 +177,14 @@ public static void registerMainEvents() { ScriptEvent.registerScriptEvent(BiomeEnterExitScriptEvent.class); ScriptEvent.registerScriptEvent(BlockDropsItemScriptEvent.class); ScriptEvent.registerScriptEvent(ChatScriptEvent.class); - ScriptEvent.registerScriptEvent(HotbarScrollScriptEvent.class); ScriptEvent.registerScriptEvent(ExperienceBottleBreaksScriptEvent.class); + ScriptEvent.registerScriptEvent(HotbarScrollScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerAnimatesScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerArmorStandManipulateScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerBreaksBlockScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerBreaksItemScriptEvent.class); - ScriptEvent.registerScriptEvent(PlayerChangesMainHandScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerChangesGamemodeScriptEvent.class); + ScriptEvent.registerScriptEvent(PlayerChangesMainHandScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerChangesSignScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerChangesWorldScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerChangesXPScriptEvent.class); @@ -227,6 +227,7 @@ public static void registerMainEvents() { ScriptEvent.registerScriptEvent(PlayerPreLoginScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerPreparesAnvilCraftScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerPreparesEnchantScriptEvent.class); + ScriptEvent.registerScriptEvent(PlayerPreparesSmithingTableScriptEvent.class); if (!Denizen.supportsPaper) { ScriptEvent.registerScriptEvent(PlayerQuitsScriptEvent.class); } @@ -245,7 +246,6 @@ public static void registerMainEvents() { ScriptEvent.registerScriptEvent(PlayerSendPacketScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerShearsScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerSmithsItemScriptEvent.class); - ScriptEvent.registerScriptEvent(PlayerPreparesSmithingTableScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerSneakScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerSprintScriptEvent.class); ScriptEvent.registerScriptEvent(PlayerStandsOnScriptEvent.class); From 3138bcfc6d157f557c822745bf4972da781d4cc3 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Thu, 22 May 2025 12:49:32 +0100 Subject: [PATCH 169/280] Fix for `Cow` -> `AbstractCow` bytecode remap (#2727) * Fix for `Cow` -> `AbstractCow` bytecode remap * Add TODO * Make TODO clearer --- .../properties/entity/EntityVariant.java | 43 ++++++++++++++++--- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityVariant.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityVariant.java index c009c6a16d..4ded567281 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityVariant.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/entity/EntityVariant.java @@ -6,10 +6,32 @@ import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.core.ElementTag; -import org.bukkit.entity.*; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import org.bukkit.entity.Chicken; +import org.bukkit.entity.Cow; +import org.bukkit.entity.Pig; +import org.bukkit.entity.Wolf; + +import java.lang.invoke.MethodHandle; public class EntityVariant extends EntityProperty { + // TODO: once the plugin.yml API version is 1.21, replace with direct method calls (see https://github.com/DenizenScript/Denizen/pull/2727) + public static final MethodHandle COW_GET_VARIANT, COW_SET_VARIANT; + + static { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + Class cowClass = ReflectionHelper.getClassOrThrow("org.bukkit.entity.Cow"); + COW_GET_VARIANT = ReflectionHelper.getMethodHandle(cowClass, "getVariant"); + COW_SET_VARIANT = ReflectionHelper.getMethodHandle(cowClass, "setVariant", Cow.Variant.class); + } + else { + COW_GET_VARIANT = null; + COW_SET_VARIANT = null; + } + } + // <--[property] // @object EntityTag // @name variant @@ -37,8 +59,14 @@ public ElementTag getPropertyValue() { else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && getEntity() instanceof Chicken chicken) { return new ElementTag(Utilities.namespacedKeyToString(chicken.getVariant().getKey()), true); } - else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && getEntity() instanceof Cow cow) { - return new ElementTag(Utilities.namespacedKeyToString(cow.getVariant().getKey()), true); + else if (COW_GET_VARIANT != null && getEntity() instanceof Cow cow) { + try { + return new ElementTag(Utilities.namespacedKeyToString(((Cow.Variant) COW_GET_VARIANT.invoke(cow)).getKey()), true); + } + catch (Throwable e) { + Debug.echoError(e); + return null; + } } else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && getEntity() instanceof Pig pig) { return new ElementTag(Utilities.namespacedKeyToString(pig.getVariant().getKey()), true); @@ -60,10 +88,15 @@ else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && getEntity() inst chicken.setVariant(chickenVariant); } } - else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && getEntity() instanceof Cow cow) { + else if (COW_SET_VARIANT != null && getEntity() instanceof Cow cow) { Cow.Variant cowVariant = Utilities.elementToRequiredEnumLike(variant, Cow.Variant.class, mechanism); if (cowVariant != null) { - cow.setVariant(cowVariant); + try { + COW_SET_VARIANT.invoke(cow, cowVariant); + } + catch (Throwable e) { + Debug.echoError(e); + } } } else if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) && getEntity() instanceof Pig pig) { From 7e4a352ee2e0766d9b109c7ce2dd334d78974562 Mon Sep 17 00:00:00 2001 From: MCSamuel Date: Mon, 26 May 2025 03:19:30 -0700 Subject: [PATCH 170/280] 9 Paper events modernized (#2726) * 9 Paper events modernized * minor changes * minor changes * Determination flip, plaintext indicated, converted from component * plain-text --- .../events/AnvilBlockDamagedScriptEvent.java | 46 ++++++-------- .../events/EntityLoadCrossbowScriptEvent.java | 35 +++-------- .../events/PlayerElytraBoostScriptEvent.java | 34 ++++------ .../PlayerLecternPageChangeScriptEvent.java | 23 +++---- .../PlayerLoomPatternSelectScriptEvent.java | 21 +++---- ...yerPreparesGrindstoneCraftScriptEvent.java | 19 +----- .../PlayerTradesWithMerchantScriptEvent.java | 24 +++---- .../events/UnknownCommandScriptEvent.java | 62 ++++++------------- .../WorldGameRuleChangeScriptEvent.java | 42 +++++-------- 9 files changed, 104 insertions(+), 202 deletions(-) diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/AnvilBlockDamagedScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/AnvilBlockDamagedScriptEvent.java index 7bc98d3f02..effc8f9e27 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/events/AnvilBlockDamagedScriptEvent.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/AnvilBlockDamagedScriptEvent.java @@ -7,7 +7,6 @@ import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; -import com.denizenscript.denizencore.utilities.CoreUtilities; import com.destroystokyo.paper.event.block.AnvilDamagedEvent; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -43,6 +42,20 @@ public class AnvilBlockDamagedScriptEvent extends BukkitScriptEvent implements L public AnvilBlockDamagedScriptEvent() { registerCouldMatcher("anvil block damaged|breaks"); registerSwitches("state"); + this.registerOptionalDetermination("state", ElementTag.class, (evt, context, state) -> { + if (state.matchesEnum(AnvilDamagedEvent.DamageState.class)) { + evt.event.setDamageState(state.asEnum(AnvilDamagedEvent.DamageState.class)); + return true; + } + return false; + }); + this.registerOptionalDetermination("break", ElementTag.class, (evt, context, value) -> { + if (value.isBoolean()) { + evt.event.setBreaking(value.asBoolean()); + return true; + } + return false; + }); } public AnvilDamagedEvent event; @@ -63,31 +76,12 @@ public boolean matches(ScriptPath path) { @Override public ObjectTag getContext(String name) { - switch (name) { - case "state": return new ElementTag(event.getDamageState()); - case "inventory": return InventoryTag.mirrorBukkitInventory(event.getInventory()); - case "break": return new ElementTag(event.isBreaking()); - } - return super.getContext(name); - } - - @Override - public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) { - if (determinationObj instanceof ElementTag) { - String lower = CoreUtilities.toLowerCase(determinationObj.toString()); - if (lower.startsWith("state:")) { - ElementTag stateElement = new ElementTag(lower.substring("state:".length())); - if (stateElement.matchesEnum(AnvilDamagedEvent.DamageState.class)) { - event.setDamageState(stateElement.asEnum(AnvilDamagedEvent.DamageState.class)); - return true; - } - } - else if (lower.startsWith("break:")) { - event.setBreaking(new ElementTag(lower.substring("break:".length())).asBoolean()); - return true; - } - } - return super.applyDetermination(path, determinationObj); + return switch (name) { + case "state" -> new ElementTag(event.getDamageState()); + case "inventory" -> InventoryTag.mirrorBukkitInventory(event.getInventory()); + case "break" -> new ElementTag(event.isBreaking()); + default -> super.getContext(name); + }; } @Override diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/EntityLoadCrossbowScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/EntityLoadCrossbowScriptEvent.java index 34fadbc0b0..77eb0a94eb 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/events/EntityLoadCrossbowScriptEvent.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/EntityLoadCrossbowScriptEvent.java @@ -7,7 +7,6 @@ import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; -import com.denizenscript.denizencore.utilities.CoreUtilities; import io.papermc.paper.event.entity.EntityLoadCrossbowEvent; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -48,9 +47,11 @@ public class EntityLoadCrossbowScriptEvent extends BukkitScriptEvent implements public EntityLoadCrossbowScriptEvent() { registerCouldMatcher(" loads crossbow"); registerSwitches("crossbow"); + this.registerTextDetermination("keep_item", (evt) -> { + evt.event.setConsumeItem(false); + }); } - public EntityLoadCrossbowEvent event; public EntityTag entity; @@ -70,31 +71,15 @@ public ScriptEntryData getScriptEntryData() { return new BukkitScriptEntryData(entity); } - @Override - public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) { - if (determinationObj instanceof ElementTag) { - String lower = CoreUtilities.toLowerCase(determinationObj.toString()); - if (lower.equals("keep_item")) { - event.setConsumeItem(false); - return true; - } - } - return super.applyDetermination(path, determinationObj); - } - @Override public ObjectTag getContext(String name) { - switch (name) { - case "entity": - return entity.getDenizenObject(); - case "crossbow": - return new ItemTag(event.getCrossbow()); - case "hand": - return new ElementTag(event.getHand()); - case "consumes": - return new ElementTag(event.shouldConsumeItem()); - } - return super.getContext(name); + return switch (name) { + case "entity" -> entity.getDenizenObject(); + case "crossbow" -> new ItemTag(event.getCrossbow()); + case "hand" -> new ElementTag(event.getHand()); + case "consumes" -> new ElementTag(event.shouldConsumeItem()); + default -> super.getContext(name); + }; } @EventHandler diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerElytraBoostScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerElytraBoostScriptEvent.java index 9063369f10..2a8300cc43 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerElytraBoostScriptEvent.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerElytraBoostScriptEvent.java @@ -8,7 +8,6 @@ import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; -import com.denizenscript.denizencore.utilities.CoreUtilities; import com.destroystokyo.paper.event.player.PlayerElytraBoostEvent; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -47,6 +46,13 @@ public class PlayerElytraBoostScriptEvent extends BukkitScriptEvent implements L public PlayerElytraBoostScriptEvent() { registerCouldMatcher("player boosts elytra"); registerSwitches("with", "elytra"); + this.registerOptionalDetermination("keep", ElementTag.class, (evt, context, value) -> { + if (value.isBoolean()) { + evt.event.setShouldConsume(!value.asBoolean()); + return true; + } + return false; + }); } public PlayerElytraBoostEvent event; @@ -74,26 +80,12 @@ public ScriptEntryData getScriptEntryData() { @Override public ObjectTag getContext(String name) { - switch (name) { - case "item": - return firework; - case "entity": - return new EntityTag(event.getFirework()); - case "should_keep": - return new ElementTag(!event.shouldConsume()); - } - return super.getContext(name); - } - - @Override - public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) { - String determination = CoreUtilities.toLowerCase(determinationObj.toString()); - if (determination.startsWith("keep:")) { - String value = determination.substring("keep:".length()); - event.setShouldConsume(!(new ElementTag(value).asBoolean())); - return true; - } - return super.applyDetermination(path, determinationObj); + return switch (name) { + case "item" -> firework; + case "entity" -> new EntityTag(event.getFirework()); + case "should_keep" -> new ElementTag(!event.shouldConsume()); + default -> super.getContext(name); + }; } @EventHandler diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerLecternPageChangeScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerLecternPageChangeScriptEvent.java index 7ffe51f311..c4a7a555a1 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerLecternPageChangeScriptEvent.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerLecternPageChangeScriptEvent.java @@ -7,7 +7,6 @@ import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; -import com.denizenscript.denizencore.utilities.CoreUtilities; import io.papermc.paper.event.player.PlayerLecternPageChangeEvent; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -57,6 +56,13 @@ public class PlayerLecternPageChangeScriptEvent extends BukkitScriptEvent implem public PlayerLecternPageChangeScriptEvent() { registerCouldMatcher("player flips lectern page"); registerSwitches("book"); + this.registerOptionalDetermination("page", ElementTag.class, (evt, context, page) -> { + if (page.isInt()) { + evt.event.setNewPage(page.asInt() - 1); + return true; + } + return false; + }); } public PlayerLecternPageChangeEvent event; @@ -88,21 +94,6 @@ public ObjectTag getContext(String name) { default -> super.getContext(name); }; } - - @Override - public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) { - if (determinationObj instanceof ElementTag) { - String lower = CoreUtilities.toLowerCase(determinationObj.toString()); - if (lower.startsWith("page:")) { - ElementTag value = new ElementTag(lower.substring("page:".length())); - if (value.isInt()) { - event.setNewPage(value.asInt() - 1); - return true; - } - } - } - return super.applyDetermination(path, determinationObj); - } @EventHandler public void onPlayerFlipsLecternPage(PlayerLecternPageChangeEvent event) { diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerLoomPatternSelectScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerLoomPatternSelectScriptEvent.java index 3501c2164f..ca27f1747f 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerLoomPatternSelectScriptEvent.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerLoomPatternSelectScriptEvent.java @@ -7,7 +7,6 @@ import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; -import com.denizenscript.denizencore.utilities.CoreUtilities; import io.papermc.paper.event.player.PlayerLoomPatternSelectEvent; import org.bukkit.block.banner.PatternType; import org.bukkit.event.EventHandler; @@ -56,6 +55,13 @@ public class PlayerLoomPatternSelectScriptEvent extends BukkitScriptEvent implem public PlayerLoomPatternSelectScriptEvent() { registerCouldMatcher("player selects loom pattern"); registerSwitches("type"); + this.registerOptionalDetermination("pattern", ElementTag.class, (evt, context, pattern) -> { + if (Utilities.matchesEnumlike(pattern, PatternType.class)) { + evt.event.setPatternType(Utilities.elementToEnumlike(pattern, PatternType.class)); + return true; + } + return false; + }); } public PlayerLoomPatternSelectEvent event; @@ -85,19 +91,6 @@ public ObjectTag getContext(String name) { }; } - @Override - public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) { - if (determinationObj instanceof ElementTag) { - String lower = CoreUtilities.toLowerCase(determinationObj.toString()); - if (lower.startsWith("pattern:")) { - ElementTag value = new ElementTag(lower.substring("pattern:".length())); - event.setPatternType(Utilities.elementToEnumlike(value, PatternType.class)); - return true; - } - } - return super.applyDetermination(path, determinationObj); - } - @EventHandler public void onPlayerSelectsLoomPattern(PlayerLoomPatternSelectEvent event) { this.event = event; diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerPreparesGrindstoneCraftScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerPreparesGrindstoneCraftScriptEvent.java index 00ec129dfd..f28063ba49 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerPreparesGrindstoneCraftScriptEvent.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerPreparesGrindstoneCraftScriptEvent.java @@ -4,9 +4,7 @@ import com.denizenscript.denizen.objects.*; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; import com.denizenscript.denizencore.objects.ObjectTag; -import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; -import com.denizenscript.denizencore.utilities.CoreUtilities; import com.destroystokyo.paper.event.inventory.PrepareResultEvent; import org.bukkit.entity.HumanEntity; import org.bukkit.event.EventHandler; @@ -48,6 +46,9 @@ public class PlayerPreparesGrindstoneCraftScriptEvent extends BukkitScriptEvent public PlayerPreparesGrindstoneCraftScriptEvent() { registerCouldMatcher("player prepares grindstone craft "); + this.registerDetermination("result", ItemTag.class, (evt, context, item) -> { + evt.event.setResult(item.getItemStack()); + }); } public PrepareResultEvent event; @@ -64,20 +65,6 @@ public boolean matches(ScriptPath path) { return super.matches(path); } - @Override - public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) { - if (determinationObj instanceof ElementTag) { - String determination = determinationObj.toString(); - String lower = CoreUtilities.toLowerCase(determination); - if (lower.startsWith("result:")) { - ItemTag result = ItemTag.valueOf(determination.substring("result:".length()), path.container); - event.setResult(result.getItemStack()); - return true; - } - } - return super.applyDetermination(path, determinationObj); - } - @Override public ObjectTag getContext(String name) { return switch (name) { diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerTradesWithMerchantScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerTradesWithMerchantScriptEvent.java index 3dade8522d..f422eb9bc7 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerTradesWithMerchantScriptEvent.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerTradesWithMerchantScriptEvent.java @@ -45,6 +45,9 @@ public class PlayerTradesWithMerchantScriptEvent extends BukkitScriptEvent imple public PlayerTradesWithMerchantScriptEvent() { registerCouldMatcher("player trades with merchant"); registerSwitches("result"); + this.registerDetermination(null, TradeTag.class, (evt, context, trade) -> { + evt.event.setTrade(trade.getRecipe()); + }); } public PlayerPurchaseEvent event; @@ -60,15 +63,6 @@ public boolean matches(ScriptPath path) { return super.matches(path); } - @Override - public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) { - if (determinationObj.canBeType(TradeTag.class)) { - event.setTrade(determinationObj.asType(TradeTag.class, getTagContext(path)).getRecipe()); - return true; - } - return super.applyDetermination(path, determinationObj); - } - @Override public ScriptEntryData getScriptEntryData() { return new BukkitScriptEntryData(event.getPlayer()); @@ -76,13 +70,11 @@ public ScriptEntryData getScriptEntryData() { @Override public ObjectTag getContext(String name) { - if (name.equals("merchant") && event instanceof PlayerTradeEvent) { - return new EntityTag(((PlayerTradeEvent) event).getVillager()); - } - else if (name.equals("trade")) { - return new TradeTag(event.getTrade()).duplicate(); - } - return super.getContext(name); + return switch (name) { + case "merchant" -> event instanceof PlayerTradeEvent tradeEvent ? new EntityTag(tradeEvent.getVillager()) : null; + case "trade" -> new TradeTag(event.getTrade()).duplicate(); + default -> super.getContext(name); + }; } @EventHandler diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/UnknownCommandScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/UnknownCommandScriptEvent.java index e6ed7000f9..c800cf62e0 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/events/UnknownCommandScriptEvent.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/UnknownCommandScriptEvent.java @@ -4,13 +4,14 @@ import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.objects.PlayerTag; +import com.denizenscript.denizen.paper.PaperModule; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; import com.denizenscript.denizencore.objects.ArgumentHelper; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.ListTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; -import com.denizenscript.denizencore.utilities.CoreUtilities; +import net.md_5.bungee.api.ChatColor; import org.bukkit.command.BlockCommandSender; import org.bukkit.entity.Player; import org.bukkit.entity.minecart.CommandMinecart; @@ -53,6 +54,12 @@ public class UnknownCommandScriptEvent extends BukkitScriptEvent implements List public UnknownCommandScriptEvent() { registerCouldMatcher("command unknown"); + this.registerDetermination(null, ElementTag.class, (evt, context, text) -> { + evt.event.message(PaperModule.parseFormattedText(text.toString(), ChatColor.WHITE)); + }); + this.registerTextDetermination("none", (evt) -> { + evt.event.message(null); + }); } public UnknownCommandEvent event; @@ -60,53 +67,24 @@ public UnknownCommandScriptEvent() { public String rawArgs; public String sourceType; - @Override - public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) { - if (determinationObj instanceof ElementTag) { - String determination = determinationObj.toString(); - if (CoreUtilities.equalsIgnoreCase(determination, "none")) { - event.setMessage(null); - } - else { - event.setMessage(determination); - } - return true; - } - return super.applyDetermination(path, determinationObj); - } - @Override public ScriptEntryData getScriptEntryData() { - return new BukkitScriptEntryData(event.getSender() instanceof Player ? new PlayerTag((Player) event.getSender()) : null, null); + return new BukkitScriptEntryData(event.getSender() instanceof Player player ? new PlayerTag(player) : null, null); } @Override public ObjectTag getContext(String name) { - if (name.equals("command")) { - return new ElementTag(command); - } - else if (name.equals("raw_args")) { - return new ElementTag(rawArgs); - } - else if (name.equals("args")) { - return new ListTag(Arrays.asList(ArgumentHelper.buildArgs(rawArgs, false))); - } - else if (name.equals("server")) { - return new ElementTag(sourceType.equals("server")); - } - else if (name.equals("source_type")) { - return new ElementTag(sourceType); - } - else if (name.equals("command_block_location") && sourceType.equals("command_block")) { - return new LocationTag(((BlockCommandSender) event.getSender()).getBlock().getLocation()); - } - else if (name.equals("command_minecart") && sourceType.equals("command_minecart")) { - return new EntityTag((CommandMinecart) event.getSender()); - } - else if (name.equals("message")) { - return new ElementTag(event.getMessage()); - } - return super.getContext(name); + return switch (name) { + case "command" -> new ElementTag(command, true); + case "raw_args" -> new ElementTag(rawArgs, true); + case "args" -> new ListTag(Arrays.asList(ArgumentHelper.buildArgs(rawArgs, false)), true); + case "server" -> new ElementTag(sourceType.equals("server")); + case "source_type" -> new ElementTag(sourceType, true); + case "command_block_location" -> sourceType.equals("command_block") ? new LocationTag(((BlockCommandSender) event.getSender()).getBlock().getLocation()) : null; + case "command_minecart" -> sourceType.equals("command_minecart") ? new EntityTag((CommandMinecart) event.getSender()) : null; + case "message" -> new ElementTag(PaperModule.stringifyComponent(event.message()), true); + default -> super.getContext(name); + }; } @EventHandler diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/WorldGameRuleChangeScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/WorldGameRuleChangeScriptEvent.java index 74f9555a86..faf88722fd 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/events/WorldGameRuleChangeScriptEvent.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/WorldGameRuleChangeScriptEvent.java @@ -10,7 +10,6 @@ import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; -import com.denizenscript.denizencore.utilities.CoreUtilities; import io.papermc.paper.event.world.WorldGameRuleChangeEvent; import org.bukkit.command.BlockCommandSender; import org.bukkit.command.CommandSender; @@ -19,7 +18,6 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; - public class WorldGameRuleChangeScriptEvent extends BukkitScriptEvent implements Listener { // <--[event] @@ -52,6 +50,13 @@ public class WorldGameRuleChangeScriptEvent extends BukkitScriptEvent implements public WorldGameRuleChangeScriptEvent() { registerCouldMatcher("gamerule changes (in )"); registerSwitches("gamerule"); + this.registerOptionalDetermination("value", ElementTag.class, (evt, context, value) -> { + if (value.isBoolean() || value.isInt()) { + evt.event.setValue(value.toString()); + return true; + } + return false; + }); } public WorldGameRuleChangeEvent event; @@ -72,30 +77,15 @@ public boolean matches(ScriptPath path) { @Override public ObjectTag getContext(String name) { - switch (name) { - case "gamerule": return new ElementTag(event.getGameRule().getName()); - case "value": return new ElementTag(event.getValue()); - case "source_type": return getSourceType(); - case "command_block_location": return getCommandBlock(); - case "command_minecart": return getCommandMinecart(); - case "world": return world; - } - return super.getContext(name); - } - - @Override - public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) { - if (determinationObj instanceof ElementTag) { - String lower = CoreUtilities.toLowerCase(determinationObj.toString()); - if (lower.startsWith("value:")) { - ElementTag value = new ElementTag(lower.substring("value:".length())); - if (value.isInt() || value.isBoolean()) { - event.setValue(value.toString()); - return true; - } - } - } - return super.applyDetermination(path, determinationObj); + return switch (name) { + case "gamerule" -> new ElementTag(event.getGameRule().getName(), true); + case "value" -> new ElementTag(event.getValue(), true); + case "source_type" -> getSourceType(); + case "command_block_location" -> getCommandBlock(); + case "command_minecart" -> getCommandMinecart(); + case "world" -> world; + default -> super.getContext(name); + }; } @Override From 3f50099a43f1eb95d9341247aa66e57d1ecd8dbe Mon Sep 17 00:00:00 2001 From: MCSamuel Date: Sun, 8 Jun 2025 04:01:13 -0700 Subject: [PATCH 171/280] `PlayerEditsBookScriptEvent`: update & bugfix (#2728) * PlayerEditsBookScriptEvent fix * update * cleanup * aya update * context parameter --- .../player/PlayerEditsBookScriptEvent.java | 73 ++++++++----------- 1 file changed, 31 insertions(+), 42 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerEditsBookScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerEditsBookScriptEvent.java index 7c469f777c..22c8859ad6 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerEditsBookScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerEditsBookScriptEvent.java @@ -1,7 +1,6 @@ package com.denizenscript.denizen.events.player; import com.denizenscript.denizen.objects.ItemTag; -import com.denizenscript.denizen.objects.PlayerTag; import com.denizenscript.denizen.scripts.containers.core.BookScriptContainer; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; @@ -10,7 +9,6 @@ import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.objects.core.ScriptTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; -import com.denizenscript.denizencore.utilities.CoreUtilities; import org.bukkit.Material; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -51,10 +49,27 @@ public class PlayerEditsBookScriptEvent extends BukkitScriptEvent implements Lis public PlayerEditsBookScriptEvent() { registerCouldMatcher("player edits book"); registerCouldMatcher("player signs book"); + this.registerTextDetermination("not_signing", (evt) -> { + evt.event.setSigning(false); + }); + this.registerOptionalDetermination(null, ScriptTag.class, (evt, context, value) -> { + if (value.getContainer() instanceof BookScriptContainer script) { + ItemTag dBook = script.getBookFrom(context); + BookMeta bookMeta = (BookMeta) dBook.getItemMeta(); + if (dBook.getBukkitMaterial() == Material.WRITABLE_BOOK) { + evt.event.setSigning(false); + } + evt.event.setNewBookMeta(bookMeta); + return true; + } + else { + Debug.echoError("Script '" + value + "' is valid, but not of type 'book'!"); + return false; + } + }); } public PlayerEditBookEvent event; - public PlayerTag player; @Override public boolean matches(ScriptPath path) { @@ -62,65 +77,39 @@ public boolean matches(ScriptPath path) { if (!(action.equals("edits") && !event.isSigning()) && !(action.equals("signs") && event.isSigning())) { return false; } - if (!runInCheck(path, player.getLocation())) { + if (!runInCheck(path, event.getPlayer().getLocation())) { return false; } return super.matches(path); } - @Override - public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) { - String determination = determinationObj.toString(); - if (CoreUtilities.toLowerCase(determination).equals("not_signing")) { - event.setSigning(false); - return true; - } - else if (ScriptTag.matches(determination)) { - ScriptTag script = ScriptTag.valueOf(determination, getTagContext(path)); - if (script.getContainer() instanceof BookScriptContainer) { - ItemTag dBook = ((BookScriptContainer) script.getContainer()).getBookFrom(getScriptEntryData().getTagContext()); - BookMeta bookMeta = (BookMeta) dBook.getItemMeta(); - if (dBook.getMaterial().getMaterial() == Material.WRITABLE_BOOK) { - event.setSigning(false); - } - event.setNewBookMeta(bookMeta); - } - else { - Debug.echoError("Script '" + determination + "' is valid, but not of type 'book'!"); - } - return true; - } - return super.applyDetermination(path, determinationObj); - } - @Override public ScriptEntryData getScriptEntryData() { - return new BukkitScriptEntryData(player, null); + return new BukkitScriptEntryData(event.getPlayer()); } @Override public ObjectTag getContext(String name) { - switch (name) { - case "signing": return new ElementTag(event.isSigning()); - case "title": return event.isSigning() ? new ElementTag(event.getNewBookMeta().getTitle()) : null; - case "pages": return new ElementTag(event.getNewBookMeta().getPageCount()); - case "book": { - ItemStack book = new ItemStack(Material.WRITABLE_BOOK); + return switch (name) { + case "signing" -> new ElementTag(event.isSigning()); + case "title" -> event.isSigning() ? new ElementTag(event.getNewBookMeta().getTitle(), true) : null; + case "pages" -> new ElementTag(event.getNewBookMeta().getPageCount()); + case "book" -> { + ItemStack book = new ItemStack(event.isSigning() ? Material.WRITTEN_BOOK : Material.WRITABLE_BOOK); book.setItemMeta(event.getNewBookMeta()); - return new ItemTag(book); + yield new ItemTag(book); } - case "old_book": { + case "old_book" -> { ItemStack book = new ItemStack(Material.WRITABLE_BOOK); book.setItemMeta(event.getPreviousBookMeta()); - return new ItemTag(book); + yield new ItemTag(book); } - } - return super.getContext(name); + default -> super.getContext(name); + }; } @EventHandler public void onPlayerEditsBook(PlayerEditBookEvent event) { - player = PlayerTag.mirrorBukkitPlayer(event.getPlayer()); this.event = event; fire(event); } From f40a89a829ae3a0dd6bb6f61fff85ce1f021c1b7 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Tue, 17 Jun 2025 20:10:30 +0100 Subject: [PATCH 172/280] 1.21.6 part 1: bump versions --- README.md | 2 +- paper/pom.xml | 2 +- plugin/pom.xml | 2 +- v1_21/pom.xml | 12 ++++++------ 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 6ed59e5f36..80d063b465 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ The Denizen Scripting Language - Spigot Impl An implementation of the Denizen Scripting Language for Spigot servers, with strong Citizens interlinks to emphasize the power of using Denizen with NPCs! -**Version 1.3.1**: Compatible with Spigot 1.17.1, 1.18.2, 1.19.4, 1.20.6, and 1.21.5! +**Version 1.3.1**: Compatible with Spigot 1.17.1, 1.18.2, 1.19.4, 1.20.6, and 1.21.6! **Learn about Denizen from the Beginner's guide:** https://guide.denizenscript.com/guides/background/index.html diff --git a/paper/pom.xml b/paper/pom.xml index 0596d19965..1c726adc34 100644 --- a/paper/pom.xml +++ b/paper/pom.xml @@ -25,7 +25,7 @@ io.papermc.paper paper-api - 1.21.5-R0.1-SNAPSHOT + 1.21.6-R0.1-SNAPSHOT provided diff --git a/plugin/pom.xml b/plugin/pom.xml index 859951698d..0d1632e83b 100644 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -30,7 +30,7 @@ org.spigotmc spigot-api - 1.21.5-R0.1-SNAPSHOT + 1.21.6-R0.1-SNAPSHOT jar provided diff --git a/v1_21/pom.xml b/v1_21/pom.xml index bdfa91e164..8b040d6103 100644 --- a/v1_21/pom.xml +++ b/v1_21/pom.xml @@ -19,13 +19,13 @@ org.spigotmc spigot-api - 1.21.5-R0.1-SNAPSHOT + 1.21.6-R0.1-SNAPSHOT provided org.spigotmc spigot - 1.21.5-R0.1-SNAPSHOT + 1.21.6-R0.1-SNAPSHOT remapped-mojang provided @@ -45,9 +45,9 @@ remap-obf - org.spigotmc:minecraft-server:1.21.5-R0.1-SNAPSHOT:txt:maps-mojang + org.spigotmc:minecraft-server:1.21.6-R0.1-SNAPSHOT:txt:maps-mojang true - org.spigotmc:spigot:1.21.5-R0.1-SNAPSHOT:jar:remapped-mojang + org.spigotmc:spigot:1.21.6-R0.1-SNAPSHOT:jar:remapped-mojang true remapped-obf @@ -60,8 +60,8 @@ remap-spigot ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar - org.spigotmc:minecraft-server:1.21.5-R0.1-SNAPSHOT:csrg:maps-spigot - org.spigotmc:spigot:1.21.5-R0.1-SNAPSHOT:jar:remapped-obf + org.spigotmc:minecraft-server:1.21.6-R0.1-SNAPSHOT:csrg:maps-spigot + org.spigotmc:spigot:1.21.6-R0.1-SNAPSHOT:jar:remapped-obf From 183c7547b5c6164af5c929fdcc306901edbe7668 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Tue, 17 Jun 2025 20:12:03 +0100 Subject: [PATCH 173/280] 1.21.6 part 2: bump import revisions --- .../denizen/nms/v1_21/Handler.java | 24 +++++++++---------- .../v1_21/helpers/AdvancementHelperImpl.java | 8 +++---- .../v1_21/helpers/AnimationHelperImpl.java | 6 ++--- .../nms/v1_21/helpers/BlockHelperImpl.java | 22 ++++++++--------- .../nms/v1_21/helpers/ChunkHelperImpl.java | 4 ++-- .../v1_21/helpers/CustomEntityHelperImpl.java | 4 ++-- .../nms/v1_21/helpers/EntityHelperImpl.java | 16 ++++++------- .../nms/v1_21/helpers/FishingHelperImpl.java | 8 +++---- .../nms/v1_21/helpers/ItemHelperImpl.java | 18 +++++++------- .../nms/v1_21/helpers/PacketHelperImpl.java | 16 ++++++------- .../nms/v1_21/helpers/PlayerHelperImpl.java | 16 ++++++------- .../nms/v1_21/helpers/WorldHelperImpl.java | 2 +- .../denizen/nms/v1_21/impl/BiomeNMSImpl.java | 8 +++---- .../v1_21/impl/ImprovedOfflinePlayerImpl.java | 10 ++++---- .../nms/v1_21/impl/ProfileEditorImpl.java | 4 ++-- .../nms/v1_21/impl/blocks/BlockLightImpl.java | 4 ++-- .../impl/entities/CraftFakeArrowImpl.java | 4 ++-- .../impl/entities/CraftFakePlayerImpl.java | 4 ++-- .../entities/CraftItemProjectileImpl.java | 6 ++--- .../impl/entities/EntityFakeArrowImpl.java | 4 ++-- .../impl/entities/EntityFakePlayerImpl.java | 2 +- .../entities/EntityItemProjectileImpl.java | 2 +- .../handlers/AbstractListenerPlayInImpl.java | 2 +- .../handlers/DenizenNetworkManagerImpl.java | 6 ++--- .../handlers/DenizenPacketListenerImpl.java | 2 +- .../network/handlers/FakeBlockHelper.java | 8 +++---- .../packet/ActionBarEventPacketHandlers.java | 2 +- .../handlers/packet/AttachPacketHandlers.java | 4 ++-- .../packet/DisguisePacketHandlers.java | 2 +- .../packet/FakeEquipmentPacketHandlers.java | 2 +- .../packet/HideParticlesPacketHandlers.java | 2 +- .../network/packets/PacketOutChatImpl.java | 2 +- 32 files changed, 112 insertions(+), 112 deletions(-) diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java index f0c9da8d0b..70df0de07e 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java @@ -63,18 +63,18 @@ import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.boss.BossBar; -import org.bukkit.craftbukkit.v1_21_R4.CraftServer; -import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R4.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_21_R4.boss.CraftBossBar; -import org.bukkit.craftbukkit.v1_21_R4.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftInventory; -import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftInventoryCustom; -import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftInventoryView; -import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R4.legacy.FieldRename; -import org.bukkit.craftbukkit.v1_21_R4.persistence.CraftPersistentDataContainer; -import org.bukkit.craftbukkit.v1_21_R4.util.*; +import org.bukkit.craftbukkit.v1_21_R5.CraftServer; +import org.bukkit.craftbukkit.v1_21_R5.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R5.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_21_R5.boss.CraftBossBar; +import org.bukkit.craftbukkit.v1_21_R5.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R5.inventory.CraftInventory; +import org.bukkit.craftbukkit.v1_21_R5.inventory.CraftInventoryCustom; +import org.bukkit.craftbukkit.v1_21_R5.inventory.CraftInventoryView; +import org.bukkit.craftbukkit.v1_21_R5.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R5.legacy.FieldRename; +import org.bukkit.craftbukkit.v1_21_R5.persistence.CraftPersistentDataContainer; +import org.bukkit.craftbukkit.v1_21_R5.util.*; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java index 7b12e6a6ff..67f4c52a71 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java @@ -14,10 +14,10 @@ import net.minecraft.server.ServerAdvancementManager; import net.minecraft.server.level.ServerPlayer; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_21_R4.CraftServer; -import org.bukkit.craftbukkit.v1_21_R4.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R4.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.v1_21_R5.CraftServer; +import org.bukkit.craftbukkit.v1_21_R5.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R5.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R5.util.CraftNamespacedKey; import org.bukkit.entity.Player; import java.util.*; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AnimationHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AnimationHelperImpl.java index bbaf261e83..8b24e37e81 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AnimationHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AnimationHelperImpl.java @@ -2,9 +2,9 @@ import com.denizenscript.denizen.nms.abstracts.AnimationHelper; import net.minecraft.world.entity.Entity; -import org.bukkit.craftbukkit.v1_21_R4.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R4.entity.CraftHorse; -import org.bukkit.craftbukkit.v1_21_R4.entity.CraftPolarBear; +import org.bukkit.craftbukkit.v1_21_R5.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R5.entity.CraftHorse; +import org.bukkit.craftbukkit.v1_21_R5.entity.CraftPolarBear; import org.bukkit.entity.EntityType; import org.bukkit.entity.Horse; import org.bukkit.entity.IronGolem; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java index fac520f4af..85f68e076b 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java @@ -34,17 +34,17 @@ import org.bukkit.block.Block; import org.bukkit.block.CreatureSpawner; import org.bukkit.block.Skull; -import org.bukkit.craftbukkit.v1_21_R4.CraftChunk; -import org.bukkit.craftbukkit.v1_21_R4.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R4.block.CraftBlock; -import org.bukkit.craftbukkit.v1_21_R4.block.CraftBlockEntityState; -import org.bukkit.craftbukkit.v1_21_R4.block.CraftCreatureSpawner; -import org.bukkit.craftbukkit.v1_21_R4.block.CraftSkull; -import org.bukkit.craftbukkit.v1_21_R4.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R4.util.CraftLocation; -import org.bukkit.craftbukkit.v1_21_R4.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_21_R5.CraftChunk; +import org.bukkit.craftbukkit.v1_21_R5.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R5.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R5.block.CraftBlock; +import org.bukkit.craftbukkit.v1_21_R5.block.CraftBlockEntityState; +import org.bukkit.craftbukkit.v1_21_R5.block.CraftCreatureSpawner; +import org.bukkit.craftbukkit.v1_21_R5.block.CraftSkull; +import org.bukkit.craftbukkit.v1_21_R5.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R5.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R5.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R5.util.CraftMagicNumbers; import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ChunkHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ChunkHelperImpl.java index bca77a8ee6..79e765a6e6 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ChunkHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ChunkHelperImpl.java @@ -20,8 +20,8 @@ import net.minecraft.world.level.levelgen.Heightmap; import org.bukkit.Chunk; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_21_R4.CraftChunk; -import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R5.CraftChunk; +import org.bukkit.craftbukkit.v1_21_R5.CraftWorld; import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/CustomEntityHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/CustomEntityHelperImpl.java index ebb2becbeb..9b0aa2a05a 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/CustomEntityHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/CustomEntityHelperImpl.java @@ -20,8 +20,8 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R5.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R5.inventory.CraftItemStack; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.scoreboard.Scoreboard; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java index 52601c2dd4..d561e2e20c 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java @@ -66,14 +66,14 @@ import org.bukkit.attribute.AttributeInstance; import org.bukkit.block.CreatureSpawner; import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_21_R4.CraftServer; -import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R4.block.CraftBlock; -import org.bukkit.craftbukkit.v1_21_R4.block.CraftCreatureSpawner; -import org.bukkit.craftbukkit.v1_21_R4.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_21_R4.entity.*; -import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R4.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R5.CraftServer; +import org.bukkit.craftbukkit.v1_21_R5.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R5.block.CraftBlock; +import org.bukkit.craftbukkit.v1_21_R5.block.CraftCreatureSpawner; +import org.bukkit.craftbukkit.v1_21_R5.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_21_R5.entity.*; +import org.bukkit.craftbukkit.v1_21_R5.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R5.util.CraftLocation; import org.bukkit.entity.*; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.inventory.EquipmentSlot; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java index 17a1111dab..b5d75d105a 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/FishingHelperImpl.java @@ -18,10 +18,10 @@ import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.phys.Vec3; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R4.entity.CraftFishHook; -import org.bukkit.craftbukkit.v1_21_R4.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R5.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R5.entity.CraftFishHook; +import org.bukkit.craftbukkit.v1_21_R5.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R5.inventory.CraftItemStack; import org.bukkit.entity.FishHook; import org.bukkit.entity.Player; import org.bukkit.event.entity.CreatureSpawnEvent; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java index 06d6535cb9..850cbd803e 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java @@ -71,15 +71,15 @@ import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_21_R4.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R4.CraftServer; -import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R4.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_21_R4.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R4.inventory.*; -import org.bukkit.craftbukkit.v1_21_R4.map.CraftMapView; -import org.bukkit.craftbukkit.v1_21_R4.util.CraftMagicNumbers; -import org.bukkit.craftbukkit.v1_21_R4.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.v1_21_R5.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R5.CraftServer; +import org.bukkit.craftbukkit.v1_21_R5.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R5.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_21_R5.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R5.inventory.*; +import org.bukkit.craftbukkit.v1_21_R5.map.CraftMapView; +import org.bukkit.craftbukkit.v1_21_R5.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_21_R5.util.CraftNamespacedKey; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.inventory.*; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java index 6415ae381e..317790d307 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PacketHelperImpl.java @@ -50,14 +50,14 @@ import org.bukkit.block.Sign; import org.bukkit.block.sign.Side; import org.bukkit.block.sign.SignSide; -import org.bukkit.craftbukkit.v1_21_R4.CraftServer; -import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R4.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R4.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R4.map.CraftMapCanvas; -import org.bukkit.craftbukkit.v1_21_R4.map.CraftMapView; -import org.bukkit.craftbukkit.v1_21_R4.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R5.CraftServer; +import org.bukkit.craftbukkit.v1_21_R5.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R5.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R5.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R5.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R5.map.CraftMapCanvas; +import org.bukkit.craftbukkit.v1_21_R5.map.CraftMapView; +import org.bukkit.craftbukkit.v1_21_R5.util.CraftLocation; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java index e74cbf4f68..951203f280 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java @@ -57,14 +57,14 @@ import net.minecraft.world.phys.AABB; import org.bukkit.*; import org.bukkit.boss.BossBar; -import org.bukkit.craftbukkit.v1_21_R4.CraftServer; -import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R4.boss.CraftBossBar; -import org.bukkit.craftbukkit.v1_21_R4.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R4.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R4.util.CraftMagicNumbers; -import org.bukkit.craftbukkit.v1_21_R4.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.v1_21_R5.CraftServer; +import org.bukkit.craftbukkit.v1_21_R5.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R5.boss.CraftBossBar; +import org.bukkit.craftbukkit.v1_21_R5.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R5.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R5.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R5.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_21_R5.util.CraftNamespacedKey; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java index 3f41d972e2..0cb2efa1a7 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/WorldHelperImpl.java @@ -16,7 +16,7 @@ import net.minecraft.world.level.storage.PrimaryLevelData; import org.bukkit.Location; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R5.CraftWorld; public class WorldHelperImpl implements WorldHelper { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java index 4ae5750ca0..de7b59e599 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/BiomeNMSImpl.java @@ -20,10 +20,10 @@ import org.bukkit.Location; import org.bukkit.NamespacedKey; import org.bukkit.block.Block; -import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R4.entity.CraftEntityType; -import org.bukkit.craftbukkit.v1_21_R4.util.CraftLocation; -import org.bukkit.craftbukkit.v1_21_R4.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.v1_21_R5.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R5.entity.CraftEntityType; +import org.bukkit.craftbukkit.v1_21_R5.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R5.util.CraftNamespacedKey; import org.bukkit.entity.EntityType; import java.lang.invoke.MethodHandle; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java index 48bcde5234..e6cc173f1d 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java @@ -22,11 +22,11 @@ import net.minecraft.world.inventory.PlayerEnderChestContainer; import org.bukkit.Bukkit; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_21_R4.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R4.CraftServer; -import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftInventory; -import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftInventoryPlayer; +import org.bukkit.craftbukkit.v1_21_R5.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R5.CraftServer; +import org.bukkit.craftbukkit.v1_21_R5.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R5.inventory.CraftInventory; +import org.bukkit.craftbukkit.v1_21_R5.inventory.CraftInventoryPlayer; import org.bukkit.entity.HumanEntity; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java index 2ab19482e9..f44160c5ad 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ProfileEditorImpl.java @@ -19,8 +19,8 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_21_R4.CraftServer; -import org.bukkit.craftbukkit.v1_21_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R5.CraftServer; +import org.bukkit.craftbukkit.v1_21_R5.entity.CraftPlayer; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerRespawnEvent; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/blocks/BlockLightImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/blocks/BlockLightImpl.java index 46bfabb0c5..0565fa5845 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/blocks/BlockLightImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/blocks/BlockLightImpl.java @@ -21,8 +21,8 @@ import net.minecraft.world.level.lighting.LevelLightEngine; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R4.CraftChunk; -import org.bukkit.craftbukkit.v1_21_R4.block.CraftBlock; +import org.bukkit.craftbukkit.v1_21_R5.CraftChunk; +import org.bukkit.craftbukkit.v1_21_R5.block.CraftBlock; import org.bukkit.util.Vector; import java.lang.invoke.MethodHandle; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakeArrowImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakeArrowImpl.java index dd58b19bb1..cc8338ff35 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakeArrowImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakeArrowImpl.java @@ -2,8 +2,8 @@ import com.denizenscript.denizen.nms.interfaces.FakeArrow; import net.minecraft.world.entity.projectile.AbstractArrow; -import org.bukkit.craftbukkit.v1_21_R4.CraftServer; -import org.bukkit.craftbukkit.v1_21_R4.entity.CraftAbstractArrow; +import org.bukkit.craftbukkit.v1_21_R5.CraftServer; +import org.bukkit.craftbukkit.v1_21_R5.entity.CraftAbstractArrow; public class CraftFakeArrowImpl extends CraftAbstractArrow implements FakeArrow { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakePlayerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakePlayerImpl.java index 723d99e8f4..376e62d8e1 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakePlayerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftFakePlayerImpl.java @@ -4,8 +4,8 @@ import com.denizenscript.denizen.nms.NMSHandler; import org.bukkit.Material; import org.bukkit.block.Block; -import org.bukkit.craftbukkit.v1_21_R4.CraftServer; -import org.bukkit.craftbukkit.v1_21_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R5.CraftServer; +import org.bukkit.craftbukkit.v1_21_R5.entity.CraftPlayer; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.metadata.MetadataValue; import org.bukkit.plugin.Plugin; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftItemProjectileImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftItemProjectileImpl.java index cebab39c5c..d1d84be876 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftItemProjectileImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/CraftItemProjectileImpl.java @@ -3,9 +3,9 @@ import com.denizenscript.denizen.nms.interfaces.ItemProjectile; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; -import org.bukkit.craftbukkit.v1_21_R4.CraftServer; -import org.bukkit.craftbukkit.v1_21_R4.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R5.CraftServer; +import org.bukkit.craftbukkit.v1_21_R5.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R5.inventory.CraftItemStack; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; import org.bukkit.projectiles.ProjectileSource; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakeArrowImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakeArrowImpl.java index 0f08e5d04f..10aba52738 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakeArrowImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakeArrowImpl.java @@ -7,8 +7,8 @@ import net.minecraft.world.item.Items; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R4.CraftServer; -import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R5.CraftServer; +import org.bukkit.craftbukkit.v1_21_R5.CraftWorld; import org.bukkit.event.entity.CreatureSpawnEvent; public class EntityFakeArrowImpl extends SpectralArrow { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakePlayerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakePlayerImpl.java index cd7e94c98c..e92414a40e 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakePlayerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakePlayerImpl.java @@ -15,7 +15,7 @@ import net.minecraft.server.network.CommonListenerCookie; import net.minecraft.world.entity.player.Player; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_21_R4.CraftServer; +import org.bukkit.craftbukkit.v1_21_R5.CraftServer; import org.bukkit.event.entity.CreatureSpawnEvent; public class EntityFakePlayerImpl extends ServerPlayer { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java index 9d4776cf42..5c81b0f294 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java @@ -15,7 +15,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R4.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R5.CraftRegistry; import java.lang.invoke.MethodHandle; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java index 507a90fd48..7bbc73b499 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java @@ -28,7 +28,7 @@ import net.minecraft.world.entity.Relative; import net.minecraft.world.phys.Vec3; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R5.entity.CraftPlayer; import org.bukkit.event.player.PlayerTeleportEvent; import java.lang.reflect.Field; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java index 4917e1b4ef..7d7e8c8eec 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -31,9 +31,9 @@ import net.minecraft.util.debugchart.LocalSampleLogger; import org.bukkit.Bukkit; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_21_R4.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R5.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R5.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R5.entity.CraftPlayer; import org.bukkit.entity.Player; import javax.annotation.Nullable; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java index ba9a8b79d4..b3f3fc1ad5 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenPacketListenerImpl.java @@ -18,7 +18,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.CommonListenerCookie; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_21_R4.block.CraftBlock; +import org.bukkit.craftbukkit.v1_21_R5.block.CraftBlock; import org.bukkit.event.block.SignChangeEvent; public class DenizenPacketListenerImpl extends AbstractListenerPlayInImpl { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java index 697d008584..ff41dfa046 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/FakeBlockHelper.java @@ -23,10 +23,10 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.PalettedContainer; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_21_R4.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R4.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R4.block.CraftBlockStates; -import org.bukkit.craftbukkit.v1_21_R4.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_21_R5.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R5.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R5.block.CraftBlockStates; +import org.bukkit.craftbukkit.v1_21_R5.block.data.CraftBlockData; import java.lang.invoke.MethodHandle; import java.lang.reflect.Constructor; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/ActionBarEventPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/ActionBarEventPacketHandlers.java index c83a82bb4d..0f3ef55965 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/ActionBarEventPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/ActionBarEventPacketHandlers.java @@ -8,7 +8,7 @@ import com.denizenscript.denizencore.objects.core.ElementTag; import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundSetActionBarTextPacket; -import org.bukkit.craftbukkit.v1_21_R4.util.CraftChatMessage; +import org.bukkit.craftbukkit.v1_21_R5.util.CraftChatMessage; public class ActionBarEventPacketHandlers { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java index 8190591f32..dcea0cfffe 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/AttachPacketHandlers.java @@ -13,8 +13,8 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.PositionMoveRotation; import net.minecraft.world.phys.Vec3; -import org.bukkit.craftbukkit.v1_21_R4.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R4.util.CraftVector; +import org.bukkit.craftbukkit.v1_21_R5.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R5.util.CraftVector; import org.bukkit.util.Vector; import java.lang.reflect.Field; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java index ac1d22b47e..a281b4c20d 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/DisguisePacketHandlers.java @@ -14,7 +14,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.PositionMoveRotation; import net.minecraft.world.level.Level; -import org.bukkit.craftbukkit.v1_21_R4.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R5.entity.CraftEntity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java index ea9ad7882a..9e886625a7 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java @@ -12,7 +12,7 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; -import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R5.inventory.CraftItemStack; import java.util.ArrayList; import java.util.List; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HideParticlesPacketHandlers.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HideParticlesPacketHandlers.java index cf1c5b035e..ba98b2ef6a 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HideParticlesPacketHandlers.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/packet/HideParticlesPacketHandlers.java @@ -4,7 +4,7 @@ import com.denizenscript.denizen.utilities.packets.HideParticles; import net.minecraft.network.protocol.game.ClientboundLevelParticlesPacket; import org.bukkit.Particle; -import org.bukkit.craftbukkit.v1_21_R4.CraftParticle; +import org.bukkit.craftbukkit.v1_21_R5.CraftParticle; import java.util.Set; diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java index 5fc93ea5cd..56ec98bb64 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/packets/PacketOutChatImpl.java @@ -5,7 +5,7 @@ import net.md_5.bungee.chat.ComponentSerializer; import net.minecraft.network.protocol.game.ClientboundPlayerChatPacket; import net.minecraft.network.protocol.game.ClientboundSystemChatPacket; -import org.bukkit.craftbukkit.v1_21_R4.util.CraftChatMessage; +import org.bukkit.craftbukkit.v1_21_R5.util.CraftChatMessage; public class PacketOutChatImpl extends PacketOutChat { From 21ae2bf8c04d7c165c3451cb7b59da1fde4c50e8 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Tue, 17 Jun 2025 20:13:58 +0100 Subject: [PATCH 174/280] 1.21.6 part 3: update reflection mappings --- .../nms/v1_21/ReflectionMappingsInfo.java | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java index d99843b208..de35998c20 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java @@ -12,28 +12,28 @@ public class ReflectionMappingsInfo { public static String MappedRegistry_unregisteredIntrusiveHolders = "m"; // net.minecraft.world.entity.Entity - public static String Entity_onGround = "aH"; - public static String Entity_DATA_SHARED_FLAGS_ID = "am"; - public static String Entity_DATA_CUSTOM_NAME = "aR"; - public static String Entity_DATA_CUSTOM_NAME_VISIBLE = "aS"; + public static String Entity_onGround = "bb"; + public static String Entity_DATA_SHARED_FLAGS_ID = "az"; + public static String Entity_DATA_CUSTOM_NAME = "bl"; + public static String Entity_DATA_CUSTOM_NAME_VISIBLE = "bm"; // net.minecraft.world.entity.LivingEntity - public static String LivingEntity_attackStrengthTicker = "aS"; - public static String LivingEntity_autoSpinAttackTicks = "bp"; + public static String LivingEntity_attackStrengthTicker = "bo"; + public static String LivingEntity_autoSpinAttackTicks = "bL"; public static String LivingEntity_setLivingEntityFlag_method = "c"; // net.minecraft.world.entity.player.Player - public static String Player_DATA_PLAYER_ABSORPTION_ID = "c"; - public static String Player_DATA_PLAYER_MODE_CUSTOMISATION = "bK"; + public static String Player_DATA_PLAYER_ABSORPTION_ID = "d"; + public static String Player_DATA_PLAYER_MODE_CUSTOMISATION = "cg"; // net.minecraft.server.level.ServerPlayer - public static String ServerPlayer_respawnConfig = "dc"; + public static String ServerPlayer_respawnConfig = "dA"; // net.minecraft.world.entity.monster.EnderMan - public static String EnderMan_DATA_CREEPY = "bJ"; + public static String EnderMan_DATA_CREEPY = "cl"; // net.minecraft.world.entity.monster.Zombie - public static String Zombie_inWaterTime = "bY"; + public static String Zombie_inWaterTime = "cA"; // net.minecraft.world.item.Item public static String Item_components = "c"; @@ -104,9 +104,9 @@ public class ReflectionMappingsInfo { public static String SynchedEntityData_itemsById = "e"; // net.minecraft.world.entity.projectile.FishingHook - public static String FishingHook_nibble = "i"; - public static String FishingHook_timeUntilLured = "j"; - public static String FishingHook_timeUntilHooked = "k"; + public static String FishingHook_nibble = "j"; + public static String FishingHook_timeUntilLured = "k"; + public static String FishingHook_timeUntilHooked = "l"; // net.minecraft.tags.TagNetworkSerialization$NetworkPayload public static String TagNetworkSerializationNetworkPayload_tags = "b"; @@ -118,12 +118,11 @@ public class ReflectionMappingsInfo { public static String HolderReference_bindTags_method = "a"; // net.minecraft.server.level.ServerLevel - public static String ServerLevel_sleepStatus = "Q"; + public static String ServerLevel_sleepStatus = "R"; // net.minecraft.world.item.AdventureModePredicate - public static String AdventureModePredicate_predicates = "f"; + public static String AdventureModePredicate_predicates = "g"; // net.minecraft.stats.ServerRecipeBook public static String ServerRecipeBook_addHighlight_method = "e"; - } From 52f9019fb8adf4a8244885766e267fa8074a21c8 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Tue, 17 Jun 2025 20:14:33 +0100 Subject: [PATCH 175/280] 1.21.6 part 4: update mappings check --- .../main/java/com/denizenscript/denizen/nms/v1_21/Handler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java index 70df0de07e..d65364d5a4 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java @@ -143,7 +143,7 @@ public void undisableAsyncCatcher() { @Override public boolean isCorrectMappingsCode() { - return CraftMagicNumbers.INSTANCE.getMappingsVersion().equals("7ecad754373a5fbc43d381d7450c53a5"); + return CraftMagicNumbers.INSTANCE.getMappingsVersion().equals("164f8e872cb3dff744982fca079642b2"); } @Override From 711529cdf60c422e0eb1c3797222b4a8af441890 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Wed, 18 Jun 2025 01:25:48 +0100 Subject: [PATCH 176/280] 1.21.6 part 5: Initial code updates --- .../denizen/nms/v1_21/Handler.java | 47 +++++++++++++++++++ .../v1_21/helpers/AnimationHelperImpl.java | 5 +- .../nms/v1_21/helpers/BlockHelperImpl.java | 12 ++--- .../nms/v1_21/helpers/EntityHelperImpl.java | 16 +++---- .../nms/v1_21/helpers/ItemHelperImpl.java | 17 +++++-- .../nms/v1_21/helpers/PlayerHelperImpl.java | 2 +- .../v1_21/impl/ImprovedOfflinePlayerImpl.java | 32 ++++++------- .../impl/entities/EntityFakePlayerImpl.java | 7 ++- .../entities/EntityItemProjectileImpl.java | 22 +++++---- .../handlers/AbstractListenerPlayInImpl.java | 35 ++++++++++++-- .../handlers/DenizenNetworkManagerImpl.java | 11 +++-- 11 files changed, 144 insertions(+), 62 deletions(-) diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java index d65364d5a4..f45890aabb 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java @@ -36,6 +36,7 @@ import com.mojang.authlib.properties.Property; import com.mojang.authlib.yggdrasil.ProfileResult; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.serialization.DynamicOps; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.BaseComponent; import net.minecraft.core.BlockPos; @@ -43,12 +44,14 @@ import net.minecraft.core.Rotations; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.ByteArrayTag; +import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.StringTag; import net.minecraft.nbt.TagParser; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.ProblemReporter; import net.minecraft.world.BossEvent; import net.minecraft.world.Container; import net.minecraft.world.Nameable; @@ -57,12 +60,17 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.TagValueInput; +import net.minecraft.world.level.storage.TagValueOutput; +import net.minecraft.world.level.storage.ValueInput; +import net.minecraft.world.level.storage.ValueOutput; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.NamespacedKey; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.boss.BossBar; +import org.bukkit.craftbukkit.v1_21_R5.CraftRegistry; import org.bukkit.craftbukkit.v1_21_R5.CraftServer; import org.bukkit.craftbukkit.v1_21_R5.CraftWorld; import org.bukkit.craftbukkit.v1_21_R5.block.data.CraftBlockData; @@ -90,6 +98,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.function.Consumer; import java.util.function.Function; public class Handler extends NMSHandler { @@ -387,6 +396,44 @@ public static Component componentToNMS(BaseComponent[] spigot) { return CraftChatMessage.fromJSONOrNull(FormattedTextHelper.componentToJson(spigot)); } + public static final MethodHandle TAG_VALUE_OUTPUT_CONSTRUCTOR = ReflectionHelper.getConstructor(TagValueOutput.class, ProblemReporter.class, DynamicOps.class, net.minecraft.nbt.CompoundTag.class); + + public static net.minecraft.nbt.CompoundTag useValueOutput(Consumer handler) { + ProblemReporter.Collector nmsProblemReporter = new ProblemReporter.Collector(); + TagValueOutput nmsValueOutput = TagValueOutput.createWithContext(nmsProblemReporter, CraftRegistry.getMinecraftRegistry()); + handler.accept(nmsValueOutput); + handleProblems(nmsProblemReporter); + return nmsValueOutput.buildResult(); + } + + public static net.minecraft.nbt.CompoundTag useValueOutput(net.minecraft.nbt.CompoundTag nmsExistingValue, Consumer handler) { + ProblemReporter.Collector nmsProblemReporter = new ProblemReporter.Collector(); + TagValueOutput nmsValueOutput; + try { + nmsValueOutput = (TagValueOutput) TAG_VALUE_OUTPUT_CONSTRUCTOR.invoke(nmsProblemReporter, CraftRegistry.getMinecraftRegistry().createSerializationContext(NbtOps.INSTANCE), nmsExistingValue); + } + catch (Throwable e) { + Debug.echoError(e); + return nmsExistingValue; + } + handler.accept(nmsValueOutput); + handleProblems(nmsProblemReporter); + return nmsValueOutput.buildResult(); + } + + public static void useValueInput(net.minecraft.nbt.CompoundTag nmsTag, Consumer handler) { + ProblemReporter.Collector nmsProblemReporter = new ProblemReporter.Collector(); + ValueInput nmsValueInput = TagValueInput.create(nmsProblemReporter, CraftRegistry.getMinecraftRegistry(), nmsTag); + handler.accept(nmsValueInput); + handleProblems(nmsProblemReporter); + } + + private static void handleProblems(ProblemReporter.Collector nmsProblemReporter) { + if (!nmsProblemReporter.isEmpty()) { + Debug.echoError(nmsProblemReporter.getTreeReport()); + } + } + @Override public String updateLegacyName(Class type, String legacyName) { return FieldRename.rename(ApiVersion.FIELD_NAME_PARITY, DebugInternals.getFullClassNameOpti(type).replace('.', '/'), legacyName); diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AnimationHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AnimationHelperImpl.java index 8b24e37e81..a59f65bee6 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AnimationHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AnimationHelperImpl.java @@ -22,14 +22,15 @@ public AnimationHelperImpl() { ((CraftPolarBear) entity).getHandle().setStanding(false); } }); + // TODO: 1.21.6: this is a tick duration now, should become a mechanism register("HORSE_START_STANDING", entity -> { if (entity instanceof Horse) { - ((CraftHorse) entity).getHandle().setStanding(true); + ((CraftHorse) entity).getHandle().setStanding(Integer.MAX_VALUE); } }); register("HORSE_STOP_STANDING", entity -> { if (entity instanceof Horse) { - ((CraftHorse) entity).getHandle().setStanding(false); + ((CraftHorse) entity).getHandle().clearStanding(); } }); register("HORSE_BUCK", entity -> { diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java index 85f68e076b..9d9e3666e4 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/BlockHelperImpl.java @@ -4,6 +4,7 @@ import com.denizenscript.denizen.nms.util.PlayerProfile; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; import com.denizenscript.denizen.nms.util.jnbt.CompoundTagBuilder; +import com.denizenscript.denizen.nms.v1_21.Handler; import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; import com.denizenscript.denizen.nms.v1_21.impl.ProfileEditorImpl; import com.denizenscript.denizen.nms.v1_21.impl.jnbt.CompoundTagImpl; @@ -120,7 +121,7 @@ public void setNbtData(Block block, CompoundTag ctag) { ctag = builder.build(); BlockPos blockPos = new BlockPos(block.getX(), block.getY(), block.getZ()); BlockEntity te = ((CraftWorld) block.getWorld()).getHandle().getBlockEntity(blockPos, true); - te.loadWithComponents(((CompoundTagImpl) ctag).toNMSTag(), CraftRegistry.getMinecraftRegistry()); + Handler.useValueInput(((CompoundTagImpl) ctag).toNMSTag(), te::loadWithComponents); } @Override @@ -214,6 +215,7 @@ public void setSpawnerSpawnedType(CreatureSpawner spawner, EntityTag entity) { } try { // Wrangle a fake entity + // TODO: 1.21.6: seems to have a bug where the "Pos" value being set prevents it from spawning? org.bukkit.entity.Entity bukkitEntity = ((CraftWorld) spawner.getWorld()).createEntity(spawner.getLocation(), entity.getBukkitEntityType().getEntityClass()); Entity nmsEntity = ((CraftEntity) bukkitEntity).getHandle(); EntityTag entityTag = new EntityTag(bukkitEntity); @@ -224,12 +226,8 @@ public void setSpawnerSpawnedType(CreatureSpawner spawner, EntityTag entity) { } nmsEntity.unsetRemoved(); // Store it into the spawner - CraftCreatureSpawner bukkitSpawner = (CraftCreatureSpawner) spawner; - SpawnerBlockEntity nmsSnapshot = (SpawnerBlockEntity) craftBlockEntityState_snapshot.get(bukkitSpawner); - BaseSpawner nmsSpawner = nmsSnapshot.getSpawner(); - SpawnData toSpawn = nmsSpawner.nextSpawnData; - net.minecraft.nbt.CompoundTag tag = toSpawn.getEntityToSpawn(); - nmsEntity.saveWithoutId(tag); + SpawnerBlockEntity nmsSnapshot = (SpawnerBlockEntity) craftBlockEntityState_snapshot.get(spawner); + Handler.useValueOutput(nmsSnapshot.getSpawner().nextSpawnData.getEntityToSpawn(), nmsEntity::saveWithoutId); } catch (Throwable ex) { Debug.echoError(ex); diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java index d561e2e20c..4e56f41f88 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/EntityHelperImpl.java @@ -4,6 +4,7 @@ import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.interfaces.EntityHelper; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; +import com.denizenscript.denizen.nms.v1_21.Handler; import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; import com.denizenscript.denizen.nms.v1_21.impl.jnbt.CompoundTagImpl; import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; @@ -174,14 +175,13 @@ public void forceInteraction(Player player, Location location) { @Override public CompoundTag getNbtData(Entity entity) { - net.minecraft.nbt.CompoundTag compound = new net.minecraft.nbt.CompoundTag(); - ((CraftEntity) entity).getHandle().saveAsPassenger(compound); - return CompoundTagImpl.fromNMSTag(compound); + net.minecraft.nbt.CompoundTag nmsTag = Handler.useValueOutput(((CraftEntity) entity).getHandle()::saveAsPassenger); + return CompoundTagImpl.fromNMSTag(nmsTag); } @Override public void setNbtData(Entity entity, CompoundTag compoundTag) { - ((CraftEntity) entity).getHandle().load(((CompoundTagImpl) compoundTag).toNMSTag()); + Handler.useValueInput(((CompoundTagImpl) compoundTag).toNMSTag(), ((CraftEntity) entity).getHandle()::load); } /* @@ -371,7 +371,7 @@ public void sendHidePacket(Player pl, Entity entity) { } ServerPlayer nmsPlayer = ((CraftPlayer) pl).getHandle(); if (nmsPlayer.connection != null && !pl.equals(entity)) { - ChunkMap.TrackedEntity entry = nmsPlayer.serverLevel().getChunkSource().chunkMap.entityMap.get(entity.getEntityId()); + ChunkMap.TrackedEntity entry = nmsPlayer.level().getChunkSource().chunkMap.entityMap.get(entity.getEntityId()); if (entry != null) { entry.removePlayer(nmsPlayer); } @@ -389,7 +389,7 @@ public void sendShowPacket(Player pl, Entity entity) { } ServerPlayer nmsPlayer = ((CraftPlayer) pl).getHandle(); if (nmsPlayer.connection != null && !pl.equals(entity)) { - ChunkMap.TrackedEntity entry = nmsPlayer.serverLevel().getChunkSource().chunkMap.entityMap.get(entity.getEntityId()); + ChunkMap.TrackedEntity entry = nmsPlayer.level().getChunkSource().chunkMap.entityMap.get(entity.getEntityId()); if (entry != null) { entry.removePlayer(nmsPlayer); entry.updatePlayer(nmsPlayer); @@ -826,7 +826,7 @@ public void openHorseInventory(Player player, AbstractHorse horse) { } private net.minecraft.nbt.CompoundTag getRawEntityNBT(net.minecraft.world.entity.Entity entity) { - return entity.saveWithoutId(new net.minecraft.nbt.CompoundTag()); + return Handler.useValueOutput(entity::saveWithoutId); } @Override @@ -840,7 +840,7 @@ public void modifyRawNBT(Entity entity, CompoundTag tag) { net.minecraft.nbt.CompoundTag nmsTag = ((CompoundTagImpl) tag).toNMSTag(); net.minecraft.nbt.CompoundTag nmsMergedTag = getRawEntityNBT(nmsEntity).merge(nmsTag); UUID uuid = nmsEntity.getUUID(); - nmsEntity.load(nmsMergedTag); + Handler.useValueInput(nmsMergedTag, nmsEntity::load); nmsEntity.setUUID(uuid); } } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java index 850cbd803e..43b63bee8d 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/ItemHelperImpl.java @@ -120,6 +120,14 @@ public static RecipeManager getRecipeManager() { return ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager(); } + public static net.minecraft.nbt.CompoundTag serializeNmsItem(net.minecraft.world.item.ItemStack nmsItem) { + return (net.minecraft.nbt.CompoundTag) net.minecraft.world.item.ItemStack.CODEC.encodeStart(CraftRegistry.getMinecraftRegistry().createSerializationContext(NbtOps.INSTANCE), nmsItem).getOrThrow(); + } + + public static net.minecraft.world.item.ItemStack parseNmsItem(net.minecraft.nbt.CompoundTag nmsTag) { + return net.minecraft.world.item.ItemStack.CODEC.parse(CraftRegistry.getMinecraftRegistry().createSerializationContext(NbtOps.INSTANCE), nmsTag).getOrThrow(); + } + public Object recipeManagerFeatureFlagSetCache = null; @Override @@ -368,7 +376,7 @@ public ItemStack addNbtData(ItemStack itemStack, String key, Tag value) { public CompoundTag getNbtData(ItemStack itemStack) { net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(itemStack); if (nmsItemStack != null && !nmsItemStack.isEmpty()) { - return CompoundTagImpl.fromNMSTag((net.minecraft.nbt.CompoundTag) nmsItemStack.save(CraftRegistry.getMinecraftRegistry())); + return CompoundTagImpl.fromNMSTag(serializeNmsItem(nmsItemStack)); } return new CompoundTagImpl(new HashMap<>()); } @@ -376,8 +384,7 @@ public CompoundTag getNbtData(ItemStack itemStack) { // TODO: 1.20.6: same as getNbtData, ideally needs to only set custom NBT data and have specialized methods for other usages @Override public ItemStack setNbtData(ItemStack itemStack, CompoundTag compoundTag) { - net.minecraft.world.item.ItemStack nmsItemStack = net.minecraft.world.item.ItemStack.parse(CraftRegistry.getMinecraftRegistry(), ((CompoundTagImpl) compoundTag).toNMSTag()).orElse(net.minecraft.world.item.ItemStack.EMPTY); - return CraftItemStack.asBukkitCopy(nmsItemStack); + return CraftItemStack.asBukkitCopy(parseNmsItem(((CompoundTagImpl) compoundTag).toNMSTag())); } @Override @@ -408,9 +415,9 @@ public ItemStack setPartialOldNbt(ItemStack item, CompoundTag oldTag) { nmsOldTag.putByte("Count", (byte) item.getAmount()); nmsOldTag.put("tag", ((CompoundTagImpl) oldTag).toNMSTag()); net.minecraft.nbt.CompoundTag nmsUpdatedTag = (net.minecraft.nbt.CompoundTag) MinecraftServer.getServer().fixerUpper.update(References.ITEM_STACK, new Dynamic<>(NbtOps.INSTANCE, nmsOldTag), DATA_VERSION_1_20_4, currentDataVersion).getValue(); - net.minecraft.nbt.CompoundTag nmsCurrentTag = (net.minecraft.nbt.CompoundTag) CraftItemStack.asNMSCopy(item).save(CraftRegistry.getMinecraftRegistry()); + net.minecraft.nbt.CompoundTag nmsCurrentTag = serializeNmsItem(CraftItemStack.asNMSCopy(item)); net.minecraft.nbt.CompoundTag nmsMergedTag = nmsCurrentTag.merge(nmsUpdatedTag); - return CraftItemStack.asBukkitCopy(net.minecraft.world.item.ItemStack.parse(CraftRegistry.getMinecraftRegistry(), nmsMergedTag).orElseThrow()); + return CraftItemStack.asBukkitCopy(parseNmsItem(nmsMergedTag)); } @Override diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java index 951203f280..d59ddbe0c0 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/PlayerHelperImpl.java @@ -94,7 +94,7 @@ public void stopSound(Player player, NamespacedKey sound, SoundCategory category @Override public void deTrackEntity(Player player, Entity entity) { ServerPlayer nmsPlayer = ((CraftPlayer) player).getHandle(); - ChunkMap.TrackedEntity tracker = nmsPlayer.serverLevel().getChunkSource().chunkMap.entityMap.get(entity.getEntityId()); + ChunkMap.TrackedEntity tracker = nmsPlayer.level().getChunkSource().chunkMap.entityMap.get(entity.getEntityId()); if (tracker == null) { if (NMSHandler.debugPackets) { DenizenNetworkManagerImpl.doPacketOutput("Failed to de-track entity " + entity.getEntityId() + " for " + player.getName() + ": tracker null"); diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java index e6cc173f1d..eb960dd3b4 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/ImprovedOfflinePlayerImpl.java @@ -2,16 +2,17 @@ import com.denizenscript.denizen.nms.abstracts.ImprovedOfflinePlayer; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; +import com.denizenscript.denizen.nms.v1_21.Handler; import com.denizenscript.denizen.nms.v1_21.impl.jnbt.CompoundTagImpl; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.mojang.authlib.GameProfile; -import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NbtAccounter; import net.minecraft.nbt.NbtIo; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ClientInformation; import net.minecraft.server.level.ParticleStatus; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.ItemStackWithSlot; import net.minecraft.world.entity.EntityEquipment; import net.minecraft.world.entity.HumanoidArm; import net.minecraft.world.entity.ai.attributes.AttributeInstance; @@ -20,9 +21,9 @@ import net.minecraft.world.entity.ai.attributes.DefaultAttributes; import net.minecraft.world.entity.player.ChatVisiblity; import net.minecraft.world.inventory.PlayerEnderChestContainer; +import net.minecraft.world.level.storage.ValueOutput; import org.bukkit.Bukkit; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_21_R5.CraftRegistry; import org.bukkit.craftbukkit.v1_21_R5.CraftServer; import org.bukkit.craftbukkit.v1_21_R5.CraftWorld; import org.bukkit.craftbukkit.v1_21_R5.inventory.CraftInventory; @@ -35,6 +36,7 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.UUID; +import java.util.function.Consumer; public class ImprovedOfflinePlayerImpl extends ImprovedOfflinePlayer { @@ -79,11 +81,16 @@ public static ServerPlayer getFakeNmsPlayer() { return fakeNmsPlayer; } + public void editData(Consumer editor) { + this.compound = CompoundTagImpl.fromNMSTag(Handler.useValueOutput(((CompoundTagImpl) this.compound).toNMSTag(), editor)); + markModified(); + } + @Override public org.bukkit.inventory.PlayerInventory getInventory() { if (inventory == null) { net.minecraft.world.entity.player.Inventory newInv = new OfflinePlayerInventory(getFakeNmsPlayer()); - newInv.load(((CompoundTagImpl) this.compound).toNMSTag().getList("Inventory").orElseGet(ListTag::new)); + Handler.useValueInput(((CompoundTagImpl) this.compound).toNMSTag(), valueInput -> newInv.load(valueInput.listOrEmpty("Inventory", ItemStackWithSlot.CODEC))); inventory = new OfflineCraftInventoryPlayer(newInv); } return inventory; @@ -92,17 +99,14 @@ public org.bukkit.inventory.PlayerInventory getInventory() { @Override public void setInventory(org.bukkit.inventory.PlayerInventory inventory) { CraftInventoryPlayer inv = (CraftInventoryPlayer) inventory; - net.minecraft.nbt.CompoundTag nbtTagCompound = ((CompoundTagImpl) compound).toNMSTag(); - nbtTagCompound.put("Inventory", inv.getInventory().save(new ListTag())); - this.compound = CompoundTagImpl.fromNMSTag(nbtTagCompound); - markModified(); + editData(valueOutput -> inv.getInventory().save(valueOutput.list("Inventory", ItemStackWithSlot.CODEC))); } @Override public Inventory getEnderChest() { if (enderchest == null) { PlayerEnderChestContainer endchest = new PlayerEnderChestContainer(null); - endchest.fromTag(((CompoundTagImpl) this.compound).toNMSTag().getList("EnderItems").orElseGet(ListTag::new), CraftRegistry.getMinecraftRegistry()); + Handler.useValueInput(((CompoundTagImpl) this.compound).toNMSTag(), valueInput -> endchest.fromSlots(valueInput.listOrEmpty("EnderItems", ItemStackWithSlot.CODEC))); enderchest = new CraftInventory(endchest); } return enderchest; @@ -110,10 +114,7 @@ public Inventory getEnderChest() { @Override public void setEnderChest(Inventory inventory) { - net.minecraft.nbt.CompoundTag nbtTagCompound = ((CompoundTagImpl) compound).toNMSTag(); - nbtTagCompound.put("EnderItems", ((PlayerEnderChestContainer) ((CraftInventory) inventory).getInventory()).createTag(CraftRegistry.getMinecraftRegistry())); - this.compound = CompoundTagImpl.fromNMSTag(nbtTagCompound); - markModified(); + editData(valueOutput -> ((PlayerEnderChestContainer) ((CraftInventory) inventory).getInventory()).storeAsSlots(valueOutput.list("EnderItems", ItemStackWithSlot.CODEC))); } @Override @@ -132,15 +133,12 @@ public void setMaxHealth(double input) { private AttributeMap getAttributes() { AttributeMap amb = new AttributeMap(DefaultAttributes.getSupplier(net.minecraft.world.entity.EntityType.PLAYER)); - amb.load(((CompoundTagImpl) this.compound).toNMSTag().getList("Attributes").orElseGet(ListTag::new)); + Handler.useValueInput(((CompoundTagImpl) this.compound).toNMSTag(), valueInput -> valueInput.read("attributes", AttributeInstance.Packed.LIST_CODEC).ifPresent(amb::apply)); return amb; } public void setAttributes(AttributeMap attributes) { - net.minecraft.nbt.CompoundTag nbtTagCompound = ((CompoundTagImpl) compound).toNMSTag(); - nbtTagCompound.put("Attributes", attributes.save()); - this.compound = CompoundTagImpl.fromNMSTag(nbtTagCompound); - markModified(); + editData(valueOutput -> valueOutput.store("attributes", AttributeInstance.Packed.LIST_CODEC, attributes.pack())); } @Override diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakePlayerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakePlayerImpl.java index e92414a40e..9cdf134882 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakePlayerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityFakePlayerImpl.java @@ -4,14 +4,13 @@ import com.denizenscript.denizen.nms.v1_21.impl.network.fakes.FakeNetworkManagerImpl; import com.denizenscript.denizen.nms.v1_21.impl.network.fakes.FakePlayerConnectionImpl; import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; -import com.mojang.authlib.GameProfile; import com.denizenscript.denizencore.utilities.debugging.Debug; -import net.minecraft.network.Connection; +import com.mojang.authlib.GameProfile; import net.minecraft.network.protocol.PacketFlow; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ClientInformation; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.CommonListenerCookie; import net.minecraft.world.entity.player.Player; import org.bukkit.Bukkit; @@ -24,7 +23,7 @@ public EntityFakePlayerImpl(MinecraftServer minecraftserver, ServerLevel worldse super(minecraftserver, worldserver, gameprofile, clientInfo); try { Handler.ENTITY_BUKKITYENTITY.set(this, new CraftFakePlayerImpl((CraftServer) Bukkit.getServer(), this)); - Connection networkManager = new FakeNetworkManagerImpl(PacketFlow.CLIENTBOUND); + net.minecraft.network.Connection networkManager = new FakeNetworkManagerImpl(PacketFlow.CLIENTBOUND); connection = new FakePlayerConnectionImpl(minecraftserver, networkManager, this, new CommonListenerCookie(gameprofile, 0, clientInfo, false)); DenizenNetworkManagerImpl.Connection_packetListener.set(networkManager, connection); } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java index 5c81b0f294..21373b58c0 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/entities/EntityItemProjectileImpl.java @@ -4,7 +4,6 @@ import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.google.common.base.Preconditions; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.level.ServerLevel; @@ -13,9 +12,10 @@ import net.minecraft.world.entity.projectile.ThrowableProjectile; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraft.world.level.storage.ValueInput; +import net.minecraft.world.level.storage.ValueOutput; import net.minecraft.world.phys.BlockHitResult; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R5.CraftRegistry; import java.lang.invoke.MethodHandle; @@ -79,22 +79,24 @@ public void onSyncedDataUpdated(EntityDataAccessor datawatcherobject) { } @Override - public boolean save(net.minecraft.nbt.CompoundTag nbttagcompound) { + public boolean save(ValueOutput nmsValueOutput) { if (!this.getItemStack().isEmpty()) { - nbttagcompound.put("Item", this.getItemStack().save(CraftRegistry.getMinecraftRegistry())); + nmsValueOutput.store("Item", ItemStack.CODEC, this.getItemStack()); } - super.save(nbttagcompound); + super.save(nmsValueOutput); return true; } @Override - public void load(net.minecraft.nbt.CompoundTag nbttagcompound) { - net.minecraft.nbt.CompoundTag nbttagcompound1 = nbttagcompound.getCompound("Item").orElseGet(CompoundTag::new); - this.setItemStack(ItemStack.parse(CraftRegistry.getMinecraftRegistry(), nbttagcompound1).orElse(ItemStack.EMPTY)); - if (this.getItemStack().isEmpty()) { + public void load(ValueInput nmsValueInput) { + ItemStack nmsItemStack = nmsValueInput.read("Item", ItemStack.CODEC).orElse(ItemStack.EMPTY); + if (nmsItemStack.isEmpty()) { this.remove(RemovalReason.KILLED); } - super.load(nbttagcompound); + else { + this.setItemStack(nmsItemStack); + } + super.load(nmsValueInput); } @Override diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java index 7bbc73b499..cf63b9e861 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/AbstractListenerPlayInImpl.java @@ -6,18 +6,19 @@ import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.mojang.authlib.GameProfile; +import io.netty.channel.ChannelFutureListener; import net.minecraft.CrashReport; import net.minecraft.CrashReportCategory; import net.minecraft.ReportedException; import net.minecraft.network.ConnectionProtocol; import net.minecraft.network.DisconnectionDetails; -import net.minecraft.network.PacketSendListener; import net.minecraft.network.chat.ChatType; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.PlayerChatMessage; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.PacketFlow; import net.minecraft.network.protocol.common.*; +import net.minecraft.network.protocol.cookie.ServerboundCookieResponsePacket; import net.minecraft.network.protocol.game.*; import net.minecraft.network.protocol.ping.ServerboundPingRequestPacket; import net.minecraft.server.MinecraftServer; @@ -59,6 +60,16 @@ public void disconnect(Component ichatbasecomponent) { oldListener.disconnect(ichatbasecomponent); } + @Override + public void disconnect(DisconnectionDetails disconnectiondetails) { + oldListener.disconnect(disconnectiondetails); + } + + @Override + public void kickPlayer(Component reason) { + oldListener.kickPlayer(reason); + } + @Override public void teleport(double d0, double d1, double d2, float f, float f1) { oldListener.teleport(d0, d1, d2, f, f1); @@ -150,8 +161,8 @@ public void send(Packet packet) { } @Override - public void send(Packet packet, PacketSendListener listener) { - oldListener.send(packet, listener); + public void send(Packet packet, ChannelFutureListener channelfuturelistener) { + oldListener.send(packet, channelfuturelistener); } public static Field AWAITING_POS_FIELD = ReflectionHelper.getFields(ServerGamePacketListenerImpl.class).get(ReflectionMappingsInfo.ServerGamePacketListenerImpl_awaitingPositionFromClient, Vec3.class); @@ -606,6 +617,24 @@ public void handleSignedChatCommand(ServerboundChatCommandSignedPacket packet) { oldListener.handleSignedChatCommand(packet); } + @Override + public void handleChangeGameMode(ServerboundChangeGameModePacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleChangeGameMode(packet); + } + + @Override + public void handleCustomClickAction(ServerboundCustomClickActionPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleCustomClickAction(packet); + } + + @Override + public void handleCookieResponse(ServerboundCookieResponsePacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleCookieResponse(packet); + } + @Override public ServerPlayer getPlayer() { return oldListener.getPlayer(); diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java index 7d7e8c8eec..bcde3c8c85 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -11,6 +11,7 @@ import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPipeline; import net.minecraft.network.*; @@ -298,12 +299,12 @@ else if (packet instanceof ClientboundPlayerInfoUpdatePacket) { } @Override - public void send(Packet packet, PacketSendListener genericfuturelistener) { - send(packet, genericfuturelistener, true); + public void send(Packet packet, ChannelFutureListener channelFutureListener) { + send(packet, channelFutureListener, true); } @Override - public void send(Packet packet, @Nullable PacketSendListener genericfuturelistener, boolean flush) { + public void send(Packet packet, @Nullable ChannelFutureListener channelFutureListener, boolean flush) { if (!Bukkit.isPrimaryThread()) { if (Settings.cache_warnOnAsyncPackets && !(packet instanceof ClientboundSystemChatPacket) && !(packet instanceof ClientboundPlayerChatPacket) // Vanilla supports an async chat system, though it's normally disabled, some plugins use this as justification for sending messages async @@ -317,7 +318,7 @@ public void send(Packet packet, @Nullable PacketSendListener genericfuturelis Debug.echoError(ex); } } - oldManager.send(packet, genericfuturelistener, flush); + oldManager.send(packet, channelFutureListener, flush); return; } if (NMSHandler.debugPackets) { @@ -350,7 +351,7 @@ public void send(Packet packet, @Nullable PacketSendListener genericfuturelis } packet = processed; } - oldManager.send(packet, genericfuturelistener, flush); + oldManager.send(packet, channelFutureListener, flush); } @Override From 03091bdd2211e31a669242326620eba7db95bf13 Mon Sep 17 00:00:00 2001 From: hyper <39167664+heypr@users.noreply.github.com> Date: Sun, 22 Jun 2025 23:04:13 -0400 Subject: [PATCH 177/280] Merge pull request #2659 from heypr/modernization-1 Modernized WorldTag --- .../denizen/objects/WorldTag.java | 301 +++++++++++------- .../utilities/BukkitImplDeprecations.java | 3 + 2 files changed, 187 insertions(+), 117 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/WorldTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/WorldTag.java index fd5ec4eeca..1106a9a84c 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/WorldTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/WorldTag.java @@ -4,6 +4,7 @@ import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.nms.abstracts.BiomeNMS; +import com.denizenscript.denizen.utilities.BukkitImplDeprecations; import com.denizenscript.denizen.utilities.flags.WorldFlagHandler; import com.denizenscript.denizencore.flags.AbstractFlagTracker; import com.denizenscript.denizencore.flags.FlaggableObject; @@ -613,9 +614,11 @@ public static void register() { // @attribute // @returns DurationTag // @description - // Returns the relative in-game time of this world as a duration. + // Deprecated in favor of <@link tag WorldTag.time_duration> + // @deprecated Use <@link tag WorldTag.time_duration> instead. // --> if (attribute.startsWith("duration", 2)) { + BukkitImplDeprecations.timeSubTags.warn(attribute.context); attribute.fulfill(1); return new DurationTag(object.getWorld().getTime()); } @@ -624,9 +627,11 @@ public static void register() { // @attribute // @returns DurationTag // @description - // Returns the in-game time of this world. + // Deprecated in favor of <@link tag WorldTag.time_full> + // @deprecated Use <@link tag WorldTag.time_full> instead. // --> else if (attribute.startsWith("full", 2)) { + BukkitImplDeprecations.timeSubTags.warn(attribute.context); attribute.fulfill(1); return new DurationTag(object.getWorld().getFullTime()); } @@ -635,9 +640,11 @@ else if (attribute.startsWith("full", 2)) { // @attribute // @returns ElementTag // @description - // Returns the time as 'day', 'night', 'dawn', or 'dusk'. + // Deprecated in favor of <@link tag WorldTag.time_period> + // @deprecated Use <@link tag WorldTag.time_period> instead. // --> else if (attribute.startsWith("period", 2)) { + BukkitImplDeprecations.timeSubTags.warn(attribute.context); attribute.fulfill(1); long time = object.getWorld().getTime(); @@ -663,6 +670,51 @@ else if (time >= 12500) { } }); + // <--[tag] + // @attribute + // @returns DurationTag + // @description + // Returns the relative in-game time of this world as a duration. + // --> + registerTag(DurationTag.class, "time_duration", (attribute, object) -> { + return new DurationTag(object.getWorld().getTime()); + }); + + // <--[tag] + // @attribute + // @returns DurationTag + // @description + // Returns the in-game time of this world. + // --> + registerTag(DurationTag.class, "time_full", (attribute, object) -> { + return new DurationTag(object.getWorld().getFullTime()); + }); + + // <--[tag] + // @attribute + // @returns ElementTag + // @description + // Returns the time as 'day', 'night', 'dawn', or 'dusk'. + // --> + registerTag(ElementTag.class, "time_period", (attribute, object) -> { + long time = object.getWorld().getTime(); + String period; + + if (time >= 23000) { + period = "dawn"; + } + else if (time >= 13500) { + period = "night"; + } + else if (time >= 12500) { + period = "dusk"; + } + else { + period = "day"; + } + return new ElementTag(period); + }); + // <--[tag] // @attribute // @returns ElementTag(Number) @@ -1104,32 +1156,6 @@ else if (time >= 12500) { }); } - } - - public static ObjectTagProcessor tagProcessor = new ObjectTagProcessor<>(); - - public static void registerTag(Class returnType, String name, TagRunnable.ObjectInterface runnable, String... variants) { - tagProcessor.registerTag(returnType, name, (attribute, object) -> { - if (object.getWorld() == null) { - attribute.echoError("World '" + object.world_name + "' is unloaded, cannot process tag."); - return null; - } - return runnable.run(attribute, object); - }, variants); - } - - @Override - public ObjectTag getObjectAttribute(Attribute attribute) { - return tagProcessor.getObjectAttribute(this, attribute); - } - - public void applyProperty(Mechanism mechanism) { - mechanism.echoError("Cannot apply properties to a world!"); - } - - @Override - public void adjust(Mechanism mechanism) { - // <--[mechanism] // @object WorldTag // @name ambient_spawn_limit @@ -1139,10 +1165,11 @@ public void adjust(Mechanism mechanism) { // @tags // // --> - if (mechanism.matches("ambient_spawn_limit") - && mechanism.requireInteger()) { - getWorld().setAmbientSpawnLimit(mechanism.getValue().asInt()); - } + tagProcessor.registerMechanism("ambient_spawn_limit", false, ElementTag.class, (object, mechanism, input) -> { + if (mechanism.requireInteger()) { + object.getWorld().setAmbientSpawnLimit(input.asInt()); + } + }); // <--[mechanism] // @object WorldTag @@ -1153,10 +1180,11 @@ public void adjust(Mechanism mechanism) { // @tags // // --> - if (mechanism.matches("animal_spawn_limit") - && mechanism.requireInteger()) { - getWorld().setAnimalSpawnLimit(mechanism.getValue().asInt()); - } + tagProcessor.registerMechanism("animal_spawn_limit", false, ElementTag.class, (object, mechanism, input) -> { + if (mechanism.requireInteger()) { + object.getWorld().setAnimalSpawnLimit(input.asInt()); + } + }); // <--[mechanism] // @object WorldTag @@ -1167,10 +1195,11 @@ public void adjust(Mechanism mechanism) { // @tags // // --> - if (mechanism.matches("auto_save") - && mechanism.requireBoolean()) { - getWorld().setAutoSave(mechanism.getValue().asBoolean()); - } + tagProcessor.registerMechanism("auto_save", false, ElementTag.class, (object, mechanism, input) -> { + if (mechanism.requireBoolean()) { + object.getWorld().setAutoSave(input.asBoolean()); + } + }); // <--[mechanism] // @object WorldTag @@ -1182,12 +1211,11 @@ public void adjust(Mechanism mechanism) { // @tags // // --> - if (mechanism.matches("difficulty") && mechanism.requireEnum(Difficulty.class)) { - Difficulty diff = mechanism.getValue().asEnum(Difficulty.class); - if (diff != null) { - getWorld().setDifficulty(diff); + tagProcessor.registerMechanism("difficulty", false, ElementTag.class, (object, mechanism, input) -> { + if (mechanism.requireEnum(Difficulty.class)) { + object.getWorld().setDifficulty(input.asEnum(Difficulty.class)); } - } + }); // <--[mechanism] // @object WorldTag @@ -1198,9 +1226,11 @@ public void adjust(Mechanism mechanism) { // @tags // // --> - if (mechanism.matches("hardcore") && mechanism.requireBoolean()) { - getWorld().setHardcore(mechanism.getValue().asBoolean()); - } + tagProcessor.registerMechanism("hardcore", false, ElementTag.class, (object, mechanism, input) -> { + if (mechanism.requireBoolean()) { + object.getWorld().setHardcore(input.asBoolean()); + } + }); // <--[mechanism] // @object WorldTag @@ -1209,9 +1239,9 @@ public void adjust(Mechanism mechanism) { // @description // Saves the world to file. // --> - if (mechanism.matches("save")) { - getWorld().save(); - } + tagProcessor.registerMechanism("save", false, (object, mechanism) -> { + object.getWorld().save(); + }); // <--[mechanism] // @object WorldTag @@ -1221,10 +1251,10 @@ public void adjust(Mechanism mechanism) { // Unloads the world from the server without saving chunks, then destroys all data that is part of the world. // Require config setting 'Commands.Delete.Allow file deletion'. // --> - if (mechanism.matches("destroy")) { - File folder = getWorld().getWorldFolder(); - unloadWorldClean(mechanism, false); - if (getWorld() != null) { + tagProcessor.registerMechanism("destroy", false, (object, mechanism) -> { + File folder = object.getWorld().getWorldFolder(); + object.unloadWorldClean(mechanism, false); + if (object.getWorld() != null) { return; } if (!CoreConfiguration.allowFileDeletion) { @@ -1237,8 +1267,7 @@ public void adjust(Mechanism mechanism) { catch (Exception ex) { Debug.echoError(ex); } - return; - } + }); // <--[mechanism] // @object WorldTag @@ -1247,10 +1276,9 @@ public void adjust(Mechanism mechanism) { // @description // Unloads the world from the server without saving chunks. // --> - if (mechanism.matches("force_unload")) { - unloadWorldClean(mechanism, false); - return; - } + tagProcessor.registerMechanism("force_unload", false, (object, mechanism) -> { + object.unloadWorldClean(mechanism, false); + }); // <--[mechanism] // @object WorldTag @@ -1261,9 +1289,11 @@ public void adjust(Mechanism mechanism) { // @tags // // --> - if (mechanism.matches("full_time") && mechanism.requireInteger()) { - getWorld().setFullTime(mechanism.getValue().asInt()); - } + tagProcessor.registerMechanism("full_time", false, ElementTag.class, (object, mechanism, input) -> { + if (mechanism.requireInteger()) { + object.getWorld().setFullTime(input.asInt()); + } + }); // <--[mechanism] // @object WorldTag @@ -1274,9 +1304,11 @@ public void adjust(Mechanism mechanism) { // @tags // // --> - if (mechanism.matches("keep_spawn") && mechanism.requireBoolean()) { - getWorld().setKeepSpawnInMemory(mechanism.getValue().asBoolean()); - } + tagProcessor.registerMechanism("keep_spawn", false, ElementTag.class, (object, mechanism, input) -> { + if (mechanism.requireBoolean()) { + object.getWorld().setKeepSpawnInMemory(input.asBoolean()); + } + }); // <--[mechanism] // @object WorldTag @@ -1287,9 +1319,11 @@ public void adjust(Mechanism mechanism) { // @tags // // --> - if (mechanism.matches("monster_spawn_limit") && mechanism.requireInteger()) { - getWorld().setMonsterSpawnLimit(mechanism.getValue().asInt()); - } + tagProcessor.registerMechanism("monster_spawn_limit", false, ElementTag.class, (object, mechanism, input) -> { + if (mechanism.requireInteger()) { + object.getWorld().setMonsterSpawnLimit(input.asInt()); + } + }); // <--[mechanism] // @object WorldTag @@ -1300,9 +1334,11 @@ public void adjust(Mechanism mechanism) { // @tags // // --> - if (mechanism.matches("allow_pvp") && mechanism.requireBoolean()) { - getWorld().setPVP(mechanism.getValue().asBoolean()); - } + tagProcessor.registerMechanism("allow_pvp", false, ElementTag.class, (object, mechanism, input) -> { + if (mechanism.requireBoolean()) { + object.getWorld().setPVP(input.asBoolean()); + } + }); // <--[mechanism] // @object WorldTag @@ -1313,10 +1349,9 @@ public void adjust(Mechanism mechanism) { // @tags // // --> - if (mechanism.matches("spawn_location") && mechanism.requireObject(LocationTag.class)) { - LocationTag loc = mechanism.valueAsType(LocationTag.class); - getWorld().setSpawnLocation(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), loc.getYaw()); - } + tagProcessor.registerMechanism("spawn_location", false, LocationTag.class, (object, mechanism, input) -> { + object.getWorld().setSpawnLocation(input.getBlockX(), input.getBlockY(), input.getBlockZ(), input.getYaw()); + }); // <--[mechanism] // @object WorldTag @@ -1327,9 +1362,11 @@ public void adjust(Mechanism mechanism) { // @tags // // --> - if (mechanism.matches("storming") && mechanism.requireBoolean()) { - getWorld().setStorm(mechanism.getValue().asBoolean()); - } + tagProcessor.registerMechanism("storming", false, ElementTag.class, (object, mechanism, input) -> { + if (mechanism.requireBoolean()) { + object.getWorld().setStorm(input.asBoolean()); + } + }); // <--[mechanism] // @object WorldTag @@ -1340,9 +1377,9 @@ public void adjust(Mechanism mechanism) { // @tags // // --> - if (mechanism.matches("thunder_duration") && mechanism.requireObject(DurationTag.class)) { - getWorld().setThunderDuration(mechanism.valueAsType(DurationTag.class).getTicksAsInt()); - } + tagProcessor.registerMechanism("thunder_duration", false, DurationTag.class, (object, mechanism, input) -> { + object.getWorld().setThunderDuration(input.getTicksAsInt()); + }); // <--[mechanism] // @object WorldTag @@ -1353,9 +1390,11 @@ public void adjust(Mechanism mechanism) { // @tags // // --> - if (mechanism.matches("thundering") && mechanism.requireBoolean()) { - getWorld().setThundering(mechanism.getValue().asBoolean()); - } + tagProcessor.registerMechanism("thundering", false, ElementTag.class, (object, mechanism, input) -> { + if (mechanism.requireBoolean()) { + object.getWorld().setThundering(input.asBoolean()); + } + }); // <--[mechanism] // @object WorldTag @@ -1366,9 +1405,9 @@ public void adjust(Mechanism mechanism) { // @tags // // --> - if (mechanism.matches("ticks_per_animal_spawns") && mechanism.requireObject(DurationTag.class)) { - getWorld().setTicksPerAnimalSpawns(mechanism.valueAsType(DurationTag.class).getTicksAsInt()); - } + tagProcessor.registerMechanism("ticks_per_animal_spawns", false, DurationTag.class, (object, mechanism, input) -> { + object.getWorld().setTicksPerAnimalSpawns(input.getTicksAsInt()); + }); // <--[mechanism] // @object WorldTag @@ -1379,9 +1418,9 @@ public void adjust(Mechanism mechanism) { // @tags // // --> - if (mechanism.matches("ticks_per_monster_spawns") && mechanism.requireObject(DurationTag.class)) { - getWorld().setTicksPerMonsterSpawns(mechanism.valueAsType(DurationTag.class).getTicksAsInt()); - } + tagProcessor.registerMechanism("ticks_per_monster_spawns", false, DurationTag.class, (object, mechanism, input) -> { + object.getWorld().setTicksPerMonsterSpawns(input.getTicksAsInt()); + }); // <--[mechanism] // @object WorldTag @@ -1392,9 +1431,11 @@ public void adjust(Mechanism mechanism) { // @tags // // --> - if (mechanism.matches("time") && mechanism.requireInteger()) { - getWorld().setTime(mechanism.getValue().asInt()); - } + tagProcessor.registerMechanism("time", false, ElementTag.class, (object, mechanism, input) -> { + if (mechanism.requireInteger()) { + object.getWorld().setTime(input.asInt()); + } + }); // <--[mechanism] // @object WorldTag @@ -1403,10 +1444,9 @@ public void adjust(Mechanism mechanism) { // @description // Unloads the world from the server and saves chunks. // --> - if (mechanism.matches("unload")) { - unloadWorldClean(mechanism, true); - return; - } + tagProcessor.registerMechanism("unload", false, (object, mechanism) -> { + object.unloadWorldClean(mechanism, true); + }); // <--[mechanism] // @object WorldTag @@ -1417,9 +1457,11 @@ public void adjust(Mechanism mechanism) { // @tags // // --> - if (mechanism.matches("water_animal_spawn_limit") && mechanism.requireInteger()) { - getWorld().setWaterAnimalSpawnLimit(mechanism.getValue().asInt()); - } + tagProcessor.registerMechanism("water_animal_spawn_limit", false, ElementTag.class, (object, mechanism, input) -> { + if (mechanism.requireInteger()) { + object.getWorld().setWaterAnimalSpawnLimit(input.asInt()); + } + }); // <--[mechanism] // @object WorldTag @@ -1430,9 +1472,9 @@ public void adjust(Mechanism mechanism) { // @tags // // --> - if (mechanism.matches("weather_duration") && mechanism.requireObject(DurationTag.class)) { - getWorld().setWeatherDuration(mechanism.valueAsType(DurationTag.class).getTicksAsInt()); - } + tagProcessor.registerMechanism("weather_duration", false, DurationTag.class, (object, mechanism, input) -> { + object.getWorld().setWeatherDuration(input.getTicksAsInt()); + }); // <--[mechanism] // @object WorldTag @@ -1442,10 +1484,11 @@ public void adjust(Mechanism mechanism) { // Advances this world's day the specified number of ticks WITHOUT firing any events. // Useful for manually adjusting the daylight cycle without firing an event every tick, for example. // --> - if (mechanism.matches("advance_ticks") && mechanism.requireInteger()) { - World world = getWorld(); - NMSHandler.worldHelper.setDayTime(world, world.getFullTime() + mechanism.getValue().asInt()); - } + tagProcessor.registerMechanism("advance_ticks", false, ElementTag.class, (object, mechanism, input) -> { + if (mechanism.requireInteger()) { + NMSHandler.worldHelper.setDayTime(object.getWorld(), object.getWorld().getFullTime() + input.asInt()); + } + }); // <--[mechanism] // @object WorldTag @@ -1456,9 +1499,9 @@ public void adjust(Mechanism mechanism) { // @tags // // --> - if (mechanism.matches("duration_since_created") && mechanism.requireObject(DurationTag.class)) { - NMSHandler.worldHelper.setGameTime(getWorld(), mechanism.valueAsType(DurationTag.class).getTicks()); - } + tagProcessor.registerMechanism("duration_since_created", false, DurationTag.class, (object, mechanism, input) -> { + NMSHandler.worldHelper.setGameTime(object.getWorld(), input.getTicks()); + }); // <--[mechanism] // @object WorldTag @@ -1468,9 +1511,9 @@ public void adjust(Mechanism mechanism) { // Skips to the next day as if enough players slept through the night. // NOTE: This ignores the doDaylightCycle gamerule! // --> - if (mechanism.matches("skip_night")) { + tagProcessor.registerMechanism("skip_night", false, (object, mechanism) -> { // general logic from NMS world tick - World world = getWorld(); + World world = object.getWorld(); long worldTime = world.getFullTime(); long nextDay = worldTime + 24000L; TimeSkipEvent event = new TimeSkipEvent(world, TimeSkipEvent.SkipReason.NIGHT_SKIP, nextDay - nextDay % 24000L - worldTime); @@ -1482,14 +1525,38 @@ public void adjust(Mechanism mechanism) { NMSHandler.worldHelper.wakeUpAllPlayers(world); } // minor change: prior to 1.18, hasStorm/isRaining was not checked - if (getGameRuleOrDefault(GameRule.DO_WEATHER_CYCLE) && world.hasStorm()) { + if (object.getGameRuleOrDefault(GameRule.DO_WEATHER_CYCLE) && world.hasStorm()) { NMSHandler.worldHelper.clearWeather(world); } - } + }); + } + + public static ObjectTagProcessor tagProcessor = new ObjectTagProcessor<>(); + + public static void registerTag(Class returnType, String name, TagRunnable.ObjectInterface runnable, String... variants) { + tagProcessor.registerTag(returnType, name, (attribute, object) -> { + if (object.getWorld() == null) { + attribute.echoError("World '" + object.world_name + "' is unloaded, cannot process tag."); + return null; + } + return runnable.run(attribute, object); + }, variants); + } + @Override + public ObjectTag getObjectAttribute(Attribute attribute) { + return tagProcessor.getObjectAttribute(this, attribute); + } + + @Override + public void adjust(Mechanism mechanism) { tagProcessor.processMechanism(this, mechanism); } + public void applyProperty(Mechanism mechanism) { + mechanism.echoError("Cannot apply properties to a world!"); + } + public void unloadWorldClean(Mechanism mechanism, boolean doSave) { for (Player pl : new ArrayList<>(getWorld().getPlayers())) { if (pl.isOnline()) { 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 f2227b4f14..72e59895c7 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/BukkitImplDeprecations.java @@ -465,6 +465,9 @@ public class BukkitImplDeprecations { // Added 2025/04/27 public static Warning playerChangesWorldSwitches = new FutureWarning("playerChangesWorldSwitches", "The 'from' and 'to' arguments in the 'player changes world' script event have been deprecated in favor of the 'from' and 'to' switches."); + // Added 2025/05/02 + public static Warning timeSubTags = new FutureWarning("timeSubTags", pointlessSubtagPrefix + "'time.*' tags are now just 'time_*'."); + // ==================== PAST deprecations of things that are already gone but still have a warning left behind ==================== // Removed upstream 2023/10/29 without warning. From 0a5a972d28f41afc8b44eafd71142aa40a914cb2 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Wed, 25 Jun 2025 14:41:00 +0100 Subject: [PATCH 178/280] Fix server version check on Paper (#2737) * Fix for Paper change * Rename to `isExactServerVersionMatch` * Better placeholder * Merge into one string * Clear up error message --- .../com/denizenscript/denizen/Denizen.java | 37 ++++++++++--------- .../denizenscript/denizen/nms/NMSHandler.java | 2 +- .../denizen/nms/v1_17/Handler.java | 2 +- .../denizen/nms/v1_18/Handler.java | 2 +- .../denizen/nms/v1_19/Handler.java | 2 +- .../denizen/nms/v1_20/Handler.java | 2 +- .../denizen/nms/v1_21/Handler.java | 5 ++- 7 files changed, 28 insertions(+), 24 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/Denizen.java b/plugin/src/main/java/com/denizenscript/denizen/Denizen.java index dd001d7fb1..24cf8d88cb 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/Denizen.java +++ b/plugin/src/main/java/com/denizenscript/denizen/Denizen.java @@ -162,12 +162,26 @@ else if (javaVersion.startsWith("21")) { startedSuccessful = false; return; } - if (!NMSHandler.instance.isCorrectMappingsCode()) { - getLogger().warning("-------------------------------------"); - getLogger().warning("This build of Denizen was built for a different Spigot revision! This may potentially cause issues." - + " If you are experiencing trouble, update Denizen and Spigot both to latest builds!" - + " If this message appears with both Denizen and Spigot fully up-to-date, contact the Denizen team (via GitHub, Spigot, or Discord) to request an update be built."); - getLogger().warning("-------------------------------------"); + try { + if (Class.forName("com.destroystokyo.paper.PaperConfig") != null) { + supportsPaper = true; + } + } + catch (ClassNotFoundException ex) { + // Ignore. + } + catch (Throwable ex) { + Debug.echoError(ex); + } + if (!NMSHandler.instance.isExactServerVersionMatch()) { + String serverSoftware = supportsPaper ? "Paper" : "Spigot"; + getLogger().warning(""" + \n------------------------------------- + This build of Denizen was built for a different Minecraft version! This may potentially cause issues. + If you are experiencing trouble, update Denizen and both to latest builds! + If this message appears with both Denizen and fully up-to-date, contact the Denizen team (via Discord) to request an update be built. + -------------------------------------""".replace("", serverSoftware) + ); } triggerRegistry = new TriggerRegistry(); boolean citizensBork = false; @@ -205,17 +219,6 @@ else if (javaVersion.startsWith("21")) { catch (Exception e) { Debug.echoError(e); } - try { - if (Class.forName("com.destroystokyo.paper.PaperConfig") != null) { - supportsPaper = true; - } - } - catch (ClassNotFoundException ex) { - // Ignore. - } - catch (Throwable ex) { - Debug.echoError(ex); - } // bstats.org try { BStatsMetricsLite metrics = new BStatsMetricsLite(this); diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java b/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java index e24e339067..4c19f75019 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java @@ -93,7 +93,7 @@ public static JavaPlugin getJavaPlugin() { public static WorldHelper worldHelper; public static EnchantmentHelper enchantmentHelper; - public boolean isCorrectMappingsCode() { + public boolean isExactServerVersionMatch() { return true; } diff --git a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/Handler.java b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/Handler.java index 494a7005ad..537436ea42 100644 --- a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/Handler.java +++ b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/Handler.java @@ -94,7 +94,7 @@ public void undisableAsyncCatcher() { } @Override - public boolean isCorrectMappingsCode() { + public boolean isExactServerVersionMatch() { return ((CraftMagicNumbers) CraftMagicNumbers.INSTANCE).getMappingsVersion().equals("f0e3dfc7390de285a4693518dd5bd126"); } diff --git a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/Handler.java b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/Handler.java index b630e954e3..7304bf6b7a 100644 --- a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/Handler.java +++ b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/Handler.java @@ -103,7 +103,7 @@ public void undisableAsyncCatcher() { } @Override - public boolean isCorrectMappingsCode() { + public boolean isExactServerVersionMatch() { return ((CraftMagicNumbers) CraftMagicNumbers.INSTANCE).getMappingsVersion().equals("eaeedbff51b16ead3170906872fda334"); } diff --git a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/Handler.java b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/Handler.java index 092966dfe9..9d569568a4 100644 --- a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/Handler.java +++ b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/Handler.java @@ -107,7 +107,7 @@ public void undisableAsyncCatcher() { } @Override - public boolean isCorrectMappingsCode() { + public boolean isExactServerVersionMatch() { return ((CraftMagicNumbers) CraftMagicNumbers.INSTANCE).getMappingsVersion().equals("3009edc0fff87fa34680686663bd59df"); } diff --git a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java index 4e3fe1d156..423316c5e8 100644 --- a/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java +++ b/v1_20/src/main/java/com/denizenscript/denizen/nms/v1_20/Handler.java @@ -145,7 +145,7 @@ public void undisableAsyncCatcher() { } @Override - public boolean isCorrectMappingsCode() { + public boolean isExactServerVersionMatch() { return ((CraftMagicNumbers) CraftMagicNumbers.INSTANCE).getMappingsVersion().equals("ee13f98a43b9c5abffdcc0bb24154460"); } diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java index f45890aabb..5d9c6ab2aa 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java @@ -39,6 +39,7 @@ import com.mojang.serialization.DynamicOps; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.BaseComponent; +import net.minecraft.SharedConstants; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.core.Rotations; @@ -151,8 +152,8 @@ public void undisableAsyncCatcher() { } @Override - public boolean isCorrectMappingsCode() { - return CraftMagicNumbers.INSTANCE.getMappingsVersion().equals("164f8e872cb3dff744982fca079642b2"); + public boolean isExactServerVersionMatch() { + return Denizen.supportsPaper ? SharedConstants.getCurrentVersion().id().equals("1.21.6") : CraftMagicNumbers.INSTANCE.getMappingsVersion().equals("164f8e872cb3dff744982fca079642b2"); } @Override From 851920455277dbece511e97aaaf3be18d094300e Mon Sep 17 00:00:00 2001 From: MCSamuel Date: Sun, 29 Jun 2025 03:26:46 -0700 Subject: [PATCH 179/280] Separate `dragon egg moves` from `liquid spreads` (#2731) * Moved DragonEggMoves to a separate event * removed deprecations, meta change, and moved check for material * whoops * minor changes --- .../denizen/events/ScriptEventRegistry.java | 1 + .../block/DragonEggMovesScriptEvent.java | 68 +++++++++++++++++++ .../events/block/LiquidSpreadScriptEvent.java | 42 +++--------- 3 files changed, 79 insertions(+), 32 deletions(-) create mode 100644 plugin/src/main/java/com/denizenscript/denizen/events/block/DragonEggMovesScriptEvent.java diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java index b5341a3713..99ec56bfea 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java @@ -82,6 +82,7 @@ public static void registerMainEvents() { ScriptEvent.registerScriptEvent(BrewingStandFueledScriptEvent.class); ScriptEvent.registerScriptEvent(BrewsScriptEvent.class); ScriptEvent.registerScriptEvent(CauldronLevelChangeScriptEvent.class); + ScriptEvent.registerScriptEvent(DragonEggMovesScriptEvent.class); ScriptEvent.registerScriptEvent(FurnaceBurnsItemScriptEvent.class); ScriptEvent.registerScriptEvent(FurnaceStartsSmeltingScriptEvent.class); ScriptEvent.registerScriptEvent(LeafDecaysScriptEvent.class); diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/block/DragonEggMovesScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/block/DragonEggMovesScriptEvent.java new file mode 100644 index 0000000000..3ab4985789 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/events/block/DragonEggMovesScriptEvent.java @@ -0,0 +1,68 @@ +package com.denizenscript.denizen.events.block; + +import com.denizenscript.denizen.objects.LocationTag; +import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.objects.MaterialTag; +import com.denizenscript.denizencore.objects.ObjectTag; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockFromToEvent; + +public class DragonEggMovesScriptEvent extends BukkitScriptEvent implements Listener { + + // <--[event] + // @Events + // dragon egg moves + // + // @Group Block + // + // @Location true + // + // @Cancellable true + // + // @Triggers when a dragon egg moves. + // + // @Context + // returns the LocationTag the egg started at. + // returns the LocationTag the egg teleported to. + // + // --> + + public DragonEggMovesScriptEvent() { + registerCouldMatcher("dragon egg moves"); + } + + public LocationTag location; + public LocationTag destination; + public BlockFromToEvent event; + + @Override + public boolean matches(ScriptPath path) { + if (!runInCheck(path, location) && !runInCheck(path, destination)) { + return false; + } + return super.matches(path); + } + + @Override + public ObjectTag getContext(String name) { + return switch (name) { + case "location" -> location; + case "destination" -> destination; + case "material" -> new MaterialTag(Material.DRAGON_EGG); // for historical compatibility reasons + default -> super.getContext(name); + }; + } + + @EventHandler + public void onDragonEggMove(BlockFromToEvent event) { + if (event.getBlock().getType() != Material.DRAGON_EGG) { // BlockFromToEvent also fires with LiquidSpreadScriptEvent + return; + } + destination = new LocationTag(event.getToBlock().getLocation()); + location = new LocationTag(event.getBlock().getLocation()); + this.event = event; + fire(event); + } +} diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/block/LiquidSpreadScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/block/LiquidSpreadScriptEvent.java index 16f2ae0be6..01e1a6f1b9 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/block/LiquidSpreadScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/block/LiquidSpreadScriptEvent.java @@ -14,7 +14,6 @@ public class LiquidSpreadScriptEvent extends BukkitScriptEvent implements Listen // <--[event] // @Events // liquid spreads - // dragon egg moves // // @Switch type: to only run if the block spreading matches the material input. // @@ -24,7 +23,7 @@ public class LiquidSpreadScriptEvent extends BukkitScriptEvent implements Listen // // @Cancellable true // - // @Triggers when a liquid block spreads or dragon egg moves. + // @Triggers when a liquid block spreads. // // @Context // returns the LocationTag the block spread to. @@ -35,8 +34,6 @@ public class LiquidSpreadScriptEvent extends BukkitScriptEvent implements Listen public LiquidSpreadScriptEvent() { registerCouldMatcher("liquid spreads"); - registerCouldMatcher(" spreads"); // NOTE: exists for historical compat reasons. - registerCouldMatcher("dragon egg moves"); // TODO: this should just be a separate event? registerSwitches("type"); } @@ -45,30 +42,8 @@ public LiquidSpreadScriptEvent() { public LocationTag destination; public BlockFromToEvent event; - @Override - public boolean couldMatch(ScriptPath path) { - if (!super.couldMatch(path)) { - return false; - } - if (path.eventLower.startsWith("block")) { - return false; - } - return true; - } - @Override public boolean matches(ScriptPath path) { - if (path.eventLower.startsWith("dragon egg moves")) { - if (material.getMaterial() != Material.DRAGON_EGG) { - return false; - } - } - else { - String mat = path.eventArgLowerAt(0); - if (!mat.equals("liquid") && !material.tryAdvancedMatcher(mat, path.context)) { - return false; - } - } if (!path.tryObjectSwitch("type", material)) { return false; } @@ -80,16 +55,19 @@ public boolean matches(ScriptPath path) { @Override public ObjectTag getContext(String name) { - switch (name) { - case "location": return location; - case "destination": return destination; - case "material": return material; - } - return super.getContext(name); + return switch (name) { + case "location" -> location; + case "destination" -> destination; + case "material" -> material; + default -> super.getContext(name); + }; } @EventHandler public void onLiquidSpreads(BlockFromToEvent event) { + if (event.getBlock().getType() == Material.DRAGON_EGG) { // BlockFromToEvent also fires with DragonEggMovesScriptEvent + return; + } destination = new LocationTag(event.getToBlock().getLocation()); location = new LocationTag(event.getBlock().getLocation()); material = new MaterialTag(event.getBlock()); From d86e4793a00c30991e0d68fe8851ef943cd869a1 Mon Sep 17 00:00:00 2001 From: david <89749147+davight@users.noreply.github.com> Date: Sun, 29 Jun 2025 12:32:24 +0200 Subject: [PATCH 180/280] `MaterialTag.item`: fix for non-item materials (#2735) --- .../java/com/denizenscript/denizen/objects/MaterialTag.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/MaterialTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/MaterialTag.java index dd5cd4b5ec..c9b1e15307 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/MaterialTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/MaterialTag.java @@ -545,10 +545,10 @@ public static void register() { // @attribute // @returns ItemTag // @description - // Returns an item of the material. + // Returns an item of the material. Not all materials can be items. // --> tagProcessor.registerTag(ItemTag.class, "item", (attribute, object) -> { - return new ItemTag(object, 1); + return object.material.isItem() ? new ItemTag(object, 1) : null; }); // <--[tag] From 5914b91060c40bd46cad4adc0e74f278831a10a6 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Tue, 1 Jul 2025 13:49:38 +0100 Subject: [PATCH 181/280] `1.21.7` update (#2739) --- README.md | 2 +- paper/pom.xml | 2 +- plugin/pom.xml | 2 +- v1_21/pom.xml | 12 ++++++------ .../com/denizenscript/denizen/nms/v1_21/Handler.java | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 80d063b465..d896bb36d3 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ The Denizen Scripting Language - Spigot Impl An implementation of the Denizen Scripting Language for Spigot servers, with strong Citizens interlinks to emphasize the power of using Denizen with NPCs! -**Version 1.3.1**: Compatible with Spigot 1.17.1, 1.18.2, 1.19.4, 1.20.6, and 1.21.6! +**Version 1.3.1**: Compatible with Spigot 1.17.1, 1.18.2, 1.19.4, 1.20.6, and 1.21.7! **Learn about Denizen from the Beginner's guide:** https://guide.denizenscript.com/guides/background/index.html diff --git a/paper/pom.xml b/paper/pom.xml index 1c726adc34..cce8d09e22 100644 --- a/paper/pom.xml +++ b/paper/pom.xml @@ -25,7 +25,7 @@ io.papermc.paper paper-api - 1.21.6-R0.1-SNAPSHOT + 1.21.7-R0.1-SNAPSHOT provided diff --git a/plugin/pom.xml b/plugin/pom.xml index 0d1632e83b..2ac78efa42 100644 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -30,7 +30,7 @@ org.spigotmc spigot-api - 1.21.6-R0.1-SNAPSHOT + 1.21.7-R0.1-SNAPSHOT jar provided diff --git a/v1_21/pom.xml b/v1_21/pom.xml index 8b040d6103..d5cd7d0b4e 100644 --- a/v1_21/pom.xml +++ b/v1_21/pom.xml @@ -19,13 +19,13 @@ org.spigotmc spigot-api - 1.21.6-R0.1-SNAPSHOT + 1.21.7-R0.1-SNAPSHOT provided org.spigotmc spigot - 1.21.6-R0.1-SNAPSHOT + 1.21.7-R0.1-SNAPSHOT remapped-mojang provided @@ -45,9 +45,9 @@ remap-obf - org.spigotmc:minecraft-server:1.21.6-R0.1-SNAPSHOT:txt:maps-mojang + org.spigotmc:minecraft-server:1.21.7-R0.1-SNAPSHOT:txt:maps-mojang true - org.spigotmc:spigot:1.21.6-R0.1-SNAPSHOT:jar:remapped-mojang + org.spigotmc:spigot:1.21.7-R0.1-SNAPSHOT:jar:remapped-mojang true remapped-obf @@ -60,8 +60,8 @@ remap-spigot ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar - org.spigotmc:minecraft-server:1.21.6-R0.1-SNAPSHOT:csrg:maps-spigot - org.spigotmc:spigot:1.21.6-R0.1-SNAPSHOT:jar:remapped-obf + org.spigotmc:minecraft-server:1.21.7-R0.1-SNAPSHOT:csrg:maps-spigot + org.spigotmc:spigot:1.21.7-R0.1-SNAPSHOT:jar:remapped-obf diff --git a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java index 5d9c6ab2aa..9efae94344 100644 --- a/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java +++ b/v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java @@ -153,7 +153,7 @@ public void undisableAsyncCatcher() { @Override public boolean isExactServerVersionMatch() { - return Denizen.supportsPaper ? SharedConstants.getCurrentVersion().id().equals("1.21.6") : CraftMagicNumbers.INSTANCE.getMappingsVersion().equals("164f8e872cb3dff744982fca079642b2"); + return Denizen.supportsPaper ? SharedConstants.getCurrentVersion().id().equals("1.21.7") : CraftMagicNumbers.INSTANCE.getMappingsVersion().equals("98b42190c84edaa346fd96106ee35d6f"); } @Override From 59af87c75175646a478e4f7d94164c8d50b76a23 Mon Sep 17 00:00:00 2001 From: david <89749147+davight@users.noreply.github.com> Date: Sun, 6 Jul 2025 12:30:54 +0200 Subject: [PATCH 182/280] Update Map command (#2732) * update to autocompile + multiple fixes * fixes * change image arg to string --- .../scripts/commands/item/MapCommand.java | 131 ++++++++---------- 1 file changed, 56 insertions(+), 75 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/item/MapCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/item/MapCommand.java index ddc6774331..aec090b8ce 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/item/MapCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/item/MapCommand.java @@ -1,56 +1,53 @@ package com.denizenscript.denizen.scripts.commands.item; -import com.denizenscript.denizen.scripts.containers.core.MapScriptContainer; -import com.denizenscript.denizen.utilities.maps.*; -import com.denizenscript.denizencore.objects.core.ColorTag; -import com.denizenscript.denizencore.utilities.debugging.Debug; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.objects.WorldTag; -import com.denizenscript.denizencore.exceptions.InvalidArgumentsException; +import com.denizenscript.denizen.scripts.containers.core.MapScriptContainer; +import com.denizenscript.denizen.utilities.maps.*; import com.denizenscript.denizencore.exceptions.InvalidArgumentsRuntimeException; -import com.denizenscript.denizencore.objects.Argument; +import com.denizenscript.denizencore.objects.core.ColorTag; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.ScriptTag; 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.CoreUtilities; +import com.denizenscript.denizencore.utilities.debugging.Debug; import org.bukkit.Bukkit; import org.bukkit.map.MapRenderer; import org.bukkit.map.MapView; -import java.util.List; - public class MapCommand extends AbstractCommand { public MapCommand() { setName("map"); - setSyntax("map [<#>/new:] (reset:) (scale:) (tracking) (image:) (resize) (script: