From bad149261b59a4c33589977e38ff7e4c2f91dc4a Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Wed, 25 Mar 2026 14:19:54 +0000 Subject: [PATCH 1/7] 26.1 part 1: copy over 1.21 module --- v26_1/pom.xml | 81 ++ .../denizen/nms/v26_1/Handler.java | 423 +++++++++ .../nms/v26_1/ReflectionMappingsInfo.java | 130 +++ .../v26_1/helpers/AdvancementHelperImpl.java | 196 ++++ .../v26_1/helpers/AnimationHelperImpl.java | 48 + .../nms/v26_1/helpers/BlockHelperImpl.java | 253 +++++ .../nms/v26_1/helpers/ChunkHelperImpl.java | 119 +++ .../v26_1/helpers/CustomEntityHelperImpl.java | 149 +++ .../v26_1/helpers/EnchantmentHelperImpl.java | 195 ++++ .../v26_1/helpers/EntityDataNameMapper.java | 484 ++++++++++ .../nms/v26_1/helpers/EntityHelperImpl.java | 870 ++++++++++++++++++ .../nms/v26_1/helpers/FishingHelperImpl.java | 157 ++++ .../nms/v26_1/helpers/ItemHelperImpl.java | 779 ++++++++++++++++ .../denizen/nms/v26_1/helpers/NBTAdapter.java | 143 +++ .../nms/v26_1/helpers/PacketHelperImpl.java | 435 +++++++++ .../nms/v26_1/helpers/PlayerHelperImpl.java | 509 ++++++++++ .../nms/v26_1/helpers/WorldHelperImpl.java | 111 +++ .../denizen/nms/v26_1/impl/BiomeNMSImpl.java | 242 +++++ .../v26_1/impl/ImprovedOfflinePlayerImpl.java | 171 ++++ .../nms/v26_1/impl/ProfileEditorImpl.java | 169 ++++ .../denizen/nms/v26_1/impl/SidebarImpl.java | 103 +++ .../nms/v26_1/impl/blocks/BlockLightImpl.java | 264 ++++++ .../impl/entities/CraftFakeArrowImpl.java | 26 + .../impl/entities/CraftFakePlayerImpl.java | 66 ++ .../entities/CraftItemProjectileImpl.java | 117 +++ .../impl/entities/EntityFakeArrowImpl.java | 43 + .../impl/entities/EntityFakePlayerImpl.java | 43 + .../entities/EntityItemProjectileImpl.java | 106 +++ .../impl/network/fakes/FakeChannelImpl.java | 80 ++ .../network/fakes/FakeNetworkManagerImpl.java | 16 + .../fakes/FakePlayerConnectionImpl.java | 20 + .../handlers/AbstractListenerPlayInImpl.java | 671 ++++++++++++++ .../handlers/DenizenNetworkManagerImpl.java | 580 ++++++++++++ .../handlers/DenizenPacketListenerImpl.java | 121 +++ .../network/handlers/FakeBlockHelper.java | 168 ++++ .../packet/ActionBarEventPacketHandlers.java | 39 + .../handlers/packet/AttachPacketHandlers.java | 310 +++++++ .../packet/BlockLightPacketHandlers.java | 27 + .../DenizenPacketHandlerPacketHandlers.java | 47 + .../packet/DisguisePacketHandlers.java | 160 ++++ .../packet/EntityMetadataPacketHandlers.java | 92 ++ .../packet/FakeBlocksPacketHandlers.java | 112 +++ .../packet/FakeEquipmentPacketHandlers.java | 138 +++ .../packet/FakePlayerPacketHandlers.java | 29 + .../packet/HiddenEntitiesPacketHandlers.java | 69 ++ .../packet/HideParticlesPacketHandlers.java | 31 + .../PlayerHearsSoundEventPacketHandlers.java | 39 + .../TablistUpdateEventPacketHandlers.java | 126 +++ .../PacketInResourcePackStatusImpl.java | 18 + .../packets/PacketInSteerVehicleImpl.java | 33 + .../network/packets/PacketOutChatImpl.java | 50 + 51 files changed, 9408 insertions(+) create mode 100644 v26_1/pom.xml create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/Handler.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/ReflectionMappingsInfo.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/AdvancementHelperImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/AnimationHelperImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/BlockHelperImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/ChunkHelperImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/CustomEntityHelperImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EnchantmentHelperImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EntityDataNameMapper.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EntityHelperImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/FishingHelperImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/ItemHelperImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/NBTAdapter.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/PacketHelperImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/PlayerHelperImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/WorldHelperImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/BiomeNMSImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/ImprovedOfflinePlayerImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/ProfileEditorImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/SidebarImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/blocks/BlockLightImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/CraftFakeArrowImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/CraftFakePlayerImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/CraftItemProjectileImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityFakeArrowImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityFakePlayerImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityItemProjectileImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/fakes/FakeChannelImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/fakes/FakeNetworkManagerImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/fakes/FakePlayerConnectionImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/AbstractListenerPlayInImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/DenizenNetworkManagerImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/DenizenPacketListenerImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/FakeBlockHelper.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/ActionBarEventPacketHandlers.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/AttachPacketHandlers.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/BlockLightPacketHandlers.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/DenizenPacketHandlerPacketHandlers.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/DisguisePacketHandlers.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/EntityMetadataPacketHandlers.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakeBlocksPacketHandlers.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakePlayerPacketHandlers.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/HideParticlesPacketHandlers.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/PlayerHearsSoundEventPacketHandlers.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/packets/PacketInResourcePackStatusImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/packets/PacketInSteerVehicleImpl.java create mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/packets/PacketOutChatImpl.java diff --git a/v26_1/pom.xml b/v26_1/pom.xml new file mode 100644 index 0000000000..1449c8e8a8 --- /dev/null +++ b/v26_1/pom.xml @@ -0,0 +1,81 @@ + + + 4.0.0 + + com.denizenscript + denizen-v1_21 + 1.3.1-SNAPSHOT + + + + com.denizenscript + denizen + ${project.version} + compile + true + + + org.spigotmc + spigot-api + 1.21.11-R0.2-SNAPSHOT + provided + + + org.spigotmc + spigot + 1.21.11-R0.2-SNAPSHOT + remapped-mojang + provided + + + + + + + net.md-5 + specialsource-maven-plugin + 2.0.2 + + + package + + remap + + remap-obf + + org.spigotmc:minecraft-server:1.21.11-R0.2-SNAPSHOT:txt:maps-mojang + true + org.spigotmc:spigot:1.21.11-R0.2-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.21.11-R0.2-SNAPSHOT:csrg:maps-spigot + org.spigotmc:spigot:1.21.11-R0.2-SNAPSHOT:jar:remapped-obf + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.10.1 + + 16 + 16 + + + + + + diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/Handler.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/Handler.java new file mode 100644 index 0000000000..01ffc5fac9 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/Handler.java @@ -0,0 +1,423 @@ +package com.denizenscript.denizen.nms.v1_21; + +import com.denizenscript.denizen.Denizen; +import com.denizenscript.denizen.nms.NMSHandler; +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.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.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.denizenscript.denizencore.utilities.debugging.DebugInternals; +import com.google.common.collect.Iterables; +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.properties.Property; +import com.mojang.serialization.DynamicOps; +import net.kyori.adventure.nbt.CompoundBinaryTag; +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; +import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.ByteArrayTag; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.StringTag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.Identifier; +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; +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 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_R7.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R7.CraftServer; +import org.bukkit.craftbukkit.v1_21_R7.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R7.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_21_R7.boss.CraftBossBar; +import org.bukkit.craftbukkit.v1_21_R7.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftInventory; +import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftInventoryCustom; +import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftInventoryView; +import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R7.legacy.FieldRename; +import org.bukkit.craftbukkit.v1_21_R7.persistence.CraftPersistentDataContainer; +import org.bukkit.craftbukkit.v1_21_R7.util.*; +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.UUID; +import java.util.function.Consumer; +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(); + 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, CompoundTag.class, map -> { + CompoundBinaryTag compoundTag = (CompoundBinaryTag) ItemRawNBT.convertObjectToNbt(map, CoreUtilities.noDebugContext, "(item)."); + return compoundTag != null ? NBTAdapter.toNMS(compoundTag) : 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 isExactServerVersionMatch() { + return Denizen.supportsPaper ? SharedConstants.getCurrentVersion().id().equals("1.21.11") : CraftMagicNumbers.INSTANCE.getMappingsVersion().equals("e3cd927e07e6ff434793a0474c51b2b9"); + } + + @Override + public double[] getRecentTps() { + return ((CraftServer) Bukkit.getServer()).getServer().recentTps; + } + + @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.services().nameToIdCache().get(playerProfile.getUniqueId()).map(result -> new GameProfile(result.id(), result.name())).orElse(null); + } + if (profile == null && playerProfile.getName() != null) { + profile = minecraftServer.services().nameToIdCache().get(playerProfile.getName()).map(result -> new GameProfile(result.id(), result.name())).orElse(null); + } + if (profile == null) { + profile = ProfileEditorImpl.getGameProfileNoProperties(playerProfile); + } + Property textures = profile.properties().containsKey("textures") ? Iterables.getFirst(profile.properties().get("textures"), null) : null; + if (textures == null || !textures.hasSignature() || profile.name() == null || profile.id() == null) { + profile = minecraftServer.services().profileResolver().fetchById(profile.id()).orElse(null); + if (profile == null) { + return null; + } + textures = profile.properties().containsKey("textures") ? Iterables.getFirst(profile.properties().get("textures"), null) : null; + } + return new PlayerProfile(profile.name(), profile.id(), 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.properties().get("textures"), null); + return new PlayerProfile(gameProfile.name(), gameProfile.id(), + 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 (Identifier key : level.registryAccess().lookupOrThrow(Registries.BIOME).keySet()) { + output.add(new BiomeNMSImpl(level, CraftNamespacedKey.fromMinecraft(key))); + } + return output; + } + + @Override + public BiomeNMS getBiomeNMS(World world, NamespacedKey key) { + BiomeNMSImpl impl = new BiomeNMSImpl(((CraftWorld) world).getHandle(), key); + 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); + Identifier key = level.registryAccess().lookupOrThrow(Registries.BIOME).getKey(biome.value()); + return new BiomeNMSImpl(level, CraftNamespacedKey.fromMinecraft(key)); + } + + @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.asString().get(); + } + 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 FormattedTextHelper.parseJson(CraftChatMessage.toJSON(nms)); + } + + public static Component componentToNMS(BaseComponent[] spigot) { + if (spigot == null) { + return null; + } + return CraftChatMessage.fromJSONOrNull(FormattedTextHelper.componentToJson(spigot)); + } + + public static final MethodHandle TAG_VALUE_OUTPUT_CONSTRUCTOR = ReflectionHelper.getConstructor(TagValueOutput.class, ProblemReporter.class, DynamicOps.class, CompoundTag.class); + + public static 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 CompoundTag useValueOutput(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(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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/ReflectionMappingsInfo.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/ReflectionMappingsInfo.java new file mode 100644 index 0000000000..360d260ee4 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/ReflectionMappingsInfo.java @@ -0,0 +1,130 @@ +package com.denizenscript.denizen.nms.v1_21; + +public class ReflectionMappingsInfo { + + // Content generated by ReflectionMappingsGenerator - https://github.com/DenizenScript/ReflectionMappingsGenerator + + // net.minecraft.world.level.block.state.BlockBehaviour + public static String BlockBehaviour_explosionResistance = "G"; + + // net.minecraft.core.MappedRegistry + public static String MappedRegistry_registrationInfos = "h"; + + // net.minecraft.world.entity.Entity + public static String Entity_onGround = "bc"; + public static String Entity_DATA_SHARED_FLAGS_ID = "aA"; + public static String Entity_DATA_CUSTOM_NAME = "bm"; + public static String Entity_DATA_CUSTOM_NAME_VISIBLE = "bn"; + + // net.minecraft.world.entity.LivingEntity + public static String LivingEntity_attackStrengthTicker = "bz"; + public static String LivingEntity_autoSpinAttackTicks = "bW"; + public static String LivingEntity_setLivingEntityFlag_method = "c"; + + // net.minecraft.world.entity.player.Player + public static String Player_DATA_PLAYER_ABSORPTION_ID = "b"; + + // net.minecraft.server.level.ServerPlayer + public static String ServerPlayer_respawnConfig = "dr"; + + // net.minecraft.world.entity.monster.EnderMan + public static String EnderMan_DATA_CREEPY = "cx"; + + // net.minecraft.world.entity.monster.zombie.Zombie + public static String Zombie_inWaterTime = "cL"; + + // net.minecraft.world.item.Item + public static String Item_components = "c"; + + // net.minecraft.world.item.component.ResolvableProfile + public static String ResolvableProfile_unpack_method = "a"; + + // net.minecraft.world.item.component.ResolvableProfile$Partial + public static String ResolvableProfilePartial_id = "d"; + + // net.minecraft.world.level.Level + public static String Level_isClientSide = "D"; + + // 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 = "k"; + + // net.minecraft.world.entity.item.ItemEntity + public static String ItemEntity_DATA_ITEM = "c"; + + // net.minecraft.world.level.biome.Biome + public static String Biome_climateSettings = "i"; + public static String Biome_attributes = "l"; + public static String Biome_specialEffects = "m"; + + // net.minecraft.network.Connection + public static String Connection_receiving = "h"; + public static String Connection_packetListener = "n"; + + // net.minecraft.server.network.ServerGamePacketListenerImpl + public static String ServerGamePacketListenerImpl_aboveGroundTickCount = "L"; + public static String ServerGamePacketListenerImpl_aboveGroundVehicleTickCount = "N"; + public static String ServerGamePacketListenerImpl_awaitingPositionFromClient = "H"; + public static String ServerGamePacketListenerImpl_awaitingTeleport = "I"; + public static String ServerGamePacketListenerImpl_chunkSender = "h"; + + // net.minecraft.server.network.ServerCommonPacketListenerImpl + public static String ServerCommonPacketListenerImpl_connection = "e"; + public static String ServerCommonPacketListenerImpl_createCookie_method = "a"; + + // 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.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 = "b"; + + // 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 = "O"; + + // net.minecraft.world.item.AdventureModePredicate + public static String AdventureModePredicate_predicates = "g"; + + // net.minecraft.stats.ServerRecipeBook + public static String ServerRecipeBook_addHighlight_method = "e"; +} diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/AdvancementHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/AdvancementHelperImpl.java new file mode 100644 index 0000000000..1c9d91c52c --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/AdvancementHelperImpl.java @@ -0,0 +1,196 @@ +package com.denizenscript.denizen.nms.v1_21.helpers; + +import com.denizenscript.denizen.nms.interfaces.AdvancementHelper; +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; +import net.minecraft.advancements.*; +import net.minecraft.advancements.criterion.ImpossibleTrigger; +import net.minecraft.core.ClientAsset; +import net.minecraft.network.protocol.game.ClientboundUpdateAdvancementsPacket; +import net.minecraft.resources.Identifier; +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_21_R7.CraftServer; +import org.bukkit.craftbukkit.v1_21_R7.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R7.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(), false)); + } + } + + @Override + public void unregister(com.denizenscript.denizen.nms.util.Advancement advancement) { + if (advancement.temporary || !advancement.registered) { + return; + } + Identifier 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(), false)); + } + + @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, List.of(nmsAdvancement), Set.of(), Map.of(nmsAdvancement.id(), progress), false)); + } + 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, List.of(nmsAdvancement), Set.of(), Map.of(nmsAdvancement.id(), progress), true)); + } + else { + AdvancementHolder nmsAdvancement = getNMSAdvancementManager().advancements.get(CraftNamespacedKey.toMinecraft(advancement.key)); + ((CraftPlayer) player).getHandle().getAdvancements().award(nmsAdvancement, IMPOSSIBLE_KEY); + } + } + + @Override + public void revokePartial(com.denizenscript.denizen.nms.util.Advancement advancement, Player player, int len) { + if (advancement.length <= 1) { + revoke(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, List.of(nmsAdvancement), Set.of(), Map.of(nmsAdvancement.id(), progress), false)); + } + else { + AdvancementHolder nmsAdvancement = getNMSAdvancementManager().advancements.get(CraftNamespacedKey.toMinecraft(advancement.key)); + PlayerAdvancements advancements = ((CraftPlayer) player).getHandle().getAdvancements(); + for (int i = len; i < advancement.length; i++) { + advancements.revoke(nmsAdvancement, IMPOSSIBLE_KEY + i); + } + } + } + + @Override + public void revoke(com.denizenscript.denizen.nms.util.Advancement advancement, Player player) { + if (advancement.temporary) { + 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)); + PlayerAdvancements advancements = ((CraftPlayer) player).getHandle().getAdvancements(); + for (String criterion : nmsAdvancement.value().criteria().keySet()) { + advancements.revoke(nmsAdvancement, criterion); + } + } + } + + @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, List.of(), Set.of(), Map.of(), false)); + PlayerAdvancements data = nmsPlayer.getAdvancements(); + data.save(); // save progress + data.reload(getNMSAdvancementManager()); // clear progress + data.flushDirty(nmsPlayer, false); // 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).map(ClientAsset.ResourceTexture::new), 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.add(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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/AnimationHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/AnimationHelperImpl.java new file mode 100644 index 0000000000..b000df11bc --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/AnimationHelperImpl.java @@ -0,0 +1,48 @@ +package com.denizenscript.denizen.nms.v1_21.helpers; + +import com.denizenscript.denizen.nms.abstracts.AnimationHelper; +import net.minecraft.world.entity.Entity; +import org.bukkit.craftbukkit.v1_21_R7.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R7.entity.CraftHorse; +import org.bukkit.craftbukkit.v1_21_R7.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); + } + }); + // 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(Integer.MAX_VALUE); + } + }); + register("HORSE_STOP_STANDING", entity -> { + if (entity instanceof Horse) { + ((CraftHorse) entity).getHandle().clearStanding(); + } + }); + 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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/BlockHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/BlockHelperImpl.java new file mode 100644 index 0000000000..8a8b9188c9 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/BlockHelperImpl.java @@ -0,0 +1,253 @@ +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.v1_21.Handler; +import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_21.impl.ProfileEditorImpl; +import com.denizenscript.denizen.objects.EntityTag; +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.kyori.adventure.nbt.CompoundBinaryTag; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.InclusiveRange; +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; +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.Instrument; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.CreatureSpawner; +import org.bukkit.block.Skull; +import org.bukkit.craftbukkit.v1_21_R7.CraftChunk; +import org.bukkit.craftbukkit.v1_21_R7.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R7.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R7.block.CraftBlock; +import org.bukkit.craftbukkit.v1_21_R7.block.CraftBlockEntityState; +import org.bukkit.craftbukkit.v1_21_R7.block.CraftCreatureSpawner; +import org.bukkit.craftbukkit.v1_21_R7.block.CraftSkull; +import org.bukkit.craftbukkit.v1_21_R7.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R7.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R7.util.CraftMagicNumbers; + +import java.lang.invoke.MethodHandle; +import java.lang.reflect.Field; +import java.util.Optional; + +public class BlockHelperImpl implements BlockHelper { + + 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"); + + static { + Field blockEntityField = ReflectionHelper.getFields(CraftBlockEntityState.class).getNoCheck("blockEntity"); + if (blockEntityField == null) { + blockEntityField = ReflectionHelper.getFields(CraftBlockEntityState.class).get("tileEntity"); + } + craftBlockEntityState_tileEntity = blockEntityField; + } + + @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) { + ResolvableProfile profile = getTE(((CraftSkull) skull)).owner; + if (profile == null) { + return null; + } + com.mojang.authlib.properties.Property property = Iterables.getFirst(profile.partialProfile().properties().get("textures"), null); + return new PlayerProfile(profile.name().orElse(null), ProfileEditorImpl.getUUID(profile), property != null ? property.value() : null); + } + + @Override + public void setPlayerProfile(Skull skull, PlayerProfile playerProfile) { + GameProfile gameProfile = ProfileEditorImpl.getGameProfile(playerProfile); + try { + craftSkull_profile.set(skull, ResolvableProfile.createResolved(gameProfile)); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + skull.update(); + } + + public BlockEntity getBlockEntity(Block block) { + CraftBlock craftBlock = ((CraftBlock) block); + return craftBlock.getHandle().getBlockEntity(craftBlock.getPosition()); + } + + @Override + public CompoundBinaryTag getNbtData(Block block) { + BlockEntity nmsBlockEntity = getBlockEntity(block); + if (nmsBlockEntity != null) { + CompoundTag compound = nmsBlockEntity.saveWithFullMetadata(CraftRegistry.getMinecraftRegistry()); + return NBTAdapter.toAPI(compound); + } + return null; + } + + @Override + public void setNbtData(Block block, CompoundBinaryTag ctag) { + CompoundTag nmsData = NBTAdapter.toNMS(ctag); + nmsData.putInt("x", block.getX()); + nmsData.putInt("y", block.getY()); + nmsData.putInt("z", block.getZ()); + Handler.useValueInput(nmsData, getBlockEntity(block)::loadWithComponents); + } + + @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 + // 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); + entityTag.isFake = true; + entityTag.isFakeValid = true; + for (Mechanism mechanism : entity.getWaitingMechanisms()) { + entityTag.safeAdjustDuplicate(mechanism); + } + nmsEntity.unsetRemoved(); + // Store it into the spawner + SpawnerBlockEntity nmsSnapshot = (SpawnerBlockEntity) craftBlockEntityState_snapshot.get(spawner); + Handler.useValueOutput(nmsSnapshot.getSpawner().nextSpawnData.getEntityToSpawn(), nmsEntity::saveWithoutId); + } + 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 = WeightedList.of(); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } +} diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/ChunkHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/ChunkHelperImpl.java new file mode 100644 index 0000000000..4157cf2074 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/ChunkHelperImpl.java @@ -0,0 +1,119 @@ +package com.denizenscript.denizen.nms.v1_21.helpers; + +import com.denizenscript.denizen.nms.abstracts.BiomeNMS; +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; +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.Chunk; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_21_R7.CraftChunk; +import org.bukkit.craftbukkit.v1_21_R7.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.getMinSectionY(); k < levelheightaccessor.getMaxSectionY(); ++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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/CustomEntityHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/CustomEntityHelperImpl.java new file mode 100644 index 0000000000..0df283220e --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/CustomEntityHelperImpl.java @@ -0,0 +1,149 @@ +package com.denizenscript.denizen.nms.v1_21.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_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; +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_21_R7.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R7.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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EnchantmentHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EnchantmentHelperImpl.java new file mode 100644 index 0000000000..ba72802159 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EnchantmentHelperImpl.java @@ -0,0 +1,195 @@ +package com.denizenscript.denizen.nms.v1_21.helpers; + +import com.denizenscript.denizen.nms.interfaces.EnchantmentHelper; + +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); + + @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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EntityDataNameMapper.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EntityDataNameMapper.java new file mode 100644 index 0000000000..01b43c07ca --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EntityDataNameMapper.java @@ -0,0 +1,484 @@ +package com.denizenscript.denizen.nms.v1_21.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.axolotl.Axolotl; +import net.minecraft.world.entity.animal.bee.Bee; +import net.minecraft.world.entity.animal.camel.Camel; +import net.minecraft.world.entity.animal.cow.MushroomCow; +import net.minecraft.world.entity.animal.dolphin.Dolphin; +import net.minecraft.world.entity.animal.equine.AbstractChestedHorse; +import net.minecraft.world.entity.animal.equine.AbstractHorse; +import net.minecraft.world.entity.animal.equine.Horse; +import net.minecraft.world.entity.animal.equine.Llama; +import net.minecraft.world.entity.animal.feline.Cat; +import net.minecraft.world.entity.animal.feline.Ocelot; +import net.minecraft.world.entity.animal.fish.AbstractFish; +import net.minecraft.world.entity.animal.fish.Pufferfish; +import net.minecraft.world.entity.animal.fish.TropicalFish; +import net.minecraft.world.entity.animal.fox.Fox; +import net.minecraft.world.entity.animal.frog.Frog; +import net.minecraft.world.entity.animal.goat.Goat; +import net.minecraft.world.entity.animal.golem.IronGolem; +import net.minecraft.world.entity.animal.golem.SnowGolem; +import net.minecraft.world.entity.animal.panda.Panda; +import net.minecraft.world.entity.animal.parrot.Parrot; +import net.minecraft.world.entity.animal.pig.Pig; +import net.minecraft.world.entity.animal.polarbear.PolarBear; +import net.minecraft.world.entity.animal.rabbit.Rabbit; +import net.minecraft.world.entity.animal.sheep.Sheep; +import net.minecraft.world.entity.animal.sniffer.Sniffer; +import net.minecraft.world.entity.animal.turtle.Turtle; +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; +import net.minecraft.world.entity.decoration.ArmorStand; +import net.minecraft.world.entity.decoration.ItemFrame; +import net.minecraft.world.entity.decoration.painting.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.illager.Pillager; +import net.minecraft.world.entity.monster.illager.SpellcasterIllager; +import net.minecraft.world.entity.monster.piglin.AbstractPiglin; +import net.minecraft.world.entity.monster.piglin.Piglin; +import net.minecraft.world.entity.monster.spider.Spider; +import net.minecraft.world.entity.monster.warden.Warden; +import net.minecraft.world.entity.monster.zombie.Zombie; +import net.minecraft.world.entity.monster.zombie.ZombieVillager; +import net.minecraft.world.entity.npc.villager.AbstractVillager; +import net.minecraft.world.entity.npc.villager.Villager; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.EyeOfEnder; +import net.minecraft.world.entity.projectile.FireworkRocketEntity; +import net.minecraft.world.entity.projectile.FishingHook; +import net.minecraft.world.entity.projectile.ThrowableProjectile; +import net.minecraft.world.entity.projectile.arrow.AbstractArrow; +import net.minecraft.world.entity.projectile.arrow.Arrow; +import net.minecraft.world.entity.projectile.arrow.ThrownTrident; +import net.minecraft.world.entity.projectile.hurtingprojectile.Fireball; +import net.minecraft.world.entity.projectile.hurtingprojectile.SmallFireball; +import net.minecraft.world.entity.projectile.hurtingprojectile.WitherSkull; +import net.minecraft.world.entity.raid.Raider; +import net.minecraft.world.entity.vehicle.boat.Boat; +import net.minecraft.world.entity.vehicle.minecart.AbstractMinecart; +import net.minecraft.world.entity.vehicle.minecart.MinecartCommandBlock; +import net.minecraft.world.entity.vehicle.minecart.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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EntityHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EntityHelperImpl.java new file mode 100644 index 0000000000..b57de3441d --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EntityHelperImpl.java @@ -0,0 +1,870 @@ +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.v1_21.Handler; +import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.objects.properties.entity.EntityState; +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.kyori.adventure.nbt.CompoundBinaryTag; +import net.minecraft.commands.arguments.EntityAnchorArgument; +import net.minecraft.nbt.CompoundTag; +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.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; +import net.minecraft.world.entity.animal.armadillo.Armadillo; +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_21_R7.CraftServer; +import org.bukkit.craftbukkit.v1_21_R7.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R7.block.CraftBlock; +import org.bukkit.craftbukkit.v1_21_R7.block.CraftCreatureSpawner; +import org.bukkit.craftbukkit.v1_21_R7.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_21_R7.entity.*; +import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R7.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.ATTACK_DAMAGE); + if (attrib != null) { + damage = attrib.getValue(); + } + if (damage <= 0) { + return 0; + } + 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()); + } + 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 (nmsLivingTarget == null) { + return damage; + } + 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); + } + 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) { + 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)); + } + + @Override + public CompoundBinaryTag getNbtData(Entity entity) { + CompoundTag nmsTag = Handler.useValueOutput(((CraftEntity) entity).getHandle()::saveAsPassenger); + return NBTAdapter.toAPI(nmsTag); + } + + @Override + public void setNbtData(Entity entity, CompoundBinaryTag compoundTag) { + Handler.useValueInput(NBTAdapter.toNMS(compoundTag), ((CraftEntity) entity).getHandle()::load); + } + + /* + 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.level().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.level().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(entity.getEntityId(), PositionMoveRotation.of(((CraftEntity) entity).getHandle()), Set.of(), entity.isOnGround()); + 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 CAMPFIRE -> sources.campfire(); + 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.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.equine.AbstractHorse nmsHorse = ((CraftAbstractHorse) horse).getHandle(); + ((CraftPlayer) player).getHandle().openHorseInventory(nmsHorse, nmsHorse.inventory); + } + + private CompoundTag getRawEntityNBT(net.minecraft.world.entity.Entity entity) { + return Handler.useValueOutput(entity::saveWithoutId); + } + + @Override + public CompoundBinaryTag getRawNBT(Entity entity) { + return NBTAdapter.toAPI(getRawEntityNBT(((CraftEntity) entity).getHandle())); + } + + @Override + public void modifyRawNBT(Entity entity, CompoundBinaryTag tag) { + net.minecraft.world.entity.Entity nmsEntity = ((CraftEntity) entity).getHandle(); + CompoundTag nmsTag = NBTAdapter.toNMS(tag); + CompoundTag nmsMergedTag = getRawEntityNBT(nmsEntity).merge(nmsTag); + UUID uuid = nmsEntity.getUUID(); + Handler.useValueInput(nmsMergedTag, nmsEntity::load); + nmsEntity.setUUID(uuid); + } + + @Override + public EntityState.ArmadilloState getArmadilloState(org.bukkit.entity.Armadillo entity) { + Armadillo armadillo = (Armadillo) ((CraftEntity) entity).getHandle(); + return switch (armadillo.getState()) { + case IDLE -> EntityState.ArmadilloState.IDLE; + case ROLLING -> EntityState.ArmadilloState.ROLLING; + case SCARED -> EntityState.ArmadilloState.SCARED; + case UNROLLING -> EntityState.ArmadilloState.UNROLLING; + }; + } + + @Override + public void setArmadilloState(org.bukkit.entity.Armadillo entity, EntityState.ArmadilloState state) { + Armadillo armadillo = (Armadillo) ((CraftEntity) entity).getHandle(); + armadillo.switchToState(switch (state) { + case IDLE -> Armadillo.ArmadilloState.IDLE; + case ROLLING -> Armadillo.ArmadilloState.ROLLING; + case SCARED -> Armadillo.ArmadilloState.SCARED; + case UNROLLING -> Armadillo.ArmadilloState.UNROLLING; + }); + } +} diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/FishingHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/FishingHelperImpl.java new file mode 100644 index 0000000000..a6cd25a56c --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/FishingHelperImpl.java @@ -0,0 +1,157 @@ +package com.denizenscript.denizen.nms.v1_21.helpers; + +import com.denizenscript.denizen.nms.interfaces.FishingHelper; +import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.minecraft.resources.ResourceKey; +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.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.LootContextParamSets; +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_R7.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R7.entity.CraftFishHook; +import org.bukkit.craftbukkit.v1_21_R7.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R7.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; + +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 -> { + 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); + 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(); + 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 = nmsWorld.getServer().reloadableRegistries().getLootTable(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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/ItemHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/ItemHelperImpl.java new file mode 100644 index 0000000000..5ab295a2d6 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/ItemHelperImpl.java @@ -0,0 +1,779 @@ +package com.denizenscript.denizen.nms.v1_21.helpers; + +import com.denizenscript.denizen.Denizen; +import com.denizenscript.denizen.nms.interfaces.ItemHelper; +import com.denizenscript.denizen.nms.util.PlayerProfile; +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.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; +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.kyori.adventure.nbt.BinaryTag; +import net.kyori.adventure.nbt.CompoundBinaryTag; +import net.md_5.bungee.api.ChatColor; +import net.minecraft.advancements.criterion.BlockPredicate; +import net.minecraft.advancements.criterion.DataComponentMatchers; +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.core.registries.Registries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtOps; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.RegistryOps; +import net.minecraft.resources.ResourceKey; +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; +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.component.TypedEntityData; +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; +import net.minecraft.world.level.block.Blocks; +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_21_R7.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R7.CraftServer; +import org.bukkit.craftbukkit.v1_21_R7.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R7.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_21_R7.entity.CraftEntityType; +import org.bukkit.craftbukkit.v1_21_R7.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R7.inventory.*; +import org.bukkit.craftbukkit.v1_21_R7.map.CraftMapView; +import org.bukkit.craftbukkit.v1_21_R7.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_21_R7.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.map.MapView; + +import java.lang.reflect.Field; +import java.util.*; +import java.util.function.Consumer; +import java.util.function.Predicate; + +public class ItemHelperImpl extends ItemHelper { + + public static net.minecraft.world.item.crafting.RecipeHolder getNMSRecipe(NamespacedKey key) { + ResourceKey> nmsKey = ResourceKey.create(Registries.RECIPE, 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 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); + 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())); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + public static RecipeManager getRecipeManager() { + return ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager(); + } + + public static CompoundTag serializeNmsItem(net.minecraft.world.item.ItemStack nmsItem) { + return (CompoundTag) net.minecraft.world.item.ItemStack.CODEC.encodeStart(CraftRegistry.getMinecraftRegistry().createSerializationContext(NbtOps.INSTANCE), nmsItem).getOrThrow(); + } + + public static net.minecraft.world.item.ItemStack parseNmsItem(CompoundTag nmsTag) { + return net.minecraft.world.item.ItemStack.CODEC.parse(CraftRegistry.getMinecraftRegistry().createSerializationContext(NbtOps.INSTANCE), nmsTag).getOrThrow(); + } + + 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))); + } + + @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)); + } + } + + // TODO: Recipe registration should be moved to the API + public static Ingredient itemArrayToRecipe(ItemStack[] items, boolean exact) { + if (!exact) { + return Ingredient.of(Arrays.stream(items).map(item -> CraftMagicNumbers.getItem(item.getType()))); + } + return Ingredient.ofStacks(Arrays.stream(items).map(CraftItemStack::asNMSCopy).toList()); + } + + public static ResourceKey> createRecipeKey(String name) { + return ResourceKey.create(Registries.RECIPE, Identifier.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) { + ResourceKey> key = createRecipeKey(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); + getRecipeManager().addRecipe(holder); + } + + @Override + public void registerStonecuttingRecipe(String keyName, String group, ItemStack result, ItemStack[] ingredient, boolean exact) { + ResourceKey> key = createRecipeKey(keyName); + Ingredient itemRecipe = itemArrayToRecipe(ingredient, exact); + StonecutterRecipe recipe = new StonecutterRecipe(group, itemRecipe, CraftItemStack.asNMSCopy(result)); + RecipeHolder holder = new RecipeHolder<>(key, recipe); + getRecipeManager().addRecipe(holder); + } + + @Override + public void registerSmithingRecipe(String keyName, ItemStack result, ItemStack[] baseItem, boolean baseExact, ItemStack[] upgradeItem, boolean upgradeExact, ItemStack[] templateItem, boolean templateExact) { + ResourceKey> key = createRecipeKey(keyName); + Ingredient templateItemRecipe = templateItem.length == 0 ? null : itemArrayToRecipe(templateItem, templateExact); + Ingredient baseItemRecipe = itemArrayToRecipe(baseItem, baseExact); + Ingredient upgradeItemRecipe = itemArrayToRecipe(upgradeItem, upgradeExact); + net.minecraft.world.item.ItemStack nmsCopy = CraftItemStack.asNMSCopy(result); + SmithingTransformRecipe recipe = new SmithingTransformRecipe(Optional.ofNullable(templateItemRecipe), baseItemRecipe, Optional.of(upgradeItemRecipe), new TransmuteResult(nmsCopy.getItemHolder(), nmsCopy.getCount(), nmsCopy.getComponentsPatch())); + RecipeHolder holder = new RecipeHolder<>(key, recipe); + getRecipeManager().addRecipe(holder); + } + + @Override + public void registerShapelessRecipe(String keyName, String group, ItemStack result, List ingredients, boolean[] exact, String category) { + 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++) { + 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); + 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 + public String getJsonString(ItemStack itemStack) { + String json = CraftItemStack.asNMSCopy(itemStack).getDisplayName().getStyle().toString().replace("\\", "\\\\").replace("\"", "\\\""); + return json.substring(176, json.length() - 185); + } + + @Override + public JsonObject getRawHoverComponentsJson(ItemStack item) { + DataComponentPatch nmsComponents = CraftItemStack.asNMSCopy(item).getComponentsPatch(); + if (nmsComponents.isEmpty()) { + return null; + } + 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 + 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.partialProfile().properties().get("textures"), null); + return new PlayerProfile(profile.name().orElse(null), ProfileEditorImpl.getUUID(profile), + 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, ResolvableProfile.createResolved(gameProfile)); + return CraftItemStack.asBukkitCopy(nmsItemStack); + } + + @Override + public ItemStack addNbtData(ItemStack itemStack, String key, BinaryTag value) { + net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(itemStack); + nmsItemStack.update(DataComponents.CUSTOM_DATA, CustomData.EMPTY, customData -> customData.update(nmsCompoundTag -> nmsCompoundTag.put(key, NBTAdapter.toNMS(value)))); + 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 CompoundBinaryTag getNbtData(ItemStack itemStack) { + net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(itemStack); + if (nmsItemStack != null && !nmsItemStack.isEmpty()) { + return NBTAdapter.toAPI(serializeNmsItem(nmsItemStack)); + } + return CompoundBinaryTag.empty(); + } + + // 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, CompoundBinaryTag compoundTag) { + return CraftItemStack.asBukkitCopy(parseNmsItem(NBTAdapter.toNMS(compoundTag))); + } + + @Override + public CompoundBinaryTag getCustomData(ItemStack item) { + CustomData customData = CraftItemStack.asNMSCopy(item).get(DataComponents.CUSTOM_DATA); + return customData != null ? NBTAdapter.toAPI(customData.copyTag()) : null; + } + + @Override + public ItemStack setCustomData(ItemStack item, CompoundBinaryTag 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(NBTAdapter.toNMS(data))); + } + return CraftItemStack.asBukkitCopy(nmsItemStack); + } + + public static final int DATA_VERSION_1_20_4 = 3700; + + @Override + public ItemStack setPartialOldNbt(ItemStack item, CompoundBinaryTag oldTag) { + int currentDataVersion = CraftMagicNumbers.INSTANCE.getDataVersion(); + CompoundTag nmsOldTag = new CompoundTag(); + nmsOldTag.putString("id", item.getType().getKey().toString()); + nmsOldTag.putByte("Count", (byte) item.getAmount()); + nmsOldTag.put("tag", NBTAdapter.toNMS(oldTag)); + CompoundTag nmsUpdatedTag = (CompoundTag) MinecraftServer.getServer().fixerUpper.update(References.ITEM_STACK, new Dynamic<>(NbtOps.INSTANCE, nmsOldTag), DATA_VERSION_1_20_4, currentDataVersion).getValue(); + CompoundTag nmsCurrentTag = serializeNmsItem(CraftItemStack.asNMSCopy(item)); + CompoundTag nmsMergedTag = nmsCurrentTag.merge(nmsUpdatedTag); + return CraftItemStack.asBukkitCopy(parseNmsItem(nmsMergedTag)); + } + + @Override + public CompoundBinaryTag getEntityData(ItemStack item) { + TypedEntityData> entityData = CraftItemStack.asNMSCopy(item).get(DataComponents.ENTITY_DATA); + return entityData != null ? NBTAdapter.toAPI(entityData.getUnsafe()) : null; + } + + @Override + public ItemStack setEntityData(ItemStack item, CompoundBinaryTag entityNbt, EntityType entityType) { + net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(item); + if (entityNbt == null || entityNbt.isEmpty() || (entityNbt.size() == 1 && entityNbt.contains("id"))) { + nmsItemStack.remove(DataComponents.ENTITY_DATA); + } + else { + CompoundTag nmsEntityNbt = NBTAdapter.toNMS(entityNbt); + nmsEntityNbt.remove("id"); + nmsItemStack.set(DataComponents.ENTITY_DATA, TypedEntityData.of(CraftEntityType.bukkitToMinecraft(entityType), nmsEntityNbt)); + } + 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 -> { + Identifier 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); + CompoundTag nmsPatch = (CompoundTag) DataComponentPatch.CODEC.encodeStart(registryOps, patch).getOrThrow(); + if (excludeHandled && Denizen.supportsPaper) { + nmsPatch.keySet().removeIf(s -> s.charAt(0) == '!'); + if (nmsPatch.isEmpty()) { + return new MapTag(); + } + } + MapTag rawComponents = (MapTag) ItemRawNBT.nbtTagToObject(NBTAdapter.toAPI(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(); + CompoundBinaryTag rawComponents = (CompoundBinaryTag) ItemRawNBT.convertObjectToNbt(rawComponentsMap, CoreUtilities.errorButNoDebugContext, ""); + CompoundTag nmsRawComponents = NBTAdapter.toNMS(rawComponents); + RegistryOps registryOps = CraftRegistry.getMinecraftRegistry().createSerializationContext(NbtOps.INSTANCE); + if (dataVersion < currentDataVersion) { + CompoundTag legacyItemData = new CompoundTag(); + legacyItemData.putString("id", item.getType().getKey().toString()); + legacyItemData.putInt("count", item.getAmount()); + legacyItemData.put("components", nmsRawComponents); + CompoundTag nmsUpdatedTag = (CompoundTag) MinecraftServer.getServer().fixerUpper.update(References.ITEM_STACK, new Dynamic<>(registryOps, legacyItemData), dataVersion, currentDataVersion).getValue(); + nmsRawComponents = nmsUpdatedTag.getCompound("components").orElseGet(CompoundTag::new); + } + 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 + 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.get(CraftNamespacedKey.toMinecraft(material.getKey())).orElseThrow(), materials) + ), Optional.empty(), Optional.empty(), DataComponentMatchers.ANY); + nmsItemStack.set(nmsComponent, new AdventureModePredicate(List.of(nmsPredicate))); + 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 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.getMinY() + 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.getMinY()); + if (k4 > world.getMinY() && !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.getMinY() && !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, "customMixes", MinecraftServer.getServer().potionBrewing()), 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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/NBTAdapter.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/NBTAdapter.java new file mode 100644 index 0000000000..427e1a62b3 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/NBTAdapter.java @@ -0,0 +1,143 @@ +package com.denizenscript.denizen.nms.v1_21.helpers; + +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import net.kyori.adventure.nbt.*; +import net.minecraft.nbt.*; + +import java.lang.invoke.MethodHandle; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class NBTAdapter { + + public static final MethodHandle COMPOUND_TAG_MAP_CONSTRUCTOR = ReflectionHelper.getConstructor(CompoundTag.class, Map.class); + + public static Tag toNMS(BinaryTag tag) { + if (tag instanceof ByteBinaryTag byteTag) { + return switch (byteTag.value()) { + case 0 -> ByteTag.ZERO; + case 1 -> ByteTag.ONE; + default -> ByteTag.valueOf(byteTag.value()); + }; + } + else if (tag instanceof ShortBinaryTag shortTag) { + return ShortTag.valueOf(shortTag.value()); + } + else if (tag instanceof IntBinaryTag intTag) { + return IntTag.valueOf(intTag.value()); + } + else if (tag instanceof LongBinaryTag longTag) { + return LongTag.valueOf(longTag.value()); + } + else if (tag instanceof FloatBinaryTag floatTag) { + return FloatTag.valueOf(floatTag.value()); + } + else if (tag instanceof DoubleBinaryTag doubleTag) { + return DoubleTag.valueOf(doubleTag.value()); + } + else if (tag instanceof ByteArrayBinaryTag byteArrayTag) { + return new ByteArrayTag(byteArrayTag.value()); + } + else if (tag instanceof IntArrayBinaryTag intArrayTag) { + return new IntArrayTag(intArrayTag.value()); + } + else if (tag instanceof LongArrayBinaryTag longArrayTag) { + return new LongArrayTag(longArrayTag.value()); + } + else if (tag instanceof StringBinaryTag stringTag) { + return StringTag.valueOf(stringTag.value()); + } + else if (tag instanceof ListBinaryTag listTag) { + return toNMS(listTag); + } + else if (tag instanceof CompoundBinaryTag compoundTag) { + return toNMS(compoundTag); + } + else if (tag instanceof EndBinaryTag) { + return EndTag.INSTANCE; + } + throw new IllegalStateException("Unrecognized API tag of type '" + tag.type() + "': " + tag); + } + + public static BinaryTag toAPI(Tag nmsTag) { + if (nmsTag instanceof ByteTag nmsByteTag) { + return ByteBinaryTag.byteBinaryTag(nmsByteTag.value()); + } + else if (nmsTag instanceof ShortTag nmsShortTag) { + return ShortBinaryTag.shortBinaryTag(nmsShortTag.value()); + } + else if (nmsTag instanceof IntTag nmsIntTag) { + return IntBinaryTag.intBinaryTag(nmsIntTag.value()); + } + else if (nmsTag instanceof LongTag nmsLongTag) { + return LongBinaryTag.longBinaryTag(nmsLongTag.value()); + } + else if (nmsTag instanceof FloatTag nmsFloatTag) { + return FloatBinaryTag.floatBinaryTag(nmsFloatTag.value()); + } + else if (nmsTag instanceof DoubleTag nmsDoubleTag) { + return DoubleBinaryTag.doubleBinaryTag(nmsDoubleTag.value()); + } + else if (nmsTag instanceof ByteArrayTag nmsByteArrayTag) { + return ByteArrayBinaryTag.byteArrayBinaryTag(nmsByteArrayTag.getAsByteArray()); + } + else if (nmsTag instanceof IntArrayTag nmsIntArrayTag) { + return IntArrayBinaryTag.intArrayBinaryTag(nmsIntArrayTag.getAsIntArray()); + } + else if (nmsTag instanceof LongArrayTag nmsLongArrayTag) { + return LongArrayBinaryTag.longArrayBinaryTag(nmsLongArrayTag.getAsLongArray()); + } + else if (nmsTag instanceof StringTag nmsStringTag) { + return StringBinaryTag.stringBinaryTag(nmsStringTag.value()); + } + else if (nmsTag instanceof ListTag nmsListTag) { + return toAPI(nmsListTag); + } + else if (nmsTag instanceof CompoundTag nmsCompoundTag) { + return toAPI(nmsCompoundTag); + } + else if (nmsTag instanceof EndTag) { + return EndBinaryTag.endBinaryTag(); + } + throw new IllegalStateException("Unrecognized NMS tag of type '" + nmsTag.getClass().getName() + '/' + nmsTag.getType().getName() + "': " + nmsTag); + } + + public static ListBinaryTag toAPI(ListTag nmsListTag) { + ListBinaryTag.Builder builder = ListBinaryTag.heterogeneousListBinaryTag(nmsListTag.size()); + for (Tag nmsValue : nmsListTag) { + builder.add(toAPI(nmsValue)); + } + return builder.build(); + } + + public static ListTag toNMS(ListBinaryTag listTag) { + List nmsTags = new ArrayList<>(listTag.size()); + for (BinaryTag value : listTag) { + nmsTags.add(toNMS(value)); + } + return new ListTag(nmsTags); + } + + public static CompoundBinaryTag toAPI(CompoundTag nmsCompoundTag) { + CompoundBinaryTag.Builder builder = CompoundBinaryTag.builder(nmsCompoundTag.size()); + for (Map.Entry nmsEntry : nmsCompoundTag.entrySet()) { + builder.put(nmsEntry.getKey(), toAPI(nmsEntry.getValue())); + } + return builder.build(); + } + + public static CompoundTag toNMS(CompoundBinaryTag compoundTag) { + Map nmsTags = new HashMap<>(compoundTag.size()); + for (Map.Entry entry : compoundTag) { + nmsTags.put(entry.getKey(), toNMS(entry.getValue())); + } + try { + return (CompoundTag) COMPOUND_TAG_MAP_CONSTRUCTOR.invokeExact(nmsTags); + } + catch (Throwable e) { + throw new RuntimeException(e); + } + } +} diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/PacketHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/PacketHelperImpl.java new file mode 100644 index 0000000000..de8b320707 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/PacketHelperImpl.java @@ -0,0 +1,435 @@ +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_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.objects.LocationTag; +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.CoreUtilities; +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.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.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.spider.CaveSpider; +import net.minecraft.world.entity.monster.Creeper; +import net.minecraft.world.entity.monster.EnderMan; +import net.minecraft.world.entity.monster.spider.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.phys.Vec3; +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.Material; +import org.bukkit.block.Sign; +import org.bukkit.block.sign.Side; +import org.bukkit.block.sign.SignSide; +import org.bukkit.craftbukkit.v1_21_R7.CraftServer; +import org.bukkit.craftbukkit.v1_21_R7.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R7.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R7.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R7.map.CraftMapCanvas; +import org.bukkit.craftbukkit.v1_21_R7.map.CraftMapView; +import org.bukkit.craftbukkit.v1_21_R7.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, 0, BlockPos.ZERO)); + send(player, new ClientboundSetCameraPacket(entity)); + NMSHandler.playerHelper.refreshPlayer(player); + send(player, new ClientboundRemoveEntitiesPacket(entity.getId())); + } + + @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 ClientboundBundlePacket(List.of( + new ClientboundSetTitlesAnimationPacket(fadeInTicks, stayTicks, fadeOutTicks), + new ClientboundSetTitleTextPacket(Handler.componentToNMS(FormattedTextHelper.parse(title, ChatColor.WHITE))), + 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) { // TODO: MC 1.18: once 1.18 is removed, remove 'location' arg + 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); + } + 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)); + } + + @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) { + BlockPos nmsPos = CraftLocation.toBlockPosition(location); + LocationTag displayPos = !name.isEmpty() ? LocationTag.valueOf(name, CoreUtilities.noDebugContext) : null; + send(player, new ClientboundGameTestHighlightPosPacket(nmsPos, displayPos != null ? CraftLocation.toBlockPosition(displayPos) : nmsPos)); + } + + @Override + public void clearDebugTestMarker(Player player) { + } + + @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 Relative toNmsRelativeMovement(TeleportCommand.Relative relative) { + // TODO: 1.21.3: There seem to be more relative movement types now + return switch (relative) { + 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; + if (relativeAxis == null) { + relativeMovements = Relative.ALL; + } + else { + relativeMovements = EnumSet.noneOf(Relative.class); + for (TeleportCommand.Relative relative : relativeAxis) { + relativeMovements.add(toNmsRelativeMovement(relative)); + } + } + ClientboundPlayerPositionPacket packet = new ClientboundPlayerPositionPacket(0, new PositionMoveRotation(new Vec3(x, y, z), Vec3.ZERO, yaw, pitch), relativeMovements); + 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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/PlayerHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/PlayerHelperImpl.java new file mode 100644 index 0000000000..6f73e27c02 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/PlayerHelperImpl.java @@ -0,0 +1,509 @@ +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_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; +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 it.unimi.dsi.fastutil.ints.IntList; +import net.md_5.bungee.api.ChatColor; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.common.ClientboundUpdateTagsPacket; +import net.minecraft.network.protocol.game.*; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +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.NameAndId; +import net.minecraft.server.players.PlayerList; +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.effect.MobEffectInstance; +import net.minecraft.world.entity.Avatar; +import net.minecraft.world.entity.Leashable; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.PositionMoveRotation; +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; +import net.minecraft.world.level.storage.LevelData; +import net.minecraft.world.phys.AABB; +import org.bukkit.*; +import org.bukkit.boss.BossBar; +import org.bukkit.craftbukkit.v1_21_R7.CraftServer; +import org.bukkit.craftbukkit.v1_21_R7.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R7.boss.CraftBossBar; +import org.bukkit.craftbukkit.v1_21_R7.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R7.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R7.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_21_R7.util.CraftNamespacedKey; +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.*; +import java.util.function.Predicate; + +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_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); + + @Override + public void stopSound(Player player, NamespacedKey sound, SoundCategory category) { + ((CraftPlayer) player).getHandle().connection.send(new ClientboundStopSoundPacket(sound == null ? null : CraftNamespacedKey.toMinecraft(sound), null)); + } + + @Override + public void deTrackEntity(Player player, Entity entity) { + ServerPlayer nmsPlayer = ((CraftPlayer) player).getHandle(); + 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"); + } + 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); + } + } + + public record FakeEntitySynchronizer(ServerGamePacketListenerImpl target) implements ServerEntity.Synchronizer { + + @Override + public void sendToTrackingPlayers(Packet packet) { + target.send(packet); + } + + @Override + public void sendToTrackingPlayersAndSelf(Packet packet) { + sendToTrackingPlayers(packet); + } + + @Override + public void sendToTrackingPlayersFiltered(Packet packet, Predicate predicate) { + if (predicate.test(target.getPlayer())) { + sendToTrackingPlayers(packet); + } + } + + @Override + public void sendToTrackingPlayersFilteredAndSelf(Packet packet, Predicate predicate) { + sendToTrackingPlayersFiltered(packet, predicate); + } + } + + @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, new FakeEntitySynchronizer(conn), Set.of(conn)); + 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(); + NameAndId nameAndId = new NameAndId(((CraftPlayer) player).getProfile()); + ServerOpList opList = server.getPlayerList().getOps(); + if (op) { + opList.add(new ServerOpListEntry(nameAndId, server.operatorUserPermissions(), opList.canBypassPlayerLimit(nameAndId))); + } + else { + opList.remove(nameAndId); + } + 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) { + RecipeManager recipeManager = ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager(); + ClientboundUpdateRecipesPacket updatePacket = new ClientboundUpdateRecipesPacket(recipeManager.getSynchronizedItemProperties(), recipeManager.getSynchronizedStonecutterRecipes()); + ((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.id()); + try { + SERVER_RECIPE_BOOK_ADD_HIGHLIGHT.invoke(recipeBook, recipe.id()); + } + catch (Throwable e) { + Debug.echoError(e); + } + } + + @Override + public byte getSkinLayers(Player player) { + return ((CraftPlayer) player).getHandle().getEntityData().get(Avatar.DATA_PLAYER_MODE_CUSTOMISATION); + } + + @Override + public void setSkinLayers(Player player, byte flags) { + ((CraftPlayer) player).getHandle().getEntityData().set(Avatar.DATA_PLAYER_MODE_CUSTOMISATION, 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().getRespawnConfig().forced(); + } + + @Override + public void setSpawnForced(Player player, boolean forced) { + ServerPlayer nmsPlayer = ((CraftPlayer) player).getHandle(); + try { + ServerPlayer.RespawnConfig config = nmsPlayer.getRespawnConfig(); + config = new ServerPlayer.RespawnConfig(config.respawnData(), forced); + PLAYER_RESPAWNCONFIG_SETTER.invoke(nmsPlayer, config); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } + + @Override + public Location getBedSpawnLocation(Player player) { + ServerPlayer nmsPlayer = ((CraftPlayer) player).getHandle(); + ServerPlayer.RespawnConfig nmsRespawnConfig = nmsPlayer.getRespawnConfig(); + if (nmsRespawnConfig == null) { + return null; + } + LevelData.RespawnData nmsRespawnData = nmsRespawnConfig.respawnData(); + Level nmsWorld = MinecraftServer.getServer().getLevel(nmsRespawnData.dimension()); + return nmsWorld != null ? new Location(nmsWorld.getWorld(), nmsRespawnData.pos().getX(), nmsRespawnData.pos().getY(), nmsRespawnData.pos().getZ(), nmsRespawnData.yaw(), nmsRespawnData.pitch()) : null; + } + + @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 = ProfileEditorImpl.createGameProfile(id, name, texture, signature); + // 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))); + } + + @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 = nmsPlayer.level(); + nmsPlayer.connection.send(new ClientboundRespawnPacket(nmsPlayer.createCommonSpawnInfo(nmsWorld), ClientboundRespawnPacket.KEEP_ALL_DATA)); + nmsPlayer.connection.internalTeleport(PositionMoveRotation.of(nmsPlayer), Set.of()); + if (nmsPlayer.isPassenger()) { + nmsPlayer.connection.send(new ClientboundSetPassengersPacket(nmsPlayer.getVehicle())); + } + if (nmsPlayer.isVehicle()) { + nmsPlayer.connection.send(new ClientboundSetPassengersPacket(nmsPlayer)); + } + AABB boundingBox = AABB.ofSize(nmsPlayer.getBoundingBox().getCenter(), 32, 32, 32); + for (net.minecraft.world.entity.Entity nmsEntity : nmsWorld.getEntitiesOfClass(net.minecraft.world.entity.Entity.class, boundingBox, nmsEntity -> nmsEntity instanceof Leashable nmsLeashable && nmsPlayer.equals(nmsLeashable.getLeashHolder()))) { + nmsPlayer.connection.send(new ClientboundSetEntityLinkPacket(nmsEntity, 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.connection.send(new ClientboundSetExperiencePacket(nmsPlayer.experienceProgress, nmsPlayer.totalExperience, nmsPlayer.experienceLevel)); + for (MobEffectInstance nmsEffect : nmsPlayer.getActiveEffects()) { + nmsPlayer.connection.send(new ClientboundUpdateMobEffectPacket(nmsPlayer.getId(), nmsEffect, false)); + } + nmsPlayer.onUpdateAbilities(); + PlayerList nmsPlayerList = MinecraftServer.getServer().getPlayerList(); + nmsPlayerList.sendPlayerPermissionLevel(nmsPlayer); + nmsPlayerList.sendLevelInfo(nmsPlayer, nmsWorld); + nmsPlayerList.sendAllPlayerInfo(nmsPlayer); + } +} diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/WorldHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/WorldHelperImpl.java new file mode 100644 index 0000000000..5f70b7347e --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/WorldHelperImpl.java @@ -0,0 +1,111 @@ +package com.denizenscript.denizen.nms.v1_21.helpers; + +import com.denizenscript.denizen.nms.interfaces.WorldHelper; +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; +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_21_R7.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().isBrightOutside(); + } + + @Override + public boolean isNight(World world) { + return ((CraftWorld) world).getHandle().isDarkOutside(); + } + + @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().serverLevelData; + data.setRaining(false); + if (!data.isRaining()) { + data.setRainTime(0); + } + data.setThundering(false); + if (!data.isThundering()) { + data.setThunderTime(0); + } + } +} diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/BiomeNMSImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/BiomeNMSImpl.java new file mode 100644 index 0000000000..d360c4318a --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/BiomeNMSImpl.java @@ -0,0 +1,242 @@ +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_21.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.MappedRegistry; +import net.minecraft.core.RegistrationInfo; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.random.Weighted; +import net.minecraft.util.random.WeightedList; +import net.minecraft.world.attribute.EnvironmentAttribute; +import net.minecraft.world.attribute.EnvironmentAttributeMap; +import net.minecraft.world.attribute.EnvironmentAttributes; +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.NamespacedKey; +import org.bukkit.block.Block; +import org.bukkit.craftbukkit.v1_21_R7.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R7.entity.CraftEntityType; +import org.bukkit.craftbukkit.v1_21_R7.util.CraftLocation; +import org.bukkit.craftbukkit.v1_21_R7.util.CraftNamespacedKey; +import org.bukkit.entity.EntityType; + +import java.lang.invoke.MethodHandle; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +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 static final MethodHandle MAPPED_REGISTRY_REGISTRATION_INFOS = ReflectionHelper.getFields(MappedRegistry.class).getGetter(ReflectionMappingsInfo.MappedRegistry_registrationInfos); + public static final MethodHandle BIOME_ATTRIBUTES_SETTER = ReflectionHelper.getFields(Biome.class).getSetter(ReflectionMappingsInfo.Biome_attributes); + + public Holder.Reference biomeHolder; + public ServerLevel world; + + public BiomeNMSImpl(ServerLevel world, NamespacedKey key) { + super(world.getWorld(), key); + this.world = world; + this.biomeHolder = getBiomeRegistry().get(ResourceKey.create(Registries.BIOME, CraftNamespacedKey.toMinecraft(key))).orElse(null); + } + + private MappedRegistry getBiomeRegistry() { + return (MappedRegistry) world.registryAccess().lookupOrThrow(Registries.BIOME); + } + + @Override + public DownfallType getDownfallTypeAt(Location location) { + Biome.Precipitation precipitation = biomeHolder.value().getPrecipitationAt(CraftLocation.toBlockPosition(location), world.getSeaLevel()); + 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), world.getSeaLevel()); + } + + @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); + setNetworkedRegistrationInfo(); + } + 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) { + BiomeSpecialEffects nmsCurrEffects = biomeHolder.value().getSpecialEffects(); + BiomeSpecialEffects nmsNewEffects = new BiomeSpecialEffects( + nmsCurrEffects.waterColor(), Optional.of(color), nmsCurrEffects.dryFoliageColorOverride(), nmsCurrEffects.grassColorOverride(), nmsCurrEffects.grassColorModifier() + ); + ReflectionHelper.setFieldValue(Biome.class, ReflectionMappingsInfo.Biome_specialEffects, biomeHolder.value(), nmsNewEffects); + setNetworkedRegistrationInfo(); + } + + @Override + public int getFogColor() { + return getEnvironmentAttribute(EnvironmentAttributes.FOG_COLOR); + } + + @Override + public void setFogColor(int color) { + setEnvironmentAttribute(EnvironmentAttributes.FOG_COLOR, color); + } + + @Override + public int getWaterFogColor() { + return getEnvironmentAttribute(EnvironmentAttributes.WATER_FOG_COLOR); + } + + @Override + public void setWaterFogColor(int color) { + setEnvironmentAttribute(EnvironmentAttributes.WATER_FOG_COLOR, color); + } + + public T getEnvironmentAttribute(EnvironmentAttribute attribute) { + return biomeHolder.value().getAttributes().applyModifier(attribute, attribute.defaultValue()); + } + + public void setEnvironmentAttribute(EnvironmentAttribute attribute, T value) { + Biome nmsBiome = biomeHolder.value(); + EnvironmentAttributeMap newAttributeMap = EnvironmentAttributeMap.builder().putAll(nmsBiome.getAttributes()).set(attribute, value).build(); + try { + BIOME_ATTRIBUTES_SETTER.invokeExact(nmsBiome, newAttributeMap); + } + catch (Throwable e) { + Debug.echoError(e); + } + setNetworkedRegistrationInfo(); + } + + private List getSpawnableEntities(MobCategory creatureType) { + MobSpawnSettings mobs = biomeHolder.value().getMobSettings(); + WeightedList typeSettingList = mobs.getMobs(creatureType); + List entityTypes = new ArrayList<>(); + if (typeSettingList == null) { + return entityTypes; + } + for (Weighted meta : typeSettingList.unwrap()) { + entityTypes.add(CraftEntityType.minecraftToBukkit(meta.value().type())); + } + return entityTypes; + } + + @Override + public void setTo(Block block) { + if (((CraftWorld) block.getWorld()).getHandle() != this.world) { + NMSHandler.instance.getBiomeNMS(block.getWorld(), getKey()).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.markUnsaved(); + } + } + } + + public Biome.TemperatureModifier getTemperatureModifier() { + return biomeHolder.value().climateSettings.temperatureModifier(); + } + + private void setNetworkedRegistrationInfo() { + try { + Map, RegistrationInfo> registrationInfos = (Map, RegistrationInfo>) MAPPED_REGISTRY_REGISTRATION_INFOS.invokeExact(getBiomeRegistry()); + registrationInfos.put(biomeHolder.key(), RegistrationInfo.BUILT_IN); + } + catch (Throwable e) { + Debug.echoError("Failed to set biome registration info, changes may not be synced correctly."); + Debug.echoError(e); + } + } +} diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/ImprovedOfflinePlayerImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/ImprovedOfflinePlayerImpl.java new file mode 100644 index 0000000000..7a33a97f69 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/ImprovedOfflinePlayerImpl.java @@ -0,0 +1,171 @@ +package com.denizenscript.denizen.nms.v1_21.impl; + +import com.denizenscript.denizen.nms.abstracts.ImprovedOfflinePlayer; +import com.denizenscript.denizen.nms.v1_21.Handler; +import com.denizenscript.denizen.nms.v1_21.helpers.NBTAdapter; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import com.mojang.authlib.GameProfile; +import net.kyori.adventure.nbt.CompoundBinaryTag; +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; +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 net.minecraft.world.level.storage.ValueOutput; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_21_R7.CraftServer; +import org.bukkit.craftbukkit.v1_21_R7.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftInventory; +import org.bukkit.craftbukkit.v1_21_R7.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; +import java.util.function.Consumer; + +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, new EntityEquipment()); // TODO: 1.21.5: is the new Equipment right here? + } + + @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; + } + } + + 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; + } + + public void editData(Consumer editor) { + this.compound = NBTAdapter.toAPI(Handler.useValueOutput(NBTAdapter.toNMS(this.compound), editor)); + markModified(); + } + + @Override + public org.bukkit.inventory.PlayerInventory getInventory() { + if (inventory == null) { + net.minecraft.world.entity.player.Inventory newInv = new OfflinePlayerInventory(getFakeNmsPlayer()); + Handler.useValueInput(NBTAdapter.toNMS(this.compound), valueInput -> newInv.load(valueInput.listOrEmpty("Inventory", ItemStackWithSlot.CODEC))); + inventory = new OfflineCraftInventoryPlayer(newInv); + } + return inventory; + } + + @Override + public void setInventory(org.bukkit.inventory.PlayerInventory inventory) { + CraftInventoryPlayer inv = (CraftInventoryPlayer) inventory; + editData(valueOutput -> inv.getInventory().save(valueOutput.list("Inventory", ItemStackWithSlot.CODEC))); + } + + @Override + public Inventory getEnderChest() { + if (enderchest == null) { + PlayerEnderChestContainer nmsEnderChest = new PlayerEnderChestContainer(getFakeNmsPlayer()); + Handler.useValueInput(NBTAdapter.toNMS(this.compound), valueInput -> nmsEnderChest.fromSlots(valueInput.listOrEmpty("EnderItems", ItemStackWithSlot.CODEC))); + enderchest = new CraftInventory(nmsEnderChest); + } + return enderchest; + } + + @Override + public void setEnderChest(Inventory inventory) { + editData(valueOutput -> ((PlayerEnderChestContainer) ((CraftInventory) inventory).getInventory()).storeAsSlots(valueOutput.list("EnderItems", ItemStackWithSlot.CODEC))); + } + + @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)); + Handler.useValueInput(NBTAdapter.toNMS(this.compound), valueInput -> valueInput.read("attributes", AttributeInstance.Packed.LIST_CODEC).ifPresent(amb::apply)); + return amb; + } + + public void setAttributes(AttributeMap attributes) { + editData(valueOutput -> valueOutput.store("attributes", AttributeInstance.Packed.LIST_CODEC, attributes.pack())); + } + + @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 = NBTAdapter.toAPI(NbtIo.readCompressed(new FileInputStream(this.file), NbtAccounter.unlimitedHeap())); + return true; + } + } + } + catch (Exception e) { + Debug.echoError(e); + } + return false; + } + + @Override + public void saveInternal(CompoundBinaryTag compound) { + try { + NbtIo.writeCompressed(NBTAdapter.toNMS(compound), new FileOutputStream(this.file)); + } + catch (Exception e) { + Debug.echoError(e); + } + } +} diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/ProfileEditorImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/ProfileEditorImpl.java new file mode 100644 index 0000000000..196c039c05 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/ProfileEditorImpl.java @@ -0,0 +1,169 @@ +package com.denizenscript.denizen.nms.v1_21.impl; + +import com.denizenscript.denizen.Denizen; +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_21.Handler; +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.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.google.common.collect.ImmutableMultimap; +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.properties.Property; +import com.mojang.authlib.properties.PropertyMap; +import com.mojang.datafixers.util.Either; +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.ServerPlayer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.component.ResolvableProfile; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_21_R7.CraftServer; +import org.bukkit.craftbukkit.v1_21_R7.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerRespawnEvent; + +import java.lang.invoke.MethodHandle; +import java.lang.reflect.Field; +import java.util.*; + +public class ProfileEditorImpl extends ProfileEditor { + + @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, true, Entity.RemovalReason.CHANGED_DIMENSION, PlayerRespawnEvent.RespawnReason.PLUGIN); + } + else { + NMSHandler.playerHelper.refreshPlayer(player); + } + 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(); + PropertyMap modifiedProperties; + if (ProfileEditor.mirrorUUIDs.contains(entry.profileId())) { + modifiedProperties = ownProfile.properties(); + } + else { + // On Paper 1.19+, we use Paper's PlayerProfile API instead of this system + modifiedProperties = Denizen.supportsPaper ? entry.profile().properties() : baseProfile.properties(); + } + GameProfile modifiedProfile = new GameProfile(baseProfile.id(), rename != null ? (rename.length() > 16 ? rename.substring(0, 16) : rename) : baseProfile.name(), modifiedProperties); + 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.showHat(), entry.listOrder(), 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 createGameProfile(UUID uuid, String name, String texture, String signature) { + return new GameProfile( + uuid != null ? uuid : NIL_UUID, name != null ? name : EMPTY_NAME, + texture != null ? new PropertyMap(ImmutableMultimap.of("textures", new Property("textures", texture, signature))) : PropertyMap.EMPTY + ); + } + + public static GameProfile getGameProfileNoProperties(PlayerProfile playerProfile) { + return createGameProfile(playerProfile.getUniqueId(), playerProfile.getName(), null, null); + } + + public static GameProfile getGameProfile(PlayerProfile playerProfile) { + return createGameProfile(playerProfile.getUniqueId(), playerProfile.getName(), playerProfile.getTexture(), playerProfile.getTextureSignature()); + } + + public static final MethodHandle RESOLVABLEPROFILE_UNPACK = ReflectionHelper.getMethodHandle(ResolvableProfile.class, ReflectionMappingsInfo.ResolvableProfile_unpack_method); + public static final MethodHandle RESOLVABLEPROFILE_PARTIAL_ID = ReflectionHelper + .getFields(ReflectionHelper.getClassOrThrow("net.minecraft.world.item.component.ResolvableProfile$Partial")) + .getGetter(ReflectionMappingsInfo.ResolvableProfilePartial_id, Optional.class); + + public static UUID getUUID(ResolvableProfile resolvableProfile) { + try { + Either unpacked = (Either) RESOLVABLEPROFILE_UNPACK.invokeExact(resolvableProfile); + return unpacked.map(GameProfile::id, + partial -> { + try { + Optional uuid = (Optional) RESOLVABLEPROFILE_PARTIAL_ID.invoke(partial); + return uuid.orElse(null); + } + catch (Throwable e) { + Debug.echoError(e); + return null; + } + } + ); + } + catch (Throwable e) { + Debug.echoError(e); + return null; + } + } +} diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/SidebarImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/SidebarImpl.java new file mode 100644 index 0000000000..e765aa1487 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/SidebarImpl.java @@ -0,0 +1,103 @@ +package com.denizenscript.denizen.nms.v1_21.impl; + +import com.denizenscript.denizen.nms.abstracts.Sidebar; +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.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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/blocks/BlockLightImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/blocks/BlockLightImpl.java new file mode 100644 index 0000000000..78c81da8e2 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/blocks/BlockLightImpl.java @@ -0,0 +1,264 @@ +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_21.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_21_R7.CraftChunk; +import org.bukkit.craftbukkit.v1_21_R7.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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/CraftFakeArrowImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/CraftFakeArrowImpl.java new file mode 100644 index 0000000000..4b45bfded0 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/CraftFakeArrowImpl.java @@ -0,0 +1,26 @@ +package com.denizenscript.denizen.nms.v1_21.impl.entities; + +import com.denizenscript.denizen.nms.interfaces.FakeArrow; +import net.minecraft.world.entity.projectile.arrow.AbstractArrow; +import org.bukkit.craftbukkit.v1_21_R7.CraftServer; +import org.bukkit.craftbukkit.v1_21_R7.entity.CraftAbstractArrow; + +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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/CraftFakePlayerImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/CraftFakePlayerImpl.java new file mode 100644 index 0000000000..92a5ac8942 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/CraftFakePlayerImpl.java @@ -0,0 +1,66 @@ +package com.denizenscript.denizen.nms.v1_21.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_21_R7.CraftServer; +import org.bukkit.craftbukkit.v1_21_R7.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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/CraftItemProjectileImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/CraftItemProjectileImpl.java new file mode 100644 index 0000000000..a2b8de7f84 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/CraftItemProjectileImpl.java @@ -0,0 +1,117 @@ +package com.denizenscript.denizen.nms.v1_21.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_21_R7.CraftServer; +import org.bukkit.craftbukkit.v1_21_R7.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R7.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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityFakeArrowImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityFakeArrowImpl.java new file mode 100644 index 0000000000..bad4b878de --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityFakeArrowImpl.java @@ -0,0 +1,43 @@ +package com.denizenscript.denizen.nms.v1_21.impl.entities; + +import com.denizenscript.denizen.nms.v1_21.Handler; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.minecraft.world.entity.projectile.arrow.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_21_R7.CraftServer; +import org.bukkit.craftbukkit.v1_21_R7.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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityFakePlayerImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityFakePlayerImpl.java new file mode 100644 index 0000000000..9c64a6636b --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityFakePlayerImpl.java @@ -0,0 +1,43 @@ +package com.denizenscript.denizen.nms.v1_21.impl.entities; + +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.denizenscript.denizencore.utilities.debugging.Debug; +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.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.CommonListenerCookie; +import net.minecraft.world.entity.player.Player; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_21_R7.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)); + 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); + } + 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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityItemProjectileImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityItemProjectileImpl.java new file mode 100644 index 0000000000..21373b58c0 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityItemProjectileImpl.java @@ -0,0 +1,106 @@ +package com.denizenscript.denizen.nms.v1_21.impl.entities; + +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; +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.level.storage.ValueInput; +import net.minecraft.world.level.storage.ValueOutput; +import net.minecraft.world.phys.BlockHitResult; +import org.bukkit.Location; + +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(ValueOutput nmsValueOutput) { + if (!this.getItemStack().isEmpty()) { + nmsValueOutput.store("Item", ItemStack.CODEC, this.getItemStack()); + } + super.save(nmsValueOutput); + return true; + } + + @Override + public void load(ValueInput nmsValueInput) { + ItemStack nmsItemStack = nmsValueInput.read("Item", ItemStack.CODEC).orElse(ItemStack.EMPTY); + if (nmsItemStack.isEmpty()) { + this.remove(RemovalReason.KILLED); + } + else { + this.setItemStack(nmsItemStack); + } + super.load(nmsValueInput); + } + + @Override + public CraftItemProjectileImpl getBukkitEntity() { + return (CraftItemProjectileImpl) super.getBukkitEntity(); + } +} diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/fakes/FakeChannelImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/fakes/FakeChannelImpl.java new file mode 100644 index 0000000000..f3b1953ca3 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/fakes/FakeChannelImpl.java @@ -0,0 +1,80 @@ +package com.denizenscript.denizen.nms.v1_21.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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/fakes/FakeNetworkManagerImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/fakes/FakeNetworkManagerImpl.java new file mode 100644 index 0000000000..ca0c9e0f7f --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/fakes/FakeNetworkManagerImpl.java @@ -0,0 +1,16 @@ +package com.denizenscript.denizen.nms.v1_21.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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/fakes/FakePlayerConnectionImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/fakes/FakePlayerConnectionImpl.java new file mode 100644 index 0000000000..4c4d11ac3c --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/fakes/FakePlayerConnectionImpl.java @@ -0,0 +1,20 @@ +package com.denizenscript.denizen.nms.v1_21.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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/AbstractListenerPlayInImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/AbstractListenerPlayInImpl.java new file mode 100644 index 0000000000..d67b131ff5 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/AbstractListenerPlayInImpl.java @@ -0,0 +1,671 @@ +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_21.ReflectionMappingsInfo; +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.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; +import net.minecraft.server.level.ClientInformation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.CommonListenerCookie; +import net.minecraft.server.network.ServerCommonPacketListenerImpl; +import net.minecraft.server.network.ServerGamePacketListenerImpl; +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_R7.entity.CraftPlayer; +import org.bukkit.event.player.PlayerTeleportEvent; + +import java.lang.invoke.MethodHandle; +import java.lang.reflect.Field; +import java.net.SocketAddress; +import java.util.Set; + +public class AbstractListenerPlayInImpl extends ServerGamePacketListenerImpl { + + public static final Field ServerGamePacketListenerImpl_chunkSender = ReflectionHelper.getFields(ServerGamePacketListenerImpl.class).get(ReflectionMappingsInfo.ServerGamePacketListenerImpl_chunkSender); + + public static final MethodHandle SERVER_COMMON_PACKET_LISTENER_IMPL_CREATE_COOKIE = ReflectionHelper.getMethodHandle(ServerCommonPacketListenerImpl.class, ReflectionMappingsInfo.ServerCommonPacketListenerImpl_createCookie_method, ClientInformation.class); + + public static CommonListenerCookie createCookie(ServerPlayer nmsPlayer) { + try { + return (CommonListenerCookie) SERVER_COMMON_PACKET_LISTENER_IMPL_CREATE_COOKIE.invoke(nmsPlayer.connection, nmsPlayer.clientInformation()); + } + catch (Throwable e) { + throw new RuntimeException(e); + } + } + + public final ServerGamePacketListenerImpl oldListener; + public final DenizenNetworkManagerImpl denizenNetworkManager; + + public AbstractListenerPlayInImpl(DenizenNetworkManagerImpl networkManager, ServerPlayer entityPlayer, ServerGamePacketListenerImpl oldListener) { + super(MinecraftServer.getServer(), networkManager, entityPlayer, createCookie(entityPlayer)); + 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(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); + } + + @Override + 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 + public void teleport(PositionMoveRotation positionmoverotation, Set set) { + oldListener.teleport(positionmoverotation, set); + } + + @Override + public boolean teleport(PositionMoveRotation positionmoverotation, Set set, PlayerTeleportEvent.TeleportCause cause) { + return oldListener.teleport(positionmoverotation, set, cause); + } + + @Override + 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(); + } + + @Override + public void tick() { + oldListener.tick(); + } + + @Override + public void resetPosition() { + oldListener.resetPosition(); + } + + @Override + 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); + } + + @Override + public void fillListenerSpecificCrashDetails(CrashReport var0, CrashReportCategory var1) { + oldListener.fillListenerSpecificCrashDetails(var0, var1); + } + + @Override + public GameProfile getOwner() { + return oldListener.getOwner(); + } + + @Override + public int latency() { + return oldListener.latency(); + } + + @Override + public void onDisconnect(DisconnectionDetails disconnectionDetails) { + oldListener.onDisconnect(disconnectionDetails); + } + + @Override + public void ackBlockChangesUpTo(int i) { + oldListener.ackBlockChangesUpTo(i); + } + + @Override + public void send(Packet packet) { + oldListener.send(packet); + } + + @Override + 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); + 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 handleAcceptPlayerLoad(ServerboundPlayerLoadedPacket packet) { + if (handlePacketIn(packet)) { return; } + 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 + 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 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; } + 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 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 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 boolean hasInfiniteMaterials() { + return oldListener.hasInfiniteMaterials(); + } + + @Override + public void handleContainerSlotStateChanged(ServerboundContainerSlotStateChangedPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleContainerSlotStateChanged(packet); + } + + @Override + public void handleDebugSubscriptionRequest(ServerboundDebugSubscriptionRequestPacket packet) { + if (handlePacketIn(packet)) { return; } + oldListener.handleDebugSubscriptionRequest(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 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(); + } + + @Override + 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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/DenizenNetworkManagerImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/DenizenNetworkManagerImpl.java new file mode 100644 index 0000000000..d725381ce0 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -0,0 +1,580 @@ +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_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; +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.*; +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 net.minecraft.util.debugchart.LocalSampleLogger; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_21_R7.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R7.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R7.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 { + + public static > T copyPacket(T original, StreamCodec packetCodec) { + try { + RegistryFriendlyByteBuf copier = new RegistryFriendlyByteBuf(Unpooled.buffer(), CraftRegistry.getMinecraftRegistry()); + packetCodec.encode(copier, original); + return packetCodec.decode(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 + 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()) { + 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 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); + } + + 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.getMovement()); + } + 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().name() + "/id=" + p.profile().id() + "/" + + p.profile().properties().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, ChannelFutureListener channelFutureListener) { + send(packet, channelFutureListener, true); + } + + @Override + 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 + && !(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, channelFutureListener, 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, channelFutureListener, 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 void disconnect(DisconnectionDetails disconnectiondetails) { + oldManager.disconnect(disconnectiondetails); + } + + @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 DisconnectionDetails getDisconnectionDetails() { + return oldManager.getDisconnectionDetails(); + } + + @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(); + } + + @Override + public void setBandwidthLogger(LocalSampleLogger localsamplelogger) { + oldManager.setBandwidthLogger(localsamplelogger); + } + + ////////////////////////////////// + //// 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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/DenizenPacketListenerImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/DenizenPacketListenerImpl.java new file mode 100644 index 0000000000..ed03d1ee48 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/DenizenPacketListenerImpl.java @@ -0,0 +1,121 @@ +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_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; +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 org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_21_R7.block.CraftBlock; +import org.bukkit.event.block.SignChangeEvent; + +public class DenizenPacketListenerImpl extends AbstractListenerPlayInImpl { + + public BlockPos fakeSignExpected; + + public DenizenPacketListenerImpl(DenizenNetworkManagerImpl networkManager, ServerPlayer entityPlayer) { + super(networkManager, entityPlayer, entityPlayer.connection); + } + + @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.containerId() == 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)) { + 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()); + 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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/FakeBlockHelper.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/FakeBlockHelper.java new file mode 100644 index 0000000000..13ca382b8b --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/FakeBlockHelper.java @@ -0,0 +1,168 @@ +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers; + +import com.denizenscript.denizen.Denizen; +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.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; +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 net.minecraft.world.level.chunk.Strategy; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_21_R7.CraftRegistry; +import org.bukkit.craftbukkit.v1_21_R7.CraftWorld; +import org.bukkit.craftbukkit.v1_21_R7.block.CraftBlockStates; +import org.bukkit.craftbukkit.v1_21_R7.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() == 2).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 = 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().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" + PalettedContainer states = (PalettedContainer) PALETTEDCONTAINER_CTOR.newInstance(Blocks.AIR.defaultBlockState(), Strategy.createForBlockStates(Block.BLOCK_STATE_REGISTRY)); + states.read(serial); + PalettedContainer biomes = (PalettedContainer) PALETTEDCONTAINER_CTOR.newInstance(biomeRegistry.getOrThrow(Biomes.PLAINS), Strategy.createForBiomes(biomeRegistry)); + 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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/ActionBarEventPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/ActionBarEventPacketHandlers.java new file mode 100644 index 0000000000..62ad8bd09b --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/ActionBarEventPacketHandlers.java @@ -0,0 +1,39 @@ +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; + +import com.denizenscript.denizen.events.player.PlayerReceivesActionbarScriptEvent; +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; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.game.ClientboundSetActionBarTextPacket; +import org.bukkit.craftbukkit.v1_21_R7.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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/AttachPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/AttachPacketHandlers.java new file mode 100644 index 0000000000..7219ee9108 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/AttachPacketHandlers.java @@ -0,0 +1,310 @@ +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.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 net.minecraft.world.entity.PositionMoveRotation; +import net.minecraft.world.phys.Vec3; +import org.bukkit.craftbukkit.v1_21_R7.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_21_R7.util.CraftVector; +import org.bukkit.util.Vector; + +import java.lang.reflect.Field; +import java.util.Set; + +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_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, 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()); + } + 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; + float yaw, pitch; + if (att.noRotate) { + Entity attachedEntity = ((CraftEntity) att.attached.getBukkitEntity()).getHandle(); + yaw = attachedEntity.getYRot(); + pitch = attachedEntity.getXRot(); + } + else if (isRotate) { + yaw = packet.getYRot(); + pitch = packet.getXRot(); + } + else { + yaw = e.getYRot(); + pitch = e.getXRot(); + } + if (att.noPitch) { + pitch = ((CraftEntity) att.attached.getBukkitEntity()).getHandle().getXRot(); + } + float newYaw = yaw; + if (isRotate) { + 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()); + 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( + 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); + } + 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, 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); + } + 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) { + float yaw = packet.getYHeadRot(); + Entity attachedEntity = ((CraftEntity) att.attached.getBukkitEntity()).getHandle(); + if (att.positionalOffset != null) { + if (att.noRotate) { + yaw = attachedEntity.getYRot(); + } + yaw = EntityAttachmentHelper.normalizeAngle(yaw + att.positionalOffset.getYaw()); + } + 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()); + } + 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 = 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; + Vector resultPos = CraftVector.toBukkit(packet.change().position()).add(relative); + if (att.positionalOffset != null) { + resultPos = att.fixedForOffset(resultPos, e.getYRot(), e.getXRot()); + float yaw, pitch; + if (att.noRotate) { + Entity attachedEntity = ((CraftEntity) att.attached.getBukkitEntity()).getHandle(); + yaw = attachedEntity.getYRot(); + pitch = attachedEntity.getXRot(); + } + else { + yaw = packet.change().yRot(); + pitch = packet.change().xRot(); + } + if (att.noPitch) { + pitch = ((CraftEntity) att.attached.getBukkitEntity()).getHandle().getXRot(); + } + 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), + 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); + } + } + } + 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.id(); + 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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/BlockLightPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/BlockLightPacketHandlers.java new file mode 100644 index 0000000000..2e53cedab2 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/BlockLightPacketHandlers.java @@ -0,0 +1,27 @@ +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; + +import com.denizenscript.denizen.nms.abstracts.BlockLight; +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; + +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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/DenizenPacketHandlerPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/DenizenPacketHandlerPacketHandlers.java new file mode 100644 index 0000000000..cd8abd286c --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/DenizenPacketHandlerPacketHandlers.java @@ -0,0 +1,47 @@ +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; + +import com.denizenscript.denizen.events.player.PlayerReceivesMessageScriptEvent; +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; +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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/DisguisePacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/DisguisePacketHandlers.java new file mode 100644 index 0000000000..a15b517fb5 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/DisguisePacketHandlers.java @@ -0,0 +1,160 @@ +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; + +import com.denizenscript.denizen.nms.NMSHandler; +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 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_R7.entity.CraftEntity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; + +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::id, DisguisePacketHandlers::processTeleportPacket); + registerPacketHandler(ClientboundMoveEntityPacket.Rot.class, ClientboundMoveEntityPacket::getEntity, DisguisePacketHandlers::processMoveEntityRotPacket); + registerPacketHandler(ClientboundMoveEntityPacket.PosRot.class, ClientboundMoveEntityPacket::getEntity, DisguisePacketHandlers::processMoveEntityPosRotPacket); + } + + 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) { + PositionMoveRotation oldChange = teleportEntityPacket.change(); + return new ClientboundTeleportEntityPacket( + teleportEntityPacket.id(), + new PositionMoveRotation(oldChange.position(), oldChange.deltaMovement(), EntityAttachmentHelper.normalizeAngle(oldChange.yRot() + 180), oldChange.xRot()), + teleportEntityPacket.relatives(), + teleportEntityPacket.onGround() + ); + } + 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.compressAngle(rotPacket.getYRot() + 180), + Mth.packDegrees(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.compressAngle(posRotPacket.getYRot() + 180), + Mth.packDegrees(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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/EntityMetadataPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/EntityMetadataPacketHandlers.java new file mode 100644 index 0000000000..ee538c2b83 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/EntityMetadataPacketHandlers.java @@ -0,0 +1,92 @@ +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; + +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; +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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakeBlocksPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakeBlocksPacketHandlers.java new file mode 100644 index 0000000000..4938114cac --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakeBlocksPacketHandlers.java @@ -0,0 +1,112 @@ +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; + +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; +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 sectionBlocksUpdatePacket) { + FakeBlock.FakeBlockMap map = FakeBlock.blocks.get(networkManager.player.getUUID()); + if (map == null) { + return sectionBlocksUpdatePacket; + } + 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 sectionBlocksUpdatePacket; + } + 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); + 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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java new file mode 100644 index 0000000000..97d21d284a --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java @@ -0,0 +1,138 @@ +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; + +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; +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_21_R7.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? + case SADDLE -> pair.getSecond(); // TODO: 1.21.5: same as above + }; + 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.containerId() != 0) { + return setContentPacket; + } + FakeEquipCommand.EquipmentOverride override = FakeEquipCommand.getOverrideFor(networkManager.player.getUUID(), networkManager.player.getBukkitEntity()); + if (override == null) { + return setContentPacket; + } + List items = setContentPacket.items(); + 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.containerId(), setContentPacket.stateId(), items, setContentPacket.carriedItem()); + } + + 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().getSelectedSlot() + 36; + } +} diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakePlayerPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakePlayerPacketHandlers.java new file mode 100644 index 0000000000..dff04ee9a5 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakePlayerPacketHandlers.java @@ -0,0 +1,29 @@ +package com.denizenscript.denizen.nms.v1_21.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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java new file mode 100644 index 0000000000..cac24bc7d8 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java @@ -0,0 +1,69 @@ +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; + +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; +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(); + } + //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()); + } + 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).id(); + } + 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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/HideParticlesPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/HideParticlesPacketHandlers.java new file mode 100644 index 0000000000..09328473fc --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/HideParticlesPacketHandlers.java @@ -0,0 +1,31 @@ +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; + +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; +import org.bukkit.craftbukkit.v1_21_R7.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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/PlayerHearsSoundEventPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/PlayerHearsSoundEventPacketHandlers.java new file mode 100644 index 0000000000..4dad338a67 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/PlayerHearsSoundEventPacketHandlers.java @@ -0,0 +1,39 @@ +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; + +import com.denizenscript.denizen.events.player.PlayerHearsSoundScriptEvent; +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; +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().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) { + 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().location().getPath(), spacket.getSource().name(), + false, entity.getBukkitEntity(), null, spacket.getVolume(), spacket.getPitch()) ? null : packet; + } + return packet; + } +} diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java new file mode 100644 index 0000000000..21e5d5ba0c --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java @@ -0,0 +1,126 @@ +package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; + +import com.denizenscript.denizen.events.player.PlayerReceivesTablistUpdateScriptEvent; +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; +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.properties().containsKey("textures")) { + Property property = profile.properties().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.id(), update.listed(), profile.name(), + 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 = ProfileEditorImpl.createGameProfile(data.id, data.name, data.texture, data.signature); + ClientboundPlayerInfoUpdatePacket.Entry entry = new ClientboundPlayerInfoUpdatePacket.Entry(newProfile.id(), 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.showHat(), update.listOrder(), 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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/packets/PacketInResourcePackStatusImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/packets/PacketInResourcePackStatusImpl.java new file mode 100644 index 0000000000..9069658423 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/packets/PacketInResourcePackStatusImpl.java @@ -0,0 +1,18 @@ +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; + +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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/packets/PacketInSteerVehicleImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/packets/PacketInSteerVehicleImpl.java new file mode 100644 index 0000000000..ce2c293c29 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/packets/PacketInSteerVehicleImpl.java @@ -0,0 +1,33 @@ +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; + +public class PacketInSteerVehicleImpl implements PacketInSteerVehicle { + + private ServerboundPlayerInputPacket internal; + + public PacketInSteerVehicleImpl(ServerboundPlayerInputPacket internal) { + this.internal = internal; + } + + @Override + public float getLeftwardInput() { + return internal.input().left() ? 1 : 0; + } + + @Override + public float getForwardInput() { + return internal.input().forward() ? 1 : 0; + } + + @Override + public boolean getJumpInput() { + return internal.input().jump(); + } + + @Override + public boolean getDismountInput() { + return internal.input().shift(); + } +} diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/packets/PacketOutChatImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/packets/PacketOutChatImpl.java new file mode 100644 index 0000000000..13d5d02757 --- /dev/null +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/packets/PacketOutChatImpl.java @@ -0,0 +1,50 @@ +package com.denizenscript.denizen.nms.v1_21.impl.network.packets; + +import com.denizenscript.denizen.nms.interfaces.packets.PacketOutChat; +import com.denizenscript.denizen.utilities.FormattedTextHelper; +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_R7.util.CraftChatMessage; + +public class PacketOutChatImpl extends PacketOutChat { + + public ClientboundPlayerChatPacket playerPacket; + public ClientboundSystemChatPacket systemPacket; + public String message; + public String rawJson; + public boolean isOverlayActionbar; + + public PacketOutChatImpl(ClientboundSystemChatPacket internal) { + systemPacket = internal; + rawJson = CraftChatMessage.toJSON(internal.content()); + message = FormattedTextHelper.stringify(FormattedTextHelper.parseJson(rawJson)); + isOverlayActionbar = internal.overlay(); + } + + public PacketOutChatImpl(ClientboundPlayerChatPacket internal) { + playerPacket = internal; + rawJson = ComponentSerializer.toString(internal.body().content()); + message = FormattedTextHelper.stringify(FormattedTextHelper.parseJson(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 3bb9efde9b489843287e529ac3b6b6528ebb5cd0 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Wed, 25 Mar 2026 14:52:48 +0000 Subject: [PATCH 2/7] 26.1 part 2: bump versions --- README.md | 2 +- dist/pom.xml | 6 +++ plugin/pom.xml | 2 +- pom.xml | 1 + v26_1/pom.xml | 40 ++----------------- .../denizen/nms/v26_1/Handler.java | 2 +- 6 files changed, 13 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index adf885b898..5246dcd86e 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.11! +**Version 1.3.1**: Compatible with Spigot 1.17.1, 1.18.2, 1.19.4, 1.20.6, 1.21.11, and 26.1! **Learn about Denizen from the Beginner's guide:** https://guide.denizenscript.com/guides/background/index.html diff --git a/dist/pom.xml b/dist/pom.xml index 25100bb2e5..a379213c15 100644 --- a/dist/pom.xml +++ b/dist/pom.xml @@ -60,6 +60,12 @@ ${project.parent.version} compile + + com.denizenscript + denizen-v26_1 + ${project.parent.version} + compile + com.denizenscript denizen-paper diff --git a/plugin/pom.xml b/plugin/pom.xml index f1abe6f709..a6a069d70b 100644 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -30,7 +30,7 @@ org.spigotmc spigot-api - 1.21.11-R0.2-SNAPSHOT + 26.1-R0.1-SNAPSHOT jar provided diff --git a/pom.xml b/pom.xml index a5c28e2ada..237da72570 100644 --- a/pom.xml +++ b/pom.xml @@ -18,6 +18,7 @@ plugin paper + v26_1 v1_21 v1_20 v1_19 diff --git a/v26_1/pom.xml b/v26_1/pom.xml index 1449c8e8a8..0b20031d3d 100644 --- a/v26_1/pom.xml +++ b/v26_1/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.denizenscript - denizen-v1_21 + denizen-v26_1 1.3.1-SNAPSHOT @@ -19,53 +19,19 @@ org.spigotmc spigot-api - 1.21.11-R0.2-SNAPSHOT + 26.1-R0.1-SNAPSHOT provided org.spigotmc spigot - 1.21.11-R0.2-SNAPSHOT - remapped-mojang + 26.1-R0.1-SNAPSHOT provided - - net.md-5 - specialsource-maven-plugin - 2.0.2 - - - package - - remap - - remap-obf - - org.spigotmc:minecraft-server:1.21.11-R0.2-SNAPSHOT:txt:maps-mojang - true - org.spigotmc:spigot:1.21.11-R0.2-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.21.11-R0.2-SNAPSHOT:csrg:maps-spigot - org.spigotmc:spigot:1.21.11-R0.2-SNAPSHOT:jar:remapped-obf - - - - org.apache.maven.plugins maven-compiler-plugin diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/Handler.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/Handler.java index 01ffc5fac9..3e1fa23ae5 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/Handler.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/Handler.java @@ -150,7 +150,7 @@ public void undisableAsyncCatcher() { @Override public boolean isExactServerVersionMatch() { - return Denizen.supportsPaper ? SharedConstants.getCurrentVersion().id().equals("1.21.11") : CraftMagicNumbers.INSTANCE.getMappingsVersion().equals("e3cd927e07e6ff434793a0474c51b2b9"); + return Denizen.supportsPaper ? SharedConstants.getCurrentVersion().id().equals("26.1") : CraftMagicNumbers.INSTANCE.getMappingsVersion().equals("e8ece90188c951d866bd2fffc52c803e"); } @Override From b336d975dd3bab803ee17e78e91db451c3dd97f4 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Wed, 25 Mar 2026 15:08:09 +0000 Subject: [PATCH 3/7] 26.1 part 3: handle import versions --- .../denizen/nms/v26_1/Handler.java | 38 +++++++++---------- .../nms/v26_1/ReflectionMappingsInfo.java | 2 +- .../v26_1/helpers/AdvancementHelperImpl.java | 12 +++--- .../v26_1/helpers/AnimationHelperImpl.java | 8 ++-- .../nms/v26_1/helpers/BlockHelperImpl.java | 30 +++++++-------- .../nms/v26_1/helpers/ChunkHelperImpl.java | 8 ++-- .../v26_1/helpers/CustomEntityHelperImpl.java | 16 ++++---- .../v26_1/helpers/EnchantmentHelperImpl.java | 2 +- .../v26_1/helpers/EntityDataNameMapper.java | 2 +- .../nms/v26_1/helpers/EntityHelperImpl.java | 24 ++++++------ .../nms/v26_1/helpers/FishingHelperImpl.java | 12 +++--- .../nms/v26_1/helpers/ItemHelperImpl.java | 28 +++++++------- .../denizen/nms/v26_1/helpers/NBTAdapter.java | 2 +- .../nms/v26_1/helpers/PacketHelperImpl.java | 26 ++++++------- .../nms/v26_1/helpers/PlayerHelperImpl.java | 34 ++++++++--------- .../nms/v26_1/helpers/WorldHelperImpl.java | 8 ++-- .../denizen/nms/v26_1/impl/BiomeNMSImpl.java | 12 +++--- .../v26_1/impl/ImprovedOfflinePlayerImpl.java | 14 +++---- .../nms/v26_1/impl/ProfileEditorImpl.java | 14 +++---- .../denizen/nms/v26_1/impl/SidebarImpl.java | 6 +-- .../nms/v26_1/impl/blocks/BlockLightImpl.java | 8 ++-- .../impl/entities/CraftFakeArrowImpl.java | 6 +-- .../impl/entities/CraftFakePlayerImpl.java | 6 +-- .../entities/CraftItemProjectileImpl.java | 8 ++-- .../impl/entities/EntityFakeArrowImpl.java | 8 ++-- .../impl/entities/EntityFakePlayerImpl.java | 12 +++--- .../entities/EntityItemProjectileImpl.java | 4 +- .../impl/network/fakes/FakeChannelImpl.java | 2 +- .../network/fakes/FakeNetworkManagerImpl.java | 2 +- .../fakes/FakePlayerConnectionImpl.java | 2 +- .../handlers/AbstractListenerPlayInImpl.java | 6 +-- .../handlers/DenizenNetworkManagerImpl.java | 14 +++---- .../handlers/DenizenPacketListenerImpl.java | 8 ++-- .../network/handlers/FakeBlockHelper.java | 12 +++--- .../packet/ActionBarEventPacketHandlers.java | 8 ++-- .../handlers/packet/AttachPacketHandlers.java | 10 ++--- .../packet/BlockLightPacketHandlers.java | 6 +-- .../DenizenPacketHandlerPacketHandlers.java | 6 +-- .../packet/DisguisePacketHandlers.java | 8 ++-- .../packet/EntityMetadataPacketHandlers.java | 8 ++-- .../packet/FakeBlocksPacketHandlers.java | 8 ++-- .../packet/FakeEquipmentPacketHandlers.java | 6 +-- .../packet/FakePlayerPacketHandlers.java | 2 +- .../packet/HiddenEntitiesPacketHandlers.java | 4 +- .../packet/HideParticlesPacketHandlers.java | 6 +-- .../PlayerHearsSoundEventPacketHandlers.java | 4 +- .../TablistUpdateEventPacketHandlers.java | 8 ++-- .../PacketInResourcePackStatusImpl.java | 2 +- .../packets/PacketInSteerVehicleImpl.java | 2 +- .../network/packets/PacketOutChatImpl.java | 4 +- 50 files changed, 244 insertions(+), 244 deletions(-) diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/Handler.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/Handler.java index 3e1fa23ae5..3bc942fd6a 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/Handler.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/Handler.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_21; +package com.denizenscript.denizen.nms.v26_1; import com.denizenscript.denizen.Denizen; import com.denizenscript.denizen.nms.NMSHandler; @@ -7,11 +7,11 @@ 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.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.v26_1.helpers.*; +import com.denizenscript.denizen.nms.v26_1.impl.BiomeNMSImpl; +import com.denizenscript.denizen.nms.v26_1.impl.ProfileEditorImpl; +import com.denizenscript.denizen.nms.v26_1.impl.SidebarImpl; +import com.denizenscript.denizen.nms.v26_1.impl.blocks.BlockLightImpl; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.objects.MaterialTag; @@ -67,19 +67,19 @@ import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.boss.BossBar; -import org.bukkit.craftbukkit.v1_21_R7.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R7.CraftServer; -import org.bukkit.craftbukkit.v1_21_R7.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R7.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_21_R7.boss.CraftBossBar; -import org.bukkit.craftbukkit.v1_21_R7.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftInventory; -import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftInventoryCustom; -import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftInventoryView; -import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R7.legacy.FieldRename; -import org.bukkit.craftbukkit.v1_21_R7.persistence.CraftPersistentDataContainer; -import org.bukkit.craftbukkit.v1_21_R7.util.*; +import org.bukkit.craftbukkit.CraftRegistry; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.block.data.CraftBlockData; +import org.bukkit.craftbukkit.boss.CraftBossBar; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.inventory.CraftInventory; +import org.bukkit.craftbukkit.inventory.CraftInventoryCustom; +import org.bukkit.craftbukkit.inventory.CraftInventoryView; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.legacy.FieldRename; +import org.bukkit.craftbukkit.persistence.CraftPersistentDataContainer; +import org.bukkit.craftbukkit.util.*; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/ReflectionMappingsInfo.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/ReflectionMappingsInfo.java index 360d260ee4..61727ee6aa 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/ReflectionMappingsInfo.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/ReflectionMappingsInfo.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_21; +package com.denizenscript.denizen.nms.v26_1; public class ReflectionMappingsInfo { diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/AdvancementHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/AdvancementHelperImpl.java index 1c9d91c52c..4db89cee5f 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/AdvancementHelperImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/AdvancementHelperImpl.java @@ -1,7 +1,7 @@ -package com.denizenscript.denizen.nms.v1_21.helpers; +package com.denizenscript.denizen.nms.v26_1.helpers; import com.denizenscript.denizen.nms.interfaces.AdvancementHelper; -import com.denizenscript.denizen.nms.v1_21.Handler; +import com.denizenscript.denizen.nms.v26_1.Handler; import com.denizenscript.denizen.utilities.FormattedTextHelper; import com.google.common.collect.ImmutableMap; import net.md_5.bungee.api.ChatColor; @@ -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_R7.CraftServer; -import org.bukkit.craftbukkit.v1_21_R7.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R7.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.util.CraftNamespacedKey; import org.bukkit.entity.Player; import java.util.*; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/AnimationHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/AnimationHelperImpl.java index b000df11bc..2c12daf4ba 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/AnimationHelperImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/AnimationHelperImpl.java @@ -1,10 +1,10 @@ -package com.denizenscript.denizen.nms.v1_21.helpers; +package com.denizenscript.denizen.nms.v26_1.helpers; import com.denizenscript.denizen.nms.abstracts.AnimationHelper; import net.minecraft.world.entity.Entity; -import org.bukkit.craftbukkit.v1_21_R7.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R7.entity.CraftHorse; -import org.bukkit.craftbukkit.v1_21_R7.entity.CraftPolarBear; +import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.entity.CraftHorse; +import org.bukkit.craftbukkit.entity.CraftPolarBear; import org.bukkit.entity.EntityType; import org.bukkit.entity.Horse; import org.bukkit.entity.IronGolem; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/BlockHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/BlockHelperImpl.java index 8a8b9188c9..e6287b6a9e 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/BlockHelperImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/BlockHelperImpl.java @@ -1,10 +1,10 @@ -package com.denizenscript.denizen.nms.v1_21.helpers; +package com.denizenscript.denizen.nms.v26_1.helpers; import com.denizenscript.denizen.nms.interfaces.BlockHelper; import com.denizenscript.denizen.nms.util.PlayerProfile; -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.v26_1.Handler; +import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v26_1.impl.ProfileEditorImpl; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.utilities.ReflectionHelper; @@ -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_R7.CraftChunk; -import org.bukkit.craftbukkit.v1_21_R7.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R7.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R7.block.CraftBlock; -import org.bukkit.craftbukkit.v1_21_R7.block.CraftBlockEntityState; -import org.bukkit.craftbukkit.v1_21_R7.block.CraftCreatureSpawner; -import org.bukkit.craftbukkit.v1_21_R7.block.CraftSkull; -import org.bukkit.craftbukkit.v1_21_R7.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R7.util.CraftLocation; -import org.bukkit.craftbukkit.v1_21_R7.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.CraftChunk; +import org.bukkit.craftbukkit.CraftRegistry; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.block.CraftBlock; +import org.bukkit.craftbukkit.block.CraftBlockEntityState; +import org.bukkit.craftbukkit.block.CraftCreatureSpawner; +import org.bukkit.craftbukkit.block.CraftSkull; +import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.util.CraftLocation; +import org.bukkit.craftbukkit.util.CraftMagicNumbers; import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/ChunkHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/ChunkHelperImpl.java index 4157cf2074..b203e0a2b5 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/ChunkHelperImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/ChunkHelperImpl.java @@ -1,8 +1,8 @@ -package com.denizenscript.denizen.nms.v1_21.helpers; +package com.denizenscript.denizen.nms.v26_1.helpers; import com.denizenscript.denizen.nms.abstracts.BiomeNMS; import com.denizenscript.denizen.nms.interfaces.ChunkHelper; -import com.denizenscript.denizen.nms.v1_21.impl.BiomeNMSImpl; +import com.denizenscript.denizen.nms.v26_1.impl.BiomeNMSImpl; import com.denizenscript.denizencore.tags.TagManager; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; @@ -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_R7.CraftChunk; -import org.bukkit.craftbukkit.v1_21_R7.CraftWorld; +import org.bukkit.craftbukkit.CraftChunk; +import org.bukkit.craftbukkit.CraftWorld; import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/CustomEntityHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/CustomEntityHelperImpl.java index 0df283220e..9905e036ef 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/CustomEntityHelperImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/CustomEntityHelperImpl.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_21.helpers; +package com.denizenscript.denizen.nms.v26_1.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_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.nms.v26_1.impl.ProfileEditorImpl; +import com.denizenscript.denizen.nms.v26_1.impl.entities.CraftFakePlayerImpl; +import com.denizenscript.denizen.nms.v26_1.impl.entities.EntityFakeArrowImpl; +import com.denizenscript.denizen.nms.v26_1.impl.entities.EntityFakePlayerImpl; +import com.denizenscript.denizen.nms.v26_1.impl.entities.EntityItemProjectileImpl; import com.denizenscript.denizen.utilities.BukkitImplDeprecations; import com.denizenscript.denizencore.utilities.CoreUtilities; import com.denizenscript.denizencore.utilities.debugging.Debug; @@ -20,8 +20,8 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R7.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftItemStack; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.scoreboard.Scoreboard; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EnchantmentHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EnchantmentHelperImpl.java index ba72802159..8325b63cca 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EnchantmentHelperImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EnchantmentHelperImpl.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_21.helpers; +package com.denizenscript.denizen.nms.v26_1.helpers; import com.denizenscript.denizen.nms.interfaces.EnchantmentHelper; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EntityDataNameMapper.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EntityDataNameMapper.java index 01b43c07ca..8ce7da8054 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EntityDataNameMapper.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EntityDataNameMapper.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_21.helpers; +package com.denizenscript.denizen.nms.v26_1.helpers; import com.denizenscript.denizencore.objects.ArgumentHelper; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EntityHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EntityHelperImpl.java index b57de3441d..b08f82d4c8 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EntityHelperImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EntityHelperImpl.java @@ -1,11 +1,11 @@ -package com.denizenscript.denizen.nms.v1_21.helpers; +package com.denizenscript.denizen.nms.v26_1.helpers; import com.denizenscript.denizen.Denizen; import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.interfaces.EntityHelper; -import com.denizenscript.denizen.nms.v1_21.Handler; -import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; -import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v26_1.Handler; +import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v26_1.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.properties.entity.EntityState; import com.denizenscript.denizen.utilities.Utilities; @@ -69,14 +69,14 @@ import org.bukkit.attribute.AttributeInstance; import org.bukkit.block.CreatureSpawner; import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_21_R7.CraftServer; -import org.bukkit.craftbukkit.v1_21_R7.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R7.block.CraftBlock; -import org.bukkit.craftbukkit.v1_21_R7.block.CraftCreatureSpawner; -import org.bukkit.craftbukkit.v1_21_R7.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_21_R7.entity.*; -import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R7.util.CraftLocation; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.block.CraftBlock; +import org.bukkit.craftbukkit.block.CraftCreatureSpawner; +import org.bukkit.craftbukkit.block.data.CraftBlockData; +import org.bukkit.craftbukkit.entity.*; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.util.CraftLocation; import org.bukkit.entity.*; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.inventory.EquipmentSlot; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/FishingHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/FishingHelperImpl.java index a6cd25a56c..a3ae8177bd 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/FishingHelperImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/FishingHelperImpl.java @@ -1,7 +1,7 @@ -package com.denizenscript.denizen.nms.v1_21.helpers; +package com.denizenscript.denizen.nms.v26_1.helpers; import com.denizenscript.denizen.nms.interfaces.FishingHelper; -import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import net.minecraft.resources.ResourceKey; @@ -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_R7.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R7.entity.CraftFishHook; -import org.bukkit.craftbukkit.v1_21_R7.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftItemStack; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.entity.CraftFishHook; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.entity.FishHook; import org.bukkit.entity.Player; import org.bukkit.event.entity.CreatureSpawnEvent; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/ItemHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/ItemHelperImpl.java index 5ab295a2d6..c69b375fb3 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/ItemHelperImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/ItemHelperImpl.java @@ -1,11 +1,11 @@ -package com.denizenscript.denizen.nms.v1_21.helpers; +package com.denizenscript.denizen.nms.v26_1.helpers; import com.denizenscript.denizen.Denizen; import com.denizenscript.denizen.nms.interfaces.ItemHelper; import com.denizenscript.denizen.nms.util.PlayerProfile; -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.v26_1.Handler; +import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v26_1.impl.ProfileEditorImpl; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.objects.properties.item.ItemComponentsPatch; import com.denizenscript.denizen.objects.properties.item.ItemRawNBT; @@ -72,16 +72,16 @@ import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_21_R7.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R7.CraftServer; -import org.bukkit.craftbukkit.v1_21_R7.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R7.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_21_R7.entity.CraftEntityType; -import org.bukkit.craftbukkit.v1_21_R7.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R7.inventory.*; -import org.bukkit.craftbukkit.v1_21_R7.map.CraftMapView; -import org.bukkit.craftbukkit.v1_21_R7.util.CraftMagicNumbers; -import org.bukkit.craftbukkit.v1_21_R7.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.CraftRegistry; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.block.data.CraftBlockData; +import org.bukkit.craftbukkit.entity.CraftEntityType; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.inventory.*; +import org.bukkit.craftbukkit.map.CraftMapView; +import org.bukkit.craftbukkit.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.util.CraftNamespacedKey; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.inventory.*; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/NBTAdapter.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/NBTAdapter.java index 427e1a62b3..9072903cba 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/NBTAdapter.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/NBTAdapter.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_21.helpers; +package com.denizenscript.denizen.nms.v26_1.helpers; import com.denizenscript.denizencore.utilities.ReflectionHelper; import net.kyori.adventure.nbt.*; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/PacketHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/PacketHelperImpl.java index de8b320707..773a78bff2 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/PacketHelperImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/PacketHelperImpl.java @@ -1,11 +1,11 @@ -package com.denizenscript.denizen.nms.v1_21.helpers; +package com.denizenscript.denizen.nms.v26_1.helpers; import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.interfaces.PacketHelper; -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.nms.v26_1.Handler; +import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v26_1.impl.SidebarImpl; +import com.denizenscript.denizen.nms.v26_1.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.scripts.commands.entity.TeleportCommand; import com.denizenscript.denizen.utilities.FormattedTextHelper; @@ -49,14 +49,14 @@ import org.bukkit.block.Sign; import org.bukkit.block.sign.Side; import org.bukkit.block.sign.SignSide; -import org.bukkit.craftbukkit.v1_21_R7.CraftServer; -import org.bukkit.craftbukkit.v1_21_R7.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R7.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R7.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R7.map.CraftMapCanvas; -import org.bukkit.craftbukkit.v1_21_R7.map.CraftMapView; -import org.bukkit.craftbukkit.v1_21_R7.util.CraftLocation; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.map.CraftMapCanvas; +import org.bukkit.craftbukkit.map.CraftMapView; +import org.bukkit.craftbukkit.util.CraftLocation; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/PlayerHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/PlayerHelperImpl.java index 6f73e27c02..e1b527bddc 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/PlayerHelperImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/PlayerHelperImpl.java @@ -1,18 +1,18 @@ -package com.denizenscript.denizen.nms.v1_21.helpers; +package com.denizenscript.denizen.nms.v26_1.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_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.nms.v26_1.Handler; +import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v26_1.impl.ImprovedOfflinePlayerImpl; +import com.denizenscript.denizen.nms.v26_1.impl.ProfileEditorImpl; +import com.denizenscript.denizen.nms.v26_1.impl.entities.CraftFakePlayerImpl; +import com.denizenscript.denizen.nms.v26_1.impl.entities.EntityItemProjectileImpl; +import com.denizenscript.denizen.nms.v26_1.impl.network.handlers.AbstractListenerPlayInImpl; +import com.denizenscript.denizen.nms.v26_1.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.objects.LocationTag; @@ -61,14 +61,14 @@ import net.minecraft.world.phys.AABB; import org.bukkit.*; import org.bukkit.boss.BossBar; -import org.bukkit.craftbukkit.v1_21_R7.CraftServer; -import org.bukkit.craftbukkit.v1_21_R7.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R7.boss.CraftBossBar; -import org.bukkit.craftbukkit.v1_21_R7.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R7.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_21_R7.util.CraftMagicNumbers; -import org.bukkit.craftbukkit.v1_21_R7.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.boss.CraftBossBar; +import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.util.CraftNamespacedKey; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/WorldHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/WorldHelperImpl.java index 5f70b7347e..fbdeb27e21 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/WorldHelperImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/WorldHelperImpl.java @@ -1,8 +1,8 @@ -package com.denizenscript.denizen.nms.v1_21.helpers; +package com.denizenscript.denizen.nms.v26_1.helpers; import com.denizenscript.denizen.nms.interfaces.WorldHelper; -import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; -import com.denizenscript.denizen.nms.v1_21.impl.BiomeNMSImpl; +import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v26_1.impl.BiomeNMSImpl; import com.denizenscript.denizen.objects.BiomeTag; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.mojang.datafixers.util.Pair; @@ -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_R7.CraftWorld; +import org.bukkit.craftbukkit.CraftWorld; public class WorldHelperImpl implements WorldHelper { diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/BiomeNMSImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/BiomeNMSImpl.java index d360c4318a..e8875f27fa 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/BiomeNMSImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/BiomeNMSImpl.java @@ -1,8 +1,8 @@ -package com.denizenscript.denizen.nms.v1_21.impl; +package com.denizenscript.denizen.nms.v26_1.impl; import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.abstracts.BiomeNMS; -import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import net.minecraft.core.BlockPos; @@ -25,10 +25,10 @@ import org.bukkit.Location; import org.bukkit.NamespacedKey; import org.bukkit.block.Block; -import org.bukkit.craftbukkit.v1_21_R7.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R7.entity.CraftEntityType; -import org.bukkit.craftbukkit.v1_21_R7.util.CraftLocation; -import org.bukkit.craftbukkit.v1_21_R7.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.entity.CraftEntityType; +import org.bukkit.craftbukkit.util.CraftLocation; +import org.bukkit.craftbukkit.util.CraftNamespacedKey; import org.bukkit.entity.EntityType; import java.lang.invoke.MethodHandle; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/ImprovedOfflinePlayerImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/ImprovedOfflinePlayerImpl.java index 7a33a97f69..17596e6dc2 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/ImprovedOfflinePlayerImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/ImprovedOfflinePlayerImpl.java @@ -1,8 +1,8 @@ -package com.denizenscript.denizen.nms.v1_21.impl; +package com.denizenscript.denizen.nms.v26_1.impl; import com.denizenscript.denizen.nms.abstracts.ImprovedOfflinePlayer; -import com.denizenscript.denizen.nms.v1_21.Handler; -import com.denizenscript.denizen.nms.v1_21.helpers.NBTAdapter; +import com.denizenscript.denizen.nms.v26_1.Handler; +import com.denizenscript.denizen.nms.v26_1.helpers.NBTAdapter; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.mojang.authlib.GameProfile; import net.kyori.adventure.nbt.CompoundBinaryTag; @@ -24,10 +24,10 @@ import net.minecraft.world.level.storage.ValueOutput; import org.bukkit.Bukkit; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_21_R7.CraftServer; -import org.bukkit.craftbukkit.v1_21_R7.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftInventory; -import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftInventoryPlayer; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.inventory.CraftInventory; +import org.bukkit.craftbukkit.inventory.CraftInventoryPlayer; import org.bukkit.entity.HumanEntity; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/ProfileEditorImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/ProfileEditorImpl.java index 196c039c05..f6aa5807cd 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/ProfileEditorImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/ProfileEditorImpl.java @@ -1,13 +1,13 @@ -package com.denizenscript.denizen.nms.v1_21.impl; +package com.denizenscript.denizen.nms.v26_1.impl; import com.denizenscript.denizen.Denizen; 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_21.Handler; -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.nms.v26_1.Handler; +import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v26_1.helpers.PacketHelperImpl; +import com.denizenscript.denizen.nms.v26_1.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.scripts.commands.entity.RenameCommand; import com.denizenscript.denizen.utilities.FormattedTextHelper; import com.denizenscript.denizencore.utilities.ReflectionHelper; @@ -25,8 +25,8 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.item.component.ResolvableProfile; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_21_R7.CraftServer; -import org.bukkit.craftbukkit.v1_21_R7.entity.CraftPlayer; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerRespawnEvent; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/SidebarImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/SidebarImpl.java index e765aa1487..0e08145f36 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/SidebarImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/SidebarImpl.java @@ -1,8 +1,8 @@ -package com.denizenscript.denizen.nms.v1_21.impl; +package com.denizenscript.denizen.nms.v26_1.impl; import com.denizenscript.denizen.nms.abstracts.Sidebar; -import com.denizenscript.denizen.nms.v1_21.Handler; -import com.denizenscript.denizen.nms.v1_21.helpers.PacketHelperImpl; +import com.denizenscript.denizen.nms.v26_1.Handler; +import com.denizenscript.denizen.nms.v26_1.helpers.PacketHelperImpl; import com.denizenscript.denizen.utilities.FormattedTextHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import net.md_5.bungee.api.ChatColor; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/blocks/BlockLightImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/blocks/BlockLightImpl.java index 78c81da8e2..f5d7c4f40a 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/blocks/BlockLightImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/blocks/BlockLightImpl.java @@ -1,8 +1,8 @@ -package com.denizenscript.denizen.nms.v1_21.impl.blocks; +package com.denizenscript.denizen.nms.v26_1.impl.blocks; import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.abstracts.BlockLight; -import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; import com.denizenscript.denizen.utilities.blocks.ChunkCoordinate; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; @@ -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_R7.CraftChunk; -import org.bukkit.craftbukkit.v1_21_R7.block.CraftBlock; +import org.bukkit.craftbukkit.CraftChunk; +import org.bukkit.craftbukkit.block.CraftBlock; import org.bukkit.util.Vector; import java.lang.invoke.MethodHandle; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/CraftFakeArrowImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/CraftFakeArrowImpl.java index 4b45bfded0..160f12a001 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/CraftFakeArrowImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/CraftFakeArrowImpl.java @@ -1,9 +1,9 @@ -package com.denizenscript.denizen.nms.v1_21.impl.entities; +package com.denizenscript.denizen.nms.v26_1.impl.entities; import com.denizenscript.denizen.nms.interfaces.FakeArrow; import net.minecraft.world.entity.projectile.arrow.AbstractArrow; -import org.bukkit.craftbukkit.v1_21_R7.CraftServer; -import org.bukkit.craftbukkit.v1_21_R7.entity.CraftAbstractArrow; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftAbstractArrow; public class CraftFakeArrowImpl extends CraftAbstractArrow implements FakeArrow { diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/CraftFakePlayerImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/CraftFakePlayerImpl.java index 92a5ac8942..79f8121011 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/CraftFakePlayerImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/CraftFakePlayerImpl.java @@ -1,11 +1,11 @@ -package com.denizenscript.denizen.nms.v1_21.impl.entities; +package com.denizenscript.denizen.nms.v26_1.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_21_R7.CraftServer; -import org.bukkit.craftbukkit.v1_21_R7.entity.CraftPlayer; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.metadata.MetadataValue; import org.bukkit.plugin.Plugin; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/CraftItemProjectileImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/CraftItemProjectileImpl.java index a2b8de7f84..da41f2da0c 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/CraftItemProjectileImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/CraftItemProjectileImpl.java @@ -1,11 +1,11 @@ -package com.denizenscript.denizen.nms.v1_21.impl.entities; +package com.denizenscript.denizen.nms.v26_1.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_21_R7.CraftServer; -import org.bukkit.craftbukkit.v1_21_R7.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R7.inventory.CraftItemStack; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; import org.bukkit.projectiles.ProjectileSource; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityFakeArrowImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityFakeArrowImpl.java index bad4b878de..01b789f238 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityFakeArrowImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityFakeArrowImpl.java @@ -1,14 +1,14 @@ -package com.denizenscript.denizen.nms.v1_21.impl.entities; +package com.denizenscript.denizen.nms.v26_1.impl.entities; -import com.denizenscript.denizen.nms.v1_21.Handler; +import com.denizenscript.denizen.nms.v26_1.Handler; import com.denizenscript.denizencore.utilities.debugging.Debug; import net.minecraft.world.entity.projectile.arrow.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_21_R7.CraftServer; -import org.bukkit.craftbukkit.v1_21_R7.CraftWorld; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.event.entity.CreatureSpawnEvent; public class EntityFakeArrowImpl extends SpectralArrow { diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityFakePlayerImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityFakePlayerImpl.java index 9c64a6636b..d81df1ffa7 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityFakePlayerImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityFakePlayerImpl.java @@ -1,9 +1,9 @@ -package com.denizenscript.denizen.nms.v1_21.impl.entities; +package com.denizenscript.denizen.nms.v26_1.impl.entities; -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.denizenscript.denizen.nms.v26_1.Handler; +import com.denizenscript.denizen.nms.v26_1.impl.network.fakes.FakeNetworkManagerImpl; +import com.denizenscript.denizen.nms.v26_1.impl.network.fakes.FakePlayerConnectionImpl; +import com.denizenscript.denizen.nms.v26_1.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.mojang.authlib.GameProfile; import net.minecraft.network.protocol.PacketFlow; @@ -14,7 +14,7 @@ import net.minecraft.server.network.CommonListenerCookie; import net.minecraft.world.entity.player.Player; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_21_R7.CraftServer; +import org.bukkit.craftbukkit.CraftServer; import org.bukkit.event.entity.CreatureSpawnEvent; public class EntityFakePlayerImpl extends ServerPlayer { diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityItemProjectileImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityItemProjectileImpl.java index 21373b58c0..3c5b3ea259 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityItemProjectileImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityItemProjectileImpl.java @@ -1,6 +1,6 @@ -package com.denizenscript.denizen.nms.v1_21.impl.entities; +package com.denizenscript.denizen.nms.v26_1.impl.entities; -import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.google.common.base.Preconditions; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/fakes/FakeChannelImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/fakes/FakeChannelImpl.java index f3b1953ca3..e265656f2e 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/fakes/FakeChannelImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/fakes/FakeChannelImpl.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_21.impl.network.fakes; +package com.denizenscript.denizen.nms.v26_1.impl.network.fakes; import io.netty.channel.*; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/fakes/FakeNetworkManagerImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/fakes/FakeNetworkManagerImpl.java index ca0c9e0f7f..a94b4367aa 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/fakes/FakeNetworkManagerImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/fakes/FakeNetworkManagerImpl.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_21.impl.network.fakes; +package com.denizenscript.denizen.nms.v26_1.impl.network.fakes; import net.minecraft.network.Connection; import net.minecraft.network.protocol.PacketFlow; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/fakes/FakePlayerConnectionImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/fakes/FakePlayerConnectionImpl.java index 4c4d11ac3c..373e74ada5 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/fakes/FakePlayerConnectionImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/fakes/FakePlayerConnectionImpl.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_21.impl.network.fakes; +package com.denizenscript.denizen.nms.v26_1.impl.network.fakes; import net.minecraft.network.Connection; import net.minecraft.network.protocol.Packet; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/AbstractListenerPlayInImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/AbstractListenerPlayInImpl.java index d67b131ff5..9432cae053 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/AbstractListenerPlayInImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/AbstractListenerPlayInImpl.java @@ -1,8 +1,8 @@ -package com.denizenscript.denizen.nms.v1_21.impl.network.handlers; +package com.denizenscript.denizen.nms.v26_1.impl.network.handlers; import com.denizenscript.denizen.events.player.PlayerSendPacketScriptEvent; import com.denizenscript.denizen.nms.NMSHandler; -import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.mojang.authlib.GameProfile; @@ -31,7 +31,7 @@ import net.minecraft.world.entity.Relative; import net.minecraft.world.phys.Vec3; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R7.entity.CraftPlayer; +import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.event.player.PlayerTeleportEvent; import java.lang.invoke.MethodHandle; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/DenizenNetworkManagerImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/DenizenNetworkManagerImpl.java index d725381ce0..6eb4dd9943 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/DenizenNetworkManagerImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -1,10 +1,10 @@ -package com.denizenscript.denizen.nms.v1_21.impl.network.handlers; +package com.denizenscript.denizen.nms.v26_1.impl.network.handlers; import com.denizenscript.denizen.events.player.PlayerReceivesPacketScriptEvent; import com.denizenscript.denizen.nms.NMSHandler; -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.nms.v26_1.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v26_1.impl.ProfileEditorImpl; +import com.denizenscript.denizen.nms.v26_1.impl.network.handlers.packet.*; import com.denizenscript.denizen.utilities.Settings; import com.denizenscript.denizen.utilities.packets.NetworkInterceptCodeGen; import com.denizenscript.denizencore.utilities.CoreUtilities; @@ -32,9 +32,9 @@ import net.minecraft.util.debugchart.LocalSampleLogger; import org.bukkit.Bukkit; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_21_R7.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R7.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R7.entity.CraftPlayer; +import org.bukkit.craftbukkit.CraftRegistry; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.entity.Player; import javax.annotation.Nullable; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/DenizenPacketListenerImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/DenizenPacketListenerImpl.java index ed03d1ee48..224b0c76ba 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/DenizenPacketListenerImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/DenizenPacketListenerImpl.java @@ -1,10 +1,10 @@ -package com.denizenscript.denizen.nms.v1_21.impl.network.handlers; +package com.denizenscript.denizen.nms.v26_1.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_21.impl.network.packets.PacketInResourcePackStatusImpl; -import com.denizenscript.denizen.nms.v1_21.impl.network.packets.PacketInSteerVehicleImpl; +import com.denizenscript.denizen.nms.v26_1.impl.network.packets.PacketInResourcePackStatusImpl; +import com.denizenscript.denizen.nms.v26_1.impl.network.packets.PacketInSteerVehicleImpl; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.objects.MaterialTag; import com.denizenscript.denizen.scripts.commands.entity.FakeEquipCommand; @@ -17,7 +17,7 @@ import net.minecraft.network.protocol.game.*; import net.minecraft.server.level.ServerPlayer; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_21_R7.block.CraftBlock; +import org.bukkit.craftbukkit.block.CraftBlock; import org.bukkit.event.block.SignChangeEvent; public class DenizenPacketListenerImpl extends AbstractListenerPlayInImpl { diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/FakeBlockHelper.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/FakeBlockHelper.java index 13ca382b8b..ec922bd71e 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/FakeBlockHelper.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/FakeBlockHelper.java @@ -1,7 +1,7 @@ -package com.denizenscript.denizen.nms.v1_21.impl.network.handlers; +package com.denizenscript.denizen.nms.v26_1.impl.network.handlers; import com.denizenscript.denizen.Denizen; -import com.denizenscript.denizen.nms.v1_21.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.utilities.blocks.FakeBlock; import com.denizenscript.denizencore.utilities.ReflectionHelper; @@ -24,10 +24,10 @@ import net.minecraft.world.level.chunk.PalettedContainer; import net.minecraft.world.level.chunk.Strategy; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_21_R7.CraftRegistry; -import org.bukkit.craftbukkit.v1_21_R7.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R7.block.CraftBlockStates; -import org.bukkit.craftbukkit.v1_21_R7.block.data.CraftBlockData; +import org.bukkit.craftbukkit.CraftRegistry; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.block.CraftBlockStates; +import org.bukkit.craftbukkit.block.data.CraftBlockData; import java.lang.invoke.MethodHandle; import java.lang.reflect.Constructor; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/ActionBarEventPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/ActionBarEventPacketHandlers.java index 62ad8bd09b..c1f641f7b5 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/ActionBarEventPacketHandlers.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/ActionBarEventPacketHandlers.java @@ -1,14 +1,14 @@ -package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v26_1.impl.network.handlers.packet; import com.denizenscript.denizen.events.player.PlayerReceivesActionbarScriptEvent; -import com.denizenscript.denizen.nms.v1_21.Handler; -import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v26_1.Handler; +import com.denizenscript.denizen.nms.v26_1.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_21_R7.util.CraftChatMessage; +import org.bukkit.craftbukkit.util.CraftChatMessage; public class ActionBarEventPacketHandlers { diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/AttachPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/AttachPacketHandlers.java index 7219ee9108..69ad484907 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/AttachPacketHandlers.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/AttachPacketHandlers.java @@ -1,8 +1,8 @@ -package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v26_1.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.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v26_1.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.utilities.entity.EntityAttachmentHelper; import com.denizenscript.denizencore.utilities.CoreConfiguration; import com.denizenscript.denizencore.utilities.ReflectionHelper; @@ -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_R7.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_21_R7.util.CraftVector; +import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.util.CraftVector; import org.bukkit.util.Vector; import java.lang.reflect.Field; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/BlockLightPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/BlockLightPacketHandlers.java index 2e53cedab2..0a6f0257bc 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/BlockLightPacketHandlers.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/BlockLightPacketHandlers.java @@ -1,8 +1,8 @@ -package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v26_1.impl.network.handlers.packet; import com.denizenscript.denizen.nms.abstracts.BlockLight; -import com.denizenscript.denizen.nms.v1_21.impl.blocks.BlockLightImpl; -import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v26_1.impl.blocks.BlockLightImpl; +import com.denizenscript.denizen.nms.v26_1.impl.network.handlers.DenizenNetworkManagerImpl; import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket; import net.minecraft.network.protocol.game.ClientboundLightUpdatePacket; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/DenizenPacketHandlerPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/DenizenPacketHandlerPacketHandlers.java index cd8abd286c..43f76611ee 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/DenizenPacketHandlerPacketHandlers.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/DenizenPacketHandlerPacketHandlers.java @@ -1,8 +1,8 @@ -package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v26_1.impl.network.handlers.packet; import com.denizenscript.denizen.events.player.PlayerReceivesMessageScriptEvent; -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.nms.v26_1.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v26_1.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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/DisguisePacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/DisguisePacketHandlers.java index a15b517fb5..12f13d8070 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/DisguisePacketHandlers.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/DisguisePacketHandlers.java @@ -1,8 +1,8 @@ -package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v26_1.impl.network.handlers.packet; import com.denizenscript.denizen.nms.NMSHandler; -import com.denizenscript.denizen.nms.v1_21.helpers.PacketHelperImpl; -import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v26_1.helpers.PacketHelperImpl; +import com.denizenscript.denizen.nms.v26_1.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; @@ -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_R7.entity.CraftEntity; +import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/EntityMetadataPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/EntityMetadataPacketHandlers.java index ee538c2b83..f0b1cf4b7f 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/EntityMetadataPacketHandlers.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/EntityMetadataPacketHandlers.java @@ -1,8 +1,8 @@ -package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v26_1.impl.network.handlers.packet; -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.nms.v26_1.Handler; +import com.denizenscript.denizen.nms.v26_1.helpers.PacketHelperImpl; +import com.denizenscript.denizen.nms.v26_1.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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakeBlocksPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakeBlocksPacketHandlers.java index 4938114cac..17f6afd713 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakeBlocksPacketHandlers.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakeBlocksPacketHandlers.java @@ -1,8 +1,8 @@ -package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v26_1.impl.network.handlers.packet; -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.nms.v26_1.ReflectionMappingsInfo; +import com.denizenscript.denizen.nms.v26_1.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v26_1.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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java index 97d21d284a..9471624704 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakeEquipmentPacketHandlers.java @@ -1,6 +1,6 @@ -package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v26_1.impl.network.handlers.packet; -import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v26_1.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.scripts.commands.entity.FakeEquipCommand; import com.mojang.datafixers.util.Pair; @@ -11,7 +11,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_R7.inventory.CraftItemStack; +import org.bukkit.craftbukkit.inventory.CraftItemStack; import java.util.ArrayList; import java.util.List; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakePlayerPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakePlayerPacketHandlers.java index dff04ee9a5..ac5c76ae4f 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakePlayerPacketHandlers.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakePlayerPacketHandlers.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v26_1.impl.network.handlers.packet; /* import com.denizenscript.denizen.nms.NMSHandler; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java index cac24bc7d8..86f1d921c5 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java @@ -1,6 +1,6 @@ -package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v26_1.impl.network.handlers.packet; -import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v26_1.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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/HideParticlesPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/HideParticlesPacketHandlers.java index 09328473fc..70c64da27b 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/HideParticlesPacketHandlers.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/HideParticlesPacketHandlers.java @@ -1,10 +1,10 @@ -package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v26_1.impl.network.handlers.packet; -import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v26_1.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_21_R7.CraftParticle; +import org.bukkit.craftbukkit.CraftParticle; import java.util.Set; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/PlayerHearsSoundEventPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/PlayerHearsSoundEventPacketHandlers.java index 4dad338a67..f26a97ad7e 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/PlayerHearsSoundEventPacketHandlers.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/PlayerHearsSoundEventPacketHandlers.java @@ -1,7 +1,7 @@ -package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v26_1.impl.network.handlers.packet; import com.denizenscript.denizen.events.player.PlayerHearsSoundScriptEvent; -import com.denizenscript.denizen.nms.v1_21.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.nms.v26_1.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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java index 21e5d5ba0c..cd436d5d26 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/TablistUpdateEventPacketHandlers.java @@ -1,9 +1,9 @@ -package com.denizenscript.denizen.nms.v1_21.impl.network.handlers.packet; +package com.denizenscript.denizen.nms.v26_1.impl.network.handlers.packet; import com.denizenscript.denizen.events.player.PlayerReceivesTablistUpdateScriptEvent; -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.nms.v26_1.Handler; +import com.denizenscript.denizen.nms.v26_1.impl.ProfileEditorImpl; +import com.denizenscript.denizen.nms.v26_1.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/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/packets/PacketInResourcePackStatusImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/packets/PacketInResourcePackStatusImpl.java index 9069658423..64a80bad64 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/packets/PacketInResourcePackStatusImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/packets/PacketInResourcePackStatusImpl.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_21.impl.network.packets; +package com.denizenscript.denizen.nms.v26_1.impl.network.packets; import com.denizenscript.denizen.nms.interfaces.packets.PacketInResourcePackStatus; import net.minecraft.network.protocol.common.ServerboundResourcePackPacket; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/packets/PacketInSteerVehicleImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/packets/PacketInSteerVehicleImpl.java index ce2c293c29..fb041134f3 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/packets/PacketInSteerVehicleImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/packets/PacketInSteerVehicleImpl.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.nms.v1_21.impl.network.packets; +package com.denizenscript.denizen.nms.v26_1.impl.network.packets; import com.denizenscript.denizen.nms.interfaces.packets.PacketInSteerVehicle; import net.minecraft.network.protocol.game.ServerboundPlayerInputPacket; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/packets/PacketOutChatImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/packets/PacketOutChatImpl.java index 13d5d02757..ed5445a201 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/packets/PacketOutChatImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/packets/PacketOutChatImpl.java @@ -1,11 +1,11 @@ -package com.denizenscript.denizen.nms.v1_21.impl.network.packets; +package com.denizenscript.denizen.nms.v26_1.impl.network.packets; import com.denizenscript.denizen.nms.interfaces.packets.PacketOutChat; import com.denizenscript.denizen.utilities.FormattedTextHelper; 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_R7.util.CraftChatMessage; +import org.bukkit.craftbukkit.util.CraftChatMessage; public class PacketOutChatImpl extends PacketOutChat { From 909187e382890b0b73176a4ed422ed99aadfb817 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Fri, 27 Mar 2026 01:39:05 +0000 Subject: [PATCH 4/7] 26.1 part 4: handle obfuscation removal --- .../nms/v26_1/ReflectionMappingsInfo.java | 130 ------------------ .../nms/v26_1/helpers/BlockHelperImpl.java | 5 +- .../v26_1/helpers/EnchantmentHelperImpl.java | 4 +- .../nms/v26_1/helpers/EntityHelperImpl.java | 15 +- .../nms/v26_1/helpers/FishingHelperImpl.java | 7 +- .../nms/v26_1/helpers/ItemHelperImpl.java | 5 +- .../nms/v26_1/helpers/PacketHelperImpl.java | 13 +- .../nms/v26_1/helpers/PlayerHelperImpl.java | 15 +- .../nms/v26_1/helpers/WorldHelperImpl.java | 9 +- .../denizen/nms/v26_1/impl/BiomeNMSImpl.java | 9 +- .../nms/v26_1/impl/ProfileEditorImpl.java | 5 +- .../nms/v26_1/impl/blocks/BlockLightImpl.java | 5 +- .../entities/EntityItemProjectileImpl.java | 3 +- .../handlers/AbstractListenerPlayInImpl.java | 9 +- .../handlers/DenizenNetworkManagerImpl.java | 9 +- .../network/handlers/FakeBlockHelper.java | 5 +- .../handlers/packet/AttachPacketHandlers.java | 13 +- .../packet/FakeBlocksPacketHandlers.java | 7 +- 18 files changed, 61 insertions(+), 207 deletions(-) delete mode 100644 v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/ReflectionMappingsInfo.java diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/ReflectionMappingsInfo.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/ReflectionMappingsInfo.java deleted file mode 100644 index 61727ee6aa..0000000000 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/ReflectionMappingsInfo.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.denizenscript.denizen.nms.v26_1; - -public class ReflectionMappingsInfo { - - // Content generated by ReflectionMappingsGenerator - https://github.com/DenizenScript/ReflectionMappingsGenerator - - // net.minecraft.world.level.block.state.BlockBehaviour - public static String BlockBehaviour_explosionResistance = "G"; - - // net.minecraft.core.MappedRegistry - public static String MappedRegistry_registrationInfos = "h"; - - // net.minecraft.world.entity.Entity - public static String Entity_onGround = "bc"; - public static String Entity_DATA_SHARED_FLAGS_ID = "aA"; - public static String Entity_DATA_CUSTOM_NAME = "bm"; - public static String Entity_DATA_CUSTOM_NAME_VISIBLE = "bn"; - - // net.minecraft.world.entity.LivingEntity - public static String LivingEntity_attackStrengthTicker = "bz"; - public static String LivingEntity_autoSpinAttackTicks = "bW"; - public static String LivingEntity_setLivingEntityFlag_method = "c"; - - // net.minecraft.world.entity.player.Player - public static String Player_DATA_PLAYER_ABSORPTION_ID = "b"; - - // net.minecraft.server.level.ServerPlayer - public static String ServerPlayer_respawnConfig = "dr"; - - // net.minecraft.world.entity.monster.EnderMan - public static String EnderMan_DATA_CREEPY = "cx"; - - // net.minecraft.world.entity.monster.zombie.Zombie - public static String Zombie_inWaterTime = "cL"; - - // net.minecraft.world.item.Item - public static String Item_components = "c"; - - // net.minecraft.world.item.component.ResolvableProfile - public static String ResolvableProfile_unpack_method = "a"; - - // net.minecraft.world.item.component.ResolvableProfile$Partial - public static String ResolvableProfilePartial_id = "d"; - - // net.minecraft.world.level.Level - public static String Level_isClientSide = "D"; - - // 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 = "k"; - - // net.minecraft.world.entity.item.ItemEntity - public static String ItemEntity_DATA_ITEM = "c"; - - // net.minecraft.world.level.biome.Biome - public static String Biome_climateSettings = "i"; - public static String Biome_attributes = "l"; - public static String Biome_specialEffects = "m"; - - // net.minecraft.network.Connection - public static String Connection_receiving = "h"; - public static String Connection_packetListener = "n"; - - // net.minecraft.server.network.ServerGamePacketListenerImpl - public static String ServerGamePacketListenerImpl_aboveGroundTickCount = "L"; - public static String ServerGamePacketListenerImpl_aboveGroundVehicleTickCount = "N"; - public static String ServerGamePacketListenerImpl_awaitingPositionFromClient = "H"; - public static String ServerGamePacketListenerImpl_awaitingTeleport = "I"; - public static String ServerGamePacketListenerImpl_chunkSender = "h"; - - // net.minecraft.server.network.ServerCommonPacketListenerImpl - public static String ServerCommonPacketListenerImpl_connection = "e"; - public static String ServerCommonPacketListenerImpl_createCookie_method = "a"; - - // 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.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 = "b"; - - // 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 = "O"; - - // net.minecraft.world.item.AdventureModePredicate - public static String AdventureModePredicate_predicates = "g"; - - // net.minecraft.stats.ServerRecipeBook - public static String ServerRecipeBook_addHighlight_method = "e"; -} diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/BlockHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/BlockHelperImpl.java index e6287b6a9e..3916ff35b8 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/BlockHelperImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/BlockHelperImpl.java @@ -3,7 +3,6 @@ import com.denizenscript.denizen.nms.interfaces.BlockHelper; import com.denizenscript.denizen.nms.util.PlayerProfile; import com.denizenscript.denizen.nms.v26_1.Handler; -import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; import com.denizenscript.denizen.nms.v26_1.impl.ProfileEditorImpl; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizencore.objects.Mechanism; @@ -131,7 +130,7 @@ public boolean setBlockResistance(Material material, float resistance) { if (block == null) { return false; } - ReflectionHelper.setFieldValue(net.minecraft.world.level.block.state.BlockBehaviour.class, ReflectionMappingsInfo.BlockBehaviour_explosionResistance, block, resistance); + ReflectionHelper.setFieldValue(net.minecraft.world.level.block.state.BlockBehaviour.class, "explosionResistance", block, resistance); return true; } @@ -141,7 +140,7 @@ public float getBlockResistance(Material material) { if (block == null) { return 0; } - return ReflectionHelper.getFieldValue(net.minecraft.world.level.block.state.BlockBehaviour.class, ReflectionMappingsInfo.BlockBehaviour_explosionResistance, block); + return ReflectionHelper.getFieldValue(net.minecraft.world.level.block.state.BlockBehaviour.class, "explosionResistance", block); } public static final MethodHandle MATERIAL_PUSH_REACTION_SETTER = ReflectionHelper.getFinalSetterForFirstOfType(BlockBehaviour.BlockStateBase.class, PushReaction.class); diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EnchantmentHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EnchantmentHelperImpl.java index 8325b63cca..ae556afc23 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EnchantmentHelperImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EnchantmentHelperImpl.java @@ -5,8 +5,8 @@ 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); + public static final Field REGISTRY_FROZEN = ReflectionHelper.getFields(MappedRegistry.class).get("frozen", boolean.class); + public static final Field REGISTRY_INTRUSIVE_HOLDERS = ReflectionHelper.getFields(MappedRegistry.class).get("unregisteredIntrusiveHolders", Map.class); @Override public org.bukkit.enchantments.Enchantment registerFakeEnchantment(EnchantmentScriptContainer.EnchantmentReference script) { diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EntityHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EntityHelperImpl.java index b08f82d4c8..410be78441 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EntityHelperImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/EntityHelperImpl.java @@ -4,7 +4,6 @@ import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.interfaces.EntityHelper; import com.denizenscript.denizen.nms.v26_1.Handler; -import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; import com.denizenscript.denizen.nms.v26_1.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.properties.entity.EntityState; @@ -92,9 +91,9 @@ 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 MethodHandle ENTITY_ONGROUND_SETTER = ReflectionHelper.getFinalSetter(net.minecraft.world.entity.Entity.class, "onGround", boolean.class); - public static final EntityDataAccessor ENDERMAN_DATA_ACCESSOR_SCREAMING = ReflectionHelper.getFieldValue(EnderMan.class, ReflectionMappingsInfo.EnderMan_DATA_CREEPY, null); + public static final EntityDataAccessor ENDERMAN_DATA_ACCESSOR_SCREAMING = ReflectionHelper.getFieldValue(EnderMan.class, "DATA_CREEPY", null); @Override public void setInvisible(Entity entity, boolean invisible) { @@ -152,8 +151,8 @@ public double getDamageTo(LivingEntity attacker, Entity target) { 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); + public static final MethodHandle LIVINGENTITY_AUTOSPINATTACK_SETTER = ReflectionHelper.getFinalSetter(net.minecraft.world.entity.LivingEntity.class, "autoSpinAttackTicks"); + public static final MethodHandle LIVINGENTITY_SETLIVINGENTITYFLAG = ReflectionHelper.getMethodHandle(net.minecraft.world.entity.LivingEntity.class, "setLivingEntityFlag", int.class, boolean.class); @Override public void setRiptide(Entity entity, boolean state) { @@ -548,7 +547,7 @@ 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); + public static final Field EXPERIENCE_ORB_AGE = ReflectionHelper.getFields(net.minecraft.world.entity.ExperienceOrb.class).get("age", int.class); @Override public void setTicksLived(Entity entity, int ticks) { @@ -687,7 +686,7 @@ public EntityTag getMobSpawnerDisplayEntity(CreatureSpawner spawner) { return new EntityTag(nmsEntity.getBukkitEntity()); } - public static final Field ZOMBIE_INWATERTIME = ReflectionHelper.getFields(net.minecraft.world.entity.monster.zombie.Zombie.class).get(ReflectionMappingsInfo.Zombie_inWaterTime, int.class); + public static final Field ZOMBIE_INWATERTIME = ReflectionHelper.getFields(net.minecraft.world.entity.monster.zombie.Zombie.class).get("inWaterTime", int.class); @Override public int getInWaterTime(Zombie zombie) { @@ -767,7 +766,7 @@ public void setUUID(Entity entity, UUID id) { } } - public static final Field SynchedEntityData_itemsById = ReflectionHelper.getFields(SynchedEntityData.class).get(ReflectionMappingsInfo.SynchedEntityData_itemsById); + public static final Field SynchedEntityData_itemsById = ReflectionHelper.getFields(SynchedEntityData.class).get("itemsById"); public static Int2ObjectMap> getDataItems(Entity entity) { try { diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/FishingHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/FishingHelperImpl.java index a3ae8177bd..5f52ffec86 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/FishingHelperImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/FishingHelperImpl.java @@ -1,7 +1,6 @@ package com.denizenscript.denizen.nms.v26_1.helpers; import com.denizenscript.denizen.nms.interfaces.FishingHelper; -import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import net.minecraft.resources.ResourceKey; @@ -97,9 +96,9 @@ 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); + public static final Field FISHING_HOOK_NIBBLE = ReflectionHelper.getFields(FishingHook.class).get("nibble", int.class); + public static final Field FISHING_HOOK_LURE_TIME = ReflectionHelper.getFields(FishingHook.class).get("timeUntilLured", int.class); + public static final Field FISHING_HOOK_HOOK_TIME = ReflectionHelper.getFields(FishingHook.class).get("timeUntilHooked", int.class); @Override public FishHook getHookFrom(Player player) { diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/ItemHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/ItemHelperImpl.java index c69b375fb3..0cf25fdf8e 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/ItemHelperImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/ItemHelperImpl.java @@ -4,7 +4,6 @@ import com.denizenscript.denizen.nms.interfaces.ItemHelper; import com.denizenscript.denizen.nms.util.PlayerProfile; import com.denizenscript.denizen.nms.v26_1.Handler; -import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; import com.denizenscript.denizen.nms.v26_1.impl.ProfileEditorImpl; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.objects.properties.item.ItemComponentsPatch; @@ -102,7 +101,7 @@ public static net.minecraft.world.item.crafting.RecipeHolder getNMSRecipe(Nam 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 static final Field Item_components = ReflectionHelper.getFields(Item.class).get("components", DataComponentMap.class); public static final Field RecipeManager_featureFlagSet = ReflectionHelper.getFields(RecipeManager.class).getFirstOfType(FeatureFlagSet.class); @@ -484,7 +483,7 @@ public ItemStack setRawComponentsPatch(ItemStack item, MapTag rawComponentsMap, return CraftItemStack.asBukkitCopy(nmsItemStack); } - public static final Field AdventureModePredicate_predicates = ReflectionHelper.getFields(AdventureModePredicate.class).get(ReflectionMappingsInfo.AdventureModePredicate_predicates); + public static final Field AdventureModePredicate_predicates = ReflectionHelper.getFields(AdventureModePredicate.class).get("predicates"); @Override public List getCanPlaceOn(ItemStack item) { diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/PacketHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/PacketHelperImpl.java index 773a78bff2..3f3d84a134 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/PacketHelperImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/PacketHelperImpl.java @@ -3,7 +3,6 @@ import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.interfaces.PacketHelper; import com.denizenscript.denizen.nms.v26_1.Handler; -import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; import com.denizenscript.denizen.nms.v26_1.impl.SidebarImpl; import com.denizenscript.denizen.nms.v26_1.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.objects.LocationTag; @@ -32,9 +31,9 @@ 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.spider.CaveSpider; import net.minecraft.world.entity.monster.Creeper; import net.minecraft.world.entity.monster.EnderMan; +import net.minecraft.world.entity.monster.spider.CaveSpider; import net.minecraft.world.entity.monster.spider.Spider; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.level.block.Block; @@ -71,19 +70,19 @@ 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 PLAYER_DATA_ACCESSOR_ABSORPTION = ReflectionHelper.getFieldValue(net.minecraft.world.entity.player.Player.class, "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 EntityDataAccessor ENTITY_DATA_ACCESSOR_FLAGS = ReflectionHelper.getFieldValue(net.minecraft.world.entity.Entity.class, "DATA_SHARED_FLAGS_ID", null); - public static final MethodHandle ABILITIES_PACKET_FOV_SETTER = ReflectionHelper.getFinalSetter(ClientboundPlayerAbilitiesPacket.class, ReflectionMappingsInfo.ClientboundPlayerAbilitiesPacket_walkingSpeed); + public static final MethodHandle ABILITIES_PACKET_FOV_SETTER = ReflectionHelper.getFinalSetter(ClientboundPlayerAbilitiesPacket.class, "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); + public static final EntityDataAccessor> ENTITY_DATA_ACCESSOR_CUSTOM_NAME = ReflectionHelper.getFieldValue(net.minecraft.world.entity.Entity.class, "DATA_CUSTOM_NAME", null); + public static final EntityDataAccessor ENTITY_DATA_ACCESSOR_CUSTOM_NAME_VISIBLE = ReflectionHelper.getFieldValue(net.minecraft.world.entity.Entity.class, "DATA_CUSTOM_NAME_VISIBLE", null); @Override public void setFakeAbsorption(Player player, float value) { diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/PlayerHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/PlayerHelperImpl.java index e1b527bddc..0760d3bbee 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/PlayerHelperImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/PlayerHelperImpl.java @@ -6,7 +6,6 @@ import com.denizenscript.denizen.nms.enums.CustomEntityType; import com.denizenscript.denizen.nms.interfaces.PlayerHelper; import com.denizenscript.denizen.nms.v26_1.Handler; -import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; import com.denizenscript.denizen.nms.v26_1.impl.ImprovedOfflinePlayerImpl; import com.denizenscript.denizen.nms.v26_1.impl.ProfileEditorImpl; import com.denizenscript.denizen.nms.v26_1.impl.entities.CraftFakePlayerImpl; @@ -81,13 +80,13 @@ 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 ATTACK_COOLDOWN_TICKS = ReflectionHelper.getFields(LivingEntity.class).get("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_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 Field FLY_TICKS = ReflectionHelper.getFields(ServerGamePacketListenerImpl.class).get("aboveGroundTickCount", int.class); + public static final Field VEHICLE_FLY_TICKS = ReflectionHelper.getFields(ServerGamePacketListenerImpl.class).get("aboveGroundVehicleTickCount", int.class); + public static final Field PASSENGERS_PACKET_PASSENGERS = ReflectionHelper.getFields(ClientboundSetPassengersPacket.class).get("passengers", int[].class); + public static final MethodHandle PLAYER_RESPAWNCONFIG_SETTER = ReflectionHelper.getFinalSetter(ServerPlayer.class, "respawnConfig", ServerPlayer.RespawnConfig.class); + public static final MethodHandle SERVER_RECIPE_BOOK_ADD_HIGHLIGHT = ReflectionHelper.getMethodHandle(ServerRecipeBook.class, "addHighlight", ResourceKey.class); @Override public void stopSound(Player player, NamespacedKey sound, SoundCategory category) { @@ -465,7 +464,7 @@ public void sendPlayerInfoRemovePacket(Player player, UUID 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())); + Map tags = ReflectionHelper.getFieldValue(TagNetworkSerialization.NetworkPayload.class, "tags", packetInput.get(BuiltInRegistries.BLOCK.key())); IntList climbableBlocks = tags.get(BlockTags.CLIMBABLE.location()); climbableBlocks.clear(); for (Material material : materials) { diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/WorldHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/WorldHelperImpl.java index fbdeb27e21..92a36c9877 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/WorldHelperImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/WorldHelperImpl.java @@ -1,7 +1,6 @@ package com.denizenscript.denizen.nms.v26_1.helpers; import com.denizenscript.denizen.nms.interfaces.WorldHelper; -import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; import com.denizenscript.denizen.nms.v26_1.impl.BiomeNMSImpl; import com.denizenscript.denizen.objects.BiomeTag; import com.denizenscript.denizencore.utilities.ReflectionHelper; @@ -28,7 +27,7 @@ public boolean isStatic(World world) { @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); + ReflectionHelper.setFieldValue(net.minecraft.world.level.Level.class, "isClientSide", worldServer, isStatic); } @Override @@ -50,14 +49,14 @@ public Location getNearestBiomeLocation(Location start, BiomeTag biome) { @Override public boolean areEnoughSleeping(World world, int percentage) { - SleepStatus status = ReflectionHelper.getFieldValue(ServerLevel.class, ReflectionMappingsInfo.ServerLevel_sleepStatus, ((CraftWorld) world).getHandle()); + SleepStatus status = ReflectionHelper.getFieldValue(ServerLevel.class, "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); + SleepStatus status = ReflectionHelper.getFieldValue(ServerLevel.class, "sleepStatus", level); return status.areEnoughDeepSleeping(percentage, level.players()); } @@ -90,7 +89,7 @@ public void setGameTime(World world, long time) { @Override public void wakeUpAllPlayers(World world) { ServerLevel nmsWorld = ((CraftWorld) world).getHandle(); - SleepStatus status = ReflectionHelper.getFieldValue(ServerLevel.class, ReflectionMappingsInfo.ServerLevel_sleepStatus, nmsWorld); + SleepStatus status = ReflectionHelper.getFieldValue(ServerLevel.class, "sleepStatus", nmsWorld); status.removeAllSleepers(); nmsWorld.getPlayers(LivingEntity::isSleeping).forEach((player) -> player.stopSleepInBed(false, false)); } diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/BiomeNMSImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/BiomeNMSImpl.java index e8875f27fa..d99c80dd4b 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/BiomeNMSImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/BiomeNMSImpl.java @@ -2,7 +2,6 @@ import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.abstracts.BiomeNMS; -import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import net.minecraft.core.BlockPos; @@ -40,8 +39,8 @@ 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 static final MethodHandle MAPPED_REGISTRY_REGISTRATION_INFOS = ReflectionHelper.getFields(MappedRegistry.class).getGetter(ReflectionMappingsInfo.MappedRegistry_registrationInfos); - public static final MethodHandle BIOME_ATTRIBUTES_SETTER = ReflectionHelper.getFields(Biome.class).getSetter(ReflectionMappingsInfo.Biome_attributes); + public static final MethodHandle MAPPED_REGISTRY_REGISTRATION_INFOS = ReflectionHelper.getFields(MappedRegistry.class).getGetter("registrationInfos"); + public static final MethodHandle BIOME_ATTRIBUTES_SETTER = ReflectionHelper.getFields(Biome.class).getSetter("attributes"); public Holder.Reference biomeHolder; public ServerLevel world; @@ -126,7 +125,7 @@ public int getFoliageColor() { 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); + ReflectionHelper.setFieldValue(Biome.class, "climateSettings", biomeHolder.value(), newClimate); setNetworkedRegistrationInfo(); } catch (Throwable ex) { @@ -155,7 +154,7 @@ public void setFoliageColor(int color) { BiomeSpecialEffects nmsNewEffects = new BiomeSpecialEffects( nmsCurrEffects.waterColor(), Optional.of(color), nmsCurrEffects.dryFoliageColorOverride(), nmsCurrEffects.grassColorOverride(), nmsCurrEffects.grassColorModifier() ); - ReflectionHelper.setFieldValue(Biome.class, ReflectionMappingsInfo.Biome_specialEffects, biomeHolder.value(), nmsNewEffects); + ReflectionHelper.setFieldValue(Biome.class, "specialEffects", biomeHolder.value(), nmsNewEffects); setNetworkedRegistrationInfo(); } diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/ProfileEditorImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/ProfileEditorImpl.java index f6aa5807cd..d620ff984f 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/ProfileEditorImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/ProfileEditorImpl.java @@ -5,7 +5,6 @@ import com.denizenscript.denizen.nms.abstracts.ProfileEditor; import com.denizenscript.denizen.nms.util.PlayerProfile; import com.denizenscript.denizen.nms.v26_1.Handler; -import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; import com.denizenscript.denizen.nms.v26_1.helpers.PacketHelperImpl; import com.denizenscript.denizen.nms.v26_1.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.scripts.commands.entity.RenameCommand; @@ -140,10 +139,10 @@ public static GameProfile getGameProfile(PlayerProfile playerProfile) { return createGameProfile(playerProfile.getUniqueId(), playerProfile.getName(), playerProfile.getTexture(), playerProfile.getTextureSignature()); } - public static final MethodHandle RESOLVABLEPROFILE_UNPACK = ReflectionHelper.getMethodHandle(ResolvableProfile.class, ReflectionMappingsInfo.ResolvableProfile_unpack_method); + public static final MethodHandle RESOLVABLEPROFILE_UNPACK = ReflectionHelper.getMethodHandle(ResolvableProfile.class, "unpack"); public static final MethodHandle RESOLVABLEPROFILE_PARTIAL_ID = ReflectionHelper .getFields(ReflectionHelper.getClassOrThrow("net.minecraft.world.item.component.ResolvableProfile$Partial")) - .getGetter(ReflectionMappingsInfo.ResolvableProfilePartial_id, Optional.class); + .getGetter("id", Optional.class); public static UUID getUUID(ResolvableProfile resolvableProfile) { try { diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/blocks/BlockLightImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/blocks/BlockLightImpl.java index f5d7c4f40a..6bae8317f4 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/blocks/BlockLightImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/blocks/BlockLightImpl.java @@ -2,7 +2,6 @@ import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.abstracts.BlockLight; -import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; import com.denizenscript.denizen.utilities.blocks.ChunkCoordinate; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; @@ -39,7 +38,7 @@ public class BlockLightImpl extends BlockLight { static { Object preObj = null; try { - preObj = ReflectionHelper.getFields(LIGHTENGINETHREADED_TASKTYPE).get(ReflectionMappingsInfo.ThreadedLevelLightEngineTaskType_PRE_UPDATE).get(null); + preObj = ReflectionHelper.getFields(LIGHTENGINETHREADED_TASKTYPE).get("PRE_UPDATE").get(null); } catch (Throwable ex) { ex.printStackTrace(); @@ -47,7 +46,7 @@ public class BlockLightImpl extends BlockLight { LIGHTENGINETHREADED_TASKTYPE_PRE = preObj; } - public static final MethodHandle LIGHTENGINETHREADED_QUEUERUNNABLE = ReflectionHelper.getMethodHandle(ThreadedLevelLightEngine.class, ReflectionMappingsInfo.ThreadedLevelLightEngine_addTask_method, + public static final MethodHandle LIGHTENGINETHREADED_QUEUERUNNABLE = ReflectionHelper.getMethodHandle(ThreadedLevelLightEngine.class, "addTask", int.class, int.class, LIGHTENGINETHREADED_TASKTYPE, Runnable.class); public static void enqueueRunnable(LevelChunk chunk, Runnable runnable) { diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityItemProjectileImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityItemProjectileImpl.java index 3c5b3ea259..60539e4a85 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityItemProjectileImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityItemProjectileImpl.java @@ -1,6 +1,5 @@ package com.denizenscript.denizen.nms.v26_1.impl.entities; -import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.google.common.base.Preconditions; @@ -28,7 +27,7 @@ public class EntityItemProjectileImpl extends ThrowableProjectile { static { EntityDataAccessor watcher = null; try { - watcher = (EntityDataAccessor) ReflectionHelper.getFields(ItemEntity.class).get(ReflectionMappingsInfo.ItemEntity_DATA_ITEM).get(null); + watcher = (EntityDataAccessor) ReflectionHelper.getFields(ItemEntity.class).get("DATA_ITEM").get(null); } catch (Throwable ex) { Debug.echoError(ex); diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/AbstractListenerPlayInImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/AbstractListenerPlayInImpl.java index 9432cae053..6d5d5a2b48 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/AbstractListenerPlayInImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/AbstractListenerPlayInImpl.java @@ -2,7 +2,6 @@ import com.denizenscript.denizen.events.player.PlayerSendPacketScriptEvent; import com.denizenscript.denizen.nms.NMSHandler; -import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; import com.mojang.authlib.GameProfile; @@ -41,9 +40,9 @@ public class AbstractListenerPlayInImpl extends ServerGamePacketListenerImpl { - public static final Field ServerGamePacketListenerImpl_chunkSender = ReflectionHelper.getFields(ServerGamePacketListenerImpl.class).get(ReflectionMappingsInfo.ServerGamePacketListenerImpl_chunkSender); + public static final Field ServerGamePacketListenerImpl_chunkSender = ReflectionHelper.getFields(ServerGamePacketListenerImpl.class).get("chunkSender"); - public static final MethodHandle SERVER_COMMON_PACKET_LISTENER_IMPL_CREATE_COOKIE = ReflectionHelper.getMethodHandle(ServerCommonPacketListenerImpl.class, ReflectionMappingsInfo.ServerCommonPacketListenerImpl_createCookie_method, ClientInformation.class); + public static final MethodHandle SERVER_COMMON_PACKET_LISTENER_IMPL_CREATE_COOKIE = ReflectionHelper.getMethodHandle(ServerCommonPacketListenerImpl.class, "createCookie", ClientInformation.class); public static CommonListenerCookie createCookie(ServerPlayer nmsPlayer) { try { @@ -179,8 +178,8 @@ 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); - public static Field AWAITING_TELEPORT_FIELD = ReflectionHelper.getFields(ServerGamePacketListenerImpl.class).get(ReflectionMappingsInfo.ServerGamePacketListenerImpl_awaitingTeleport, int.class); + public static Field AWAITING_POS_FIELD = ReflectionHelper.getFields(ServerGamePacketListenerImpl.class).get("awaitingPositionFromClient", Vec3.class); + public static Field AWAITING_TELEPORT_FIELD = ReflectionHelper.getFields(ServerGamePacketListenerImpl.class).get("awaitingTeleport", int.class); public void debugPacketOutput(Packet packet) { try { diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/DenizenNetworkManagerImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/DenizenNetworkManagerImpl.java index 6eb4dd9943..23e1da3234 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/DenizenNetworkManagerImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -2,7 +2,6 @@ import com.denizenscript.denizen.events.player.PlayerReceivesPacketScriptEvent; import com.denizenscript.denizen.nms.NMSHandler; -import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; import com.denizenscript.denizen.nms.v26_1.impl.ProfileEditorImpl; import com.denizenscript.denizen.nms.v26_1.impl.network.handlers.packet.*; import com.denizenscript.denizen.utilities.Settings; @@ -528,10 +527,10 @@ public void setBandwidthLogger(LocalSampleLogger localsamplelogger) { //// 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 final Field protocolDirectionField = ReflectionHelper.getFields(Connection.class).get("receiving", PacketFlow.class); + public static final Field Connection_packetListener = ReflectionHelper.getFields(Connection.class).get("packetListener", PacketListener.class); + private static final Field ServerGamePacketListener_ConnectionField = ReflectionHelper.getFields(ServerCommonPacketListenerImpl.class).get("connection"); + private static final MethodHandle ServerGamePacketListener_ConnectionSetter = ReflectionHelper.getFinalSetter(ServerCommonPacketListenerImpl.class, "connection"); private static PacketFlow getProtocolDirection(Connection networkManager) { PacketFlow direction = null; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/FakeBlockHelper.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/FakeBlockHelper.java index ec922bd71e..11a61644f0 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/FakeBlockHelper.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/FakeBlockHelper.java @@ -1,7 +1,6 @@ package com.denizenscript.denizen.nms.v26_1.impl.network.handlers; import com.denizenscript.denizen.Denizen; -import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizen.utilities.blocks.FakeBlock; import com.denizenscript.denizencore.utilities.ReflectionHelper; @@ -42,8 +41,8 @@ public class FakeBlockHelper { 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 Field CHUNKDATA_BLOCKENTITYINFO_PACKEDXZ = ReflectionHelper.getFields(CHUNKDATA_BLOCKENTITYINFO_CLASS).get("packedXZ"); + public static Field CHUNKDATA_BLOCKENTITYINFO_Y = ReflectionHelper.getFields(CHUNKDATA_BLOCKENTITYINFO_CLASS).get("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() == 2).findFirst().get(); diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/AttachPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/AttachPacketHandlers.java index 69ad484907..195004dedc 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/AttachPacketHandlers.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/AttachPacketHandlers.java @@ -1,7 +1,6 @@ package com.denizenscript.denizen.nms.v26_1.impl.network.handlers.packet; import com.denizenscript.denizen.nms.NMSHandler; -import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; import com.denizenscript.denizen.nms.v26_1.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.utilities.entity.EntityAttachmentHelper; import com.denizenscript.denizencore.utilities.CoreConfiguration; @@ -30,12 +29,12 @@ public static void registerHandlers() { 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_PACKVELENT = ReflectionHelper.getFields(ClientboundSetEntityMotionPacket.class).get(ReflectionMappingsInfo.ClientboundSetEntityMotionPacket_id, int.class); + public static Field POS_X_PACKENT = ReflectionHelper.getFields(ClientboundMoveEntityPacket.class).get("xa", short.class); + public static Field POS_Y_PACKENT = ReflectionHelper.getFields(ClientboundMoveEntityPacket.class).get("ya", short.class); + public static Field POS_Z_PACKENT = ReflectionHelper.getFields(ClientboundMoveEntityPacket.class).get("za", short.class); + public static Field YAW_PACKENT = ReflectionHelper.getFields(ClientboundMoveEntityPacket.class).get("yRot", byte.class); + public static Field PITCH_PACKENT = ReflectionHelper.getFields(ClientboundMoveEntityPacket.class).get("xRot", byte.class); + public static Field ENTITY_ID_PACKVELENT = ReflectionHelper.getFields(ClientboundSetEntityMotionPacket.class).get("id", int.class); public static Vector VECTOR_ZERO = new Vector(0, 0, 0); diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakeBlocksPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakeBlocksPacketHandlers.java index 17f6afd713..0144bcfa08 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakeBlocksPacketHandlers.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/FakeBlocksPacketHandlers.java @@ -1,6 +1,5 @@ package com.denizenscript.denizen.nms.v26_1.impl.network.handlers.packet; -import com.denizenscript.denizen.nms.v26_1.ReflectionMappingsInfo; import com.denizenscript.denizen.nms.v26_1.impl.network.handlers.DenizenNetworkManagerImpl; import com.denizenscript.denizen.nms.v26_1.impl.network.handlers.FakeBlockHelper; import com.denizenscript.denizen.objects.LocationTag; @@ -26,9 +25,9 @@ public static void registerHandlers() { 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 Field SECTIONPOS_MULTIBLOCKCHANGE = ReflectionHelper.getFields(ClientboundSectionBlocksUpdatePacket.class).get("sectionPos", SectionPos.class); + public static Field OFFSETARRAY_MULTIBLOCKCHANGE = ReflectionHelper.getFields(ClientboundSectionBlocksUpdatePacket.class).get("positions", short[].class); + public static Field BLOCKARRAY_MULTIBLOCKCHANGE = ReflectionHelper.getFields(ClientboundSectionBlocksUpdatePacket.class).get("states", BlockState[].class); public static Packet processShowFakeForPacket(DenizenNetworkManagerImpl networkManager, Packet packet) { if (FakeBlock.blocks.isEmpty()) { From a6b23a90c0eda1cff20e53c9a062d26e398a10f8 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Fri, 27 Mar 2026 03:33:43 +0000 Subject: [PATCH 5/7] 26.1 part 5: initial code updates --- .../denizenscript/denizen/nms/NMSVersion.java | 3 +- .../containers/core/ItemScriptHelper.java | 15 ++++++---- .../v26_1/helpers/AdvancementHelperImpl.java | 2 +- .../nms/v26_1/helpers/BlockHelperImpl.java | 4 +-- .../nms/v26_1/helpers/FishingHelperImpl.java | 4 +-- .../nms/v26_1/helpers/ItemHelperImpl.java | 28 +++++++++---------- .../nms/v26_1/helpers/WorldHelperImpl.java | 15 +++------- .../v26_1/impl/ImprovedOfflinePlayerImpl.java | 10 +++---- .../nms/v26_1/impl/blocks/BlockLightImpl.java | 4 +-- .../entities/EntityItemProjectileImpl.java | 8 ------ .../handlers/DenizenNetworkManagerImpl.java | 2 +- .../handlers/packet/AttachPacketHandlers.java | 2 +- .../packet/HiddenEntitiesPacketHandlers.java | 2 +- 13 files changed, 42 insertions(+), 57 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 8b75de4b81..3445604ad2 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/NMSVersion.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/NMSVersion.java @@ -7,7 +7,8 @@ public enum NMSVersion { v1_18("1.18"), v1_19("1.19"), v1_20("1.20"), - v1_21("1.21"); + v1_21("1.21"), + v26_1("26.1"); final String minecraftVersion; 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 2a416d20b0..c57b5f43cf 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 @@ -60,14 +60,17 @@ public static void removeDenizenRecipes() { Iterator recipeIterator = Bukkit.recipeIterator(); ArrayList keys = new ArrayList<>(); while (recipeIterator.hasNext()) { - if (recipeIterator.next() instanceof Keyed keyed && keyed.getKey().getNamespace().equals("denizen")) { - if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { - keys.add(keyed.getKey()); - } - else { - recipeIterator.remove(); + try { + if (recipeIterator.next() instanceof Keyed keyed && keyed.getKey().getNamespace().equals("denizen")) { + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) { + keys.add(keyed.getKey()); + } + else { + recipeIterator.remove(); + } } } + catch (AbstractMethodError ignored) {} // TODO: 26.1: work around Spigot bug } if (!keys.isEmpty()) { NMSHandler.itemHelper.removeRecipes(keys); diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/AdvancementHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/AdvancementHelperImpl.java index 4db89cee5f..79157f437a 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/AdvancementHelperImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/AdvancementHelperImpl.java @@ -174,7 +174,7 @@ private static AdvancementHolder asNMSCopy(com.denizenscript.denizen.nms.util.Ad AdvancementHolder parent = advancement.parent != null ? getNMSAdvancementManager().advancements.get(CraftNamespacedKey.toMinecraft(advancement.parent)) : null; - DisplayInfo display = new DisplayInfo(CraftItemStack.asNMSCopy(advancement.icon), + DisplayInfo display = new DisplayInfo(CraftItemStack.asNMSTemplate(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).map(ClientAsset.ResourceTexture::new), AdvancementType.valueOf(advancement.frame.name()), advancement.toast, advancement.announceToChat, advancement.hidden); diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/BlockHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/BlockHelperImpl.java index 3916ff35b8..50d60b6c5b 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/BlockHelperImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/BlockHelperImpl.java @@ -184,11 +184,11 @@ public void doRandomTick(Location location) { 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); + nmsBlock.randomTick(nmsWorld, pos, nmsWorld.getRandom()); } FluidState fluid = nmsBlock.getFluidState(); if (fluid.isRandomlyTicking()) { - fluid.animateTick(nmsWorld, pos, nmsWorld.random); + fluid.animateTick(nmsWorld, pos, nmsWorld.getRandom()); } } diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/FishingHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/FishingHelperImpl.java index 5f52ffec86..f6630b5a3c 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/FishingHelperImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/FishingHelperImpl.java @@ -37,7 +37,7 @@ public org.bukkit.inventory.ItemStack getResult(FishHook fishHook, CatchType cat case DEFAULT -> { ServerLevel nmsWorld = ((CraftWorld) fishHook.getWorld()).getHandle(); ItemStack nmsFishingRod = nmsHook.getPlayerOwner().getMainHandItem(); - float f = nmsWorld.random.nextFloat(); + float f = nmsWorld.getRandom().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; @@ -73,7 +73,7 @@ public ItemStack getRandomReward(FishingHook nmsHook, ResourceKey key .withParameter(LootContextParams.TOOL, new ItemStack(Items.FISHING_ROD)) .create(LootContextParamSets.FISHING); List nmsItems = nmsWorld.getServer().reloadableRegistries().getLootTable(key).getRandomItems(nmsLootParams); - return nmsItems.get(nmsWorld.random.nextInt(nmsItems.size())); + return nmsItems.get(nmsWorld.getRandom().nextInt(nmsItems.size())); } @Override diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/ItemHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/ItemHelperImpl.java index 0cf25fdf8e..10306582e2 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/ItemHelperImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/ItemHelperImpl.java @@ -52,6 +52,7 @@ import net.minecraft.world.item.component.TypedEntityData; import net.minecraft.world.item.crafting.*; import net.minecraft.world.item.crafting.BlastingRecipe; +import net.minecraft.world.item.crafting.CraftingRecipe; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.ShapelessRecipe; import net.minecraft.world.item.crafting.SmithingTransformRecipe; @@ -96,21 +97,20 @@ public class ItemHelperImpl extends ItemHelper { + public static final Recipe.CommonInfo BASE_RECIPE_INFO = new Recipe.CommonInfo(true); + public static net.minecraft.world.item.crafting.RecipeHolder getNMSRecipe(NamespacedKey key) { ResourceKey> nmsKey = ResourceKey.create(Registries.RECIPE, CraftNamespacedKey.toMinecraft(key)); return ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager().byKey(nmsKey).orElse(null); } - public static final Field Item_components = ReflectionHelper.getFields(Item.class).get("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); - 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())); + Holder.Reference nmsItemHolder = BuiltInRegistries.ITEM.get(CraftNamespacedKey.toMinecraft(material.getKey())).orElseThrow(); + nmsItemHolder.bindComponents(DataComponentMap.composite(nmsItemHolder.components(), DataComponentMap.builder().set(DataComponents.MAX_STACK_SIZE, size).build())); } catch (Throwable ex) { Debug.echoError(ex); @@ -211,18 +211,18 @@ public void registerFurnaceRecipe(String keyName, String group, ItemStack result ResourceKey> key = createRecipeKey(keyName); Ingredient itemRecipe = itemArrayToRecipe(ingredient, exact); AbstractCookingRecipe recipe; - CookingBookCategory categoryValue = category == null ? CookingBookCategory.MISC : CookingBookCategory.valueOf(CoreUtilities.toUpperCase(category)); + AbstractCookingRecipe.CookingBookInfo bookInfo = new AbstractCookingRecipe.CookingBookInfo(category == null ? CookingBookCategory.MISC : CookingBookCategory.valueOf(CoreUtilities.toUpperCase(category)), group); if (type.equalsIgnoreCase("smoker")) { - recipe = new SmokingRecipe(group, categoryValue, itemRecipe, CraftItemStack.asNMSCopy(result), exp, time); + recipe = new SmokingRecipe(BASE_RECIPE_INFO, bookInfo, itemRecipe, CraftItemStack.asNMSTemplate(result), exp, time); } else if (type.equalsIgnoreCase("blast")) { - recipe = new BlastingRecipe(group, categoryValue, itemRecipe, CraftItemStack.asNMSCopy(result), exp, time); + recipe = new BlastingRecipe(BASE_RECIPE_INFO, bookInfo, itemRecipe, CraftItemStack.asNMSTemplate(result), exp, time); } else if (type.equalsIgnoreCase("campfire")) { - recipe = new CampfireCookingRecipe(group, categoryValue, itemRecipe, CraftItemStack.asNMSCopy(result), exp, time); + recipe = new CampfireCookingRecipe(BASE_RECIPE_INFO, bookInfo, itemRecipe, CraftItemStack.asNMSTemplate(result), exp, time); } else { - recipe = new SmeltingRecipe(group, categoryValue, itemRecipe, CraftItemStack.asNMSCopy(result), exp, time); + recipe = new SmeltingRecipe(BASE_RECIPE_INFO, bookInfo, itemRecipe, CraftItemStack.asNMSTemplate(result), exp, time); } RecipeHolder holder = new RecipeHolder<>(key, recipe); getRecipeManager().addRecipe(holder); @@ -232,7 +232,7 @@ else if (type.equalsIgnoreCase("campfire")) { public void registerStonecuttingRecipe(String keyName, String group, ItemStack result, ItemStack[] ingredient, boolean exact) { ResourceKey> key = createRecipeKey(keyName); Ingredient itemRecipe = itemArrayToRecipe(ingredient, exact); - StonecutterRecipe recipe = new StonecutterRecipe(group, itemRecipe, CraftItemStack.asNMSCopy(result)); + StonecutterRecipe recipe = new StonecutterRecipe(BASE_RECIPE_INFO, itemRecipe, CraftItemStack.asNMSTemplate(result)); RecipeHolder holder = new RecipeHolder<>(key, recipe); getRecipeManager().addRecipe(holder); } @@ -243,8 +243,7 @@ public void registerSmithingRecipe(String keyName, ItemStack result, ItemStack[] Ingredient templateItemRecipe = templateItem.length == 0 ? null : itemArrayToRecipe(templateItem, templateExact); Ingredient baseItemRecipe = itemArrayToRecipe(baseItem, baseExact); Ingredient upgradeItemRecipe = itemArrayToRecipe(upgradeItem, upgradeExact); - net.minecraft.world.item.ItemStack nmsCopy = CraftItemStack.asNMSCopy(result); - SmithingTransformRecipe recipe = new SmithingTransformRecipe(Optional.ofNullable(templateItemRecipe), baseItemRecipe, Optional.of(upgradeItemRecipe), new TransmuteResult(nmsCopy.getItemHolder(), nmsCopy.getCount(), nmsCopy.getComponentsPatch())); + SmithingTransformRecipe recipe = new SmithingTransformRecipe(BASE_RECIPE_INFO, Optional.ofNullable(templateItemRecipe), baseItemRecipe, Optional.of(upgradeItemRecipe), CraftItemStack.asNMSTemplate(result)); RecipeHolder holder = new RecipeHolder<>(key, recipe); getRecipeManager().addRecipe(holder); } @@ -257,8 +256,7 @@ public void registerShapelessRecipe(String keyName, String group, ItemStack resu 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]))); + ShapelessRecipe recipe = new ShapelessRecipe(BASE_RECIPE_INFO, new CraftingRecipe.CraftingBookInfo(categoryValue, group), CraftItemStack.asNMSTemplate(result), NonNullList.of(null, ingredientList.toArray(new Ingredient[0]))); RecipeHolder holder = new RecipeHolder<>(key, recipe); getRecipeManager().addRecipe(holder); } diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/WorldHelperImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/WorldHelperImpl.java index 92a36c9877..ce84fabd38 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/WorldHelperImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/helpers/WorldHelperImpl.java @@ -16,6 +16,7 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.event.world.TimeSkipEvent; public class WorldHelperImpl implements WorldHelper { @@ -77,7 +78,8 @@ public boolean isNight(World world) { @Override public void setDayTime(World world, long time) { - ((CraftWorld) world).getHandle().setDayTime(time); + ServerLevel nmsWorld = ((CraftWorld) world).getHandle(); + nmsWorld.dimensionType().defaultClock().ifPresent((clock) -> nmsWorld.clockManager().setTotalTicks(clock, time, TimeSkipEvent.SkipReason.CUSTOM)); } @Override @@ -94,17 +96,8 @@ public void wakeUpAllPlayers(World world) { 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().serverLevelData; - data.setRaining(false); - if (!data.isRaining()) { - data.setRainTime(0); - } - data.setThundering(false); - if (!data.isThundering()) { - data.setThunderTime(0); - } + ((CraftWorld) world).getHandle().resetWeatherCycle(); } } diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/ImprovedOfflinePlayerImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/ImprovedOfflinePlayerImpl.java index 17596e6dc2..dfed25aac1 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/ImprovedOfflinePlayerImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/ImprovedOfflinePlayerImpl.java @@ -145,12 +145,10 @@ public void setAttributes(AttributeMap attributes) { 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 = NBTAdapter.toAPI(NbtIo.readCompressed(new FileInputStream(this.file), NbtAccounter.unlimitedHeap())); - return true; - } + this.file = new File(MinecraftServer.getServer().playerDataStorage.getPlayerDir(), this.player + ".dat"); + if (this.file.exists()) { + this.compound = NBTAdapter.toAPI(NbtIo.readCompressed(new FileInputStream(this.file), NbtAccounter.unlimitedHeap())); + return true; } } catch (Exception e) { diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/blocks/BlockLightImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/blocks/BlockLightImpl.java index 6bae8317f4..e64e9483fb 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/blocks/BlockLightImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/blocks/BlockLightImpl.java @@ -54,7 +54,7 @@ public static void enqueueRunnable(LevelChunk chunk, Runnable runnable) { if (lightEngine instanceof ThreadedLevelLightEngine) { ChunkPos coord = chunk.getPos(); try { - LIGHTENGINETHREADED_QUEUERUNNABLE.invoke(lightEngine, coord.x, coord.z, LIGHTENGINETHREADED_TASKTYPE_PRE, runnable); + LIGHTENGINETHREADED_QUEUERUNNABLE.invoke(lightEngine, coord.x(), coord.z(), LIGHTENGINETHREADED_TASKTYPE_PRE, runnable); } catch (Throwable ex) { Debug.echoError(ex); @@ -241,7 +241,7 @@ public void sendNearbyChunkUpdates() { 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); + ChunkAccess other = chunk.getLevel().getChunk(pos.x() + vec.getBlockX(), pos.z() + vec.getBlockZ(), ChunkStatus.FULL, false); if (other instanceof LevelChunk) { sendSingleChunkUpdate((LevelChunk) other); } diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityItemProjectileImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityItemProjectileImpl.java index 60539e4a85..e385265301 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityItemProjectileImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/entities/EntityItemProjectileImpl.java @@ -69,14 +69,6 @@ protected void onHitBlock(BlockHitResult 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(ValueOutput nmsValueOutput) { if (!this.getItemStack().isEmpty()) { diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/DenizenNetworkManagerImpl.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/DenizenNetworkManagerImpl.java index 23e1da3234..4023acd8d5 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/DenizenNetworkManagerImpl.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -271,7 +271,7 @@ public void debugOutputPacket(Packet packet) { } else if (packet instanceof ClientboundSetEntityMotionPacket) { ClientboundSetEntityMotionPacket velPacket = (ClientboundSetEntityMotionPacket) packet; - doPacketOutput("Packet: ClientboundSetEntityMotionPacket sent to " + player.getScoreboardName() + " for entity ID: " + velPacket.getId() + ": " + velPacket.getMovement()); + doPacketOutput("Packet: ClientboundSetEntityMotionPacket sent to " + player.getScoreboardName() + " for entity ID: " + velPacket.id() + ": " + velPacket.movement()); } else if (packet instanceof ClientboundAddEntityPacket) { ClientboundAddEntityPacket addEntityPacket = (ClientboundAddEntityPacket) packet; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/AttachPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/AttachPacketHandlers.java index 195004dedc..848ccb423b 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/AttachPacketHandlers.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/AttachPacketHandlers.java @@ -267,7 +267,7 @@ else if (packet instanceof ClientboundRotateHeadPacket rotateHeadPacket) { return EntityAttachmentHelper.denyOriginalPacketSend(networkManager.player.getUUID(), e.getUUID()) ? null : packet; } else if (packet instanceof ClientboundSetEntityMotionPacket setEntityMotionPacket) { - int ider = setEntityMotionPacket.getId(); + int ider = setEntityMotionPacket.id(); Entity e = networkManager.player.level().getEntity(ider); if (e == null) { return packet; diff --git a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java index 86f1d921c5..d905b22d07 100644 --- a/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java +++ b/v26_1/src/main/java/com/denizenscript/denizen/nms/v26_1/impl/network/handlers/packet/HiddenEntitiesPacketHandlers.java @@ -47,7 +47,7 @@ else if (packet instanceof ClientboundSetEntityDataPacket) { ider = ((ClientboundSetEntityDataPacket) packet).id(); } else if (packet instanceof ClientboundSetEntityMotionPacket) { - ider = ((ClientboundSetEntityMotionPacket) packet).getId(); + ider = ((ClientboundSetEntityMotionPacket) packet).id(); } else if (packet instanceof ClientboundTeleportEntityPacket) { ider = ((ClientboundTeleportEntityPacket) packet).id(); From 04b281ccbdb2d8229a99fbc3d33dd0cd22deebd0 Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Fri, 27 Mar 2026 22:14:42 +0000 Subject: [PATCH 6/7] 26.1 part 6: handle Java 25 --- 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 9060b805b9..9067738df1 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/Denizen.java +++ b/plugin/src/main/java/com/denizenscript/denizen/Denizen.java @@ -147,11 +147,14 @@ 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 Java version. modern Minecraft versions are built for Java 21 or 17. Other Java versions are not guaranteed to function properly."); + getLogger().warning("Running unreliable Java version. modern Minecraft versions are built for Java 25, 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 if (javaVersion.startsWith("25")) { + Debug.log("Running on fully supported Java 25."); + } else { Debug.log("Running on unrecognized (future?) Java version. May or may not work."); } From 06c398a9725b235fcfccdd8cf54266769d5f29ef Mon Sep 17 00:00:00 2001 From: Aya <31237389+tal5@users.noreply.github.com> Date: Sat, 28 Mar 2026 13:58:38 +0000 Subject: [PATCH 7/7] 26.1 part 7: bump Denizen version --- 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 +- v26_1/pom.xml | 2 +- 11 files changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 5246dcd86e..1dd5af587f 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, 1.21.11, and 26.1! +**Version 1.3.2**: Compatible with Spigot 1.17.1, 1.18.2, 1.19.4, 1.20.6, 1.21.11, and 26.1! **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.1-SNAPSHOT + 1.3.2-SNAPSHOT jar provided diff --git a/dist/pom.xml b/dist/pom.xml index a379213c15..5ed619f97c 100644 --- a/dist/pom.xml +++ b/dist/pom.xml @@ -5,7 +5,7 @@ com.denizenscript denizen-parent - 1.3.1-SNAPSHOT + 1.3.2-SNAPSHOT 4.0.0 diff --git a/paper/pom.xml b/paper/pom.xml index 7d3b6b0869..9ca83c1805 100644 --- a/paper/pom.xml +++ b/paper/pom.xml @@ -6,7 +6,7 @@ com.denizenscript denizen-paper - 1.3.1-SNAPSHOT + 1.3.2-SNAPSHOT diff --git a/plugin/pom.xml b/plugin/pom.xml index a6a069d70b..6266771721 100644 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -5,7 +5,7 @@ com.denizenscript denizen - 1.3.1-SNAPSHOT + 1.3.2-SNAPSHOT Denizen Scriptable Minecraft and Citizens2 diff --git a/pom.xml b/pom.xml index 237da72570..70b1bda368 100644 --- a/pom.xml +++ b/pom.xml @@ -6,13 +6,13 @@ com.denizenscript denizen-parent pom - 1.3.1-SNAPSHOT + 1.3.2-SNAPSHOT UTF-8 Unknown CUSTOM - 1.3.1 + 1.3.2 diff --git a/v1_17/pom.xml b/v1_17/pom.xml index 36caa23f16..38e34558a0 100644 --- a/v1_17/pom.xml +++ b/v1_17/pom.xml @@ -6,7 +6,7 @@ com.denizenscript denizen-v1_17 - 1.3.1-SNAPSHOT + 1.3.2-SNAPSHOT diff --git a/v1_18/pom.xml b/v1_18/pom.xml index bda527e371..83179366f0 100644 --- a/v1_18/pom.xml +++ b/v1_18/pom.xml @@ -6,7 +6,7 @@ com.denizenscript denizen-v1_18 - 1.3.1-SNAPSHOT + 1.3.2-SNAPSHOT diff --git a/v1_19/pom.xml b/v1_19/pom.xml index 71d0daf7c3..98ae81ac0b 100644 --- a/v1_19/pom.xml +++ b/v1_19/pom.xml @@ -6,7 +6,7 @@ com.denizenscript denizen-v1_19 - 1.3.1-SNAPSHOT + 1.3.2-SNAPSHOT diff --git a/v1_20/pom.xml b/v1_20/pom.xml index 50b8cebb62..282b840be6 100644 --- a/v1_20/pom.xml +++ b/v1_20/pom.xml @@ -6,7 +6,7 @@ com.denizenscript denizen-v1_20 - 1.3.1-SNAPSHOT + 1.3.2-SNAPSHOT diff --git a/v1_21/pom.xml b/v1_21/pom.xml index 1449c8e8a8..58b14d7cc1 100644 --- a/v1_21/pom.xml +++ b/v1_21/pom.xml @@ -6,7 +6,7 @@ com.denizenscript denizen-v1_21 - 1.3.1-SNAPSHOT + 1.3.2-SNAPSHOT diff --git a/v26_1/pom.xml b/v26_1/pom.xml index 0b20031d3d..89e411ad20 100644 --- a/v26_1/pom.xml +++ b/v26_1/pom.xml @@ -6,7 +6,7 @@ com.denizenscript denizen-v26_1 - 1.3.1-SNAPSHOT + 1.3.2-SNAPSHOT