Core/GameObjects: Implemented gameobject_addon table, you can now set invisibility for gameobjects for quests

(cherry picked from commit 9d59d038f8b09ed036448e755cb0b102396a4ca1)

Conflicts:
	sql/updates/world/2015_04_05_07_world.sql
	src/server/game/Globals/ObjectMgr.cpp
	src/server/game/Globals/ObjectMgr.h

Core/GameObjects: fixed typo and logic (0 is a valid invisibility type)

(cherry picked from commit 23e8a3ce2928458649d94408d5deffb67339b1d6)
This commit is contained in:
Rat authored and DDuarte committed 2015-05-19 11:22:51 +01:00
1 parent 8c61e51fe5
commit 95b5e35745
6 files changed
+92

No files matched your search

@@ -0,0 +1,7 @@
DROP TABLE IF EXISTS `gameobject_addon`;
CREATE TABLE `gameobject_addon` (
`guid` bigint(20) unsigned NOT NULL DEFAULT '0',
`invisibilityType` tinyint(3) unsigned NOT NULL DEFAULT '0',
`invisibilityValue` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`guid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
@@ -271,6 +271,16 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map* map, uint32 phaseMa
SetGoAnimProgress(animprogress);
break;
}
if (GameObjectAddon const* addon = sObjectMgr->GetGameObjectAddon(guidlow))
{
if (addon->InvisibilityValue)
{
m_invisibility.AddFlag(addon->InvisibilityType);
m_invisibility.AddValue(addon->InvisibilityType, addon->InvisibilityValue);
}
}
LastUsedScriptID = GetGOInfo()->ScriptId;
AIM_Initialize();
@@ -576,6 +576,15 @@ struct GameObjectLocale
StringVector CastBarCaption;
};
// `gameobject_addon` table
struct GameObjectAddon
{
InvisibilityType InvisibilityType;
uint32 InvisibilityValue;
};
typedef std::unordered_map<ObjectGuid::LowType, GameObjectAddon> GameObjectAddonContainer;
// client side GO show states
enum GOState
{
+60
View File
@@ -1039,6 +1039,66 @@ void ObjectMgr::LoadCreatureAddons()
TC_LOG_INFO("server.loading", ">> Loaded %u creature addons in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
}
void ObjectMgr::LoadGameObjectAddons()
{
uint32 oldMSTime = getMSTime();
// 0 1 2
QueryResult result = WorldDatabase.Query("SELECT guid, invisibilityType, invisibilityValue FROM gameobject_addon");
if (!result)
{
TC_LOG_INFO("server.loading", ">> Loaded 0 gameobject addon definitions. DB table `gameobject_addon` is empty.");
return;
}
uint32 count = 0;
do
{
Field* fields = result->Fetch();
ObjectGuid::LowType guid = fields[0].GetUInt64();
const GameObjectData* goData = GetGOData(guid);
if (!goData)
{
TC_LOG_ERROR("sql.sql", "GameObject (GUID: " UI64FMTD ") does not exist but has a record in `gameobject_addon`", guid);
continue;
}
GameObjectAddon& gameObjectAddon = _gameObjectAddonStore[guid];
gameObjectAddon.InvisibilityType = InvisibilityType(fields[1].GetUInt8());
gameObjectAddon.InvisibilityValue = fields[2].GetUInt32();
if (gameObjectAddon.InvisibilityType >= TOTAL_INVISIBILITY_TYPES)
{
TC_LOG_ERROR("sql.sql", "GameObject (GUID: " UI64FMTD ") has invalid InvisibilityType in `gameobject_addon`", guid);
gameObjectAddon.InvisibilityType = INVISIBILITY_GENERAL;
gameObjectAddon.InvisibilityValue = 0;
}
if (gameObjectAddon.InvisibilityType && !gameObjectAddon.InvisibilityValue)
{
TC_LOG_ERROR("sql.sql", "GameObject (GUID: " UI64FMTD ") has InvisibilityType set but has no InvisibilityValue in `gameobject_addon`, set to 1", guid);
gameObjectAddon.InvisibilityValue = 1;
}
++count;
}
while (result->NextRow());
TC_LOG_INFO("server.loading", ">> Loaded %u gameobject addons in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
}
GameObjectAddon const* ObjectMgr::GetGameObjectAddon(ObjectGuid::LowType lowguid)
{
GameObjectAddonContainer::const_iterator itr = _gameObjectAddonStore.find(lowguid);
if (itr != _gameObjectAddonStore.end())
return &(itr->second);
return NULL;
}
CreatureAddon const* ObjectMgr::GetCreatureAddon(uint32 lowguid)
{
CreatureAddonContainer::const_iterator itr = _creatureAddonStore.find(lowguid);
+3
View File
@@ -732,6 +732,7 @@ class ObjectMgr
static void ChooseCreatureFlags(CreatureTemplate const* cinfo, uint32& npcflag, uint32& unit_flags, uint32& dynamicflags, CreatureData const* data = NULL);
EquipmentInfo const* GetEquipmentInfo(uint32 entry, int8& id);
CreatureAddon const* GetCreatureAddon(uint32 lowguid);
GameObjectAddon const* GetGameObjectAddon(ObjectGuid::LowType lowguid);
CreatureAddon const* GetCreatureTemplateAddon(uint32 entry);
ItemTemplate const* GetItemTemplate(uint32 entry);
ItemTemplateContainer const* GetItemTemplateStore() const { return &_itemTemplateStore; }
@@ -974,6 +975,7 @@ class ObjectMgr
void LoadLinkedRespawn();
bool SetCreatureLinkedRespawn(uint32 guid, uint32 linkedGuid);
void LoadCreatureAddons();
void LoadGameObjectAddons();
void LoadCreatureModelInfo();
void LoadEquipmentTemplates();
void LoadGameObjectLocales();
@@ -1419,6 +1421,7 @@ class ObjectMgr
CreatureModelContainer _creatureModelStore;
CreatureAddonContainer _creatureAddonStore;
CreatureAddonContainer _creatureTemplateAddonStore;
GameObjectAddonContainer _gameObjectAddonStore;
EquipmentInfoContainer _equipmentInfoStore;
LinkedRespawnContainer _linkedRespawnStore;
CreatureLocaleContainer _creatureLocaleStore;
+3
View File
@@ -1523,6 +1523,9 @@ void World::SetInitialWorldSettings()
TC_LOG_INFO("server.loading", "Loading Gameobject Data...");
sObjectMgr->LoadGameobjects();
TC_LOG_INFO("server.loading", "Loading GameObject Addon Data...");
sObjectMgr->LoadGameObjectAddons(); // must be after LoadGameObjectTemplate() and LoadGameobjects()
TC_LOG_INFO("server.loading", "Loading Creature Linked Respawn...");
sObjectMgr->LoadLinkedRespawn(); // must be after LoadCreatures(), LoadGameObjects()