diff --git a/Source/Framework/Constants/SharedConst.cs b/Source/Framework/Constants/SharedConst.cs index ca9d2c03b..1b2865bc4 100644 --- a/Source/Framework/Constants/SharedConst.cs +++ b/Source/Framework/Constants/SharedConst.cs @@ -278,6 +278,27 @@ namespace Framework.Constants MaxVisibilityDistance }; + static int[] raceBits = + { + 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 21, -1, 23, 24, 25, 26, 27, 28, + 29, 30, 31, -1, 11, 12, 13, 14 + }; + + + public static ulong RaceMaskAllPlayable = (ulong)(GetMaskForRace(Race.Human) | GetMaskForRace(Race.Orc) | GetMaskForRace(Race.Dwarf) | GetMaskForRace(Race.NightElf) | GetMaskForRace(Race.Undead) + | GetMaskForRace(Race.Tauren) | GetMaskForRace(Race.Gnome) | GetMaskForRace(Race.Troll) | GetMaskForRace(Race.BloodElf) | GetMaskForRace(Race.Draenei) + | GetMaskForRace(Race.Goblin) | GetMaskForRace(Race.Worgen) | GetMaskForRace(Race.PandarenNeutral) | GetMaskForRace(Race.PandarenAlliance) | GetMaskForRace(Race.PandarenHorde) + | GetMaskForRace(Race.Nightborne) | GetMaskForRace(Race.HighmountainTauren) | GetMaskForRace(Race.VoidElf) | GetMaskForRace(Race.LightforgedDraenei) | GetMaskForRace(Race.ZandalariTroll) + | GetMaskForRace(Race.KulTiran) | GetMaskForRace(Race.DarkIronDwarf) | GetMaskForRace(Race.Vulpera) | GetMaskForRace(Race.MagharOrc) | GetMaskForRace(Race.MechaGnome)); + + public static ulong RaceMaskAlliance = (ulong)(GetMaskForRace(Race.Human) | GetMaskForRace(Race.Dwarf) | GetMaskForRace(Race.NightElf) | GetMaskForRace(Race.Gnome) + | GetMaskForRace(Race.Draenei) | GetMaskForRace(Race.Worgen) | GetMaskForRace(Race.PandarenAlliance) | GetMaskForRace(Race.VoidElf) | GetMaskForRace(Race.LightforgedDraenei) + | GetMaskForRace(Race.KulTiran) | GetMaskForRace(Race.DarkIronDwarf) | GetMaskForRace(Race.MechaGnome)); + + public static ulong RaceMaskHorde = RaceMaskAllPlayable & ~RaceMaskAlliance; + //Todo move these else where /// /// Method Const @@ -375,6 +396,11 @@ namespace Framework.Constants { return locale < Locale.Total && locale != Locale.None; } + + public static long GetMaskForRace(Race raceId) + { + return raceId < Race.Max && raceBits[(int)raceId] >= 0 && raceBits[(int)raceId] < 64 ? (1 << raceBits[(int)raceId]) : 0; + } } public enum Locale @@ -565,23 +591,9 @@ namespace Framework.Constants Vulpera = 35, MagharOrc = 36, MechaGnome = 37, - Max, + Max } - public enum RaceMask : ulong - { - AllPlayable = ((1 << (Race.Human - 1)) | (1 << (Race.Orc - 1)) | (1 << (Race.Dwarf - 1)) | (1 << (Race.NightElf - 1)) | (1 << (Race.Undead - 1)) - | (1 << (Race.Tauren - 1)) | (1 << (Race.Gnome - 1)) | (1 << (Race.Troll - 1)) | (1 << (Race.BloodElf - 1)) | (1 << (Race.Draenei - 1)) - | (1 << (Race.Goblin - 1)) | (1 << (Race.Worgen - 1)) | (1 << (Race.PandarenNeutral - 1)) | (1 << (Race.PandarenAlliance - 1)) | (1 << (Race.PandarenHorde - 1)) - | (1 << (Race.Nightborne - 1)) | (1 << (Race.HighmountainTauren - 1)) | (1 << (Race.VoidElf - 1)) | (1 << (Race.LightforgedDraenei - 1)) | (1 << (Race.ZandalariTroll - 1)) - | (1ul << (Race.KulTiran - 1)) | (1ul << (Race.DarkIronDwarf - 1)) | (1ul << (Race.Vulpera - 1)) | (1ul << (Race.MagharOrc - 1)) | (1ul << (Race.MechaGnome - 1))), - - Alliance = ((1 << (Race.Human - 1)) | (1 << (Race.Dwarf - 1)) | (1 << (Race.NightElf - 1)) | (1 << (Race.Gnome - 1)) - | (1 << (Race.Draenei - 1)) | (1 << (Race.Worgen - 1)) | (1 << (Race.PandarenAlliance - 1)) | (1 << (Race.VoidElf - 1)) | (1 << (Race.LightforgedDraenei - 1)) - | (1ul << (Race.KulTiran - 1)) | (1ul << (Race.DarkIronDwarf - 1)) | (1ul << (Race.MechaGnome - 1))), - - Horde = AllPlayable & ~Alliance - } public enum Expansion { LevelCurrent = -1, diff --git a/Source/Game/Achievements/CriteriaHandler.cs b/Source/Game/Achievements/CriteriaHandler.cs index eba529744..a02b2f247 100644 --- a/Source/Game/Achievements/CriteriaHandler.cs +++ b/Source/Game/Achievements/CriteriaHandler.cs @@ -3146,7 +3146,7 @@ namespace Game.Achievements criteria.Id, criteria.Entry.Type, DataType, ClassRace.ClassId); return false; } - if (ClassRace.RaceId != 0 && ((1ul << (int)(ClassRace.RaceId - 1)) & (ulong)RaceMask.AllPlayable) == 0) + if (ClassRace.RaceId != 0 && (SharedConst.GetMaskForRace((Race)ClassRace.RaceId) & (long)SharedConst.RaceMaskAllPlayable) == 0) { Log.outError(LogFilter.Sql, "Table `criteria_data` (Entry: {0} Type: {1}) for data type CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE ({2}) has non-existing race in value2 ({3}), ignored.", criteria.Id, criteria.Entry.Type, DataType, ClassRace.RaceId); @@ -3291,7 +3291,7 @@ namespace Game.Achievements criteria.Id, criteria.Entry.Type, DataType, ClassRace.ClassId); return false; } - if (ClassRace.RaceId != 0 && ((1ul << (int)(ClassRace.RaceId - 1)) & (ulong)RaceMask.AllPlayable) == 0) + if (ClassRace.RaceId != 0 && ((ulong)SharedConst.GetMaskForRace((Race)ClassRace.RaceId) & SharedConst.RaceMaskAllPlayable) == 0) { Log.outError(LogFilter.Sql, "Table `criteria_data` (Entry: {0} Type: {1}) for data type CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE ({2}) has non-existing race in value2 ({3}), ignored.", criteria.Id, criteria.Entry.Type, DataType, ClassRace.RaceId); diff --git a/Source/Game/Conditions/Condition.cs b/Source/Game/Conditions/Condition.cs index b8906fc1d..ce5b87850 100644 --- a/Source/Game/Conditions/Condition.cs +++ b/Source/Game/Conditions/Condition.cs @@ -95,7 +95,7 @@ namespace Game.Conditions break; case ConditionTypes.Race: if (unit != null) - condMeets = Convert.ToBoolean(unit.GetRaceMask() & ConditionValue1); + condMeets = Convert.ToBoolean(SharedConst.GetMaskForRace(unit.GetRace()) & ConditionValue1); break; case ConditionTypes.Gender: if (player != null) diff --git a/Source/Game/Conditions/ConditionManager.cs b/Source/Game/Conditions/ConditionManager.cs index ff9d13265..988250fca 100644 --- a/Source/Game/Conditions/ConditionManager.cs +++ b/Source/Game/Conditions/ConditionManager.cs @@ -1242,9 +1242,9 @@ namespace Game } case ConditionTypes.Race: { - if (Convert.ToBoolean(cond.ConditionValue1 & ~(ulong)RaceMask.AllPlayable)) + if (Convert.ToBoolean(cond.ConditionValue1 & ~SharedConst.RaceMaskAllPlayable)) { - Log.outError(LogFilter.Sql, "{0} has non existing racemask ({1}), skipped.", cond.ToString(true), cond.ConditionValue1 & ~(ulong)RaceMask.AllPlayable); + Log.outError(LogFilter.Sql, "{0} has non existing racemask ({1}), skipped.", cond.ToString(true), cond.ConditionValue1 & ~SharedConst.RaceMaskAllPlayable); return false; } break; @@ -1752,7 +1752,7 @@ namespace Game } } - if (condition.RaceMask != 0 && !Convert.ToBoolean(player.GetRaceMask() & condition.RaceMask)) + if (condition.RaceMask != 0 && !Convert.ToBoolean(SharedConst.GetMaskForRace(player.GetRace()) & condition.RaceMask)) return false; if (condition.ClassMask != 0 && !Convert.ToBoolean(player.GetClassMask() & condition.ClassMask)) diff --git a/Source/Game/Entities/Player/Player.Items.cs b/Source/Game/Entities/Player/Player.Items.cs index e839faf39..fd92a476c 100644 --- a/Source/Game/Entities/Player/Player.Items.cs +++ b/Source/Game/Entities/Player/Player.Items.cs @@ -1462,7 +1462,7 @@ namespace Game.Entities if (Convert.ToBoolean(proto.GetFlags2() & ItemFlags2.FactionAlliance) && GetTeam() != Team.Alliance) return InventoryResult.CantEquipEver; - if ((proto.GetAllowableClass() & GetClassMask()) == 0 || (proto.GetAllowableRace() & (long)GetRaceMask()) == 0) + if ((proto.GetAllowableClass() & GetClassMask()) == 0 || (proto.GetAllowableRace() & (long)SharedConst.GetMaskForRace(GetRace())) == 0) return InventoryResult.CantEquipEver; if (proto.GetRequiredSkill() != 0) @@ -3362,7 +3362,7 @@ namespace Game.Entities return InventoryResult.ItemNotFound; // Used by group, function GroupLoot, to know if a prototype can be used by a player - if ((proto.GetAllowableClass() & GetClassMask()) == 0 || (proto.GetAllowableRace() & (long)GetRaceMask()) == 0) + if ((proto.GetAllowableClass() & GetClassMask()) == 0 || (proto.GetAllowableRace() & (long)SharedConst.GetMaskForRace(GetRace())) == 0) return InventoryResult.CantEquipEver; if (proto.GetRequiredSpell() != 0 && !HasSpell(proto.GetRequiredSpell())) diff --git a/Source/Game/Entities/Player/Player.Quest.cs b/Source/Game/Entities/Player/Player.Quest.cs index 982dec02b..0e5a12846 100644 --- a/Source/Game/Entities/Player/Player.Quest.cs +++ b/Source/Game/Entities/Player/Player.Quest.cs @@ -1450,7 +1450,7 @@ namespace Game.Entities if (reqraces == -1) return true; - if ((reqraces & (long)GetRaceMask()) == 0) + if ((reqraces & (long)SharedConst.GetMaskForRace(GetRace())) == 0) { if (msg) { diff --git a/Source/Game/Entities/Player/Player.Spells.cs b/Source/Game/Entities/Player/Player.Spells.cs index 38757fed3..126dcc7e6 100644 --- a/Source/Game/Entities/Player/Player.Spells.cs +++ b/Source/Game/Entities/Player/Player.Spells.cs @@ -1567,7 +1567,7 @@ namespace Game.Entities void LearnSkillRewardedSpells(uint skillId, uint skillValue) { - long raceMask = GetRaceMask(); + long raceMask = SharedConst.GetMaskForRace(GetRace()); uint classMask = GetClassMask(); List skillLineAbilities = Global.DB2Mgr.GetSkillLineAbilitiesBySkill(skillId); diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index 47e221984..4483cc161 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -3902,7 +3902,7 @@ namespace Game.Entities public static bool IsValidGender(Gender _gender) { return _gender <= Gender.Female; } public static bool IsValidClass(Class _class) { return Convert.ToBoolean((1 << ((int)_class - 1)) & (int)Class.ClassMaskAllPlayable); } - public static bool IsValidRace(Race _race) { return Convert.ToBoolean((1ul << ((int)_race - 1)) & (ulong)RaceMask.AllPlayable); } + public static bool IsValidRace(Race _race) { return Convert.ToBoolean((ulong)SharedConst.GetMaskForRace(_race) & SharedConst.RaceMaskAllPlayable); } public void OnCombatExit() { @@ -5225,7 +5225,7 @@ namespace Game.Entities if (pet) pet.SynchronizeLevelWithOwner(); - MailLevelReward mailReward = Global.ObjectMgr.GetMailLevelReward(level, (uint)GetRaceMask()); + MailLevelReward mailReward = Global.ObjectMgr.GetMailLevelReward(level, (uint)SharedConst.GetMaskForRace(GetRace())); if (mailReward != null) { //- TODO: Poor design of mail system @@ -7034,7 +7034,7 @@ namespace Game.Entities } public bool IsSpellFitByClassAndRace(uint spell_id) { - long racemask = GetRaceMask(); + long racemask = SharedConst.GetMaskForRace(GetRace()); uint classmask = GetClassMask(); var bounds = Global.SpellMgr.GetSkillLineAbilityMapBounds(spell_id); diff --git a/Source/Game/Entities/Unit/Unit.cs b/Source/Game/Entities/Unit/Unit.cs index 2eda3ed95..734ede26a 100644 --- a/Source/Game/Entities/Unit/Unit.cs +++ b/Source/Game/Entities/Unit/Unit.cs @@ -1801,7 +1801,6 @@ namespace Game.Entities public Race GetRace() { return (Race)(byte)m_unitData.Race; } public void SetRace(Race race) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.Race), (byte)race); } - public long GetRaceMask() { return 1L << ((int)GetRace() - 1); } public Class GetClass() { return (Class)(byte)m_unitData.ClassId; } public void SetClass(Class classId) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ClassId), (byte)classId); } public uint GetClassMask() { return (uint)(1 << ((int)GetClass() - 1)); } diff --git a/Source/Game/Globals/ObjectManager.cs b/Source/Game/Globals/ObjectManager.cs index aa481b7bc..6bb831405 100644 --- a/Source/Game/Globals/ObjectManager.cs +++ b/Source/Game/Globals/ObjectManager.cs @@ -5727,15 +5727,15 @@ namespace Game { if (rcInfo.Availability == 1) { - for (int raceIndex = (int)Race.Human; raceIndex < (int)Race.Max; ++raceIndex) + for (Race raceIndex = Race.Human; raceIndex < Race.Max; ++raceIndex) { - if (rcInfo.RaceMask == -1 || Convert.ToBoolean((1L << (raceIndex - 1)) & rcInfo.RaceMask)) + if (rcInfo.RaceMask == -1 || Convert.ToBoolean(SharedConst.GetMaskForRace(raceIndex) & rcInfo.RaceMask)) { for (int classIndex = (int)Class.Warrior; classIndex < (int)Class.Max; ++classIndex) { if (rcInfo.ClassMask == -1 || Convert.ToBoolean((1 << (classIndex - 1)) & rcInfo.ClassMask)) { - PlayerInfo info = _playerInfo[raceIndex][classIndex]; + PlayerInfo info = _playerInfo[(int)raceIndex][classIndex]; if (info != null) info.skills.Add(rcInfo); } @@ -5766,7 +5766,7 @@ namespace Game uint classMask = result.Read(1); uint spellId = result.Read(2); - if (raceMask != 0 && !Convert.ToBoolean(raceMask & (ulong)RaceMask.AllPlayable)) + if (raceMask != 0 && !Convert.ToBoolean(raceMask & SharedConst.RaceMaskAllPlayable)) { Log.outError(LogFilter.Sql, "Wrong race mask {0} in `playercreateinfo_spell_custom` table, ignoring.", raceMask); continue; @@ -5778,15 +5778,15 @@ namespace Game continue; } - for (int raceIndex = (int)Race.Human; raceIndex < (int)Race.Max; ++raceIndex) + for (Race raceIndex = Race.Human; raceIndex < Race.Max; ++raceIndex) { - if (raceMask == 0 || Convert.ToBoolean((1ul << (raceIndex - 1)) & raceMask)) + if (raceMask == 0 || Convert.ToBoolean((ulong)SharedConst.GetMaskForRace(raceIndex) & raceMask)) { for (int classIndex = (int)Class.Warrior; classIndex < (int)Class.Max; ++classIndex) { if (classMask == 0 || Convert.ToBoolean((1 << (classIndex - 1)) & classMask)) { - PlayerInfo info = _playerInfo[raceIndex][classIndex]; + PlayerInfo info = _playerInfo[(int)raceIndex][classIndex]; if (info != null) { info.customSpells.Add(spellId); @@ -5824,7 +5824,7 @@ namespace Game uint classMask = result.Read(1); uint spellId = result.Read(2); - if (raceMask != 0 && !raceMask.HasAnyFlag((ulong)RaceMask.AllPlayable)) + if (raceMask != 0 && (raceMask & SharedConst.RaceMaskAllPlayable) == 0) { Log.outError(LogFilter.Sql, "Wrong race mask {0} in `playercreateinfo_cast_spell` table, ignoring.", raceMask); continue; @@ -5836,15 +5836,15 @@ namespace Game continue; } - for (int raceIndex = (int)Race.Human; raceIndex < (int)Race.Max; ++raceIndex) + for (Race raceIndex = Race.Human; raceIndex < Race.Max; ++raceIndex) { - if (raceMask == 0 || Convert.ToBoolean((1ul << (raceIndex - 1)) & raceMask)) + if (raceMask == 0 || Convert.ToBoolean((ulong)SharedConst.GetMaskForRace(raceIndex) & raceMask)) { for (int classIndex = (int)Class.Warrior; classIndex < (int)Class.Max; ++classIndex) { if (classMask == 0 || Convert.ToBoolean((1 << (classIndex - 1)) & classMask)) { - PlayerInfo info = _playerInfo[raceIndex][classIndex]; + PlayerInfo info = _playerInfo[(int)raceIndex][classIndex]; if (info != null) { info.castSpells.Add(spellId); @@ -6960,7 +6960,7 @@ namespace Game // AllowableRaces, can be -1/RACEMASK_ALL_PLAYABLE to allow any race if (qinfo.AllowableRaces != -1) { - if (qinfo.AllowableRaces > 0 && !Convert.ToBoolean(qinfo.AllowableRaces & (long)RaceMask.AllPlayable)) + if (qinfo.AllowableRaces > 0 && !Convert.ToBoolean(qinfo.AllowableRaces & (long)SharedConst.RaceMaskAllPlayable)) { Log.outError(LogFilter.Sql, "Quest {0} does not contain any playable races in `RequiredRaces` ({1}), value set to 0 (all races).", qinfo.Id, qinfo.AllowableRaces); qinfo.AllowableRaces = -1; @@ -8860,7 +8860,7 @@ namespace Game continue; } - if (!Convert.ToBoolean(raceMask & (ulong)RaceMask.AllPlayable)) + if (!Convert.ToBoolean(raceMask & SharedConst.RaceMaskAllPlayable)) { Log.outError(LogFilter.Sql, "Table `mail_level_reward` have raceMask ({0}) for level {1} that not include any player races, ignoring.", raceMask, level); continue; diff --git a/Source/Game/Handlers/CharacterHandler.cs b/Source/Game/Handlers/CharacterHandler.cs index 2ca680a4d..ccabd242a 100644 --- a/Source/Game/Handlers/CharacterHandler.cs +++ b/Source/Game/Handlers/CharacterHandler.cs @@ -355,7 +355,7 @@ namespace Game if (!HasPermission(RBACPermissions.SkipCheckCharacterCreationRacemask)) { ulong raceMaskDisabled = WorldConfig.GetUInt64Value(WorldCfg.CharacterCreatingDisabledRacemask); - if (Convert.ToBoolean((1ul << ((int)charCreate.CreateInfo.RaceId - 1)) & raceMaskDisabled)) + if (Convert.ToBoolean((ulong)SharedConst.GetMaskForRace(charCreate.CreateInfo.RaceId) & raceMaskDisabled)) { SendCharCreate(ResponseCodes.CharCreateDisabled); return; @@ -1704,7 +1704,7 @@ namespace Game if (!HasPermission(RBACPermissions.SkipCheckCharacterCreationRacemask)) { ulong raceMaskDisabled = WorldConfig.GetUInt64Value(WorldCfg.CharacterCreatingDisabledRacemask); - if (Convert.ToBoolean(1ul << ((int)factionChangeInfo.RaceID - 1) & raceMaskDisabled)) + if (Convert.ToBoolean((ulong)SharedConst.GetMaskForRace(factionChangeInfo.RaceID) & raceMaskDisabled)) { SendCharFactionChange(ResponseCodes.CharCreateError, factionChangeInfo); return; @@ -2013,7 +2013,7 @@ namespace Game var questTemplates = Global.ObjectMgr.GetQuestTemplates(); foreach (Quest quest in questTemplates.Values) { - long newRaceMask = (long)(newTeamId == TeamId.Alliance ? RaceMask.Alliance : RaceMask.Horde); + long newRaceMask = (long)(newTeamId == TeamId.Alliance ? SharedConst.RaceMaskAlliance : SharedConst.RaceMaskHorde); if (quest.AllowableRaces != -1 && !Convert.ToBoolean(quest.AllowableRaces & newRaceMask)) { stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_CHAR_QUESTSTATUS_REWARDED_ACTIVE_BY_QUEST); diff --git a/Source/Game/Reputation/ReputationManager.cs b/Source/Game/Reputation/ReputationManager.cs index 5719677a9..d3f69b6eb 100644 --- a/Source/Game/Reputation/ReputationManager.cs +++ b/Source/Game/Reputation/ReputationManager.cs @@ -91,7 +91,7 @@ namespace Game if (factionEntry == null) return 0; - long raceMask = _player.GetRaceMask(); + long raceMask = SharedConst.GetMaskForRace(_player.GetRace()); uint classMask = _player.GetClassMask(); for (var i = 0; i < 4; i++) { @@ -149,7 +149,7 @@ namespace Game if (factionEntry == null) return 0; - long raceMask = _player.GetRaceMask(); + long raceMask = SharedConst.GetMaskForRace(_player.GetRace()); uint classMask = _player.GetClassMask(); for (int i = 0; i < 4; i++) { @@ -405,7 +405,7 @@ namespace Game var factionEntry = CliDB.FactionStorage.LookupByKey(factionTemplateEntry.Faction); if (factionEntry.Id != 0) // Never show factions of the opposing team - if (!Convert.ToBoolean(factionEntry.ReputationRaceMask[1] & _player.GetRaceMask()) && factionEntry.ReputationBase[1] == Reputation_Bottom) + if (!Convert.ToBoolean(factionEntry.ReputationRaceMask[1] & SharedConst.GetMaskForRace(_player.GetRace())) && factionEntry.ReputationBase[1] == Reputation_Bottom) SetVisible(factionEntry); } @@ -629,7 +629,7 @@ namespace Game if (factionEntry == null) return 0; - ulong raceMask = (1ul << ((int)race - 1)); + ulong raceMask = (ulong)SharedConst.GetMaskForRace(race); uint classMask = (1u << ((int)playerClass - 1)); for (int i = 0; i < 4; i++) diff --git a/Source/Game/Spells/SpellInfo.cs b/Source/Game/Spells/SpellInfo.cs index 5cba0b33b..e9757bbad 100644 --- a/Source/Game/Spells/SpellInfo.cs +++ b/Source/Game/Spells/SpellInfo.cs @@ -2969,7 +2969,7 @@ namespace Game.Spells } case SpellProcsPerMinuteModType.Race: { - if (caster.GetRaceMask().HasAnyFlag(mod.Param)) + if (SharedConst.GetMaskForRace(caster.GetRace()).HasAnyFlag((int)mod.Param)) ppm *= 1.0f + mod.Coeff; break; } diff --git a/Source/Game/Spells/SpellManager.cs b/Source/Game/Spells/SpellManager.cs index 17335af55..49e1176b0 100644 --- a/Source/Game/Spells/SpellManager.cs +++ b/Source/Game/Spells/SpellManager.cs @@ -2100,7 +2100,7 @@ namespace Game.Entities } } - if (spellArea.raceMask != 0 && (spellArea.raceMask & (ulong)RaceMask.AllPlayable) == 0) + if (spellArea.raceMask != 0 && (spellArea.raceMask & SharedConst.RaceMaskAllPlayable) == 0) { Log.outError(LogFilter.Sql, "Spell {0} listed in `spell_area` have wrong race mask ({1}) requirement", spell, spellArea.raceMask); continue; @@ -3781,7 +3781,7 @@ namespace Game.Entities return false; if (raceMask != 0) // not in expected race - if (player == null || !Convert.ToBoolean(raceMask & (ulong)player.GetRaceMask())) + if (player == null || !Convert.ToBoolean(raceMask & (ulong)SharedConst.GetMaskForRace(player.GetRace()))) return false; if (areaId != 0) // not in expected zone