* cleanup in UpdateData.cpp
* fixed response at "near" teleport (HandleTelePortAckOpcode) * added skeletal implementation of SMSG_MONSTER_MOVE
This commit is contained in:
parent
35cb61782d
commit
08a1645599
@ -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;
|
||||||
@ -264,24 +263,11 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r
|
|||||||
|
|
||||||
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;
|
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);
|
logdev("FLOATS: x=%f y=%f z=%f o=%f",mi.x, mi.y, mi.z ,mi.o);
|
||||||
if(obj && obj->IsWorldObject())
|
if(obj && obj->IsWorldObject())
|
||||||
((WorldObject*)obj)->SetPosition(mi.x, mi.y, mi.z, mi.o);
|
((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,7 +298,6 @@ 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;
|
||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user