diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java index 261eb835..f57e0839 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java @@ -40,10 +40,13 @@ import de.steamwar.bausystem.worlddata.WorldData; import de.steamwar.command.AbstractValidator; import de.steamwar.command.SWCommandUtils; import de.steamwar.core.CRIUSleepEvent; +import de.steamwar.core.Core; import de.steamwar.core.WorldEditRendererCUIEditor; +import de.steamwar.core.WorldIdentifier; import de.steamwar.linkage.AbstractLinker; import de.steamwar.linkage.SpigotLinker; import de.steamwar.message.Message; +import de.steamwar.providers.BauServerInfo; import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.GameRule; @@ -131,6 +134,9 @@ public class BauSystem extends JavaPlugin implements Listener { new WorldEditRendererCUIEditor(); Bukkit.getWorlds().get(0).setGameRule(GameRule.SEND_COMMAND_FEEDBACK, false); + + String identifier = BauServerInfo.getOwnerUser().getUUID().toString().replace("-", ""); + WorldIdentifier.set("bau/" + Core.getVersion() + "/" + identifier); } @EventHandler diff --git a/SpigotCore/SpigotCore_19/src/de/steamwar/core/WorldIdentifier19.java b/SpigotCore/SpigotCore_19/src/de/steamwar/core/WorldIdentifier19.java new file mode 100644 index 00000000..74a2dc14 --- /dev/null +++ b/SpigotCore/SpigotCore_19/src/de/steamwar/core/WorldIdentifier19.java @@ -0,0 +1,68 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2025 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.core; + +import com.comphenix.tinyprotocol.TinyProtocol; +import de.steamwar.Reflection; +import net.minecraft.network.protocol.game.PacketPlayOutLogin; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.World; + +public class WorldIdentifier19 implements WorldIdentifier.IWorldIdentifier { + + private static ResourceKey resourceKey = null; + + private static final Class resourceKeyClass = Reflection.getClass("net.minecraft.resources.ResourceKey"); + private static final Class minecraftKeyClass = Reflection.getClass("net.minecraft.resources.MinecraftKey"); + private static final Reflection.Constructor resourceKeyConstructor = Reflection.getConstructor(resourceKeyClass, minecraftKeyClass, minecraftKeyClass); + private static final Reflection.Constructor minecraftKeyConstructor = Reflection.getConstructor(minecraftKeyClass, String.class, String.class); + + @Override + public void setResourceKey(String name) { + resourceKey = (ResourceKey) resourceKeyConstructor.invoke(minecraftKeyConstructor.invoke("minecraft", "dimension"), minecraftKeyConstructor.invoke("steamwar", name)); + } + + public WorldIdentifier19() { + TinyProtocol.instance.addFilter(PacketPlayOutLogin.class, (player, o) -> { + if (resourceKey == null) return o; + PacketPlayOutLogin packet = (PacketPlayOutLogin) o; + + return new PacketPlayOutLogin( + packet.b(), + packet.c(), + packet.d(), + packet.e(), + packet.f(), + packet.g(), + packet.h(), + resourceKey, + packet.j(), + packet.k(), + packet.l(), + packet.m(), + packet.n(), + packet.o(), + packet.p(), + packet.q(), + packet.r() + ); + }); + } +} diff --git a/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldIdentifier20.java b/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldIdentifier20.java new file mode 100644 index 00000000..354d8710 --- /dev/null +++ b/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldIdentifier20.java @@ -0,0 +1,70 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2025 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.core; + +import com.comphenix.tinyprotocol.TinyProtocol; +import de.steamwar.Reflection; +import net.minecraft.network.protocol.game.PacketPlayOutLogin; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.World; + +public class WorldIdentifier20 implements WorldIdentifier.IWorldIdentifier { + + private static ResourceKey resourceKey = null; + + private static final Reflection.Field playerId = Reflection.getField(PacketPlayOutLogin.class, int.class, 0); + private static final Class resourceKeyClass = Reflection.getClass("net.minecraft.resources.ResourceKey"); + private static final Class minecraftKeyClass = Reflection.getClass("net.minecraft.resources.MinecraftKey"); + private static final Reflection.Constructor resourceKeyConstructor = Reflection.getConstructor(resourceKeyClass, minecraftKeyClass, minecraftKeyClass); + private static final Reflection.Constructor minecraftKeyConstructor = Reflection.getConstructor(minecraftKeyClass, String.class, String.class); + + @Override + public void setResourceKey(String name) { + resourceKey = (ResourceKey) resourceKeyConstructor.invoke(minecraftKeyConstructor.invoke("minecraft", "dimension"), minecraftKeyConstructor.invoke("steamwar", name)); + } + + public WorldIdentifier20() { + TinyProtocol.instance.addFilter(PacketPlayOutLogin.class, (player, o) -> { + if (resourceKey == null) return o; + PacketPlayOutLogin packet = (PacketPlayOutLogin) o; + + return new PacketPlayOutLogin( + playerId.get(packet), + packet.c(), + packet.d(), + packet.e(), + packet.f(), + packet.g(), + packet.h(), + resourceKey, + packet.j(), + packet.k(), + packet.l(), + packet.m(), + packet.n(), + packet.o(), + packet.p(), + packet.q(), + packet.r(), + packet.s() + ); + }); + } +} diff --git a/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldIdentifier21.java b/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldIdentifier21.java new file mode 100644 index 00000000..8553124c --- /dev/null +++ b/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldIdentifier21.java @@ -0,0 +1,73 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2025 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.core; + +import com.comphenix.tinyprotocol.TinyProtocol; +import de.steamwar.Reflection; +import net.minecraft.network.protocol.game.ClientboundLoginPacket; +import net.minecraft.network.protocol.game.CommonPlayerSpawnInfo; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; + +public class WorldIdentifier21 implements WorldIdentifier.IWorldIdentifier { + + private static ResourceKey resourceKey = null; + + private static final Class resourceKeyClass = Reflection.getClass("net.minecraft.resources.ResourceKey"); + private static final Class minecraftKeyClass = Reflection.getClass("net.minecraft.resources.MinecraftKey"); + private static final Reflection.Constructor resourceKeyConstructor = Reflection.getConstructor(resourceKeyClass, minecraftKeyClass, minecraftKeyClass); + private static final Reflection.Constructor minecraftKeyConstructor = Reflection.getConstructor(minecraftKeyClass, String.class, String.class); + + @Override + public void setResourceKey(String name) { + resourceKey = (ResourceKey) resourceKeyConstructor.invoke(minecraftKeyConstructor.invoke("minecraft", "dimension"), minecraftKeyConstructor.invoke("steamwar", name)); + } + + public WorldIdentifier21() { + TinyProtocol.instance.addFilter(ClientboundLoginPacket.class, (player, o) -> { + if (resourceKey == null) return o; + ClientboundLoginPacket packet = (ClientboundLoginPacket) o; + + return new ClientboundLoginPacket(packet.playerId(), + packet.hardcore(), + packet.levels(), + packet.maxPlayers(), + packet.chunkRadius(), + packet.simulationDistance(), + packet.reducedDebugInfo(), + packet.showDeathScreen(), + packet.doLimitedCrafting(), + new CommonPlayerSpawnInfo( + packet.commonPlayerSpawnInfo().dimensionType(), + resourceKey, + packet.commonPlayerSpawnInfo().seed(), + packet.commonPlayerSpawnInfo().gameType(), + packet.commonPlayerSpawnInfo().previousGameType(), + packet.commonPlayerSpawnInfo().isDebug(), + packet.commonPlayerSpawnInfo().isFlat(), + packet.commonPlayerSpawnInfo().lastDeathLocation(), + packet.commonPlayerSpawnInfo().portalCooldown(), + packet.commonPlayerSpawnInfo().seaLevel() + ), + packet.enforcesSecureChat() + ); + }); + } +} diff --git a/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldIdentifier8.java b/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldIdentifier8.java new file mode 100644 index 00000000..632201bb --- /dev/null +++ b/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldIdentifier8.java @@ -0,0 +1,27 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2025 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.core; + +public class WorldIdentifier8 implements WorldIdentifier.IWorldIdentifier { + + @Override + public void setResourceKey(String name) { + } +} diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldIdentifier.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldIdentifier.java new file mode 100644 index 00000000..14e3db31 --- /dev/null +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldIdentifier.java @@ -0,0 +1,33 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2025 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.core; + +public class WorldIdentifier { + + private static final IWorldIdentifier impl = VersionDependent.getVersionImpl(Core.getInstance()); + + public static void set(String name) { + impl.setResourceKey(name); + } + + protected interface IWorldIdentifier { + void setResourceKey(String name); + } +}