From 782feed64149a292ad299c2cee3f6a3973e3fe8c Mon Sep 17 00:00:00 2001 From: AJ Ferguson Date: Sat, 28 Dec 2019 18:17:00 -0900 Subject: [PATCH] Fix lighting when reloading world --- .../network/session/GeyserSession.java | 2 +- .../java/JavaRespawnTranslator.java | 20 +++++++++++++++---- .../geysermc/connector/utils/ChunkUtils.java | 17 ++++++++++++---- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java index b49f0bf7..db13eff9 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java @@ -128,7 +128,7 @@ public class GeyserSession implements Player { startGame(); this.remoteServer = remoteServer; - ChunkUtils.sendEmptyChunks(this, playerEntity.getPosition().toInt(), 5); + ChunkUtils.sendEmptyChunks(this, playerEntity.getPosition().toInt(), 0, false); BiomeDefinitionListPacket biomePacket = new BiomeDefinitionListPacket(); biomePacket.setTag(CompoundTag.EMPTY); diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaRespawnTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaRespawnTranslator.java index b3d850ad..07ae551d 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaRespawnTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaRespawnTranslator.java @@ -26,10 +26,12 @@ package org.geysermc.connector.network.translators.java; import com.github.steveice10.mc.protocol.packet.ingame.server.ServerRespawnPacket; +import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.packet.*; import org.geysermc.connector.entity.Entity; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.PacketTranslator; +import org.geysermc.connector.utils.ChunkUtils; import org.geysermc.connector.utils.DimensionUtils; public class JavaRespawnTranslator extends PacketTranslator { @@ -48,12 +50,22 @@ public class JavaRespawnTranslator extends PacketTranslator if (entity.getDimension() != DimensionUtils.javaToBedrock(packet.getDimension())) { DimensionUtils.switchDimension(session, packet.getDimension()); } else { - if (session.isManyDimPackets()) { //reloading world - session.getEntityCache().removeAllEntities(); - //TODO: fix lighting bug - } // Handled in JavaPlayerPositionRotationTranslator session.setSpawned(false); + if (session.isManyDimPackets()) { //reloading world + session.getEntityCache().removeAllEntities(); + //lighting fix + ChunkUtils.sendEmptyChunks(session, entity.getPosition().toInt(), session.getRenderDistance(), false); + Vector3f tempPos = Vector3f.from(entity.getPosition().getX() > 0 ? -5000 : 5000, 0, 0); + MovePlayerPacket movePlayerPacket = new MovePlayerPacket(); + movePlayerPacket.setRuntimeEntityId(entity.getGeyserId()); + movePlayerPacket.setPosition(tempPos); + movePlayerPacket.setRotation(Vector3f.ZERO); + movePlayerPacket.setMode(MovePlayerPacket.Mode.NORMAL); + movePlayerPacket.setOnGround(true); + session.getUpstream().sendPacket(movePlayerPacket); + ChunkUtils.sendEmptyChunks(session, tempPos.toInt(), 5, true); + } } } } diff --git a/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java b/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java index a140cb58..93681a7d 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java +++ b/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java @@ -73,16 +73,16 @@ public class ChunkUtils { session.getUpstream().sendPacket(waterPacket); } - public static void sendEmptyChunks(GeyserSession session, Vector3i position, int radius) { + public static void sendEmptyChunks(GeyserSession session, Vector3i position, int radius, boolean forceUpdate) { int chunkX = position.getX() >> 4; int chunkZ = position.getZ() >> 4; NetworkChunkPublisherUpdatePacket chunkPublisherUpdatePacket = new NetworkChunkPublisherUpdatePacket(); chunkPublisherUpdatePacket.setPosition(position); - chunkPublisherUpdatePacket.setRadius(radius << 4); + chunkPublisherUpdatePacket.setRadius(radius + 1 << 4); session.getUpstream().sendPacket(chunkPublisherUpdatePacket); session.setLastChunkPosition(null); - for (int x = -radius; x < radius; x++) { - for (int z = -radius; z < radius; z++) { + for (int x = -radius; x <= radius; x++) { + for (int z = -radius; z <= radius; z++) { LevelChunkPacket data = new LevelChunkPacket(); data.setChunkX(chunkX + x); data.setChunkZ(chunkZ + z); @@ -90,6 +90,15 @@ public class ChunkUtils { data.setData(TranslatorsInit.EMPTY_LEVEL_CHUNK_DATA); data.setCachingEnabled(false); session.getUpstream().sendPacket(data); + + if (forceUpdate) { + Vector3i pos = Vector3i.from(chunkX + x << 4, 80, chunkZ + z << 4); + UpdateBlockPacket blockPacket = new UpdateBlockPacket(); + blockPacket.setBlockPosition(pos); + blockPacket.setDataLayer(1); + blockPacket.setRuntimeId(1); + session.getUpstream().sendPacket(blockPacket); + } } } }