diff options
Diffstat (limited to 'src/server/game')
| -rw-r--r-- | src/server/game/Entities/Creature/Creature.h | 4 | ||||
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObject.h | 4 | ||||
| -rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 96 | ||||
| -rw-r--r-- | src/server/game/Globals/ObjectMgr.h | 22 | ||||
| -rw-r--r-- | src/server/game/Handlers/QueryHandler.cpp | 22 | ||||
| -rw-r--r-- | src/server/game/World/World.cpp | 6 |
6 files changed, 127 insertions, 27 deletions
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 585bc137e0b..0ad76ab2086 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -130,7 +130,6 @@ struct CreatureTemplate float ModDamage; float ModExperience; bool RacialLeader; - uint32 questItems[MAX_CREATURE_QUEST_ITEMS]; uint32 movementId; bool RegenHealth; uint32 MechanicImmuneMask; @@ -167,6 +166,9 @@ struct CreatureTemplate } }; +typedef std::vector<uint32> CreatureQuestItemList; +typedef std::unordered_map<uint32, CreatureQuestItemList> CreatureQuestItemMap; + // Benchmarked: Faster than std::map (insert/find) typedef std::unordered_map<uint32, CreatureTemplate> CreatureTemplateContainer; diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index 5f1d2c793e6..d413d6911a5 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -45,7 +45,6 @@ struct GameObjectTemplate uint32 faction; uint32 flags; float size; - uint32 questItems[MAX_GAMEOBJECT_QUEST_ITEMS]; union // different GO types have different data field { //0 GAMEOBJECT_TYPE_DOOR @@ -620,6 +619,9 @@ struct GameObjectData bool dbData; }; +typedef std::vector<uint32> GameObjectQuestItemList; +typedef std::unordered_map<uint32, GameObjectQuestItemList> GameObjectQuestItemMap; + // For containers: [GO_NOT_READY]->GO_READY (close)->GO_ACTIVATED (open) ->GO_JUST_DEACTIVATED->GO_READY -> ... // For bobber: GO_NOT_READY ->GO_READY (close)->GO_ACTIVATED (open) ->GO_JUST_DEACTIVATED-><deleted> // For door(closed):[GO_NOT_READY]->GO_READY (close)->GO_ACTIVATED (open) ->GO_JUST_DEACTIVATED->GO_READY(close) -> ... diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index b9d828b2dfd..5509bd39039 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -408,8 +408,8 @@ void ObjectMgr::LoadCreatureTemplates() "spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, " // 62 63 64 65 66 67 68 69 "InhabitType, HoverHeight, HealthModifier, ManaModifier, ArmorModifier, DamageModifier, ExperienceModifier, RacialLeader, " - // 70 71 72 73 74 75 76 77 78 79 80 - "questItem1, questItem2, questItem3, questItem4, questItem5, questItem6, movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName " + // 70 71 72 73 74 + "movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName " "FROM creature_template;"); if (!result) @@ -507,14 +507,11 @@ void ObjectMgr::LoadCreatureTemplate(Field* fields) creatureTemplate.ModExperience = fields[68].GetFloat(); creatureTemplate.RacialLeader = fields[69].GetBool(); - for (uint8 i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i) - creatureTemplate.questItems[i] = fields[70 + i].GetUInt32(); - - creatureTemplate.movementId = fields[76].GetUInt32(); - creatureTemplate.RegenHealth = fields[77].GetBool(); - creatureTemplate.MechanicImmuneMask = fields[78].GetUInt32(); - creatureTemplate.flags_extra = fields[79].GetUInt32(); - creatureTemplate.ScriptID = GetScriptId(fields[80].GetCString()); + creatureTemplate.movementId = fields[70].GetUInt32(); + creatureTemplate.RegenHealth = fields[71].GetBool(); + creatureTemplate.MechanicImmuneMask = fields[72].GetUInt32(); + creatureTemplate.flags_extra = fields[73].GetUInt32(); + creatureTemplate.ScriptID = GetScriptId(fields[74].GetCString()); } void ObjectMgr::LoadCreatureTemplateAddons() @@ -6596,11 +6593,11 @@ void ObjectMgr::LoadGameObjectTemplate() { uint32 oldMSTime = getMSTime(); - // 0 1 2 3 4 5 6 7 8 9 10 11 12 - QueryResult result = WorldDatabase.Query("SELECT entry, type, displayId, name, IconName, castBarCaption, unk1, faction, flags, size, questItem1, questItem2, questItem3, " - // 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 - "questItem4, questItem5, questItem6, Data0, Data1, Data2, Data3, Data4, Data5, Data6, Data7, Data8, Data9, Data10, Data11, Data12, " - // 29 30 31 32 33 34 35 36 37 38 39 40 41 + // 0 1 2 3 4 5 6 7 8 9 + QueryResult result = WorldDatabase.Query("SELECT entry, type, displayId, name, IconName, castBarCaption, unk1, faction, flags, size, " + // 10 11 12 13 14 15 16 17 18 19 20 21 22 + "Data0, Data1, Data2, Data3, Data4, Data5, Data6, Data7, Data8, Data9, Data10, Data11, Data12, " + // 23 24 25 26 27 28 29 30 31 32 33 34 35 "Data13, Data14, Data15, Data16, Data17, Data18, Data19, Data20, Data21, Data22, Data23, AIName, ScriptName " "FROM gameobject_template"); @@ -6631,14 +6628,11 @@ void ObjectMgr::LoadGameObjectTemplate() got.flags = fields[8].GetUInt32(); got.size = fields[9].GetFloat(); - for (uint8 i = 0; i < MAX_GAMEOBJECT_QUEST_ITEMS; ++i) - got.questItems[i] = fields[10 + i].GetUInt32(); - for (uint8 i = 0; i < MAX_GAMEOBJECT_DATA; ++i) - got.raw.data[i] = fields[16 + i].GetInt32(); // data1 and data6 can be -1 + got.raw.data[i] = fields[10 + i].GetInt32(); // data1 and data6 can be -1 - got.AIName = fields[40].GetString(); - got.ScriptId = GetScriptId(fields[41].GetCString()); + got.AIName = fields[34].GetString(); + got.ScriptId = GetScriptId(fields[35].GetCString()); // Checks @@ -9122,3 +9116,63 @@ PlayerInfo const* ObjectMgr::GetPlayerInfo(uint32 race, uint32 class_) const return NULL; return info; } + +void ObjectMgr::LoadGameObjectQuestItems() +{ + uint32 oldMSTime = getMSTime(); + + // 0 1 + QueryResult result = WorldDatabase.Query("SELECT GameObjectEntry, ItemId FROM gameobject_questitem ORDER BY Idx ASC"); + + if (!result) + { + TC_LOG_INFO("server.loading", ">> Loaded 0 gameobject quest items. DB table `gameobject_questitem` is empty."); + return; + } + + uint32 count = 0; + do + { + Field* fields = result->Fetch(); + + uint32 entry = fields[0].GetUInt32(); + uint32 item = fields[1].GetUInt32(); + + _gameObjectQuestItemStore[entry].push_back(item); + + ++count; + } + while (result->NextRow()); + + TC_LOG_INFO("server.loading", ">> Loaded %u gameobject quest items in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); +} + +void ObjectMgr::LoadCreatureQuestItems() +{ + uint32 oldMSTime = getMSTime(); + + // 0 1 + QueryResult result = WorldDatabase.Query("SELECT CreatureEntry, ItemId FROM creature_questitem ORDER BY Idx ASC"); + + if (!result) + { + TC_LOG_INFO("server.loading", ">> Loaded 0 creature quest items. DB table `creature_questitem` is empty."); + return; + } + + uint32 count = 0; + do + { + Field* fields = result->Fetch(); + + uint32 entry = fields[0].GetUInt32(); + uint32 item = fields[1].GetUInt32(); + + _creatureQuestItemStore[entry].push_back(item); + + ++count; + } + while (result->NextRow()); + + TC_LOG_INFO("server.loading", ">> Loaded %u creature quest items in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); +} diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index f18e39077f3..267a2c555a2 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -753,6 +753,24 @@ class ObjectMgr ObjectGuid GetPlayerGUIDByName(std::string const& name) const; + GameObjectQuestItemList const* GetGameObjectQuestItemList(uint32 id) const + { + GameObjectQuestItemMap::const_iterator itr = _gameObjectQuestItemStore.find(id); + if (itr != _gameObjectQuestItemStore.end()) + return &itr->second; + return NULL; + } + GameObjectQuestItemMap const* GetGameObjectQuestItemMap() const { return &_gameObjectQuestItemStore; } + + CreatureQuestItemList const* GetCreatureQuestItemList(uint32 id) const + { + CreatureQuestItemMap::const_iterator itr = _creatureQuestItemStore.find(id); + if (itr != _creatureQuestItemStore.end()) + return &itr->second; + return NULL; + } + CreatureQuestItemMap const* GetCreatureQuestItemMap() const { return &_creatureQuestItemStore; } + /** * Retrieves the player name by guid. * @@ -960,6 +978,8 @@ class ObjectMgr void LoadCreatureTemplateAddons(); void LoadCreatureTemplate(Field* fields); void CheckCreatureTemplate(CreatureTemplate const* cInfo); + void LoadGameObjectQuestItems(); + void LoadCreatureQuestItems(); void LoadTempSummons(); void LoadCreatures(); void LoadLinkedRespawn(); @@ -1412,6 +1432,8 @@ class ObjectMgr CreatureAddonContainer _creatureAddonStore; CreatureAddonContainer _creatureTemplateAddonStore; GameObjectAddonContainer _gameObjectAddonStore; + GameObjectQuestItemMap _gameObjectQuestItemStore; + CreatureQuestItemMap _creatureQuestItemStore; EquipmentInfoContainer _equipmentInfoStore; LinkedRespawnContainer _linkedRespawnStore; CreatureLocaleContainer _creatureLocaleStore; diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index d15f21f4ad3..03782481ef7 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -131,8 +131,15 @@ void WorldSession::HandleCreatureQueryOpcode(WorldPacket& recvData) data << float(ci->ModHealth); // dmg/hp modifier data << float(ci->ModMana); // dmg/mana modifier data << uint8(ci->RacialLeader); - for (uint32 i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i) - data << uint32(ci->questItems[i]); // itemId[6], quest drop + + CreatureQuestItemList const* items = sObjectMgr->GetCreatureQuestItemList(entry); + if (items) + for (size_t i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i) + data << (i < items->size() ? uint32((*items)[i]) : uint32(0)); + else + for (size_t i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i) + data << uint32(0); + data << uint32(ci->movementId); // CreatureMovementInfo.dbc SendPacket(&data); TC_LOG_DEBUG("network", "WORLD: Sent SMSG_CREATURE_QUERY_RESPONSE"); @@ -188,8 +195,15 @@ void WorldSession::HandleGameObjectQueryOpcode(WorldPacket& recvData) data << info->unk1; // 2.0.3, string data.append(info->raw.data, MAX_GAMEOBJECT_DATA); data << float(info->size); // go size - for (uint32 i = 0; i < MAX_GAMEOBJECT_QUEST_ITEMS; ++i) - data << uint32(info->questItems[i]); // itemId[6], quest drop + + GameObjectQuestItemList const* items = sObjectMgr->GetGameObjectQuestItemList(entry); + if (items) + for (size_t i = 0; i < MAX_GAMEOBJECT_QUEST_ITEMS; ++i) + data << (i < items->size() ? uint32((*items)[i]) : uint32(0)); + else + for (size_t i = 0; i < MAX_GAMEOBJECT_QUEST_ITEMS; ++i) + data << uint32(0); + SendPacket(&data); TC_LOG_DEBUG("network", "WORLD: Sent SMSG_GAMEOBJECT_QUERY_RESPONSE"); } diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index c4b2eb768c6..7cddfc3f61e 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1527,6 +1527,12 @@ void World::SetInitialWorldSettings() TC_LOG_INFO("server.loading", "Loading GameObject Addon Data..."); sObjectMgr->LoadGameObjectAddons(); // must be after LoadGameObjectTemplate() and LoadGameobjects() + TC_LOG_INFO("server.loading", "Loading GameObject Quest Items..."); + sObjectMgr->LoadGameObjectQuestItems(); + + TC_LOG_INFO("server.loading", "Loading Creature Quest Items..."); + sObjectMgr->LoadCreatureQuestItems(); + TC_LOG_INFO("server.loading", "Loading Creature Linked Respawn..."); sObjectMgr->LoadLinkedRespawn(); // must be after LoadCreatures(), LoadGameObjects() |
