aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp18
-rw-r--r--src/server/game/DataStores/DB2Stores.h2
-rw-r--r--src/server/game/DataStores/DB2Structure.h14
-rw-r--r--src/server/game/DataStores/DB2fmt.h1
-rw-r--r--src/server/game/Entities/Creature/GossipDef.cpp8
-rw-r--r--src/server/game/Entities/Player/Player.cpp8
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp6
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp143
-rw-r--r--src/server/game/Globals/ObjectMgr.h54
-rw-r--r--src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp4
-rw-r--r--src/server/game/Texts/ChatTextBuilder.h4
-rw-r--r--src/server/game/Texts/CreatureTextMgr.cpp6
-rw-r--r--src/server/game/World/World.cpp4
-rw-r--r--src/server/scripts/Commands/cs_reload.cpp10
-rw-r--r--src/server/shared/DataStores/DB2StorageLoader.cpp28
-rw-r--r--src/server/shared/Database/Implementation/HotfixDatabase.cpp1
-rw-r--r--src/server/shared/Database/Implementation/HotfixDatabase.h1
17 files changed, 77 insertions, 235 deletions
diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp
index 42902e08466..f2148b6a24e 100644
--- a/src/server/game/DataStores/DB2Stores.cpp
+++ b/src/server/game/DataStores/DB2Stores.cpp
@@ -23,6 +23,7 @@
#include "World.h"
#include <functional>
+DB2Storage<BroadcastTextEntry> sBroadcastTextStore(BroadcastTextEntryfmt, HOTFIX_SEL_BROADCAST_TEXT);
std::map<uint32 /*curveID*/, std::map<uint32/*index*/, CurvePointEntry const*, std::greater<uint32>>> HeirloomCurvePoints;
DB2Storage<CurvePointEntry> sCurvePointStore(CurvePointEntryfmt);
DB2Storage<HolidaysEntry> sHolidaysStore(HolidaysEntryfmt);
@@ -130,6 +131,7 @@ void LoadDB2Stores(std::string const& dataPath)
DB2StoreProblemList bad_db2_files;
uint32 availableDb2Locales = 0xFF;
+ LoadDB2(availableDb2Locales, bad_db2_files, sBroadcastTextStore, db2Path, "BroadcastText.db2");
LoadDB2(availableDb2Locales, bad_db2_files, sCurvePointStore, db2Path, "CurvePoint.db2");
LoadDB2(availableDb2Locales, bad_db2_files, sHolidaysStore, db2Path, "Holidays.db2");
LoadDB2(availableDb2Locales, bad_db2_files, sItemStore, db2Path, "Item.db2");
@@ -308,6 +310,22 @@ DB2StorageBase const* GetDB2Storage(uint32 type)
return NULL;
}
+char const* GetBroadcastTextValue(BroadcastTextEntry const* broadcastText, LocaleConstant locale /*= DEFAULT_LOCALE*/, uint8 gender /*= GENDER_MALE*/, bool forceGender /*= false*/)
+{
+ if (gender == GENDER_FEMALE && (forceGender || broadcastText->FemaleText->Str[DEFAULT_LOCALE][0] != '\0'))
+ {
+ if (broadcastText->FemaleText->Str[locale][0] != '\0')
+ return broadcastText->FemaleText->Str[locale];
+
+ return broadcastText->FemaleText->Str[DEFAULT_LOCALE];
+ }
+
+ if (broadcastText->MaleText->Str[locale][0] != '\0')
+ return broadcastText->MaleText->Str[locale];
+
+ return broadcastText->MaleText->Str[DEFAULT_LOCALE];
+}
+
uint32 GetHeirloomItemLevel(uint32 curveId, uint32 level)
{
// Assuming linear item level scaling for heirlooms
diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h
index 20ff43a9bd4..d68c27987e1 100644
--- a/src/server/game/DataStores/DB2Stores.h
+++ b/src/server/game/DataStores/DB2Stores.h
@@ -23,6 +23,7 @@
#include <string>
#include <map>
+extern DB2Storage<BroadcastTextEntry> sBroadcastTextStore;
extern DB2Storage<HolidaysEntry> sHolidaysStore;
extern DB2Storage<ItemEntry> sItemStore;
extern DB2Storage<ItemCurrencyCostEntry> sItemCurrencyCostStore;
@@ -56,6 +57,7 @@ void LoadDB2Stores(std::string const& dataPath);
DB2StorageBase const* GetDB2Storage(uint32 type);
+char const* GetBroadcastTextValue(BroadcastTextEntry const* broadcastText, LocaleConstant locale = DEFAULT_LOCALE, uint8 gender = GENDER_MALE, bool forceGender = false);
uint32 GetHeirloomItemLevel(uint32 curveId, uint32 level);
uint32 GetItemDisplayId(uint32 itemId, uint32 appearanceModId);
std::vector<ItemBonusEntry const*> GetItemBonuses(uint32 bonusListId);
diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h
index 5942f8a425a..3416e562ad3 100644
--- a/src/server/game/DataStores/DB2Structure.h
+++ b/src/server/game/DataStores/DB2Structure.h
@@ -24,6 +24,7 @@
#pragma pack(push, 1)
+#define MAX_BROADCAST_TEXT_EMOTES 3
#define MAX_HOLIDAY_DURATIONS 10
#define MAX_HOLIDAY_DATES 16
#define MAX_HOLIDAY_FLAGS 10
@@ -31,6 +32,19 @@
#define MAX_ITEM_PROTO_SOCKETS 3
#define MAX_ITEM_PROTO_STATS 10
+struct BroadcastTextEntry
+{
+ uint32 ID;
+ int32 Language;
+ LocalizedString* MaleText;
+ LocalizedString* FemaleText;
+ uint32 EmoteID[MAX_BROADCAST_TEXT_EMOTES];
+ uint32 EmoteDelay[MAX_BROADCAST_TEXT_EMOTES];
+ uint32 SoundID;
+ uint32 UnkEmoteID;
+ uint32 Type;
+};
+
struct CurvePointEntry
{
uint32 ID; // 0
diff --git a/src/server/game/DataStores/DB2fmt.h b/src/server/game/DataStores/DB2fmt.h
index 087c1dfd588..d789f4a6622 100644
--- a/src/server/game/DataStores/DB2fmt.h
+++ b/src/server/game/DataStores/DB2fmt.h
@@ -18,6 +18,7 @@
#ifndef TRINITY_DB2SFRM_H
#define TRINITY_DB2SFRM_H
+char const BroadcastTextEntryfmt[] = "nissiiiiiiiii";
char const CurvePointEntryfmt[] = "niiff";
char const HolidaysEntryfmt[] = "niiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiixxsiix";
char const Itemfmt[] = "niiiiiiii";
diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp
index 68e1ebb3ab5..9a6dc5879fd 100644
--- a/src/server/game/Entities/Creature/GossipDef.cpp
+++ b/src/server/game/Entities/Creature/GossipDef.cpp
@@ -94,18 +94,18 @@ void GossipMenu::AddMenuItem(uint32 menuId, uint32 menuItemId, uint32 sender, ui
/// Store texts for localization.
std::string strOptionText, strBoxText;
- BroadcastText const* optionBroadcastText = sObjectMgr->GetBroadcastText(itr->second.OptionBroadcastTextId);
- BroadcastText const* boxBroadcastText = sObjectMgr->GetBroadcastText(itr->second.BoxBroadcastTextId);
+ BroadcastTextEntry const* optionBroadcastText = sBroadcastTextStore.LookupEntry(itr->second.OptionBroadcastTextId);
+ BroadcastTextEntry const* boxBroadcastText = sBroadcastTextStore.LookupEntry(itr->second.BoxBroadcastTextId);
/// OptionText
if (optionBroadcastText)
- strOptionText = optionBroadcastText->GetText(GetLocale());
+ strOptionText = GetBroadcastTextValue(optionBroadcastText, GetLocale());
else
strOptionText = itr->second.OptionText;
/// BoxText
if (boxBroadcastText)
- strBoxText = boxBroadcastText->GetText(GetLocale());
+ strBoxText = GetBroadcastTextValue(boxBroadcastText, GetLocale());
else
strBoxText = itr->second.BoxText;
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 1487e934f24..ad95e908840 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -13852,17 +13852,17 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool
if (canTalk)
{
std::string strOptionText, strBoxText;
- BroadcastText const* optionBroadcastText = sObjectMgr->GetBroadcastText(itr->second.OptionBroadcastTextId);
- BroadcastText const* boxBroadcastText = sObjectMgr->GetBroadcastText(itr->second.BoxBroadcastTextId);
+ BroadcastTextEntry const* optionBroadcastText = sBroadcastTextStore.LookupEntry(itr->second.OptionBroadcastTextId);
+ BroadcastTextEntry const* boxBroadcastText = sBroadcastTextStore.LookupEntry(itr->second.BoxBroadcastTextId);
LocaleConstant locale = GetSession()->GetSessionDbLocaleIndex();
if (optionBroadcastText)
- strOptionText = optionBroadcastText->GetText(locale, getGender());
+ strOptionText = GetBroadcastTextValue(optionBroadcastText, locale, getGender());
else
strOptionText = itr->second.OptionText;
if (boxBroadcastText)
- strBoxText = boxBroadcastText->GetText(locale, getGender());
+ strBoxText = GetBroadcastTextValue(boxBroadcastText, locale, getGender());
else
strBoxText = itr->second.BoxText;
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index ede8c959594..ed696517be9 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -16462,7 +16462,7 @@ void Unit::Whisper(std::string const& text, Language language, Player* target, b
void Unit::Talk(uint32 textId, ChatMsg msgType, float textRange, WorldObject const* target)
{
- if (!sObjectMgr->GetBroadcastText(textId))
+ if (!sBroadcastTextStore.LookupEntry(textId))
{
TC_LOG_ERROR("entities.unit", "WorldObject::MonsterText: `broadcast_text` was not %u found", textId);
return;
@@ -16494,7 +16494,7 @@ void Unit::Whisper(uint32 textId, Player* target, bool isBossWhisper /*= false*/
if (!target)
return;
- BroadcastText const* bct = sObjectMgr->GetBroadcastText(textId);
+ BroadcastTextEntry const* bct = sBroadcastTextStore.LookupEntry(textId);
if (!bct)
{
TC_LOG_ERROR("entities.unit", "WorldObject::MonsterWhisper: `broadcast_text` was not %u found", textId);
@@ -16503,6 +16503,6 @@ void Unit::Whisper(uint32 textId, Player* target, bool isBossWhisper /*= false*/
LocaleConstant locale = target->GetSession()->GetSessionDbLocaleIndex();
WorldPackets::Chat::Chat packet;
- packet.Initalize(isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
+ packet.Initalize(isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, LANG_UNIVERSAL, this, target, GetBroadcastTextValue(bct, locale, getGender()), 0, "", locale);
target->SendDirectMessage(packet.Write());
}
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index dc326555c36..16958a2dde8 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -4323,7 +4323,7 @@ void ObjectMgr::LoadScripts(ScriptsType type)
tableName.c_str(), tmp.Talk.ChatType, tmp.id);
continue;
}
- if (!sObjectMgr->GetBroadcastText(uint32(tmp.Talk.TextID)))
+ if (!sBroadcastTextStore.LookupEntry(uint32(tmp.Talk.TextID)))
{
TC_LOG_ERROR("sql.sql", "Table `%s` has invalid talk text id (dataint = %i) in SCRIPT_COMMAND_TALK for script id %u",
tableName.c_str(), tmp.Talk.TextID, tmp.id);
@@ -5087,7 +5087,7 @@ void ObjectMgr::LoadGossipText()
{
if (gText.Options[i].BroadcastTextID)
{
- if (!sObjectMgr->GetBroadcastText(gText.Options[i].BroadcastTextID))
+ if (!sBroadcastTextStore.LookupEntry(gText.Options[i].BroadcastTextID))
{
TC_LOG_ERROR("sql.sql", "GossipText (Id: %u) in table `npc_text` has non-existing or incompatible BroadcastTextID%u %u.", id, i, gText.Options[i].BroadcastTextID);
gText.Options[i].BroadcastTextID = 0;
@@ -8042,7 +8042,7 @@ void ObjectMgr::LoadGossipMenuItems()
if (gMenuItem.OptionBroadcastTextId)
{
- if (!GetBroadcastText(gMenuItem.OptionBroadcastTextId))
+ if (!sBroadcastTextStore.LookupEntry(gMenuItem.OptionBroadcastTextId))
{
TC_LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu %u, id %u has non-existing or incompatible OptionBroadcastTextId %u, ignoring.", gMenuItem.MenuId, gMenuItem.OptionIndex, gMenuItem.OptionBroadcastTextId);
gMenuItem.OptionBroadcastTextId = 0;
@@ -8060,7 +8060,7 @@ void ObjectMgr::LoadGossipMenuItems()
if (gMenuItem.BoxBroadcastTextId)
{
- if (!GetBroadcastText(gMenuItem.BoxBroadcastTextId))
+ if (!sBroadcastTextStore.LookupEntry(gMenuItem.BoxBroadcastTextId))
{
TC_LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu %u, id %u has non-existing or incompatible BoxBroadcastTextId %u, ignoring.", gMenuItem.MenuId, gMenuItem.OptionIndex, gMenuItem.BoxBroadcastTextId);
gMenuItem.BoxBroadcastTextId = 0;
@@ -8273,141 +8273,6 @@ uint32 ObjectMgr::GetScriptId(char const* name)
return uint32(itr - _scriptNamesStore.begin());
}
-void ObjectMgr::LoadBroadcastTexts()
-{
- uint32 oldMSTime = getMSTime();
-
- _broadcastTextStore.clear(); // for reload case
-
- // 0 1 2 3 4 5 6 7 8 9 10 11 12
- QueryResult result = WorldDatabase.Query("SELECT ID, Language, MaleText, FemaleText, EmoteID0, EmoteID1, EmoteID2, EmoteDelay0, EmoteDelay1, EmoteDelay2, SoundId, Unk1, Unk2 FROM broadcast_text");
- if (!result)
- {
- TC_LOG_INFO("server.loading", ">> Loaded 0 broadcast texts. DB table `broadcast_text` is empty.");
- return;
- }
-
- _broadcastTextStore.rehash(result->GetRowCount());
- uint32 count = 0;
-
- do
- {
- Field* fields = result->Fetch();
-
- BroadcastText bct;
-
- bct.Id = fields[0].GetUInt32();
- bct.Language = fields[1].GetUInt32();
- bct.MaleText[DEFAULT_LOCALE] = fields[2].GetString();
- bct.FemaleText[DEFAULT_LOCALE] = fields[3].GetString();
- bct.EmoteId0 = fields[4].GetUInt32();
- bct.EmoteId1 = fields[5].GetUInt32();
- bct.EmoteId2 = fields[6].GetUInt32();
- bct.EmoteDelay0 = fields[7].GetUInt32();
- bct.EmoteDelay1 = fields[8].GetUInt32();
- bct.EmoteDelay2 = fields[9].GetUInt32();
- bct.SoundId = fields[10].GetUInt32();
- bct.Unk1 = fields[11].GetUInt32();
- bct.Unk2 = fields[12].GetUInt32();
-
- if (bct.SoundId)
- {
- if (!sSoundEntriesStore.LookupEntry(bct.SoundId))
- {
- TC_LOG_INFO("sql.sql", "BroadcastText (Id: %u) in table `broadcast_text` has SoundId %u but sound does not exist. Skipped.", bct.Id, bct.SoundId);
- // don't load bct of higher expansions
- continue;
- }
- }
-
- if (!GetLanguageDescByID(bct.Language))
- {
- TC_LOG_INFO("sql.sql", "BroadcastText (Id: %u) in table `broadcast_text` using Language %u but Language does not exist. Skipped.", bct.Id, bct.Language);
- // don't load bct of higher expansions
- continue;
- }
-
- if (bct.EmoteId0)
- {
- if (!sEmotesStore.LookupEntry(bct.EmoteId0))
- {
- TC_LOG_INFO("sql.sql", "BroadcastText (Id: %u) in table `broadcast_text` has EmoteId0 %u but emote does not exist. Skipped.", bct.Id, bct.EmoteId0);
- // don't load bct of higher expansions
- continue;
- }
- }
-
- if (bct.EmoteId1)
- {
- if (!sEmotesStore.LookupEntry(bct.EmoteId1))
- {
- TC_LOG_INFO("sql.sql", "BroadcastText (Id: %u) in table `broadcast_text` has EmoteId1 %u but emote does not exist. Skipped.", bct.Id, bct.EmoteId1);
- // don't load bct of higher expansions
- continue;
- }
- }
-
- if (bct.EmoteId2)
- {
- if (!sEmotesStore.LookupEntry(bct.EmoteId2))
- {
- TC_LOG_INFO("sql.sql", "BroadcastText (Id: %u) in table `broadcast_text` has EmoteId2 %u but emote does not exist. Skipped.", bct.Id, bct.EmoteId2);
- // don't load bct of higher expansions
- continue;
- }
- }
-
- _broadcastTextStore[bct.Id] = bct;
-
- ++count;
- }
- while (result->NextRow());
-
- TC_LOG_INFO("server.loading", ">> Loaded %u broadcast texts in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
-}
-
-void ObjectMgr::LoadBroadcastTextLocales()
-{
- uint32 oldMSTime = getMSTime();
-
- // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
- QueryResult result = WorldDatabase.Query("SELECT Id, MaleText_loc1, MaleText_loc2, MaleText_loc3, MaleText_loc4, MaleText_loc5, MaleText_loc6, MaleText_loc7, MaleText_loc8, FemaleText_loc1, FemaleText_loc2, FemaleText_loc3, FemaleText_loc4, FemaleText_loc5, FemaleText_loc6, FemaleText_loc7, FemaleText_loc8 FROM locales_broadcast_text");
-
- if (!result)
- {
- TC_LOG_INFO("server.loading", ">> Loaded 0 broadcast text locales. DB table `locales_broadcast_text` is empty.");
- return;
- }
-
- uint32 count = 0;
-
- do
- {
- Field* fields = result->Fetch();
-
- uint32 id = fields[0].GetUInt32();
- BroadcastTextContainer::iterator bct = _broadcastTextStore.find(id);
- if (bct == _broadcastTextStore.end())
- {
- TC_LOG_INFO("sql.sql", "BroadcastText (Id: %u) in table `locales_broadcast_text` does not exist or is incompatible. Skipped!", id);
- // don't load bct of higher expansions
- continue;
- }
-
- for (uint8 i = TOTAL_LOCALES - 1; i > 0; --i)
- {
- LocaleConstant locale = LocaleConstant(i);
- AddLocaleString(fields[1 + (i - 1)].GetString(), locale, bct->second.MaleText);
- AddLocaleString(fields[9 + (i - 1)].GetString(), locale, bct->second.FemaleText);
- }
-
- ++count;
- }
- while (result->NextRow());
-
- TC_LOG_INFO("server.loading", ">> Loaded %u broadcast text locales in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
-}
-
CreatureBaseStats const* ObjectMgr::GetCreatureBaseStats(uint8 level, uint8 unitClass)
{
CreatureBaseStatsContainer::const_iterator it = _creatureBaseStatsStore.find(MAKE_PAIR16(level, unitClass));
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 134e9bf7483..17873be4252 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -436,49 +436,6 @@ struct AreaTriggerStruct
float target_Orientation;
};
-struct BroadcastText
-{
- BroadcastText() : Id(0), Language(0), EmoteId0(0), EmoteId1(0), EmoteId2(0),
- EmoteDelay0(0), EmoteDelay1(0), EmoteDelay2(0), SoundId(0), Unk1(0), Unk2(0)
- {
- MaleText.resize(DEFAULT_LOCALE + 1);
- FemaleText.resize(DEFAULT_LOCALE + 1);
- }
-
- uint32 Id;
- uint32 Language;
- StringVector MaleText;
- StringVector FemaleText;
- uint32 EmoteId0;
- uint32 EmoteId1;
- uint32 EmoteId2;
- uint32 EmoteDelay0;
- uint32 EmoteDelay1;
- uint32 EmoteDelay2;
- uint32 SoundId;
- uint32 Unk1;
- uint32 Unk2;
- // uint32 VerifiedBuild;
-
- std::string const& GetText(LocaleConstant locale = DEFAULT_LOCALE, uint8 gender = GENDER_MALE, bool forceGender = false) const
- {
- if (gender == GENDER_FEMALE && (forceGender || !FemaleText[DEFAULT_LOCALE].empty()))
- {
- if (FemaleText.size() > size_t(locale) && !FemaleText[locale].empty())
- return FemaleText[locale];
- return FemaleText[DEFAULT_LOCALE];
- }
- // else if (gender == GENDER_MALE)
- {
- if (MaleText.size() > size_t(locale) && !MaleText[locale].empty())
- return MaleText[locale];
- return MaleText[DEFAULT_LOCALE];
- }
- }
-};
-
-typedef std::unordered_map<uint32, BroadcastText> BroadcastTextContainer;
-
typedef std::set<ObjectGuid::LowType> CellGuidSet;
typedef std::map<ObjectGuid/*player guid*/, uint32/*instance*/> CellCorpseSet;
struct CellObjectGuids
@@ -994,8 +951,6 @@ class ObjectMgr
void LoadSpellScriptNames();
void ValidateSpellScripts();
- void LoadBroadcastTexts();
- void LoadBroadcastTextLocales();
void LoadCreatureClassLevelStats();
void LoadCreatureLocales();
void LoadCreatureTemplates();
@@ -1136,14 +1091,6 @@ class ObjectMgr
return NULL;
}
- BroadcastText const* GetBroadcastText(uint32 id) const
- {
- BroadcastTextContainer::const_iterator itr = _broadcastTextStore.find(id);
- if (itr != _broadcastTextStore.end())
- return &itr->second;
- return NULL;
- }
-
CreatureData const* GetCreatureData(ObjectGuid::LowType guid) const
{
CreatureDataContainer::const_iterator itr = _creatureDataStore.find(guid);
@@ -1499,7 +1446,6 @@ class ObjectMgr
/// Stores temp summon data grouped by summoner's entry, summoner's type and group id
TempSummonDataContainer _tempSummonDataStore;
- BroadcastTextContainer _broadcastTextStore;
ItemTemplateContainer _itemTemplateStore;
ItemLocaleContainer _itemLocaleStore;
QuestLocaleContainer _questLocaleStore;
diff --git a/src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp b/src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp
index b4d77e9d0fb..cc34132b142 100644
--- a/src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp
+++ b/src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp
@@ -231,8 +231,8 @@ void OutdoorPvPMgr::HandlePlayerResurrects(Player* player, uint32 zoneid)
std::string OutdoorPvPMgr::GetDefenseMessage(uint32 zoneId, uint32 id, LocaleConstant locale) const
{
- if (BroadcastText const* bct = sObjectMgr->GetBroadcastText(id))
- return bct->GetText(locale);
+ if (BroadcastTextEntry const* bct = sBroadcastTextStore.LookupEntry(id))
+ return GetBroadcastTextValue(bct, locale);
TC_LOG_ERROR("outdoorpvp", "Can not find DefenseMessage (Zone: %u, Id: %u). BroadcastText (Id: %u) does not exist.", zoneId, id, id);
return "";
diff --git a/src/server/game/Texts/ChatTextBuilder.h b/src/server/game/Texts/ChatTextBuilder.h
index 1cab1f3576c..6e7a5738394 100644
--- a/src/server/game/Texts/ChatTextBuilder.h
+++ b/src/server/game/Texts/ChatTextBuilder.h
@@ -32,9 +32,9 @@ namespace Trinity
void operator()(WorldPacket& data, LocaleConstant locale)
{
- BroadcastText const* bct = sObjectMgr->GetBroadcastText(_textId);
+ BroadcastTextEntry const* bct = sBroadcastTextStore.LookupEntry(_textId);
WorldPackets::Chat::Chat packet;
- packet.Initalize(_msgType, bct ? Language(bct->Language) : LANG_UNIVERSAL, _source, _target, bct ? bct->GetText(locale, _source->getGender()) : "", _achievementId, "", locale);
+ packet.Initalize(_msgType, bct ? Language(bct->Language) : LANG_UNIVERSAL, _source, _target, bct ? GetBroadcastTextValue(bct, locale, _source->getGender()) : "", _achievementId, "", locale);
packet.Write();
data = packet.Move();
}
diff --git a/src/server/game/Texts/CreatureTextMgr.cpp b/src/server/game/Texts/CreatureTextMgr.cpp
index 7f299c57c21..16a1bde5a96 100644
--- a/src/server/game/Texts/CreatureTextMgr.cpp
+++ b/src/server/game/Texts/CreatureTextMgr.cpp
@@ -146,7 +146,7 @@ void CreatureTextMgr::LoadCreatureTexts()
if (temp.BroadcastTextId)
{
- if (!sObjectMgr->GetBroadcastText(temp.BroadcastTextId))
+ if (!sBroadcastTextStore.LookupEntry(temp.BroadcastTextId))
{
TC_LOG_ERROR("sql.sql", "CreatureTextMgr: Entry %u, Group %u, Id %u in table `creature_text` has non-existing or incompatible BroadcastTextId %u.", temp.entry, temp.group, temp.id, temp.BroadcastTextId);
temp.BroadcastTextId = 0;
@@ -499,10 +499,10 @@ std::string CreatureTextMgr::GetLocalizedChatString(uint32 entry, uint8 gender,
locale = DEFAULT_LOCALE;
std::string baseText = "";
- BroadcastText const* bct = sObjectMgr->GetBroadcastText(groupItr->BroadcastTextId);
+ BroadcastTextEntry const* bct = sBroadcastTextStore.LookupEntry(groupItr->BroadcastTextId);
if (bct)
- baseText = bct->GetText(locale, gender);
+ baseText = GetBroadcastTextValue(bct, locale, gender);
else
baseText = groupItr->text;
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index fb21450dc22..7f0ea4cd583 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1445,10 +1445,6 @@ void World::SetInitialWorldSettings()
TC_LOG_INFO("server.loading", "Loading instances...");
sInstanceSaveMgr->LoadInstances();
- TC_LOG_INFO("server.loading", "Loading Broadcast texts...");
- sObjectMgr->LoadBroadcastTexts();
- sObjectMgr->LoadBroadcastTextLocales();
-
TC_LOG_INFO("server.loading", "Loading Localization strings...");
uint32 oldMSTime = getMSTime();
sObjectMgr->LoadCreatureLocales();
diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp
index a25c6bbcb59..5ade8708703 100644
--- a/src/server/scripts/Commands/cs_reload.cpp
+++ b/src/server/scripts/Commands/cs_reload.cpp
@@ -76,7 +76,6 @@ public:
{ "areatrigger_teleport", rbac::RBAC_PERM_COMMAND_RELOAD_AREATRIGGER_TELEPORT, true, &HandleReloadAreaTriggerTeleportCommand, "", NULL },
{ "autobroadcast", rbac::RBAC_PERM_COMMAND_RELOAD_AUTOBROADCAST, true, &HandleReloadAutobroadcastCommand, "", NULL },
{ "battleground_template", rbac::RBAC_PERM_COMMAND_RELOAD_BATTLEGROUND_TEMPLATE, true, &HandleReloadBattlegroundTemplate, "", NULL },
- { "broadcast_text", rbac::RBAC_PERM_COMMAND_RELOAD_BROADCAST_TEXT, true, &HandleReloadBroadcastTextCommand, "", NULL },
{ "command", rbac::RBAC_PERM_COMMAND_RELOAD_COMMAND, true, &HandleReloadCommandCommand, "", NULL },
{ "conditions", rbac::RBAC_PERM_COMMAND_RELOAD_CONDITIONS, true, &HandleReloadConditions, "", NULL },
{ "config", rbac::RBAC_PERM_COMMAND_RELOAD_CONFIG, true, &HandleReloadConfigCommand, "", NULL },
@@ -381,15 +380,6 @@ public:
return true;
}
- static bool HandleReloadBroadcastTextCommand(ChatHandler* handler, const char* /*args*/)
- {
- TC_LOG_INFO("misc", "Re-Loading Broadcast texts...");
- sObjectMgr->LoadBroadcastTexts();
- sObjectMgr->LoadBroadcastTextLocales();
- handler->SendGlobalGMSysMessage("DB table `broadcast_text` reloaded.");
- return true;
- }
-
static bool HandleReloadCommandCommand(ChatHandler* handler, const char* /*args*/)
{
handler->SetLoadCommandTable(true);
diff --git a/src/server/shared/DataStores/DB2StorageLoader.cpp b/src/server/shared/DataStores/DB2StorageLoader.cpp
index 0e72a049a7a..f716b9e805e 100644
--- a/src/server/shared/DataStores/DB2StorageLoader.cpp
+++ b/src/server/shared/DataStores/DB2StorageLoader.cpp
@@ -436,10 +436,17 @@ char* DB2DatabaseLoader::Load(const char* format, int32 preparedStatement, uint3
// each string field at load have array of string for each locale
size_t stringHolderSize = sizeof(char*) * TOTAL_LOCALES;
size_t stringHoldersRecordPoolSize = stringFields * stringHolderSize;
- size_t stringHoldersPoolSize = stringHoldersRecordPoolSize * result->GetRowCount();
if (stringFields)
+ {
+ size_t stringHoldersPoolSize = stringHoldersRecordPoolSize * result->GetRowCount();
stringHolders = new char[stringHoldersPoolSize];
+
+ // DB2 strings expected to have at least empty string
+ for (size_t i = 0; i < stringHoldersPoolSize / sizeof(char*); ++i)
+ ((char const**)stringHolders)[i] = nullStr;
+
+ }
else
stringHolders = nullptr;
@@ -467,21 +474,21 @@ char* DB2DatabaseLoader::Load(const char* format, int32 preparedStatement, uint3
else
tempIndexTable[records++] = &dataTable[offset];
- for (uint32 x = 0; x < fieldCount; x++)
+ for (uint32 f = 0; f < fieldCount; f++)
{
- switch (format[x])
+ switch (format[f])
{
case FT_FLOAT:
- *((float*)(&dataTable[offset])) = fields[x].GetFloat();
+ *((float*)(&dataTable[offset])) = fields[f].GetFloat();
offset += 4;
break;
case FT_IND:
case FT_INT:
- *((int32*)(&dataTable[offset])) = fields[x].GetInt32();
+ *((int32*)(&dataTable[offset])) = fields[f].GetInt32();
offset += 4;
break;
case FT_BYTE:
- *((int8*)(&dataTable[offset])) = fields[x].GetInt8();
+ *((int8*)(&dataTable[offset])) = fields[f].GetInt8();
offset += 1;
break;
case FT_STRING:
@@ -490,11 +497,11 @@ char* DB2DatabaseLoader::Load(const char* format, int32 preparedStatement, uint3
*slot = (LocalizedString*)(&stringHolders[stringHoldersRecordPoolSize * rec++ + stringHolderSize * stringFieldNumInRecord]);
// Value in database in main table field must be for enUS locale
- if (char* str = AddLocaleString(*slot, LOCALE_enUS, fields[x].GetString()))
+ if (char* str = AddLocaleString(*slot, LOCALE_enUS, fields[f].GetString()))
stringPool.push_back(str);
- for (uint32 i = LOCALE_koKR; i < TOTAL_LOCALES; ++i)
- if (char* str = AddLocaleString(*slot, i, fields[localeFieldsOffset + (i - 1) * stringFieldNumInRecord].GetString()))
+ for (uint32 locale = LOCALE_koKR; locale < TOTAL_LOCALES; ++locale)
+ if (char* str = AddLocaleString(*slot, locale, fields[localeFieldsOffset + (locale - 1) + stringFields * stringFieldNumInRecord].GetString()))
stringPool.push_back(str);
++stringFieldNumInRecord;
@@ -527,7 +534,8 @@ char* DB2DatabaseLoader::AddLocaleString(LocalizedString* holder, uint32 locale,
if (!value.empty())
{
char* str = new char[value.length() + 1];
- strcpy(str, value.c_str());
+ memcpy(str, value.c_str(), value.length());
+ str[value.length()] = '\0';
holder->Str[locale] = str;
return str;
}
diff --git a/src/server/shared/Database/Implementation/HotfixDatabase.cpp b/src/server/shared/Database/Implementation/HotfixDatabase.cpp
index ae9ec73c9bc..aa35580676e 100644
--- a/src/server/shared/Database/Implementation/HotfixDatabase.cpp
+++ b/src/server/shared/Database/Implementation/HotfixDatabase.cpp
@@ -22,5 +22,6 @@ void HotfixDatabaseConnection::DoPrepareStatements()
if (!m_reconnecting)
m_stmts.resize(MAX_HOTFIXDATABASE_STATEMENTS);
+ PrepareStatement(HOTFIX_SEL_BROADCAST_TEXT, "SELECT * FROM broadcast_text b LEFT JOIN locales_broadcast_text lb ON b.ID = lb.ID", CONNECTION_SYNCH);
PrepareStatement(HOTFIX_SEL_TAXI_PATH_NODE, "SELECT * FROM taxi_path_node", CONNECTION_SYNCH);
}
diff --git a/src/server/shared/Database/Implementation/HotfixDatabase.h b/src/server/shared/Database/Implementation/HotfixDatabase.h
index 5ee09ccd014..56ab6b8c48a 100644
--- a/src/server/shared/Database/Implementation/HotfixDatabase.h
+++ b/src/server/shared/Database/Implementation/HotfixDatabase.h
@@ -42,6 +42,7 @@ enum HotfixDatabaseStatements
name for a suiting suffix.
*/
+ HOTFIX_SEL_BROADCAST_TEXT,
HOTFIX_SEL_TAXI_PATH_NODE,
MAX_HOTFIXDATABASE_STATEMENTS
};