mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 07:37:01 +00:00
[8176] Forbid using some monster movement flags (that can crash client) in creature*_addon tables.moveflag tables field.
Also refactoring creature addon tables loading.
This commit is contained in:
parent
647e1c5a8b
commit
c96f8e3d9f
4 changed files with 50 additions and 55 deletions
|
|
@ -800,67 +800,59 @@ void ObjectMgr::ConvertCreatureAddonAuras(CreatureDataAddon* addon, char const*
|
||||||
endAura.effect_idx = 0;
|
endAura.effect_idx = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ObjectMgr::LoadCreatureAddons(SQLStorage& creatureaddons, char const* entryName, char const* comment)
|
||||||
|
{
|
||||||
|
creatureaddons.Load();
|
||||||
|
|
||||||
|
sLog.outString(">> Loaded %u %s", creatureaddons.RecordCount, comment);
|
||||||
|
sLog.outString();
|
||||||
|
|
||||||
|
// check data correctness and convert 'auras'
|
||||||
|
for(uint32 i = 1; i < creatureaddons.MaxEntry; ++i)
|
||||||
|
{
|
||||||
|
CreatureDataAddon const* addon = creatureaddons.LookupEntry<CreatureDataAddon>(i);
|
||||||
|
if(!addon)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (addon->mount)
|
||||||
|
{
|
||||||
|
if (!sCreatureDisplayInfoStore.LookupEntry(addon->mount))
|
||||||
|
{
|
||||||
|
sLog.outErrorDb("Creature (%s %u) have invalid displayInfoId for mount (%u) defined in `%s`.", entryName, addon->guidOrEntry, addon->mount, creatureaddons.GetTableName());
|
||||||
|
const_cast<CreatureDataAddon*>(addon)->mount = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!sEmotesStore.LookupEntry(addon->emote))
|
||||||
|
sLog.outErrorDb("Creature (%s %u) have invalid emote (%u) defined in `%s`.", entryName, addon->guidOrEntry, addon->emote, creatureaddons.GetTableName());
|
||||||
|
|
||||||
|
if (addon->move_flags & (MONSTER_MOVE_UNK1|MONSTER_MOVE_UNK4))
|
||||||
|
{
|
||||||
|
sLog.outErrorDb("Creature (%s %u) movement flags mask defined in `%s` include forbidden flags (" I32FMT ") that can crash client, cleanup at load.", entryName, addon->guidOrEntry, creatureaddons.GetTableName(), (MONSTER_MOVE_UNK1|MONSTER_MOVE_UNK4));
|
||||||
|
const_cast<CreatureDataAddon*>(addon)->move_flags &= ~(MONSTER_MOVE_UNK1|MONSTER_MOVE_UNK4);
|
||||||
|
}
|
||||||
|
|
||||||
|
ConvertCreatureAddonAuras(const_cast<CreatureDataAddon*>(addon), creatureaddons.GetTableName(), entryName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ObjectMgr::LoadCreatureAddons()
|
void ObjectMgr::LoadCreatureAddons()
|
||||||
{
|
{
|
||||||
sCreatureInfoAddonStorage.Load();
|
LoadCreatureAddons(sCreatureInfoAddonStorage,"Entry","creature template addons");
|
||||||
|
|
||||||
sLog.outString( ">> Loaded %u creature template addons", sCreatureInfoAddonStorage.RecordCount );
|
// check entry ids
|
||||||
sLog.outString();
|
|
||||||
|
|
||||||
// check data correctness and convert 'auras'
|
|
||||||
for(uint32 i = 1; i < sCreatureInfoAddonStorage.MaxEntry; ++i)
|
for(uint32 i = 1; i < sCreatureInfoAddonStorage.MaxEntry; ++i)
|
||||||
{
|
if(CreatureDataAddon const* addon = sCreatureInfoAddonStorage.LookupEntry<CreatureDataAddon>(i))
|
||||||
CreatureDataAddon const* addon = sCreatureInfoAddonStorage.LookupEntry<CreatureDataAddon>(i);
|
if(!sCreatureStorage.LookupEntry<CreatureInfo>(addon->guidOrEntry))
|
||||||
if(!addon)
|
sLog.outErrorDb("Creature (Entry: %u) does not exist but has a record in `%s`",addon->guidOrEntry, sCreatureInfoAddonStorage.GetTableName());
|
||||||
continue;
|
|
||||||
|
|
||||||
if (addon->mount)
|
LoadCreatureAddons(sCreatureDataAddonStorage,"GUID","creature addons");
|
||||||
{
|
|
||||||
if (!sCreatureDisplayInfoStore.LookupEntry(addon->mount))
|
|
||||||
{
|
|
||||||
sLog.outErrorDb("Creature (Entry %u) have invalid displayInfoId for mount (%u) defined in `creature_template_addon`.",addon->guidOrEntry, addon->mount);
|
|
||||||
const_cast<CreatureDataAddon*>(addon)->mount = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sEmotesStore.LookupEntry(addon->emote))
|
// check entry ids
|
||||||
sLog.outErrorDb("Creature (Entry %u) have invalid emote (%u) defined in `creature_template_addon`.",addon->guidOrEntry, addon->emote);
|
|
||||||
|
|
||||||
ConvertCreatureAddonAuras(const_cast<CreatureDataAddon*>(addon), "creature_template_addon", "Entry");
|
|
||||||
|
|
||||||
if(!sCreatureStorage.LookupEntry<CreatureInfo>(addon->guidOrEntry))
|
|
||||||
sLog.outErrorDb("Creature (Entry: %u) does not exist but has a record in `creature_template_addon`",addon->guidOrEntry);
|
|
||||||
}
|
|
||||||
|
|
||||||
sCreatureDataAddonStorage.Load();
|
|
||||||
|
|
||||||
sLog.outString( ">> Loaded %u creature addons", sCreatureDataAddonStorage.RecordCount );
|
|
||||||
sLog.outString();
|
|
||||||
|
|
||||||
// check data correctness and convert 'auras'
|
|
||||||
for(uint32 i = 1; i < sCreatureDataAddonStorage.MaxEntry; ++i)
|
for(uint32 i = 1; i < sCreatureDataAddonStorage.MaxEntry; ++i)
|
||||||
{
|
if(CreatureDataAddon const* addon = sCreatureDataAddonStorage.LookupEntry<CreatureDataAddon>(i))
|
||||||
CreatureDataAddon const* addon = sCreatureDataAddonStorage.LookupEntry<CreatureDataAddon>(i);
|
if(mCreatureDataMap.find(addon->guidOrEntry)==mCreatureDataMap.end())
|
||||||
if(!addon)
|
sLog.outErrorDb("Creature (GUID: %u) does not exist but has a record in `creature_addon`",addon->guidOrEntry);
|
||||||
continue;
|
|
||||||
|
|
||||||
if (addon->mount)
|
|
||||||
{
|
|
||||||
if (!sCreatureDisplayInfoStore.LookupEntry(addon->mount))
|
|
||||||
{
|
|
||||||
sLog.outErrorDb("Creature (GUID %u) have invalid displayInfoId for mount (%u) defined in `creature_addon`.",addon->guidOrEntry, addon->mount);
|
|
||||||
const_cast<CreatureDataAddon*>(addon)->mount = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sEmotesStore.LookupEntry(addon->emote))
|
|
||||||
sLog.outErrorDb("Creature (GUID %u) have invalid emote (%u) defined in `creature_addon`.",addon->guidOrEntry, addon->emote);
|
|
||||||
|
|
||||||
ConvertCreatureAddonAuras(const_cast<CreatureDataAddon*>(addon), "creature_addon", "GUIDLow");
|
|
||||||
|
|
||||||
if(mCreatureDataMap.find(addon->guidOrEntry)==mCreatureDataMap.end())
|
|
||||||
sLog.outErrorDb("Creature (GUID: %u) does not exist but has a record in `creature_addon`",addon->guidOrEntry);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EquipmentInfo const* ObjectMgr::GetEquipmentInfo(uint32 entry)
|
EquipmentInfo const* ObjectMgr::GetEquipmentInfo(uint32 entry)
|
||||||
|
|
|
||||||
|
|
@ -844,6 +844,7 @@ class ObjectMgr
|
||||||
private:
|
private:
|
||||||
void LoadScripts(ScriptMapMap& scripts, char const* tablename);
|
void LoadScripts(ScriptMapMap& scripts, char const* tablename);
|
||||||
void CheckScripts(ScriptMapMap const& scripts,std::set<int32>& ids);
|
void CheckScripts(ScriptMapMap const& scripts,std::set<int32>& ids);
|
||||||
|
void LoadCreatureAddons(SQLStorage& creatureaddons, char const* entryName, char const* comment);
|
||||||
void ConvertCreatureAddonAuras(CreatureDataAddon* addon, char const* table, char const* guidEntryStr);
|
void ConvertCreatureAddonAuras(CreatureDataAddon* addon, char const* table, char const* guidEntryStr);
|
||||||
void LoadQuestRelationsHelper(QuestRelations& map,char const* table);
|
void LoadQuestRelationsHelper(QuestRelations& map,char const* table);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,8 @@ class SQLStorage
|
||||||
uint32 MaxEntry;
|
uint32 MaxEntry;
|
||||||
uint32 iNumFields;
|
uint32 iNumFields;
|
||||||
|
|
||||||
|
char const* GetTableName() const { return table; }
|
||||||
|
|
||||||
void Load();
|
void Load();
|
||||||
void Free();
|
void Free();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "8175"
|
#define REVISION_NR "8176"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue