diff options
author | ariel- <ariel-@users.noreply.github.com> | 2017-12-18 10:59:47 -0300 |
---|---|---|
committer | ariel- <ariel-@users.noreply.github.com> | 2017-12-18 10:59:47 -0300 |
commit | 00c0ec3f2784e67f4ccc7616bf65aa7e5496687a (patch) | |
tree | 2b72e7dc0e96ec009c4fa52f6e76ef15118bd6d8 | |
parent | 143b2aeac06348c1d08f47f60ad32a306587cb50 (diff) |
Core/Creatures: fixed school immunity unapply when updating entry and unified code
- Also use correct data type for SQL (INT <-> uint32)
-rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 31 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/Creature.h | 3 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/CreatureData.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Pet/Pet.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/SharedDefines.h | 7 |
6 files changed, 18 insertions, 29 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 49f2f7d977a..d514011f047 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -612,8 +612,7 @@ bool Creature::UpdateEntry(uint32 entry, CreatureData const* data /*= nullptr*/, UpdateMovementFlags(); LoadCreaturesAddon(); - LoadMechanicTemplateImmunity(); - LoadSpellTemplateImmunity(); + LoadTemplateImmunities(); return true; } @@ -2033,7 +2032,7 @@ void Creature::DespawnOrUnsummon(uint32 msTimeToDespawn /*= 0*/, Seconds const& ForcedDespawn(msTimeToDespawn, forceRespawnTimer); } -void Creature::LoadMechanicTemplateImmunity() +void Creature::LoadTemplateImmunities() { // uint32 max used for "spell id", the immunity system will not perform SpellInfo checks against invalid spells // used so we know which immunities were loaded from template @@ -2043,6 +2042,9 @@ void Creature::LoadMechanicTemplateImmunity() for (uint32 i = MECHANIC_NONE + 1; i < MAX_MECHANIC; ++i) ApplySpellImmune(placeholderSpellId, IMMUNITY_MECHANIC, i, false); + for (uint32 i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i) + ApplySpellImmune(placeholderSpellId, IMMUNITY_SCHOOL, 1 << i, false); + // don't inherit immunities for hunter pets if (GetOwnerGUID().IsPlayer() && IsHunterPet()) return; @@ -2055,26 +2057,15 @@ void Creature::LoadMechanicTemplateImmunity() ApplySpellImmune(placeholderSpellId, IMMUNITY_MECHANIC, i, true); } } -} - -void Creature::LoadSpellTemplateImmunity() -{ - // uint32 max used for "spell id", the immunity system will not perform SpellInfo checks against invalid spells - // used so we know which immunities were loaded from template - static uint32 const placeholderSpellId = std::numeric_limits<uint32>::max(); - - // unapply template immunities (in case we're updating entry) - for (uint8 i = SPELL_SCHOOL_NORMAL; i <= SPELL_SCHOOL_ARCANE; ++i) - ApplySpellImmune(placeholderSpellId, IMMUNITY_SCHOOL, i, false); - // don't inherit immunities for hunter pets - if (GetOwnerGUID().IsPlayer() && IsHunterPet()) - return; - - if (uint8 mask = GetCreatureTemplate()->SpellSchoolImmuneMask) - for (uint8 i = SPELL_SCHOOL_NORMAL; i <= SPELL_SCHOOL_ARCANE; ++i) + if (uint32 mask = GetCreatureTemplate()->SpellSchoolImmuneMask) + { + for (uint8 i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i) + { if (mask & (1 << i)) ApplySpellImmune(placeholderSpellId, IMMUNITY_SCHOOL, 1 << i, true); + } + } } bool Creature::IsImmunedToSpell(SpellInfo const* spellInfo, Unit* caster) const diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 148bfe6ab16..3d4d7191bf1 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -106,8 +106,7 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma bool isCanInteractWithBattleMaster(Player* player, bool msg) const; bool isCanTrainingAndResetTalentsOf(Player* player) const; bool CanCreatureAttack(Unit const* victim, bool force = true) const; - void LoadMechanicTemplateImmunity(); - void LoadSpellTemplateImmunity(); + void LoadTemplateImmunities(); bool IsImmunedToSpell(SpellInfo const* spellInfo, Unit* caster) const override; bool IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index, Unit* caster) const override; bool isElite() const; diff --git a/src/server/game/Entities/Creature/CreatureData.h b/src/server/game/Entities/Creature/CreatureData.h index ef0bb7b59a4..6f215b71a4d 100644 --- a/src/server/game/Entities/Creature/CreatureData.h +++ b/src/server/game/Entities/Creature/CreatureData.h @@ -144,7 +144,7 @@ struct TC_GAME_API CreatureTemplate uint32 movementId; bool RegenHealth; uint32 MechanicImmuneMask; - uint8 SpellSchoolImmuneMask; + uint32 SpellSchoolImmuneMask; uint32 flags_extra; uint32 ScriptID; WorldPacket QueryData[TOTAL_LOCALES]; diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index 6890113178a..9b5ab8ff2c6 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -372,7 +372,7 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petEntry, uint32 petnumber, bool c owner->ToPlayer()->SetLastPetNumber(petId); // must be after SetMinion (owner guid check) - LoadMechanicTemplateImmunity(); + LoadTemplateImmunities(); m_loading = false; return true; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 69470e119c6..7f25e51791f 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -514,7 +514,7 @@ void ObjectMgr::LoadCreatureTemplate(Field* fields) creatureTemplate.movementId = fields[70].GetUInt32(); creatureTemplate.RegenHealth = fields[71].GetBool(); creatureTemplate.MechanicImmuneMask = fields[72].GetUInt32(); - creatureTemplate.SpellSchoolImmuneMask = fields[73].GetUInt8(); + creatureTemplate.SpellSchoolImmuneMask = fields[73].GetUInt32(); creatureTemplate.flags_extra = fields[74].GetUInt32(); creatureTemplate.ScriptID = GetScriptId(fields[75].GetString()); } diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 4e34c20ebb4..1fa8861d488 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -244,11 +244,10 @@ enum SpellSchools SPELL_SCHOOL_NATURE = 3, SPELL_SCHOOL_FROST = 4, SPELL_SCHOOL_SHADOW = 5, - SPELL_SCHOOL_ARCANE = 6 + SPELL_SCHOOL_ARCANE = 6, + MAX_SPELL_SCHOOL = 7 }; -#define MAX_SPELL_SCHOOL 7 - enum SpellSchoolMask { SPELL_SCHOOL_MASK_NONE = 0x00, // not exist @@ -1287,7 +1286,7 @@ enum Mechanics MECHANIC_IMMUNE_SHIELD = 29, // Divine (Blessing) Shield/Protection and Ice Block MECHANIC_SAPPED = 30, MECHANIC_ENRAGED = 31, - MAX_MECHANIC = 32 + MAX_MECHANIC = 32 }; // Used for spell 42292 Immune Movement Impairment and Loss of Control (0x49967ca6) |