buildcraft/common/buildcraft/core/network/PacketHandler.java
SpaceToad 9577c53313 Fixed gate extension ids synchronization, for #1895.
Added a new concept of NetworkId, allowing to transfer ids over the network
instead of strings.
RPCs are now all handled the same way (except RPC Pipes, to be completed when
actually used).
2014-06-22 11:49:59 +02:00

124 lines
3.2 KiB
Java

/**
* Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
*
* BuildCraft is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt
*/
package buildcraft.core.network;
import java.io.IOException;
import io.netty.channel.ChannelHandler.Sharable;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.network.INetHandler;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import cpw.mods.fml.common.network.NetworkRegistry;
import buildcraft.core.proxy.CoreProxy;
@Sharable
public class PacketHandler extends SimpleChannelInboundHandler<BuildCraftPacket> {
private void onTileUpdate(EntityPlayer player, PacketTileUpdate packet) throws IOException {
World world = player.worldObj;
if (!packet.targetExists(world)) {
return;
}
TileEntity entity = packet.getTarget(world);
if (!(entity instanceof ISynchronizedTile)) {
return;
}
ISynchronizedTile tile = (ISynchronizedTile) entity;
tile.handleUpdatePacket(packet);
tile.postPacketHandling(packet);
}
@Override
protected void channelRead0(ChannelHandlerContext ctx, BuildCraftPacket packet) {
try {
INetHandler netHandler = ctx.channel().attr(NetworkRegistry.NET_HANDLER).get();
EntityPlayer player = CoreProxy.proxy.getPlayerFromNetHandler(netHandler);
int packetID = packet.getID();
switch (packetID) {
case PacketIds.TILE_UPDATE: {
onTileUpdate(player, (PacketTileUpdate) packet);
break;
}
case PacketIds.STATE_UPDATE: {
PacketTileState pkt = (PacketTileState) packet;
World world = player.worldObj;
TileEntity tile = world.getTileEntity(pkt.posX, pkt.posY, pkt.posZ);
if (tile instanceof ISyncedTile) {
pkt.applyStates((ISyncedTile) tile);
}
break;
}
case PacketIds.GUI_RETURN: {
// action will have happened already at read time
break;
}
case PacketIds.GUI_WIDGET: {
// action will have happened already at read time
break;
}
case PacketIds.RPC: {
((PacketRPC) packet).call(player);
break;
}
case PacketIds.RPC_PIPE: {
// TODO: RPC pipes are not used right now. Ressurect this
// code if needed later.
/*
* PacketRPCPipe rpc = new PacketRPCPipe(); rpc.sender = player;
*
* int dimId = data.readShort(); World world = null;
*
* if (!rpc.sender.worldObj.isRemote) { // if this is a server,
* then get the world
*
* world = DimensionManager.getProvider(dimId).worldObj; } else
* if (rpc.sender.worldObj.provider.dimensionId == dimId) { //
* if the player is on this world, then synchronize things
*
* world = rpc.sender.worldObj; }
*
* if (world != null) { int x = data.readInt(); int y =
* data.readInt(); int z = data.readInt();
*
* TileEntity tile = world.getTileEntity(x, y, z);
*
* if (tile instanceof TileGenericPipe) { rpc.setPipe
* (((TileGenericPipe) tile).pipe); rpc.readData(data); } }
*/
break;
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}