* cleanup in UpdateData.cpp

* fixed response at "near" teleport (HandleTelePortAckOpcode)
* added skeletal implementation of SMSG_MONSTER_MOVE
This commit is contained in:
bluma4862 2009-07-21 07:18:18 +00:00
parent 35cb61782d
commit 08a1645599
3 changed files with 88 additions and 51 deletions

View File

@ -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 MovementInfo mi; // TODO: use a reference to a MovementInfo in Unit/Player class once implemented
uint16 flags; uint16 flags;
float unkfx,unkfy,unkfz;
// uint64 fullguid; // see below // uint64 fullguid; // see below
float speedWalk, speedRun, speedSwimBack, speedSwim, speedWalkBack, speedTurn, speedFly, speedFlyBack, speedPitchRate; float speedWalk, speedRun, speedSwimBack, speedSwim, speedWalkBack, speedTurn, speedFly, speedFlyBack, speedPitchRate;
uint32 unk32; uint32 unk32;
@ -262,26 +261,13 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r
{ {
recvPacket >> mi.flags >> mi.unkFlags >> mi.time; 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) 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(flags & UPDATEFLAG_TRANSPORT) if(obj && obj->IsWorldObject())
{ ((WorldObject*)obj)->SetPosition(mi.x, mi.y, mi.z, mi.o);
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);
//}
//}
//if(flags & UPDATEFLAG_LIVING)
//{
if(mi.flags & MOVEMENTFLAG_ONTRANSPORT) if(mi.flags & MOVEMENTFLAG_ONTRANSPORT)
{ {
mi.t_guid = recvPacket.GetPackedGuid(); 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); 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 >> 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 >> speedWalkBack >> speedFly >> speedFlyBack >> speedTurn; // fly added in 2.0.x
recvPacket >> speedPitchRate; recvPacket >> speedPitchRate;
logdev("MovementUpdate: Got speeds, walk=%f run=%f turn=%f", speedWalk, speedRun, speedTurn); logdev("MovementUpdate: Got speeds, walk=%f run=%f turn=%f", speedWalk, speedRun, speedTurn);
if(u) if(u)
{ {
u->SetPosition(mi.x, mi.y, mi.z, mi.o); u->SetPosition(mi.x, mi.y, mi.z, mi.o);
u->SetSpeed(MOVE_WALK, speedWalk); u->SetSpeed(MOVE_WALK, speedWalk);
u->SetSpeed(MOVE_RUN, speedRun); u->SetSpeed(MOVE_RUN, speedRun);
u->SetSpeed(MOVE_SWIMBACK, speedSwimBack); u->SetSpeed(MOVE_SWIMBACK, speedSwimBack);
u->SetSpeed(MOVE_SWIM, speedSwim); u->SetSpeed(MOVE_SWIM, speedSwim);
u->SetSpeed(MOVE_WALKBACK, speedWalkBack); u->SetSpeed(MOVE_WALKBACK, speedWalkBack);
u->SetSpeed(MOVE_TURN, speedTurn); u->SetSpeed(MOVE_TURN, speedTurn);
u->SetSpeed(MOVE_FLY, speedFly); u->SetSpeed(MOVE_FLY, speedFly);
u->SetSpeed(MOVE_FLYBACK, speedFlyBack); u->SetSpeed(MOVE_FLYBACK, speedFlyBack);
u->SetSpeed(MOVE_PITCH_RATE, speedPitchRate); 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 // 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!"); logerror("MovementUpdate: MOVEMENTFLAG_SPLINE2 is set, if you see this message please report it!");
return; return;
} }
//}
} }
else // !LIVING else // !UPDATEFLAG_LIVING
{ {
//logdev("MovementUpdate: UPDATEFLAG_LIVING *NOT* set! (no MovementInfo)");
// TODO: Find whats this and FIX!
if(flags & UPDATEFLAG_POSITION) if(flags & UPDATEFLAG_POSITION)
{ {
uint64 pguid = recvPacket.GetPackedGuid(); 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 >> x >> y >> z; recvPacket >> sx >> sy >> sz;
recvPacket >> o >> o; recvPacket >> o >> so;
if (obj && obj->IsWorldObject())
((WorldObject*)obj)->SetPosition(x, y, z, o);
} }
else else
{ {
@ -359,10 +344,13 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r
if(flags & UPDATEFLAG_TRANSPORT) if(flags & UPDATEFLAG_TRANSPORT)
{ {
recvPacket >> x >> y >> z >> o; recvPacket >> x >> y >> z >> o;
// only zeroes here
} }
else else
{ {
recvPacket >> x >> y >> z >> o; 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; uint64 rotation;
recvPacket >> rotation; recvPacket >> rotation;
// gameobject rotation
} }
} }
@ -573,17 +562,14 @@ bool IsFloatField(uint8 ty, uint32 f)
(uint32)PLAYER_FROST_SPELL_CRIT_PERCENTAGE, (uint32)PLAYER_FROST_SPELL_CRIT_PERCENTAGE,
(uint32)PLAYER_SHADOW_SPELL_CRIT_PERCENTAGE, (uint32)PLAYER_SHADOW_SPELL_CRIT_PERCENTAGE,
(uint32)PLAYER_ARCANE_SPELL_CRIT_PERCENTAGE, (uint32)PLAYER_ARCANE_SPELL_CRIT_PERCENTAGE,
/*(uint32)PLAYER_FIELD_MOD_MANA_REGEN,
(uint32)PLAYER_FIELD_MOD_MANA_REGEN_INTERRUPT,*/
(uint32)-1 (uint32)-1
}; };
static uint32 floats_gameobject[] = static uint32 floats_gameobject[] =
{ {
/*(uint32)GAMEOBJECT_ROTATION, (uint32)GAMEOBJECT_PARENTROTATION,
(uint32)GAMEOBJECT_POS_X, (uint32)(GAMEOBJECT_PARENTROTATION + 1),
(uint32)GAMEOBJECT_POS_Y, (uint32)(GAMEOBJECT_PARENTROTATION + 2),
(uint32)GAMEOBJECT_POS_Z, (uint32)(GAMEOBJECT_PARENTROTATION + 3),
(uint32)GAMEOBJECT_FACING,*/
(uint32)-1 (uint32)-1
}; };
static uint32 floats_dynobject[] = static uint32 floats_dynobject[] =
@ -592,16 +578,15 @@ bool IsFloatField(uint8 ty, uint32 f)
(uint32)DYNAMICOBJECT_POS_X, (uint32)DYNAMICOBJECT_POS_X,
(uint32)DYNAMICOBJECT_POS_Y, (uint32)DYNAMICOBJECT_POS_Y,
(uint32)DYNAMICOBJECT_POS_Z, (uint32)DYNAMICOBJECT_POS_Z,
(uint32)DYNAMICOBJECT_FACING,
(uint32)-1 (uint32)-1
}; };
/*
static uint32 floats_corpse[] = 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 (uint32)-1
}; };
*/
if(ty & TYPE_OBJECT) if(ty & TYPE_OBJECT)
for(uint32 i = 0; floats_object[i] != (uint32)(-1); i++) 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++) for(uint32 i = 0; floats_dynobject[i] != (uint32)(-1); i++)
if(floats_dynobject[i] == f) if(floats_dynobject[i] == f)
return true; return true;
/*
if(ty & TYPE_CORPSE) if(ty & TYPE_CORPSE)
for(uint32 i = 0; floats_corpse[i] != (uint32)(-1); i++) for(uint32 i = 0; floats_corpse[i] != (uint32)(-1); i++)
if(floats_corpse[i] == f) if(floats_corpse[i] == f)
return true; return true;
*/
return false; return false;
} }

