// Path: libuosl/src/org/solhost/folko/uosl/libuosl/types/Point3D.java
// public class Point3D extends Point2D {
//     private static final long serialVersionUID = 1L;
//     public static final int MIN_ELEVATION = -128;
//     public static final int MAX_ELEVATION = 127;
//     protected final int z;
// 
//     public Point3D(int x, int y) {
//         super(x, y);
//         this.z = 0;
//     }
// 
//     public Point3D(int x, int y, int z) {
//         super(x, y);
//         if(z < MIN_ELEVATION || z > MAX_ELEVATION) {
//             throw new IllegalArgumentException("invalid z coordinate: " + z);
//         }
//         this.z = z;
//     }
// 
//     public Point3D(Point2D d2, int z) {
//         super(d2.x, d2.y);
//         if(z < MIN_ELEVATION || z > MAX_ELEVATION) {
//             throw new IllegalArgumentException("invalid z coordinate: " + z);
//         }
//         this.z = z;
//     }
// 
//     public int getZ() {
//         return z;
//     }
// 
//     @Override
//     public int hashCode() {
//         final int prime = 31;
//         int result = super.hashCode();
//         result = prime * result + z;
//         return result;
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (this == obj)
//             return true;
//         if (!super.equals(obj))
//             return false;
//         if (!(obj instanceof Point3D))
//             return false;
//         Point3D other = (Point3D) obj;
//         if (z != other.z)
//             return false;
//         return true;
//     }
// 
//     @Override
//     public String toString() {
//         return String.format("<Point3D: x = %d, y = %d, z = %d>", x, y, z);
//     }
// }


import java.nio.ByteBuffer;
import org.solhost.folko.uosl.libuosl.types.Point3D;
    public static DropPacket read(ByteBuffer b, int len) {
        DropPacket res = new DropPacket();
        res.serial = readUDWord(b);
        int x = readUWord(b);
        int y = readUWord(b);
        byte z = readSByte(b);
        if(x == 0xFFFF) {
            x = 0;
        }
        if(y == 0xFFFF) {
            y = 0;
        }
        res.location = new Point3D(x, y, z);
        res.container = readUDWord(b);
        return res;
    }

    @Override
    public short getID() {
        return ID;
    }

    public long getSerial() {
        return serial;
    }

    public long getContainer() {
        return container;
    }

// Path: libuosl/src/org/solhost/folko/uosl/libuosl/types/Point3D.java
// public class Point3D extends Point2D {
//     private static final long serialVersionUID = 1L;
//     public static final int MIN_ELEVATION = -128;
//     public static final int MAX_ELEVATION = 127;
//     protected final int z;
// 
//     public Point3D(int x, int y) {
//         super(x, y);
//         this.z = 0;
//     }
// 
//     public Point3D(int x, int y, int z) {
//         super(x, y);
//         if(z < MIN_ELEVATION || z > MAX_ELEVATION) {
//             throw new IllegalArgumentException("invalid z coordinate: " + z);
//         }
//         this.z = z;
//     }
// 
//     public Point3D(Point2D d2, int z) {
//         super(d2.x, d2.y);
//         if(z < MIN_ELEVATION || z > MAX_ELEVATION) {
//             throw new IllegalArgumentException("invalid z coordinate: " + z);
//         }
//         this.z = z;
//     }
// 
//     public int getZ() {
//         return z;
//     }
// 
//     @Override
//     public int hashCode() {
//         final int prime = 31;
//         int result = super.hashCode();
//         result = prime * result + z;
//         return result;
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (this == obj)
//             return true;
//         if (!super.equals(obj))
//             return false;
//         if (!(obj instanceof Point3D))
//             return false;
//         Point3D other = (Point3D) obj;
//         if (z != other.z)
//             return false;
//         return true;
//     }
// 
//     @Override
//     public String toString() {
//         return String.format("<Point3D: x = %d, y = %d, z = %d>", x, y, z);
//     }
// }


// Path: libuosl/src/org/solhost/folko/uosl/libuosl/network/packets/DropPacket.java
import java.nio.ByteBuffer;
import org.solhost.folko.uosl.libuosl.types.Point3D;

    public static DropPacket read(ByteBuffer b, int len) {
        DropPacket res = new DropPacket();
        res.serial = readUDWord(b);
        int x = readUWord(b);
        int y = readUWord(b);
        byte z = readSByte(b);
        if(x == 0xFFFF) {
            x = 0;
        }
        if(y == 0xFFFF) {
            y = 0;
        }
        res.location = new Point3D(x, y, z);
        res.container = readUDWord(b);
        return res;
    }

    @Override
    public short getID() {
        return ID;
    }

    public long getSerial() {
        return serial;
    }

    public long getContainer() {
        return container;
    }

    public Point3D getLocation() {