баг с порталом

Версия Minecraft
1.19.2
API
Fabric
14
1
3
Доброго времени суток. У меня в моде есть кастомное измерение, если дать тп в него через /execute.... то все оки, все работает, я добавил блок-портал:
avTeleportBlock:
 @Override
    public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) {
        if (world instanceof ServerWorld && !entity.hasVehicle() && !entity.hasPassengers() && entity.canUsePortals() && VoxelShapes.matchesAnywhere(VoxelShapes.cuboid(entity.getBoundingBox().offset((double)(-pos.getX()), (double)(-pos.getY()), (double)(-pos.getZ()))), state.getOutlineShape(world, pos), BooleanBiFunction.AND)) {
            RegistryKey<World> registryKey = world.getRegistryKey() == ModDimension.AVDIM_LEVEL_KEY ? World.OVERWORLD : ModDimension.AVDIM_LEVEL_KEY;
            ServerWorld serverWorld = ((ServerWorld)world).getServer().getWorld(registryKey);
            if (serverWorld == null) {
                return;
            }
            entity.moveToWorld(serverWorld).teleport(50,50,50);// числа для теста
            serverWorld.onPlayerTeleport((ServerPlayerEntity) entity);
        }
    }
При заходе в портал появляется что-то типа фантомного мира(блоки не ломаются, а новые ставятся неохотно) и в логах спамит ошибка(чуть ниже)

После перезахода в мир, оказываюсь в вверхнем мире, при этом блоки что я ставил в своем мире, появились в вверхнем. Предполагаю что просто сущность плеера из вверхнего мира не удаляется, ну или нужно это как то пакетами делать, или еще что-то..
 
Краш-лог
16:13:15] [Server thread/ERROR] (Minecraft) Failed to handle packet net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket$Full@67a4f159, suppressing error
java.lang.NullPointerException: Cannot invoke "it.unimi.dsi.fastutil.objects.ObjectSet.remove(Object)" because "objectSet" is null
at net.minecraft.server.world.ChunkTicketManager.handleChunkLeave(ChunkTicketManager.java:231) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
at net.minecraft.server.world.ThreadedAnvilChunkStorage.updatePosition(ThreadedAnvilChunkStorage.java:1107) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
at net.minecraft.server.world.ServerChunkManager.updatePosition(ServerChunkManager.java:466) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
at net.minecraft.server.network.ServerPlayNetworkHandler.onPlayerMove(ServerPlayNetworkHandler.java:1001) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
at net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket.apply(PlayerMoveC2SPacket.java:114) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
at net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket$Full.apply(PlayerMoveC2SPacket.java:16) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
at net.minecraft.network.NetworkThreadUtils.method_11072(NetworkThreadUtils.java:22) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
///
[Server thread/ERROR] (Minecraft) Failed to handle packet net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket$PositionAndOnGround@6b749da9, suppressing error
java.lang.NullPointerException: Cannot invoke "it.unimi.dsi.fastutil.objects.ObjectSet.remove(Object)" because "objectSet" is null
at net.minecraft.server.world.ChunkTicketManager.handleChunkLeave(ChunkTicketManager.java:231) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
at net.minecraft.server.world.ThreadedAnvilChunkStorage.updatePosition(ThreadedAnvilChunkStorage.java:1107) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
at net.minecraft.server.world.ServerChunkManager.updatePosition(ServerChunkManager.java:466) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
at net.minecraft.server.network.ServerPlayNetworkHandler.onPlayerMove(ServerPlayNetworkHandler.java:1001) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
at net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket.apply(PlayerMoveC2SPacket.java:114) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
at net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket$PositionAndOnGround.apply(PlayerMoveC2SPacket.java:42) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
at net.minecraft.network.NetworkThreadUtils.method_11072(NetworkThreadUtils.java:22) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
at net.minecraft.server.ServerTask.run(ServerTask.java:18) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
Краш-лог:
16:13:15] [Server thread/ERROR] (Minecraft) Failed to handle packet net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket$Full@67a4f159, suppressing error
 java.lang.NullPointerException: Cannot invoke "it.unimi.dsi.fastutil.objects.ObjectSet.remove(Object)" because "objectSet" is null
    at net.minecraft.server.world.ChunkTicketManager.handleChunkLeave(ChunkTicketManager.java:231) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
    at net.minecraft.server.world.ThreadedAnvilChunkStorage.updatePosition(ThreadedAnvilChunkStorage.java:1107) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
    at net.minecraft.server.world.ServerChunkManager.updatePosition(ServerChunkManager.java:466) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
    at net.minecraft.server.network.ServerPlayNetworkHandler.onPlayerMove(ServerPlayNetworkHandler.java:1001) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
    at net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket.apply(PlayerMoveC2SPacket.java:114) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
    at net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket$Full.apply(PlayerMoveC2SPacket.java:16) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
    at net.minecraft.network.NetworkThreadUtils.method_11072(NetworkThreadUtils.java:22) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
