mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/Spells: Refactor building SMSG_SPELL_EXECUTE_LOG to not create 192 empty vectors on every spell cast
This commit is contained in:
@@ -63,48 +63,60 @@ WorldPacket const* WorldPackets::CombatLog::SpellExecuteLog::Write()
|
||||
{
|
||||
*this << Caster;
|
||||
*this << int32(SpellID);
|
||||
*this << uint32(Effects.size());
|
||||
*this << uint32(Effects->size());
|
||||
|
||||
for (SpellLogEffect const& effect : Effects)
|
||||
for (SpellLogEffect const& effect : *Effects)
|
||||
{
|
||||
*this << int32(effect.Effect);
|
||||
|
||||
*this << uint32(effect.PowerDrainTargets.size());
|
||||
*this << uint32(effect.ExtraAttacksTargets.size());
|
||||
*this << uint32(effect.DurabilityDamageTargets.size());
|
||||
*this << uint32(effect.GenericVictimTargets.size());
|
||||
*this << uint32(effect.TradeSkillTargets.size());
|
||||
*this << uint32(effect.FeedPetTargets.size());
|
||||
*this << uint32(effect.PowerDrainTargets ? effect.PowerDrainTargets->size() : 0);
|
||||
*this << uint32(effect.ExtraAttacksTargets ? effect.ExtraAttacksTargets->size() : 0);
|
||||
*this << uint32(effect.DurabilityDamageTargets ? effect.DurabilityDamageTargets->size() : 0);
|
||||
*this << uint32(effect.GenericVictimTargets ? effect.GenericVictimTargets->size() : 0);
|
||||
*this << uint32(effect.TradeSkillTargets ? effect.TradeSkillTargets->size() : 0);
|
||||
*this << uint32(effect.FeedPetTargets ? effect.FeedPetTargets->size() : 0);
|
||||
|
||||
for (SpellLogEffectPowerDrainParams const& powerDrainTarget : effect.PowerDrainTargets)
|
||||
if (effect.PowerDrainTargets)
|
||||
{
|
||||
*this << powerDrainTarget.Victim;
|
||||
*this << uint32(powerDrainTarget.Points);
|
||||
*this << uint32(powerDrainTarget.PowerType);
|
||||
*this << float(powerDrainTarget.Amplitude);
|
||||
for (SpellLogEffectPowerDrainParams const& powerDrainTarget : *effect.PowerDrainTargets)
|
||||
{
|
||||
*this << powerDrainTarget.Victim;
|
||||
*this << uint32(powerDrainTarget.Points);
|
||||
*this << uint32(powerDrainTarget.PowerType);
|
||||
*this << float(powerDrainTarget.Amplitude);
|
||||
}
|
||||
}
|
||||
|
||||
for (SpellLogEffectExtraAttacksParams const& extraAttacksTarget : effect.ExtraAttacksTargets)
|
||||
if (effect.ExtraAttacksTargets)
|
||||
{
|
||||
*this << extraAttacksTarget.Victim;
|
||||
*this << uint32(extraAttacksTarget.NumAttacks);
|
||||
for (SpellLogEffectExtraAttacksParams const& extraAttacksTarget : *effect.ExtraAttacksTargets)
|
||||
{
|
||||
*this << extraAttacksTarget.Victim;
|
||||
*this << uint32(extraAttacksTarget.NumAttacks);
|
||||
}
|
||||
}
|
||||
|
||||
for (SpellLogEffectDurabilityDamageParams const& durabilityDamageTarget : effect.DurabilityDamageTargets)
|
||||
if (effect.DurabilityDamageTargets)
|
||||
{
|
||||
*this << durabilityDamageTarget.Victim;
|
||||
*this << int32(durabilityDamageTarget.ItemID);
|
||||
*this << int32(durabilityDamageTarget.Amount);
|
||||
for (SpellLogEffectDurabilityDamageParams const& durabilityDamageTarget : *effect.DurabilityDamageTargets)
|
||||
{
|
||||
*this << durabilityDamageTarget.Victim;
|
||||
*this << int32(durabilityDamageTarget.ItemID);
|
||||
*this << int32(durabilityDamageTarget.Amount);
|
||||
}
|
||||
}
|
||||
|
||||
for (SpellLogEffectGenericVictimParams const& genericVictimTarget : effect.GenericVictimTargets)
|
||||
*this << genericVictimTarget.Victim;
|
||||
if (effect.GenericVictimTargets)
|
||||
for (SpellLogEffectGenericVictimParams const& genericVictimTarget : *effect.GenericVictimTargets)
|
||||
*this << genericVictimTarget.Victim;
|
||||
|
||||
for (SpellLogEffectTradeSkillItemParams const& tradeSkillTarget : effect.TradeSkillTargets)
|
||||
*this << int32(tradeSkillTarget.ItemID);
|
||||
if (effect.TradeSkillTargets)
|
||||
for (SpellLogEffectTradeSkillItemParams const& tradeSkillTarget : *effect.TradeSkillTargets)
|
||||
*this << int32(tradeSkillTarget.ItemID);
|
||||
|
||||
for (SpellLogEffectFeedPetParams const& feedPetTarget : effect.FeedPetTargets)
|
||||
*this << int32(feedPetTarget.ItemID);
|
||||
if (effect.FeedPetTargets)
|
||||
for (SpellLogEffectFeedPetParams const& feedPetTarget : *effect.FeedPetTargets)
|
||||
*this << int32(feedPetTarget.ItemID);
|
||||
}
|
||||
|
||||
WriteLogDataBit();
|
||||
|
||||
@@ -68,25 +68,13 @@ namespace WorldPackets
|
||||
class SpellExecuteLog final : public CombatLogServerPacket
|
||||
{
|
||||
public:
|
||||
struct SpellLogEffect
|
||||
{
|
||||
int32 Effect = 0;
|
||||
|
||||
std::vector<SpellLogEffectPowerDrainParams> PowerDrainTargets;
|
||||
std::vector<SpellLogEffectExtraAttacksParams> ExtraAttacksTargets;
|
||||
std::vector<SpellLogEffectDurabilityDamageParams> DurabilityDamageTargets;
|
||||
std::vector<SpellLogEffectGenericVictimParams> GenericVictimTargets;
|
||||
std::vector<SpellLogEffectTradeSkillItemParams> TradeSkillTargets;
|
||||
std::vector<SpellLogEffectFeedPetParams> FeedPetTargets;
|
||||
};
|
||||
|
||||
SpellExecuteLog() : CombatLogServerPacket(SMSG_SPELL_EXECUTE_LOG, 16 + 4 + 4 + 1) { }
|
||||
|
||||
WorldPacket const* Write() override;
|
||||
|
||||
ObjectGuid Caster;
|
||||
int32 SpellID = 0;
|
||||
std::vector<SpellLogEffect> Effects;
|
||||
std::vector<SpellLogEffect> const* Effects = nullptr;
|
||||
};
|
||||
|
||||
class SpellHealLog final : public CombatLogServerPacket
|
||||
|
||||
@@ -4561,39 +4561,33 @@ void Spell::UpdateSpellCastDataAmmo(WorldPackets::Spells::SpellAmmo& ammo)
|
||||
|
||||
void Spell::SendSpellExecuteLog()
|
||||
{
|
||||
if (_executeLogEffects.empty())
|
||||
return;
|
||||
|
||||
WorldPackets::CombatLog::SpellExecuteLog spellExecuteLog;
|
||||
spellExecuteLog.Caster = m_caster->GetGUID();
|
||||
spellExecuteLog.SpellID = m_spellInfo->Id;
|
||||
|
||||
for (SpellEffectInfo const* effect : m_spellInfo->GetEffects())
|
||||
{
|
||||
if (!effect)
|
||||
continue;
|
||||
|
||||
if (_powerDrainTargets[effect->EffectIndex].empty() && _extraAttacksTargets[effect->EffectIndex].empty() &&
|
||||
_durabilityDamageTargets[effect->EffectIndex].empty() && _genericVictimTargets[effect->EffectIndex].empty() &&
|
||||
_tradeSkillTargets[effect->EffectIndex].empty() && _feedPetTargets[effect->EffectIndex].empty())
|
||||
continue;
|
||||
|
||||
spellExecuteLog.Effects.emplace_back();
|
||||
|
||||
WorldPackets::CombatLog::SpellExecuteLog::SpellLogEffect& spellLogEffect = spellExecuteLog.Effects.back();
|
||||
spellLogEffect.Effect = effect->Effect;
|
||||
spellLogEffect.PowerDrainTargets = std::move(_powerDrainTargets[effect->EffectIndex]);
|
||||
spellLogEffect.ExtraAttacksTargets = std::move(_extraAttacksTargets[effect->EffectIndex]);
|
||||
spellLogEffect.DurabilityDamageTargets = std::move(_durabilityDamageTargets[effect->EffectIndex]);
|
||||
spellLogEffect.GenericVictimTargets = std::move(_genericVictimTargets[effect->EffectIndex]);
|
||||
spellLogEffect.TradeSkillTargets = std::move(_tradeSkillTargets[effect->EffectIndex]);
|
||||
spellLogEffect.FeedPetTargets = std::move(_feedPetTargets[effect->EffectIndex]);
|
||||
}
|
||||
|
||||
spellExecuteLog.Effects = &_executeLogEffects;
|
||||
spellExecuteLog.LogData.Initialize(this);
|
||||
|
||||
if (!spellExecuteLog.Effects.empty())
|
||||
m_caster->SendCombatLogMessage(&spellExecuteLog);
|
||||
m_caster->SendCombatLogMessage(&spellExecuteLog);
|
||||
}
|
||||
|
||||
void Spell::ExecuteLogEffectTakeTargetPower(uint8 effIndex, Unit* target, uint32 powerType, uint32 points, float amplitude)
|
||||
SpellLogEffect& Spell::GetExecuteLogEffect(SpellEffectName effect)
|
||||
{
|
||||
auto itr = std::find_if(_executeLogEffects.begin(), _executeLogEffects.end(), [effect](SpellLogEffect& log)
|
||||
{
|
||||
return log.Effect == effect;
|
||||
});
|
||||
if (itr != _executeLogEffects.end())
|
||||
return *itr;
|
||||
|
||||
_executeLogEffects.emplace_back();
|
||||
_executeLogEffects.back().Effect = effect;
|
||||
return _executeLogEffects.back();
|
||||
}
|
||||
|
||||
void Spell::ExecuteLogEffectTakeTargetPower(SpellEffectName effect, Unit* target, uint32 powerType, uint32 points, float amplitude)
|
||||
{
|
||||
SpellLogEffectPowerDrainParams spellLogEffectPowerDrainParams;
|
||||
|
||||
@@ -4602,19 +4596,19 @@ void Spell::ExecuteLogEffectTakeTargetPower(uint8 effIndex, Unit* target, uint32
|
||||
spellLogEffectPowerDrainParams.PowerType = powerType;
|
||||
spellLogEffectPowerDrainParams.Amplitude = amplitude;
|
||||
|
||||
_powerDrainTargets[effIndex].push_back(spellLogEffectPowerDrainParams);
|
||||
GetExecuteLogEffectTargets(effect, &SpellLogEffect::PowerDrainTargets).push_back(spellLogEffectPowerDrainParams);
|
||||
}
|
||||
|
||||
void Spell::ExecuteLogEffectExtraAttacks(uint8 effIndex, Unit* victim, uint32 numAttacks)
|
||||
void Spell::ExecuteLogEffectExtraAttacks(SpellEffectName effect, Unit* victim, uint32 numAttacks)
|
||||
{
|
||||
SpellLogEffectExtraAttacksParams spellLogEffectExtraAttacksParams;
|
||||
spellLogEffectExtraAttacksParams.Victim = victim->GetGUID();
|
||||
spellLogEffectExtraAttacksParams.NumAttacks = numAttacks;
|
||||
|
||||
_extraAttacksTargets[effIndex].push_back(spellLogEffectExtraAttacksParams);
|
||||
GetExecuteLogEffectTargets(effect, &SpellLogEffect::ExtraAttacksTargets).push_back(spellLogEffectExtraAttacksParams);
|
||||
}
|
||||
|
||||
void Spell::ExecuteLogEffectInterruptCast(uint8 /*effIndex*/, Unit* victim, uint32 spellId)
|
||||
void Spell::SendSpellInterruptLog(Unit* victim, uint32 spellId)
|
||||
{
|
||||
WorldPackets::CombatLog::SpellInterruptLog data;
|
||||
data.Caster = m_caster->GetGUID();
|
||||
@@ -4625,62 +4619,62 @@ void Spell::ExecuteLogEffectInterruptCast(uint8 /*effIndex*/, Unit* victim, uint
|
||||
m_caster->SendMessageToSet(data.Write(), true);
|
||||
}
|
||||
|
||||
void Spell::ExecuteLogEffectDurabilityDamage(uint8 effIndex, Unit* victim, int32 itemId, int32 amount)
|
||||
void Spell::ExecuteLogEffectDurabilityDamage(SpellEffectName effect, Unit* victim, int32 itemId, int32 amount)
|
||||
{
|
||||
SpellLogEffectDurabilityDamageParams spellLogEffectDurabilityDamageParams;
|
||||
spellLogEffectDurabilityDamageParams.Victim = victim->GetGUID();
|
||||
spellLogEffectDurabilityDamageParams.ItemID = itemId;
|
||||
spellLogEffectDurabilityDamageParams.Amount = amount;
|
||||
|
||||
_durabilityDamageTargets[effIndex].push_back(spellLogEffectDurabilityDamageParams);
|
||||
GetExecuteLogEffectTargets(effect, &SpellLogEffect::DurabilityDamageTargets).push_back(spellLogEffectDurabilityDamageParams);
|
||||
}
|
||||
|
||||
void Spell::ExecuteLogEffectOpenLock(uint8 effIndex, Object* obj)
|
||||
void Spell::ExecuteLogEffectOpenLock(SpellEffectName effect, Object* obj)
|
||||
{
|
||||
SpellLogEffectGenericVictimParams spellLogEffectGenericVictimParams;
|
||||
spellLogEffectGenericVictimParams.Victim = obj->GetGUID();
|
||||
|
||||
_genericVictimTargets[effIndex].push_back(spellLogEffectGenericVictimParams);
|
||||
GetExecuteLogEffectTargets(effect, &SpellLogEffect::GenericVictimTargets).push_back(spellLogEffectGenericVictimParams);
|
||||
}
|
||||
|
||||
void Spell::ExecuteLogEffectCreateItem(uint8 effIndex, uint32 entry)
|
||||
void Spell::ExecuteLogEffectCreateItem(SpellEffectName effect, uint32 entry)
|
||||
{
|
||||
SpellLogEffectTradeSkillItemParams spellLogEffectTradeSkillItemParams;
|
||||
spellLogEffectTradeSkillItemParams.ItemID = entry;
|
||||
|
||||
_tradeSkillTargets[effIndex].push_back(spellLogEffectTradeSkillItemParams);
|
||||
GetExecuteLogEffectTargets(effect, &SpellLogEffect::TradeSkillTargets).push_back(spellLogEffectTradeSkillItemParams);
|
||||
}
|
||||
|
||||
void Spell::ExecuteLogEffectDestroyItem(uint8 effIndex, uint32 entry)
|
||||
void Spell::ExecuteLogEffectDestroyItem(SpellEffectName effect, uint32 entry)
|
||||
{
|
||||
SpellLogEffectFeedPetParams spellLogEffectFeedPetParams;
|
||||
spellLogEffectFeedPetParams.ItemID = entry;
|
||||
|
||||
_feedPetTargets[effIndex].push_back(spellLogEffectFeedPetParams);
|
||||
GetExecuteLogEffectTargets(effect, &SpellLogEffect::FeedPetTargets).push_back(spellLogEffectFeedPetParams);
|
||||
}
|
||||
|
||||
void Spell::ExecuteLogEffectSummonObject(uint8 effIndex, WorldObject* obj)
|
||||
void Spell::ExecuteLogEffectSummonObject(SpellEffectName effect, WorldObject* obj)
|
||||
{
|
||||
SpellLogEffectGenericVictimParams spellLogEffectGenericVictimParams;
|
||||
spellLogEffectGenericVictimParams.Victim = obj->GetGUID();
|
||||
|
||||
_genericVictimTargets[effIndex].push_back(spellLogEffectGenericVictimParams);
|
||||
GetExecuteLogEffectTargets(effect, &SpellLogEffect::GenericVictimTargets).push_back(spellLogEffectGenericVictimParams);
|
||||
}
|
||||
|
||||
void Spell::ExecuteLogEffectUnsummonObject(uint8 effIndex, WorldObject* obj)
|
||||
void Spell::ExecuteLogEffectUnsummonObject(SpellEffectName effect, WorldObject* obj)
|
||||
{
|
||||
SpellLogEffectGenericVictimParams spellLogEffectGenericVictimParams;
|
||||
spellLogEffectGenericVictimParams.Victim = obj->GetGUID();
|
||||
|
||||
_genericVictimTargets[effIndex].push_back(spellLogEffectGenericVictimParams);
|
||||
GetExecuteLogEffectTargets(effect, &SpellLogEffect::GenericVictimTargets).push_back(spellLogEffectGenericVictimParams);
|
||||
}
|
||||
|
||||
void Spell::ExecuteLogEffectResurrect(uint8 effect, Unit* target)
|
||||
void Spell::ExecuteLogEffectResurrect(SpellEffectName effect, Unit* target)
|
||||
{
|
||||
SpellLogEffectGenericVictimParams spellLogEffectGenericVictimParams;
|
||||
spellLogEffectGenericVictimParams.Victim = target->GetGUID();
|
||||
|
||||
_genericVictimTargets[effect].push_back(spellLogEffectGenericVictimParams);
|
||||
GetExecuteLogEffectTargets(effect, &SpellLogEffect::GenericVictimTargets).push_back(spellLogEffectGenericVictimParams);
|
||||
}
|
||||
|
||||
void Spell::SendInterrupted(uint8 result)
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include "ConditionMgr.h"
|
||||
#include "DBCEnums.h"
|
||||
#include "ObjectGuid.h"
|
||||
#include "Optional.h"
|
||||
#include "Position.h"
|
||||
#include "SharedDefines.h"
|
||||
#include "SpellDefines.h"
|
||||
@@ -204,6 +205,18 @@ struct SpellLogEffectFeedPetParams
|
||||
int32 ItemID = 0;
|
||||
};
|
||||
|
||||
struct SpellLogEffect
|
||||
{
|
||||
int32 Effect = 0;
|
||||
|
||||
Optional<std::vector<SpellLogEffectPowerDrainParams>> PowerDrainTargets;
|
||||
Optional<std::vector<SpellLogEffectExtraAttacksParams>> ExtraAttacksTargets;
|
||||
Optional<std::vector<SpellLogEffectDurabilityDamageParams>> DurabilityDamageTargets;
|
||||
Optional<std::vector<SpellLogEffectGenericVictimParams>> GenericVictimTargets;
|
||||
Optional<std::vector<SpellLogEffectTradeSkillItemParams>> TradeSkillTargets;
|
||||
Optional<std::vector<SpellLogEffectFeedPetParams>> FeedPetTargets;
|
||||
};
|
||||
|
||||
class TC_GAME_API SpellCastTargets
|
||||
{
|
||||
public:
|
||||
@@ -588,16 +601,26 @@ class TC_GAME_API Spell
|
||||
void SendSpellGo();
|
||||
void SendSpellCooldown();
|
||||
void SendSpellExecuteLog();
|
||||
void ExecuteLogEffectTakeTargetPower(uint8 effIndex, Unit* target, uint32 powerType, uint32 points, float amplitude);
|
||||
void ExecuteLogEffectExtraAttacks(uint8 effIndex, Unit* victim, uint32 numAttacks);
|
||||
void ExecuteLogEffectInterruptCast(uint8 effIndex, Unit* victim, uint32 spellId);
|
||||
void ExecuteLogEffectDurabilityDamage(uint8 effIndex, Unit* victim, int32 itemId, int32 amount);
|
||||
void ExecuteLogEffectOpenLock(uint8 effIndex, Object* obj);
|
||||
void ExecuteLogEffectCreateItem(uint8 effIndex, uint32 entry);
|
||||
void ExecuteLogEffectDestroyItem(uint8 effIndex, uint32 entry);
|
||||
void ExecuteLogEffectSummonObject(uint8 effIndex, WorldObject* obj);
|
||||
void ExecuteLogEffectUnsummonObject(uint8 effIndex, WorldObject* obj);
|
||||
void ExecuteLogEffectResurrect(uint8 effIndex, Unit* target);
|
||||
SpellLogEffect& GetExecuteLogEffect(SpellEffectName effect);
|
||||
template<typename T>
|
||||
std::vector<T>& GetExecuteLogEffectTargets(SpellEffectName effect, Optional<std::vector<T>> SpellLogEffect::* member)
|
||||
{
|
||||
Optional<std::vector<T>>& opt = GetExecuteLogEffect(effect).*member;
|
||||
if (!opt)
|
||||
opt.emplace();
|
||||
|
||||
return *opt;
|
||||
}
|
||||
void ExecuteLogEffectTakeTargetPower(SpellEffectName effect, Unit* target, uint32 powerType, uint32 points, float amplitude);
|
||||
void ExecuteLogEffectExtraAttacks(SpellEffectName effect, Unit* victim, uint32 numAttacks);
|
||||
void ExecuteLogEffectDurabilityDamage(SpellEffectName effect, Unit* victim, int32 itemId, int32 amount);
|
||||
void ExecuteLogEffectOpenLock(SpellEffectName effect, Object* obj);
|
||||
void ExecuteLogEffectCreateItem(SpellEffectName effect, uint32 entry);
|
||||
void ExecuteLogEffectDestroyItem(SpellEffectName effect, uint32 entry);
|
||||
void ExecuteLogEffectSummonObject(SpellEffectName effect, WorldObject* obj);
|
||||
void ExecuteLogEffectUnsummonObject(SpellEffectName effect, WorldObject* obj);
|
||||
void ExecuteLogEffectResurrect(SpellEffectName effect, Unit* target);
|
||||
void SendSpellInterruptLog(Unit* victim, uint32 spellId);
|
||||
void SendInterrupted(uint8 result);
|
||||
void SendChannelUpdate(uint32 time);
|
||||
void SendChannelStart(uint32 duration);
|
||||
@@ -911,7 +934,7 @@ class TC_GAME_API Spell
|
||||
HitTriggerSpellList m_hitTriggerSpells;
|
||||
|
||||
// effect helpers
|
||||
void SummonGuardian(uint32 i, uint32 entry, SummonPropertiesEntry const* properties, uint32 numSummons, ObjectGuid privateObjectOwner);
|
||||
void SummonGuardian(SpellEffectInfo const* effect, uint32 entry, SummonPropertiesEntry const* properties, uint32 numSummons, ObjectGuid privateObjectOwner);
|
||||
|
||||
void UpdateSpellCastDataTargets(WorldPackets::Spells::SpellCastData& data);
|
||||
void UpdateSpellCastDataAmmo(WorldPackets::Spells::SpellAmmo& data);
|
||||
@@ -932,12 +955,7 @@ class TC_GAME_API Spell
|
||||
|
||||
std::unique_ptr<PathGenerator> m_preGeneratedPath;
|
||||
|
||||
std::vector<SpellLogEffectPowerDrainParams> _powerDrainTargets[MAX_SPELL_EFFECTS];
|
||||
std::vector<SpellLogEffectExtraAttacksParams> _extraAttacksTargets[MAX_SPELL_EFFECTS];
|
||||
std::vector<SpellLogEffectDurabilityDamageParams> _durabilityDamageTargets[MAX_SPELL_EFFECTS];
|
||||
std::vector<SpellLogEffectGenericVictimParams> _genericVictimTargets[MAX_SPELL_EFFECTS];
|
||||
std::vector<SpellLogEffectTradeSkillItemParams> _tradeSkillTargets[MAX_SPELL_EFFECTS];
|
||||
std::vector<SpellLogEffectFeedPetParams> _feedPetTargets[MAX_SPELL_EFFECTS];
|
||||
std::vector<SpellLogEffect> _executeLogEffects;
|
||||
|
||||
Spell(Spell const& right) = delete;
|
||||
Spell& operator=(Spell const& right) = delete;
|
||||
|
||||
@@ -378,7 +378,7 @@ void Spell::EffectUnused(SpellEffIndex /*effIndex*/)
|
||||
// NOT USED BY ANY SPELL OR USELESS OR IMPLEMENTED IN DIFFERENT WAY IN TRINITY
|
||||
}
|
||||
|
||||
void Spell::EffectResurrectNew(SpellEffIndex effIndex)
|
||||
void Spell::EffectResurrectNew(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
|
||||
return;
|
||||
@@ -399,7 +399,7 @@ void Spell::EffectResurrectNew(SpellEffIndex effIndex)
|
||||
|
||||
uint32 health = damage;
|
||||
uint32 mana = effectInfo->MiscValue;
|
||||
ExecuteLogEffectResurrect(effIndex, target);
|
||||
ExecuteLogEffectResurrect(SpellEffectName(effectInfo->Effect), target);
|
||||
target->SetResurrectRequestData(m_caster, health, mana, 0);
|
||||
SendResurrectRequest(target);
|
||||
}
|
||||
@@ -1081,7 +1081,7 @@ void Spell::EffectUnlearnSpecialization(SpellEffIndex /*effIndex*/)
|
||||
TC_LOG_DEBUG("spells", "Spell: %s has unlearned spell %u from %s", player->GetGUID().ToString().c_str(), spellToUnlearn, m_caster->GetGUID().ToString().c_str());
|
||||
}
|
||||
|
||||
void Spell::EffectPowerDrain(SpellEffIndex effIndex)
|
||||
void Spell::EffectPowerDrain(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
|
||||
return;
|
||||
@@ -1112,7 +1112,7 @@ void Spell::EffectPowerDrain(SpellEffIndex effIndex)
|
||||
|
||||
unitCaster->EnergizeBySpell(unitCaster, m_spellInfo, gain, powerType);
|
||||
}
|
||||
ExecuteLogEffectTakeTargetPower(effIndex, unitTarget, powerType, newDamage, gainMultiplier);
|
||||
ExecuteLogEffectTakeTargetPower(SpellEffectName(effectInfo->Effect), unitTarget, powerType, newDamage, gainMultiplier);
|
||||
}
|
||||
|
||||
void Spell::EffectSendEvent(SpellEffIndex /*effIndex*/)
|
||||
@@ -1156,7 +1156,7 @@ void Spell::EffectSendEvent(SpellEffIndex /*effIndex*/)
|
||||
m_caster->GetMap()->ScriptsStart(sEventScripts, effectInfo->MiscValue, m_caster, target);
|
||||
}
|
||||
|
||||
void Spell::EffectPowerBurn(SpellEffIndex effIndex)
|
||||
void Spell::EffectPowerBurn(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
|
||||
return;
|
||||
@@ -1174,7 +1174,7 @@ void Spell::EffectPowerBurn(SpellEffIndex effIndex)
|
||||
float dmgMultiplier = effectInfo->CalcValueMultiplier(unitCaster, this);
|
||||
|
||||
// add log data before multiplication (need power amount, not damage)
|
||||
ExecuteLogEffectTakeTargetPower(effIndex, unitTarget, powerType, newDamage, 0.0f);
|
||||
ExecuteLogEffectTakeTargetPower(SpellEffectName(effectInfo->Effect), unitTarget, powerType, newDamage, 0.0f);
|
||||
|
||||
newDamage = int32(newDamage * dmgMultiplier);
|
||||
|
||||
@@ -1415,7 +1415,7 @@ void Spell::EffectCreateItem(SpellEffIndex effIndex)
|
||||
return;
|
||||
|
||||
DoCreateItem(effIndex, effectInfo->ItemType, m_spellInfo->HasAttribute(SPELL_ATTR0_TRADESPELL) ? ItemContext::Trade_Skill : ItemContext::NONE);
|
||||
ExecuteLogEffectCreateItem(effIndex, effectInfo->ItemType);
|
||||
ExecuteLogEffectCreateItem(SpellEffectName(effectInfo->Effect), effectInfo->ItemType);
|
||||
}
|
||||
|
||||
void Spell::EffectCreateItem2(SpellEffIndex effIndex)
|
||||
@@ -1756,7 +1756,7 @@ void Spell::EffectOpenLock(SpellEffIndex effIndex)
|
||||
}
|
||||
}
|
||||
}
|
||||
ExecuteLogEffectOpenLock(effIndex, gameObjTarget ? (Object*)gameObjTarget : (Object*)itemTarget);
|
||||
ExecuteLogEffectOpenLock(SpellEffectName(effectInfo->Effect), gameObjTarget ? (Object*)gameObjTarget : (Object*)itemTarget);
|
||||
}
|
||||
|
||||
void Spell::EffectSummonChangeItem(SpellEffIndex /*effIndex*/)
|
||||
@@ -1895,7 +1895,7 @@ void Spell::EffectProficiency(SpellEffIndex /*effIndex*/)
|
||||
}
|
||||
}
|
||||
|
||||
void Spell::EffectSummonType(SpellEffIndex effIndex)
|
||||
void Spell::EffectSummonType(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT)
|
||||
return;
|
||||
@@ -1973,7 +1973,7 @@ void Spell::EffectSummonType(SpellEffIndex effIndex)
|
||||
{
|
||||
if (properties->Flags & 512)
|
||||
{
|
||||
SummonGuardian(effIndex, entry, properties, numSummons, privateObjectOwner);
|
||||
SummonGuardian(effectInfo, entry, properties, numSummons, privateObjectOwner);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1983,7 +1983,7 @@ void Spell::EffectSummonType(SpellEffIndex effIndex)
|
||||
case SummonTitle::Guardian:
|
||||
case SummonTitle::Runeblade:
|
||||
case SummonTitle::Minion:
|
||||
SummonGuardian(effIndex, entry, properties, numSummons, privateObjectOwner);
|
||||
SummonGuardian(effectInfo, entry, properties, numSummons, privateObjectOwner);
|
||||
break;
|
||||
// Summons a vehicle, but doesn't force anyone to enter it (see SUMMON_CATEGORY_VEHICLE)
|
||||
case SummonTitle::Vehicle:
|
||||
@@ -2055,7 +2055,7 @@ void Spell::EffectSummonType(SpellEffIndex effIndex)
|
||||
summon->SetCreatedBySpell(m_spellInfo->Id);
|
||||
}
|
||||
|
||||
ExecuteLogEffectSummonObject(effIndex, summon);
|
||||
ExecuteLogEffectSummonObject(SpellEffectName(effectInfo->Effect), summon);
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -2063,7 +2063,7 @@ void Spell::EffectSummonType(SpellEffIndex effIndex)
|
||||
break;
|
||||
}
|
||||
case SUMMON_CATEGORY_PET:
|
||||
SummonGuardian(effIndex, entry, properties, numSummons, privateObjectOwner);
|
||||
SummonGuardian(effectInfo, entry, properties, numSummons, privateObjectOwner);
|
||||
break;
|
||||
case SUMMON_CATEGORY_PUPPET:
|
||||
{
|
||||
@@ -2114,7 +2114,7 @@ void Spell::EffectSummonType(SpellEffIndex effIndex)
|
||||
if (summon)
|
||||
{
|
||||
summon->SetCreatorGUID(caster->GetGUID());
|
||||
ExecuteLogEffectSummonObject(effIndex, summon);
|
||||
ExecuteLogEffectSummonObject(SpellEffectName(effectInfo->Effect), summon);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2648,7 +2648,7 @@ void Spell::EffectTameCreature(SpellEffIndex /*effIndex*/)
|
||||
}
|
||||
}
|
||||
|
||||
void Spell::EffectSummonPet(SpellEffIndex effIndex)
|
||||
void Spell::EffectSummonPet(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT)
|
||||
return;
|
||||
@@ -2667,7 +2667,7 @@ void Spell::EffectSummonPet(SpellEffIndex effIndex)
|
||||
{
|
||||
SummonPropertiesEntry const* properties = sSummonPropertiesStore.LookupEntry(67);
|
||||
if (properties)
|
||||
SummonGuardian(effIndex, petentry, properties, 1, ObjectGuid::Empty);
|
||||
SummonGuardian(effectInfo, petentry, properties, 1, ObjectGuid::Empty);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2727,7 +2727,7 @@ void Spell::EffectSummonPet(SpellEffIndex effIndex)
|
||||
if (!new_name.empty())
|
||||
pet->SetName(new_name);
|
||||
|
||||
ExecuteLogEffectSummonObject(effIndex, pet);
|
||||
ExecuteLogEffectSummonObject(SpellEffectName(effectInfo->Effect), pet);
|
||||
}
|
||||
|
||||
void Spell::EffectLearnPetSpell(SpellEffIndex effIndex)
|
||||
@@ -3049,14 +3049,14 @@ void Spell::EffectInterruptCast(SpellEffIndex effIndex)
|
||||
Unit::ProcSkillsAndAuras(unitCaster, unitTarget, PROC_FLAG_DONE_SPELL_MELEE_DMG_CLASS, PROC_FLAG_TAKEN_SPELL_MELEE_DMG_CLASS,
|
||||
PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_HIT, PROC_HIT_INTERRUPT, nullptr, nullptr, nullptr);
|
||||
}
|
||||
ExecuteLogEffectInterruptCast(effIndex, unitTarget, curSpellInfo->Id);
|
||||
SendSpellInterruptLog(unitTarget, curSpellInfo->Id);
|
||||
unitTarget->InterruptSpell(CurrentSpellTypes(i), false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Spell::EffectSummonObjectWild(SpellEffIndex effIndex)
|
||||
void Spell::EffectSummonObjectWild(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT)
|
||||
return;
|
||||
@@ -3085,7 +3085,7 @@ void Spell::EffectSummonObjectWild(SpellEffIndex effIndex)
|
||||
go->SetRespawnTime(duration > 0 ? duration/IN_MILLISECONDS : 0);
|
||||
go->SetSpellId(m_spellInfo->Id);
|
||||
|
||||
ExecuteLogEffectSummonObject(effIndex, go);
|
||||
ExecuteLogEffectSummonObject(SpellEffectName(effectInfo->Effect), go);
|
||||
|
||||
// Wild object not have owner and check clickable by players
|
||||
map->AddToMap(go);
|
||||
@@ -3102,7 +3102,7 @@ void Spell::EffectSummonObjectWild(SpellEffIndex effIndex)
|
||||
linkedTrap->SetRespawnTime(duration > 0 ? duration / IN_MILLISECONDS : 0);
|
||||
linkedTrap->SetSpellId(m_spellInfo->Id);
|
||||
|
||||
ExecuteLogEffectSummonObject(effIndex, linkedTrap);
|
||||
ExecuteLogEffectSummonObject(SpellEffectName(effectInfo->Effect), linkedTrap);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3542,7 +3542,7 @@ void Spell::EffectSanctuary(SpellEffIndex /*effIndex*/)
|
||||
unitTarget->m_lastSanctuaryTime = GameTime::GetGameTimeMS();
|
||||
}
|
||||
|
||||
void Spell::EffectDuel(SpellEffIndex effIndex)
|
||||
void Spell::EffectDuel(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
|
||||
return;
|
||||
@@ -3595,7 +3595,7 @@ void Spell::EffectDuel(SpellEffIndex effIndex)
|
||||
go->SetRespawnTime(duration > 0 ? duration/IN_MILLISECONDS : 0);
|
||||
go->SetSpellId(m_spellInfo->Id);
|
||||
|
||||
ExecuteLogEffectSummonObject(effIndex, go);
|
||||
ExecuteLogEffectSummonObject(SpellEffectName(effectInfo->Effect), go);
|
||||
|
||||
caster->AddGameObject(go);
|
||||
map->AddToMap(go);
|
||||
@@ -3838,7 +3838,7 @@ void Spell::EffectInebriate(SpellEffIndex /*effIndex*/)
|
||||
player->SetDrunkValue(currentDrunk, m_CastItem ? m_CastItem->GetEntry() : 0);
|
||||
}
|
||||
|
||||
void Spell::EffectFeedPet(SpellEffIndex effIndex)
|
||||
void Spell::EffectFeedPet(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
|
||||
return;
|
||||
@@ -3858,7 +3858,7 @@ void Spell::EffectFeedPet(SpellEffIndex effIndex)
|
||||
if (!pet->IsAlive())
|
||||
return;
|
||||
|
||||
ExecuteLogEffectDestroyItem(effIndex, foodItem->GetEntry());
|
||||
ExecuteLogEffectDestroyItem(SpellEffectName(effectInfo->Effect), foodItem->GetEntry());
|
||||
|
||||
int32 pct;
|
||||
int32 levelDiff = int32(pet->getLevel()) - int32(foodItem->GetTemplate()->GetBaseItemLevel());
|
||||
@@ -3880,7 +3880,7 @@ void Spell::EffectFeedPet(SpellEffIndex effIndex)
|
||||
m_caster->CastSpell(pet, effectInfo->TriggerSpell, args);
|
||||
}
|
||||
|
||||
void Spell::EffectDismissPet(SpellEffIndex effIndex)
|
||||
void Spell::EffectDismissPet(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
|
||||
return;
|
||||
@@ -3890,11 +3890,11 @@ void Spell::EffectDismissPet(SpellEffIndex effIndex)
|
||||
|
||||
Pet* pet = unitTarget->ToPet();
|
||||
|
||||
ExecuteLogEffectUnsummonObject(effIndex, pet);
|
||||
ExecuteLogEffectUnsummonObject(SpellEffectName(effectInfo->Effect), pet);
|
||||
pet->GetOwner()->RemovePet(pet, PET_SAVE_NOT_IN_SLOT);
|
||||
}
|
||||
|
||||
void Spell::EffectSummonObject(SpellEffIndex effIndex)
|
||||
void Spell::EffectSummonObject(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT)
|
||||
return;
|
||||
@@ -3941,14 +3941,14 @@ void Spell::EffectSummonObject(SpellEffIndex effIndex)
|
||||
go->SetSpellId(m_spellInfo->Id);
|
||||
unitCaster->AddGameObject(go);
|
||||
|
||||
ExecuteLogEffectSummonObject(effIndex, go);
|
||||
ExecuteLogEffectSummonObject(SpellEffectName(effectInfo->Effect), go);
|
||||
|
||||
map->AddToMap(go);
|
||||
|
||||
unitCaster->m_ObjectSlot[slot] = go->GetGUID();
|
||||
}
|
||||
|
||||
void Spell::EffectResurrect(SpellEffIndex effIndex)
|
||||
void Spell::EffectResurrect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
|
||||
return;
|
||||
@@ -3967,13 +3967,13 @@ void Spell::EffectResurrect(SpellEffIndex effIndex)
|
||||
uint32 health = target->CountPctFromMaxHealth(damage);
|
||||
uint32 mana = CalculatePct(target->GetMaxPower(POWER_MANA), damage);
|
||||
|
||||
ExecuteLogEffectResurrect(effIndex, target);
|
||||
ExecuteLogEffectResurrect(SpellEffectName(effectInfo->Effect), target);
|
||||
|
||||
target->SetResurrectRequestData(m_caster, health, mana, 0);
|
||||
SendResurrectRequest(target);
|
||||
}
|
||||
|
||||
void Spell::EffectAddExtraAttacks(SpellEffIndex effIndex)
|
||||
void Spell::EffectAddExtraAttacks(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
|
||||
return;
|
||||
@@ -3986,7 +3986,7 @@ void Spell::EffectAddExtraAttacks(SpellEffIndex effIndex)
|
||||
|
||||
unitTarget->m_extraAttacks = damage;
|
||||
|
||||
ExecuteLogEffectExtraAttacks(effIndex, unitTarget, damage);
|
||||
ExecuteLogEffectExtraAttacks(SpellEffectName(effectInfo->Effect), unitTarget, damage);
|
||||
}
|
||||
|
||||
void Spell::EffectParry(SpellEffIndex /*effIndex*/)
|
||||
@@ -4574,7 +4574,7 @@ void Spell::EffectDestroyAllTotems(SpellEffIndex /*effIndex*/)
|
||||
}
|
||||
}
|
||||
|
||||
void Spell::EffectDurabilityDamage(SpellEffIndex effIndex)
|
||||
void Spell::EffectDurabilityDamage(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
|
||||
return;
|
||||
@@ -4588,7 +4588,7 @@ void Spell::EffectDurabilityDamage(SpellEffIndex effIndex)
|
||||
if (slot < 0)
|
||||
{
|
||||
unitTarget->ToPlayer()->DurabilityPointsLossAll(damage, (slot < -1));
|
||||
ExecuteLogEffectDurabilityDamage(effIndex, unitTarget, -1, -1);
|
||||
ExecuteLogEffectDurabilityDamage(SpellEffectName(effectInfo->Effect), unitTarget, -1, -1);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -4599,7 +4599,7 @@ void Spell::EffectDurabilityDamage(SpellEffIndex effIndex)
|
||||
if (Item* item = unitTarget->ToPlayer()->GetItemByPos(INVENTORY_SLOT_BAG_0, slot))
|
||||
{
|
||||
unitTarget->ToPlayer()->DurabilityPointsLoss(item, damage);
|
||||
ExecuteLogEffectDurabilityDamage(effIndex, unitTarget, item->GetEntry(), slot);
|
||||
ExecuteLogEffectDurabilityDamage(SpellEffectName(effectInfo->Effect), unitTarget, item->GetEntry(), slot);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4643,7 +4643,7 @@ void Spell::EffectModifyThreatPercent(SpellEffIndex /*effIndex*/)
|
||||
unitTarget->GetThreatManager().ModifyThreatByPercent(unitCaster, damage);
|
||||
}
|
||||
|
||||
void Spell::EffectTransmitted(SpellEffIndex effIndex)
|
||||
void Spell::EffectTransmitted(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT)
|
||||
return;
|
||||
@@ -4753,7 +4753,7 @@ void Spell::EffectTransmitted(SpellEffIndex effIndex)
|
||||
//go->SetLevel(unitCaster->getLevel());
|
||||
go->SetSpellId(m_spellInfo->Id);
|
||||
|
||||
ExecuteLogEffectSummonObject(effIndex, go);
|
||||
ExecuteLogEffectSummonObject(SpellEffectName(effectInfo->Effect), go);
|
||||
|
||||
TC_LOG_DEBUG("spells", "AddObject at SpellEfects.cpp EffectTransmitted");
|
||||
//unitCaster->AddGameObject(go);
|
||||
@@ -4770,7 +4770,7 @@ void Spell::EffectTransmitted(SpellEffIndex effIndex)
|
||||
linkedTrap->SetSpellId(m_spellInfo->Id);
|
||||
linkedTrap->SetOwnerGUID(unitCaster->GetGUID());
|
||||
|
||||
ExecuteLogEffectSummonObject(effIndex, linkedTrap);
|
||||
ExecuteLogEffectSummonObject(SpellEffectName(effectInfo->Effect), linkedTrap);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5144,7 +5144,7 @@ void Spell::EffectGameObjectSetDestructionState(SpellEffIndex /*effIndex*/)
|
||||
gameObjTarget->SetDestructibleState(GameObjectDestructibleState(effectInfo->MiscValue), m_caster, true);
|
||||
}
|
||||
|
||||
void Spell::SummonGuardian(uint32 i, uint32 entry, SummonPropertiesEntry const* properties, uint32 numGuardians, ObjectGuid privateObjectOwner)
|
||||
void Spell::SummonGuardian(SpellEffectInfo const* effect, uint32 entry, SummonPropertiesEntry const* properties, uint32 numGuardians, ObjectGuid privateObjectOwner)
|
||||
{
|
||||
if (!unitCaster)
|
||||
return;
|
||||
@@ -5203,7 +5203,7 @@ void Spell::SummonGuardian(uint32 i, uint32 entry, SummonPropertiesEntry const*
|
||||
|
||||
summon->AI()->EnterEvadeMode();
|
||||
|
||||
ExecuteLogEffectSummonObject(i, summon);
|
||||
ExecuteLogEffectSummonObject(SpellEffectName(effect->Effect), summon);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5486,7 +5486,7 @@ void Spell::EffectSummonPersonalGameObject(SpellEffIndex effIndex)
|
||||
go->SetSpellId(m_spellInfo->Id);
|
||||
go->SetPrivateObjectOwner(m_caster->GetGUID());
|
||||
|
||||
ExecuteLogEffectSummonObject(effIndex, go);
|
||||
ExecuteLogEffectSummonObject(SpellEffectName(effectInfo->Effect), go);
|
||||
|
||||
map->AddToMap(go);
|
||||
|
||||
@@ -5497,11 +5497,11 @@ void Spell::EffectSummonPersonalGameObject(SpellEffIndex effIndex)
|
||||
linkedTrap->SetRespawnTime(duration > 0 ? duration / IN_MILLISECONDS : 0);
|
||||
linkedTrap->SetSpellId(m_spellInfo->Id);
|
||||
|
||||
ExecuteLogEffectSummonObject(effIndex, linkedTrap);
|
||||
ExecuteLogEffectSummonObject(SpellEffectName(effectInfo->Effect), linkedTrap);
|
||||
}
|
||||
}
|
||||
|
||||
void Spell::EffectResurrectWithAura(SpellEffIndex effIndex)
|
||||
void Spell::EffectResurrectWithAura(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
|
||||
return;
|
||||
@@ -5528,7 +5528,7 @@ void Spell::EffectResurrectWithAura(SpellEffIndex effIndex)
|
||||
if (resurrectAura && target->HasAura(resurrectAura))
|
||||
return;
|
||||
|
||||
ExecuteLogEffectResurrect(effIndex, target);
|
||||
ExecuteLogEffectResurrect(SpellEffectName(effectInfo->Effect), target);
|
||||
target->SetResurrectRequestData(m_caster, health, mana, resurrectAura);
|
||||
SendResurrectRequest(target);
|
||||
}
|
||||
@@ -5639,7 +5639,7 @@ void Spell::EffectCreateHeirloomItem(SpellEffIndex effIndex)
|
||||
bonusList.push_back(collectionMgr->GetHeirloomBonus(m_misc.Raw.Data[0]));
|
||||
|
||||
DoCreateItem(effIndex, m_misc.Raw.Data[0], ItemContext::NONE, bonusList);
|
||||
ExecuteLogEffectCreateItem(effIndex, m_misc.Raw.Data[0]);
|
||||
ExecuteLogEffectCreateItem(SpellEffectName(effectInfo->Effect), m_misc.Raw.Data[0]);
|
||||
}
|
||||
|
||||
void Spell::EffectActivateGarrisonBuilding(SpellEffIndex /*effIndex*/)
|
||||
|
||||
Reference in New Issue
Block a user