Scripts/Arcatraz: Rewrite Mellichar's event (#31081)

This commit is contained in:
offl
2025-07-22 22:26:15 +03:00
committed by GitHub
parent cfa9fb701a
commit 4dece3fe4e
6 changed files with 709 additions and 508 deletions

View 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;

View File

@@ -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

View File

@@ -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)
{

View File

@@ -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;
};

View File

@@ -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;