diff options
author | Vincent-Michael <Vincent_Michael@gmx.de> | 2015-04-11 03:26:10 +0200 |
---|---|---|
committer | Vincent-Michael <Vincent_Michael@gmx.de> | 2015-04-11 03:26:36 +0200 |
commit | 22e230ecec1c7ce4eb4daeb60adfa03098271f34 (patch) | |
tree | 4c0ba5222aafda0d5a5031793da7a65c7387be3f /src | |
parent | 5659db6f03dfbb081608f6d202e62d29d239f4ea (diff) |
Core/Misc:
- Drop locales_npc_text
- Update npc_text for WoD
- Implemented Quest Greeting
- Sync auth database
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Accounts/RBAC.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/GossipDef.cpp | 33 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/GossipDef.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 43 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 182 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.h | 33 | ||||
-rw-r--r-- | src/server/game/Handlers/NPCHandler.h | 29 | ||||
-rw-r--r-- | src/server/game/Handlers/QueryHandler.cpp | 25 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QueryPackets.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QueryPackets.h | 4 | ||||
-rw-r--r-- | src/server/game/Server/Packets/TokenPackets.cpp | 2 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 4 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_reload.cpp | 20 |
13 files changed, 173 insertions, 212 deletions
diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index bcd20af30ae..e913880ac77 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -568,7 +568,7 @@ enum RBACPermissions RBAC_PERM_COMMAND_RELOAD_LOCALES_GOSSIP_MENU_OPTION = 661, // UNUSED RBAC_PERM_COMMAND_RELOAD_LOCALES_ITEM_SET_NAME = 663, - RBAC_PERM_COMMAND_RELOAD_LOCALES_NPC_TEXT = 664, + RBAC_PERM_COMMAND_RELOAD_QUEST_GREETING = 664, RBAC_PERM_COMMAND_RELOAD_LOCALES_PAGE_TEXT = 665, RBAC_PERM_COMMAND_RELOAD_LOCALES_POINTS_OF_INTEREST = 666, RBAC_PERM_COMMAND_RELOAD_QUEST_LOCALE = 667, diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp index 23fc857e2d1..23c3ba3ff92 100644 --- a/src/server/game/Entities/Creature/GossipDef.cpp +++ b/src/server/game/Entities/Creature/GossipDef.cpp @@ -331,44 +331,49 @@ void QuestMenu::ClearMenu() _questMenuItems.clear(); } -void PlayerMenu::SendQuestGiverQuestList(QEmote const& eEmote, const std::string& Title, ObjectGuid npcGUID) +void PlayerMenu::SendQuestGiverQuestList(ObjectGuid guid) { WorldPackets::Quest::QuestGiverQuestList questList; + questList.QuestGiverGUID = guid; - questList.QuestGiverGUID = npcGUID; - questList.Greeting = Title; - questList.GreetEmoteDelay = eEmote._Delay; - questList.GreetEmoteType = eEmote._Emote; + if (QuestGreeting const* questGreeting = sObjectMgr->GetQuestGreeting(guid)) + { + questList.GreetEmoteDelay = questGreeting->greetEmoteDelay; + questList.GreetEmoteType = questGreeting->greetEmoteType; + questList.Greeting = questGreeting->greeting; + } + else + TC_LOG_ERROR("misc", "Guid: %s - No quest greeting found.", guid.ToString().c_str()); // Store this instead of checking the Singleton every loop iteration bool questLevelInTitle = sWorld->getBoolConfig(CONFIG_UI_QUESTLEVELS_IN_DIALOGS); for (uint32 i = 0; i < _questMenu.GetMenuItemCount(); ++i) { - QuestMenuItem const& qmi = _questMenu.GetItem(i); + QuestMenuItem const& questMenuItem = _questMenu.GetItem(i); - uint32 questID = qmi.QuestId; + uint32 questID = questMenuItem.QuestId; if (Quest const* quest = sObjectMgr->GetQuestTemplate(questID)) { std::string title = quest->GetLogTitle(); - int32 locale = _session->GetSessionDbLocaleIndex(); - if (locale >= 0) - if (QuestTemplateLocale const* localeData = sObjectMgr->GetQuestLocale(questID)) - ObjectMgr::GetLocaleString(localeData->LogTitle, locale, title); + LocaleConstant locale = _session->GetSessionDbLocaleIndex(); + if (locale >= LOCALE_enUS) + if (QuestTemplateLocale const* questTemplateLocaleData = sObjectMgr->GetQuestLocale(questID)) + ObjectMgr::GetLocaleString(questTemplateLocaleData->LogTitle, locale, title); if (questLevelInTitle) AddQuestLevelToTitle(title, quest->GetQuestLevel()); bool repeatable = false; // NYI - questList.GossipTexts.push_back(WorldPackets::Quest::GossipTextData(questID, qmi.QuestIcon, quest->GetQuestLevel(), quest->GetFlags(), quest->GetFlagsEx(), repeatable, title)); + questList.GossipTexts.push_back(WorldPackets::Quest::GossipTextData(questID, questMenuItem.QuestIcon, quest->GetQuestLevel(), quest->GetFlags(), quest->GetFlagsEx(), repeatable, title)); } } _session->SendPacket(questList.Write()); - TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUEST_GIVER_QUEST_LIST_MESSAGE NPC=%s", npcGUID.ToString().c_str()); + TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUEST_GIVER_QUEST_LIST_MESSAGE NPC=%s", guid.ToString().c_str()); } void PlayerMenu::SendQuestGiverStatus(uint32 questStatus, ObjectGuid npcGUID) const @@ -451,7 +456,7 @@ void PlayerMenu::SendQuestGiverQuestDetails(Quest const* quest, ObjectGuid npcGU _session->SendPacket(packet.Write()); - TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_DETAILS NPC=%s, questid=%u", npcGUID.ToString().c_str(), quest->GetQuestId()); + TC_LOG_DEBUG(" etwork", "WORLD: Sent SMSG_QUESTGIVER_QUEST_DETAILS NPC=%s, questid=%u", npcGUID.ToString().c_str(), quest->GetQuestId()); } void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const diff --git a/src/server/game/Entities/Creature/GossipDef.h b/src/server/game/Entities/Creature/GossipDef.h index cc0da5ffb36..f244413a325 100644 --- a/src/server/game/Entities/Creature/GossipDef.h +++ b/src/server/game/Entities/Creature/GossipDef.h @@ -258,7 +258,7 @@ class PlayerMenu /*********************************************************/ void SendQuestGiverStatus(uint32 questStatus, ObjectGuid npcGUID) const; - void SendQuestGiverQuestList(QEmote const& eEmote, const std::string& Title, ObjectGuid npcGUID); + void SendQuestGiverQuestList(ObjectGuid npcGUID); void SendQuestQueryResponse(Quest const* quest) const; void SendQuestGiverQuestDetails(Quest const* quest, ObjectGuid npcGUID, bool activateAccept) const; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index c1a58ad5669..fd2dc78a06b 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -14108,48 +14108,7 @@ void Player::SendPreparedQuest(ObjectGuid guid) } } - QEmote qe; - qe._Delay = 0; - qe._Emote = 0; - std::string title = ""; - - // need pet case for some quests - Creature* creature = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, guid); - if (creature) - { - uint32 textid = GetGossipTextId(creature); - GossipText const* gossiptext = sObjectMgr->GetGossipText(textid); - if (!gossiptext) - { - qe._Delay = 0; //TEXTEMOTE_MESSAGE; //zyg: player emote - qe._Emote = 0; //TEXTEMOTE_HELLO; //zyg: NPC emote - title.clear(); - } - else - { - qe = gossiptext->Options[0].Emotes[0]; - - if (!gossiptext->Options[0].Text_0.empty()) - { - title = gossiptext->Options[0].Text_0; - - int loc_idx = GetSession()->GetSessionDbLocaleIndex(); - if (loc_idx >= 0) - if (NpcTextLocale const* nl = sObjectMgr->GetNpcTextLocale(textid)) - ObjectMgr::GetLocaleString(nl->Text_0[0], loc_idx, title); - } - else - { - title = gossiptext->Options[0].Text_1; - - int loc_idx = GetSession()->GetSessionDbLocaleIndex(); - if (loc_idx >= 0) - if (NpcTextLocale const* nl = sObjectMgr->GetNpcTextLocale(textid)) - ObjectMgr::GetLocaleString(nl->Text_1[0], loc_idx, title); - } - } - } - PlayerTalkClass->SendQuestGiverQuestList(qe, title, guid); + PlayerTalkClass->SendQuestGiverQuestList(guid); } bool Player::IsActiveQuest(uint32 quest_id) const diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index daf48ac5fda..ef9a25abf70 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -5053,80 +5053,63 @@ void ObjectMgr::LoadInstanceEncounters() TC_LOG_INFO("server.loading", ">> Loaded %u instance encounters in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } -GossipText const* ObjectMgr::GetGossipText(uint32 Text_ID) const +NpcText const* ObjectMgr::GetNpcText(uint32 Text_ID) const { - GossipTextContainer::const_iterator itr = _gossipTextStore.find(Text_ID); - if (itr != _gossipTextStore.end()) + NpcTextContainer::const_iterator itr = _npcTextStore.find(Text_ID); + if (itr != _npcTextStore.end()) return &itr->second; return NULL; } -void ObjectMgr::LoadGossipText() +void ObjectMgr::LoadNPCText() { uint32 oldMSTime = getMSTime(); QueryResult result = WorldDatabase.Query("SELECT ID, " - "text0_0, text0_1, BroadcastTextID0, lang0, prob0, em0_0, em0_1, em0_2, em0_3, em0_4, em0_5, " - "text1_0, text1_1, BroadcastTextID1, lang1, prob1, em1_0, em1_1, em1_2, em1_3, em1_4, em1_5, " - "text2_0, text2_1, BroadcastTextID2, lang2, prob2, em2_0, em2_1, em2_2, em2_3, em2_4, em2_5, " - "text3_0, text3_1, BroadcastTextID3, lang3, prob3, em3_0, em3_1, em3_2, em3_3, em3_4, em3_5, " - "text4_0, text4_1, BroadcastTextID4, lang4, prob4, em4_0, em4_1, em4_2, em4_3, em4_4, em4_5, " - "text5_0, text5_1, BroadcastTextID5, lang5, prob5, em5_0, em5_1, em5_2, em5_3, em5_4, em5_5, " - "text6_0, text6_1, BroadcastTextID6, lang6, prob6, em6_0, em6_1, em6_2, em6_3, em6_4, em6_5, " - "text7_0, text7_1, BroadcastTextID7, lang7, prob7, em7_0, em7_1, em7_2, em7_3, em7_4, em7_5 " - "FROM npc_text"); - - + "BroadcastTextID0, Probability0, " + "BroadcastTextID1, Probability1, " + "BroadcastTextID2, Probability2, " + "BroadcastTextID3, Probability3, " + "BroadcastTextID4, Probability4, " + "BroadcastTextID5, Probability5, " + "BroadcastTextID6, Probability6, " + "BroadcastTextID7, Probability7" + " FROM npc_text"); if (!result) { TC_LOG_INFO("server.loading", ">> Loaded 0 npc texts, table is empty!"); return; } - _gossipTextStore.rehash(result->GetRowCount()); - - uint32 count = 0; - uint8 cic; + _npcTextStore.rehash(result->GetRowCount()); do { - ++count; - cic = 0; - Field* fields = result->Fetch(); - uint32 id = fields[cic++].GetUInt32(); - if (!id) + uint32 textID = fields[0].GetUInt32(); + if (!textID) { TC_LOG_ERROR("sql.sql", "Table `npc_text` has record with reserved id 0, ignore."); continue; } - GossipText& gText = _gossipTextStore[id]; + NpcText& npcText = _npcTextStore[textID]; - for (uint8 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; ++i) + for (uint8 i = 0; i < MAX_NPC_TEXT_OPTIONS; ++i) { - gText.Options[i].Text_0 = fields[cic++].GetString(); - gText.Options[i].Text_1 = fields[cic++].GetString(); - gText.Options[i].BroadcastTextID = fields[cic++].GetUInt32(); - gText.Options[i].Language = fields[cic++].GetUInt8(); - gText.Options[i].Probability = fields[cic++].GetFloat(); - - for (uint8 j = 0; j < MAX_GOSSIP_TEXT_EMOTES; ++j) - { - gText.Options[i].Emotes[j]._Delay = fields[cic++].GetUInt16(); - gText.Options[i].Emotes[j]._Emote = fields[cic++].GetUInt16(); - } + npcText.Data[i].BroadcastTextID = fields[1 + i].GetUInt32(); + npcText.Data[i].Probability = fields[1 + i * 2].GetFloat(); } - for (uint8 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; i++) + for (uint8 i = 0; i < MAX_NPC_TEXT_OPTIONS; i++) { - if (gText.Options[i].BroadcastTextID) + if (npcText.Data[i].BroadcastTextID) { - if (!sBroadcastTextStore.LookupEntry(gText.Options[i].BroadcastTextID)) + if (!sBroadcastTextStore.LookupEntry(npcText.Data[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; + TC_LOG_ERROR("sql.sql", "NpcText (Id: %u) in table `npc_text` has non-existing or incompatible Index: %u BroadcastTextID %u.", textID, i, npcText.Data[i].BroadcastTextID); + npcText.Data[i].BroadcastTextID = 0; } } } @@ -5134,49 +5117,7 @@ void ObjectMgr::LoadGossipText() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u npc texts in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); -} - -void ObjectMgr::LoadNpcTextLocales() -{ - uint32 oldMSTime = getMSTime(); - - _npcTextLocaleStore.clear(); // need for reload case - - QueryResult result = WorldDatabase.Query("SELECT ID, " - "Text0_0_loc1, Text0_1_loc1, Text1_0_loc1, Text1_1_loc1, Text2_0_loc1, Text2_1_loc1, Text3_0_loc1, Text3_1_loc1, Text4_0_loc1, Text4_1_loc1, Text5_0_loc1, Text5_1_loc1, Text6_0_loc1, Text6_1_loc1, Text7_0_loc1, Text7_1_loc1, " - "Text0_0_loc2, Text0_1_loc2, Text1_0_loc2, Text1_1_loc2, Text2_0_loc2, Text2_1_loc2, Text3_0_loc2, Text3_1_loc1, Text4_0_loc2, Text4_1_loc2, Text5_0_loc2, Text5_1_loc2, Text6_0_loc2, Text6_1_loc2, Text7_0_loc2, Text7_1_loc2, " - "Text0_0_loc3, Text0_1_loc3, Text1_0_loc3, Text1_1_loc3, Text2_0_loc3, Text2_1_loc3, Text3_0_loc3, Text3_1_loc1, Text4_0_loc3, Text4_1_loc3, Text5_0_loc3, Text5_1_loc3, Text6_0_loc3, Text6_1_loc3, Text7_0_loc3, Text7_1_loc3, " - "Text0_0_loc4, Text0_1_loc4, Text1_0_loc4, Text1_1_loc4, Text2_0_loc4, Text2_1_loc4, Text3_0_loc4, Text3_1_loc1, Text4_0_loc4, Text4_1_loc4, Text5_0_loc4, Text5_1_loc4, Text6_0_loc4, Text6_1_loc4, Text7_0_loc4, Text7_1_loc4, " - "Text0_0_loc5, Text0_1_loc5, Text1_0_loc5, Text1_1_loc5, Text2_0_loc5, Text2_1_loc5, Text3_0_loc5, Text3_1_loc1, Text4_0_loc5, Text4_1_loc5, Text5_0_loc5, Text5_1_loc5, Text6_0_loc5, Text6_1_loc5, Text7_0_loc5, Text7_1_loc5, " - "Text0_0_loc6, Text0_1_loc6, Text1_0_loc6, Text1_1_loc6, Text2_0_loc6, Text2_1_loc6, Text3_0_loc6, Text3_1_loc1, Text4_0_loc6, Text4_1_loc6, Text5_0_loc6, Text5_1_loc6, Text6_0_loc6, Text6_1_loc6, Text7_0_loc6, Text7_1_loc6, " - "Text0_0_loc7, Text0_1_loc7, Text1_0_loc7, Text1_1_loc7, Text2_0_loc7, Text2_1_loc7, Text3_0_loc7, Text3_1_loc1, Text4_0_loc7, Text4_1_loc7, Text5_0_loc7, Text5_1_loc7, Text6_0_loc7, Text6_1_loc7, Text7_0_loc7, Text7_1_loc7, " - "Text0_0_loc8, Text0_1_loc8, Text1_0_loc8, Text1_1_loc8, Text2_0_loc8, Text2_1_loc8, Text3_0_loc8, Text3_1_loc1, Text4_0_loc8, Text4_1_loc8, Text5_0_loc8, Text5_1_loc8, Text6_0_loc8, Text6_1_loc8, Text7_0_loc8, Text7_1_loc8 " - " FROM locales_npc_text"); - - if (!result) - return; - - do - { - Field* fields = result->Fetch(); - - uint32 entry = fields[0].GetUInt32(); - - NpcTextLocale& data = _npcTextLocaleStore[entry]; - - for (uint8 i = OLD_TOTAL_LOCALES - 1; i > 0; --i) - { - LocaleConstant locale = (LocaleConstant) i; - for (uint8 j = 0; j < MAX_GOSSIP_TEXT_OPTIONS; ++j) - { - AddLocaleString(fields[1 + 8 * 2 * (i - 1) + 2 * j].GetString(), locale, data.Text_0[j]); - AddLocaleString(fields[1 + 8 * 2 * (i - 1) + 2 * j + 1].GetString(), locale, data.Text_1[j]); - } - } - } while (result->NextRow()); - - TC_LOG_INFO("server.loading", ">> Loaded %u NpcText locale strings in %u ms", uint32(_npcTextLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u npc texts in %u ms", _npcTextStore.size(), GetMSTimeDiffToNow(oldMSTime)); } //not very fast function but it is called only once a day, or on starting-up @@ -5365,6 +5306,75 @@ void ObjectMgr::LoadQuestAreaTriggers() TC_LOG_INFO("server.loading", ">> Loaded %u quest trigger points in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } +QuestGreeting const* ObjectMgr::GetQuestGreeting(ObjectGuid guid) const +{ + auto itr = _questGreetingStore.find(guid.GetTypeId()); + if (itr == _questGreetingStore.end()) + return nullptr; + + auto questItr = itr->second.find(guid.GetEntry()); + if (questItr == itr->second.end()) + return nullptr; + + return questItr->second; +} + +void ObjectMgr::LoadQuestGreetings() +{ + uint32 oldMSTime = getMSTime(); + + _questGreetingStore.clear(); // need for reload case + + // 0 1 2 3 + QueryResult result = WorldDatabase.Query("SELECT ID, type, GreetEmoteType, GreetEmoteDelay, Greeting FROM quest_greeting"); + if (!result) + { + TC_LOG_INFO("server.loading", ">> Loaded 0 npc texts, table is empty!"); + return; + } + + _questGreetingStore.rehash(result->GetRowCount()); + + do + { + Field* fields = result->Fetch(); + + uint32 id = fields[0].GetUInt32(); + uint8 type = fields[1].GetUInt8(); + // overwrite + switch (type) + { + case 0: // Creature + type = TYPEID_UNIT; + if (!sObjectMgr->GetCreatureTemplate(id)) + { + TC_LOG_ERROR("sql.sql", "Table `quest_greeting`: creature template entry %u does not exist.", id); + continue; + } + break; + case 1: // GameObject + type = TYPEID_GAMEOBJECT; + if (!sObjectMgr->GetGameObjectTemplate(id)) + { + TC_LOG_ERROR("sql.sql", "Table `quest_greeting`: gameobject template entry %u does not exist.", id); + continue; + } + break; + default: + continue; + } + + uint16 greetEmoteType = fields[2].GetUInt32(); + uint32 greetEmoteDelay = fields[3].GetUInt32(); + std::string greeting = fields[4].GetString(); + + _questGreetingStore[type][id] = new QuestGreeting(greetEmoteType, greetEmoteDelay, greeting); + } + while (result->NextRow()); + + TC_LOG_INFO("server.loading", ">> Loaded %u quest_greeting in %u ms", _questGreetingStore.size(), GetMSTimeDiffToNow(oldMSTime)); +} + void ObjectMgr::LoadTavernAreaTriggers() { uint32 oldMSTime = getMSTime(); @@ -8012,7 +8022,7 @@ void ObjectMgr::LoadGossipMenu() gMenu.entry = fields[0].GetUInt16(); gMenu.text_id = fields[1].GetUInt32(); - if (!GetGossipText(gMenu.text_id)) + if (!GetNpcText(gMenu.text_id)) { TC_LOG_ERROR("sql.sql", "Table gossip_menu entry %u are using non-existing text_id %u", gMenu.entry, gMenu.text_id); continue; diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 738bff89397..903a46cd363 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -435,7 +435,6 @@ typedef std::unordered_map<uint32, CreatureLocale> CreatureLocaleContainer; typedef std::unordered_map<uint32, GameObjectLocale> GameObjectLocaleContainer; typedef std::unordered_map<uint32, QuestTemplateLocale> QuestTemplateLocaleContainer; typedef std::unordered_map<uint32, QuestObjectivesLocale> QuestObjectivesLocaleContainer; -typedef std::unordered_map<uint32, NpcTextLocale> NpcTextLocaleContainer; typedef std::unordered_map<uint32, PageTextLocale> PageTextLocaleContainer; typedef std::unordered_map<uint32, GossipMenuItemsLocale> GossipMenuItemsLocaleContainer; typedef std::unordered_map<uint32, PointOfInterestLocale> PointOfInterestLocaleContainer; @@ -579,6 +578,19 @@ struct QuestPOI typedef std::vector<QuestPOI> QuestPOIVector; typedef std::unordered_map<uint32, QuestPOIVector> QuestPOIContainer; +struct QuestGreeting +{ + uint16 greetEmoteType; + uint32 greetEmoteDelay; + std::string greeting; + + QuestGreeting() : greetEmoteType(0), greetEmoteDelay(0) { } + QuestGreeting(uint16 _greetEmoteType, uint32 _greetEmoteDelay, std::string _greeting) + : greetEmoteType(_greetEmoteType), greetEmoteDelay(_greetEmoteDelay), greeting(_greeting) { } +}; + +typedef std::unordered_map<uint8, std::unordered_map<uint32, QuestGreeting const*>> QuestGreetingContainer; + struct GraveYardData { uint32 safeLocId; @@ -792,7 +804,8 @@ class ObjectMgr return _gameObjectForQuestStore.find(entry) != _gameObjectForQuestStore.end(); } - GossipText const* GetGossipText(uint32 Text_ID) const; + NpcText const* GetNpcText(uint32 textID) const; + QuestGreeting const* ObjectMgr::GetQuestGreeting(ObjectGuid guid) const; WorldSafeLocsEntry const* GetDefaultGraveYard(uint32 team); WorldSafeLocsEntry const* GetClosestGraveYard(float x, float y, float z, uint32 MapId, uint32 team); @@ -966,7 +979,6 @@ class ObjectMgr void LoadItemScriptNames(); void LoadQuestTemplateLocale(); void LoadQuestObjectivesLocale(); - void LoadNpcTextLocales(); void LoadPageTextLocales(); void LoadGossipMenuItemsLocales(); void LoadPointOfInterestLocales(); @@ -976,11 +988,12 @@ class ObjectMgr void LoadVehicleTemplateAccessories(); void LoadVehicleAccessories(); - void LoadGossipText(); + void LoadNPCText(); void LoadAreaTriggerTeleports(); void LoadAccessRequirements(); void LoadQuestAreaTriggers(); + void LoadQuestGreetings(); void LoadAreaTriggerScripts(); void LoadTavernAreaTriggers(); void LoadGameObjectForQuests(); @@ -1126,12 +1139,6 @@ class ObjectMgr if (itr == _questObjectivesLocaleStore.end()) return NULL; return &itr->second; } - NpcTextLocale const* GetNpcTextLocale(uint32 entry) const - { - NpcTextLocaleContainer::const_iterator itr = _npcTextLocaleStore.find(entry); - if (itr == _npcTextLocaleStore.end()) return NULL; - return &itr->second; - } PageTextLocale const* GetPageTextLocale(uint32 entry) const { PageTextLocaleContainer::const_iterator itr = _pageTextLocaleStore.find(entry); @@ -1337,7 +1344,7 @@ class ObjectMgr QuestMap _questTemplates; - typedef std::unordered_map<uint32, GossipText> GossipTextContainer; + typedef std::unordered_map<uint32, NpcText> NpcTextContainer; typedef std::unordered_map<uint32, uint32> QuestAreaTriggerContainer; typedef std::set<uint32> TavernAreaTriggerContainer; typedef std::set<uint32> GameObjectForQuestContainer; @@ -1345,7 +1352,8 @@ class ObjectMgr QuestAreaTriggerContainer _questAreaTriggerStore; TavernAreaTriggerContainer _tavernAreaTriggerStore; GameObjectForQuestContainer _gameObjectForQuestStore; - GossipTextContainer _gossipTextStore; + NpcTextContainer _npcTextStore; + QuestGreetingContainer _questGreetingStore; AreaTriggerContainer _areaTriggerStore; AreaTriggerScriptContainer _areaTriggerScriptStore; AccessRequirementContainer _accessRequirementStore; @@ -1444,7 +1452,6 @@ class ObjectMgr ItemTemplateContainer _itemTemplateStore; QuestTemplateLocaleContainer _questTemplateLocaleStore; QuestObjectivesLocaleContainer _questObjectivesLocaleStore; - NpcTextLocaleContainer _npcTextLocaleStore; PageTextLocaleContainer _pageTextLocaleStore; GossipMenuItemsLocaleContainer _gossipMenuItemsLocaleStore; PointOfInterestLocaleContainer _pointOfInterestLocaleStore; diff --git a/src/server/game/Handlers/NPCHandler.h b/src/server/game/Handlers/NPCHandler.h index 3b96ae5f937..1a91ecbfc85 100644 --- a/src/server/game/Handlers/NPCHandler.h +++ b/src/server/game/Handlers/NPCHandler.h @@ -19,29 +19,17 @@ #ifndef __NPCHANDLER_H #define __NPCHANDLER_H -struct QEmote +struct NpcTextData { - uint32 _Emote; - uint32 _Delay; -}; - -#define MAX_GOSSIP_TEXT_EMOTES 3 - -struct GossipTextOption -{ - std::string Text_0; - std::string Text_1; - uint32 BroadcastTextID; - uint32 Language; float Probability; - QEmote Emotes[MAX_GOSSIP_TEXT_EMOTES]; + uint32 BroadcastTextID; }; -#define MAX_GOSSIP_TEXT_OPTIONS 8 +#define MAX_NPC_TEXT_OPTIONS 8 -struct GossipText +struct NpcText { - GossipTextOption Options[MAX_GOSSIP_TEXT_OPTIONS]; + NpcTextData Data[MAX_NPC_TEXT_OPTIONS]; }; struct PageTextLocale @@ -49,12 +37,5 @@ struct PageTextLocale StringVector Text; }; -struct NpcTextLocale -{ - NpcTextLocale() { } - - StringVector Text_0[MAX_GOSSIP_TEXT_OPTIONS]; - StringVector Text_1[MAX_GOSSIP_TEXT_OPTIONS]; -}; #endif diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index 1b36904f64f..80b9daa33fb 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -203,29 +203,28 @@ void WorldSession::HandleNpcTextQueryOpcode(WorldPackets::Query::QueryNPCText& p { TC_LOG_DEBUG("network", "WORLD: CMSG_NPC_TEXT_QUERY TextId: %u", packet.TextID); - GossipText const* gossip = sObjectMgr->GetGossipText(packet.TextID); + NpcText const* npcText = sObjectMgr->GetNpcText(packet.TextID); WorldPackets::Query::QueryNPCTextResponse response; response.TextID = packet.TextID; - bool hasText = false; - if (gossip) + if (npcText) { - for (uint8 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; ++i) + for (uint8 i = 0; i < MAX_NPC_TEXT_OPTIONS; ++i) { - response.Probabilities[i] = gossip->Options[i].Probability; - response.BroadcastTextID[i] = gossip->Options[i].BroadcastTextID; - if (!hasText && gossip->Options[i].BroadcastTextID) - hasText = true; + response.Probabilities[i] = npcText->Data[i].Probability; + response.BroadcastTextID[i] = npcText->Data[i].BroadcastTextID; + if (!response.Allow && npcText->Data[i].BroadcastTextID) + response.Allow = true; } - - response.Allow = true; } - if (hasText) - SendPacket(response.Write()); - else + + if (!response.Allow) TC_LOG_ERROR("sql.sql", "HandleNpcTextQueryOpcode: no BroadcastTextID found for text %u in `npc_text table`", packet.TextID); + TC_LOG_DEBUG("network", "WORLD: Sent SMSG_NPC_TEXT_UPDATE"); + + SendPacket(response.Write()); } /// Only _static_ data is sent in this packet !!! diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp index 2cbd3078f60..81bffdbde60 100644 --- a/src/server/game/Server/Packets/QueryPackets.cpp +++ b/src/server/game/Server/Packets/QueryPackets.cpp @@ -227,10 +227,10 @@ WorldPacket const* WorldPackets::Query::QueryNPCTextResponse::Write() if (Allow) { - _worldPacket << int32(MAX_GOSSIP_TEXT_OPTIONS * (4 + 4)); - for (uint32 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; ++i) + _worldPacket << int32(MAX_NPC_TEXT_OPTIONS * (4 + 4)); + for (uint32 i = 0; i < MAX_NPC_TEXT_OPTIONS; ++i) _worldPacket << Probabilities[i]; - for (uint32 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; ++i) + for (uint32 i = 0; i < MAX_NPC_TEXT_OPTIONS; ++i) _worldPacket << BroadcastTextID[i]; } diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h index 1c3310b9621..469665e9dda 100644 --- a/src/server/game/Server/Packets/QueryPackets.h +++ b/src/server/game/Server/Packets/QueryPackets.h @@ -168,8 +168,8 @@ namespace WorldPackets uint32 TextID = 0; bool Allow = false; - float Probabilities[MAX_GOSSIP_TEXT_OPTIONS]; - uint32 BroadcastTextID[MAX_GOSSIP_TEXT_OPTIONS]; + float Probabilities[MAX_NPC_TEXT_OPTIONS]; + uint32 BroadcastTextID[MAX_NPC_TEXT_OPTIONS]; }; class DBQueryBulk final : public ClientPacket diff --git a/src/server/game/Server/Packets/TokenPackets.cpp b/src/server/game/Server/Packets/TokenPackets.cpp index 4c466683ed3..af186a1cf4b 100644 --- a/src/server/game/Server/Packets/TokenPackets.cpp +++ b/src/server/game/Server/Packets/TokenPackets.cpp @@ -37,4 +37,4 @@ WorldPacket const* WorldPackets::Token::UpdateListedAuctionableTokensResponse::W } return &_worldPacket; -}
\ No newline at end of file +} diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 6398f5b0dcf..cdbb15bf539 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1508,7 +1508,7 @@ void World::SetInitialWorldSettings() sObjectMgr->LoadGameObjectLocales(); sObjectMgr->LoadQuestTemplateLocale(); sObjectMgr->LoadQuestObjectivesLocale(); - sObjectMgr->LoadNpcTextLocales(); + sObjectMgr->LoadQuestGreetings(); sObjectMgr->LoadPageTextLocales(); sObjectMgr->LoadGossipMenuItemsLocales(); sObjectMgr->LoadPointOfInterestLocales(); @@ -1556,7 +1556,7 @@ void World::SetInitialWorldSettings() sSpellMgr->LoadSpellGroupStackRules(); TC_LOG_INFO("server.loading", "Loading NPC Texts..."); - sObjectMgr->LoadGossipText(); + sObjectMgr->LoadNPCText(); TC_LOG_INFO("server.loading", "Loading Enchant Spells Proc datas..."); sSpellMgr->LoadSpellEnchantProcData(); diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp index 72f0744cd29..c8066ee92e9 100644 --- a/src/server/scripts/Commands/cs_reload.cpp +++ b/src/server/scripts/Commands/cs_reload.cpp @@ -106,7 +106,6 @@ public: { "locales_creature_text", rbac::RBAC_PERM_COMMAND_RELOAD_LOCALES_CRETURE_TEXT, true, &HandleReloadLocalesCreatureTextCommand, "", NULL }, { "locales_gameobject", rbac::RBAC_PERM_COMMAND_RELOAD_LOCALES_GAMEOBJECT, true, &HandleReloadLocalesGameobjectCommand, "", NULL }, { "locales_gossip_menu_option", rbac::RBAC_PERM_COMMAND_RELOAD_LOCALES_GOSSIP_MENU_OPTION, true, &HandleReloadLocalesGossipMenuOptionCommand, "", NULL }, - { "locales_npc_text", rbac::RBAC_PERM_COMMAND_RELOAD_LOCALES_NPC_TEXT, true, &HandleReloadLocalesNpcTextCommand, "", NULL }, { "locales_page_text", rbac::RBAC_PERM_COMMAND_RELOAD_LOCALES_PAGE_TEXT, true, &HandleReloadLocalesPageTextCommand, "", NULL }, { "locales_points_of_interest", rbac::RBAC_PERM_COMMAND_RELOAD_LOCALES_POINTS_OF_INTEREST, true, &HandleReloadLocalesPointsOfInterestCommand, "", NULL }, { "mail_level_reward", rbac::RBAC_PERM_COMMAND_RELOAD_MAIL_LEVEL_REWARD, true, &HandleReloadMailLevelRewardCommand, "", NULL }, @@ -119,6 +118,7 @@ public: { "pickpocketing_loot_template", rbac::RBAC_PERM_COMMAND_RELOAD_PICKPOCKETING_LOOT_TEMPLATE, true, &HandleReloadLootTemplatesPickpocketingCommand, "", NULL }, { "points_of_interest", rbac::RBAC_PERM_COMMAND_RELOAD_POINTS_OF_INTEREST, true, &HandleReloadPointsOfInterestCommand, "", NULL }, { "prospecting_loot_template", rbac::RBAC_PERM_COMMAND_RELOAD_PROSPECTING_LOOT_TEMPLATE, true, &HandleReloadLootTemplatesProspectingCommand, "", NULL }, + { "quest_greeting", rbac::RBAC_PERM_COMMAND_RELOAD_QUEST_GREETING, true, &HandleReloadQuestGreetingCommand, "", NULL }, { "quest_locale", rbac::RBAC_PERM_COMMAND_RELOAD_QUEST_LOCALE, true, &HandleReloadQuestLocaleCommand, "", NULL }, { "quest_poi", rbac::RBAC_PERM_COMMAND_RELOAD_QUEST_POI, true, &HandleReloadQuestPOICommand, "", NULL }, { "quest_template", rbac::RBAC_PERM_COMMAND_RELOAD_QUEST_TEMPLATE, true, &HandleReloadQuestTemplateCommand, "", NULL }, @@ -243,6 +243,7 @@ public: static bool HandleReloadAllQuestCommand(ChatHandler* handler, const char* /*args*/) { HandleReloadQuestAreaTriggersCommand(handler, "a"); + HandleReloadQuestGreetingCommand(handler, "a"); HandleReloadQuestPOICommand(handler, "a"); HandleReloadQuestTemplateCommand(handler, "a"); @@ -311,7 +312,6 @@ public: HandleReloadLocalesCreatureTextCommand(handler, "a"); HandleReloadLocalesGameobjectCommand(handler, "a"); HandleReloadLocalesGossipMenuOptionCommand(handler, "a"); - HandleReloadLocalesNpcTextCommand(handler, "a"); HandleReloadLocalesPageTextCommand(handler, "a"); HandleReloadLocalesPointsOfInterestCommand(handler, "a"); HandleReloadQuestLocaleCommand(handler, "a"); @@ -511,6 +511,14 @@ public: return true; } + static bool HandleReloadQuestGreetingCommand(ChatHandler* handler, const char* /*args*/) + { + TC_LOG_INFO("misc", "Re-Loading Quest Greeting ... "); + sObjectMgr->LoadQuestGreetings(); + handler->SendGlobalGMSysMessage("DB table `quest_greeting` reloaded."); + return true; + } + static bool HandleReloadQuestTemplateCommand(ChatHandler* handler, const char* /*args*/) { TC_LOG_INFO("misc", "Re-Loading Quest Templates..."); @@ -1011,14 +1019,6 @@ public: return true; } - static bool HandleReloadLocalesNpcTextCommand(ChatHandler* handler, const char* /*args*/) - { - TC_LOG_INFO("misc", "Re-Loading Locales NPC Text ... "); - sObjectMgr->LoadNpcTextLocales(); - handler->SendGlobalGMSysMessage("DB table `locales_npc_text` reloaded."); - return true; - } - static bool HandleReloadLocalesPageTextCommand(ChatHandler* handler, const char* /*args*/) { TC_LOG_INFO("misc", "Re-Loading Locales Page Text ... "); |