aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Creature/GossipDef.cpp4
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp16
-rw-r--r--src/server/game/Handlers/NPCHandler.h4
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