package com.xcompwiz.lookingglass.network.packet; import io.netty.buffer.ByteBuf; import java.util.Collection; import net.minecraft.client.multiplayer.WorldClient; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.server.MinecraftServer; import net.minecraft.util.ChunkCoordinates; import net.minecraft.world.WorldServer; import com.xcompwiz.lookingglass.client.proxyworld.ProxyWorldManager; import com.xcompwiz.lookingglass.client.proxyworld.WorldView; import com.xcompwiz.lookingglass.log.LoggerUtils; import cpw.mods.fml.common.network.internal.FMLProxyPacket; /** * Based on code from Ken Butler/shadowking97 */ public class PacketWorldInfo extends PacketHandlerBase { public static FMLProxyPacket createPacket(int dimension) { WorldServer world = MinecraftServer.getServer().worldServerForDimension(dimension); if (world == null) { LoggerUtils.warn("Server-side world for dimension %i is null!", dimension); return null; } ChunkCoordinates cc = world.provider.getSpawnPoint(); int posX = cc.posX; int posY = cc.posY; int posZ = cc.posZ; int skylightSubtracted = world.skylightSubtracted; float thunderingStrength = world.thunderingStrength; float rainingStrength = world.rainingStrength; long worldTime = world.provider.getWorldTime(); // This line may look like black magic (and, well, it is), but it's actually just returning a class reference for this class. Copy-paste safe. ByteBuf data = PacketHandlerBase.createDataBuffer((Class<? extends PacketHandlerBase>) new Object() {}.getClass().getEnclosingClass()); data.writeInt(dimension); data.writeInt(posX); data.writeInt(posY); data.writeInt(posZ); data.writeInt(skylightSubtracted); data.writeFloat(thunderingStrength); data.writeFloat(rainingStrength); data.writeLong(worldTime); return buildPacket(data); } @Override public void handle(ByteBuf in, EntityPlayer player) { int dimension = in.readInt(); int posX = in.readInt(); int posY = in.readInt(); int posZ = in.readInt(); int skylightSubtracted = in.readInt(); float thunderingStrength = in.readFloat(); float rainingStrength = in.readFloat(); long worldTime = in.readLong(); WorldClient proxyworld = ProxyWorldManager.getProxyworld(dimension); if (proxyworld == null) return; if (proxyworld.provider.dimensionId != dimension) return; ChunkCoordinates cc = new ChunkCoordinates(); cc.set(posX, posY, posZ); Collection<WorldView> views = ProxyWorldManager.getWorldViews(dimension); for (WorldView view : views) { view.updateWorldSpawn(cc); } proxyworld.setSpawnLocation(posX, posY, posZ); proxyworld.skylightSubtracted = skylightSubtracted; proxyworld.thunderingStrength = thunderingStrength; proxyworld.setRainStrength(rainingStrength); proxyworld.setWorldTime(worldTime); } }