9577c53313
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).
124 lines
3.2 KiB
Java
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();
|
|
}
|
|
|
|
}
|
|
}
|