mirror of
https://github.com/araxiaonline/TrinityCore.git
synced 2026-06-20 15:01:38 -04:00
Core/GameObject: migrated non-WDB fields to new gameobject_template_addon table
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
DROP TABLE IF EXISTS `gameobject_template_addon`;
|
||||
CREATE TABLE `gameobject_template_addon`(
|
||||
`entry` mediumint(8) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`faction` smallint(5) unsigned NOT NULL DEFAULT '0',
|
||||
`flags` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`mingold` mediumint(8) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`maxgold` mediumint(8) UNSIGNED NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`entry`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
INSERT INTO `gameobject_template_addon` (`entry`, `faction`, `flags`, `mingold`, `maxgold`)
|
||||
SELECT `entry`, `faction`, `flags`, `mingold`, `maxgold` FROM `gameobject_template`;
|
||||
|
||||
ALTER TABLE `gameobject_template`
|
||||
DROP COLUMN `faction`,
|
||||
DROP COLUMN `flags`,
|
||||
DROP COLUMN `mingold`,
|
||||
DROP COLUMN `maxgold`;
|
||||
@@ -235,8 +235,11 @@ bool GameObject::Create(ObjectGuid::LowType guidlow, uint32 name_id, Map* map, u
|
||||
|
||||
SetObjectScale(goinfo->size);
|
||||
|
||||
SetUInt32Value(GAMEOBJECT_FACTION, goinfo->faction);
|
||||
SetUInt32Value(GAMEOBJECT_FLAGS, goinfo->flags);
|
||||
if (GameObjectTemplateAddon const* addon = GetTemplateAddon())
|
||||
{
|
||||
SetUInt32Value(GAMEOBJECT_FACTION, addon->faction);
|
||||
SetUInt32Value(GAMEOBJECT_FLAGS, addon->flags);
|
||||
}
|
||||
|
||||
SetEntry(goinfo->entry);
|
||||
|
||||
@@ -627,8 +630,9 @@ void GameObject::Update(uint32 diff)
|
||||
SetGoState(GO_STATE_READY);
|
||||
|
||||
//any return here in case battleground traps
|
||||
if (GetGOInfo()->flags & GO_FLAG_NODESPAWN)
|
||||
return;
|
||||
if (GameObjectTemplateAddon const* addon = GetTemplateAddon())
|
||||
if (addon->flags & GO_FLAG_NODESPAWN)
|
||||
return;
|
||||
}
|
||||
|
||||
loot.clear();
|
||||
@@ -649,7 +653,8 @@ void GameObject::Update(uint32 diff)
|
||||
{
|
||||
SendObjectDeSpawnAnim(GetGUID());
|
||||
//reset flags
|
||||
SetUInt32Value(GAMEOBJECT_FLAGS, GetGOInfo()->flags);
|
||||
if (GameObjectTemplateAddon const* addon = GetTemplateAddon())
|
||||
SetUInt32Value(GAMEOBJECT_FLAGS, addon->flags);
|
||||
}
|
||||
|
||||
if (!m_respawnDelayTime)
|
||||
@@ -676,6 +681,11 @@ void GameObject::Update(uint32 diff)
|
||||
sScriptMgr->OnGameObjectUpdate(this, diff);
|
||||
}
|
||||
|
||||
GameObjectTemplateAddon const* GameObject::GetTemplateAddon() const
|
||||
{
|
||||
return sObjectMgr->GetGameObjectTemplateAddon(GetGOInfo()->entry);
|
||||
}
|
||||
|
||||
void GameObject::Refresh()
|
||||
{
|
||||
// Do not refresh despawned GO from spellcast (GO's from spellcast are destroyed after despawn)
|
||||
@@ -700,7 +710,9 @@ void GameObject::Delete()
|
||||
SendObjectDeSpawnAnim(GetGUID());
|
||||
|
||||
SetGoState(GO_STATE_READY);
|
||||
SetUInt32Value(GAMEOBJECT_FLAGS, GetGOInfo()->flags);
|
||||
|
||||
if (GameObjectTemplateAddon const* addon = GetTemplateAddon())
|
||||
SetUInt32Value(GAMEOBJECT_FLAGS, addon->flags);
|
||||
|
||||
uint32 poolid = GetSpawnId() ? sPoolMgr->IsPartOfAPool<GameObject>(GetSpawnId()) : 0;
|
||||
if (poolid)
|
||||
|
||||
@@ -43,10 +43,6 @@ struct GameObjectTemplate
|
||||
std::string IconName;
|
||||
std::string castBarCaption;
|
||||
std::string unk1;
|
||||
uint32 mingold;
|
||||
uint32 maxgold;
|
||||
uint32 faction;
|
||||
uint32 flags;
|
||||
float size;
|
||||
union // different GO types have different data field
|
||||
{
|
||||
@@ -564,8 +560,19 @@ struct GameObjectTemplate
|
||||
}
|
||||
};
|
||||
|
||||
// From `gameobject_template_addon`
|
||||
struct GameObjectTemplateAddon
|
||||
{
|
||||
uint32 entry;
|
||||
uint32 faction;
|
||||
uint32 flags;
|
||||
uint32 mingold;
|
||||
uint32 maxgold;
|
||||
};
|
||||
|
||||
// Benchmarked: Faster than std::map (insert/find)
|
||||
typedef std::unordered_map<uint32, GameObjectTemplate> GameObjectTemplateContainer;
|
||||
typedef std::unordered_map<uint32, GameObjectTemplateAddon> GameObjectTemplateAddonContainer;
|
||||
|
||||
class OPvPCapturePoint;
|
||||
struct TransportAnimation;
|
||||
@@ -680,6 +687,7 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject<GameObject>
|
||||
bool Create(ObjectGuid::LowType guidlow, uint32 name_id, Map* map, uint32 phaseMask, Position const& pos, G3D::Quat const& rotation, uint32 animprogress, GOState go_state, uint32 artKit = 0);
|
||||
void Update(uint32 p_time) override;
|
||||
GameObjectTemplate const* GetGOInfo() const { return m_goInfo; }
|
||||
GameObjectTemplateAddon const* GetTemplateAddon() const;
|
||||
GameObjectData const* GetGOData() const { return m_goData; }
|
||||
GameObjectValue const* GetGOValue() const { return &m_goValue; }
|
||||
|
||||
|
||||
@@ -8383,7 +8383,8 @@ void Player::SendLoot(ObjectGuid guid, LootType loot_type)
|
||||
group->UpdateLooterGuid(go);
|
||||
}
|
||||
|
||||
loot->generateMoneyLoot(go->GetGOInfo()->mingold, go->GetGOInfo()->maxgold);
|
||||
if (GameObjectTemplateAddon const* addon = go->GetTemplateAddon())
|
||||
loot->generateMoneyLoot(addon->mingold, addon->maxgold);
|
||||
|
||||
if (loot_type == LOOT_FISHING)
|
||||
go->getFishLoot(loot, this);
|
||||
|
||||
@@ -57,7 +57,6 @@ bool Transport::Create(ObjectGuid::LowType guidlow, uint32 entry, uint32 mapid,
|
||||
Object::_Create(guidlow, 0, HighGuid::Mo_Transport);
|
||||
|
||||
GameObjectTemplate const* goinfo = sObjectMgr->GetGameObjectTemplate(entry);
|
||||
|
||||
if (!goinfo)
|
||||
{
|
||||
TC_LOG_ERROR("sql.sql", "Transport not created: entry in `gameobject_template` not found, guidlow: %u map: %u (X: %f Y: %f Z: %f) ang: %f", guidlow, mapid, x, y, z, ang);
|
||||
@@ -81,10 +80,14 @@ bool Transport::Create(ObjectGuid::LowType guidlow, uint32 entry, uint32 mapid,
|
||||
_triggeredArrivalEvent = false;
|
||||
_triggeredDepartureEvent = false;
|
||||
|
||||
if (GameObjectTemplateAddon const* addon = GetTemplateAddon())
|
||||
{
|
||||
SetFaction(addon->faction);
|
||||
SetUInt32Value(GAMEOBJECT_FLAGS, addon->flags);
|
||||
}
|
||||
|
||||
m_goValue.Transport.PathProgress = 0;
|
||||
SetObjectScale(goinfo->size);
|
||||
SetFaction(goinfo->faction);
|
||||
SetUInt32Value(GAMEOBJECT_FLAGS, goinfo->flags);
|
||||
SetPeriod(tInfo->pathTime);
|
||||
SetEntry(goinfo->entry);
|
||||
SetDisplayId(goinfo->displayId);
|
||||
|
||||
@@ -6735,11 +6735,11 @@ void ObjectMgr::LoadGameObjectTemplate()
|
||||
{
|
||||
uint32 oldMSTime = getMSTime();
|
||||
|
||||
// 0 1 2 3 4 5 6 7 8 9 10 11
|
||||
QueryResult result = WorldDatabase.Query("SELECT entry, type, displayId, name, IconName, castBarCaption, unk1, mingold, maxgold, faction, flags, size, "
|
||||
// 12 13 14 15 16 17 18 19 20 21 22 23 24
|
||||
// 0 1 2 3 4 5 6 7
|
||||
QueryResult result = WorldDatabase.Query("SELECT entry, type, displayId, name, IconName, castBarCaption, unk1, size, "
|
||||
// 8 9 10 11 12 13 14 15 16 17 18 19 20
|
||||
"Data0, Data1, Data2, Data3, Data4, Data5, Data6, Data7, Data8, Data9, Data10, Data11, Data12, "
|
||||
// 25 26 27 28 29 30 31 32 33 34 35 36 37
|
||||
// 21 22 23 24 25 26 27 28 29 30 31 32 33
|
||||
"Data13, Data14, Data15, Data16, Data17, Data18, Data19, Data20, Data21, Data22, Data23, AIName, ScriptName "
|
||||
"FROM gameobject_template");
|
||||
|
||||
@@ -6758,7 +6758,6 @@ void ObjectMgr::LoadGameObjectTemplate()
|
||||
uint32 entry = fields[0].GetUInt32();
|
||||
|
||||
GameObjectTemplate& got = _gameObjectTemplateStore[entry];
|
||||
|
||||
got.entry = entry;
|
||||
got.type = uint32(fields[1].GetUInt8());
|
||||
got.displayId = fields[2].GetUInt32();
|
||||
@@ -6766,17 +6765,13 @@ void ObjectMgr::LoadGameObjectTemplate()
|
||||
got.IconName = fields[4].GetString();
|
||||
got.castBarCaption = fields[5].GetString();
|
||||
got.unk1 = fields[6].GetString();
|
||||
got.mingold = fields[7].GetUInt32();
|
||||
got.maxgold = fields[8].GetUInt32();
|
||||
got.faction = uint32(fields[9].GetUInt16());
|
||||
got.flags = fields[10].GetUInt32();
|
||||
got.size = fields[11].GetFloat();
|
||||
got.size = fields[7].GetFloat();
|
||||
|
||||
for (uint8 i = 0; i < MAX_GAMEOBJECT_DATA; ++i)
|
||||
got.raw.data[i] = fields[12 + i].GetInt32(); // data1 and data6 can be -1
|
||||
got.raw.data[i] = fields[8 + i].GetInt32(); // data1 and data6 can be -1
|
||||
|
||||
got.AIName = fields[36].GetString();
|
||||
got.ScriptId = GetScriptId(fields[37].GetString());
|
||||
got.AIName = fields[32].GetString();
|
||||
got.ScriptId = GetScriptId(fields[33].GetString());
|
||||
|
||||
// Checks
|
||||
|
||||
@@ -6911,19 +6906,6 @@ void ObjectMgr::LoadGameObjectTemplate()
|
||||
break;
|
||||
}
|
||||
|
||||
if (got.maxgold > 0)
|
||||
{
|
||||
switch (got.type)
|
||||
{
|
||||
case GAMEOBJECT_TYPE_CHEST:
|
||||
case GAMEOBJECT_TYPE_FISHINGHOLE:
|
||||
break;
|
||||
default:
|
||||
TC_LOG_ERROR("sql.sql", "GameObject (Entry %u GoType: %u) cannot be looted but has maxgold set", entry, got.type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
++count;
|
||||
}
|
||||
while (result->NextRow());
|
||||
@@ -6931,6 +6913,63 @@ void ObjectMgr::LoadGameObjectTemplate()
|
||||
TC_LOG_INFO("server.loading", ">> Loaded %u game object templates in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadGameObjectTemplateAddons()
|
||||
{
|
||||
uint32 oldMSTime = getMSTime();
|
||||
|
||||
// 0 1 2 3 4
|
||||
QueryResult result = WorldDatabase.Query("SELECT entry, faction, flags, mingold, maxgold FROM gameobject_template_addon");
|
||||
|
||||
if (!result)
|
||||
{
|
||||
TC_LOG_INFO("server.loading", ">> Loaded 0 gameobject template addon definitions. DB table `gameobject_template_addon` is empty.");
|
||||
return;
|
||||
}
|
||||
|
||||
uint32 count = 0;
|
||||
do
|
||||
{
|
||||
Field* fields = result->Fetch();
|
||||
|
||||
uint32 entry = fields[0].GetUInt32();
|
||||
|
||||
GameObjectTemplate const* got = sObjectMgr->GetGameObjectTemplate(entry);
|
||||
if (!got)
|
||||
{
|
||||
TC_LOG_ERROR("sql.sql", "GameObject template (Entry: %u) does not exist but has a record in `gameobject_template_addon`", entry);
|
||||
continue;
|
||||
}
|
||||
|
||||
GameObjectTemplateAddon& gameObjectAddon = _gameObjectTemplateAddonStore[entry];
|
||||
gameObjectAddon.faction = uint32(fields[1].GetUInt16());
|
||||
gameObjectAddon.flags = fields[2].GetUInt32();
|
||||
gameObjectAddon.mingold = fields[3].GetUInt32();
|
||||
gameObjectAddon.maxgold = fields[4].GetUInt32();
|
||||
|
||||
// checks
|
||||
if (!sFactionTemplateStore.LookupEntry(gameObjectAddon.faction))
|
||||
TC_LOG_ERROR("sql.sql", "GameObject (Entry: %u) has invalid faction (%u) defined in `gameobject_template_addon`.", entry, gameObjectAddon.faction);
|
||||
|
||||
if (gameObjectAddon.maxgold > 0)
|
||||
{
|
||||
switch (got->type)
|
||||
{
|
||||
case GAMEOBJECT_TYPE_CHEST:
|
||||
case GAMEOBJECT_TYPE_FISHINGHOLE:
|
||||
break;
|
||||
default:
|
||||
TC_LOG_ERROR("sql.sql", "GameObject (Entry %u GoType: %u) cannot be looted but has maxgold set in `gameobject_template_addon`.", entry, got->type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
++count;
|
||||
}
|
||||
while (result->NextRow());
|
||||
|
||||
TC_LOG_INFO("server.loading", ">> Loaded %u game object template addons in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadExplorationBaseXP()
|
||||
{
|
||||
uint32 oldMSTime = getMSTime();
|
||||
@@ -9199,6 +9238,15 @@ GameObjectTemplate const* ObjectMgr::GetGameObjectTemplate(uint32 entry) const
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
GameObjectTemplateAddon const* ObjectMgr::GetGameObjectTemplateAddon(uint32 entry) const
|
||||
{
|
||||
auto itr = _gameObjectTemplateAddonStore.find(entry);
|
||||
if (itr != _gameObjectTemplateAddonStore.end())
|
||||
return &itr->second;
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
CreatureTemplate const* ObjectMgr::GetCreatureTemplate(uint32 entry) const
|
||||
{
|
||||
CreatureTemplateContainer::const_iterator itr = _creatureTemplateStore.find(entry);
|
||||
|
||||
@@ -715,6 +715,7 @@ class TC_GAME_API ObjectMgr
|
||||
int LoadReferenceVendor(int32 vendor, int32 item_id, std::set<uint32> *skip_vendors);
|
||||
|
||||
void LoadGameObjectTemplate();
|
||||
void LoadGameObjectTemplateAddons();
|
||||
|
||||
CreatureTemplate const* GetCreatureTemplate(uint32 entry) const;
|
||||
CreatureTemplateContainer const* GetCreatureTemplates() const { return &_creatureTemplateStore; }
|
||||
@@ -725,6 +726,7 @@ class TC_GAME_API ObjectMgr
|
||||
EquipmentInfo const* GetEquipmentInfo(uint32 entry, int8& id) const;
|
||||
CreatureAddon const* GetCreatureAddon(ObjectGuid::LowType lowguid) const;
|
||||
GameObjectAddon const* GetGameObjectAddon(ObjectGuid::LowType lowguid) const;
|
||||
GameObjectTemplateAddon const* GetGameObjectTemplateAddon(uint32 entry) const;
|
||||
CreatureAddon const* GetCreatureTemplateAddon(uint32 entry) const;
|
||||
ItemTemplate const* GetItemTemplate(uint32 entry) const;
|
||||
ItemTemplateContainer const* GetItemTemplateStore() const { return &_itemTemplateStore; }
|
||||
@@ -1451,6 +1453,7 @@ class TC_GAME_API ObjectMgr
|
||||
GameObjectDataContainer _gameObjectDataStore;
|
||||
GameObjectLocaleContainer _gameObjectLocaleStore;
|
||||
GameObjectTemplateContainer _gameObjectTemplateStore;
|
||||
GameObjectTemplateAddonContainer _gameObjectTemplateAddonStore;
|
||||
/// Stores temp summon data grouped by summoner's entry, summoner's type and group id
|
||||
TempSummonDataContainer _tempSummonDataStore;
|
||||
|
||||
|
||||
@@ -1489,6 +1489,9 @@ void World::SetInitialWorldSettings()
|
||||
TC_LOG_INFO("server.loading", "Loading Game Object Templates..."); // must be after LoadPageTexts
|
||||
sObjectMgr->LoadGameObjectTemplate();
|
||||
|
||||
TC_LOG_INFO("server.loading", "Loading Game Object template addons...");
|
||||
sObjectMgr->LoadGameObjectTemplateAddons();
|
||||
|
||||
TC_LOG_INFO("server.loading", "Loading Transport templates...");
|
||||
sTransportMgr->LoadTransportTemplates();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user