From e46958686c30a5771844023b7a6b2252af64c026 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E9=9B=A8=E8=90=BD?= Date: Wed, 21 Aug 2024 22:56:30 +0800 Subject: [PATCH] Fix: teleporting, mixin function fighting and a warning. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 秋雨落 --- .../server/subserver/PlayerManagerMixin.java | 44 +++++++++++-------- .../subserver/ServerPlayerEntityMixin.java | 11 ++--- .../module/room/CreativeRoomModule.java | 2 +- 3 files changed, 33 insertions(+), 24 deletions(-) diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/subserver/PlayerManagerMixin.java b/src/main/java/io/ib67/sfcraft/mixin/server/subserver/PlayerManagerMixin.java index fe167dc..6e5e12f 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/subserver/PlayerManagerMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/server/subserver/PlayerManagerMixin.java @@ -2,13 +2,15 @@ package io.ib67.sfcraft.mixin.server.subserver; import io.ib67.sfcraft.SFCraft; import io.ib67.sfcraft.registry.RoomRegistry; -import io.ib67.sfcraft.subserver.Room; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.entity.Entity; import net.minecraft.network.ClientConnection; import net.minecraft.server.PlayerManager; import net.minecraft.server.network.ConnectedClientData; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.GlobalPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.TeleportTarget; import org.slf4j.Logger; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -17,8 +19,9 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.util.Optional; +import java.util.Set; @Mixin(PlayerManager.class) @@ -27,31 +30,36 @@ public abstract class PlayerManagerMixin { @Final private static Logger LOGGER; - @Redirect(method = "onPlayerConnect", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayerEntity;setServerWorld(Lnet/minecraft/server/world/ServerWorld;)V")) - public void sf$modifyToRoomWorld(ServerPlayerEntity instance, ServerWorld world) { - var registry = SFCraft.getInjector().getInstance(RoomRegistry.class); - var room = registry.getRoomBy(instance.getUuid()); - if (room != null) { - var pos = room.getSpawnPosition(); - var nWorld = world.getServer().getWorld(pos.dimension()); - instance.setServerWorld(nWorld); - var _pos = pos.pos(); - instance.setPos(_pos.getX(), _pos.getY(), _pos.getZ()); - } else { - instance.setServerWorld(world); - } - } - @Inject(method = "onPlayerConnect", at = @At("TAIL")) public void sf$updateSession(ClientConnection connection, ServerPlayerEntity player, ConnectedClientData clientData, CallbackInfo ci) { var registry = SFCraft.getInjector().getInstance(RoomRegistry.class); var room = registry.getRoomBy(player.getUuid()); if (room != null) { + var spawn = room.getSpawnPosition(); + teleportToRoom(player, spawn); + LOGGER.info("Room player joined as " + player.getName().getLiteralString() + "/" + player.getUuid()); room.onPlayerJoin(player); } } + @Inject(method = "respawnPlayer", at = @At("TAIL")) + public void sf$updateSession(ServerPlayerEntity player, boolean alive, Entity.RemovalReason removalReason, CallbackInfoReturnable cir) { + var registry = SFCraft.getInjector().getInstance(RoomRegistry.class); + var room = registry.getRoomBy(player.getUuid()); + if (!alive && room != null) { + var spawn = room.getSpawnPosition(); + teleportToRoom(cir.getReturnValue(), spawn); + } + } + + private void teleportToRoom(ServerPlayerEntity player, GlobalPos spawn) { + var world = player.getServer().getWorld(spawn.dimension()); + var pos = spawn.pos(); + world.getChunkManager().chunkLoadingManager.getTicketManager().handleChunkEnter(player.getWatchedSection(), player); + player.teleport(world, pos.getX(), pos.getY(), pos.getZ(), Set.of(), 0, 0); + } + @Inject(method = "remove", at = @At("HEAD")) public void sf$removePlayers(ServerPlayerEntity instance, CallbackInfo ci) { var registry = SFCraft.getInjector().getInstance(RoomRegistry.class); diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/subserver/ServerPlayerEntityMixin.java b/src/main/java/io/ib67/sfcraft/mixin/server/subserver/ServerPlayerEntityMixin.java index 755616a..9424f52 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/subserver/ServerPlayerEntityMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/server/subserver/ServerPlayerEntityMixin.java @@ -2,7 +2,6 @@ package io.ib67.sfcraft.mixin.server.subserver; import io.ib67.sfcraft.SFCraft; import io.ib67.sfcraft.registry.RoomRegistry; -import io.ib67.sfcraft.util.Helper; import net.minecraft.network.packet.s2c.play.PositionFlag; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; @@ -18,8 +17,9 @@ import java.util.Set; public abstract class ServerPlayerEntityMixin { @Inject(at = @At("HEAD"), method = "teleport(Lnet/minecraft/server/world/ServerWorld;DDDLjava/util/Set;FF)Z", cancellable = true) public void sf$interceptTeleport(ServerWorld world, double destX, double destY, double destZ, Set flags, float yaw, float pitch, CallbackInfoReturnable cir) { - if (Helper.isVirtual($this().getUuid())) { - if (world != $this().getServerWorld()) { + var room = roomRegistry().getRoomBy($this().getUuid()); + if (room != null) { + if (world.getRegistryKey() != room.getSpawnPosition().dimension()) { cir.setReturnValue(false); } } @@ -27,8 +27,9 @@ public abstract class ServerPlayerEntityMixin { @Inject(at = @At("HEAD"), method = "teleport(Lnet/minecraft/server/world/ServerWorld;DDDFF)V", cancellable = true) public void sf$interceptTeleport(ServerWorld targetWorld, double x, double y, double z, float yaw, float pitch, CallbackInfo ci) { - if (Helper.isVirtual($this().getUuid())) { - if (targetWorld != $this().getServerWorld()) { + var room = roomRegistry().getRoomBy($this().getUuid()); + if (room != null) { + if (targetWorld.getRegistryKey() != room.getSpawnPosition().dimension()) { ci.cancel(); } } diff --git a/src/main/java/io/ib67/sfcraft/module/room/CreativeRoomModule.java b/src/main/java/io/ib67/sfcraft/module/room/CreativeRoomModule.java index 28bc357..c1060b3 100644 --- a/src/main/java/io/ib67/sfcraft/module/room/CreativeRoomModule.java +++ b/src/main/java/io/ib67/sfcraft/module/room/CreativeRoomModule.java @@ -36,7 +36,7 @@ public class CreativeRoomModule extends ServerModule { .register(this::registerCommand); room = new CreativeSpaceRoom(); roomRegistry.registerRoomType(CreativeSpaceRoom.class, CreativeSpaceRoom.WORLD, new CreativeSpaceFactory(room)); - roomRegistry.createRoomOf(CreativeSpaceRoom.class, CreativeSpaceRoom.IDENTIFIER, null, null); + roomRegistry.createRoomOf(CreativeSpaceRoom.class, CreativeSpaceRoom.IDENTIFIER, null, (String) null); roomModule.enqueuePregen(CreativeSpaceRoom.WORLD,CreativeSpaceRoom.SPAWN_POS); }