diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Creature/GossipDef.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Handlers/NPCHandler.h | 4 |
3 files changed, 17 insertions, 7 deletions
diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp index 784de37b4cf..88874704a89 100644 --- a/src/server/game/Entities/Creature/GossipDef.cpp +++ b/src/server/game/Entities/Creature/GossipDef.cpp @@ -16,6 +16,7 @@ */ #include "GossipDef.h" +#include "Containers.h" #include "Creature.h" #include "DB2Stores.h" #include "Log.h" @@ -213,7 +214,8 @@ void PlayerMenu::SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID) WorldPackets::NPC::GossipMessage packet; packet.GossipGUID = objectGUID; packet.GossipID = _gossipMenu.GetMenuId(); - packet.TextID = titleTextId; + if (NpcText const* text = sObjectMgr->GetNpcText(titleTextId)) + packet.TextID = Trinity::Containers::SelectRandomWeightedContainerElement(text->Data, [](NpcTextData const& data) { return data.Probability; })->BroadcastTextID; packet.GossipOptions.resize(_gossipMenu.GetMenuItems().size()); uint32 count = 0; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index cd480574a11..0a6050ef26a 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -6401,7 +6401,7 @@ void ObjectMgr::LoadNPCText() continue; } - NpcText& npcText = _npcTextStore[textID]; + NpcText npcText; for (uint8 i = 0; i < MAX_NPC_TEXT_OPTIONS; ++i) { @@ -6409,7 +6409,6 @@ void ObjectMgr::LoadNPCText() npcText.Data[i].BroadcastTextID = fields[9 + i].GetUInt32(); } - std::bitset<MAX_NPC_TEXT_OPTIONS> erasedBroadcastTexts; for (uint8 i = 0; i < MAX_NPC_TEXT_OPTIONS; i++) { if (npcText.Data[i].BroadcastTextID) @@ -6417,20 +6416,29 @@ void ObjectMgr::LoadNPCText() if (!sBroadcastTextStore.LookupEntry(npcText.Data[i].BroadcastTextID)) { TC_LOG_ERROR("sql.sql", "NPCText (ID: %u) has a non-existing BroadcastText (ID: %u, Index: %u)", textID, npcText.Data[i].BroadcastTextID, i); + npcText.Data[i].Probability = 0.0f; npcText.Data[i].BroadcastTextID = 0; - erasedBroadcastTexts[i] = true; } } } for (uint8 i = 0; i < MAX_NPC_TEXT_OPTIONS; i++) { - if (npcText.Data[i].Probability > 0 && npcText.Data[i].BroadcastTextID == 0 && !erasedBroadcastTexts[i]) + if (npcText.Data[i].Probability > 0 && npcText.Data[i].BroadcastTextID == 0) { TC_LOG_ERROR("sql.sql", "NPCText (ID: %u) has a probability (Index: %u) set, but no BroadcastTextID to go with it", textID, i); npcText.Data[i].Probability = 0; } } + + float probabilitySum = std::accumulate(std::begin(npcText.Data), std::end(npcText.Data), 0.0f, [](float sum, NpcTextData const& data) { return sum + data.Probability; }); + if (probabilitySum <= 0.0f) + { + TC_LOG_ERROR("sql.sql", "NPCText (ID: %u) has a probability sum 0, no text can be selected from it, skipped.", textID); + continue; + } + + _npcTextStore[textID] = npcText; } while (result->NextRow()); diff --git a/src/server/game/Handlers/NPCHandler.h b/src/server/game/Handlers/NPCHandler.h index 16839b89b4f..d73c54dd05d 100644 --- a/src/server/game/Handlers/NPCHandler.h +++ b/src/server/game/Handlers/NPCHandler.h @@ -20,8 +20,8 @@ struct NpcTextData { - float Probability; - uint32 BroadcastTextID; + float Probability = 0.0f; + uint32 BroadcastTextID = 0; }; #define MAX_NPC_TEXT_OPTIONS 8 |