aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorariel- <ariel-@users.noreply.github.com>2017-12-18 10:59:47 -0300
committerariel- <ariel-@users.noreply.github.com>2017-12-18 10:59:47 -0300
commit00c0ec3f2784e67f4ccc7616bf65aa7e5496687a (patch)
tree2b72e7dc0e96ec009c4fa52f6e76ef15118bd6d8
parent143b2aeac06348c1d08f47f60ad32a306587cb50 (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.cpp31
-rw-r--r--src/server/game/Entities/Creature/Creature.h3
-rw-r--r--src/server/game/Entities/Creature/CreatureData.h2
-rw-r--r--src/server/game/Entities/Pet/Pet.cpp2
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp2
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h7
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)