From d2342d79931a860f163b0a10c49d0a63468785fe Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Wed, 6 Aug 2025 17:21:57 +0200 Subject: [PATCH] Fix bobby in DynamicRegionSystem --- .../bausystem/region/DynamicRegionSystem.java | 50 ++++++++++++++++++- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionSystem.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionSystem.java index 48eef262..7b8f6a8c 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionSystem.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionSystem.java @@ -19,6 +19,8 @@ package de.steamwar.bausystem.region; +import com.comphenix.tinyprotocol.TinyProtocol; +import de.steamwar.Reflection; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.region.dynamic.DynamicRegion; import de.steamwar.bausystem.region.dynamic.MovementListener; @@ -28,11 +30,16 @@ import de.steamwar.bausystem.region.dynamic.path.PathRegion; import de.steamwar.bausystem.region.dynamic.spawn.SpawnPathRegion; import de.steamwar.bausystem.region.dynamic.spawn.SpawnRegion; import de.steamwar.bausystem.region.dynamic.spawn.SpawnResetter; +import de.steamwar.core.Core; +import de.steamwar.providers.BauServerInfo; import lombok.NonNull; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; +import sun.misc.Unsafe; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.RecordComponent; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -44,14 +51,53 @@ public class DynamicRegionSystem implements RegionSystem { private static Map regionMap = new HashMap<>(); + private Class loginPacket = Reflection.getClass("net.minecraft.network.protocol.game.ClientboundLoginPacket"); + private Class commonPlayerSpawnInfo = Reflection.getClass("net.minecraft.network.protocol.game.CommonPlayerSpawnInfo"); + private Reflection.Constructor loginPacketConstructor = Reflection.getConstructor(loginPacket, int.class, boolean.class, Set.class, int.class, int.class, int.class, boolean.class, boolean.class, boolean.class, commonPlayerSpawnInfo, boolean.class); + private Class holderClass = Reflection.getClass("net.minecraft.core.Holder"); + private Class resourceKeyClass = Reflection.getClass("net.minecraft.resources.ResourceKey"); + private Class gameTypeClass = Reflection.getClass("net.minecraft.world.level.GameType"); + private Reflection.Constructor commonPlayerSpawnInfoConstructor = Reflection.getConstructor(commonPlayerSpawnInfo, holderClass, resourceKeyClass, long.class, gameTypeClass, gameTypeClass, boolean.class, boolean.class, Optional.class, int.class, int.class); + private Class minecraftKeyClass = Reflection.getClass("net.minecraft.resources.MinecraftKey"); + private Reflection.Constructor resourceKeyConstructor = Reflection.getConstructor(resourceKeyClass, minecraftKeyClass, minecraftKeyClass); + private Reflection.Constructor minecraftKeyConstructor = Reflection.getConstructor(minecraftKeyClass, String.class, String.class); + @Override public void load() { INSTANCE = this; + String identifier = BauServerInfo.getOwnerUser().getUUID().toString().replace("-", ""); + Object resourceKey = resourceKeyConstructor.invoke(minecraftKeyConstructor.invoke("minecraft", "dimension"), minecraftKeyConstructor.invoke("steamwar", "bau/" + Core.getVersion() + "/" + identifier)); + TinyProtocol.instance.addFilter(loginPacket, (player, o) -> { + RecordComponent[] components = loginPacket.getRecordComponents(); + Object[] parameters_loginPacket = new Object[components.length]; + for (int i = 0; i < components.length; i++) { + try { + parameters_loginPacket[i] = components[i].getAccessor().invoke(o); + } catch (IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + } + parameters_loginPacket[2] = Set.of(resourceKey); + + components = commonPlayerSpawnInfo.getRecordComponents(); + Object[] parameters_commonPlayerSpawnInfo = new Object[components.length]; + for (int i = 0; i < components.length; i++) { + try { + parameters_commonPlayerSpawnInfo[i] = components[i].getAccessor().invoke(parameters_loginPacket[9]); + } catch (IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + } + parameters_commonPlayerSpawnInfo[1] = resourceKey; + parameters_loginPacket[9] = commonPlayerSpawnInfoConstructor.invoke(parameters_commonPlayerSpawnInfo); + + return loginPacketConstructor.invoke(parameters_loginPacket); + }); new DynamicRegionCommand(); RegionDataRepository.loadRegions(); Bukkit.getPluginManager().registerEvents(new MovementListener(), BauSystem.getInstance()); - if (regionMap.isEmpty()) { + if (regionMap.isEmpty()) { // TODO: Implement this in default region! new SpawnRegion(-9, -9); new SpawnPathRegion(-9, -28); new SpawnPathRegion(-9, 10); @@ -130,7 +176,7 @@ public class DynamicRegionSystem implements RegionSystem { neighbours.add(get(new Location(WORLD, maxX, 0, z), regions)); } neighbours.remove(GlobalRegion.INSTANCE); - return ((Set)(Set) neighbours).stream(); + return ((Set) (Set) neighbours).stream(); } public Stream getNeighbours(Region region) {