diff options
author | QAston <none@none> | 2009-08-14 15:30:47 +0200 |
---|---|---|
committer | QAston <none@none> | 2009-08-14 15:30:47 +0200 |
commit | a60600b717889bacbe531cfd6a18f49633e99a77 (patch) | |
tree | 0d42b34532ef357031ce1bb31cbf2b4132a3d402 /src | |
parent | 759721bb5fec5b2cffa277e29dae2ec3b1a87cb8 (diff) |
*Script for Ebon gargoyle - original patch by thenecromancer.
--HG--
branch : trunk
Diffstat (limited to 'src')
-rw-r--r-- | src/bindings/scripts/scripts/npc/npcs_special.cpp | 98 | ||||
-rw-r--r-- | src/game/Pet.cpp | 10 | ||||
-rw-r--r-- | src/game/SpellAuras.cpp | 5 | ||||
-rw-r--r-- | src/game/SpellEffects.cpp | 10 |
4 files changed, 110 insertions, 13 deletions
diff --git a/src/bindings/scripts/scripts/npc/npcs_special.cpp b/src/bindings/scripts/scripts/npc/npcs_special.cpp index 1764708d0e3..68c3e0e2559 100644 --- a/src/bindings/scripts/scripts/npc/npcs_special.cpp +++ b/src/bindings/scripts/scripts/npc/npcs_special.cpp @@ -1685,6 +1685,91 @@ CreatureAI* GetAI_npc_mirror_image(Creature* pCreature) return new npc_mirror_image (pCreature); } +struct TRINITY_DLL_DECL npc_ebon_gargoyleAI : SpellCasterAI +{ + npc_ebon_gargoyleAI(Creature *c) : SpellCasterAI(c) {} + + int despawnTimer; + + void InitializeAI() + { + SpellCasterAI::InitializeAI(); + Unit * owner = me->GetOwner(); + if (!owner) + return; + // Not needed to be despawned now + despawnTimer = 0; + // Find victim of Summon Gargoyle spell + std::list<Unit*> targets; + Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(m_creature, m_creature, 30); + Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(m_creature, targets, u_check); + m_creature->VisitNearbyObject(30, searcher); + for(std::list<Unit*>::iterator iter = targets.begin(); iter != targets.end(); ++iter) + if((*iter)->GetAura(49206,owner->GetGUID())) + { + me->Attack((*iter),false); + break; + } + } + + void JustDied(Unit *killer) + { + // Stop Feeding Gargoyle when it dies + if (Unit *owner = me->GetOwner()) + owner->RemoveAurasDueToSpell(50514); + } + + // Fly away when dismissed + void SpellHit(Unit *source, const SpellEntry *spell) + { + if(spell->Id != 50515 || !me->isAlive() ) + return; + + Unit *owner = me->GetOwner(); + + if (!owner || owner != source) + return; + + // Stop Fighting + me->ApplyModFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE, true); + // Sanctuary + me->CastSpell(m_creature, 54661, true); + me->SetReactState(REACT_PASSIVE); + + // Fly Away + me->AddUnitMovementFlag(MOVEMENTFLAG_FLY_MODE); + me->SetSpeed(MOVE_FLIGHT, 0.25f, true); + me->SetSpeed(MOVE_RUN, 0.25f, true); + float x = me->GetPositionX() + 10 * cos(me->GetOrientation()); + float y = me->GetPositionY() + 10 * sin(me->GetOrientation()); + float z = me->GetPositionZ() + 25; + me->GetMotionMaster()->MovePoint(0, x, y, z); + + // Despawn as soon as possible + despawnTimer = 4 * IN_MILISECONDS; + } + + void UpdateAI(const uint32 diff) + { + if (despawnTimer > 0) + { + if (despawnTimer > diff) + despawnTimer -= diff; + else + { + me->ForcedDespawn(); + } + return; + } + SpellCasterAI::UpdateAI(diff); + } +}; + +CreatureAI* GetAI_npc_ebon_gargoyle(Creature* pCreature) +{ + return new npc_ebon_gargoyleAI (pCreature); +} + //TODO: 30% Attackdamage check for Lightwell struct TRINITY_DLL_DECL npc_lightwellAI : public PassiveAI { @@ -1853,13 +1938,18 @@ void AddSC_npcs_special() newscript->RegisterSelf(); newscript = new Script; - newscript->Name="npc_lightwell"; - newscript->GetAI = &GetAI_npc_lightwellAI; + newscript->Name="npc_mirror_image"; + newscript->GetAI = &GetAI_npc_mirror_image; newscript->RegisterSelf(); newscript = new Script; - newscript->Name="npc_mirror_image"; - newscript->GetAI = &GetAI_npc_mirror_image; + newscript->Name="npc_ebon_gargoyle"; + newscript->GetAI = &GetAI_npc_ebon_gargoyle; + newscript->RegisterSelf(); + + newscript = new Script; + newscript->Name="npc_lightwell"; + newscript->GetAI = &GetAI_npc_lightwellAI; newscript->RegisterSelf(); newscript = new Script; diff --git a/src/game/Pet.cpp b/src/game/Pet.cpp index 894a3b37f32..3bce66a631a 100644 --- a/src/game/Pet.cpp +++ b/src/game/Pet.cpp @@ -940,6 +940,16 @@ bool Guardian::InitStatsForLevel(uint32 petlevel) } break; } + case 27829: // Ebon Gargoyle + { + SetBonusDamage( int32(m_owner->GetTotalAttackPowerValue(BASE_ATTACK) * 0.4f)); + if(!pInfo) + { + SetCreateMana(28 + 10*petlevel); + SetCreateHealth(28 + 30*petlevel); + } + break; + } default: { if(!pInfo) diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 23357171352..b682bab6254 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -1233,6 +1233,11 @@ void Aura::HandleAuraSpecificMods(bool apply) return; m_target->CastSpell(m_target, 32612, true, NULL, GetPartAura(1)); } + // Summon Gargoyle + else if (m_spellProto->Id == 50514) + { + m_target->CastSpell(m_target, GetPartAura(0)->GetAmount(), true, NULL, GetPartAura(0)); + } // Curse of Doom else if(m_spellProto->SpellFamilyName==SPELLFAMILY_WARLOCK && m_spellProto->SpellFamilyFlags[1] & 0x02) { diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index c826c70900a..154357c76f8 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -1909,20 +1909,12 @@ void Spell::EffectDummy(uint32 i) { // No power, dismiss Gargoyle if (m_caster->GetPower(POWER_RUNIC_POWER)<30) - m_caster->CastSpell((Unit*)NULL,50515,true); + m_caster->RemoveAurasDueToSpell(50514, m_caster->GetGUID()); else m_caster->ModifyPower(POWER_RUNIC_POWER,-30); return; } - // Dismiss Gargoyle - else if (m_spellInfo->Id == 50515) - { - // FIXME: gargoyle should fly away - unitTarget->setDeathState(JUST_DIED); - m_caster->RemoveAurasDueToSpell(50514); - return; - } break; } |