mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-27 20:32:21 +01:00
Scripts/Arcatraz: Rewrite Mellichar's event (#31081)
This commit is contained in:
35
sql/updates/world/3.3.5/2025_07_22_02_world.sql
Normal file
35
sql/updates/world/3.3.5/2025_07_22_02_world.sql
Normal file
@@ -0,0 +1,35 @@
|
||||
--
|
||||
UPDATE `creature_text` SET `Emote` = 5 WHERE `CreatureID` = 20904 AND `GroupID` = 1 AND `ID` = 0;
|
||||
UPDATE `creature_text` SET `Emote` = 1 WHERE `CreatureID` = 20904 AND `GroupID` = 2 AND `ID` = 0;
|
||||
UPDATE `creature_text` SET `Emote` = 5 WHERE `CreatureID` = 20904 AND `GroupID` = 4 AND `ID` = 0;
|
||||
UPDATE `creature_text` SET `Emote` = 5 WHERE `CreatureID` = 20904 AND `GroupID` = 5 AND `ID` = 0;
|
||||
UPDATE `creature_text` SET `Emote` = 11 WHERE `CreatureID` = 20904 AND `GroupID` = 6 AND `ID` = 0;
|
||||
UPDATE `creature_text` SET `Emote` = 5 WHERE `CreatureID` = 20904 AND `GroupID` = 7 AND `ID` = 0;
|
||||
|
||||
UPDATE `conditions` SET `ConditionValue2` = 21437 WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` = 36856;
|
||||
UPDATE `conditions` SET `ConditionValue2` = 21436 WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` = 36854;
|
||||
|
||||
DELETE FROM `creature_text` WHERE `CreatureID` IN (20977);
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||
(20977,0,0,"Where in Bonzo's Brass Buttons am I? And who are-- yaaghh, that's one mother of a headache!",14,0,100,6,0,11171,19108,0,"Millhouse Manastorm SAY_INTRO_1"),
|
||||
(20977,1,0,"\"Lowly\"? I don't care who you are, friend: no one refers to the mighty Millhouse Manastorm as \"lowly\"!",14,0,100,5,0,11172,19116,0,"Millhouse Manastorm SAY_INTRO_2"),
|
||||
(20977,2,0,"I have no idea what goes on here, but I will gladly join your fight against this impudent imbecile!",14,0,100,0,0,0,19822,0,"Millhouse Manastorm SAY_INTRO_3"),
|
||||
(20977,3,0,"Prepare to defend yourself, cretin!",14,0,100,5,0,0,19823,0,"Millhouse Manastorm SAY_INTRO_4"),
|
||||
(20977,4,0,"I just need to get some things ready first. You guys go ahead and get started. I need to summon up some water....",14,0,100,0,0,11173,19117,0,"Millhouse Manastorm SAY_WATER"),
|
||||
(20977,5,0,"Fantastic! Next, some protective spells. Yeah, now we're cookin'!",14,0,100,0,0,11174,19119,0,"Millhouse Manastorm SAY_BUFFS"),
|
||||
(20977,6,0,"And of course I'll need some mana. You guys are gonna love this; just wait....",14,0,100,0,0,11175,19120,0,"Millhouse Manastorm SAY_DRINK"),
|
||||
(20977,7,0,"Aaalllriiiight!! Who ordered up an extra large can of whoop-ass?",14,0,100,0,0,11176,19121,0,"Millhouse Manastorm SAY_READY"),
|
||||
(20977,8,0,"I didn't even break a sweat on that one!",14,0,100,0,0,11177,19824,0,"Millhouse Manastorm SAY_SLAY1"),
|
||||
(20977,8,1,"You guys feel free to jump in anytime.",14,0,100,0,0,11178,19825,0,"Millhouse Manastorm SAY_SLAY2"),
|
||||
(20977,9,0,"I'm gonna light you up, sweet cheeks!",14,0,100,0,0,11179,19826,0,"Millhouse Manastorm SAY_PYRO"),
|
||||
(20977,10,0,"Ice, ice baby.",14,0,100,0,0,11180,19827,0,"Millhouse Manastorm SAY_ICEBLOCK"),
|
||||
(20977,11,0,"Heal me! For the love of all that's holy, heal me! I'm dying!!",14,0,100,0,0,11181,19828,0,"Millhouse Manastorm SAY_LOWHP"),
|
||||
(20977,12,0,"You'll be hearing from my lawyer!",14,0,100,0,0,11182,19829,0,"Millhouse Manastorm SAY_DEATH"),
|
||||
(20977,13,0,"Who's bad? Who's bad? That's right: we bad!",14,0,100,4,0,11183,19146,0,"Millhouse Manastorm SAY_COMPLETE");
|
||||
|
||||
UPDATE `smart_scripts` SET `action_param1` = 3, `action_param3` = 1 WHERE `entryorguid` = 20905 AND `source_type` = 0 AND `id` = 2;
|
||||
UPDATE `smart_scripts` SET `action_param1` = 3, `action_param3` = 1 WHERE `entryorguid` = 20906 AND `source_type` = 0 AND `id` = 2;
|
||||
UPDATE `smart_scripts` SET `action_param1` = 3, `action_param3` = 1 WHERE `entryorguid` = 20908 AND `source_type` = 0 AND `id` = 2;
|
||||
UPDATE `smart_scripts` SET `action_param1` = 3, `action_param3` = 1 WHERE `entryorguid` = 20909 AND `source_type` = 0 AND `id` = 2;
|
||||
UPDATE `smart_scripts` SET `action_param1` = 3, `action_param3` = 1 WHERE `entryorguid` = 20910 AND `source_type` = 0 AND `id` = 3;
|
||||
UPDATE `smart_scripts` SET `action_param1` = 3, `action_param3` = 1 WHERE `entryorguid` = 20911 AND `source_type` = 0 AND `id` = 2;
|
||||
@@ -3519,6 +3519,15 @@ void SpellMgr::LoadSpellInfoCorrections()
|
||||
spellInfo->_GetEffect(EFFECT_0).RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_150_YARDS); // 150yd
|
||||
});
|
||||
|
||||
// Radius in DBC is not enough
|
||||
ApplySpellFix({
|
||||
36854, // Channel
|
||||
36856 // Channel
|
||||
}, [](SpellInfo* spellInfo)
|
||||
{
|
||||
spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(5); // 40yd
|
||||
});
|
||||
|
||||
// Master Shapeshifter: missing stance data for forms other than bear - bear version has correct data
|
||||
// To prevent aura staying on target after talent unlearned
|
||||
ApplySpellFix({ 48420 }, [](SpellInfo* spellInfo)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -31,7 +31,7 @@ enum AZDataTypes
|
||||
DATA_ZEREKETH = 0,
|
||||
DATA_DALLIAH = 1,
|
||||
DATA_SOCCOTHRATES = 2,
|
||||
DATA_HARBINGER_SKYRISS = 3,
|
||||
DATA_HARBINGER_SKYRISS = 3, // used by SmartAI
|
||||
|
||||
// Additional Data
|
||||
DATA_CONVERSATION = 4,
|
||||
@@ -40,16 +40,20 @@ enum AZDataTypes
|
||||
DATA_WARDEN_3 = 7, // used by SmartAI
|
||||
DATA_WARDEN_4 = 8, // used by SmartAI
|
||||
DATA_WARDEN_5 = 9, // used by SmartAI
|
||||
DATA_MELLICHAR = 10,
|
||||
DATA_WARDENS_SHIELD = 11
|
||||
DATA_MELLICHAR,
|
||||
DATA_WARDENS_SHIELD,
|
||||
DATA_STASIS_POD_ALPHA,
|
||||
DATA_STASIS_POD_BETA,
|
||||
DATA_STASIS_POD_DELTA,
|
||||
DATA_STASIS_POD_GAMMA,
|
||||
DATA_STASIS_POD_OMEGA
|
||||
};
|
||||
|
||||
enum AZCreatureIds
|
||||
{
|
||||
NPC_DALLIAH = 20885,
|
||||
NPC_SOCCOTHRATES = 20886,
|
||||
NPC_MELLICHAR = 20904, // skyriss will kill this unit
|
||||
NPC_ALPHA_POD_TARGET = 21436,
|
||||
NPC_MELLICHAR = 20904,
|
||||
NPC_MILLHOUSE = 20977
|
||||
};
|
||||
|
||||
@@ -70,6 +74,11 @@ enum AZSpellIds
|
||||
SPELL_QID_10886 = 39564
|
||||
};
|
||||
|
||||
enum AZMisc
|
||||
{
|
||||
ACTION_RESET_PRISON = 1
|
||||
};
|
||||
|
||||
template <class AI, class T>
|
||||
inline AI* GetArcatrazAI(T* obj)
|
||||
{
|
||||
|
||||
@@ -15,8 +15,6 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* Need more docs on how event fully work. Reset all event and force start over if fail at one point? */
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "SpellInfo.h"
|
||||
#include "SpellScript.h"
|
||||
@@ -29,7 +27,7 @@ enum SkyrissTexts
|
||||
{
|
||||
SAY_INTRO = 0,
|
||||
SAY_AGGRO = 1,
|
||||
SAY_KILL = 2,
|
||||
SAY_SLAY = 2,
|
||||
SAY_MIND = 3,
|
||||
SAY_FEAR = 4,
|
||||
SAY_IMAGE = 5,
|
||||
@@ -50,7 +48,7 @@ enum SkyrissSpells
|
||||
|
||||
SPELL_SUMMON_66_ILLUSION = 36931,
|
||||
SPELL_SUMMON_33_ILLUSION = 36932,
|
||||
|
||||
// Illusion
|
||||
SPELL_BIRTH = 26262,
|
||||
SPELL_BLINK_VISUAL = 36937,
|
||||
SPELL_66_HEALTH = 36928,
|
||||
@@ -66,7 +64,11 @@ enum SkyrissEvents
|
||||
EVENT_DOMINATION,
|
||||
EVENT_MANA_BURN,
|
||||
EVENT_SUMMON_66,
|
||||
EVENT_SUMMON_33
|
||||
EVENT_SUMMON_33,
|
||||
|
||||
EVENT_INTRO_1,
|
||||
EVENT_INTRO_2,
|
||||
EVENT_INTRO_3
|
||||
};
|
||||
|
||||
enum SkyrissMisc
|
||||
@@ -85,25 +87,17 @@ enum SkyrissPhases : uint8
|
||||
// 20912 - Harbinger Skyriss
|
||||
struct boss_harbinger_skyriss : public BossAI
|
||||
{
|
||||
boss_harbinger_skyriss(Creature* creature) : BossAI(creature, DATA_HARBINGER_SKYRISS), _intro(false), _phase(PHASE_NONE) { }
|
||||
boss_harbinger_skyriss(Creature* creature) : BossAI(creature, DATA_HARBINGER_SKYRISS), _phase(PHASE_NONE) { }
|
||||
|
||||
void Initialize()
|
||||
void JustAppeared() override
|
||||
{
|
||||
Intro_Phase = 1;
|
||||
Intro_Timer = 5000;
|
||||
events.ScheduleEvent(EVENT_INTRO_1, 0s);
|
||||
}
|
||||
|
||||
uint32 Intro_Phase;
|
||||
uint32 Intro_Timer;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
DoCastSelf(SPELL_SIMPLE_TELEPORT);
|
||||
_Reset();
|
||||
_intro = false;
|
||||
_phase = PHASE_NONE;
|
||||
me->SetImmuneToAll(!_intro);
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
@@ -132,13 +126,9 @@ struct boss_harbinger_skyriss : public BossAI
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim) override
|
||||
void KilledUnit(Unit* /*victim*/) override
|
||||
{
|
||||
// Won't yell killing pet/other unit
|
||||
if (victim->GetEntry() == NPC_ALPHA_POD_TARGET)
|
||||
return;
|
||||
|
||||
Talk(SAY_KILL);
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*killer*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
|
||||
@@ -163,42 +153,34 @@ struct boss_harbinger_skyriss : public BossAI
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!_intro)
|
||||
if (!UpdateVictim())
|
||||
{
|
||||
if (Intro_Timer <= diff)
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (Intro_Phase)
|
||||
switch (eventId)
|
||||
{
|
||||
case 1:
|
||||
Talk(SAY_INTRO);
|
||||
instance->HandleGameObject(instance->GetGuidData(DATA_WARDENS_SHIELD), true);
|
||||
++Intro_Phase;
|
||||
Intro_Timer = 25000;
|
||||
break;
|
||||
case 2:
|
||||
Talk(SAY_AGGRO);
|
||||
if (Unit* mellic = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_MELLICHAR)))
|
||||
{
|
||||
//should have a better way to do this. possibly spell exist.
|
||||
mellic->setDeathState(JUST_DIED);
|
||||
mellic->SetHealth(0);
|
||||
instance->HandleGameObject(instance->GetGuidData(DATA_WARDENS_SHIELD), false);
|
||||
}
|
||||
++Intro_Phase;
|
||||
Intro_Timer = 3000;
|
||||
break;
|
||||
case 3:
|
||||
me->SetImmuneToAll(false);
|
||||
_intro = true;
|
||||
break;
|
||||
case EVENT_INTRO_1:
|
||||
Talk(SAY_INTRO);
|
||||
DoCastSelf(SPELL_SIMPLE_TELEPORT);
|
||||
events.ScheduleEvent(EVENT_INTRO_2, 30s);
|
||||
break;
|
||||
case EVENT_INTRO_2:
|
||||
Talk(SAY_AGGRO);
|
||||
DoCastSelf(SPELL_MIND_REND_COSMETIC);
|
||||
events.ScheduleEvent(EVENT_INTRO_3, 2s);
|
||||
break;
|
||||
case EVENT_INTRO_3:
|
||||
me->SetImmuneToAll(false);
|
||||
DoZoneInCombat();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
Intro_Timer -=diff;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
}
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
@@ -251,7 +233,6 @@ struct boss_harbinger_skyriss : public BossAI
|
||||
}
|
||||
|
||||
private:
|
||||
bool _intro;
|
||||
uint8 _phase;
|
||||
};
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#include "ScriptMgr.h"
|
||||
#include "arcatraz.h"
|
||||
#include "Creature.h"
|
||||
#include "CreatureAI.h"
|
||||
#include "GameObject.h"
|
||||
#include "InstanceScript.h"
|
||||
#include "Map.h"
|
||||
@@ -29,6 +30,23 @@ DoorData const doorData[] =
|
||||
{ 0, 0, DOOR_TYPE_ROOM } // END
|
||||
};
|
||||
|
||||
ObjectData const creatureData[] =
|
||||
{
|
||||
{ NPC_MELLICHAR, DATA_MELLICHAR },
|
||||
{ 0, 0 } // END
|
||||
};
|
||||
|
||||
ObjectData const gameObjectData[] =
|
||||
{
|
||||
{ GO_STASIS_POD_ALPHA, DATA_STASIS_POD_ALPHA },
|
||||
{ GO_STASIS_POD_BETA, DATA_STASIS_POD_BETA },
|
||||
{ GO_STASIS_POD_DELTA, DATA_STASIS_POD_DELTA },
|
||||
{ GO_STASIS_POD_GAMMA, DATA_STASIS_POD_GAMMA },
|
||||
{ GO_STASIS_POD_OMEGA, DATA_STASIS_POD_OMEGA },
|
||||
{ GO_WARDENS_SHIELD, DATA_WARDENS_SHIELD },
|
||||
{ 0, 0 } //END
|
||||
};
|
||||
|
||||
class instance_arcatraz : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
@@ -41,6 +59,7 @@ class instance_arcatraz : public InstanceMapScript
|
||||
SetHeaders(DataHeader);
|
||||
SetBossNumber(EncounterCount);
|
||||
LoadDoorData(doorData);
|
||||
LoadObjectData(creatureData, gameObjectData);
|
||||
|
||||
ConversationState = NOT_STARTED;
|
||||
|
||||
@@ -59,9 +78,6 @@ class instance_arcatraz : public InstanceMapScript
|
||||
case NPC_SOCCOTHRATES:
|
||||
SoccothratesGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_MELLICHAR:
|
||||
MellicharGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_MILLHOUSE:
|
||||
MillhouseGUID = creature->GetGUID();
|
||||
break;
|
||||
@@ -70,35 +86,6 @@ class instance_arcatraz : public InstanceMapScript
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go) override
|
||||
{
|
||||
InstanceScript::OnGameObjectCreate(go);
|
||||
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_STASIS_POD_ALPHA:
|
||||
StasisPodGUIDs[0] = go->GetGUID();
|
||||
break;
|
||||
case GO_STASIS_POD_BETA:
|
||||
StasisPodGUIDs[1] = go->GetGUID();
|
||||
break;
|
||||
case GO_STASIS_POD_DELTA:
|
||||
StasisPodGUIDs[2] = go->GetGUID();
|
||||
break;
|
||||
case GO_STASIS_POD_GAMMA:
|
||||
StasisPodGUIDs[3] = go->GetGUID();
|
||||
break;
|
||||
case GO_STASIS_POD_OMEGA:
|
||||
StasisPodGUIDs[4] = go->GetGUID();
|
||||
break;
|
||||
case GO_WARDENS_SHIELD:
|
||||
WardensShieldGUID = go->GetGUID();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data) override
|
||||
{
|
||||
switch (type)
|
||||
@@ -108,8 +95,6 @@ class instance_arcatraz : public InstanceMapScript
|
||||
case DATA_WARDEN_3:
|
||||
case DATA_WARDEN_4:
|
||||
case DATA_WARDEN_5:
|
||||
if (data == IN_PROGRESS)
|
||||
HandleGameObject(StasisPodGUIDs[type - DATA_WARDEN_1], true);
|
||||
StasisPodStates[type - DATA_WARDEN_1] = uint8(data);
|
||||
break;
|
||||
case DATA_CONVERSATION:
|
||||
@@ -146,10 +131,6 @@ class instance_arcatraz : public InstanceMapScript
|
||||
return DalliahGUID;
|
||||
case DATA_SOCCOTHRATES:
|
||||
return SoccothratesGUID;
|
||||
case DATA_MELLICHAR:
|
||||
return MellicharGUID;
|
||||
case DATA_WARDENS_SHIELD:
|
||||
return WardensShieldGUID;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -172,7 +153,7 @@ class instance_arcatraz : public InstanceMapScript
|
||||
SetData(DATA_WARDEN_4, NOT_STARTED);
|
||||
SetData(DATA_WARDEN_5, NOT_STARTED);
|
||||
}
|
||||
else if (state == DONE)
|
||||
if (state == DONE)
|
||||
{
|
||||
if (!instance->IsHeroic())
|
||||
break;
|
||||
@@ -181,6 +162,11 @@ class instance_arcatraz : public InstanceMapScript
|
||||
if (millhouse->IsAlive())
|
||||
DoCastSpellOnPlayers(SPELL_QID_10886);
|
||||
}
|
||||
if (state == FAIL)
|
||||
{
|
||||
if (Creature* mellichar = GetCreature(DATA_MELLICHAR))
|
||||
mellichar->AI()->DoAction(ACTION_RESET_PRISON);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -191,9 +177,6 @@ class instance_arcatraz : public InstanceMapScript
|
||||
protected:
|
||||
ObjectGuid DalliahGUID;
|
||||
ObjectGuid SoccothratesGUID;
|
||||
ObjectGuid StasisPodGUIDs[5];
|
||||
ObjectGuid MellicharGUID;
|
||||
ObjectGuid WardensShieldGUID;
|
||||
ObjectGuid MillhouseGUID;
|
||||
|
||||
uint8 ConversationState;
|
||||
|
||||
Reference in New Issue
Block a user