/**
* Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
* <p/>
* 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.lib.network.command;
import java.util.ArrayList;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.EntityPlayer;
import cpw.mods.fml.common.FMLCommonHandler;
import buildcraft.core.lib.network.Packet;
import buildcraft.core.lib.utils.NetworkUtils;
import buildcraft.core.network.PacketIds;
public class PacketCommand extends Packet {
public static final ArrayList<CommandTarget> targets;
public ByteBuf stream;
public String command;
public Object target;
public CommandTarget handler;
private CommandWriter writer;
static {
targets = new ArrayList<CommandTarget>();
targets.add(new CommandTargetTile());
targets.add(new CommandTargetEntity());
targets.add(new CommandTargetContainer());
}
public PacketCommand() {
}
public PacketCommand(Object target, String command, CommandWriter writer) {
super();
this.target = target;
this.command = command;
this.writer = writer;
this.isChunkDataPacket = true;
// Find the valid handler
for (CommandTarget c : targets) {
if (c.getHandledClass().isAssignableFrom(target.getClass())) {
this.handler = c;
break;
}
}
}
public void handle(EntityPlayer player) {
if (handler != null) {
ICommandReceiver receiver = handler.handle(player, stream, player.worldObj);
if (receiver != null) {
receiver.receiveCommand(command, FMLCommonHandler.instance().getEffectiveSide(), player, stream);
}
}
}
@Override
public void writeData(ByteBuf data) {
NetworkUtils.writeUTF(data, command);
data.writeByte(targets.indexOf(handler));
handler.write(data, target);
if (writer != null) {
writer.write(data);
}
}
@Override
public void readData(ByteBuf data) {
command = NetworkUtils.readUTF(data);
handler = targets.get(data.readUnsignedByte());
stream = data; // for further reading
}
@Override
public int getID() {
return PacketIds.COMMAND;
}
}