Core/Spells: Add missing AttributesEx9 and AttributesEx10 and correct arena/rated battleground spells usability

This commit is contained in:
Shocker
2012-08-22 20:33:45 +03:00
parent 3888dd62cf
commit e4648b745c
7 changed files with 120 additions and 12 deletions
+2 -2
View File
@@ -1766,8 +1766,8 @@ struct SpellEntry
uint32 AttributesEx6; // 7 m_attributesExF
uint32 AttributesEx7; // 8 m_attributesExG
uint32 AttributesEx8; // 9 m_attributesExH
// uint32 unk_400_1; // 10 4.0.0
// uint32 unk_420_1 // 11 4.2.0
uint32 AttributesEx9; // 10 m_attributesExI
uint32 AttributesEx10; // 11 m_attributesExJ
uint32 CastingTimeIndex; // 12 m_castingTimeIndex
uint32 DurationIndex; // 13 m_durationIndex
uint32 powerType; // 14 m_powerType
+1 -1
View File
@@ -128,7 +128,7 @@ const std::string CustomSpellDifficultyfmt="ppppp";
const std::string CustomSpellDifficultyIndex="id";
const char SpellDurationfmt[]="niii";
const char SpellEffectEntryfmt[]="nifiiiffiiiiiifiifiiiiiiiix";
const char SpellEntryfmt[]="niiiiiiiiixxiiiifiiiissxxiixxixiiiiiiixiiiiiiiix";
const char SpellEntryfmt[]="niiiiiiiiiiiiiiifiiiissxxiixxixiiiiiiixiiiiiiiix";
const std::string CustomSpellEntryfmt="papppppppppppapapaaaaaaaaaaapaaapapppppppaaaaapaapaaaaaaaaaaaaaaaaaappppppppppppppppppppppppppppppppppppaaaaaapppppppppaaapppppppppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaappppppppapppaaaaappaaaaaaa";
const std::string CustomSpellEntryIndex = "Id";
const char SpellFocusObjectfmt[]="nx";
+73 -1
View File
@@ -437,7 +437,7 @@ enum SpellAttr4
SPELL_ATTR4_UNK13 = 0x00002000, // 13
SPELL_ATTR4_DAMAGE_DOESNT_BREAK_AURAS = 0x00004000, // 14 doesn't break auras by damage from these spells
SPELL_ATTR4_UNK15 = 0x00008000, // 15
SPELL_ATTR4_NOT_USABLE_IN_ARENA = 0x00010000, // 16
SPELL_ATTR4_NOT_USABLE_IN_ARENA_OR_RATED_BG = 0x00010000, // 16 Cannot be used in both Arenas or Rated Battlegrounds
SPELL_ATTR4_USABLE_IN_ARENA = 0x00020000, // 17
SPELL_ATTR4_AREA_TARGET_CHAIN = 0x00040000, // 18 (NYI)hits area targets one after another instead of all at once
SPELL_ATTR4_UNK19 = 0x00080000, // 19 proc dalayed, after damage or don't proc on absorb?
@@ -599,6 +599,78 @@ enum SpellAttr8
SPELL_ATTR8_UNK31 = 0x80000000 // 31
};
enum SpellAttr9
{
SPELL_ATTR9_UNK0 = 0x00000001, // 0
SPELL_ATTR9_UNK1 = 0x00000002, // 1
SPELL_ATTR9_UNK2 = 0x00000004, // 2
SPELL_ATTR9_UNK3 = 0x00000008, // 3
SPELL_ATTR9_UNK4 = 0x00000010, // 4
SPELL_ATTR9_UNK5 = 0x00000020, // 5
SPELL_ATTR9_UNK6 = 0x00000040, // 6
SPELL_ATTR9_UNK7 = 0x00000080, // 7
SPELL_ATTR9_UNK8 = 0x00000100, // 8
SPELL_ATTR9_NOT_USABLE_IN_ARENA = 0x00000200, // 9 Cannot be used in arenas
SPELL_ATTR9_UNK10 = 0x00000400, // 10
SPELL_ATTR9_UNK11 = 0x00000800, // 11
SPELL_ATTR9_UNK12 = 0x00001000, // 12
SPELL_ATTR9_UNK13 = 0x00002000, // 13
SPELL_ATTR9_USABLE_IN_RATED_BATTLEGROUNDS = 0x00004000, // 14 Can be used in Rated Battlegrounds
SPELL_ATTR9_UNK15 = 0x00008000, // 15
SPELL_ATTR9_UNK16 = 0x00010000, // 16
SPELL_ATTR9_UNK17 = 0x00020000, // 17
SPELL_ATTR9_UNK18 = 0x00040000, // 18
SPELL_ATTR9_UNK19 = 0x00080000, // 19
SPELL_ATTR9_UNK20 = 0x00100000, // 20
SPELL_ATTR9_UNK21 = 0x00200000, // 21
SPELL_ATTR9_UNK22 = 0x00400000, // 22
SPELL_ATTR9_UNK23 = 0x00800000, // 23
SPELL_ATTR9_UNK24 = 0x01000000, // 24
SPELL_ATTR9_UNK25 = 0x02000000, // 25
SPELL_ATTR9_UNK26 = 0x04000000, // 26
SPELL_ATTR9_UNK27 = 0x08000000, // 27
SPELL_ATTR9_UNK28 = 0x10000000, // 28
SPELL_ATTR9_UNK29 = 0x20000000, // 29
SPELL_ATTR9_UNK30 = 0x40000000, // 30
SPELL_ATTR9_UNK31 = 0x80000000 // 31
};
enum SpellAttr10
{
SPELL_ATTR10_UNK0 = 0x00000001, // 0
SPELL_ATTR10_UNK1 = 0x00000002, // 1
SPELL_ATTR10_UNK2 = 0x00000004, // 2
SPELL_ATTR10_UNK3 = 0x00000008, // 3
SPELL_ATTR10_UNK4 = 0x00000010, // 4
SPELL_ATTR10_UNK5 = 0x00000020, // 5
SPELL_ATTR10_UNK6 = 0x00000040, // 6
SPELL_ATTR10_UNK7 = 0x00000080, // 7
SPELL_ATTR10_UNK8 = 0x00000100, // 8
SPELL_ATTR10_UNK9 = 0x00000200, // 9
SPELL_ATTR10_UNK10 = 0x00000400, // 10
SPELL_ATTR10_UNK11 = 0x00000800, // 11
SPELL_ATTR10_UNK12 = 0x00001000, // 12
SPELL_ATTR10_UNK13 = 0x00002000, // 13
SPELL_ATTR10_UNK14 = 0x00004000, // 14
SPELL_ATTR10_UNK15 = 0x00008000, // 15
SPELL_ATTR10_UNK16 = 0x00010000, // 16
SPELL_ATTR10_UNK17 = 0x00020000, // 17
SPELL_ATTR10_UNK18 = 0x00040000, // 18
SPELL_ATTR10_UNK19 = 0x00080000, // 19
SPELL_ATTR10_UNK20 = 0x00100000, // 20
SPELL_ATTR10_UNK21 = 0x00200000, // 21
SPELL_ATTR10_UNK22 = 0x00400000, // 22
SPELL_ATTR10_UNK23 = 0x00800000, // 23
SPELL_ATTR10_UNK24 = 0x01000000, // 24
SPELL_ATTR10_UNK25 = 0x02000000, // 25
SPELL_ATTR10_UNK26 = 0x04000000, // 26
SPELL_ATTR10_UNK27 = 0x08000000, // 27
SPELL_ATTR10_UNK28 = 0x10000000, // 28
SPELL_ATTR10_UNK29 = 0x20000000, // 29
SPELL_ATTR10_UNK30 = 0x40000000, // 30
SPELL_ATTR10_UNK31 = 0x80000000 // 31
};
#define MIN_TALENT_SPEC 0
#define MAX_TALENT_SPEC 1
#define MIN_TALENT_SPECS 1
+39 -8
View File
@@ -4889,14 +4889,14 @@ SpellCastResult Spell::CheckCast(bool strict)
if (!m_caster->ToPlayer()->InBattleground())
return SPELL_FAILED_ONLY_BATTLEGROUNDS;
// do not allow spells to be cast in arenas
// - with greater than 10 min CD without SPELL_ATTR4_USABLE_IN_ARENA flag
// - with SPELL_ATTR4_NOT_USABLE_IN_ARENA flag
if ((m_spellInfo->AttributesEx4 & SPELL_ATTR4_NOT_USABLE_IN_ARENA) ||
(m_spellInfo->GetRecoveryTime() > 10 * MINUTE * IN_MILLISECONDS && !(m_spellInfo->AttributesEx4 & SPELL_ATTR4_USABLE_IN_ARENA)))
if (MapEntry const* mapEntry = sMapStore.LookupEntry(m_caster->GetMapId()))
if (mapEntry->IsBattleArena())
return SPELL_FAILED_NOT_IN_ARENA;
// do not allow spells to be cast in arenas or rated battlegrounds
if (Player * player = m_caster->ToPlayer())
if (player->InArena()/* || player->InRatedBattleGround() NYI*/)
{
SpellCastResult castResult = CheckArenaAndRatedBattlegroundCastRules();
if (castResult != SPELL_CAST_OK)
return castResult;
}
// zone check
if (m_caster->GetTypeId() == TYPEID_UNIT || !m_caster->ToPlayer()->isGameMaster())
@@ -5656,6 +5656,37 @@ SpellCastResult Spell::CheckCasterAuras() const
return SPELL_CAST_OK;
}
SpellCastResult Spell::CheckArenaAndRatedBattlegroundCastRules()
{
bool isRatedBattleground = false; // NYI
bool isArena = !isRatedBattleground;
// check USABLE attributes
// USABLE takes precedence over NOT_USABLE
if (isRatedBattleground && m_spellInfo->AttributesEx9 & SPELL_ATTR9_USABLE_IN_RATED_BATTLEGROUNDS)
return SPELL_CAST_OK;
if (isArena && m_spellInfo->AttributesEx4 & SPELL_ATTR4_USABLE_IN_ARENA)
return SPELL_CAST_OK;
// check NOT_USABLE attributes
if (m_spellInfo->AttributesEx4 & SPELL_ATTR4_NOT_USABLE_IN_ARENA_OR_RATED_BG)
return isArena ? SPELL_FAILED_NOT_IN_ARENA : SPELL_FAILED_NOT_IN_RATED_BATTLEGROUND;
if (isArena && m_spellInfo->AttributesEx9 & SPELL_ATTR9_NOT_USABLE_IN_ARENA)
return SPELL_FAILED_NOT_IN_ARENA;
// check cooldowns
uint32 spellCooldown = m_spellInfo->GetRecoveryTime();
if (isArena && spellCooldown > 10 * MINUTE * IN_MILLISECONDS) // not sure if still needed
return SPELL_FAILED_NOT_IN_ARENA;
if (isRatedBattleground && spellCooldown > 15 * MINUTE * IN_MILLISECONDS)
return SPELL_FAILED_NOT_IN_RATED_BATTLEGROUND;
return SPELL_CAST_OK;
}
bool Spell::CanAutoCast(Unit* target)
{
uint64 targetguid = target->GetGUID();
+1
View File
@@ -396,6 +396,7 @@ class Spell
SpellCastResult CheckPower();
SpellCastResult CheckRuneCost(uint32 runeCostID);
SpellCastResult CheckCasterAuras() const;
SpellCastResult CheckArenaAndRatedBattlegroundCastRules();
int32 CalculateDamage(uint8 i, Unit const* target) const { return m_caster->CalculateSpellDamage(target, m_spellInfo, i, &m_spellValue->EffectBasePoints[i]); }
+2
View File
@@ -766,6 +766,8 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry)
AttributesEx6 = spellEntry->AttributesEx6;
AttributesEx7 = spellEntry->AttributesEx7;
AttributesEx8 = spellEntry->AttributesEx8;
AttributesEx9 = spellEntry->AttributesEx9;
AttributesEx10 = spellEntry->AttributesEx10;
AttributesCu = 0;
CastTimeEntry = spellEntry->CastingTimeIndex ? sSpellCastTimesStore.LookupEntry(spellEntry->CastingTimeIndex) : NULL;
DurationEntry = spellEntry->DurationIndex ? sSpellDurationStore.LookupEntry(spellEntry->DurationIndex) : NULL;
+2
View File
@@ -308,6 +308,8 @@ public:
uint32 AttributesEx6;
uint32 AttributesEx7;
uint32 AttributesEx8;
uint32 AttributesEx9;
uint32 AttributesEx10;
uint32 AttributesCu;
uint32 Stances;
uint32 StancesNot;