* 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
This commit is contained in:
@@ -388,7 +388,6 @@ Map::EnsureGridLoadedAtEnter(const Cell &cell, Player *player)
|
|||||||
|
|
||||||
if (player)
|
if (player)
|
||||||
{
|
{
|
||||||
player->SendDelayResponse(MAX_GRID_LOAD_TIME);
|
|
||||||
DEBUG_LOG("Player %s enter cell[%u,%u] triggers of loading grid[%u,%u] on map %u", player->GetName(), cell.CellX(), cell.CellY(), cell.GridX(), cell.GridY(), GetId());
|
DEBUG_LOG("Player %s enter cell[%u,%u] triggers of loading grid[%u,%u] on map %u", player->GetName(), cell.CellX(), cell.CellY(), cell.GridX(), cell.GridY(), GetId());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -4391,15 +4391,6 @@ void Player::BuildPlayerRepop()
|
|||||||
SetByteValue(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND);
|
SetByteValue(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::SendDelayResponse(const uint32 ml_seconds)
|
|
||||||
{
|
|
||||||
//FIXME: is this delay time arg really need? 50msec by default in code
|
|
||||||
WorldPacket data( SMSG_QUERY_TIME_RESPONSE, 4+4 );
|
|
||||||
data << (uint32)time(NULL);
|
|
||||||
data << (uint32)0;
|
|
||||||
GetSession()->SendPacket( &data );
|
|
||||||
}
|
|
||||||
|
|
||||||
void Player::ResurrectPlayer(float restore_percent, bool applySickness)
|
void Player::ResurrectPlayer(float restore_percent, bool applySickness)
|
||||||
{
|
{
|
||||||
WorldPacket data(SMSG_DEATH_RELEASE_LOC, 4*4); // remove spirit healer position
|
WorldPacket data(SMSG_DEATH_RELEASE_LOC, 4*4); // remove spirit healer position
|
||||||
|
|||||||
@@ -1771,7 +1771,6 @@ class TRINITY_DLL_SPEC Player : public Unit, public GridObject<Player>
|
|||||||
|
|
||||||
void BuildCreateUpdateBlockForPlayer( UpdateData *data, Player *target ) const;
|
void BuildCreateUpdateBlockForPlayer( UpdateData *data, Player *target ) const;
|
||||||
void DestroyForPlayer( Player *target, bool anim = false ) const;
|
void DestroyForPlayer( Player *target, bool anim = false ) const;
|
||||||
void SendDelayResponse(const uint32);
|
|
||||||
void SendLogXPGain(uint32 GivenXP,Unit* victim,uint32 RestXP);
|
void SendLogXPGain(uint32 GivenXP,Unit* victim,uint32 RestXP);
|
||||||
|
|
||||||
// notifiers
|
// notifiers
|
||||||
|
|||||||
+76
-11
@@ -137,10 +137,15 @@ void WorldSession::HandleNameQueryOpcode( WorldPacket & recv_data )
|
|||||||
|
|
||||||
void WorldSession::HandleQueryTimeOpcode( WorldPacket & /*recv_data*/ )
|
void WorldSession::HandleQueryTimeOpcode( WorldPacket & /*recv_data*/ )
|
||||||
{
|
{
|
||||||
WorldPacket data( SMSG_QUERY_TIME_RESPONSE, 4+4 );
|
SendQueryTimeResponse();
|
||||||
data << (uint32)time(NULL);
|
}
|
||||||
data << (uint32)0;
|
|
||||||
SendPacket( &data );
|
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 !!!
|
/// Only _static_ data send in this packet !!!
|
||||||
@@ -315,7 +320,7 @@ void WorldSession::HandleCorpseQueryOpcode(WorldPacket & /*recv_data*/)
|
|||||||
data << float(y);
|
data << float(y);
|
||||||
data << float(z);
|
data << float(z);
|
||||||
data << int32(corpsemapid);
|
data << int32(corpsemapid);
|
||||||
data << uint32(0);
|
data << uint32(corpse->GetGUIDLow());
|
||||||
SendPacket(&data);
|
SendPacket(&data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -456,13 +461,73 @@ void WorldSession::HandleCorpseMapPositionQuery( WorldPacket & recv_data )
|
|||||||
{
|
{
|
||||||
sLog.outDebug( "WORLD: Recv CMSG_CORPSE_MAP_POSITION_QUERY" );
|
sLog.outDebug( "WORLD: Recv CMSG_CORPSE_MAP_POSITION_QUERY" );
|
||||||
|
|
||||||
uint32 unk;
|
uint32 lowGuid;
|
||||||
recv_data >> unk;
|
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);
|
WorldPacket data(CMSG_CORPSE_MAP_POSITION_QUERY_RESPONSE, 4+4+4+4);
|
||||||
data << float(0);
|
|
||||||
data << float(0);
|
Map* map = corpse->GetMap();
|
||||||
data << float(0);
|
|
||||||
data << float(0);
|
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);
|
SendPacket(&data);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,6 +39,8 @@ void WorldSession::HandleGMTicketCreateOpcode( WorldPacket & recv_data )
|
|||||||
float x, y, z;
|
float x, y, z;
|
||||||
std::string ticketText, ticketText2;
|
std::string ticketText, ticketText2;
|
||||||
|
|
||||||
|
SendQueryTimeResponse();
|
||||||
|
|
||||||
WorldPacket data(SMSG_GMTICKET_CREATE, 4);
|
WorldPacket data(SMSG_GMTICKET_CREATE, 4);
|
||||||
recv_data >> map;
|
recv_data >> map;
|
||||||
recv_data >> x;
|
recv_data >> x;
|
||||||
@@ -116,10 +118,7 @@ void WorldSession::HandleGMTicketDeleteOpcode( WorldPacket & /*recv_data*/)
|
|||||||
|
|
||||||
void WorldSession::HandleGMTicketGetTicketOpcode( WorldPacket & /*recv_data*/)
|
void WorldSession::HandleGMTicketGetTicketOpcode( WorldPacket & /*recv_data*/)
|
||||||
{
|
{
|
||||||
WorldPacket data( SMSG_QUERY_TIME_RESPONSE, 4+4 );
|
SendQueryTimeResponse();
|
||||||
data << (uint32)time(NULL);
|
|
||||||
data << (uint32)0;
|
|
||||||
SendPacket( &data );
|
|
||||||
|
|
||||||
GM_Ticket *ticket = objmgr.GetGMTicketByPlayer(GetPlayer()->GetGUID());
|
GM_Ticket *ticket = objmgr.GetGMTicketByPlayer(GetPlayer()->GetGUID());
|
||||||
if(ticket)
|
if(ticket)
|
||||||
|
|||||||
@@ -516,6 +516,8 @@ class World
|
|||||||
/// Update time
|
/// Update time
|
||||||
uint32 GetUpdateTime() const { return m_updateTime; }
|
uint32 GetUpdateTime() const { return m_updateTime; }
|
||||||
void SetRecordDiffInterval(int32 t) { if(t >= 0) m_configs[CONFIG_INTERVAL_LOG_UPDATE] = (uint32)t; }
|
void SetRecordDiffInterval(int32 t) { if(t >= 0) m_configs[CONFIG_INTERVAL_LOG_UPDATE] = (uint32)t; }
|
||||||
|
/// Next daily quests reset time
|
||||||
|
time_t GetNextDailyQuestsResetTime() const { return m_NextDailyQuestReset; }
|
||||||
|
|
||||||
/// Get the maximum skill level a player can reach
|
/// Get the maximum skill level a player can reach
|
||||||
uint16 GetConfigMaxSkillValue() const
|
uint16 GetConfigMaxSkillValue() const
|
||||||
|
|||||||
@@ -123,6 +123,7 @@ class TRINITY_DLL_SPEC WorldSession
|
|||||||
void SendPartyResult(PartyOperation operation, const std::string& member, PartyResult res);
|
void SendPartyResult(PartyOperation operation, const std::string& member, PartyResult res);
|
||||||
void SendAreaTriggerMessage(const char* Text, ...) ATTR_PRINTF(2,3);
|
void SendAreaTriggerMessage(const char* Text, ...) ATTR_PRINTF(2,3);
|
||||||
void SendSetPhaseShift(uint32 phaseShift);
|
void SendSetPhaseShift(uint32 phaseShift);
|
||||||
|
void SendQueryTimeResponse();
|
||||||
|
|
||||||
AccountTypes GetSecurity() const { return _security; }
|
AccountTypes GetSecurity() const { return _security; }
|
||||||
uint32 GetAccountId() const { return _accountId; }
|
uint32 GetAccountId() const { return _accountId; }
|
||||||
|
|||||||
Reference in New Issue
Block a user