Fix: teleporting, mixin function fighting and a warning.
Signed-off-by: 秋雨落 <i@rain.cx>
This commit is contained in:
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.SFCraft;
|
||||||
import io.ib67.sfcraft.registry.RoomRegistry;
|
import io.ib67.sfcraft.registry.RoomRegistry;
|
||||||
import io.ib67.sfcraft.subserver.Room;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.nbt.NbtCompound;
|
|
||||||
import net.minecraft.network.ClientConnection;
|
import net.minecraft.network.ClientConnection;
|
||||||
import net.minecraft.server.PlayerManager;
|
import net.minecraft.server.PlayerManager;
|
||||||
import net.minecraft.server.network.ConnectedClientData;
|
import net.minecraft.server.network.ConnectedClientData;
|
||||||
import net.minecraft.server.network.ServerPlayerEntity;
|
import net.minecraft.server.network.ServerPlayerEntity;
|
||||||
import net.minecraft.server.world.ServerWorld;
|
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.slf4j.Logger;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
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.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
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)
|
@Mixin(PlayerManager.class)
|
||||||
|
|
||||||
@@ -27,31 +30,36 @@ public abstract class PlayerManagerMixin {
|
|||||||
@Final
|
@Final
|
||||||
private static Logger LOGGER;
|
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"))
|
@Inject(method = "onPlayerConnect", at = @At("TAIL"))
|
||||||
public void sf$updateSession(ClientConnection connection, ServerPlayerEntity player, ConnectedClientData clientData, CallbackInfo ci) {
|
public void sf$updateSession(ClientConnection connection, ServerPlayerEntity player, ConnectedClientData clientData, CallbackInfo ci) {
|
||||||
var registry = SFCraft.getInjector().getInstance(RoomRegistry.class);
|
var registry = SFCraft.getInjector().getInstance(RoomRegistry.class);
|
||||||
var room = registry.getRoomBy(player.getUuid());
|
var room = registry.getRoomBy(player.getUuid());
|
||||||
if (room != null) {
|
if (room != null) {
|
||||||
|
var spawn = room.getSpawnPosition();
|
||||||
|
teleportToRoom(player, spawn);
|
||||||
|
|
||||||
LOGGER.info("Room player joined as " + player.getName().getLiteralString() + "/" + player.getUuid());
|
LOGGER.info("Room player joined as " + player.getName().getLiteralString() + "/" + player.getUuid());
|
||||||
room.onPlayerJoin(player);
|
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"))
|
@Inject(method = "remove", at = @At("HEAD"))
|
||||||
public void sf$removePlayers(ServerPlayerEntity instance, CallbackInfo ci) {
|
public void sf$removePlayers(ServerPlayerEntity instance, CallbackInfo ci) {
|
||||||
var registry = SFCraft.getInjector().getInstance(RoomRegistry.class);
|
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.SFCraft;
|
||||||
import io.ib67.sfcraft.registry.RoomRegistry;
|
import io.ib67.sfcraft.registry.RoomRegistry;
|
||||||
import io.ib67.sfcraft.util.Helper;
|
|
||||||
import net.minecraft.network.packet.s2c.play.PositionFlag;
|
import net.minecraft.network.packet.s2c.play.PositionFlag;
|
||||||
import net.minecraft.server.network.ServerPlayerEntity;
|
import net.minecraft.server.network.ServerPlayerEntity;
|
||||||
import net.minecraft.server.world.ServerWorld;
|
import net.minecraft.server.world.ServerWorld;
|
||||||
@@ -18,8 +17,9 @@ import java.util.Set;
|
|||||||
public abstract class ServerPlayerEntityMixin {
|
public abstract class ServerPlayerEntityMixin {
|
||||||
@Inject(at = @At("HEAD"), method = "teleport(Lnet/minecraft/server/world/ServerWorld;DDDLjava/util/Set;FF)Z", cancellable = true)
|
@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) {
|
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())) {
|
var room = roomRegistry().getRoomBy($this().getUuid());
|
||||||
if (world != $this().getServerWorld()) {
|
if (room != null) {
|
||||||
|
if (world.getRegistryKey() != room.getSpawnPosition().dimension()) {
|
||||||
cir.setReturnValue(false);
|
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)
|
@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) {
|
public void sf$interceptTeleport(ServerWorld targetWorld, double x, double y, double z, float yaw, float pitch, CallbackInfo ci) {
|
||||||
if (Helper.isVirtual($this().getUuid())) {
|
var room = roomRegistry().getRoomBy($this().getUuid());
|
||||||
if (targetWorld != $this().getServerWorld()) {
|
if (room != null) {
|
||||||
|
if (targetWorld.getRegistryKey() != room.getSpawnPosition().dimension()) {
|
||||||
ci.cancel();
|
ci.cancel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ public class CreativeRoomModule extends ServerModule {
|
|||||||
.register(this::registerCommand);
|
.register(this::registerCommand);
|
||||||
room = new CreativeSpaceRoom();
|
room = new CreativeSpaceRoom();
|
||||||
roomRegistry.registerRoomType(CreativeSpaceRoom.class, CreativeSpaceRoom.WORLD, new CreativeSpaceFactory(room));
|
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);
|
roomModule.enqueuePregen(CreativeSpaceRoom.WORLD,CreativeSpaceRoom.SPAWN_POS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user