* updated Object updates (SMSG_[COMPRESSeD_]UPDATE_OBJECT) to 2.0.12
* copied/updated some new unit data from MaNGOS * new log level: legdev() - loglevel 3 and above. * disabled item listing at entering/leaving world.
This commit is contained in:
parent
9b373f6643
commit
0b36ae85da
@ -210,7 +210,7 @@ void ItemProtoCache_InsertDataToSession(WorldSession *session)
|
||||
buf >> proto->Unknown2; // Added in 1.12.x client branch
|
||||
if(proto->Id)
|
||||
{
|
||||
DEBUG(logdebug("ItemProtoCache: Loaded %u [%s]",proto->Id, proto->Name[0].c_str()));
|
||||
//DEBUG(logdebug("ItemProtoCache: Loaded %u [%s]",proto->Id, proto->Name[0].c_str()));
|
||||
session->objmgr.Add(proto);
|
||||
counter++;
|
||||
}
|
||||
@ -312,7 +312,7 @@ void ItemProtoCache_WriteDataToCache(WorldSession *session)
|
||||
buf << proto->Unknown1;
|
||||
buf << proto->Unknown2; // Added in 1.12.x client branch
|
||||
|
||||
DEBUG(logdebug("ItemProtoCache: Saved %u [%s]",proto->Id, proto->Name[0].c_str()));
|
||||
//DEBUG(logdebug("ItemProtoCache: Saved %u [%s]",proto->Id, proto->Name[0].c_str()));
|
||||
uint32 size = buf.size();
|
||||
fh.write((char*)&size,sizeof(uint32));
|
||||
fh.write((char*)buf.contents(),buf.size());
|
||||
|
||||
@ -3,30 +3,42 @@
|
||||
|
||||
#include "Object.h"
|
||||
|
||||
enum UnitMoveType
|
||||
{
|
||||
MOVE_WALK =0,
|
||||
MOVE_RUN =1,
|
||||
MOVE_WALKBACK =2,
|
||||
MOVE_SWIM =3,
|
||||
MOVE_SWIMBACK =4,
|
||||
MOVE_TURN =5,
|
||||
MAX_MOVE_TYPE =6
|
||||
enum UnitMoveType
|
||||
{
|
||||
MOVE_WALK = 0,
|
||||
MOVE_RUN = 1,
|
||||
MOVE_WALKBACK = 2,
|
||||
MOVE_SWIM = 3,
|
||||
MOVE_SWIMBACK = 4,
|
||||
MOVE_TURN = 5,
|
||||
MOVE_FLY = 6,
|
||||
MOVE_FLYBACK = 7,
|
||||
MAX_MOVE_TYPE = 8
|
||||
};
|
||||
|
||||
enum UnitFlags
|
||||
{
|
||||
UNIT_FLAG_NONE = 0x00000000,
|
||||
UNIT_FLAG_DISABLE_MOVE = 0x00000004,
|
||||
UNIT_FLAG_UNKNOWN1 = 0x00000008, // essential for all units..
|
||||
UNIT_FLAG_RENAME = 0x00000010, // rename creature
|
||||
UNIT_FLAG_RESTING = 0x00000020,
|
||||
UNIT_FLAG_PVP = 0x00001000,
|
||||
UNIT_FLAG_MOUNT = 0x00002000,
|
||||
UNIT_FLAG_DISABLE_ROTATE = 0x00040000,
|
||||
UNIT_FLAG_IN_COMBAT = 0x00080000,
|
||||
UNIT_FLAG_SKINNABLE = 0x04000000,
|
||||
UNIT_FLAG_SHEATHE = 0x40000000
|
||||
enum UnitFlags
|
||||
{
|
||||
UNIT_FLAG_NONE = 0x00000000,
|
||||
UNIT_FLAG_DISABLE_MOVE = 0x00000004,
|
||||
UNIT_FLAG_UNKNOWN1 = 0x00000008, // essential for all units..
|
||||
UNIT_FLAG_RENAME = 0x00000010, // rename creature, not working in 2.0.8
|
||||
UNIT_FLAG_RESTING = 0x00000020,
|
||||
UNIT_FLAG_UNKNOWN2 = 0x00000100, // 2.0.8
|
||||
UNIT_FLAG_UNKNOWN3 = 0x00000800, // in combat ?2.0.8
|
||||
UNIT_FLAG_PVP = 0x00001000,
|
||||
UNIT_FLAG_MOUNT = 0x00002000,
|
||||
UNIT_FLAG_UNKNOWN4 = 0x00004000, // 2.0.8
|
||||
UNIT_FLAG_PACIFIED = 0x00020000,
|
||||
UNIT_FLAG_DISABLE_ROTATE = 0x00040000, // may be it's stunned flag?
|
||||
UNIT_FLAG_IN_COMBAT = 0x00080000,
|
||||
UNIT_FLAG_DISARMED = 0x00200000, // disable melee spells casting..., "Required melee weapon" added to melee spells tooltip.
|
||||
UNIT_FLAG_CONFUSED = 0x00400000,
|
||||
UNIT_FLAG_FLEEING = 0x00800000,
|
||||
UNIT_FLAG_UNKNOWN5 = 0x01000000, // used in spell Eyes of the Beast for pet...
|
||||
UNIT_FLAG_NOT_SELECTABLE = 0x02000000,
|
||||
UNIT_FLAG_SKINNABLE = 0x04000000,
|
||||
UNIT_FLAG_UNKNOWN6 = 0x20000000, // used in Feing Death spell
|
||||
UNIT_FLAG_SHEATHE = 0x40000000
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -72,8 +72,6 @@ void WorldSession::_HandleUpdateObjectOpcode(WorldPacket& recvPacket)
|
||||
recvPacket >> objtypeid;
|
||||
logdebug("Create Object type %u with guid "I64FMT,objtypeid,uguid);
|
||||
|
||||
|
||||
|
||||
switch(objtypeid)
|
||||
{
|
||||
case TYPEID_OBJECT: // no data to read
|
||||
@ -161,114 +159,91 @@ void WorldSession::_HandleUpdateObjectOpcode(WorldPacket& recvPacket)
|
||||
void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& recvPacket)
|
||||
{
|
||||
uint8 flags;
|
||||
uint32 unk32,flags2,time,posCount,transtime;
|
||||
uint32 unk32,flags2,time,transtime,higuid;
|
||||
float unkf,x,y,z,o,tx,ty,tz,to;
|
||||
uint64 transguid;
|
||||
float speedWalk, speedRun, speedSwimBack, speedSwim, speedWalkBack, speedTurn;
|
||||
// uint64 fullguid; // see below
|
||||
float speedWalk, speedRun, speedSwimBack, speedSwim, speedWalkBack, speedTurn, speedFly, speedFlyBack;
|
||||
|
||||
Object *obj = (Object*)objmgr.GetObj(uguid);
|
||||
Unit *u = (Unit*)obj; // only use for Unit:: functions!!
|
||||
|
||||
recvPacket >> flags;
|
||||
flags2 = 0; // not sure if its correct to set it to 0 (needs some starting flag?)
|
||||
|
||||
if(objtypeid==TYPEID_PLAYER)
|
||||
if(flags & UPDATEFLAG_LIVING)
|
||||
{
|
||||
Unit *u = (Unit*)objmgr.GetObj(uguid);
|
||||
recvPacket >> flags2 >> time;
|
||||
recvPacket >> flags2 >> time;
|
||||
}
|
||||
|
||||
if (flags2 & 0x02000000) // On a transport
|
||||
logdev("MovementUpdate TypeID=%u GUID="I64FMT" pObj=%X flags=%u flags2=%u",objtypeid,uguid,obj,flags,flags2);
|
||||
|
||||
if(flags & UPDATEFLAG_HASPOSITION)
|
||||
{
|
||||
if(flags & UPDATEFLAG_TRANSPORT)
|
||||
{
|
||||
recvPacket >> x >> y >> z >> o >> transguid >> tx >> ty >> tz >> to;
|
||||
recvPacket >> unkf >> unkf >> unkf >> o; // 3x (float)0 followed by orientation
|
||||
}
|
||||
else
|
||||
{
|
||||
recvPacket >> x >> y >> z >> o;
|
||||
}
|
||||
|
||||
recvPacket >> unkf;
|
||||
|
||||
if(flags2 & 0x2000) // Self update
|
||||
{
|
||||
// What is this data used for?
|
||||
recvPacket >> unkf;
|
||||
recvPacket >> unkf;
|
||||
recvPacket >> unkf;
|
||||
recvPacket >> unkf;
|
||||
}
|
||||
recvPacket >> speedWalk >> speedRun >> speedSwimBack >> speedSwim >> speedWalkBack >> speedTurn;
|
||||
if(u)
|
||||
{
|
||||
u->SetPosition(x,y,z,o);
|
||||
u->SetSpeed(MOVE_WALK,speedWalk);
|
||||
u->SetSpeed(MOVE_RUN,speedRun);
|
||||
u->SetSpeed(MOVE_SWIMBACK,speedSwimBack);
|
||||
u->SetSpeed(MOVE_SWIM,speedSwim);
|
||||
u->SetSpeed(MOVE_WALKBACK,speedWalkBack);
|
||||
u->SetSpeed(MOVE_TURN,speedTurn);
|
||||
}
|
||||
else
|
||||
{
|
||||
logcustom(2,RED,"WorldSession::_MovementUpdate for unknown guid "I64FMT" typeid=%u",uguid,objtypeid);
|
||||
}
|
||||
}
|
||||
if(objtypeid==TYPEID_UNIT)
|
||||
{
|
||||
Unit *u = (Unit*)objmgr.GetObj(uguid);
|
||||
recvPacket >> flags2 >> unk32 >> x >> y >> z >> o >> unkf;
|
||||
recvPacket >> speedWalk >> speedRun >> speedSwimBack >> speedSwim >> speedWalkBack >> speedTurn;
|
||||
|
||||
if (flags2 & 0x400000)
|
||||
|
||||
if(flags2 & FLAGS2_TRANSPORT)
|
||||
{
|
||||
recvPacket >> unk32 >> unk32 >> unk32 >> unk32 >> posCount;
|
||||
|
||||
for (uint8 i = 0; i < posCount + 1; i++)
|
||||
{
|
||||
recvPacket >> unkf >> unkf >> unkf; // Some x, y, z value
|
||||
}
|
||||
recvPacket >> transguid >> tx >> ty >> tz >> to;
|
||||
recvPacket >> unk32; // added in 2.0.3
|
||||
}
|
||||
if(u)
|
||||
{
|
||||
u->SetPosition(x,y,z,o);
|
||||
u->SetSpeed(MOVE_WALK,speedWalk);
|
||||
u->SetSpeed(MOVE_RUN,speedRun);
|
||||
u->SetSpeed(MOVE_SWIMBACK,speedSwimBack);
|
||||
u->SetSpeed(MOVE_SWIM,speedSwim);
|
||||
u->SetSpeed(MOVE_WALKBACK,speedWalkBack);
|
||||
u->SetSpeed(MOVE_TURN,speedTurn);
|
||||
}
|
||||
else
|
||||
{
|
||||
logcustom(2,RED,"WorldSession::_MovementUpdate for unknown guid "I64FMT" typeid=%u",uguid,objtypeid);
|
||||
}
|
||||
}
|
||||
if( (objtypeid==TYPEID_CORPSE) || (objtypeid==TYPEID_GAMEOBJECT) || (objtypeid==TYPEID_DYNAMICOBJECT))
|
||||
if(flags & UPDATEFLAG_LIVING)
|
||||
{
|
||||
Unit *u = (Unit*)objmgr.GetObj(uguid);
|
||||
if(GUID_HIPART(uguid) != HIGHGUID_TRANSPORT)
|
||||
{
|
||||
recvPacket >> x >> y >> z;
|
||||
if(u)
|
||||
u->SetPosition(x,y,z,u->GetO());
|
||||
else
|
||||
logcustom(2,RED,"WorldSession::_MovementUpdate for unknown guid "I64FMT" typeid=%u",uguid,objtypeid);
|
||||
}
|
||||
else
|
||||
{
|
||||
recvPacket >> unk32 >> unk32 >> unk32; // should be 0?
|
||||
}
|
||||
recvPacket >> o;
|
||||
if(u)
|
||||
u->SetPosition(u->GetX(),u->GetY(),u->GetZ(),o);
|
||||
else
|
||||
logcustom(2,RED,"WorldSession::_MovementUpdate for unknown guid "I64FMT" typeid=%u",uguid,objtypeid);
|
||||
recvPacket >> unk32;
|
||||
if(flags2 & 0x2000) // 0x2000 = ??
|
||||
{
|
||||
recvPacket >> unkf >> unkf >> unkf >> unkf;
|
||||
}
|
||||
recvPacket >> speedWalk >> speedRun >> speedSwimBack >> speedSwim;
|
||||
recvPacket >> speedWalkBack >> speedFly >> speedFlyBack >> speedTurn; // fly added in 2.0.x
|
||||
if(u)
|
||||
{
|
||||
u->SetPosition(x,y,z,o);
|
||||
u->SetSpeed(MOVE_WALK,speedWalk);
|
||||
u->SetSpeed(MOVE_RUN,speedRun);
|
||||
u->SetSpeed(MOVE_SWIMBACK,speedSwimBack);
|
||||
u->SetSpeed(MOVE_SWIM,speedSwim);
|
||||
u->SetSpeed(MOVE_WALKBACK,speedWalkBack);
|
||||
u->SetSpeed(MOVE_TURN,speedTurn);
|
||||
u->SetSpeed(MOVE_FLY,speedFly);
|
||||
u->SetSpeed(MOVE_FLYBACK,speedFlyBack);
|
||||
}
|
||||
else
|
||||
{
|
||||
logcustom(2,RED,"WorldSession::_MovementUpdate for unknown guid "I64FMT" typeid=%u",uguid,objtypeid);
|
||||
}
|
||||
}
|
||||
|
||||
recvPacket >> unk32; // (uint32)0x1
|
||||
if(flags & UPDATEFLAG_ALL)
|
||||
{
|
||||
recvPacket >> unk32;
|
||||
}
|
||||
|
||||
if ((GUID_HIPART(uguid) == HIGHGUID_TRANSPORT))
|
||||
{
|
||||
recvPacket >> transtime;
|
||||
}
|
||||
|
||||
if( GUID_HIPART(uguid) == HIGHGUID_PLAYER_CORPSE)
|
||||
recvPacket >> unk32; // ??
|
||||
if(flags & UPDATEFLAG_HIGHGUID)
|
||||
{
|
||||
recvPacket >> higuid; // 2.0.6 - high guid was there, unk for 2.0.12
|
||||
// not sure if this is correct
|
||||
obj->SetUInt32Value(OBJECT_FIELD_GUID+1,higuid); // note that this sets only the high part of the guid
|
||||
}
|
||||
|
||||
if(flags & UPDATEFLAG_FULLGUID)
|
||||
{
|
||||
// unused in mangos? but what if its needed?
|
||||
// recvPacket >> fullguid;
|
||||
}
|
||||
|
||||
if(flags & UPDATEFLAG_TRANSPORT)
|
||||
{
|
||||
recvPacket >> transtime; // whats this used for?
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -289,6 +264,7 @@ void WorldSession::_ValuesUpdate(uint64 uguid, WorldPacket& recvPacket)
|
||||
recvPacket.read((uint8*)updateMask, masksize);
|
||||
umask.SetMask(updateMask);
|
||||
//delete [] updateMask; // will be deleted at ~UpdateMask() !!!!
|
||||
logdev("ValuesUpdate TypeId=%u GUID="I64FMT" pObj=%X Blocks=%u Masksize=%u",obj->GetTypeId(),uguid,obj,blockcount,masksize);
|
||||
|
||||
for (uint32 i = 0; i < valuesCount; i++)
|
||||
{
|
||||
@ -296,7 +272,7 @@ void WorldSession::_ValuesUpdate(uint64 uguid, WorldPacket& recvPacket)
|
||||
{
|
||||
recvPacket >> value;
|
||||
|
||||
// TODO: which values are float and which values are uin32 ??!
|
||||
// TODO: what to do here?!
|
||||
/*if( obj->isType(TYPE_UNIT) && (
|
||||
i >= UNIT_FIELD_POWER1 && i <= UNIT_FIELD_MAXPOWER5 ||
|
||||
i >= UNIT_FIELD_BASEATTACKTIME && i <= UNIT_FIELD_RANGEDATTACKTIME ||
|
||||
@ -311,6 +287,8 @@ void WorldSession::_ValuesUpdate(uint64 uguid, WorldPacket& recvPacket)
|
||||
|
||||
obj->SetUInt32Value(i, value);
|
||||
//}
|
||||
// still nee to find out which values to interpret as floats
|
||||
logdev("-> Field[%u] = %u",i,value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,18 +1,47 @@
|
||||
#ifndef _UPDATEDATA_H
|
||||
#define _UPDATEDATA_H
|
||||
|
||||
|
||||
// old code for 1.12.x (and below)
|
||||
/*
|
||||
enum OBJECT_UPDATE_TYPE
|
||||
{
|
||||
UPDATETYPE_VALUES = 0,
|
||||
|
||||
UPDATETYPE_MOVEMENT = 1,
|
||||
|
||||
UPDATETYPE_CREATE_OBJECT = 2,
|
||||
|
||||
UPDATETYPE_CREATE_OBJECT2 = 3,
|
||||
UPDATETYPE_OUT_OF_RANGE_OBJECTS = 4,
|
||||
UPDATETYPE_NEAR_OBJECTS = 5
|
||||
|
||||
};
|
||||
*/
|
||||
|
||||
enum OBJECT_UPDATE_TYPE
|
||||
{
|
||||
UPDATETYPE_VALUES = 0,
|
||||
UPDATETYPE_MOVEMENT = 1,
|
||||
UPDATETYPE_CREATE_OBJECT = 2,
|
||||
UPDATETYPE_CREATE_OBJECT2 = 3,
|
||||
UPDATETYPE_OUT_OF_RANGE_OBJECTS = 4,
|
||||
UPDATETYPE_NEAR_OBJECTS = 5
|
||||
};
|
||||
|
||||
enum OBJECT_UPDATE_FLAGS
|
||||
{
|
||||
UPDATEFLAG_SELF = 0x01,
|
||||
UPDATEFLAG_TRANSPORT = 0x02,
|
||||
UPDATEFLAG_FULLGUID = 0x04,
|
||||
UPDATEFLAG_HIGHGUID = 0x08,
|
||||
UPDATEFLAG_ALL = 0x10,
|
||||
UPDATEFLAG_LIVING = 0x20,
|
||||
UPDATEFLAG_HASPOSITION = 0x40
|
||||
};
|
||||
|
||||
// not sure about those flags, mangos hasnt a description for it either
|
||||
enum FLAGS2_UPDATE_FLAGS
|
||||
{
|
||||
FLAGS2_TRANSPORT = 0x200,
|
||||
FLAGS2_SPIRITHEALER = 0x10000000,
|
||||
};
|
||||
|
||||
#endif
|
||||
@ -89,6 +89,32 @@ void logdebug(const char *str, ...)
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
void logdev(const char *str, ...)
|
||||
{
|
||||
if(!str || instance->GetConf()->debug < 3)
|
||||
return;
|
||||
va_list ap;
|
||||
_log_setcolor(true,LMAGENTA);
|
||||
va_start(ap, str);
|
||||
vprintf( str, ap );
|
||||
va_end(ap);
|
||||
_log_resetcolor(true);
|
||||
|
||||
|
||||
printf("\n");
|
||||
|
||||
if(logfile)
|
||||
{
|
||||
fprintf(logfile, getDateString().c_str());
|
||||
va_start(ap, str);
|
||||
vfprintf(logfile, str, ap);
|
||||
fprintf(logfile, "\n" );
|
||||
va_end(ap);
|
||||
fflush(logfile);
|
||||
}
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
void logerror(const char *str, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
@ -26,6 +26,7 @@ void log_prepare(char *fn, PseuInstance* p); // instance reference needed for lo
|
||||
void log(const char *str, ...);
|
||||
void logdetail(const char *str, ...);
|
||||
void logdebug(const char *str, ...);
|
||||
void logdev(const char *str, ...);
|
||||
void logerror(const char *str, ...);
|
||||
void logcritical(const char *str, ...);
|
||||
void logcustom(uint8 loglevel, Color color, const char *str, ...);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user