diff options
-rw-r--r-- | src/common/Utilities/Util.h | 10 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 7 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.h | 7 |
6 files changed, 29 insertions, 5 deletions
diff --git a/src/common/Utilities/Util.h b/src/common/Utilities/Util.h index 4438bf1863d..f1beb1312cf 100644 --- a/src/common/Utilities/Util.h +++ b/src/common/Utilities/Util.h @@ -544,4 +544,14 @@ constexpr typename std::underlying_type<E>::type AsUnderlyingType(E enumValue) return static_cast<typename std::underlying_type<E>::type>(enumValue); } +template<typename T> +struct NonDefaultConstructible +{ + constexpr /*implicit*/ NonDefaultConstructible(T value) : Value(std::move(value)) + { + } + + T Value; +}; + #endif diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 85a0d6c3e6f..05e36fed435 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -64,7 +64,7 @@ class Aura; // because for change amount operation packets will not be send // aura effect handlers shouldn't contain any AuraEffect or Aura object modifications -pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]= +NonDefaultConstructible<pAuraEffectHandler> AuraEffectHandler[TOTAL_AURAS]= { &AuraEffect::HandleNULL, // 0 SPELL_AURA_NONE &AuraEffect::HandleBindSight, // 1 SPELL_AURA_BIND_SIGHT @@ -830,7 +830,7 @@ void AuraEffect::HandleEffect(AuraApplication * aurApp, uint8 mode, bool apply) if ((apply && aurApp->GetRemoveMode()) || prevented) return; - (*this.*AuraEffectHandler[GetAuraType()])(aurApp, mode, apply); + (*this.*AuraEffectHandler[GetAuraType()].Value)(aurApp, mode, apply); // check if script events have removed the aura or if default effect prevention was requested if (apply && aurApp->GetRemoveMode()) diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 05c35f84ae3..c6eeb3b6974 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -57,7 +57,7 @@ #include "WorldSession.h" #include <numeric> -extern pEffect SpellEffects[TOTAL_SPELL_EFFECTS]; +extern NonDefaultConstructible<pEffect> SpellEffects[TOTAL_SPELL_EFFECTS]; SpellDestination::SpellDestination() { @@ -4774,7 +4774,7 @@ void Spell::HandleEffects(Unit* pUnitTarget, Item* pItemTarget, GameObject* pGOT if (!preventDefault && eff < TOTAL_SPELL_EFFECTS) { - (this->*SpellEffects[eff])((SpellEffIndex)i); + (this->*SpellEffects[eff].Value)((SpellEffIndex)i); } } diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index d1ebbaea21f..cb82f7c3221 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -75,7 +75,7 @@ #include "WorldPacket.h" #include "WorldSession.h" -pEffect SpellEffects[TOTAL_SPELL_EFFECTS]= +NonDefaultConstructible<pEffect> SpellEffects[TOTAL_SPELL_EFFECTS] = { &Spell::EffectNULL, // 0 &Spell::EffectInstaKill, // 1 SPELL_EFFECT_INSTAKILL diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index e231c194522..b9d17622476 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1038,6 +1038,13 @@ SpellEffectInfo::StaticData SpellEffectInfo::_data[TOTAL_SPELL_EFFECTS] = {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 262 SPELL_EFFECT_262 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 263 SPELL_EFFECT_REPAIR_ITEM {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 264 SPELL_EFFECT_REMOVE_GEM + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 265 SPELL_EFFECT_LEARN_AZERITE_ESSENCE_POWER + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 266 SPELL_EFFECT_266 + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 267 SPELL_EFFECT_267 + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 268 SPELL_EFFECT_APPLY_MOUNT_EQUIPMENT + {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 269 SPELL_EFFECT_UPGRADE_ITEM + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 270 SPELL_EFFECT_270 + {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 271 SPELL_EFFECT_APPLY_AREA_AURA_PARTY_NONRANDOM }; SpellInfo::SpellInfo(SpellInfoLoadHelper const& data, SpellEffectEntryMap const& effectsMap, SpellVisualMap&& visuals) diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index ef2f083e41b..aef724d4146 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -299,6 +299,10 @@ public: private: struct StaticData { + StaticData(SpellTargetObjectTypes objectType, SpellTargetReferenceTypes referenceType, SpellTargetSelectionCategories selectionCategory, + SpellTargetCheckTypes checkType, SpellTargetDirectionTypes directionType) : ObjectType(objectType), ReferenceType(referenceType), + SelectionCategory(selectionCategory), SelectionCheckType(checkType), DirectionType(directionType) { } + SpellTargetObjectTypes ObjectType; // type of object returned by target type SpellTargetReferenceTypes ReferenceType; // defines which object is used as a reference when selecting target SpellTargetSelectionCategories SelectionCategory; @@ -393,6 +397,9 @@ public: private: struct StaticData { + StaticData(SpellEffectImplicitTargetTypes implicitTargetType, SpellTargetObjectTypes usedTargetObjectType) + : ImplicitTargetType(implicitTargetType), UsedTargetObjectType(usedTargetObjectType) { } + SpellEffectImplicitTargetTypes ImplicitTargetType; // defines what target can be added to effect target list if there's no valid target type provided for effect SpellTargetObjectTypes UsedTargetObjectType; // defines valid target object type for spell effect }; |