package net.minecraft.network.protocol;

class Packet {
    public static Iterable<Object> tryUnwrapBundlePacket(Object packet) {
#if version >= 1.19.4
        if (packet instanceof net.minecraft.network.protocol.game.ClientboundBundlePacket) {
            return ((net.minecraft.network.protocol.game.ClientboundBundlePacket) packet).subPackets();
        }
#endif
        return null;
    }

    <code>
    public com.bergerkiller.bukkit.common.protocol.CommonPacket toCommonPacket() {
        return new com.bergerkiller.bukkit.common.protocol.CommonPacket(getRaw(), getPacketType());
    }

    public com.bergerkiller.bukkit.common.protocol.PacketType getPacketType() {
        return com.bergerkiller.bukkit.common.protocol.PacketType.getType(getRaw());
    }
    </code>

    // Protocol translation functions
    <code>
    protected final double getProtocolPosition(Template.Field.Byte field_1_8_8, Template.Field.Integer field_1_10_2) {
        if (field_1_10_2.isAvailable()) {
            return com.bergerkiller.bukkit.common.internal.logic.ProtocolMath.deserializePosition_1_10_2(field_1_10_2.getInteger(getRaw()));
        } else {
            return com.bergerkiller.bukkit.common.internal.logic.ProtocolMath.deserializePosition_1_8_8((int) field_1_8_8.getByte(getRaw()));
        }
    }

    protected final void setProtocolPosition(Template.Field.Byte field_1_8_8, Template.Field.Integer field_1_10_2, double position) {
        if (field_1_10_2.isAvailable()) {
            field_1_10_2.setInteger(getRaw(), com.bergerkiller.bukkit.common.internal.logic.ProtocolMath.serializePosition_1_10_2(position));
        } else {
            field_1_8_8.setByte(getRaw(), (byte) com.bergerkiller.bukkit.common.internal.logic.ProtocolMath.serializePosition_1_8_8(position));
        }
    }

    protected final double getProtocolPosition(Template.Field.Integer field_1_8_8, Template.Field.Double field_1_10_2) {
        if (field_1_10_2.isAvailable()) {
            return field_1_10_2.getDouble(getRaw());
        } else {
            return com.bergerkiller.bukkit.common.internal.logic.ProtocolMath.deserializePosition_1_8_8(field_1_8_8.getInteger(getRaw()));
        }
    }

    protected final void setProtocolPosition(Template.Field.Integer field_1_8_8, Template.Field.Double field_1_10_2, double position) {
        if (field_1_10_2.isAvailable()) {
            field_1_10_2.setDouble(getRaw(), position);
        } else {
            field_1_8_8.setInteger(getRaw(), com.bergerkiller.bukkit.common.internal.logic.ProtocolMath.serializePosition_1_8_8(position));
        }
    }

    protected final float getProtocolRotation(Template.Field.Byte field) {
        return com.bergerkiller.bukkit.common.internal.logic.ProtocolMath.deserializeRotation((int) field.getByte(getRaw()));
    }

    protected final void setProtocolRotation(Template.Field.Byte field, float rotation) {
        field.setByte(getRaw(), (byte) com.bergerkiller.bukkit.common.internal.logic.ProtocolMath.serializeRotation(rotation));
    }

    protected final com.bergerkiller.bukkit.common.wrappers.HumanHand internalGetHand(Template.Field.Converted<Object> field, org.bukkit.entity.HumanEntity humanEntity) {
        if (field.isAvailable()) {
            return com.bergerkiller.bukkit.common.wrappers.HumanHand.fromNMSEnumHand(humanEntity, field.get(getRaw()));
        } else {
            return com.bergerkiller.bukkit.common.wrappers.HumanHand.RIGHT;
        }
    }

    protected final void internalSetHand(Template.Field.Converted<Object> field, org.bukkit.entity.HumanEntity humanEntity, com.bergerkiller.bukkit.common.wrappers.HumanHand hand) {
        if (field.isAvailable()) {
            field.set(getRaw(), com.bergerkiller.bukkit.common.wrappers.HumanHand.toNMSEnumHand(humanEntity, hand));
        }
    }
    </code>
}
