Script/EoE: Some fixes here and there

* Add db support for Power Sparks, Teleports and Drakes
* Fix Power Sparks animations and texts and add support for giving buff to players + warning
* Fix Power Spark way of stacking - should be MultiSlot aura, didn't stack before either way
* Teleporters mechanic is fixed and will summon only 1 spark per 30-35 sec
* Fixed players getting mounted on 3rd phase
* Cleanned some wrong aggro handling, but whole aggro/attack system should be rewritten to get it working blizz
That is for today, this doesn't fix the whole instance by any means!
This commit is contained in:
Trista
2013-01-02 06:34:32 +02:00
parent 52fd561f47
commit 423fb04270
4 changed files with 89 additions and 94 deletions

View File

@@ -0,0 +1,27 @@
-- Add missing text and update old one
-- Malygos
UPDATE `creature_text` SET `probability`=100 WHERE `entry`=28859; -- Was at 0 for some reason
UPDATE `creature_text` SET `text`='Unthinkable! The mortals will destroy... everything! My sister, what have you...',`sound`=14540 WHERE `entry`=28859 AND `groupid`=14 AND `id`=0;
DELETE FROM `creature_text` WHERE `entry`=28859 AND `groupid` IN (15,16);
DELETE FROM `creature_text` WHERE `entry`=30084;
INSERT INTO `creature_text` (`entry`,`groupid`,`text`,`type`,`probability`,`sound`,`comment`) VALUES
(28859,15, '%s fixes his eyes on you!', 42,100,0, 'Malygos'),
(28859,16, 'I am without limits here. The rules of your cherished reality do not apply. In this realm, I am in control!',14,100,14515, 'Malygos'),
(30084,0, 'A Power Spark forms from a nearby rift!',41,100,14522, 'Power spark to portal');
-- Alexstrasza, add missing sounds
UPDATE `creature_text` SET `probability`=100,`sound`=14406 WHERE `entry`=32295 AND `groupid`=0 AND `id`=0;
UPDATE `creature_text` SET `probability`=100,`sound`=14407 WHERE `entry`=32295 AND `groupid`=1 AND `id`=0;
UPDATE `creature_text` SET `probability`=100,`sound`=14408 WHERE `entry`=32295 AND `groupid`=2 AND `id`=0;
UPDATE `creature_text` SET `probability`=100,`sound`=14409 WHERE `entry`=32295 AND `groupid`=3 AND `id`=0;
-- Update portal InhabitType, otherwise it falls on summon
UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=30118;
-- Update drakes templates
UPDATE `creature_template` SET `unit_flags`=8,`InhabitType`=4 WHERE `entry`=30161; -- no fly aura present only enabled gravity in sniffs
-- Addon data
DELETE FROM `creature_template_addon` WHERE `entry` IN (30084,30161);
INSERT INTO `creature_template_addon` (`entry`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES
(30084,0,0,50331648,1,0,'55845'), -- Power Spark
(30161,0,0,50331648,1,0,'60534'); -- Wyrmrest Skytalon (uses no fly aura)

View File

@@ -910,8 +910,16 @@ bool Aura::CanBeSaved() const
// Incanter's Absorbtion - considering the minimal duration and problems with aura stacking
// we skip saving this aura
if (GetId() == 44413)
return false;
// Also for some reason other auras put as MultiSlot crash core on keeping them after restart,
// so put here only these for which you are sure they get removed
switch (GetId())
{
case 44413: // Incanter's Absorption
case 40075: // Fel Flak Fire
case 55849: // Power Spark
return false;
break;
}
// don't save auras removed by proc system
if (IsUsingCharges() && !GetCharges())

View File

@@ -1027,7 +1027,7 @@ bool SpellInfo::IsPassiveStackableWithRanks() const
bool SpellInfo::IsMultiSlotAura() const
{
return IsPassive() || Id == 40075 || Id == 44413; // No other way to make 40075 have more than 1 copy of aura
return IsPassive() || Id == 55849 || Id == 40075 || Id == 44413; // Power Spark, Fel Flak Fire, Incanter's Absorption
}
bool SpellInfo::IsDeathPersistent() const

View File

@@ -35,10 +35,13 @@ Script Data End */
#include "eye_of_eternity.h"
#include "ScriptedEscortAI.h"
#include "Player.h"
#include "Vehicle.h"
#include "CombatAI.h"
#include "CreatureTextMgr.h"
enum Achievements
{
ACHIEV_TIMED_START_EVENT = 20387,
ACHIEV_TIMED_START_EVENT = 20387,
};
enum Events
@@ -132,25 +135,36 @@ enum MalygosEvents
#define TEN_MINUTES 600000
enum MalygosSays
enum Texts
{
SAY_AGGRO_P_ONE,
SAY_KILLED_PLAYER_P_ONE,
SAY_END_P_ONE,
SAY_AGGRO_P_TWO,
SAY_ANTI_MAGIC_SHELL, // not sure when execute it
SAY_MAGIC_BLAST, // not sure when execute it
SAY_KILLED_PLAYER_P_TWO,
SAY_END_P_TWO,
SAY_INTRO_P_THREE,
SAY_AGGRO_P_THREE,
SAY_SURGE_POWER, // not sure when execute it
SAY_BUFF_SPARK,
SAY_KILLED_PLAYER_P_THREE,
SAY_SPELL_CASTING_P_THREE,
SAY_DEATH
// Malygos
SAY_AGGRO_P_ONE = 0,
SAY_KILLED_PLAYER_P_ONE = 1,
SAY_END_P_ONE = 2,
SAY_AGGRO_P_TWO = 3,
SAY_ANTI_MAGIC_SHELL = 4, // not sure when execute it
SAY_MAGIC_BLAST = 5, // not sure when execute it
SAY_KILLED_PLAYER_P_TWO = 6,
SAY_END_P_TWO = 7,
SAY_INTRO_P_THREE = 8,
SAY_AGGRO_P_THREE = 9,
SAY_SURGE_POWER = 10, // not sure when execute it
SAY_BUFF_SPARK = 11,
SAY_KILLED_PLAYER_P_THREE = 12,
SAY_SPELL_CASTING_P_THREE = 13,
SAY_DEATH,
// Alexstrasza
SAY_ONE = 0,
SAY_TWO = 1,
SAY_THREE = 2,
SAY_FOUR = 3,
// Power Sparks
EMOTE_POWER_SPARK_SUMMONED = 0
};
#define MAX_HOVER_DISK_WAYPOINTS 18
// Sniffed data (x, y,z)
@@ -178,7 +192,7 @@ const Position HoverDiskWaypoints[MAX_HOVER_DISK_WAYPOINTS] =
#define GROUND_Z 268
// Source: Sniffs (x, y,z)
// Source: Sniffs (x,y,z)
#define MALYGOS_MAX_WAYPOINTS 16
const Position MalygosPhaseTwoWaypoints[MALYGOS_MAX_WAYPOINTS] =
{
@@ -316,6 +330,7 @@ public:
// The rest is handled in the AI of the vehicle.
target->CastSpell(target, SPELL_SUMMOM_RED_DRAGON, true);
me->Attack(target, false);
}
}
@@ -748,13 +763,18 @@ public:
_instance = creature->GetInstanceScript();
}
void Reset()
void SpellHit(Unit* /*caster*/, const SpellInfo* spell)
{
_summonTimer = urand(5, 7)*IN_MILLISECONDS;
if (spell->Id == SPELL_PORTAL_OPENED)
{
DoCast(me, SPELL_SUMMON_POWER_PARK, true);
}
}
void UpdateAI(uint32 const diff)
{
// When duration of oppened riff visual ends,
// closed one should be cast
if (!me->HasAura(SPELL_PORTAL_VISUAL_CLOSED) &&
!me->HasAura(SPELL_PORTAL_OPENED))
DoCast(me, SPELL_PORTAL_VISUAL_CLOSED, true);
@@ -770,16 +790,6 @@ public:
}
}
}
if (!me->HasAura(SPELL_PORTAL_OPENED))
return;
if (_summonTimer <= diff)
{
DoCast(SPELL_SUMMON_POWER_PARK);
_summonTimer = urand(5, 7)*IN_MILLISECONDS;
} else
_summonTimer -= diff;
}
void JustSummoned(Creature* summon)
@@ -811,6 +821,8 @@ public:
_instance = creature->GetInstanceScript();
MoveToMalygos();
// Talk range was not enough for this encounter
sCreatureTextMgr->SendChat(me, EMOTE_POWER_SPARK_SUMMONED, 0, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_MAP);
}
void EnterEvadeMode()
@@ -853,14 +865,9 @@ public:
}
}
void DamageTaken(Unit* /*done_by*/, uint32& damage)
void JustDied(Unit* /*killer*/)
{
if (damage > me->GetMaxHealth())
{
damage = 0;
DoCast(me, SPELL_POWER_SPARK_DEATH, true);
me->DespawnOrUnsummon(1000);
}
me->CastSpell(me, SPELL_POWER_SPARK_DEATH, true); // not supposed to hide the fact it's there by not selectable
}
private:
@@ -903,8 +910,7 @@ public:
else
{
// Error found: This is not called if the passenger is a player
if (unit->GetTypeId() == TYPEID_UNIT)
if (unit->GetTypeId() == TYPEID_UNIT || unit->GetTypeId() == TYPEID_PLAYER)
{
// This will only be called if the passenger dies
if (_instance)
@@ -1012,7 +1018,7 @@ public:
};
};
// SmartAI does not work correctly for this (vehicles)
// SmartAI does not work correctly for vehicles
class npc_wyrmrest_skytalon : public CreatureScript
{
public:
@@ -1023,14 +1029,13 @@ public:
return new npc_wyrmrest_skytalonAI (creature);
}
struct npc_wyrmrest_skytalonAI : public NullCreatureAI
struct npc_wyrmrest_skytalonAI : public VehicleAI
{
npc_wyrmrest_skytalonAI(Creature* creature) : NullCreatureAI(creature)
{
_instance = creature->GetInstanceScript();
npc_wyrmrest_skytalonAI(Creature* creature) : VehicleAI(creature) { }
_timer = 1000;
_entered = false;
void IsSummonedBy(Unit* summoner)
{
summoner->CastSpell(me, SPELL_RIDE_RED_DRAGON, true);
}
void PassengerBoarded(Unit* /*unit*/, int8 /*seat*/, bool apply)
@@ -1038,54 +1043,9 @@ public:
if (!apply)
me->DespawnOrUnsummon();
}
// we can't call this in reset function, it fails.
void MakePlayerEnter()
{
if (!_instance)
return;
if (Unit* summoner = me->ToTempSummon()->GetSummoner())
{
if (Creature* malygos = Unit::GetCreature(*me, _instance->GetData64(DATA_MALYGOS)))
{
summoner->CastSpell(me, SPELL_RIDE_RED_DRAGON, true);
float victimThreat = malygos->getThreatManager().getThreat(summoner);
malygos->getThreatManager().resetAllAggro();
malygos->AI()->AttackStart(me);
malygos->AddThreat(me, victimThreat);
}
}
}
void UpdateAI(const uint32 diff)
{
if (!_entered)
{
if (_timer <= diff)
{
MakePlayerEnter();
_entered = true;
} else
_timer -= diff;
}
}
private:
InstanceScript* _instance;
uint32 _timer;
bool _entered;
};
};
enum AlexstraszaYells
{
SAY_ONE,
SAY_TWO,
SAY_THREE,
SAY_FOUR
};
class npc_alexstrasza_eoe : public CreatureScript
{
public: