Index: src/game/GridNotifiersImpl.h =================================================================== --- src/game/GridNotifiersImpl.h (revision 4141) +++ src/game/GridNotifiersImpl.h (working copy) @@ -160,7 +160,7 @@ return; SpellEntry const *spellInfo = sSpellStore.LookupEntry(i_dynobject.GetSpellId()); - PersistentAreaAura* Aur = new PersistentAreaAura(spellInfo, i_dynobject.GetEffIndex(), target, i_dynobject.GetCaster()); + PersistentAreaAura* Aur = new PersistentAreaAura(spellInfo, i_dynobject.GetEffIndex(), NULL, target, i_dynobject.GetCaster()); target->AddAura(Aur); i_dynobject.AddAffected(target); } Index: src/game/Level3.cpp =================================================================== --- src/game/Level3.cpp (revision 4141) +++ src/game/Level3.cpp (working copy) @@ -2530,7 +2530,7 @@ continue; if (eff == SPELL_EFFECT_APPLY_AURA || eff == SPELL_EFFECT_APPLY_AREA_AURA || eff == SPELL_EFFECT_PERSISTENT_AREA_AURA) { - Aura *Aur = new Aura(spellInfo, i, target); + Aura *Aur = new Aura(spellInfo, i, NULL, target); target->AddAura(Aur); } } Index: src/game/Pet.cpp =================================================================== --- src/game/Pet.cpp (revision 4141) +++ src/game/Pet.cpp (working copy) @@ -1309,13 +1309,13 @@ if(spellproto->Effect[effindex] == SPELL_EFFECT_APPLY_AREA_AURA) //this might give problems if the pet was not the caster; possible: store bool if caster was self or not { - AreaAura* aura = new AreaAura(spellproto, effindex, this, this); + AreaAura* aura = new AreaAura(spellproto, effindex, NULL, this, this); aura->SetAuraDuration(remaintime); AddAura(aura); } else { - Aura* aura = new Aura(spellproto, effindex, this, this/*caster*/); + Aura* aura = new Aura(spellproto, effindex, NULL, this, this/*caster*/); aura->SetAuraDuration(remaintime); AddAura(aura); } Index: src/game/Player.cpp =================================================================== --- src/game/Player.cpp (revision 4141) +++ src/game/Player.cpp (working copy) @@ -11943,8 +11943,8 @@ } // FIXME: real caster not stored in DB currently - - Aura* aura = new Aura(spellproto, effindex, this, this/*caster*/); + // FIXME: real base points not stored in DB currently + Aura* aura = new Aura(spellproto, effindex, NULL, this, this/*caster*/); aura->SetAuraDuration(remaintime); AddAura(aura); } Index: src/game/Spell.cpp =================================================================== --- src/game/Spell.cpp (revision 4141) +++ src/game/Spell.cpp (working copy) @@ -203,19 +203,11 @@ Spell::Spell( Unit* Caster, SpellEntry const *info, bool triggered, Aura* Aur, uint64 originalCasterGUID ) { ASSERT( Caster != NULL && info != NULL ); + ASSERT( info == sSpellStore.LookupEntry( info->Id ) && "`info` must be pointer to sSpellStore element"); Player* p_caster; - // make own copy of custom `info` (`info` can be created at stack) for non-triggered spell - // copy custom SpellEntry in m_spellInfo will be delete at Spell delete - if(info != sSpellStore.LookupEntry( info->Id ) && !triggered) - { - SpellEntry* sInfo = new SpellEntry; - *sInfo = *info; - m_spellInfo = sInfo; - } - else - m_spellInfo = info; + m_spellInfo = info; m_caster = Caster; @@ -231,6 +223,9 @@ else m_originalCaster = ObjectAccessor::Instance().GetUnit(*m_caster,m_originalCasterGUID); + for(int i=0; i <3; ++i) + m_currentBasePoints[i] = m_spellInfo->EffectBasePoints[i]; + m_spellState = SPELL_STATE_NULL; m_castPositionX = m_castPositionY = m_castPositionZ = 0; @@ -282,9 +277,6 @@ Spell::~Spell() { - // free custom m_spellInfo for non-triggered spell - if(m_spellInfo != sSpellStore.LookupEntry(m_spellInfo->Id) && !m_IsTriggeredSpell) - delete m_spellInfo; } void Spell::FillTargetMap() @@ -2905,7 +2897,7 @@ int32 Spell::CalculateDamage(uint8 i) { - int32 value = m_caster->CalculateSpellDamage(m_spellInfo,i); + int32 value = m_caster->CalculateSpellDamage(m_spellInfo,i,m_currentBasePoints[i]); if(m_caster->GetTypeId() == TYPEID_PLAYER) ((Player*)m_caster)->ApplySpellMod(m_spellInfo->Id, SPELLMOD_DAMAGE, value); Index: src/game/Spell.h =================================================================== --- src/game/Spell.h (revision 4141) +++ src/game/Spell.h (working copy) @@ -470,6 +470,7 @@ void EffectPickPocket(uint32 i); void EffectAddFarsight(uint32 i); void EffectSummonWild(uint32 i); + void EffectSummonGuardian(uint32 i); void EffectTeleUnitsFaceCaster(uint32 i); void EffectLearnSkill(uint32 i); void EffectTradeSkill(uint32 i); @@ -572,6 +573,7 @@ //void HandleAddAura(Unit* Target); SpellEntry const* m_spellInfo; + int32 m_currentBasePoints[3]; // cache SpellEntry::EffectBasePoints and use for set custom base points Item* m_CastItem; SpellCastTargets m_targets; @@ -594,7 +596,6 @@ protected: void SendLoot(uint64 guid, LootType loottype); - Unit* m_caster; uint64 m_originalCasterGUID; // real source of cast (aura caster/etc), used for spell targets selection Index: src/game/SpellAuras.cpp =================================================================== --- src/game/SpellAuras.cpp (revision 4141) +++ src/game/SpellAuras.cpp (working copy) @@ -287,7 +287,7 @@ &Aura::HandleNULL //234 SPELL_AURA_SILENCE_RESISTANCE }; -Aura::Aura(SpellEntry const* spellproto, uint32 eff, Unit *target, Unit *caster, Item* castItem) : +Aura::Aura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster, Item* castItem) : m_procCharges(0), m_absorbDmg(0), m_spellmod(NULL), m_spellId(spellproto->Id), m_effIndex(eff), m_caster_guid(0), m_target(target), m_timeCla(1000), m_castItemGuid(castItem?castItem->GetGUID():0), m_auraSlot(MAX_AURAS), m_positive(false), m_permanent(false), m_isPeriodic(false), m_isTrigger(false), m_isAreaAura(false), m_isPersistent(false), @@ -295,17 +295,12 @@ { assert(target); - // make own copy of custom `spellproto` (`spellproto` will be deleted at spell cast finished) - // copy custom SpellEntry in m_spellProto will be delete at Aura delete - if(spellproto != sSpellStore.LookupEntry( spellproto->Id )) - { - SpellEntry* sInfo = new SpellEntry; - *sInfo = *spellproto; - m_spellProto = sInfo; - } - else - m_spellProto = spellproto; + assert(spellproto == sSpellStore.LookupEntry( spellproto->Id ) && "`info` must be pointer to sSpellStore element"); + m_spellProto = spellproto; + + m_currentBasePoints = currentBasePoints ? *currentBasePoints : m_spellProto->EffectBasePoints[eff]; + m_isPassive = IsPassiveSpell(m_spellId); m_duration = GetDuration(spellproto); @@ -383,8 +378,8 @@ delete m_spellProto; } -AreaAura::AreaAura(SpellEntry const* spellproto, uint32 eff, Unit *target, -Unit *caster, Item* castItem) : Aura(spellproto, eff, target, caster, castItem) +AreaAura::AreaAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, +Unit *caster, Item* castItem) : Aura(spellproto, eff, currentBasePoints, target, caster, castItem) { m_isAreaAura = true; } @@ -393,8 +388,8 @@ { } -PersistentAreaAura::PersistentAreaAura(SpellEntry const* spellproto, uint32 eff, Unit *target, -Unit *caster, Item* castItem) : Aura(spellproto, eff, target, caster, castItem) +PersistentAreaAura::PersistentAreaAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, +Unit *caster, Item* castItem) : Aura(spellproto, eff, currentBasePoints, target, caster, castItem) { m_isPersistent = true; } @@ -421,7 +416,7 @@ if(!caster) caster = m_target; - return caster->CalculateSpellDamage(spellproto,m_effIndex); + return caster->CalculateSpellDamage(spellproto,m_effIndex,m_currentBasePoints); } void Aura::SetModifier(uint8 t, int32 a, uint32 pt, int32 miscValue, uint32 miscValue2) @@ -563,7 +558,7 @@ // apply aura to players in range that dont have it yet if (!t_aura) { - AreaAura *aur = new AreaAura(GetSpellProto(), m_effIndex, Target, caster); + AreaAura *aur = new AreaAura(GetSpellProto(), m_effIndex, &m_currentBasePoints, Target, caster); Target->AddAura(aur); } } @@ -587,7 +582,7 @@ { if (!o_aura) { - AreaAura *aur = new AreaAura(GetSpellProto(), m_effIndex, owner, caster); + AreaAura *aur = new AreaAura(GetSpellProto(), m_effIndex, &m_currentBasePoints, owner, caster); owner->AddAura(aur); } } @@ -3503,12 +3498,7 @@ if ((*i)->GetSpellProto()->SpellIconID == 240 && (*i)->GetModifier()->m_miscvalue == 3) HotWMod = (*i)->GetModifier()->m_amount; if (HotWMod) - { - SpellEntry const *HotWTemplate = sSpellStore.LookupEntry(HotWSpellId); - SpellEntry HotWCustom = *HotWTemplate; - HotWCustom.EffectBasePoints[0] = HotWMod; - m_target->CastSpell(m_target, &HotWCustom, true); - } + m_target->CastSpell(m_target, HotWSpellId, &HotWMod, NULL, NULL, true); } } } Index: src/game/SpellAuras.h =================================================================== --- src/game/SpellAuras.h (revision 4141) +++ src/game/SpellAuras.h (working copy) @@ -185,7 +185,7 @@ void HandleModSpellCritChanceShool(bool apply, bool Real); void HandleAuraRetainComboPoints(bool apply, bool Real); - Aura(SpellEntry const* spellproto, uint32 eff, Unit *target, Unit *caster = NULL, Item* castItem = NULL); + Aura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster = NULL, Item* castItem = NULL); virtual ~Aura(); void SetModifier(uint8 t, int32 a, uint32 pt, int32 miscValue, uint32 miscValue2); @@ -244,6 +244,7 @@ uint32 m_spellId; uint32 m_effIndex; SpellEntry const *m_spellProto; + int32 m_currentBasePoints; // cache SpellEntry::EffectBasePoints and use for set custom base points uint64 m_caster_guid; Unit* m_target; int32 m_duration; @@ -273,7 +274,7 @@ class AreaAura : public Aura { public: - AreaAura(SpellEntry const* spellproto, uint32 eff, Unit *target, Unit *caster = NULL, Item* castItem = NULL); + AreaAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster = NULL, Item* castItem = NULL); ~AreaAura(); void Update(uint32 diff); }; @@ -281,7 +282,7 @@ class PersistentAreaAura : public Aura { public: - PersistentAreaAura(SpellEntry const* spellproto, uint32 eff, Unit *target, Unit *caster = NULL, Item* castItem = NULL); + PersistentAreaAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster = NULL, Item* castItem = NULL); ~PersistentAreaAura(); void Update(uint32 diff); }; Index: src/game/SpellEffects.cpp =================================================================== --- src/game/SpellEffects.cpp (revision 4141) +++ src/game/SpellEffects.cpp (working copy) @@ -98,7 +98,7 @@ &Spell::EffectNULL, // 39 SPELL_EFFECT_LANGUAGE &Spell::EffectDualWield, // 40 SPELL_EFFECT_DUAL_WIELD &Spell::EffectSummonWild, // 41 SPELL_EFFECT_SUMMON_WILD - &Spell::EffectSummonWild, // 42 SPELL_EFFECT_SUMMON_GUARDIAN + &Spell::EffectSummonGuardian, // 42 SPELL_EFFECT_SUMMON_GUARDIAN &Spell::EffectTeleUnitsFaceCaster, // 43 SPELL_EFFECT_TELEPORT_UNITS_FACE_CASTER &Spell::EffectLearnSkill, // 44 SPELL_EFFECT_SKILL_STEP &Spell::EffectNULL, // 45 SPELL_EFFECT_ADD_HONOR honor/pvp related @@ -129,7 +129,7 @@ &Spell::EffectNULL, // 70 SPELL_EFFECT_PULL one spell: Distract Move &Spell::EffectPickPocket, // 71 SPELL_EFFECT_PICKPOCKET &Spell::EffectAddFarsight, // 72 SPELL_EFFECT_ADD_FARSIGHT - &Spell::EffectSummonWild, // 73 SPELL_EFFECT_SUMMON_POSSESSED + &Spell::EffectSummonGuardian, // 73 SPELL_EFFECT_SUMMON_POSSESSED &Spell::EffectNULL, // 74 SPELL_EFFECT_SUMMON_TOTEM &Spell::EffectNULL, // 75 SPELL_EFFECT_HEAL_MECHANICAL one spell: Mechanical Patch Kit &Spell::EffectSummonObjectWild, // 76 SPELL_EFFECT_SUMMON_OBJECT_WILD @@ -259,11 +259,8 @@ // Charge if(m_spellInfo->SpellVisual == 867 && m_spellInfo->SpellIconID == 457) { - uint32 rage = m_spellInfo->EffectBasePoints[i]; - SpellEntry const* OriginalCharge = sSpellStore.LookupEntry(34846); - SpellEntry CustomCharge = *OriginalCharge; - CustomCharge.EffectBasePoints[0] = rage; - m_caster->CastSpell(m_caster,&CustomCharge,true); + int32 chargeBasePoints0 = m_spellInfo->EffectBasePoints[i]; + m_caster->CastCustomSpell(m_caster,34846,&chargeBasePoints0,NULL,NULL,true); return; } @@ -411,13 +408,11 @@ melee_mod = 30; if (healthPerc < 100 && healthPerc > 40) melee_mod = 10+(100-healthPerc)/3; - SpellEntry const *OriginalHasteModSpell = sSpellStore.LookupEntry(26635); - SpellEntry CustomHasteModSpell = *OriginalHasteModSpell; - CustomHasteModSpell.EffectBasePoints[0] = melee_mod-1; - // (EffectBasePoints[0]+1)-1+(5-melee_mod) = (melee_mod-1+1)-1+5-melee_mod = 5-1 - CustomHasteModSpell.EffectBasePoints[1] = (5-melee_mod)-1; - CustomHasteModSpell.EffectBasePoints[2] = 5-1; - m_caster->CastSpell(m_caster,&CustomHasteModSpell,true,NULL); + + int32 hasteModBasePoints0 = melee_mod-1; // (EffectBasePoints[0]+1)-1+(5-melee_mod) = (melee_mod-1+1)-1+5-melee_mod = 5-1 + int32 hasteModBasePoints1 = (5-melee_mod)-1; + int32 hasteModBasePoints2 = 5-1; + m_caster->CastCustomSpell(m_caster,26635,&hasteModBasePoints0,&hasteModBasePoints1,&hasteModBasePoints2,true,NULL); return; } @@ -426,12 +421,8 @@ if(!unitTarget) return; - int32 dmg = damage; - dmg += int32(m_caster->GetPower(POWER_RAGE) * m_spellInfo->DmgMultiplier[i]); - SpellEntry const *tspellInfo = sSpellStore.LookupEntry(20647); - SpellEntry sInfo = *tspellInfo; - sInfo.EffectBasePoints[0] = dmg-1; - m_caster->CastSpell(unitTarget, &sInfo, true, 0); + int32 basePoints0 = damage+int32(m_caster->GetPower(POWER_RAGE) * m_spellInfo->DmgMultiplier[i])-1; + m_caster->CastCustomSpell(unitTarget, 20647, &basePoints0, NULL, NULL, true, 0); m_caster->SetPower(POWER_RAGE,0); return; } @@ -444,14 +435,9 @@ case 5420: { // Tree of Life area effect - SpellEntry const* spellInfo = sSpellStore.LookupEntry( 34123 ); - if(!spellInfo) - return; - int32 health_mod = int32(m_caster->GetStat(STAT_SPIRIT)/4); - SpellEntry customSpellInfo = *spellInfo; - customSpellInfo.EffectBasePoints[0] = health_mod-1; - m_caster->CastSpell(m_caster,&customSpellInfo,true,NULL); + int32 treeHealthBasePoints0 = health_mod-1; + m_caster->CastCustomSpell(m_caster,34123,&treeHealthBasePoints0,NULL,NULL,true,NULL); return; } @@ -481,11 +467,9 @@ //Last Stand case 12975: { - uint32 health_mod = uint32(m_caster->GetMaxHealth()*0.3); - SpellEntry const* OriginalHealthModSpell = sSpellStore.LookupEntry(12976); - SpellEntry CustomHealthModSpell = *OriginalHealthModSpell; - CustomHealthModSpell.EffectBasePoints[0] = health_mod; //12976 has a base dice of 0, so no decrement needed - m_caster->CastSpell(m_caster,&CustomHealthModSpell,true,NULL); + //12976 has a base dice of 0, so no decrement needed + int32 healthModSpellBasePoints0 = int32(m_caster->GetMaxHealth()*0.3); + m_caster->CastCustomSpell(m_caster, 12976, &healthModSpellBasePoints0, NULL, NULL, true, NULL); return; } @@ -607,9 +591,6 @@ else damage = (m_caster->GetFloatValue(UNIT_FIELD_MINDAMAGE) + m_caster->GetFloatValue(UNIT_FIELD_MAXDAMAGE))/2; - SpellEntry const *deepWoundsDotTemplate = sSpellStore.LookupEntry(12721); - SpellEntry deepWoundsDot = *deepWoundsDotTemplate; - switch (m_spellInfo->Id) { case 12850: damage *= 0.2f; break; @@ -620,8 +601,8 @@ return; }; - deepWoundsDot.EffectBasePoints[0] = int32(damage / 4) - 1; - m_caster->CastSpell(unitTarget, &deepWoundsDot, true, NULL); + int32 deepWoundsDotBasePoints0 = int32(damage / 4) - 1; + m_caster->CastCustomSpell(unitTarget, 12721, &deepWoundsDotBasePoints0, NULL, NULL, true, NULL); return; } @@ -884,7 +865,7 @@ sLog.outDebug("Spell: Aura is: %u", m_spellInfo->EffectApplyAuraName[i]); - Aura* Aur = new Aura(m_spellInfo, i, unitTarget,m_caster, m_CastItem); + Aura* Aur = new Aura(m_spellInfo, i, &m_currentBasePoints[i], unitTarget,m_caster, m_CastItem); if(!Aur) // is it useless? return; @@ -980,7 +961,7 @@ SpellEntry const *AdditionalSpellInfo = sSpellStore.LookupEntry(spellId); if (AdditionalSpellInfo) { - Aura* AdditionalAura = new Aura(AdditionalSpellInfo, 0, unitTarget,m_caster, 0); + Aura* AdditionalAura = new Aura(AdditionalSpellInfo, 0, &m_currentBasePoints[0], unitTarget,m_caster, 0); unitTarget->AddAura(AdditionalAura, 0); sLog.outDebug("Spell: Additional Aura is: %u", AdditionalSpellInfo->EffectApplyAuraName[0]); } @@ -1542,7 +1523,7 @@ if(!unitTarget->isAlive()) return; - AreaAura* Aur = new AreaAura(m_spellInfo, i, unitTarget, m_caster); + AreaAura* Aur = new AreaAura(m_spellInfo, i, &m_currentBasePoints[i], unitTarget, m_caster); unitTarget->AddAura(Aur); } @@ -1715,6 +1696,53 @@ 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; + } + } + } + + // select center of summon position + float center_x = m_targets.m_destX; + float center_y = m_targets.m_destY; + float center_z = m_targets.m_destZ; + + if (center_x == 0 || center_y == 0 || center_z == 0) + m_caster->GetClosePoint(NULL, center_x, center_y, center_z); + + float radius = GetRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i])); + + int32 amount = damage > 0 ? damage : 1; + + for(int32 count = 0; count < amount; ++count) + { + float px, py, pz; + m_caster->GetRandomPoint(center_x,center_y,center_z,radius,px,py,pz); + + int32 duration = GetDuration(m_spellInfo); + + TempSummonType summonType = (duration == 0) ? TEMPSUMMON_DEAD_DESPAWN : TEMPSUMMON_TIMED_OR_DEAD_DESPAWN; + + m_caster->SummonCreature(creature_entry,px,py,pz,m_caster->GetOrientation(),summonType,duration); + } +} + +void Spell::EffectSummonGuardian(uint32 i) +{ uint32 pet_entry = m_spellInfo->EffectMiscValue[i]; if(!pet_entry) return; @@ -1816,27 +1844,8 @@ spawnCreature->SetArmor(level*50); spawnCreature->AIM_Initialize(); - /* not set name for guardians/minpets - std::string name; - if(m_caster->GetTypeId() == TYPEID_PLAYER) - name = ((Player*)m_caster)->GetName(); - else - name = ((Creature*)m_caster)->GetCreatureInfo()->Name; - name.append(petTypeSuffix[spawnCreature->getPetType()]); - spawnCreature->SetName( name ); - */ - ObjectAccessor::Instance().AddPet(spawnCreature); MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster)->Add((Creature*)spawnCreature); - /* - guardians and wilds can't be controlled - if(m_caster->GetTypeId() == TYPEID_PLAYER) - { - m_caster->SetPet(spawnCreature); - ((Player*)m_caster)->PetSpellInitialize(); - ((Player*)m_caster)->SavePet(); - } - */ } } } @@ -2838,15 +2847,8 @@ _player->DestroyItemCount(itemTarget,count,true); // TODO: fix crash when a spell has two effects, both pointed at the same item target - SpellEntry const *feedTemplate = sSpellStore.LookupEntry(m_spellInfo->EffectTriggerSpell[i]); - SpellEntry feedCustom = *feedTemplate; - - feedCustom.EffectBasePoints[0] = pet->GetCurrentFoodBenefit() -1; - - Spell _spell(m_caster, &feedCustom, true, 0); - SpellCastTargets targets; - targets.setUnitTarget(m_caster); - _spell.prepare(&targets); + int32 feedCustomBasePoints0 = pet->GetCurrentFoodBenefit() -1; + m_caster->CastCustomSpell(m_caster,m_spellInfo->EffectTriggerSpell[i],&feedCustomBasePoints0,NULL,NULL,true); } void Spell::EffectDismissPet(uint32 i) @@ -3424,7 +3426,7 @@ if (px == 0 || py == 0 || pz == 0) m_caster->GetClosePoint(NULL, px, py, pz); - Creature* Charmed = m_caster->SummonCreature(m_spellInfo->EffectMiscValue[i], m_caster->GetMapId(), px, py, pz, m_caster->GetOrientation(),TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,3600000); + Creature* Charmed = m_caster->SummonCreature(m_spellInfo->EffectMiscValue[i], px, py, pz, m_caster->GetOrientation(),TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,3600000); //might not always work correctly, maybe the creature that dies from CoD casts the effect on itself and is therefore the caster? Charmed->SetLevel(m_caster->getLevel()); Index: src/game/Unit.cpp =================================================================== --- src/game/Unit.cpp (revision 4141) +++ src/game/Unit.cpp (working copy) @@ -830,6 +830,49 @@ if (triggered) delete spell; // triggered spell not self deleted } +void Unit::CastCustomSpell(Unit* Victim,uint32 spellId, int32 const* bp0, int32 const* bp1, int32 const* bp2, bool triggered, Item *castItem, Aura* triggredByAura, uint64 originalCaster) +{ + SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellId ); + + if(!spellInfo) + { + sLog.outError("WORLD: unknown spell id %i\n", spellId); + return; + } + + CastCustomSpell(Victim,spellInfo,bp0,bp1,bp2,triggered,castItem,triggredByAura, originalCaster); +} + +void Unit::CastCustomSpell(Unit* Victim,SpellEntry const *spellInfo, int32 const* bp0, int32 const* bp1, int32 const* bp2, bool triggered, Item *castItem, Aura* triggredByAura, uint64 originalCaster) +{ + if(!spellInfo) + { + sLog.outError("WORLD: unknown spell "); + return; + } + + if (castItem) + DEBUG_LOG("WORLD: cast Item spellId - %i", spellInfo->Id); + + Spell *spell = new Spell(this, spellInfo, triggered, triggredByAura,originalCaster); + + if(bp0) + spell->m_currentBasePoints[0] = *bp0; + + if(bp1) + spell->m_currentBasePoints[1] = *bp1; + + if(bp2) + spell->m_currentBasePoints[2] = *bp2; + + SpellCastTargets targets; + targets.setUnitTarget( Victim ); + spell->m_CastItem = castItem; + spell->prepare(&targets); + m_canMove = false; + if (triggered) delete spell; // triggered spell not self deleted +} + void Unit::DealDamageBySchool(Unit *pVictim, SpellEntry const *spellInfo, uint32 *damage, CleanDamage *cleanDamage, bool *crit, bool isTriggeredSpell) { @@ -1082,7 +1125,6 @@ void Unit::PeriodicAuraLog(Unit *pVictim, SpellEntry const *spellProto, Modifier *mod, uint8 effect_idx) { uint32 procFlag = 0; - SpellEntry localSpellProto = *spellProto; if(!this || !pVictim || !isAlive() || !pVictim->isAlive()) { return; @@ -1095,25 +1137,25 @@ if(mod->m_auraname != SPELL_AURA_PERIODIC_HEAL && mod->m_auraname != SPELL_AURA_OBS_MOD_HEALTH) { //Calculate armor mitigation if it is a physical spell - if (localSpellProto.School == 0) + if (spellProto->School == 0) { uint32 pdamageReductedArmor = CalcArmorReducedDamage(pVictim, pdamage); cleanDamage.damage += pdamage - pdamageReductedArmor; pdamage = pdamageReductedArmor; } - CalcAbsorbResist(pVictim, localSpellProto.School, pdamage, &absorb, &resist); + CalcAbsorbResist(pVictim, spellProto->School, pdamage, &absorb, &resist); } sLog.outDetail("PeriodicAuraLog: %u (TypeId: %u) attacked %u (TypeId: %u) for %u dmg inflicted by %u abs is %u", - GetGUIDLow(), GetTypeId(), pVictim->GetGUIDLow(), pVictim->GetTypeId(), pdamage, localSpellProto.Id,absorb); + GetGUIDLow(), GetTypeId(), pVictim->GetGUIDLow(), pVictim->GetTypeId(), pdamage, spellProto->Id,absorb); switch(mod->m_auraname) { case SPELL_AURA_PERIODIC_DAMAGE: case SPELL_AURA_PERIODIC_DAMAGE_PERCENT: { - pdamage = SpellDamageBonus(pVictim,&localSpellProto,pdamage,DOT); + pdamage = SpellDamageBonus(pVictim,spellProto,pdamage,DOT); if(mod->m_auraname == SPELL_AURA_PERIODIC_DAMAGE_PERCENT) pdamage = GetHealth()*(100+mod->m_amount)/100; @@ -1121,43 +1163,43 @@ WorldPacket data(SMSG_PERIODICAURALOG, (21+16)); // we guess size data.append(pVictim->GetPackGUID()); data.append(GetPackGUID()); - data << uint32(localSpellProto.Id); + data << uint32(spellProto->Id); data << uint32(1); data << uint32(mod->m_auraname); data << (uint32)pdamage; - data << (uint32)localSpellProto.School; + data << (uint32)spellProto->School; data << (uint32)absorb; data << (uint32)resist; SendMessageToSet(&data,true); - DealDamage(pVictim, (pdamage <= absorb+resist) ? 0 : (pdamage-absorb-resist), &cleanDamage, DOT, localSpellProto.School, &localSpellProto, procFlag, true); - ProcDamageAndSpell(pVictim, 0, PROC_FLAG_TAKE_DAMAGE, (pdamage <= absorb+resist) ? 0 : (pdamage-absorb-resist), &localSpellProto); + DealDamage(pVictim, (pdamage <= absorb+resist) ? 0 : (pdamage-absorb-resist), &cleanDamage, DOT, spellProto->School, spellProto, procFlag, true); + ProcDamageAndSpell(pVictim, 0, PROC_FLAG_TAKE_DAMAGE, (pdamage <= absorb+resist) ? 0 : (pdamage-absorb-resist), spellProto); break; } case SPELL_AURA_PERIODIC_HEAL: case SPELL_AURA_OBS_MOD_HEALTH: { - pdamage = SpellHealingBonus(&localSpellProto, pdamage, DOT, pVictim); + pdamage = SpellHealingBonus(spellProto, pdamage, DOT, pVictim); WorldPacket data(SMSG_PERIODICAURALOG, (21+16)); // we guess size data.append(pVictim->GetPackGUID()); data.append(GetPackGUID()); - data << uint32(localSpellProto.Id); + data << uint32(spellProto->Id); data << uint32(1); data << uint32(mod->m_auraname); data << (uint32)pdamage; SendMessageToSet(&data,true); int32 gain = pVictim->ModifyHealth(pdamage); - pVictim->getHostilRefManager().threatAssist(this, float(gain) * 0.5f, localSpellProto.School, &localSpellProto); + pVictim->getHostilRefManager().threatAssist(this, float(gain) * 0.5f, spellProto->School, spellProto); // heal for caster damage - if(pVictim!=this && localSpellProto.SpellVisual==163) + if(pVictim!=this && spellProto->SpellVisual==163) { - uint32 dmg = localSpellProto.manaPerSecond; + uint32 dmg = spellProto->manaPerSecond; if(GetHealth() <= dmg && GetTypeId()==TYPEID_PLAYER) { - RemoveAurasDueToSpell(localSpellProto.Id); + RemoveAurasDueToSpell(spellProto->Id); if(m_currentSpell) { if(m_currentSpell->IsChanneledSpell()) @@ -1167,38 +1209,38 @@ } else { - SendSpellNonMeleeDamageLog(this, localSpellProto.Id, gain, localSpellProto.School, 0, 0, false, 0, false); - DealDamage(this, gain, &cleanDamage, NODAMAGE, localSpellProto.School, &localSpellProto, PROC_FLAG_HEAL, true); + SendSpellNonMeleeDamageLog(this, spellProto->Id, gain, spellProto->School, 0, 0, false, 0, false); + DealDamage(this, gain, &cleanDamage, NODAMAGE, spellProto->School, spellProto, PROC_FLAG_HEAL, true); } } if(mod->m_auraname == SPELL_AURA_PERIODIC_HEAL && pVictim != this) - ProcDamageAndSpell(pVictim, PROC_FLAG_HEAL, PROC_FLAG_HEALED, pdamage, &localSpellProto); + ProcDamageAndSpell(pVictim, PROC_FLAG_HEAL, PROC_FLAG_HEALED, pdamage, spellProto); break; } case SPELL_AURA_PERIODIC_LEECH: { - float multiplier = localSpellProto.EffectMultipleValue[effect_idx] > 0 ? localSpellProto.EffectMultipleValue[effect_idx] : 1; + float multiplier = spellProto->EffectMultipleValue[effect_idx] > 0 ? spellProto->EffectMultipleValue[effect_idx] : 1; uint32 pdamage = mod->m_amount; - pdamage = SpellDamageBonus(pVictim,&localSpellProto,pdamage,DOT); + pdamage = SpellDamageBonus(pVictim,spellProto,pdamage,DOT); if(pVictim->GetHealth() < pdamage) pdamage = uint32(pVictim->GetHealth()); - SendSpellNonMeleeDamageLog(pVictim, localSpellProto.Id, pdamage, localSpellProto.School, absorb, resist, false, 0); - DealDamage(pVictim, (pdamage <= absorb+resist) ? 0 : (pdamage-absorb-resist), &cleanDamage, DOT, localSpellProto.School, &localSpellProto, procFlag, false); - ProcDamageAndSpell(pVictim, PROC_FLAG_HIT_SPELL, PROC_FLAG_TAKE_DAMAGE, (pdamage <= absorb+resist) ? 0 : (pdamage-absorb-resist), &localSpellProto); + SendSpellNonMeleeDamageLog(pVictim, spellProto->Id, pdamage, spellProto->School, absorb, resist, false, 0); + DealDamage(pVictim, (pdamage <= absorb+resist) ? 0 : (pdamage-absorb-resist), &cleanDamage, DOT, spellProto->School, spellProto, procFlag, false); + ProcDamageAndSpell(pVictim, PROC_FLAG_HIT_SPELL, PROC_FLAG_TAKE_DAMAGE, (pdamage <= absorb+resist) ? 0 : (pdamage-absorb-resist), spellProto); if (!pVictim->isAlive() && m_currentSpell) if (m_currentSpell->m_spellInfo) - if (m_currentSpell->m_spellInfo->Id == localSpellProto.Id) + if (m_currentSpell->m_spellInfo->Id == spellProto->Id) m_currentSpell->cancel(); int32 gain = ModifyHealth(int32(pdamage * multiplier)); - getHostilRefManager().threatAssist(this, float(gain) * 0.5f, localSpellProto.School, &localSpellProto); + getHostilRefManager().threatAssist(this, float(gain) * 0.5f, spellProto->School, spellProto); if(GetTypeId() == TYPEID_PLAYER) - SendHealSpellOnPlayer(this, localSpellProto.Id, uint32(pdamage * multiplier)); + SendHealSpellOnPlayer(this, spellProto->Id, uint32(pdamage * multiplier)); break; } case SPELL_AURA_PERIODIC_MANA_LEECH: @@ -1212,12 +1254,12 @@ pVictim->ModifyPower(power, -drain_amount); - float gain_multiplier = GetMaxPower(power) > 0 ? localSpellProto.EffectMultipleValue[effect_idx] : 0; + float gain_multiplier = GetMaxPower(power) > 0 ? spellProto->EffectMultipleValue[effect_idx] : 0; WorldPacket data(SMSG_PERIODICAURALOG, (21+16)); // we guess size data.append(pVictim->GetPackGUID()); data.append(GetPackGUID()); - data << uint32(localSpellProto.Id); + data << uint32(spellProto->Id); data << uint32(1); data << uint32(mod->m_auraname); data << (uint32)power; // power type @@ -1230,7 +1272,7 @@ if(gain_amount) { int32 gain = ModifyPower(power,gain_amount); - pVictim->AddThreat(this, float(gain) * 0.5f, localSpellProto.School, &localSpellProto); + pVictim->AddThreat(this, float(gain) * 0.5f, spellProto->School, spellProto); } break; } @@ -1247,7 +1289,7 @@ WorldPacket data(SMSG_PERIODICAURALOG, (21+16)); // we guess size data.append(pVictim->GetPackGUID()); data.append(GetPackGUID()); - data << uint32(localSpellProto.Id); + data << uint32(spellProto->Id); data << uint32(1); data << uint32(mod->m_auraname); data << (uint32)power; // power type @@ -1255,7 +1297,7 @@ SendMessageToSet(&data,true); int32 gain = pVictim->ModifyPower(power,mod->m_amount); - pVictim->getHostilRefManager().threatAssist(this, float(gain) * 0.5f, localSpellProto.School, &localSpellProto); + pVictim->getHostilRefManager().threatAssist(this, float(gain) * 0.5f, spellProto->School, spellProto); break; } case SPELL_AURA_OBS_MOD_MANA: @@ -1266,7 +1308,7 @@ WorldPacket data(SMSG_PERIODICAURALOG, (21+16)); // we guess size data.append(pVictim->GetPackGUID()); data.append(GetPackGUID()); - data << uint32(localSpellProto.Id); + data << uint32(spellProto->Id); data << uint32(1); data << uint32(mod->m_auraname); data << (uint32)mod->m_amount; @@ -1274,7 +1316,7 @@ SendMessageToSet(&data,true); int32 gain = ModifyPower(POWER_MANA, mod->m_amount); - getHostilRefManager().threatAssist(this, float(gain) * 0.5f, localSpellProto.School, &localSpellProto); + getHostilRefManager().threatAssist(this, float(gain) * 0.5f, spellProto->School, spellProto); break; } } @@ -3444,21 +3486,20 @@ if(!pVictim) return; - SpellEntry const *igniteDotTemplate = sSpellStore.LookupEntry(12654); - SpellEntry igniteDot = *igniteDotTemplate; + int32 igniteDotBasePoints0; switch (dummySpell->Id) { - case 11119: igniteDot.EffectBasePoints[0]=int32(0.04f*damage)-1; break; - case 11120: igniteDot.EffectBasePoints[0]=int32(0.08f*damage)-1; break; - case 12846: igniteDot.EffectBasePoints[0]=int32(0.12f*damage)-1; break; - case 12847: igniteDot.EffectBasePoints[0]=int32(0.16f*damage)-1; break; - case 12848: igniteDot.EffectBasePoints[0]=int32(0.20f*damage)-1; break; + case 11119: igniteDotBasePoints0=int32(0.04f*damage)-1; break; + case 11120: igniteDotBasePoints0=int32(0.08f*damage)-1; break; + case 12846: igniteDotBasePoints0=int32(0.12f*damage)-1; break; + case 12847: igniteDotBasePoints0=int32(0.16f*damage)-1; break; + case 12848: igniteDotBasePoints0=int32(0.20f*damage)-1; break; default: sLog.outError("Unit::HandleDummyAuraProc: non handled spell id: %u (IG)",dummySpell->Id); return; }; - CastSpell(pVictim, &igniteDot, true, NULL, triggredByAura); + CastCustomSpell(pVictim, 12654, &igniteDotBasePoints0, NULL, NULL, true, NULL, triggredByAura); return; } @@ -3480,10 +3521,8 @@ if(triggredByAura->GetCasterGUID() == pVictim->GetGUID()) { - SpellEntry const *VEHealTemplate = sSpellStore.LookupEntry(15290); - SpellEntry VEHeal = *VEHealTemplate; - VEHeal.EffectBasePoints[0] = triggredByAura->GetModifier()->m_amount*damage/100; //VEHeal has a BaseDice of 0, so no decrement needed - pVictim->CastSpell(pVictim, &VEHeal, true, NULL, triggredByAura); + int32 VEHealBasePoints0 = triggredByAura->GetModifier()->m_amount*damage/100; //VEHeal has a BaseDice of 0, so no decrement needed + pVictim->CastCustomSpell(pVictim, 15290, &VEHealBasePoints0, NULL, NULL, true, NULL, triggredByAura); } return; @@ -3499,10 +3538,8 @@ if(backDamage > GetMaxHealth()/2) backDamage = GetMaxHealth()/2; - SpellEntry const *YYDamageTemplate = sSpellStore.LookupEntry(25997); - SpellEntry YYDamage = *YYDamageTemplate; - YYDamage.EffectBasePoints[0] = backDamage-1; - CastSpell(pVictim, &YYDamage, true, NULL, triggredByAura); + int32 YYDamageBasePoints0 = backDamage-1; + CastCustomSpell(pVictim, 25997, &YYDamageBasePoints0, NULL, NULL, true, NULL, triggredByAura); return; } @@ -3517,10 +3554,8 @@ // if healed by another unit (pVictim) if(this != pVictim) { - SpellEntry const *SAHealTemplate = sSpellStore.LookupEntry(31786); - SpellEntry SAHeal = *SAHealTemplate; - SAHeal.EffectBasePoints[0] = triggredByAura->GetModifier()->m_amount*damage/100-1; - CastSpell(this, &SAHeal, true, NULL, triggredByAura); + int32 SAHealBasePoints0 = triggredByAura->GetModifier()->m_amount*damage/100-1; + CastCustomSpell(this, 31786, &SAHealBasePoints0, NULL, NULL, true, NULL, triggredByAura); } return; @@ -3539,10 +3574,8 @@ if(triggredByAura->GetCasterGUID() == pVictim->GetGUID()) { - SpellEntry const *VTEnergizeTemplate = sSpellStore.LookupEntry(34919); - SpellEntry VTEnergize = *VTEnergizeTemplate; - VTEnergize.EffectBasePoints[0] = triggredByAura->GetModifier()->m_amount*damage/100 - 1; - pVictim->CastSpell(pVictim,&VTEnergize,true,NULL, triggredByAura); + int32 VTEnergizeBasePoints0 = triggredByAura->GetModifier()->m_amount*damage/100 - 1; + pVictim->CastCustomSpell(pVictim,34919,&VTEnergizeBasePoints0,NULL,NULL,true,NULL, triggredByAura); } return; } @@ -3564,10 +3597,8 @@ { //Mana Surge (Shaman T1 bonus) //Effect: 23571 - SpellEntry const *ManaSurgeTemplate = sSpellStore.LookupEntry(23571); - SpellEntry ManaSurgeSpell = *ManaSurgeTemplate; - ManaSurgeSpell.EffectBasePoints[0] = procSpell->manaCost * 35/100; - CastSpell(this, &ManaSurgeSpell, true, NULL, triggredByAura); + int32 manaSurgeSpellBasePoints0 = procSpell->manaCost * 35/100; + CastCustomSpell(this, 23571, &manaSurgeSpellBasePoints0, NULL, NULL, true, NULL, triggredByAura); return; } case 113: @@ -3579,10 +3610,8 @@ { if ((*i)->GetModifier()->m_miscvalue == SPELLMOD_CHANCE_OF_SUCCESS && (*i)->GetSpellProto()->SpellIconID == 113) { - SpellEntry const *impDrainSoulTemplate = sSpellStore.LookupEntry(18371); - SpellEntry impDrainSoul = *impDrainSoulTemplate; - impDrainSoul.EffectBasePoints[0] = (*i)->GetSpellProto()->EffectBasePoints[2] * GetMaxPower(POWER_MANA) / 100; - CastSpell(this, &impDrainSoul, true, NULL, triggredByAura); + int32 impDrainSoulBasePoints0 = (*i)->GetSpellProto()->EffectBasePoints[2] * GetMaxPower(POWER_MANA) / 100; + CastCustomSpell(this, 18371, &impDrainSoulBasePoints0, NULL, NULL, true, NULL, triggredByAura); } } return; @@ -3626,11 +3655,9 @@ originalSpell = HSSpell; } - SpellEntry const *ILManaTemplate = sSpellStore.LookupEntry(20272); - SpellEntry ILManaSpell = *ILManaTemplate; - ILManaSpell.EffectBasePoints[0] = originalSpell->manaCost; // BasePoints = val -1 not required (EffectBaseDice==0) - CastSpell(this, &ILManaSpell, true, NULL, triggredByAura); + int32 ILManaSpellBasePoints0 = originalSpell->manaCost; + CastCustomSpell(this, 20272, &ILManaSpellBasePoints0, NULL, NULL, true, NULL, triggredByAura); return; } } @@ -3642,10 +3669,8 @@ //Cooldown: 6 secs if (triggredByAura->GetModifier()->m_amount == 0) break; - SpellEntry const *improvedLotPTemplate = sSpellStore.LookupEntry(34299); - SpellEntry improvedLotP = *improvedLotPTemplate; - improvedLotP.EffectBasePoints[0] = triggredByAura->GetModifier()->m_amount * GetMaxHealth() / 100 - 1; - CastSpell(this, &improvedLotP, true, NULL, triggredByAura); + int32 improvedLotPBasePoints0 = triggredByAura->GetModifier()->m_amount * GetMaxHealth() / 100 - 1; + CastCustomSpell(this, 34299, &improvedLotPBasePoints0, NULL, NULL, true, NULL, triggredByAura); if (GetTypeId() == TYPEID_PLAYER) ((Player*)this)->AddSpellCooldown(34299,0,time(NULL) + 6); return; @@ -3682,12 +3707,9 @@ return; } - SpellEntry const *BRHealTemplate = sSpellStore.LookupEntry(EffectId); - SpellEntry BRHeal = *BRHealTemplate; - int32 heal_amount = damage * triggredByAura->GetModifier()->m_amount / 100; - BRHeal.EffectBasePoints[0] = heal_amount/3-1; - CastSpell(this, &BRHeal, true, NULL, triggredByAura); + int32 BRHealBasePoints0 = heal_amount/3-1; + CastCustomSpell(this, EffectId, &BRHealBasePoints0, NULL, NULL, true, NULL, triggredByAura); return; } case 2006: @@ -5309,7 +5331,7 @@ //====================================================================== //====================================================================== -int32 Unit::CalculateSpellDamage(SpellEntry const* spellProto, uint8 effect_index) +int32 Unit::CalculateSpellDamage(SpellEntry const* spellProto, uint8 effect_index, int32 effBasePoints) { int32 value = 0; uint32 level = 0; @@ -5322,7 +5344,7 @@ float basePointsPerLevel = spellProto->EffectRealPointsPerLevel[effect_index]; float randomPointsPerLevel = spellProto->EffectDicePerLevel[effect_index]; - int32 basePoints = int32(spellProto->EffectBasePoints[effect_index] + level * basePointsPerLevel); + int32 basePoints = int32(effBasePoints + level * basePointsPerLevel); int32 randomPoints = int32(spellProto->EffectDieSides[effect_index] + level * randomPointsPerLevel); float comboDamage = spellProto->EffectPointsPerComboPoint[effect_index]; uint8 comboPoints=0; @@ -5484,13 +5506,13 @@ } } -Creature* Unit::SummonCreature(uint32 id, uint32 mapid, float x, float y, float z, float ang,TempSummonType spwtype,uint32 despwtime) +Creature* Unit::SummonCreature(uint32 id, float x, float y, float z, float ang,TempSummonType spwtype,uint32 despwtime) { TemporarySummon* pCreature = new TemporarySummon(this,this); pCreature->SetInstanceId(GetInstanceId()); - if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), mapid, x, y, z, ang, id)) + if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), GetMapId(), x, y, z, ang, id)) { delete pCreature; return NULL; Index: src/game/Unit.h =================================================================== --- src/game/Unit.h (revision 4141) +++ src/game/Unit.h (working copy) @@ -797,6 +797,8 @@ void SpellNonMeleeDamageLog(Unit *pVictim, uint32 spellID, uint32 damage, bool isTriggeredSpell = false, bool useSpellDamage = true); void CastSpell(Unit* Victim, uint32 spellId, bool triggered, Item *castItem = NULL, Aura* triggredByAura = NULL, uint64 originalCaster = 0); void CastSpell(Unit* Victim,SpellEntry const *spellInfo, bool triggered, Item *castItem= NULL, Aura* triggredByAura = NULL, uint64 originalCaster = 0); + void CastCustomSpell(Unit* Victim, uint32 spellId, int32 const* bp0, int32 const* bp1, int32 const* bp2, bool triggered, Item *castItem= NULL, Aura* triggredByAura = NULL, uint64 originalCaster = 0); + void CastCustomSpell(Unit* Victim,SpellEntry const *spellInfo, int32 const* bp0, int32 const* bp1, int32 const* bp2, bool triggered, Item *castItem= NULL, Aura* triggredByAura = NULL, uint64 originalCaster = 0); bool IsDamageToThreatSpell(SpellEntry const * spellInfo) const; void DeMorph(); @@ -995,8 +997,8 @@ void _RemoveAllAuraMods(); void _ApplyAllAuraMods(); - int32 CalculateSpellDamage(SpellEntry const* spellProto, uint8 effect_index); - Creature* SummonCreature(uint32 id, uint32 mapid, float x, float y, float z, float ang,TempSummonType spwtype,uint32 despwtime); + int32 CalculateSpellDamage(SpellEntry const* spellProto, uint8 effect_index, int32 basePoints); + Creature* SummonCreature(uint32 id, float x, float y, float z, float ang,TempSummonType spwtype,uint32 despwtime); void addFollower(FollowerReference* pRef) { m_FollowingRefManager.insertFirst(pRef); } void removeFollower(FollowerReference* pRef) { } // nothing to do yet Index: src/game/World.cpp =================================================================== --- src/game/World.cpp (revision 4141) +++ src/game/World.cpp (working copy) @@ -991,7 +991,7 @@ float z = step.script->z; float o = step.script->o; - Creature* pCreature = ((Unit*)step.source)->SummonCreature(step.script->datalong,((Unit*)step.source)->GetMapId(), x, y, z, o,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,step.script->datalong2); + Creature* pCreature = ((Unit*)step.source)->SummonCreature(step.script->datalong, x, y, z, o,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,step.script->datalong2); if (!pCreature) { sLog.outError("SCRIPT_COMMAND_TEMP_SUMMON failed for creature (entry: %u).",step.script->datalong); Index: src/shared/Database/DBCStructure.h =================================================================== --- src/shared/Database/DBCStructure.h (revision 4141) +++ src/shared/Database/DBCStructure.h (working copy) @@ -354,7 +354,7 @@ uint32 EffectBaseDice[3]; //70-72 float EffectDicePerLevel[3]; //73-75 float EffectRealPointsPerLevel[3]; //76-78 - int32 EffectBasePoints[3]; //79-81 + int32 EffectBasePoints[3]; //79-81 (don't must be used in spell/auras explicitly, must be used cached Spell::m_currentBasePoints) //82-84 not used uint32 EffectImplicitTargetA[3]; //85-87 uint32 EffectImplicitTargetB[3]; //88-90 @@ -393,6 +393,10 @@ //uint32 unk3[3]; //205-207 not used null uint32 TotemCategory[2]; //208-209 uint32 AreaId; //210 + +private: + // prevent creating custom entries (copy data from original infact) + SpellEntry(SpellEntry const&); // DON'T must have implementation }; typedef std::set SpellCategorySet;