View File

@ -348,6 +348,7 @@ OpcodeHandler *WorldSession::_GetOpcodeHandlerTable() const
{SMSG_CREATURE_QUERY_RESPONSE, &WorldSession::_HandleCreatureQueryResponseOpcode}, {SMSG_CREATURE_QUERY_RESPONSE, &WorldSession::_HandleCreatureQueryResponseOpcode},
{SMSG_GAMEOBJECT_QUERY_RESPONSE, &WorldSession::_HandleGameobjectQueryResponseOpcode}, {SMSG_GAMEOBJECT_QUERY_RESPONSE, &WorldSession::_HandleGameobjectQueryResponseOpcode},
{SMSG_CHAR_CREATE, &WorldSession::_HandleCharCreateOpcode}, {SMSG_CHAR_CREATE, &WorldSession::_HandleCharCreateOpcode},
{SMSG_MONSTER_MOVE, &WorldSession::_HandleMonsterMoveOpcode},
// table termination // table termination
{ 0, NULL } { 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); 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. // 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); 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 response << x << y << z << o << uint32(100); // simulate 100 msec fall time
SendWorldPacket(response); SendWorldPacket(response);
@ -1614,7 +1619,6 @@ void WorldSession::_HandleCreatureQueryResponseOpcode(WorldPacket& recvPacket)
recvPacket >> ct->type; recvPacket >> ct->type;
recvPacket >> ct->family; recvPacket >> ct->family;
recvPacket >> ct->rank; recvPacket >> ct->rank;
//recvPacket >> ct->SpellDataId;
for(uint32 i = 0; i < MAX_KILL_CREDIT; i++) for(uint32 i = 0; i < MAX_KILL_CREDIT; i++)
recvPacket >> ct->killCredit[i]; recvPacket >> ct->killCredit[i];
recvPacket >> ct->displayid_A; recvPacket >> ct->displayid_A;
@ -1710,7 +1714,53 @@ void WorldSession::_HandleCharCreateOpcode(WorldPacket& recvPacket)
gui->SetSceneData(ISCENE_CHARSEL_ERRMSG, response); 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 // TODO: delete world on LogoutComplete once implemented

View File

@ -163,6 +163,7 @@ private:
void _HandleCreatureQueryResponseOpcode(WorldPacket& recvPacket); void _HandleCreatureQueryResponseOpcode(WorldPacket& recvPacket);
void _HandleGameobjectQueryResponseOpcode(WorldPacket& recvPacket); void _HandleGameobjectQueryResponseOpcode(WorldPacket& recvPacket);
void _HandleCharCreateOpcode(WorldPacket& recvPacket); void _HandleCharCreateOpcode(WorldPacket& recvPacket);
void _HandleMonsterMoveOpcode(WorldPacket& recvPacket);
// helper functions to keep SMSG_(COMPRESSED_)UPDATE_OBJECT easy to handle // helper functions to keep SMSG_(COMPRESSED_)UPDATE_OBJECT easy to handle
void _MovementUpdate(uint8 objtypeid, uint64 guid, WorldPacket& recvPacket); // Helper for _HandleUpdateObjectOpcode void _MovementUpdate(uint8 objtypeid, uint64 guid, WorldPacket& recvPacket); // Helper for _HandleUpdateObjectOpcode