///
[Server thread/ERROR] (Minecraft) Failed to handle packet net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket$PositionAndOnGround@6b749da9, suppressing error
 java.lang.NullPointerException: Cannot invoke "it.unimi.dsi.fastutil.objects.ObjectSet.remove(Object)" because "objectSet" is null
	at net.minecraft.server.world.ChunkTicketManager.handleChunkLeave(ChunkTicketManager.java:231) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
	at net.minecraft.server.world.ThreadedAnvilChunkStorage.updatePosition(ThreadedAnvilChunkStorage.java:1107) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
	at net.minecraft.server.world.ServerChunkManager.updatePosition(ServerChunkManager.java:466) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
	at net.minecraft.server.network.ServerPlayNetworkHandler.onPlayerMove(ServerPlayNetworkHandler.java:1001) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
	at net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket.apply(PlayerMoveC2SPacket.java:114) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
	at net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket$PositionAndOnGround.apply(PlayerMoveC2SPacket.java:42) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
	at net.minecraft.network.NetworkThreadUtils.method_11072(NetworkThreadUtils.java:22) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
	at net.minecraft.server.ServerTask.run(ServerTask.java:18) ~[minecraft-merged-c713afbca6-1.19.2-net.fabricmc.yarn.1_19_2.1.19.2+build.28-v2.jar:?]
Попробуй так

Java:
@Override
public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) {
    if (world instanceof ServerWorld && entity instanceof ServerPlayerEntity player) {
        if (!entity.hasVehicle() && !entity.hasPassengers() && entity.canUsePortals() && VoxelShapes.matchesAnywhere(VoxelShapes.cuboid(entity.getBoundingBox().offset((double)(-pos.getX()), (double)(-pos.getY()), (double)(-pos.getZ()))), state.getOutlineShape(world, pos), BooleanBiFunction.AND)) {
            RegistryKey<World> registryKey = world.getRegistryKey() == ModDimension.AVDIM_LEVEL_KEY ? World.OVERWORLD : ModDimension.AVDIM_LEVEL_KEY;
            ServerWorld serverWorld = ((ServerWorld)world).getServer().getWorld(registryKey);

            if (serverWorld == null) {
                return;
            }

            player.teleport(serverWorld, 50, 50, 50, player.getYaw(), player.getPitch());
            serverWorld.onPlayerTeleport(player);
        }
    }
}

Либо второй вариант, он похож на первый.

Java:
@Override
public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) {
    if (world instanceof ServerWorld && entity instanceof ServerPlayerEntity player) {
        if (!entity.hasVehicle() && !entity.hasPassengers() && entity.canUsePortals() && VoxelShapes.matchesAnywhere(VoxelShapes.cuboid(entity.getBoundingBox().offset((double)(-pos.getX()), (double)(-pos.getY()), (double)(-pos.getZ()))), state.getOutlineShape(world, pos), BooleanBiFunction.AND)) {
            RegistryKey<World> targetWorldKey = world.getRegistryKey() == ModDimension.AVDIM_LEVEL_KEY ? World.OVERWORLD : ModDimension.AVDIM_LEVEL_KEY;
            ServerWorld targetWorld = player.getServer().getWorld(targetWorldKey);
        
            if (targetWorld == null) {
                return;
            }
            // Прогружаем чанки(на всякий случай)
            int chunkX = 50 >> 4;
            int chunkZ = 50 >> 4;
            targetWorld.getChunkManager().loadChunk(chunkX, chunkZ);

            player.teleport(targetWorld, 50, 50, 50, player.getYaw(), player.getPitch());
        }
    }
}

Оба варианта тебе могут отлично подойти, желательно добавь логирование, чтоб четко можно было понять суть проблемы.
 
Назад
Сверху