Fix: teleporting, mixin function fighting and a warning.

Signed-off-by: 秋雨落 <i@rain.cx>
This commit is contained in:
秋雨落 committed 2024-08-21 22:56:30 +08:00
1 parent 96dbc0ea65
commit e46958686c
3 files changed
+33 -24

No files matched your search

@@ -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<ServerPlayerEntity> 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);
@@ -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<PositionFlag> flags, float yaw, float pitch, CallbackInfoReturnable<Boolean> 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();
}
}
@@ -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);
}