From 08a16455998848a3293b91c77fd3c69d454e679e Mon Sep 17 00:00:00 2001 From: bluma4862 Date: Tue, 21 Jul 2009 07:18:18 +0000 Subject: [PATCH] * cleanup in UpdateData.cpp * fixed response at "near" teleport (HandleTelePortAckOpcode) * added skeletal implementation of SMSG_MONSTER_MOVE --- src/Client/World/UpdateData.cpp | 84 +++++++++++++------------------ src/Client/World/WorldSession.cpp | 54 +++++++++++++++++++- src/Client/World/WorldSession.h | 1 + 3 files changed, 88 insertions(+), 51 deletions(-) diff --git a/src/Client/World/UpdateData.cpp b/src/Client/World/UpdateData.cpp index 1943b39..2ce2aa4 100644 --- a/src/Client/World/UpdateData.cpp +++ b/src/Client/World/UpdateData.cpp @@ -236,7 +236,6 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r { MovementInfo mi; // TODO: use a reference to a MovementInfo in Unit/Player class once implemented uint16 flags; - float unkfx,unkfy,unkfz; // uint64 fullguid; // see below float speedWalk, speedRun, speedSwimBack, speedSwim, speedWalkBack, speedTurn, speedFly, speedFlyBack, speedPitchRate; uint32 unk32; @@ -262,26 +261,13 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r { recvPacket >> mi.flags >> mi.unkFlags >> mi.time; - logdev("MovementUpdate: TypeID=%u GUID="I64FMT" pObj=%X flags=%u mi.flags=%u",objtypeid,uguid,obj,flags,mi.flags); + logdev("MovementUpdate: TypeID=%u GUID="I64FMT" pObj=%X flags=%u mi.flags=%u",objtypeid,uguid,obj,flags,mi.flags); - /*if(flags & UPDATEFLAG_HAS_POSITION) - { - if(flags & UPDATEFLAG_TRANSPORT) - { - recvPacket >> unkfx >> unkfy >> unkfz >> mi.o; // 3x (float)0 followed by orientation - logdev("TRANSPORT_FLOATS @ flags: x=%f y=%f z=%f o=%f", unkfx, unkfy, unkfz, mi.o); - } - else - {*/ - recvPacket >> mi.x >> mi.y >> mi.z >> mi.o; - logdev("FLOATS: x=%f y=%f z=%f o=%f",mi.x, mi.y, mi.z ,mi.o); - if(obj && obj->IsWorldObject()) - ((WorldObject*)obj)->SetPosition(mi.x, mi.y, mi.z, mi.o); - //} - //} + recvPacket >> mi.x >> mi.y >> mi.z >> mi.o; + logdev("FLOATS: x=%f y=%f z=%f o=%f",mi.x, mi.y, mi.z ,mi.o); + if(obj && obj->IsWorldObject()) + ((WorldObject*)obj)->SetPosition(mi.x, mi.y, mi.z, mi.o); - //if(flags & UPDATEFLAG_LIVING) - //{ if(mi.flags & MOVEMENTFLAG_ONTRANSPORT) { mi.t_guid = recvPacket.GetPackedGuid(); @@ -312,23 +298,22 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r logdev("MovementUpdate: MOVEMENTFLAG_SPLINE is set, got %u", mi.u_unk1); } - recvPacket >> speedWalk >> speedRun >> speedSwimBack >> speedSwim; // speedRun can also be mounted speed if player is mounted recvPacket >> speedWalkBack >> speedFly >> speedFlyBack >> speedTurn; // fly added in 2.0.x recvPacket >> speedPitchRate; logdev("MovementUpdate: Got speeds, walk=%f run=%f turn=%f", speedWalk, speedRun, speedTurn); if(u) { - u->SetPosition(mi.x, mi.y, mi.z, mi.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); - u->SetSpeed(MOVE_PITCH_RATE, speedPitchRate); + u->SetPosition(mi.x, mi.y, mi.z, mi.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); + u->SetSpeed(MOVE_PITCH_RATE, speedPitchRate); } // TODO: correct this one as soon as its meaning is known OR if it appears often and needs to be fixed @@ -337,19 +322,19 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r logerror("MovementUpdate: MOVEMENTFLAG_SPLINE2 is set, if you see this message please report it!"); return; } - //} } - else // !LIVING + else // !UPDATEFLAG_LIVING { - //logdev("MovementUpdate: UPDATEFLAG_LIVING *NOT* set! (no MovementInfo)"); - // TODO: Find whats this and FIX! if(flags & UPDATEFLAG_POSITION) { uint64 pguid = recvPacket.GetPackedGuid(); - float x,y,z,o; + float x,y,z,o,sx,sy,sz,so; recvPacket >> x >> y >> z; - recvPacket >> x >> y >> z; - recvPacket >> o >> o; + recvPacket >> sx >> sy >> sz; + recvPacket >> o >> so; + + if (obj && obj->IsWorldObject()) + ((WorldObject*)obj)->SetPosition(x, y, z, o); } else { @@ -359,10 +344,13 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r if(flags & UPDATEFLAG_TRANSPORT) { recvPacket >> x >> y >> z >> o; + // only zeroes here } else { recvPacket >> x >> y >> z >> o; + if (obj && obj->IsWorldObject()) + ((WorldObject*)obj)->SetPosition(x, y, z, o); } } } @@ -406,6 +394,7 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r { uint64 rotation; recvPacket >> rotation; + // gameobject rotation } } @@ -573,17 +562,14 @@ bool IsFloatField(uint8 ty, uint32 f) (uint32)PLAYER_FROST_SPELL_CRIT_PERCENTAGE, (uint32)PLAYER_SHADOW_SPELL_CRIT_PERCENTAGE, (uint32)PLAYER_ARCANE_SPELL_CRIT_PERCENTAGE, - /*(uint32)PLAYER_FIELD_MOD_MANA_REGEN, - (uint32)PLAYER_FIELD_MOD_MANA_REGEN_INTERRUPT,*/ (uint32)-1 }; static uint32 floats_gameobject[] = { - /*(uint32)GAMEOBJECT_ROTATION, - (uint32)GAMEOBJECT_POS_X, - (uint32)GAMEOBJECT_POS_Y, - (uint32)GAMEOBJECT_POS_Z, - (uint32)GAMEOBJECT_FACING,*/ + (uint32)GAMEOBJECT_PARENTROTATION, + (uint32)(GAMEOBJECT_PARENTROTATION + 1), + (uint32)(GAMEOBJECT_PARENTROTATION + 2), + (uint32)(GAMEOBJECT_PARENTROTATION + 3), (uint32)-1 }; static uint32 floats_dynobject[] = @@ -592,16 +578,15 @@ bool IsFloatField(uint8 ty, uint32 f) (uint32)DYNAMICOBJECT_POS_X, (uint32)DYNAMICOBJECT_POS_Y, (uint32)DYNAMICOBJECT_POS_Z, + (uint32)DYNAMICOBJECT_FACING, (uint32)-1 }; + /* static uint32 floats_corpse[] = { - /*(uint32)CORPSE_FIELD_FACING, - (uint32)CORPSE_FIELD_POS_X, - (uint32)CORPSE_FIELD_POS_Y, - (uint32)CORPSE_FIELD_POS_Z,*/ (uint32)-1 }; + */ if(ty & TYPE_OBJECT) for(uint32 i = 0; floats_object[i] != (uint32)(-1); i++) @@ -633,10 +618,11 @@ bool IsFloatField(uint8 ty, uint32 f) for(uint32 i = 0; floats_dynobject[i] != (uint32)(-1); i++) if(floats_dynobject[i] == f) return true; + /* if(ty & TYPE_CORPSE) for(uint32 i = 0; floats_corpse[i] != (uint32)(-1); i++) if(floats_corpse[i] == f) return true; - + */ return false; } diff --git a/src/Client/World/WorldSession.cpp b/src/Client/World/WorldSession.cpp index 1c93350..abfdf42 100644 --- a/src/Client/World/WorldSession.cpp +++ b/src/Client/World/WorldSession.cpp @@ -348,6 +348,7 @@ OpcodeHandler *WorldSession::_GetOpcodeHandlerTable() const {SMSG_CREATURE_QUERY_RESPONSE, &WorldSession::_HandleCreatureQueryResponseOpcode}, {SMSG_GAMEOBJECT_QUERY_RESPONSE, &WorldSession::_HandleGameobjectQueryResponseOpcode}, {SMSG_CHAR_CREATE, &WorldSession::_HandleCharCreateOpcode}, + {SMSG_MONSTER_MOVE, &WorldSession::_HandleMonsterMoveOpcode}, // table termination { 0, NULL } @@ -1215,9 +1216,13 @@ void WorldSession::_HandleTelePortAckOpcode(WorldPacket& recvPacket) logdetail("Got teleported, data: x: %f, y: %f, z: %f, o: %f, guid: "I64FMT, x, y, z, o, guid); + WorldPacket wp(MSG_MOVE_TELEPORT_ACK,8+4+4); + wp << guid << (uint32)0 << (uint32)getMSTime(); + SendWorldPacket(wp); + // TODO: put this into a capsule class later, that autodetects movement flags etc. WorldPacket response(MSG_MOVE_FALL_LAND,4+2+4+4+4+4+4+4); - response << uint32(0) << (uint16)0; // no flags; unk + response << uint32(0) << (uint16)0 << (uint32)getMSTime(); // no flags; unk response << x << y << z << o << uint32(100); // simulate 100 msec fall time SendWorldPacket(response); @@ -1614,7 +1619,6 @@ void WorldSession::_HandleCreatureQueryResponseOpcode(WorldPacket& recvPacket) recvPacket >> ct->type; recvPacket >> ct->family; recvPacket >> ct->rank; - //recvPacket >> ct->SpellDataId; for(uint32 i = 0; i < MAX_KILL_CREDIT; i++) recvPacket >> ct->killCredit[i]; recvPacket >> ct->displayid_A; @@ -1710,7 +1714,53 @@ void WorldSession::_HandleCharCreateOpcode(WorldPacket& recvPacket) gui->SetSceneData(ISCENE_CHARSEL_ERRMSG, response); } +void WorldSession::_HandleMonsterMoveOpcode(WorldPacket& recvPacket) +{ + uint64 guid; + guid = recvPacket.GetPackedGuid(); + + Object* obj = objmgr.GetObj(guid); + if (!obj || !obj->IsWorldObject()) + return; + uint8 unk, type; + uint32 time, flags, movetime, waypoints; + float x, y, z; + recvPacket >> unk >> x >> y >> z >> time >> type; + + float oldx = ((WorldObject*)obj)->GetX(), + oldy = ((WorldObject*)obj)->GetY(); + float o = atan2f(y - oldy, x - oldx); + // not much good, better than nothing + + ((WorldObject*)obj)->SetPosition(x, y, z, o); + switch(type) + { + case 0: break; // normal packet + case 1: break; // stop packet + case 2: + float unkf; + recvPacket >> unkf >> unkf >> unkf; + break; + case 3: + uint64 unkguid; + recvPacket >> unkguid; + break; + case 4: + float angle; + recvPacket >> angle; + break; + } + + // movement flags, time between waypoints, number of waypoints + recvPacket >> flags >> movetime >> waypoints; + + /* + // waypoint data + for (uint32 i = 0; i < waypoints; i++) + recvPacket >> x >> y >> z; + */ +} // TODO: delete world on LogoutComplete once implemented diff --git a/src/Client/World/WorldSession.h b/src/Client/World/WorldSession.h index d99fa5e..1945427 100644 --- a/src/Client/World/WorldSession.h +++ b/src/Client/World/WorldSession.h @@ -163,6 +163,7 @@ private: void _HandleCreatureQueryResponseOpcode(WorldPacket& recvPacket); void _HandleGameobjectQueryResponseOpcode(WorldPacket& recvPacket); void _HandleCharCreateOpcode(WorldPacket& recvPacket); + void _HandleMonsterMoveOpcode(WorldPacket& recvPacket); // helper functions to keep SMSG_(COMPRESSED_)UPDATE_OBJECT easy to handle void _MovementUpdate(uint8 objtypeid, uint64 guid, WorldPacket& recvPacket); // Helper for _HandleUpdateObjectOpcode