diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/game/SharedDefines.h | 16 | ||||
| -rw-r--r-- | src/game/Spell.cpp | 14 | ||||
| -rw-r--r-- | src/game/Spell.h | 3 | ||||
| -rw-r--r-- | src/game/SpellEffects.cpp | 338 | ||||
| -rw-r--r-- | src/game/TemporarySummon.cpp | 9 | ||||
| -rw-r--r-- | src/game/Totem.cpp | 58 | ||||
| -rw-r--r-- | src/game/Totem.h | 6 | ||||
| -rw-r--r-- | src/game/Unit.cpp | 4 |
8 files changed, 175 insertions, 273 deletions
diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h index b26a760574f..e6aaf8619bc 100644 --- a/src/game/SharedDefines.h +++ b/src/game/SharedDefines.h @@ -2446,22 +2446,6 @@ enum SummonType SUMMON_TYPE_VEHICLE = 9, SUMMON_TYPE_VEHICLE2 = 10, SUMMON_TYPE_OBJECT = 11, - - SUMMON_TYPE_CRITTER = 41, - //SUMMON_TYPE_GUARDIAN = 61, - SUMMON_TYPE_WILD = 64, - SUMMON_TYPE_DEMON = 66, - SUMMON_TYPE_SUMMON = 67, - SUMMON_TYPE_UNKNOWN3 = 181, - SUMMON_TYPE_UNKNOWN4 = 187, - SUMMON_TYPE_UNKNOWN1 = 247, - SUMMON_TYPE_CRITTER2 = 407, - SUMMON_TYPE_CRITTER3 = 307, - SUMMON_TYPE_UNKNOWN5 = 409, - SUMMON_TYPE_FROZEN_EARTH = 429, - SUMMON_TYPE_FORCE_OF_NATURE = 669, - SUMMON_TYPE_LIGHTWELL = 1141, - SUMMON_TYPE_FERAL_SPIRIT = 1161 }; enum ResponseCodes diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 07a70f6bc17..01a41f7f51c 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -4214,24 +4214,12 @@ SpellCastResult Spell::CheckCast(bool strict) // This is generic summon effect case SPELL_EFFECT_SUMMON: { - switch(m_spellInfo->EffectMiscValueB[i]) - { - case SUMMON_TYPE_DEMON: - case SUMMON_TYPE_SUMMON: - { - if(m_caster->GetPetGUID()) - return SPELL_FAILED_ALREADY_HAVE_SUMMON; - - if(m_caster->GetCharmGUID()) - return SPELL_FAILED_ALREADY_HAVE_CHARM; - break; - } - } SummonPropertiesEntry const *SummonProperties = sSummonPropertiesStore.LookupEntry(m_spellInfo->EffectMiscValueB[i]); if(!SummonProperties) break; switch(SummonProperties->Category) { + case SUMMON_CATEGORY_PET: case SUMMON_CATEGORY_POSSESSED: { if(m_caster->GetPetGUID()) diff --git a/src/game/Spell.h b/src/game/Spell.h index a18538879b4..b6853ce74cf 100644 --- a/src/game/Spell.h +++ b/src/game/Spell.h @@ -603,10 +603,7 @@ class Spell void SpellDamageHeal(uint32 i); void GetSummonPosition(float &x, float &y, float &z, float radius = 0.0f, uint32 count = 0); - void SummonTotem (uint32 entry, SummonPropertiesEntry const *properties); void SummonGuardian (uint32 entry, SummonPropertiesEntry const *properties); - void SummonPossessed(uint32 entry, SummonPropertiesEntry const *properties); - void SummonVehicle (uint32 entry, SummonPropertiesEntry const *properties); SpellCastResult CanOpenLock(uint32 effIndex, uint32 lockid, SkillType& skillid, int32& reqSkillValue, int32& skillValue); // ------------------------------------------- diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index e1fcae5f1a0..80885d05575 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -3238,6 +3238,38 @@ void Spell::EffectSummonType(uint32 i) return; } + if(!m_originalCaster) + return; + + int32 duration = GetSpellDuration(m_spellInfo); + if(Player* modOwner = m_originalCaster->GetSpellModOwner()) + modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_DURATION, duration); + + float x, y, z; + GetSummonPosition(x, y, z); + + /*//totem must be at same Z in case swimming caster and etc. + if( fabs( z - m_caster->GetPositionZ() ) > 5 ) + z = m_caster->GetPositionZ(); + + uint32 level = m_caster->getLevel(); + + // level of creature summoned using engineering item based at engineering skill level + if(m_caster->GetTypeId()==TYPEID_PLAYER && m_CastItem) + { + ItemPrototype const *proto = m_CastItem->GetProto(); + if(proto && proto->RequiredSkill == SKILL_ENGINERING) + { + uint16 skill202 = ((Player*)m_caster)->GetSkillValue(SKILL_ENGINERING); + if(skill202) + { + level = skill202/5; + } + } + }*/ + + TempSummon *summon = NULL; + switch(properties->Category) { default: @@ -3250,28 +3282,130 @@ void Spell::EffectSummonType(uint32 i) break; case SUMMON_TYPE_VEHICLE: case SUMMON_TYPE_VEHICLE2: - SummonVehicle(entry, properties); + { + Vehicle *vehicle = m_caster->SummonVehicle(entry, x, y, z, m_caster->GetOrientation()); + if(!vehicle) + return; + + vehicle->SetUInt64Value(UNIT_FIELD_SUMMONEDBY, m_caster->GetGUID()); + vehicle->SetUInt32Value(UNIT_CREATED_BY_SPELL, m_spellInfo->Id); break; + } case SUMMON_TYPE_TOTEM: - SummonTotem(entry, properties); + { + summon = m_caster->GetMap()->SummonCreature(entry, x, y, z, m_caster->GetOrientation(), properties, duration, m_originalCaster); + if(!summon || !summon->isTotem()) + return; + + summon->SetOwner(m_originalCaster, true); + + if(damage) // if not spell info, DB values used + { + summon->SetMaxHealth(damage); + summon->SetHealth(damage); + } + + if(m_originalCaster->GetTypeId() == TYPEID_PLAYER + && properties->Slot >= SUMMON_SLOT_TOTEM + && properties->Slot < MAX_TOTEM_SLOT) + { + WorldPacket data(SMSG_TOTEM_CREATED, 1+8+4+4); + data << uint8(properties->Slot-1); + data << uint64(m_originalCaster->GetGUID()); + data << uint32(duration); + data << uint32(m_spellInfo->Id); + ((Player*)m_originalCaster)->SendDirectMessage(&data); + } break; + } case SUMMON_TYPE_MINIPET: - EffectSummonCritter(i); + { + summon = m_caster->GetMap()->SummonCreature(entry, x, y, z, m_caster->GetOrientation(), properties, duration, m_originalCaster); + if(!summon) + return; + + summon->SetOwner(m_originalCaster, true); + summon->SetCreatorGUID(m_originalCaster->GetGUID()); + summon->setFaction(m_originalCaster->getFaction()); + + //summon->InitPetCreateSpells(); // e.g. disgusting oozeling has a create spell as summon... + summon->SetMaxHealth(1); + summon->SetHealth(1); + summon->SetLevel(1); + + summon->SetReactState(REACT_PASSIVE); + summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + + summon->GetMotionMaster()->MoveTargetedHome(); + + std::string name = m_originalCaster->GetName(); + name.append(petTypeSuffix[3]); + summon->SetName( name ); break; + } default: - EffectSummonWild(i); + { + float radius = GetSpellRadiusForHostile(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i])); + + int32 amount = damage > 0 ? damage : 1; + + for(int32 count = 0; count < amount; ++count) + { + float px, py, pz; + GetSummonPosition(px, py, pz, radius, count); + + TempSummonType summonType = (duration == 0) ? TEMPSUMMON_DEAD_DESPAWN : TEMPSUMMON_TIMED_DESPAWN; + + m_originalCaster->SummonCreature(entry,px,py,pz,m_caster->GetOrientation(),summonType,duration); + } break; - } + } + }//switch break; case SUMMON_CATEGORY_PET: SummonGuardian(entry, properties); break; case SUMMON_CATEGORY_POSSESSED: - SummonPossessed(entry, properties); + { + if(m_caster->GetTypeId() != TYPEID_PLAYER) + return; + + float x, y, z; + m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE); + + int32 duration = GetSpellDuration(m_spellInfo); + + Pet* pet = ((Player*)m_caster)->SummonPet(entry, x, y, z, m_caster->GetOrientation(), POSSESSED_PET, duration); + if(!pet) + return; + + pet->SetUInt32Value(UNIT_CREATED_BY_SPELL, m_spellInfo->Id); + pet->SetCharmedOrPossessedBy(m_caster, true); break; + } case SUMMON_CATEGORY_VEHICLE: - SummonVehicle(entry, properties); + { + float x, y, z; + m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE); + Vehicle *vehicle = m_caster->SummonVehicle(entry, x, y, z, m_caster->GetOrientation()); + if(!vehicle) + return; + + vehicle->SetUInt64Value(UNIT_FIELD_SUMMONEDBY, m_caster->GetGUID()); + vehicle->SetUInt32Value(UNIT_CREATED_BY_SPELL, m_spellInfo->Id); + + if(damage) + { + m_caster->CastSpell(vehicle, damage, true); + m_caster->EnterVehicle(vehicle); + } break; + } + } + + if(summon) + { + summon->SetUInt32Value(UNIT_CREATED_BY_SPELL, m_spellInfo->Id); } } @@ -3504,48 +3638,6 @@ void Spell::EffectAddFarsight(uint32 i) ((Player*)m_caster)->UpdateVisibilityOf(dynObj); } -void Spell::EffectSummonWild(uint32 i) -{ - uint32 creature_entry = m_spellInfo->EffectMiscValue[i]; - if(!creature_entry) - return; - - uint32 level = m_caster->getLevel(); - - // level of creature summoned using engineering item based at engineering skill level - if(m_caster->GetTypeId()==TYPEID_PLAYER && m_CastItem) - { - ItemPrototype const *proto = m_CastItem->GetProto(); - if(proto && proto->RequiredSkill == SKILL_ENGINERING) - { - uint16 skill202 = ((Player*)m_caster)->GetSkillValue(SKILL_ENGINERING); - if(skill202) - { - level = skill202/5; - } - } - } - - float radius = GetSpellRadiusForHostile(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i])); - - int32 amount = damage > 0 ? damage : 1; - - for(int32 count = 0; count < amount; ++count) - { - float px, py, pz; - GetSummonPosition(px, py, pz, radius, count); - - int32 duration = GetSpellDuration(m_spellInfo); - - TempSummonType summonType = (duration == 0) ? TEMPSUMMON_DEAD_DESPAWN : TEMPSUMMON_TIMED_DESPAWN; - - if(m_originalCaster) - m_originalCaster->SummonCreature(creature_entry,px,py,pz,m_caster->GetOrientation(),summonType,duration); - else - m_caster->SummonCreature(creature_entry,px,py,pz,m_caster->GetOrientation(),summonType,duration); - } -} - void Spell::EffectTeleUnitsFaceCaster(uint32 i) { if(!unitTarget) @@ -5723,44 +5815,6 @@ void Spell::EffectCharge(uint32 /*i*/) m_caster->Attack(target, true); } -void Spell::EffectSummonCritter(uint32 i) -{ - if(m_caster->GetTypeId() != TYPEID_PLAYER) - return; - Player* player = (Player*)m_caster; - - uint32 pet_entry = m_spellInfo->EffectMiscValue[i]; - if(!pet_entry) - return; - - float x,y,z; - GetSummonPosition(x, y, z); - - int32 duration = GetSpellDuration(m_spellInfo); - TempSummon *critter = m_caster->GetMap()->SummonCreature(pet_entry, x, y, z, m_caster->GetOrientation(), sSummonPropertiesStore.LookupEntry(m_spellInfo->EffectMiscValueB[i]), duration, m_caster); - if(!critter) - return; - - critter->SetOwner(m_caster, true); - critter->SetCreatorGUID(m_caster->GetGUID()); - critter->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE,m_caster->getFaction()); - critter->SetUInt32Value(UNIT_CREATED_BY_SPELL, m_spellInfo->Id); - - //critter->InitPetCreateSpells(); // e.g. disgusting oozeling has a create spell as critter... - critter->SetMaxHealth(1); - critter->SetHealth(1); - critter->SetLevel(1); - - critter->SetReactState(REACT_PASSIVE); - critter->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - - critter->GetMotionMaster()->MoveTargetedHome(); - - std::string name = player->GetName(); - name.append(petTypeSuffix[3]); - critter->SetName( name ); -} - void Spell::EffectKnockBack(uint32 i) { if(!unitTarget) @@ -6366,78 +6420,6 @@ void Spell::EffectRedirectThreat(uint32 /*i*/) m_caster->SetReducedThreatPercent((uint32)damage, unitTarget->GetGUID()); } -void Spell::SummonTotem(uint32 entry, SummonPropertiesEntry const *properties) -{ - int8 slot = (int8)properties->Slot; - - if(slot >= SUMMON_SLOT_TOTEM && slot < MAX_TOTEM_SLOT) - { - uint64 guid = m_caster->m_SummonSlot[slot]; - if(guid != 0) - { - Creature *OldTotem = m_caster->GetMap()->GetCreature(guid); - if(OldTotem && OldTotem->isTotem()) - ((Totem*)OldTotem)->UnSummon(); - } - } - - uint32 team = 0; - if (m_caster->GetTypeId()==TYPEID_PLAYER) - team = ((Player*)m_caster)->GetTeam(); - - Totem* pTotem = new Totem(properties, m_caster); - - if(!pTotem->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), m_caster->GetMap(), m_caster->GetPhaseMask(), - entry, team )) - { - delete pTotem; - return; - } - - float x,y,z; - GetSummonPosition(x, y, z); - - // totem must be at same Z in case swimming caster and etc. - if( fabs( z - m_caster->GetPositionZ() ) > 5 ) - z = m_caster->GetPositionZ(); - - pTotem->Relocate(x, y, z, m_caster->GetOrientation()); - - if(slot >= SUMMON_SLOT_TOTEM && slot < MAX_TOTEM_SLOT) - m_caster->m_SummonSlot[slot] = pTotem->GetGUID(); - - pTotem->SetOwner(m_caster); - pTotem->SetTypeBySummonSpell(m_spellInfo); // must be after Create call where m_spells initilized - - int32 duration=GetSpellDuration(m_spellInfo); - if(Player* modOwner = m_caster->GetSpellModOwner()) - modOwner->ApplySpellMod(m_spellInfo->Id,SPELLMOD_DURATION, duration); - pTotem->SetDuration(duration); - - if (damage) // if not spell info, DB values used - { - pTotem->SetMaxHealth(damage); - pTotem->SetHealth(damage); - } - - pTotem->SetUInt32Value(UNIT_CREATED_BY_SPELL,m_spellInfo->Id); - - if(m_caster->GetTypeId() == TYPEID_PLAYER) - pTotem->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_PVP_ATTACKABLE); - - pTotem->Summon(m_caster); - - if(slot >= SUMMON_SLOT_TOTEM && slot < MAX_TOTEM_SLOT && m_caster->GetTypeId() == TYPEID_PLAYER) - { - WorldPacket data(SMSG_TOTEM_CREATED, 1+8+4+4); - data << uint8(slot-1); - data << uint64(pTotem->GetGUID()); - data << uint32(duration); - data << uint32(m_spellInfo->Id); - ((Player*)m_caster)->SendDirectMessage(&data); - } -} - void Spell::SummonGuardian(uint32 entry, SummonPropertiesEntry const *properties) { Unit *caster = m_originalCaster; @@ -6486,44 +6468,6 @@ void Spell::SummonGuardian(uint32 entry, SummonPropertiesEntry const *properties } } -void Spell::SummonPossessed(uint32 entry, SummonPropertiesEntry const *properties) -{ - if(m_caster->GetTypeId() != TYPEID_PLAYER) - return; - - uint32 level = m_caster->getLevel(); - - float x, y, z; - m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE); - - int32 duration = GetSpellDuration(m_spellInfo); - - Pet* pet = ((Player*)m_caster)->SummonPet(entry, x, y, z, m_caster->GetOrientation(), POSSESSED_PET, duration); - if(!pet) - return; - - pet->SetUInt32Value(UNIT_CREATED_BY_SPELL, m_spellInfo->Id); - pet->SetCharmedOrPossessedBy(m_caster, true); -} - -void Spell::SummonVehicle(uint32 entry, SummonPropertiesEntry const *properties) -{ - float x, y, z; - m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE); - Vehicle *vehicle = m_caster->SummonVehicle(entry, x, y, z, m_caster->GetOrientation()); - if(!vehicle) - return; - - vehicle->SetUInt64Value(UNIT_FIELD_SUMMONEDBY, m_caster->GetGUID()); - vehicle->SetUInt32Value(UNIT_CREATED_BY_SPELL, m_spellInfo->Id); - - if(damage) - { - m_caster->CastSpell(vehicle, damage, true); - m_caster->EnterVehicle(vehicle); - } -} - void Spell::GetSummonPosition(float &x, float &y, float &z, float radius, uint32 count) { if (m_targets.m_targetMask & TARGET_FLAG_DEST_LOCATION) diff --git a/src/game/TemporarySummon.cpp b/src/game/TemporarySummon.cpp index ed0849a98d6..dd50480e770 100644 --- a/src/game/TemporarySummon.cpp +++ b/src/game/TemporarySummon.cpp @@ -198,9 +198,9 @@ void TempSummon::InitSummon(uint32 duration) { if(owner->m_SummonSlot[slot] && owner->m_SummonSlot[slot] != GetGUID()) { - Creature *OldTotem = GetMap()->GetCreature(owner->m_SummonSlot[slot]); - if(OldTotem && OldTotem->isSummon()) - ((TempSummon*)OldTotem)->UnSummon(); + Creature *oldSummon = GetMap()->GetCreature(owner->m_SummonSlot[slot]); + if(oldSummon && oldSummon->isSummon()) + ((TempSummon*)oldSummon)->UnSummon(); } owner->m_SummonSlot[slot] = GetGUID(); } @@ -264,7 +264,10 @@ bool TempSummon::SetOwner(Unit *owner, bool apply) return false; } if(owner->GetTypeId() == TYPEID_PLAYER) + { m_ControlledByPlayer = true; + SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE); + } } else { diff --git a/src/game/Totem.cpp b/src/game/Totem.cpp index eff78d4e8cd..3bee1c005b2 100644 --- a/src/game/Totem.cpp +++ b/src/game/Totem.cpp @@ -53,8 +53,12 @@ void Totem::Update( uint32 time ) Creature::Update( time ); } -void Totem::Summon(Unit* owner) +void Totem::InitSummon(uint32 duration) { + Unit *owner = GetOwner(); + if(!owner) + return; + CreatureInfo const *cinfo = GetCreatureInfo(); if (owner->GetTypeId()==TYPEID_PLAYER && cinfo) { @@ -79,24 +83,32 @@ void Totem::Summon(Unit* owner) sLog.outErrorDb("Totem::Summon: Missing modelid information for entry %u, team %u, totem will use default values.",GetEntry(),((Player*)owner)->GetTeam()); } - // Only add if a display exists. - sLog.outDebug("AddObject at Totem.cpp line 49"); - SetInstanceId(owner->GetInstanceId()); - owner->GetMap()->Add((Creature*)this); - WorldPacket data(SMSG_GAMEOBJECT_SPAWN_ANIM_OBSOLETE, 8); data << GetGUID(); SendMessageToSet(&data,true); - switch(m_type) - { - case TOTEM_PASSIVE: CastSpell(this, GetSpell(), true); break; - case TOTEM_STATUE: CastSpell(GetOwner(), GetSpell(), true); break; - default: break; - } + if(m_type == TOTEM_PASSIVE) + CastSpell(this, GetSpell(), true); if(GetEntry() == SENTRY_TOTEM_ENTRY) SetReactState(REACT_AGGRESSIVE); + + m_duration = duration; + + SetCreatorGUID(owner->GetGUID()); + setFaction(owner->getFaction()); + SetLevel(owner->getLevel()); + + // Get spell casted by totem + SpellEntry const * totemSpell = sSpellStore.LookupEntry(GetSpell()); + if (totemSpell) + { + // If spell have cast time -> so its active totem + if (GetSpellCastTime(totemSpell)) + m_type = TOTEM_ACTIVE; + } + + TempSummon::InitSummon(duration); } void Totem::UnSummon() @@ -142,14 +154,6 @@ void Totem::UnSummon() AddObjectToRemoveList(); } -void Totem::SetOwner(Unit *owner) -{ - SetCreatorGUID(owner->GetGUID()); - TempSummon::SetOwner(owner, true); - setFaction(owner->getFaction()); - SetLevel(owner->getLevel()); -} - Unit *Totem::GetOwner() { uint64 ownerid = GetOwnerGUID(); @@ -158,20 +162,6 @@ Unit *Totem::GetOwner() return ObjectAccessor::GetUnit(*this, ownerid); } -void Totem::SetTypeBySummonSpell(SpellEntry const * spellProto) -{ - // Get spell casted by totem - SpellEntry const * totemSpell = sSpellStore.LookupEntry(GetSpell()); - if (totemSpell) - { - // If spell have cast time -> so its active totem - if (GetSpellCastTime(totemSpell)) - m_type = TOTEM_ACTIVE; - } - if(spellProto->SpellIconID==2056) - m_type = TOTEM_STATUE; //Jewelery statue -} - bool Totem::IsImmunedToSpellEffect(SpellEntry const* spellInfo, uint32 index) const { // TODO: possibly all negative auras immuned? diff --git a/src/game/Totem.h b/src/game/Totem.h index 1280ebc035d..4738e5d00b7 100644 --- a/src/game/Totem.h +++ b/src/game/Totem.h @@ -27,7 +27,6 @@ enum TotemType { TOTEM_PASSIVE = 0, TOTEM_ACTIVE = 1, - TOTEM_STATUE = 2 }; #define SENTRY_TOTEM_ENTRY 3968 @@ -38,15 +37,12 @@ class Totem : public TempSummon explicit Totem(SummonPropertiesEntry const *properties, Unit *owner); virtual ~Totem(){}; void Update( uint32 time ); - void Summon(Unit* owner); + void InitSummon(uint32 duration); void UnSummon(); uint32 GetSpell() const { return m_spells[0]; } uint32 GetTotemDuration() const { return m_duration; } Unit *GetOwner(); TotemType GetTotemType() const { return m_type; } - void SetTypeBySummonSpell(SpellEntry const * spellProto); - void SetDuration(uint32 dur) { m_duration = dur; } - void SetOwner(Unit *owner); bool UpdateStats(Stats /*stat*/) { return true; } bool UpdateAllStats() { return true; } diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index c0cc4266763..90a2a228397 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -8397,7 +8397,7 @@ uint32 Unit::SpellDamageBonus(Unit *pVictim, SpellEntry const *spellProto, uint3 return pdamage; // For totems get damage bonus from owner (statue isn't totem in fact) - if( GetTypeId()==TYPEID_UNIT && ((Creature*)this)->isTotem() && ((Totem*)this)->GetTotemType()!=TOTEM_STATUE) + if( GetTypeId()==TYPEID_UNIT && ((Creature*)this)->isTotem()) { if(Unit* owner = GetOwner()) return owner->SpellDamageBonus(pVictim, spellProto, pdamage, damagetype); @@ -8970,7 +8970,7 @@ uint32 Unit::SpellHealingBonus(Unit *pVictim, SpellEntry const *spellProto, uint return healamount; // For totems get healing bonus from owner (statue isn't totem in fact) - if( GetTypeId()==TYPEID_UNIT && ((Creature*)this)->isTotem() && ((Totem*)this)->GetTotemType()!=TOTEM_STATUE) + if( GetTypeId()==TYPEID_UNIT && ((Creature*)this)->isTotem()) if(Unit* owner = GetOwner()) return owner->SpellHealingBonus(pVictim, spellProto, healamount, damagetype, stack); |
