fix(Core/Gossips): Properly send packet with questgiver query handler. (#12290)
Fixes #12215
This commit is contained in:
@@ -29,6 +29,7 @@ GossipMenu::GossipMenu()
|
|||||||
{
|
{
|
||||||
_menuId = 0;
|
_menuId = 0;
|
||||||
_locale = DEFAULT_LOCALE;
|
_locale = DEFAULT_LOCALE;
|
||||||
|
_senderGUID.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
GossipMenu::~GossipMenu()
|
GossipMenu::~GossipMenu()
|
||||||
@@ -188,8 +189,10 @@ void PlayerMenu::ClearMenus()
|
|||||||
_questMenu.ClearMenu();
|
_questMenu.ClearMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayerMenu::SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID) const
|
void PlayerMenu::SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID)
|
||||||
{
|
{
|
||||||
|
_gossipMenu.SetSenderGUID(objectGUID);
|
||||||
|
|
||||||
WorldPacket data(SMSG_GOSSIP_MESSAGE, 24 + _gossipMenu.GetMenuItemCount() * 100 + _questMenu.GetMenuItemCount() * 75); // guess size
|
WorldPacket data(SMSG_GOSSIP_MESSAGE, 24 + _gossipMenu.GetMenuItemCount() * 100 + _questMenu.GetMenuItemCount() * 75); // guess size
|
||||||
data << objectGUID;
|
data << objectGUID;
|
||||||
data << uint32(_gossipMenu.GetMenuId()); // new 2.4.0
|
data << uint32(_gossipMenu.GetMenuId()); // new 2.4.0
|
||||||
@@ -234,8 +237,10 @@ void PlayerMenu::SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID) const
|
|||||||
_session->SendPacket(&data);
|
_session->SendPacket(&data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayerMenu::SendCloseGossip() const
|
void PlayerMenu::SendCloseGossip()
|
||||||
{
|
{
|
||||||
|
_gossipMenu.SetSenderGUID(ObjectGuid::Empty);
|
||||||
|
|
||||||
WorldPacket data(SMSG_GOSSIP_COMPLETE, 0);
|
WorldPacket data(SMSG_GOSSIP_COMPLETE, 0);
|
||||||
_session->SendPacket(&data);
|
_session->SendPacket(&data);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -213,11 +213,15 @@ public:
|
|||||||
return _menuItems;
|
return _menuItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SetSenderGUID(ObjectGuid guid) { _senderGUID = guid; }
|
||||||
|
[[nodiscard]] ObjectGuid GetSenderGUID() const { return _senderGUID; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GossipMenuItemContainer _menuItems;
|
GossipMenuItemContainer _menuItems;
|
||||||
GossipMenuItemDataContainer _menuItemData;
|
GossipMenuItemDataContainer _menuItemData;
|
||||||
uint32 _menuId;
|
uint32 _menuId;
|
||||||
LocaleConstant _locale;
|
LocaleConstant _locale;
|
||||||
|
ObjectGuid _senderGUID;
|
||||||
};
|
};
|
||||||
|
|
||||||
class QuestMenu
|
class QuestMenu
|
||||||
@@ -266,8 +270,8 @@ public:
|
|||||||
[[nodiscard]] uint32 GetGossipOptionAction(uint32 selection) const { return _gossipMenu.GetMenuItemAction(selection); }
|
[[nodiscard]] uint32 GetGossipOptionAction(uint32 selection) const { return _gossipMenu.GetMenuItemAction(selection); }
|
||||||
[[nodiscard]] bool IsGossipOptionCoded(uint32 selection) const { return _gossipMenu.IsMenuItemCoded(selection); }
|
[[nodiscard]] bool IsGossipOptionCoded(uint32 selection) const { return _gossipMenu.IsMenuItemCoded(selection); }
|
||||||
|
|
||||||
void SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID) const;
|
void SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID);
|
||||||
void SendCloseGossip() const;
|
void SendCloseGossip();
|
||||||
void SendPointOfInterest(uint32 poiId) const;
|
void SendPointOfInterest(uint32 poiId) const;
|
||||||
|
|
||||||
/*********************************************************/
|
/*********************************************************/
|
||||||
|
|||||||
@@ -98,6 +98,12 @@ void WorldSession::HandleGossipSelectOptionOpcode(WorldPacket& recv_data)
|
|||||||
if (_player->PlayerTalkClass->IsGossipOptionCoded(gossipListId))
|
if (_player->PlayerTalkClass->IsGossipOptionCoded(gossipListId))
|
||||||
recv_data >> code;
|
recv_data >> code;
|
||||||
|
|
||||||
|
// Prevent cheating on C++ scripted menus
|
||||||
|
if (_player->PlayerTalkClass->GetGossipMenu().GetSenderGUID() != guid)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Creature* unit = nullptr;
|
Creature* unit = nullptr;
|
||||||
GameObject* go = nullptr;
|
GameObject* go = nullptr;
|
||||||
Item* item = nullptr;
|
Item* item = nullptr;
|
||||||
@@ -528,6 +534,16 @@ void WorldSession::HandleSetSelectionOpcode(WorldPacket& recv_data)
|
|||||||
ObjectGuid guid;
|
ObjectGuid guid;
|
||||||
recv_data >> guid;
|
recv_data >> guid;
|
||||||
|
|
||||||
|
if (!guid)
|
||||||
|
{
|
||||||
|
// Clear any active gossip related to current selection if not present at player's client
|
||||||
|
GossipMenu& gossipMenu = _player->PlayerTalkClass->GetGossipMenu();
|
||||||
|
if (gossipMenu.GetSenderGUID() == _player->GetTarget())
|
||||||
|
{
|
||||||
|
_player->PlayerTalkClass->SendCloseGossip();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_player->SetSelection(guid);
|
_player->SetSelection(guid);
|
||||||
|
|
||||||
// Change target of current autoshoot spell
|
// Change target of current autoshoot spell
|
||||||
|
|||||||
@@ -38,9 +38,11 @@ void WorldSession::HandleQuestgiverStatusQueryOpcode(WorldPacket& recvData)
|
|||||||
uint32 questStatus = DIALOG_STATUS_NONE;
|
uint32 questStatus = DIALOG_STATUS_NONE;
|
||||||
|
|
||||||
GossipMenu& gossipMenu = _player->PlayerTalkClass->GetGossipMenu();
|
GossipMenu& gossipMenu = _player->PlayerTalkClass->GetGossipMenu();
|
||||||
// Did we already get get a gossip menu? if so no need to status query
|
// Did we already get a gossip menu with that NPC? if so no need to status query
|
||||||
if (!gossipMenu.Empty())
|
if (gossipMenu.GetSenderGUID() == guid)
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Object* questGiver = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT);
|
Object* questGiver = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT);
|
||||||
if (!questGiver)
|
if (!questGiver)
|
||||||
|
|||||||
Reference in New Issue
Block a user