From 0b36ae85daa848ed1db9ac26cedf8accc132d58e Mon Sep 17 00:00:00 2001 From: "False.Genesis" Date: Mon, 30 Apr 2007 23:34:38 +0000 Subject: [PATCH] * 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. --- src/Client/World/CacheHandler.cpp | 4 +- src/Client/World/Unit.h | 56 +++++++---- src/Client/World/UpdateData.cpp | 160 +++++++++++++----------------- src/Client/World/UpdateData.h | 35 ++++++- src/Client/log.cpp | 26 +++++ src/Client/log.h | 1 + 6 files changed, 164 insertions(+), 118 deletions(-) diff --git a/src/Client/World/CacheHandler.cpp b/src/Client/World/CacheHandler.cpp index a390f11..f8422c6 100644 --- a/src/Client/World/CacheHandler.cpp +++ b/src/Client/World/CacheHandler.cpp @@ -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()); diff --git a/src/Client/World/Unit.h b/src/Client/World/Unit.h index 525fb1e..c228e87 100644 --- a/src/Client/World/Unit.h +++ b/src/Client/World/Unit.h @@ -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 }; diff --git a/src/Client/World/UpdateData.cpp b/src/Client/World/UpdateData.cpp index 6ba8951..a7bf5d3 100644 --- a/src/Client/World/UpdateData.cpp +++ b/src/Client/World/UpdateData.cpp @@ -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); } } } diff --git a/src/Client/World/UpdateData.h b/src/Client/World/UpdateData.h index 2ee196e..a1c6632 100644 --- a/src/Client/World/UpdateData.h +++ b/src/Client/World/UpdateData.h @@ -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 \ No newline at end of file diff --git a/src/Client/log.cpp b/src/Client/log.cpp index 4cde5cc..180e722 100644 --- a/src/Client/log.cpp +++ b/src/Client/log.cpp @@ -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; diff --git a/src/Client/log.h b/src/Client/log.h index 806ad62..e9e0925 100644 --- a/src/Client/log.h +++ b/src/Client/log.h @@ -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, ...);