From a2537e7954820ce2a16b1eb13a67892f4246151e Mon Sep 17 00:00:00 2001 From: Charles A Edwards Date: Wed, 10 Aug 2016 14:31:06 +0100 Subject: [PATCH] Script refactoring done as per previous cores Script name now no longer exists in creature_template, item_template, instance_template, and gameobject_template. They are now held in the script_binding table. --- src/game/Object/Creature.cpp | 3 +- src/game/Object/Creature.h | 1 - src/game/Object/GameObject.h | 1 - src/game/Object/ItemPrototype.h | 3 +- src/game/Object/ObjectMgr.cpp | 2 +- src/game/Server/SQLStorages.cpp | 17 ++++----- src/game/WorldHandlers/Map.cpp | 63 ++++++++++++++++++++++++++++++++- src/game/WorldHandlers/Map.h | 1 - 8 files changed, 75 insertions(+), 16 deletions(-) diff --git a/src/game/Object/Creature.cpp b/src/game/Object/Creature.cpp index 13e5a802b..7b1ca1f98 100644 --- a/src/game/Object/Creature.cpp +++ b/src/game/Object/Creature.cpp @@ -2339,7 +2339,8 @@ std::string Creature::GetScriptName() const uint32 Creature::GetScriptId() const { - return ObjectMgr::GetCreatureTemplate(GetEntry())->ScriptID; + // scripts bound to DB guid have priority over ones bound to creature entry + return sScriptMgr.GetBoundScriptId(SCRIPTED_UNIT, -int32(GetGUIDLow())) ? sScriptMgr.GetBoundScriptId(SCRIPTED_UNIT, -int32(GetGUIDLow())) : sScriptMgr.GetBoundScriptId(SCRIPTED_UNIT, GetEntry()); } VendorItemData const* Creature::GetVendorItems() const diff --git a/src/game/Object/Creature.h b/src/game/Object/Creature.h index e27b38aca..8d2e54421 100644 --- a/src/game/Object/Creature.h +++ b/src/game/Object/Creature.h @@ -145,7 +145,6 @@ struct CreatureInfo uint32 vendorId; uint32 MechanicImmuneMask; uint32 ExtraFlags; - uint32 ScriptID; // helpers HighGuid GetHighGuid() const diff --git a/src/game/Object/GameObject.h b/src/game/Object/GameObject.h index 8e54f7565..7dd8115bb 100644 --- a/src/game/Object/GameObject.h +++ b/src/game/Object/GameObject.h @@ -426,7 +426,6 @@ struct GameObjectInfo uint32 unk2; uint32 MinMoneyLoot; uint32 MaxMoneyLoot; - uint32 ScriptId; // helpers bool IsDespawnAtAction() const diff --git a/src/game/Object/ItemPrototype.h b/src/game/Object/ItemPrototype.h index 5739a003c..05e69e622 100644 --- a/src/game/Object/ItemPrototype.h +++ b/src/game/Object/ItemPrototype.h @@ -622,8 +622,7 @@ struct ItemPrototype float ArmorDamageModifier; uint32 Duration; uint32 ItemLimitCategory; // id from ItemLimitCategory.dbc - uint32 HolidayId; // id from Holidays.dbc - uint32 ScriptId; + uint32 HolidayId; uint32 DisenchantID; uint32 FoodType; float StatScalingFactor; diff --git a/src/game/Object/ObjectMgr.cpp b/src/game/Object/ObjectMgr.cpp index 478f9f864..3381a012b 100644 --- a/src/game/Object/ObjectMgr.cpp +++ b/src/game/Object/ObjectMgr.cpp @@ -571,7 +571,7 @@ void ObjectMgr::LoadCreatureTemplates() continue; } - if (difficultyInfo->ScriptID) + if (sScriptMgr.GetBoundScriptId(SCRIPTED_UNIT, difficultyInfo->Entry)) { sLog.outErrorDb("Difficulty %u mode creature (Entry: %u) has `ScriptName`, but in any case will used difficulty 0 mode creature (Entry: %u) ScriptName.", diff + 1, cInfo->DifficultyEntry[diff], i); diff --git a/src/game/Server/SQLStorages.cpp b/src/game/Server/SQLStorages.cpp index 710f16e72..14aaad7fd 100644 --- a/src/game/Server/SQLStorages.cpp +++ b/src/game/Server/SQLStorages.cpp @@ -44,20 +44,21 @@ // }; // -const char CreatureInfosrcfmt[] = "iiiiiiiiiisssiiiiiiiiiiifffiffiifiiiiiiiiiiiffiiiiiiiiiiiiiiisiiffliiiiiiiliiiiiis"; -const char CreatureInfodstfmt[] = "iiiiiiiiiisssiiiiiiiiiiifffiffiifiiiiiiiiiiiffiiiiiiiiiiiiiiisiiffliiiiiiiliiiiiii"; +const char CreatureInfosrcfmt[] = "iiiiiiiiiisssiiiiiiiiiiifffiffiifiiiiiiiiiiiffiiiiiiiiiiiiiiisiiffliiiiiiiliiiiii"; +const char CreatureInfodstfmt[] = "iiiiiiiiiisssiiiiiiiiiiifffiffiifiiiiiiiiiiiffiiiiiiiiiiiiiiisiiffliiiiiiiliiiiii"; const char CreatureDataAddonInfofmt[] = "iiibbiis"; const char CreatureModelfmt[] = "iffbii"; const char CreatureInfoAddonInfofmt[] = "iiibbiis"; const char GameObjectInfoAddonInfofmt[] = "iffff"; const char EquipmentInfofmt[] = "iiii"; -const char GameObjectInfosrcfmt[] = "iiissssiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiis"; -const char GameObjectInfodstfmt[] = "iiissssiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"; -const char ItemPrototypesrcfmt[] = "iiiisiiiiffiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiifiiisiifiiiii"; -const char ItemPrototypedstfmt[] = "iiiisiiiiffiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiifiiiiiifiiiii"; +const char GameObjectInfosrcfmt[] = "iiissssiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"; +const char GameObjectInfodstfmt[] = "iiissssiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"; +// 1 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 +const char ItemPrototypesrcfmt[] = "iiiisiiiiffiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiifiiiiifiiiii"; +const char ItemPrototypedstfmt[] = "iiiisiiiiffiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiifiiiiifiiiii"; const char PageTextfmt[] = "isi"; -const char InstanceTemplatesrcfmt[] = "iiiis"; -const char InstanceTemplatedstfmt[] = "iiiii"; +const char InstanceTemplatesrcfmt[] = "iiii"; +const char InstanceTemplatedstfmt[] = "iiii"; const char WorldTemplatesrcfmt[] = "is"; const char WorldTemplatedstfmt[] = "ii"; const char ConditionsSrcFmt[] = "iiii"; diff --git a/src/game/WorldHandlers/Map.cpp b/src/game/WorldHandlers/Map.cpp index 5809b1dc0..52ea6d908 100644 --- a/src/game/WorldHandlers/Map.cpp +++ b/src/game/WorldHandlers/Map.cpp @@ -1191,6 +1191,67 @@ void Map::RemoveFromActive(WorldObject* obj) } } +void Map::CreateInstanceData(bool load) +{ + if (i_data != NULL) + { + return; + } + + uint32 i_script_id = GetScriptId(); + + if (!i_script_id) + { + return; + } + + i_data = sScriptMgr.CreateInstanceData(this); + if (!i_data) + { + return; + } + + if (load) + { + // TODO: make a global storage for this + QueryResult* result; + + if (Instanceable()) + { + result = CharacterDatabase.PQuery("SELECT data FROM instance WHERE id = '%u'", i_InstanceId); + } + else + { + result = CharacterDatabase.PQuery("SELECT data FROM world WHERE map = '%u'", GetId()); + } + + if (result) + { + Field* fields = result->Fetch(); + const char* data = fields[0].GetString(); + if (data) + { + DEBUG_LOG("Loading instance data for `%s` (Map: %u Instance: %u)", sScriptMgr.GetScriptName(i_script_id), GetId(), i_InstanceId); + i_data->Load(data); + } + delete result; + } + else + { + // for non-instanceable map always add data to table if not found, later code expected that for map in `word` exist always after load + if (!Instanceable()) + { + CharacterDatabase.PExecute("INSERT INTO world VALUES ('%u', '')", GetId()); + } + } + } + else + { + DEBUG_LOG("New instance data, \"%s\" ,initialized!", sScriptMgr.GetScriptName(i_script_id)); + i_data->Initialize(); + } +} +/* void Map::CreateInstanceData(bool load) { if (i_data != NULL) @@ -1247,7 +1308,7 @@ void Map::CreateInstanceData(bool load) DEBUG_LOG("New instance data, \"%s\" ,initialized!", sScriptMgr.GetScriptName(i_script_id)); i_data->Initialize(); } -} +} */ void Map::SetWeather(uint32 zoneId, WeatherType type, float grade, bool permanently) { diff --git a/src/game/WorldHandlers/Map.h b/src/game/WorldHandlers/Map.h index 048780c9f..1c8abbdb1 100644 --- a/src/game/WorldHandlers/Map.h +++ b/src/game/WorldHandlers/Map.h @@ -78,7 +78,6 @@ struct InstanceTemplate // or 0 (not related to continent 0 map id) uint32 levelMin; uint32 levelMax; - uint32 script_id; }; struct WorldTemplate