package net.slimevoid.library.network; import io.netty.buffer.ByteBuf; import net.minecraft.util.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.common.network.ByteBufUtils; /** * Packet Information for Reading/Writing packet data * <p/> * packetId The ID of the packet used to identify which packet handler to use * payload The payload to be delivered with the packet xPosition The value x for * the current packet yPosition The value y for the current packet zPosition The * value z for the current packet side The value side for the current packet * (Used for blocks and activation) hitX The hitX for the current packet (Used * for blocks and activation) hitY The hitY for the current packet (Used for * blocks and activation) hitZ the hitZ for the current packet * * @author Eurymachus */ public abstract class PacketUpdate extends EurysPacket { public PacketPayload payload; private BlockPos pos; public int xPosition; public int yPosition; public int zPosition; public int side; public float hitX; public float hitY; public float hitZ; public String command; public PacketUpdate() { } public PacketUpdate(int packetId) { this(); this.setPacketId(packetId); } public PacketUpdate(int packetId, PacketPayload payload) { this(packetId); this.payload = payload; } public BlockPos getPosition() { return this.pos; } /** * Set the position x, y, z and side if applicable * * @param x The x position * @param y The y position * @param z The z position * @param side The side (if applicable) */ @Deprecated() public void setPosition(int x, int y, int z, int side) { this.xPosition = x; this.yPosition = y; this.zPosition = z; this.pos = new BlockPos(x, y, z); this.side = side; } /** * Set the position and side * * @param pos X, Y, Z coordinate object * @param side the side (if applicable) */ public void setPosition(BlockPos pos, int side) { this.setPosition(pos.getX(), pos.getY(), pos.getZ(), side); } /** * Set the selected vector positions (if applicable) * * @param hitX The selected vector on x * @param hitY The selected vector on y * @param hitZ The selected vector on z */ public void setHitVectors(float hitX, float hitY, float hitZ) { this.hitX = hitX; this.hitY = hitY; this.hitZ = hitZ; } public String getCommand() { return !this.command.isEmpty() ? this.command : ""; } public void setCommand(String command) { this.command = command; } @Override public void writeData(ByteBuf data) { data.writeInt(this.getPacketId()); ByteBufUtils.writeUTF8String(data, this.getCommand()); data.writeInt(this.xPosition); data.writeInt(this.yPosition); data.writeInt(this.zPosition); // Checks if the side, vecX, vecY and vecZ values have been set defaults // to 0 if not data.writeInt(Integer.valueOf(this.side) != null ? this.side : 0); data.writeFloat(Float.valueOf(this.hitX) != null ? this.hitX : 0.0F); data.writeFloat(Float.valueOf(this.hitY) != null ? this.hitY : 0.0F); data.writeFloat(Float.valueOf(this.hitZ) != null ? this.hitZ : 0.0F); // No payload means no additional data if (this.payload == null) { data.writeInt(0); data.writeInt(0); data.writeInt(0); data.writeInt(0); data.writeInt(0); return; } // Continue writing payload information data.writeInt(this.payload.getIntSize()); data.writeInt(this.payload.getFloatSize()); data.writeInt(this.payload.getStringSize()); data.writeInt(this.payload.getBoolSize()); data.writeInt(this.payload.getDoubleSize()); for (int i = 0; i < this.payload.getIntSize(); i++) data.writeInt(this.payload.getIntPayload(i)); for (int i = 0; i < this.payload.getFloatSize(); i++) data.writeFloat(this.payload.getFloatPayload(i)); for (int i = 0; i < this.payload.getStringSize(); i++) ByteBufUtils.writeUTF8String(data, this.payload.getStringPayload(i)); for (int i = 0; i < this.payload.getBoolSize(); i++) data.writeBoolean(this.payload.getBoolPayload(i)); for (int i = 0; i < this.payload.getDoubleSize(); i++) data.writeDouble(this.payload.getDoublePayload(i)); } @Override public void readData(ByteBuf data) { this.setPacketId(data.readInt()); this.setCommand(ByteBufUtils.readUTF8String(data)); this.setPosition(data.readInt(), data.readInt(), data.readInt(), data.readInt()); this.setHitVectors(data.readFloat(), data.readFloat(), data.readFloat()); int intSize = data.readInt(); int floatSize = data.readInt(); int stringSize = data.readInt(); int boolSize = data.readInt(); int doubleSize = data.readInt(); this.payload = new PacketPayload(intSize, floatSize, stringSize, boolSize, doubleSize); for (int i = 0; i < this.payload.getIntSize(); i++) this.payload.setIntPayload(i, data.readInt()); for (int i = 0; i < this.payload.getFloatSize(); i++) this.payload.setFloatPayload(i, data.readFloat()); for (int i = 0; i < this.payload.getStringSize(); i++) this.payload.setStringPayload(i, ByteBufUtils.readUTF8String(data)); for (int i = 0; i < this.payload.getBoolSize(); i++) this.payload.setBoolPayload(i, data.readBoolean()); for (int i = 0; i < this.payload.getDoubleSize(); i++) this.payload.setDoublePayload(i, data.readDouble()); } /** * Override this method for non-block tile entities * * @param world * @return */ public boolean targetExists(World world) { return !world.getBlockState(pos).getBlock().isAir(world, pos); } }