* 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
|
||||
uint16 flags;
|
||||
float unkfx,unkfy,unkfz;
|
||||
// uint64 fullguid; // see below
|
||||
float speedWalk, speedRun, speedSwimBack, speedSwim, speedWalkBack, speedTurn, speedFly, speedFlyBack, speedPitchRate;
|
||||
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);
|
||||
|
||||
/*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);
|
||||
//}
|
||||
//}
|
||||
|
||||
//if(flags & UPDATEFLAG_LIVING)
|
||||
//{
|
||||
if(mi.flags & MOVEMENTFLAG_ONTRANSPORT)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user