package org.geysermc.connector.network.translators.java.world; import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerChunkDataPacket; import com.nukkitx.network.VarInts; import com.nukkitx.protocol.bedrock.packet.LevelChunkPacket; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import org.geysermc.api.Geyser; import org.geysermc.connector.console.GeyserLogger; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.PacketTranslator; import org.geysermc.connector.utils.ChunkUtils; import org.geysermc.connector.world.chunk.ChunkSection; public class JavaChunkDataTranslator extends PacketTranslator { @Override public void translate(ServerChunkDataPacket packet, GeyserSession session) { // Not sure if this is safe or not, however without this the client usually times out Geyser.getConnector().getGeneralThreadPool().execute(() -> { try { ChunkUtils.ChunkData chunkData = ChunkUtils.translateToBedrock(packet.getColumn()); ByteBuf byteBuf = Unpooled.buffer(32); ChunkSection[] sections = chunkData.sections; int sectionCount = sections.length - 1; while (sections[sectionCount].isEmpty()) { sectionCount--; } sectionCount++; for (int i = 0; i < sectionCount; i++) { ChunkSection section = chunkData.sections[i]; section.writeToNetwork(byteBuf); } byteBuf.writeBytes(chunkData.biomes); // Biomes - 256 bytes byteBuf.writeByte(0); // Border blocks - Edu edition only VarInts.writeUnsignedInt(byteBuf, 0); // extra data length, 0 for now byte[] payload = new byte[byteBuf.writerIndex()]; byteBuf.readBytes(payload); LevelChunkPacket levelChunkPacket = new LevelChunkPacket(); levelChunkPacket.setSubChunksLength(sectionCount); levelChunkPacket.setCachingEnabled(false); levelChunkPacket.setChunkX(packet.getColumn().getX()); levelChunkPacket.setChunkZ(packet.getColumn().getZ()); levelChunkPacket.setData(payload); session.getUpstream().sendPacket(levelChunkPacket); } catch (Exception ex) { ex.printStackTrace(); } GeyserLogger.DEFAULT.info("Sent chunk packet!"); }); } }