package org.glydar.glydar.netty.data;
import com.google.common.base.Charsets;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufUtil;
import sun.security.util.BitArray;
/* Structures and data discovered by mat^2 (http://github.com/matpow2) */
public class EntityData implements BaseData {
public long id;
byte[] bitmask;
long posX;
long posY;
long posZ;
float roll;
float pitch;
float yaw;
public Vector3 velocity;
Vector3 accel;
Vector3 extraVel;
float lookPitch;
long physicsFlags; //Uint
byte speedFlags;
long entityType; //Uint
byte currentMode;
long lastShootTime; //Uint
long hitCounter; //Uint
long lastHitTime; //Uint
Appearance app;
byte flags1;
byte flags2;
long rollTime; //Uint
int stunTime;
long slowedTime; //Uint
long makeBlueTime; //Uint
long speedUpTime; //Uint
float slowPatchTime;
byte classType;
byte specialization;
float chargedMP;
Vector3 rayHit;
float HP;
float MP;
float blockPower;
float maxHPMultiplier;
float shootSpeed;
float damageMultiplier;
float armorMultiplier;
float resistanceMultiplier;
long level; //Uint
long currentXP; //Uint
Item itemData;
Item[] equipment;
long iceBlockFour; //Uint
long[] skills;
public String name;
long na1; //Uint
long na2; // |
byte na3;
long na4;
long na5;
long nu1;
long nu2;
long nu3;
long nu4;
long nu5;
long nu6;
byte nu7;
byte nu8;
long parentOwner;
long nu11;
long nu12;
long nu13;
long nu14;
long nu15;
long nu16;
long nu17;
long nu18;
long nu20;
long nu21;
long nu22;
byte nu19;
public EntityData() {
bitmask = new byte[8];
velocity = new Vector3();
accel = new Vector3();
extraVel = new Vector3();
rayHit = new Vector3();
app = new Appearance();
itemData = new Item();
equipment = new Item[13];
for(int i = 0; i < 13; i++)
equipment[i] = new Item();
skills = new long[11];
}
@Override
public void decode(ByteBuf buf) {
id = ByteBufUtil.swapLong(buf.readLong());
bitmask = buf.readBytes(8).array();
BitArray bitArray = new BitArray(8*bitmask.length, bitmask); //Size in bits, byte[]
if(bitArray.get(0)) {
posX = buf.readLong();
posY = buf.readLong();
posZ = buf.readLong();
}
if(bitArray.get(1)) {
roll = buf.readFloat();
pitch = buf.readFloat();
yaw = buf.readFloat();
}
if(bitArray.get(2)) {
velocity.decode(buf);
}
if(bitArray.get(3)) {
accel.decode(buf);
}
if(bitArray.get(4)) {
extraVel.decode(buf);
}
if(bitArray.get(5)) {
lookPitch = buf.readFloat();
}
if(bitArray.get(6)) {
physicsFlags = buf.readUnsignedInt();
}
if(bitArray.get(7)) {
speedFlags = buf.readByte();
}
if(bitArray.get(8)) {
entityType = buf.readUnsignedInt();
}
if(bitArray.get(9)) {
currentMode = buf.readByte();
}
if (bitArray.get(10)) {
lastShootTime = buf.readUnsignedInt();
}
if(bitArray.get(11)) {
hitCounter = buf.readUnsignedInt();
}
if(bitArray.get(12)) {
lastHitTime = buf.readUnsignedInt();
}
if(bitArray.get(13)) {
app.decode(buf);
}
if(bitArray.get(14)) {
flags1 = buf.readByte();
flags2 = buf.readByte();
}
if(bitArray.get(15)) {
rollTime = buf.readUnsignedInt();
}
if(bitArray.get(16)) {
stunTime = buf.readInt();
}
if(bitArray.get(17)) {
slowedTime = buf.readUnsignedInt();
}
if(bitArray.get(18)) {
makeBlueTime = buf.readUnsignedInt();
}
if(bitArray.get(19)) {
speedUpTime = buf.readUnsignedInt();
}
if(bitArray.get(20)) {
slowPatchTime = buf.readFloat();
}
if(bitArray.get(21)) {
classType = buf.readByte();
}
if(bitArray.get(22)) {
specialization = buf.readByte();
}
if(bitArray.get(23)) {
chargedMP = buf.readFloat();
}
if(bitArray.get(24)) {
nu1 = buf.readUnsignedInt();
nu2 = buf.readUnsignedInt();
nu3 = buf.readUnsignedInt();
}
if(bitArray.get(25)) {
nu4 = buf.readUnsignedInt();
nu5 = buf.readUnsignedInt();
nu6 = buf.readUnsignedInt();
}
if(bitArray.get(26)) {
rayHit.decode(buf);
}
if(bitArray.get(27)) {
HP = buf.readFloat();
}
if(bitArray.get(28)) {
MP = buf.readFloat();
}
if(bitArray.get(29)) {
blockPower = buf.readFloat();
}
if(bitArray.get(30)) {
maxHPMultiplier = buf.readFloat();
shootSpeed = buf.readFloat();
damageMultiplier = buf.readFloat();
armorMultiplier = buf.readFloat();
resistanceMultiplier = buf.readFloat();
}
if(bitArray.get(31)) {
nu7 = buf.readByte();
}
if(bitArray.get(32)) {
nu8 = buf.readByte();
}
if(bitArray.get(33)) {
level = buf.readUnsignedInt();
}
if (bitArray.get(34)) {
currentXP = buf.readUnsignedInt();
}
if(bitArray.get(35)) {
parentOwner = buf.readLong();
}
if(bitArray.get(36)) {
na1 = buf.readUnsignedInt();
na2 = buf.readUnsignedInt();
}
if(bitArray.get(37)) {
na3 = buf.readByte();
}
if(bitArray.get(38)) {
na4 = buf.readUnsignedInt();
}
if(bitArray.get(39)) {
na5 = buf.readUnsignedInt();
nu11 = buf.readUnsignedInt();
nu12 = buf.readUnsignedInt();
}
if(bitArray.get(40)) {
nu13 = buf.readUnsignedInt();
nu14 = buf.readUnsignedInt();
nu15 = buf.readUnsignedInt();
nu16 = buf.readUnsignedInt();
nu17 = buf.readUnsignedInt();
nu18 = buf.readUnsignedInt();
}
if(bitArray.get(41)) {
nu20 = buf.readUnsignedInt();
nu21 = buf.readUnsignedInt();
nu22 = buf.readUnsignedInt();
}
if(bitArray.get(42)) {
nu19 = buf.readByte();
}
if(bitArray.get(43)) {
itemData.decode(buf);
}
if(bitArray.get(44)) {
for (int i = 0; i < 13; i++)
{
Item item = new Item();
item.decode(buf);
equipment[i] = item;
}
}
if(bitArray.get(45)) {
name = new String(buf.readBytes(16).array(), Charsets.US_ASCII).trim();
}
if(bitArray.get(46)) {
for (int i = 0; i < 11; i++) {
skills[i] = buf.readUnsignedInt();
}
}
if(bitArray.get(47)) {
iceBlockFour = buf.readUnsignedInt();
}
}
@Override
public void encode(ByteBuf buf) {
buf.writeLong(ByteBufUtil.swapLong(id)); //Ulong but whatever
//TODO: Not sure exactly how to approach writing unsigned ints!
BitArray bitArray = new BitArray(8*bitmask.length, bitmask); //Size in bits, byte[]
if(bitArray.get(0)) {
buf.writeLong(posX);
buf.writeLong(posY);
buf.writeLong(posZ);
}
if(bitArray.get(1)) {
buf.writeFloat(roll);
buf.writeFloat(pitch);
buf.writeFloat(yaw);
}
if(bitArray.get(2)) {
velocity.encode(buf);
}
if(bitArray.get(3)) {
accel.encode(buf);
}
if(bitArray.get(4)) {
extraVel.encode(buf);
}
if(bitArray.get(5)) {
buf.writeFloat(lookPitch);
}
if(bitArray.get(6)) {
buf.writeInt((int)physicsFlags);
}
if(bitArray.get(7)) {
buf.writeByte(speedFlags);
}
if(bitArray.get(8)) {
buf.writeInt((int) entityType);
}
if(bitArray.get(9)) {
buf.writeByte(currentMode);
}
if (bitArray.get(10)) {
buf.writeInt((int) lastShootTime);
}
if(bitArray.get(11)) {
buf.writeInt((int) hitCounter);
}
if(bitArray.get(12)) {
buf.writeInt((int) lastHitTime);
}
if(bitArray.get(13)) {
app.encode(buf);
}
if(bitArray.get(14)) {
buf.writeByte(flags1);
buf.writeByte(flags2);
}
if(bitArray.get(15)) {
buf.writeInt((int) rollTime);
}
if(bitArray.get(16)) {
buf.writeInt(stunTime);
}
if(bitArray.get(17)) {
buf.writeInt((int) slowedTime);
}
if(bitArray.get(18)) {
buf.writeInt((int) makeBlueTime);
}
if(bitArray.get(19)) {
buf.writeInt((int) speedUpTime);
}
if(bitArray.get(20)) {
buf.writeFloat(slowPatchTime);
}
if(bitArray.get(21)) {
buf.writeByte(classType);
}
if(bitArray.get(22)) {
buf.writeByte(specialization);
}
if(bitArray.get(23)) {
buf.writeFloat(chargedMP);
}
if(bitArray.get(24)) {
buf.writeInt((int) nu1);
buf.writeInt((int) nu2);
buf.writeInt((int) nu3);
}
if(bitArray.get(25)) {
buf.writeInt((int) nu4);
buf.writeInt((int) nu5);
buf.writeInt((int) nu6);
}
if(bitArray.get(26)) {
rayHit.encode(buf);
}
if(bitArray.get(27)) {
buf.writeFloat(HP);
}
if(bitArray.get(28)) {
buf.writeFloat(MP);
}
if(bitArray.get(29)) {
buf.writeFloat(blockPower);
}
if(bitArray.get(30)) {
buf.writeFloat(maxHPMultiplier);
buf.writeFloat(shootSpeed);
buf.writeFloat(damageMultiplier);
buf.writeFloat(armorMultiplier);
buf.writeFloat(resistanceMultiplier);
}
if(bitArray.get(31)) {
buf.writeByte(nu7);
}
if(bitArray.get(32)) {
buf.writeByte(nu8);
}
if(bitArray.get(33)) {
buf.writeInt((int) level);
}
if (bitArray.get(34)) {
buf.writeInt((int) currentXP);
}
if(bitArray.get(35)) {
buf.writeLong(parentOwner);
}
if(bitArray.get(36)) {
buf.writeInt((int) na1);
buf.writeInt((int) na2);
}
if(bitArray.get(37)) {
buf.writeByte(na3);
}
if(bitArray.get(38)) {
buf.writeInt((int) na4);
}
if(bitArray.get(39)) {
buf.writeInt((int) na5);
buf.writeInt((int) nu11);
buf.writeInt((int) nu12);
}
if(bitArray.get(40)) {
buf.writeInt((int) nu13);
buf.writeInt((int) nu14);
buf.writeInt((int) nu15);
buf.writeInt((int) nu16);
buf.writeInt((int) nu17);
buf.writeInt((int) nu18);
}
if(bitArray.get(41)) {
buf.writeInt((int) nu20);
buf.writeInt((int) nu21);
buf.writeInt((int) nu22);
}
if(bitArray.get(42)) {
buf.writeByte(nu19);
}
if(bitArray.get(43)) {
itemData.encode(buf);
}
if(bitArray.get(44)) {
for (int i = 0; i < 13; i++)
{
Item item = equipment[i];
item.encode(buf);
}
}
if(bitArray.get(45)) {
byte[] nameBytes = name.trim().getBytes(Charsets.US_ASCII);
buf.writeBytes(nameBytes);
}
if(bitArray.get(46)) {
for (int i = 0; i < 11; i++) {
buf.writeInt((int) skills[i]);
}
}
if(bitArray.get(47)) {
buf.writeInt((int) iceBlockFour);
}
}
}