diff options
-rw-r--r-- | sql/updates/world/2011_08_20_00_world_achievement_criteria_data.sql | 11 | ||||
-rwxr-xr-x | src/server/game/Entities/Unit/Unit.h | 1 | ||||
-rwxr-xr-x | src/server/game/Spells/Spell.cpp | 6 | ||||
-rwxr-xr-x | src/server/game/Spells/Spell.h | 3 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 5 | ||||
-rwxr-xr-x | src/server/game/Spells/SpellScript.cpp | 5 | ||||
-rwxr-xr-x | src/server/game/Spells/SpellScript.h | 1 | ||||
-rw-r--r-- | src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp | 86 | ||||
-rw-r--r-- | src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp | 38 | ||||
-rw-r--r-- | src/server/scripts/Northrend/Naxxramas/naxxramas.h | 1 |
10 files changed, 149 insertions, 8 deletions
diff --git a/sql/updates/world/2011_08_20_00_world_achievement_criteria_data.sql b/sql/updates/world/2011_08_20_00_world_achievement_criteria_data.sql new file mode 100644 index 00000000000..50cc98f9661 --- /dev/null +++ b/sql/updates/world/2011_08_20_00_world_achievement_criteria_data.sql @@ -0,0 +1,11 @@ +UPDATE `creature_template` SET `AIName`='', `ScriptName`='npc_kelthuzad_abomination' WHERE `entry`=16428; + +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=16428; + +DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (7614, 7615) AND `type`=11; +INSERT INTO `achievement_criteria_data` (`criteria_id`,`type`,`value1`,`value2`,`ScriptName`) +VALUES +(7614,11,0,0,'achievement_just_cant_get_enough'), +(7615,11,0,0,'achievement_just_cant_get_enough'); + +DELETE FROM `disables` WHERE `entry` IN (7614, 7615); diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index e7781be00c7..caf1f4e46ad 100755 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1547,7 +1547,6 @@ class Unit : public WorldObject bool isFrozen() const; bool isTargetableForAttack(bool checkFakeDeath = true) const; - bool isAttackableByAOE(SpellInfo const* spellProto = NULL) const; bool canAttack(Unit const* target, bool force = true) const; virtual bool IsInWater() const; virtual bool IsUnderWater() const; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 51cd83e08a2..8da042f241d 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -4552,7 +4552,7 @@ void Spell::HandleEffects(Unit *pUnitTarget, Item *pItemTarget, GameObject *pGOT SpellCastResult Spell::CheckCast(bool strict) { // check death state - if (!(_triggeredCastFlags & TRIGGERED_IGNORE_CASTER_AURASTATE) && !m_caster->isAlive() && !(m_spellInfo->Attributes & SPELL_ATTR0_PASSIVE) && !(m_spellInfo->Attributes & SPELL_ATTR0_CASTABLE_WHILE_DEAD)) + if (!m_caster->isAlive() && !(m_spellInfo->Attributes & SPELL_ATTR0_PASSIVE) && !(m_spellInfo->Attributes & SPELL_ATTR0_CASTABLE_WHILE_DEAD)) return SPELL_FAILED_CASTER_DEAD; // check cooldowns to prevent cheating @@ -4694,10 +4694,6 @@ SpellCastResult Spell::CheckCast(bool strict) return SPELL_FAILED_DONT_REPORT; } - //! Client checks this already - if (m_spellInfo->AttributesEx6 & SPELL_ATTR6_CAST_BY_CHARMER && !m_caster->GetCharmerOrOwnerGUID()) - return SPELL_FAILED_DONT_REPORT; - Unit* target = m_targets.GetUnitTarget(); // In pure self-cast spells, the client won't send any unit target if (!target && (m_targets.GetTargetMask() == TARGET_FLAG_SELF || m_targets.GetTargetMask() & TARGET_FLAG_UNIT_ALLY)) // TARGET_FLAG_SELF == 0, remember! diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 50c3a093a13..ee3e7eab1bf 100755 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -727,6 +727,9 @@ namespace Trinity case SPELL_TARGETS_ENEMY: if (target->isTotem()) continue; + // can't be checked in SpellInfo::CheckTarget - needs more research + if (target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE)) + continue; if (i_source->IsControlledByPlayer()) { if (i_source->IsFriendlyTo(target)) diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index b4719dfa59b..2a05907996d 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1504,7 +1504,8 @@ SpellCastResult SpellInfo::CheckTarget(Unit const* caster, Unit const* target, b if (AttributesEx3 & SPELL_ATTR3_ONLY_TARGET_GHOSTS && !(!target->isAlive() && target->HasAuraType(SPELL_AURA_GHOST))) return SPELL_FAILED_TARGET_NOT_GHOST; - if (AttributesEx6 & SPELL_ATTR6_CANT_TARGET_CROWD_CONTROLLED && !target->CanFreeMove()) + // check this flag only for implicit targets (chain and area), allow to explicitly target units for spells like Shield of Righteousness + if (implicit && AttributesEx6 & SPELL_ATTR6_CANT_TARGET_CROWD_CONTROLLED && !target->CanFreeMove()) return SPELL_FAILED_BAD_TARGETS; // check visibility - ignore stealth for implicit (area) targets @@ -1528,7 +1529,7 @@ SpellCastResult SpellInfo::CheckTarget(Unit const* caster, Unit const* target, b if (target != caster && target->GetCharmerOrOwnerGUID() != caster->GetGUID()) { // any unattackable target skipped - if (target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE)) + if (target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) return SPELL_FAILED_BAD_TARGETS; } diff --git a/src/server/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp index bb7b242a561..5c9a6a23304 100755 --- a/src/server/game/Spells/SpellScript.cpp +++ b/src/server/game/Spells/SpellScript.cpp @@ -477,6 +477,11 @@ void SpellScript::SetCustomCastResultMessage(SpellCustomErrors result) m_spell->m_customError = result; } +SpellValue const* SpellScript::GetSpellValue() +{ + return m_spell->m_spellValue; +} + bool AuraScript::_Validate(SpellInfo const* entry) { for (std::list<CheckAreaTargetHandler>::iterator itr = DoCheckAreaTarget.begin(); itr != DoCheckAreaTarget.end(); ++itr) diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h index 764a260c66b..c9f88092028 100755 --- a/src/server/game/Spells/SpellScript.h +++ b/src/server/game/Spells/SpellScript.h @@ -256,6 +256,7 @@ class SpellScript : public _SpellScript Unit* GetCaster(); Unit* GetOriginalCaster(); SpellInfo const* GetSpellInfo(); + SpellValue const* GetSpellValue(); // methods useable after spell targets are set // accessors to the "focus" targets of the spell diff --git a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp index 62b00a90dc6..09f3bd49279 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp @@ -74,6 +74,7 @@ enum Event EVENT_TRIGGER, EVENT_PHASE, + EVENT_MORTAL_WOUND, }; enum Spells @@ -121,6 +122,10 @@ enum Spells //death knight SPELL_PLAGUE_STRIKE = 49921, SPELL_HOWLING_BLAST = 51411, + + // Abomination spells + SPELL_FRENZY = 28468, + SPELL_MORTAL_WOUND = 28467, }; enum Creatures @@ -302,6 +307,9 @@ public: FindGameObjects(); + if (instance) + instance->SetData(DATA_ABOMINATION_KILLED, 0); + if (GameObject* pKTTrigger = me->GetMap()->GetGameObject(KTTriggerGUID)) { pKTTrigger->ResetDoorOrButton(); @@ -709,8 +717,86 @@ public: }; +class npc_kelthuzad_abomination : public CreatureScript +{ + public: + npc_kelthuzad_abomination() : CreatureScript("npc_kelthuzad_abomination") { } + + struct npc_kelthuzad_abominationAI : public ScriptedAI + { + npc_kelthuzad_abominationAI(Creature* creature) : ScriptedAI(creature) + { + instance = me->GetInstanceScript(); + } + + InstanceScript* instance; + EventMap events; + + void Reset() + { + events.Reset(); + events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(2000, 5000)); + DoCast(me, SPELL_FRENZY, true); + } + + void UpdateAI(uint32 const diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_MORTAL_WOUND: + DoCastVictim(SPELL_MORTAL_WOUND, true); + events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(10000, 15000)); + break; + default: + break; + } + } + } + + void JustDied(Unit* /*who*/) + { + if (instance) + instance->SetData(DATA_ABOMINATION_KILLED, instance->GetData(DATA_ABOMINATION_KILLED) + 1); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_kelthuzad_abominationAI(creature); + } +}; + +class achievement_just_cant_get_enough : public AchievementCriteriaScript +{ + public: + achievement_just_cant_get_enough() : AchievementCriteriaScript("achievement_just_cant_get_enough") + { + } + + bool OnCheck(Player* /*player*/, Unit* target) + { + if (!target) + return false; + + if (InstanceScript* instance = target->GetInstanceScript()) + if (instance->GetData(DATA_ABOMINATION_KILLED) >= 18) + return true; + + return false; + } +}; + void AddSC_boss_kelthuzad() { new boss_kelthuzad(); new at_kelthuzad_center(); + new npc_kelthuzad_abomination(); + new achievement_just_cant_get_enough(); } diff --git a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp index f57a81f4296..f08e0ccb5cf 100644 --- a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp +++ b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp @@ -140,11 +140,33 @@ public: uint64 uiKelthuzadTrigger; uint64 uiPortals[4]; + uint32 AbominationCount; + GOState gothikDoorState; time_t minHorsemenDiedTime; time_t maxHorsemenDiedTime; + void Initialize() + { + GothikGateGUID = 0; + HorsemenChestGUID = 0; + SapphironGUID = 0; + uiFaerlina = 0; + uiThane = 0; + uiLady = 0; + uiBaron = 0; + uiSir = 0; + uiThaddius = 0; + uiHeigan = 0; + uiFeugen = 0; + uiStalagg = 0; + uiKelthuzad = 0; + uiKelthuzadTrigger = 0; + + memset(uiPortals, 0, sizeof(uiPortals)); + } + void OnCreatureCreate(Creature* creature) { switch(creature->GetEntry()) @@ -273,7 +295,23 @@ public: maxHorsemenDiedTime = now; } break; + case DATA_ABOMINATION_KILLED: + AbominationCount = value; + break; + } + } + + uint32 GetData(uint32 id) + { + switch (id) + { + case DATA_ABOMINATION_KILLED: + return AbominationCount; + default: + break; } + + return 0; } uint64 GetData64(uint32 id) diff --git a/src/server/scripts/Northrend/Naxxramas/naxxramas.h b/src/server/scripts/Northrend/Naxxramas/naxxramas.h index 86a7f67c11d..bb25ad691e0 100644 --- a/src/server/scripts/Northrend/Naxxramas/naxxramas.h +++ b/src/server/scripts/Northrend/Naxxramas/naxxramas.h @@ -48,6 +48,7 @@ enum Data DATA_HORSEMEN1, DATA_HORSEMEN2, DATA_HORSEMEN3, + DATA_ABOMINATION_KILLED, }; enum Data64 |