aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts/Northrend
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2011-03-04 23:53:11 +0100
committerShauren <shauren.trinity@gmail.com>2011-03-04 23:53:11 +0100
commit36f848a4c222828cafb50f87790219da14245a03 (patch)
tree82b99d3949a3a38761aee9b2a51a825441ee2a2a /src/server/scripts/Northrend
parent22cd262e6ced18d7b98c4ef0635aff5d8a7155b2 (diff)
Scripts/Icecrown Citadel: Only one Mutated Abomination can exist during Professor Putricide encounter
Scripts/Spells: Added blizzlike error messages for certain spells Scripts/Items: Removed obsolete scripts
Diffstat (limited to 'src/server/scripts/Northrend')
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp20
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp121
2 files changed, 108 insertions, 33 deletions
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
index 3f121e1d862..9ddf274ca2f 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
@@ -432,19 +432,22 @@ class spell_blood_queen_vampiric_bite : public SpellScriptLoader
return true;
}
+ SpellCastResult CheckTarget()
+ {
+ if (IsVampire(GetTargetUnit()))
+ {
+ SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_CANT_TARGET_VAMPIRES);
+ return SPELL_FAILED_CUSTOM_ERROR;
+ }
+
+ return SPELL_CAST_OK;
+ }
+
void OnCast()
{
if (GetCaster()->GetTypeId() != TYPEID_PLAYER)
return;
- if (IsVampire(GetHitUnit()))
- {
- PreventHitDamage();
- PreventHitDefaultEffect(EFFECT_1);
- Spell::SendCastResult(GetCaster()->ToPlayer(), GetSpellInfo(), 0, SPELL_FAILED_BAD_TARGETS);
- return;
- }
-
SpellEntry const* spell = sSpellStore.LookupEntry(SPELL_FRENZIED_BLOODTHIRST);
spell = sSpellMgr->GetSpellForDifficultyFromSpell(spell, GetCaster());
GetCaster()->RemoveAura(spell->Id, 0, 0, AURA_REMOVE_BY_ENEMY_SPELL);
@@ -473,6 +476,7 @@ class spell_blood_queen_vampiric_bite : public SpellScriptLoader
void Register()
{
+ OnCheckCast += SpellCheckCastFn(spell_blood_queen_vampiric_bite_SpellScript::CheckTarget);
BeforeHit += SpellHitFn(spell_blood_queen_vampiric_bite_SpellScript::OnCast);
}
};
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
index fbb0d2d89d3..0ba75cc3ecd 100755
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
@@ -20,6 +20,7 @@
#include "ScriptedCreature.h"
#include "SpellScript.h"
#include "SpellAuraEffects.h"
+#include "Group.h"
#include "icecrown_citadel.h"
enum ScriptTexts
@@ -152,7 +153,13 @@ static const Position tablePos = {4356.190f, 3262.90f, 389.4820f, 1.483
static const uint32 oozeFloodSpells[4] = {69782, 69796, 69798, 69801};
-#define DATA_EXPERIMENT_STAGE 0
+enum PutricideData
+{
+ DATA_EXPERIMENT_STAGE = 1,
+ DATA_PHASE = 2,
+ DATA_ABOMINATION = 3,
+};
+
#define EXPERIMENT_STATE_OOZE false
#define EXPERIMENT_STATE_GAS true
@@ -205,8 +212,6 @@ class boss_professor_putricide : public CreatureScript
me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE)
me->GetMotionMaster()->MovementExpired();
- if (GameObject* table = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_PUTRICIDE_TABLE)))
- table->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
}
void EnterCombat(Unit* who)
@@ -235,8 +240,6 @@ class boss_professor_putricide : public CreatureScript
DoZoneInCombat(me);
instance->SetBossState(DATA_PROFESSOR_PUTRICIDE, IN_PROGRESS);
- if (GameObject* table = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_PUTRICIDE_TABLE)))
- table->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
}
void JustReachedHome()
@@ -501,8 +504,6 @@ class boss_professor_putricide : public CreatureScript
events.CancelEvent(EVENT_UNSTABLE_EXPERIMENT);
summons.DespawnEntry(NPC_MUTATED_ABOMINATION_10);
summons.DespawnEntry(NPC_MUTATED_ABOMINATION_25);
- if (GameObject* table = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_PUTRICIDE_TABLE)))
- table->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
break;
default:
break;
@@ -515,12 +516,22 @@ class boss_professor_putricide : public CreatureScript
uint32 GetData(uint32 type)
{
- if (type == DATA_EXPERIMENT_STAGE)
+ switch (type)
{
- // ALSO MODIFIES!
- uint32 ret = uint32(experimentState);
- experimentState ^= true;
- return ret;
+ case DATA_EXPERIMENT_STAGE:
+ {
+ // ALSO MODIFIES!
+ uint32 ret = uint32(experimentState);
+ experimentState ^= true;
+ return ret;
+ }
+ case DATA_PHASE:
+ return phase;
+ case DATA_ABOMINATION:
+ summons.RemoveNotExisting();
+ return summons.HasEntry(NPC_MUTATED_ABOMINATION_10) || summons.HasEntry(NPC_MUTATED_ABOMINATION_25);
+ default:
+ break;
}
return 0;
@@ -1027,28 +1038,33 @@ class spell_putricide_unbound_plague : public SpellScriptLoader
{
PrepareSpellScript(spell_putricide_unbound_plague_SpellScript);
+ bool Validate(SpellEntry const* /*spell*/)
+ {
+ if (!sSpellStore.LookupEntry(SPELL_UNBOUND_PLAGUE))
+ return false;
+ if (!sSpellStore.LookupEntry(SPELL_UNBOUND_PLAGUE_SEARCHER))
+ return false;
+ return true;
+ }
+
void HandleScript(SpellEffIndex /*effIndex*/)
{
if (!GetHitUnit())
return;
- SpellEntry const* plague = sSpellStore.LookupEntry(SPELL_UNBOUND_PLAGUE);
- SpellEntry const* searcher = sSpellStore.LookupEntry(SPELL_UNBOUND_PLAGUE_SEARCHER);
- Creature* professor = NULL;
- if (InstanceScript* instance = GetCaster()->GetInstanceScript())
- {
- professor = Unit::GetCreature(*GetCaster(), instance->GetData64(DATA_PROFESSOR_PUTRICIDE));
- if (professor)
- {
- plague = sSpellMgr->GetSpellForDifficultyFromSpell(plague, professor);
- searcher = sSpellMgr->GetSpellForDifficultyFromSpell(searcher, professor);
- }
- }
+ InstanceScript* instance = GetCaster()->GetInstanceScript();
+ if (!instance)
+ return;
+
+ SpellEntry const* plague = sSpellMgr->GetSpellForDifficultyFromSpell(sSpellStore.LookupEntry(SPELL_UNBOUND_PLAGUE), GetCaster());
+ SpellEntry const* searcher = sSpellMgr->GetSpellForDifficultyFromSpell(sSpellStore.LookupEntry(SPELL_UNBOUND_PLAGUE_SEARCHER), GetCaster());
if (!GetHitUnit()->HasAura(plague->Id))
{
- if (professor)
+ if (Creature* professor = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(DATA_PROFESSOR_PUTRICIDE)))
+ {
if (Aura* oldPlague = GetCaster()->GetAura(plague->Id, professor->GetGUID()))
+ {
if (Aura* newPlague = professor->AddAura(plague->Id, GetHitUnit()))
{
newPlague->SetMaxDuration(oldPlague->GetDuration());
@@ -1059,6 +1075,8 @@ class spell_putricide_unbound_plague : public SpellScriptLoader
GetCaster()->CastSpell(GetCaster(), SPELL_UNBOUND_PLAGUE_PROTECTION, true);
professor->CastSpell(GetHitUnit(), SPELL_UNBOUND_PLAGUE_SEARCHER, true);
}
+ }
+ }
}
}
@@ -1170,6 +1188,54 @@ class spell_putricide_mutation_init : public SpellScriptLoader
public:
spell_putricide_mutation_init() : SpellScriptLoader("spell_putricide_mutation_init") { }
+ class spell_putricide_mutation_init_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_putricide_mutation_init_SpellScript);
+
+ SpellCastResult CheckRequirement()
+ {
+ if (GetCaster()->GetTypeId() != TYPEID_PLAYER)
+ return SPELL_FAILED_TARGET_NOT_PLAYER;
+
+ InstanceScript* instance = GetCaster()->GetInstanceScript();
+ if (!instance)
+ return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW;
+
+ Creature* professor = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(DATA_PROFESSOR_PUTRICIDE));
+ if (!professor || !professor->isInCombat())
+ return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW;
+
+ if (professor->AI()->GetData(DATA_PHASE) == PHASE_COMBAT_3 || !professor->isAlive())
+ {
+ SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_ALL_POTIONS_USED);
+ return SPELL_FAILED_CUSTOM_ERROR;
+ }
+
+ // find another player with initialization aura
+ bool abominationExists = false;
+ Group* group = GetCaster()->ToPlayer()->GetGroup();
+ for (GroupReference* plrRef = group->GetFirstMember(); plrRef && !abominationExists; plrRef = plrRef->next())
+ if (Player* player = plrRef->getSource())
+ if (player->HasAura(GetSpellInfo()->Id))
+ abominationExists = true;
+
+ // or an existing abomination
+ abominationExists |= bool(professor->AI()->GetData(DATA_ABOMINATION));
+ if (abominationExists)
+ {
+ SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_TOO_MANY_ABOMINATIONS);
+ return SPELL_FAILED_CUSTOM_ERROR;
+ }
+
+ return SPELL_CAST_OK;
+ }
+
+ void Register()
+ {
+ OnCheckCast += SpellCheckCastFn(spell_putricide_mutation_init_SpellScript::CheckRequirement);
+ }
+ };
+
class spell_putricide_mutation_init_AuraScript : public AuraScript
{
PrepareAuraScript(spell_putricide_mutation_init_AuraScript);
@@ -1189,6 +1255,11 @@ class spell_putricide_mutation_init : public SpellScriptLoader
}
};
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_putricide_mutation_init_SpellScript();
+ }
+
AuraScript* GetAuraScript() const
{
return new spell_putricide_mutation_init_AuraScript();