Code:
bool updateblock_position(unsigned long long guid, unsigned char** pos)
{
unsigned long long rotation_guid, target_guid, transport_guid;
unsigned int updateFlags,movementFlags,timestamp,ttimestamp,fallTime,val,lowGuid,HighGuid,splineFlags,vehiculeid;
unsigned short movementFlags2;
unsigned char tseat;
float x,y,z,o,tx,ty,tz,to,sx,sy,sz,so,px,py,pz,jumpUnk1,jumpSinAngle,jumpCosAngle,jumpXYSpeed,pitch,speed,aim;
int i,count;
//hexdump(*pos,50);
GETINT16(updateFlags,*pos);
logopcode("updateflags=%X ",updateFlags);
if (updateFlags & UPDATEFLAG_LIVING) {
logopcode("living ");
GETINT32(movementFlags,*pos);
GETINT16(movementFlags2,*pos);
GETINT32(timestamp,*pos);
GETFLOAT(x,*pos);
GETFLOAT(y,*pos);
GETFLOAT(z,*pos);
GETFLOAT(o,*pos);
logopcode("movflags=%X movFlags2=%X timestamp=%u x,y,z,o=%.1f,%.1f,%.1f,%.1f ",movementFlags,movementFlags2,timestamp,x,y,z,o);
objectMap.updatePos(guid,x,y,z,o);
if (movementFlags & MOVEFLAG_TAXI) {
transport_guid = get_pguid(pos);
GETFLOAT(tx,*pos);
GETFLOAT(ty,*pos);
GETFLOAT(tz,*pos);
GETFLOAT(to,*pos);
GETINT32(ttimestamp,*pos);
GETINT8(tseat,*pos);
logopcode("tguid=%016llX tx,ty,tz,to=%.1f,%.1f,%.1f,%.1f ",transport_guid,tx,ty,tz,to);
}
if ((movementFlags & (MOVEFLAG_SWIMMING | MOVEFLAG_AIR_SWIMMING)) || (movementFlags2 & 0x20)) {
GETFLOAT(pitch,*pos);
logopcode("pitch=%.1f ",pitch);
objectMap.updatePitch(guid,pitch);
}
GETINT32(fallTime,*pos);
logopcode("fallTime=%d ",fallTime);
if (movementFlags & MOVEFLAG_JUMPING) {
GETFLOAT(jumpUnk1,*pos);
GETFLOAT(jumpSinAngle,*pos);
GETFLOAT(jumpCosAngle,*pos);
GETFLOAT(jumpXYSpeed,*pos);
logopcode("jump ");
}
if (movementFlags & MOVEFLAG_SPLINE_MOVER) {
IGNOREFLOAT(*pos);
logopcode("splinemover ");
}
logopcode("speeds ");
for (i=0; i<9; ++i) {
GETFLOAT(speed,*pos);
logopcode("%.1f/",speed);
}
logopcode(" ");
if (movementFlags & MOVEFLAG_SPLINEPATH) {
GETINT32(splineFlags,*pos);
logopcode("splinepath flags=%X ",splineFlags);
if (splineFlags & SPLINEFLAGS_ORIENTATION) {
IGNOREFLOAT(*pos);
logopcode("target ");
} else if (splineFlags & SPLINEFLAGS_GUID) {
get_pguid(pos);
logopcode("guid ");
} else if (splineFlags & SPLINEFLAGS_XYZ) {
GETFLOAT(sx,*pos);
GETFLOAT(sy,*pos);
GETFLOAT(sz,*pos);
GETFLOAT(so,*pos);
logopcode("XYZ sx,sy,sz,so=%.1f,%.1f,%.1f,%.1f ",sx,sy,sz,so);
}
IGNOREINT32(*pos);
IGNOREINT32(*pos);
IGNOREINT32(*pos);
IGNOREFLOAT(*pos);
IGNOREFLOAT(*pos);
IGNOREFLOAT(*pos);
IGNOREINT32(*pos);
GETINT32(count,*pos);
if (count>100) {
printf("splinepath count too big (%d) ! ",count);
return false;
} else {
for(i=0;i<count;i++) {
GETFLOAT(px,*pos);
GETFLOAT(py,*pos);
GETFLOAT(pz,*pos);
logopcode("node=%.1f,%.1f,%.1f ",px,py,pz);
}
}
IGNOREINT8(*pos);
GETFLOAT(px,*pos);
GETFLOAT(py,*pos);
GETFLOAT(pz,*pos);
logopcode("finalnode=%.1f,%.1f,%.1f ",px,py,pz);
}
} else if (updateFlags & UPDATEFLAG_OBJONTRANSPORT) {
transport_guid = get_pguid(pos);
GETFLOAT(x,*pos);
GETFLOAT(y,*pos);
GETFLOAT(z,*pos);
GETFLOAT(tx,*pos);
GETFLOAT(ty,*pos);
GETFLOAT(tz,*pos);
GETFLOAT(o,*pos);
IGNOREFLOAT(*pos);
objectMap.updatePos(guid,x,y,z,o);
logopcode("objontransport tguid=%016llX x,y,z,o=%.1f,%.1f,%.1f,%.1f tx,ty,tz=%.1f,%.1f,%.1f ",transport_guid,x,y,z,o,tx,ty,tz);
} else if (updateFlags & UPDATEFLAG_STATIONARY) {
GETFLOAT(x,*pos);
GETFLOAT(y,*pos);
GETFLOAT(z,*pos);
GETFLOAT(o,*pos);
objectMap.updatePos(guid,x,y,z,o);
logopcode("hasposition x,y,z,o=%.1f,%.1f,%.1f,%.1f ",x,y,z,o);
}
if (updateFlags & UPDATEFLAG_HighGuid) {
unsigned int highGuid;
GETINT32(highGuid,*pos);
logopcode("highGuid=%08X ",highGuid);
}
if (updateFlags & UPDATEFLAG_LowGuid) {
unsigned int lowGuid;
GETINT32(lowGuid,*pos);
logopcode("lowGuid=%08X ",lowGuid);
}
if (updateFlags & UPDATEFLAG_ATTACKINGTARGET) {
target_guid = get_pguid(pos);
logopcode("target_guid=%016llX ",target_guid);
}
if ((updateFlags & UPDATEFLAG_TRANSPORT) != 0) {
logopcode("TRANSPORT ");
IGNOREINT32(*pos);
}
if (updateFlags & UPDATEFLAG_VEHICULE) {
GETINT32(vehiculeid,*pos);
GETFLOAT(aim,*pos);
logopcode("VEHICULE id=%d aim=%.1f",vehiculeid,aim);
}
if (updateFlags & UPDATEFLAG_HASROTATION) {
IGNOREINT64(*pos);
logopcode("HASROTATION ");
}
return true;
}