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.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);
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user