diff options
author | XTZGZoReX <none@none> | 2010-01-29 22:24:18 +0100 |
---|---|---|
committer | XTZGZoReX <none@none> | 2010-01-29 22:24:18 +0100 |
commit | c3ae3b88aa4baa5348d800237e5894d67b583b16 (patch) | |
tree | 391c7e31dbbc8957854e2905d90ec66dcb1393d6 /src/game/QueryHandler.cpp | |
parent | a385ea64b03cc7afbdeb8df3ea8a6d5025d6f96a (diff) |
* Implement CMSG_CORPSE_MAP_POSITION_QUERY/CMSG_CORPSE_MAP_POSITION_QUERY_RESPONSE opcodes. Thanks to: Ceris, Lightguard, raczman for helping with research/code.
* Fix SMSG_QUERY_TIME_RESPONSE use/structure. Patch/research by TOM_RUS.
--HG--
branch : trunk
Diffstat (limited to 'src/game/QueryHandler.cpp')
-rw-r--r-- | src/game/QueryHandler.cpp | 87 |
1 files changed, 76 insertions, 11 deletions
diff --git a/src/game/QueryHandler.cpp b/src/game/QueryHandler.cpp index af2ffbb7272..5375e938f56 100644 --- a/src/game/QueryHandler.cpp +++ b/src/game/QueryHandler.cpp @@ -137,10 +137,15 @@ void WorldSession::HandleNameQueryOpcode( WorldPacket & recv_data ) void WorldSession::HandleQueryTimeOpcode( WorldPacket & /*recv_data*/ ) { - WorldPacket data( SMSG_QUERY_TIME_RESPONSE, 4+4 ); - data << (uint32)time(NULL); - data << (uint32)0; - SendPacket( &data ); + SendQueryTimeResponse(); +} + +void WorldSession::SendQueryTimeResponse() +{ + WorldPacket data(SMSG_QUERY_TIME_RESPONSE, 4+4); + data << uint32(time(NULL)); + data << uint32(sWorld.GetNextDailyQuestsResetTime() - time(NULL)); + SendPacket(&data); } /// Only _static_ data send in this packet !!! @@ -315,7 +320,7 @@ void WorldSession::HandleCorpseQueryOpcode(WorldPacket & /*recv_data*/) data << float(y); data << float(z); data << int32(corpsemapid); - data << uint32(0); + data << uint32(corpse->GetGUIDLow()); SendPacket(&data); } @@ -456,13 +461,73 @@ void WorldSession::HandleCorpseMapPositionQuery( WorldPacket & recv_data ) { sLog.outDebug( "WORLD: Recv CMSG_CORPSE_MAP_POSITION_QUERY" ); - uint32 unk; - recv_data >> unk; + uint32 lowGuid; + recv_data >> lowGuid; // not needed + + Player* player = _player; + Corpse* corpse = player->GetCorpse(); + if (!corpse) + return; WorldPacket data(CMSG_CORPSE_MAP_POSITION_QUERY_RESPONSE, 4+4+4+4); - data << float(0); - data << float(0); - data << float(0); - data << float(0); + + Map* map = corpse->GetMap(); + + float cx, cy, cz; + + if (map->IsDungeon()) + { + int32 mapId; + float mx, my; + map->GetEntrancePos(mapId, mx, my); + + const Map* newMap = MapManager::Instance().CreateBaseMap(mapId); + uint32 zoneId = newMap->GetZoneId(mx, my, 0); + + float _mx = mx; + float _my = my; + Map2ZoneCoordinates(mx, my, zoneId); + + float x = corpse->GetPositionX(); + float y = corpse->GetPositionY(); + Map2ZoneCoordinates(x, y, zoneId); + + cx = x - mx; + cy = y - my; + cz = corpse->GetPositionZ() - map->GetHeight(_mx, _my, MAX_HEIGHT); + } + else + { + WorldSafeLocsEntry const *ClosestGrave = NULL; + + // Special handle for battleground maps + if (BattleGround *bg = player->GetBattleGround()) + ClosestGrave = bg->GetClosestGraveYard(player); + else + ClosestGrave = objmgr.GetClosestGraveYard(player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), player->GetTeam()); + + if (!ClosestGrave) + return; + + uint32 zoneId = corpse->GetZoneId(); + + float gx = ClosestGrave->x; + float gy = ClosestGrave->y; + Map2ZoneCoordinates(gx, gy, zoneId); + + float x = corpse->GetPositionX(); + float y = corpse->GetPositionY(); + Map2ZoneCoordinates(x, y, zoneId); + + cx = x - gx; + cy = y - gy; + cz = corpse->GetPositionZ() - ClosestGrave->z; + } + + data << float(cx); + data << float(cy); + data << float(cz); + data << float(0); // unknown + SendPacket(&data); } |