diff options
author | ShinDarth <borzifrancesco@gmail.com> | 2015-06-21 13:32:51 +0200 |
---|---|---|
committer | ShinDarth <borzifrancesco@gmail.com> | 2015-06-29 19:21:00 +0200 |
commit | 1c0b0f825c70c2fee8c3c5280e5015275056624e (patch) | |
tree | 1679ef261145634aa186815bd93407bf8ed5f997 /src | |
parent | 6b43e72f019b6a91be812f4e4da58a4dae7c21a6 (diff) |
DB/World schema backport: move questItem* fields to *_questitem tables
Diffstat (limited to 'src')
-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 | ||||
-rw-r--r-- | src/server/shared/Database/Implementation/WorldDatabase.cpp | 2 |
7 files changed, 128 insertions, 28 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() diff --git a/src/server/shared/Database/Implementation/WorldDatabase.cpp b/src/server/shared/Database/Implementation/WorldDatabase.cpp index 4532f87d406..d9aad94293e 100644 --- a/src/server/shared/Database/Implementation/WorldDatabase.cpp +++ b/src/server/shared/Database/Implementation/WorldDatabase.cpp @@ -76,7 +76,7 @@ void WorldDatabaseConnection::DoPrepareStatements() PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_ID_BY_GUID, "SELECT id FROM waypoint_scripts WHERE guid = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_DEL_CREATURE, "DELETE FROM creature WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(WORLD_SEL_COMMANDS, "SELECT name, permission, help FROM command", CONNECTION_SYNCH); - PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction, npcflag, speed_walk, speed_run, scale, rank, dmgschool, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, dynamicflags, family, trainer_type, trainer_spell, trainer_class, trainer_race, type, type_flags, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, HealthModifier, ManaModifier, ArmorModifier, DamageModifier, ExperienceModifier, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, questItem6, movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = ?", CONNECTION_SYNCH); + PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction, npcflag, speed_walk, speed_run, scale, rank, dmgschool, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, dynamicflags, family, trainer_type, trainer_spell, trainer_class, trainer_race, type, type_flags, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, HealthModifier, ManaModifier, ArmorModifier, DamageModifier, ExperienceModifier, RacialLeader, movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_BY_ID, "SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_ITEM_TEMPLATE_BY_NAME, "SELECT entry FROM item_template WHERE name = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_CREATURE_BY_ID, "SELECT guid FROM creature WHERE id = ?", CONNECTION_SYNCH); |