forked from GeyserMC/Geyser
		
	Fix lighting when reloading world
This commit is contained in:
		
							parent
							
								
									b2f86ec20b
								
							
						
					
					
						commit
						782feed641
					
				
					 3 changed files with 30 additions and 9 deletions
				
			
		|  | @ -128,7 +128,7 @@ public class GeyserSession implements Player { | ||||||
|         startGame(); |         startGame(); | ||||||
|         this.remoteServer = remoteServer; |         this.remoteServer = remoteServer; | ||||||
| 
 | 
 | ||||||
|         ChunkUtils.sendEmptyChunks(this, playerEntity.getPosition().toInt(), 5); |         ChunkUtils.sendEmptyChunks(this, playerEntity.getPosition().toInt(), 0, false); | ||||||
| 
 | 
 | ||||||
|         BiomeDefinitionListPacket biomePacket = new BiomeDefinitionListPacket(); |         BiomeDefinitionListPacket biomePacket = new BiomeDefinitionListPacket(); | ||||||
|         biomePacket.setTag(CompoundTag.EMPTY); |         biomePacket.setTag(CompoundTag.EMPTY); | ||||||
|  |  | ||||||
|  | @ -26,10 +26,12 @@ | ||||||
| package org.geysermc.connector.network.translators.java; | package org.geysermc.connector.network.translators.java; | ||||||
| 
 | 
 | ||||||
| import com.github.steveice10.mc.protocol.packet.ingame.server.ServerRespawnPacket; | import com.github.steveice10.mc.protocol.packet.ingame.server.ServerRespawnPacket; | ||||||
|  | import com.nukkitx.math.vector.Vector3f; | ||||||
| import com.nukkitx.protocol.bedrock.packet.*; | import com.nukkitx.protocol.bedrock.packet.*; | ||||||
| import org.geysermc.connector.entity.Entity; | import org.geysermc.connector.entity.Entity; | ||||||
| import org.geysermc.connector.network.session.GeyserSession; | import org.geysermc.connector.network.session.GeyserSession; | ||||||
| import org.geysermc.connector.network.translators.PacketTranslator; | import org.geysermc.connector.network.translators.PacketTranslator; | ||||||
|  | import org.geysermc.connector.utils.ChunkUtils; | ||||||
| import org.geysermc.connector.utils.DimensionUtils; | import org.geysermc.connector.utils.DimensionUtils; | ||||||
| 
 | 
 | ||||||
| public class JavaRespawnTranslator extends PacketTranslator<ServerRespawnPacket> { | public class JavaRespawnTranslator extends PacketTranslator<ServerRespawnPacket> { | ||||||
|  | @ -48,12 +50,22 @@ public class JavaRespawnTranslator extends PacketTranslator<ServerRespawnPacket> | ||||||
|         if (entity.getDimension() != DimensionUtils.javaToBedrock(packet.getDimension())) { |         if (entity.getDimension() != DimensionUtils.javaToBedrock(packet.getDimension())) { | ||||||
|             DimensionUtils.switchDimension(session, packet.getDimension()); |             DimensionUtils.switchDimension(session, packet.getDimension()); | ||||||
|         } else { |         } else { | ||||||
|             if (session.isManyDimPackets()) { //reloading world |  | ||||||
|                 session.getEntityCache().removeAllEntities(); |  | ||||||
|                 //TODO: fix lighting bug |  | ||||||
|             } |  | ||||||
|             // Handled in JavaPlayerPositionRotationTranslator |             // Handled in JavaPlayerPositionRotationTranslator | ||||||
|             session.setSpawned(false); |             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); | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -73,16 +73,16 @@ public class ChunkUtils { | ||||||
|         session.getUpstream().sendPacket(waterPacket); |         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 chunkX = position.getX() >> 4; | ||||||
|         int chunkZ = position.getZ() >> 4; |         int chunkZ = position.getZ() >> 4; | ||||||
|         NetworkChunkPublisherUpdatePacket chunkPublisherUpdatePacket = new NetworkChunkPublisherUpdatePacket(); |         NetworkChunkPublisherUpdatePacket chunkPublisherUpdatePacket = new NetworkChunkPublisherUpdatePacket(); | ||||||
|         chunkPublisherUpdatePacket.setPosition(position); |         chunkPublisherUpdatePacket.setPosition(position); | ||||||
|         chunkPublisherUpdatePacket.setRadius(radius << 4); |         chunkPublisherUpdatePacket.setRadius(radius + 1 << 4); | ||||||
|         session.getUpstream().sendPacket(chunkPublisherUpdatePacket); |         session.getUpstream().sendPacket(chunkPublisherUpdatePacket); | ||||||
|         session.setLastChunkPosition(null); |         session.setLastChunkPosition(null); | ||||||
|         for (int x = -radius; x < radius; x++) { |         for (int x = -radius; x <= radius; x++) { | ||||||
|             for (int z = -radius; z < radius; z++) { |             for (int z = -radius; z <= radius; z++) { | ||||||
|                 LevelChunkPacket data = new LevelChunkPacket(); |                 LevelChunkPacket data = new LevelChunkPacket(); | ||||||
|                 data.setChunkX(chunkX + x); |                 data.setChunkX(chunkX + x); | ||||||
|                 data.setChunkZ(chunkZ + z); |                 data.setChunkZ(chunkZ + z); | ||||||
|  | @ -90,6 +90,15 @@ public class ChunkUtils { | ||||||
|                 data.setData(TranslatorsInit.EMPTY_LEVEL_CHUNK_DATA); |                 data.setData(TranslatorsInit.EMPTY_LEVEL_CHUNK_DATA); | ||||||
|                 data.setCachingEnabled(false); |                 data.setCachingEnabled(false); | ||||||
|                 session.getUpstream().sendPacket(data); |                 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); | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue