package net.mcft.copy.backpacks.network;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.Entity;
import net.minecraft.item.ItemStack;
import net.minecraft.network.PacketBuffer;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.mcft.copy.backpacks.api.IBackpack;
import net.mcft.copy.backpacks.misc.BackpackCapability;
/** Sends and updates equipped backpack capability data. */
public class MessageBackpackUpdate implements IMessage {
private int _entityId;
private UpdateType _type;
private ItemStack _stack = ItemStack.EMPTY;
private boolean _open;
public MessageBackpackUpdate() { }
public static MessageBackpackUpdate stack(Entity entity, ItemStack stack) {
MessageBackpackUpdate message = new MessageBackpackUpdate();
message._entityId = entity.getEntityId();
message._type = UpdateType.STACK;
message._stack = stack;
return message;
}
public static MessageBackpackUpdate open(Entity entity, boolean open) {
MessageBackpackUpdate message = new MessageBackpackUpdate();
message._entityId = entity.getEntityId();
message._type = UpdateType.OPEN;
message._open = open;
return message;
}
@Override
public void fromBytes(ByteBuf buf) {
PacketBuffer buffer = new PacketBuffer(buf);
try {
_entityId = buffer.readInt();
_type = UpdateType.fromByte(buffer.readByte());
switch (_type) {
case STACK: _stack = buffer.readItemStack(); break;
case OPEN: _open = buffer.readBoolean(); break;
default: throw new RuntimeException("Invalid UpdateType");
}
} catch (Exception ex) {
_entityId = -1;
_type = UpdateType.INVALID;
_stack = ItemStack.EMPTY;
_open = false;
}
}
@Override
public void toBytes(ByteBuf buf) {
PacketBuffer buffer = new PacketBuffer(buf);
buffer.writeInt(_entityId);
buffer.writeByte(_type.ordinal());
switch (_type) {
case STACK: buffer.writeItemStack(_stack); break;
case OPEN: buffer.writeBoolean(_open); break;
default: throw new RuntimeException("Invalid UpdateType");
}
}
public static class Handler extends BackpacksMessageHandler<MessageBackpackUpdate> {
@Override
@SideOnly(Side.CLIENT)
public void handle(MessageBackpackUpdate message, MessageContext ctx) {
Entity entity = getWorld(ctx).getEntityByID(message._entityId);
if (entity == null) return;
BackpackCapability backpack = (BackpackCapability)entity
.getCapability(IBackpack.CAPABILITY, null);
if (backpack == null) return;
switch (message._type) {
case STACK: backpack.stack = message._stack; break;
case OPEN: backpack.playersUsing = (message._open ? 1 : 0); break;
default: throw new RuntimeException("Invalid UpdateType");
}
}
}
private enum UpdateType {
INVALID, STACK, OPEN;
public static UpdateType fromByte(byte b) {
switch (b) {
default: return INVALID;
case 1: return STACK;
case 2: return OPEN;
}
}
}
}