From c0db064b4f3c2d140c000f3d2be118f5b2e7aded Mon Sep 17 00:00:00 2001 From: David Berdik Date: Mon, 7 Mar 2022 22:06:25 -0500 Subject: [PATCH] Migrated codebase to Spigot 1.18.2 --- build.gradle.kts | 2 +- .../herobrine/AI/AICore.java | 2 +- .../herobrine/Herobrine.java | 40 ++++++++++++++++--- .../herobrine/NPC/Entity/HumanEntity.java | 4 +- .../herobrine/NPC/NMS/NMSServer.java | 2 +- .../herobrine/NPC/NMS/NMSWorld.java | 2 +- .../herobrine/NPC/Network/NetworkUtils.java | 2 +- .../herobrine/commands/CmdExecutor.java | 2 +- .../herobrine/entity/EntityManager.java | 4 +- .../herobrine/listeners/PlayerListener.java | 2 +- 10 files changed, 46 insertions(+), 16 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 8a2d539..4ef5100 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,4 +1,4 @@ -val mc_version="1.18.1" +val mc_version="1.18.2" plugins { `java-library` diff --git a/src/main/java/net/theprogrammersworld/herobrine/AI/AICore.java b/src/main/java/net/theprogrammersworld/herobrine/AI/AICore.java index 1d74c5e..bbaa8f1 100644 --- a/src/main/java/net/theprogrammersworld/herobrine/AI/AICore.java +++ b/src/main/java/net/theprogrammersworld/herobrine/AI/AICore.java @@ -8,7 +8,7 @@ import org.bukkit.Effect; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; diff --git a/src/main/java/net/theprogrammersworld/herobrine/Herobrine.java b/src/main/java/net/theprogrammersworld/herobrine/Herobrine.java index 923c642..31115bd 100644 --- a/src/main/java/net/theprogrammersworld/herobrine/Herobrine.java +++ b/src/main/java/net/theprogrammersworld/herobrine/Herobrine.java @@ -1,7 +1,9 @@ package net.theprogrammersworld.herobrine; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; +import java.util.IdentityHashMap; import java.util.List; import java.util.Map; import java.util.logging.Logger; @@ -25,7 +27,10 @@ import org.bukkit.plugin.java.JavaPlugin; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; +import net.minecraft.core.Holder; +import net.minecraft.core.MappedRegistry; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; import net.theprogrammersworld.herobrine.AI.AICore; import net.theprogrammersworld.herobrine.AI.Core.CoreType; import net.theprogrammersworld.herobrine.AI.extensions.GraveyardWorld; @@ -78,7 +83,7 @@ public class Herobrine extends JavaPlugin implements Listener { // If it is not, print an error message and disable the plugin. if (continueWithEnable) { try { - Class.forName("org.bukkit.craftbukkit.v1_18_R1.CraftArt"); + Class.forName("org.bukkit.craftbukkit.v1_18_R2.CraftArt"); } catch (ClassNotFoundException e) { Bukkit.getServer().getConsoleSender().sendMessage(ChatColor.RED + "This version of Herobrine is not " + "compatible with this server's Spigot version and will be disabled."); @@ -352,9 +357,34 @@ public class Herobrine extends JavaPlugin implements Listener { private static void addCustomEntity(String customName, EntityType.EntityFactory _func, MobCategory enumCreatureType) { // Registers a custom entity. Adapted from https://www.spigotmc.org/threads/handling-custom-entity-registry-on-spigot-1-13.353426/#post-3447111 - EntityType.Builder entity = EntityType.Builder.of(_func, enumCreatureType); - entity.noSummon(); - Registry.register(Registry.ENTITY_TYPE, customName, entity.build(customName)); + // As of 1.18.2, this function was updated to unfreeze and freeze the entity registry when adding a new custom entity. Additionally, a conditional + // check was added to prevent the plugin from crashing due to an attempt to add the same custom entity twice. + if (!Registry.ENTITY_TYPE.getOptional(new ResourceLocation(customName)).isPresent()) { + unfreezeRegistry(); + EntityType.Builder entity = EntityType.Builder.of(_func, enumCreatureType); + entity.noSummon(); + Registry.register(Registry.ENTITY_TYPE, customName, entity.build(customName)); + Registry.ENTITY_TYPE.freeze(); + } + } + + private static void unfreezeRegistry() { + // As of 1.18.2, registries are frozen once NMS is done adding to them, so we have to do some super hacky things to add custom entities now. + // Adapted from https://github.com/iSach/UltraCosmetics/blob/7f8bbfd2a540559888b89dae7eee4dec482ab7c9/v1_18_R2/src/main/java/be/isach/ultracosmetics/ + // v1_18_R2/customentities/CustomEntities.java#L75-L104 + final String INTRUSIVE_HOLDER_CACHE = "bN"; + final String FROZEN = "bL"; + Class registryClass = MappedRegistry.class; + try { + Field intrusiveHolderCache = registryClass.getDeclaredField(INTRUSIVE_HOLDER_CACHE); + intrusiveHolderCache.setAccessible(true); + intrusiveHolderCache.set(Registry.ENTITY_TYPE, new IdentityHashMap, Holder.Reference>>()); + Field frozen = registryClass.getDeclaredField(FROZEN); + frozen.setAccessible(true); + frozen.set(Registry.ENTITY_TYPE, false); + } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + e.printStackTrace(); + return; + } } - } diff --git a/src/main/java/net/theprogrammersworld/herobrine/NPC/Entity/HumanEntity.java b/src/main/java/net/theprogrammersworld/herobrine/NPC/Entity/HumanEntity.java index 9ba7c85..8df0b54 100644 --- a/src/main/java/net/theprogrammersworld/herobrine/NPC/Entity/HumanEntity.java +++ b/src/main/java/net/theprogrammersworld/herobrine/NPC/Entity/HumanEntity.java @@ -9,8 +9,8 @@ import net.theprogrammersworld.herobrine.NPC.NMS.NMSWorld; import net.theprogrammersworld.herobrine.NPC.Network.NetworkHandler; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_18_R1.CraftServer; -import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_18_R2.CraftServer; +import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer; import com.mojang.authlib.GameProfile; diff --git a/src/main/java/net/theprogrammersworld/herobrine/NPC/NMS/NMSServer.java b/src/main/java/net/theprogrammersworld/herobrine/NPC/NMS/NMSServer.java index e5151de..5bffcfc 100644 --- a/src/main/java/net/theprogrammersworld/herobrine/NPC/NMS/NMSServer.java +++ b/src/main/java/net/theprogrammersworld/herobrine/NPC/NMS/NMSServer.java @@ -12,7 +12,7 @@ import net.minecraft.server.MinecraftServer; import org.bukkit.Bukkit; import org.bukkit.Server; -import org.bukkit.craftbukkit.v1_18_R1.CraftServer; +import org.bukkit.craftbukkit.v1_18_R2.CraftServer; public class NMSServer { diff --git a/src/main/java/net/theprogrammersworld/herobrine/NPC/NMS/NMSWorld.java b/src/main/java/net/theprogrammersworld/herobrine/NPC/NMS/NMSWorld.java index dce518a..af06512 100644 --- a/src/main/java/net/theprogrammersworld/herobrine/NPC/NMS/NMSWorld.java +++ b/src/main/java/net/theprogrammersworld/herobrine/NPC/NMS/NMSWorld.java @@ -8,7 +8,7 @@ import net.minecraft.server.level.ChunkMap; import net.minecraft.server.level.ServerLevel; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_18_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_18_R2.CraftWorld; public class NMSWorld { diff --git a/src/main/java/net/theprogrammersworld/herobrine/NPC/Network/NetworkUtils.java b/src/main/java/net/theprogrammersworld/herobrine/NPC/Network/NetworkUtils.java index 00709bc..cc0b877 100644 --- a/src/main/java/net/theprogrammersworld/herobrine/NPC/Network/NetworkUtils.java +++ b/src/main/java/net/theprogrammersworld/herobrine/NPC/Network/NetworkUtils.java @@ -5,7 +5,7 @@ import net.minecraft.network.protocol.Packet; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; diff --git a/src/main/java/net/theprogrammersworld/herobrine/commands/CmdExecutor.java b/src/main/java/net/theprogrammersworld/herobrine/commands/CmdExecutor.java index 29cab5c..516e1de 100644 --- a/src/main/java/net/theprogrammersworld/herobrine/commands/CmdExecutor.java +++ b/src/main/java/net/theprogrammersworld/herobrine/commands/CmdExecutor.java @@ -8,7 +8,7 @@ import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer; import org.bukkit.entity.Player; import net.minecraft.network.chat.ChatType; diff --git a/src/main/java/net/theprogrammersworld/herobrine/entity/EntityManager.java b/src/main/java/net/theprogrammersworld/herobrine/entity/EntityManager.java index f5f4be8..c2c2ba4 100644 --- a/src/main/java/net/theprogrammersworld/herobrine/entity/EntityManager.java +++ b/src/main/java/net/theprogrammersworld/herobrine/entity/EntityManager.java @@ -14,7 +14,7 @@ public class EntityManager { public void spawnCustomZombie(Location loc,MobType mbt){ World world = loc.getWorld(); - net.minecraft.world.level.Level mcWorld = ((org.bukkit.craftbukkit.v1_18_R1.CraftWorld) world).getHandle(); + net.minecraft.world.level.Level mcWorld = ((org.bukkit.craftbukkit.v1_18_R2.CraftWorld) world).getHandle(); CustomZombie zmb = new CustomZombie(mcWorld,loc,mbt); mcWorld.addFreshEntity(zmb, SpawnReason.CUSTOM); mobList.put(Integer.valueOf(zmb.getBukkitEntity().getEntityId()),zmb); @@ -24,7 +24,7 @@ public class EntityManager { public void spawnCustomSkeleton(Location loc,MobType mbt){ World world = loc.getWorld(); - net.minecraft.world.level.Level mcWorld = ((org.bukkit.craftbukkit.v1_18_R1.CraftWorld) world).getHandle(); + net.minecraft.world.level.Level mcWorld = ((org.bukkit.craftbukkit.v1_18_R2.CraftWorld) world).getHandle(); CustomSkeleton zmb = new CustomSkeleton(mcWorld,loc,mbt); mcWorld.addFreshEntity(zmb, SpawnReason.CUSTOM); mobList.put(Integer.valueOf(zmb.getBukkitEntity().getEntityId()), zmb); diff --git a/src/main/java/net/theprogrammersworld/herobrine/listeners/PlayerListener.java b/src/main/java/net/theprogrammersworld/herobrine/listeners/PlayerListener.java index 23e6164..bfa9772 100644 --- a/src/main/java/net/theprogrammersworld/herobrine/listeners/PlayerListener.java +++ b/src/main/java/net/theprogrammersworld/herobrine/listeners/PlayerListener.java @@ -9,7 +9,7 @@ import net.theprogrammersworld.herobrine.Utils; import net.theprogrammersworld.herobrine.misc.ItemName; import org.bukkit.*; import org.bukkit.block.Jukebox; -import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler;