From ab62fe30bc399fcc717d0c37df220d7b57a7c043 Mon Sep 17 00:00:00 2001 From: Ankso Date: Fri, 30 May 2014 01:59:38 +0200 Subject: Core/Players: Update the player's zone and area after update the player's position server side. --- src/server/game/Entities/Player/Player.cpp | 11 +++++++++++ src/server/game/Entities/Player/Player.h | 5 ++++- src/server/game/Handlers/MiscHandler.cpp | 7 +++---- 3 files changed, 18 insertions(+), 5 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index f30c98957a7..77921924220 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -689,6 +689,8 @@ Player::Player(WorldSession* session): Unit(true) m_areaUpdateId = 0; m_team = 0; + + m_needsZoneUpdate = false; m_nextSave = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE); @@ -6757,6 +6759,15 @@ bool Player::UpdatePosition(float x, float y, float z, float orientation, bool t // mover->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TURNING); //AURA_INTERRUPT_FLAG_JUMP not sure + // Update player zone if needed + if (m_needsZoneUpdate) + { + uint32 newZone, newArea; + GetZoneAndAreaId(newZone, newArea); + UpdateZone(newZone, newArea); + m_needsZoneUpdate = false; + } + // group update if (GetGroup()) SetGroupUpdateFlag(GROUP_UPDATE_FLAG_POSITION); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 48a2209cc14..52674032c0a 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1675,7 +1675,8 @@ class Player : public Unit, public GridObject void UpdatePvP(bool state, bool override=false); void UpdateZone(uint32 newZone, uint32 newArea); void UpdateArea(uint32 newArea); - + void SetNeedsZoneUpdate(bool needsUpdate) { m_needsZoneUpdate = needsUpdate; } + void UpdateZoneDependentAuras(uint32 zone_id); // zones void UpdateAreaDependentAuras(uint32 area_id); // subzones @@ -2561,6 +2562,8 @@ class Player : public Unit, public GridObject bool IsAlwaysDetectableFor(WorldObject const* seer) const; uint8 m_grantableLevels; + + bool m_needsZoneUpdate; private: // internal common parts for CanStore/StoreItem functions diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 2748c0317cc..11fa89d9d6b 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -500,10 +500,9 @@ void WorldSession::HandleZoneUpdateOpcode(WorldPacket& recvData) TC_LOG_DEBUG("network", "WORLD: Recvd ZONE_UPDATE: %u", newZone); - // use server size data - uint32 newzone, newarea; - GetPlayer()->GetZoneAndAreaId(newzone, newarea); - GetPlayer()->UpdateZone(newzone, newarea); + // use server side data, but only after update the player position. See Player::UpdatePosition(). + GetPlayer()->SetNeedsZoneUpdate(true); + //GetPlayer()->SendInitWorldStates(true, newZone); } -- cgit v1.2.3 From 70bd70080d5a8d0fd9fcf0ee676024bd1a8296cf Mon Sep 17 00:00:00 2001 From: jackpoz Date: Sun, 1 Jun 2014 13:33:46 +0200 Subject: Core/QuestPOI: Mitigate possible DoS with CMSG_QUEST_POI_QUERY Avoid sending POIs for same quest if the client somehow sent duplicates quest id in same CMSG_QUEST_POI_QUERY packet. This also reduce the effects of possible DoS and increases the difficulty to cause it. Fix a typo which caused no quest POIs to be sent at all if the client queried data for 25 quests. --- src/server/game/Handlers/QueryHandler.cpp | 16 ++++++++++------ src/server/game/Server/WorldSession.h | 1 + 2 files changed, 11 insertions(+), 6 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index de08392b86a..dbcfb1c4970 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -405,19 +405,23 @@ void WorldSession::HandleQuestPOIQuery(WorldPacket& recvData) uint32 count; recvData >> count; // quest count, max=25 - if (count >= MAX_QUEST_LOG_SIZE) + if (count > MAX_QUEST_LOG_SIZE) { recvData.rfinish(); return; } - WorldPacket data(SMSG_QUEST_POI_QUERY_RESPONSE, 4+(4+4)*count); - data << uint32(count); // count - + // Read quest ids and add the in a unordered_set so we don't send POIs for the same quest multiple times + std::unordered_set questIds; for (uint32 i = 0; i < count; ++i) + questIds.insert(recvData.read()); // quest id + + WorldPacket data(SMSG_QUEST_POI_QUERY_RESPONSE, 4 + (4 + 4)*questIds.size()); + data << uint32(questIds.size()); // count + + for (auto itr = questIds.begin(); itr != questIds.end(); ++itr) { - uint32 questId; - recvData >> questId; // quest id + uint32 questId = *itr; bool questOk = false; diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 1b16ce88052..74d9584e711 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -32,6 +32,7 @@ #include "WorldPacket.h" #include "Cryptography/BigNumber.h" #include "AccountMgr.h" +#include class Creature; class GameObject; -- cgit v1.2.3 From 282a7cad7df912db8fcab57f18840e8245b5c2af Mon Sep 17 00:00:00 2001 From: jackpoz Date: Sun, 1 Jun 2014 16:15:27 +0200 Subject: Core/Misc: Code cleanup Remove old unused opcode handler WorldSession::HandlePageQuerySkippedOpcode() for CMSG_PAGE_TEXT_QUERY since it's already handled by WorldSession::HandlePageTextQueryOpcode() --- src/server/game/Handlers/ItemHandler.cpp | 13 ------------- src/server/game/Server/WorldSession.h | 1 - 2 files changed, 14 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index c4b4b35bf37..0ca7885b82b 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -470,19 +470,6 @@ void WorldSession::HandleReadItem(WorldPacket& recvData) _player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL); } -void WorldSession::HandlePageQuerySkippedOpcode(WorldPacket& recvData) -{ - TC_LOG_DEBUG("network", "WORLD: Received CMSG_PAGE_TEXT_QUERY"); - - uint32 itemid; - uint64 guid; - - recvData >> itemid >> guid; - - TC_LOG_INFO("network", "Packet Info: itemid: %u guidlow: %u guidentry: %u guidhigh: %u", - itemid, GUID_LOPART(guid), GUID_ENPART(guid), GUID_HIPART(guid)); -} - void WorldSession::HandleSellItemOpcode(WorldPacket& recvData) { TC_LOG_DEBUG("network", "WORLD: Received CMSG_SELL_ITEM"); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 74d9584e711..968f5a229ba 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -729,7 +729,6 @@ class WorldSession void HandleCompleteCinematic(WorldPacket& recvPacket); void HandleNextCinematicCamera(WorldPacket& recvPacket); - void HandlePageQuerySkippedOpcode(WorldPacket& recvPacket); void HandlePageTextQueryOpcode(WorldPacket& recvPacket); void HandleTutorialFlag (WorldPacket& recvData); -- cgit v1.2.3