Merge branch 'master' into Playerbot

This commit is contained in:
Yunfan Li
2023-08-24 22:07:53 +08:00
96 changed files with 3271 additions and 2541 deletions

View File

@@ -152,11 +152,12 @@ public:
GameEventMgr::ActiveEvents const& activeEvents = sGameEventMgr->GetActiveEventList();
if (activeEvents.find(eventId) != activeEvents.end())
{
handler->PSendSysMessage(LANG_EVENT_ALREADY_ACTIVE, uint16(eventId));
handler->PSendSysMessage(LANG_EVENT_ALREADY_ACTIVE, uint16(eventId), eventData.description.c_str());
handler->SetSentErrorMessage(true);
return false;
}
handler->PSendSysMessage(LANG_EVENT_STARTED, uint16(eventId), eventData.description.c_str());
sGameEventMgr->StartEvent(eventId, true);
return true;
}
@@ -184,11 +185,12 @@ public:
if (activeEvents.find(eventId) == activeEvents.end())
{
handler->PSendSysMessage(LANG_EVENT_NOT_ACTIVE, uint16(eventId));
handler->PSendSysMessage(LANG_EVENT_NOT_ACTIVE, uint16(eventId), eventData.description.c_str());
handler->SetSentErrorMessage(true);
return false;
}
handler->PSendSysMessage(LANG_EVENT_STOPPED, uint16(eventId), eventData.description.c_str());
sGameEventMgr->StopEvent(eventId, true);
return true;
}

View File

@@ -31,8 +31,8 @@ uint32 const DragonspireMobs[3] = { NPC_BLACKHAND_DREADWEAVER, NPC_BLACKHAND_SUM
enum EventIds
{
EVENT_DARGONSPIRE_ROOM_STORE = 1,
EVENT_DARGONSPIRE_ROOM_CHECK = 2,
EVENT_DRAGONSPIRE_ROOM_STORE = 1,
EVENT_DRAGONSPIRE_ROOM_CHECK = 2,
EVENT_SOLAKAR_WAVE = 3
};
@@ -352,7 +352,7 @@ public:
if (data == AREATRIGGER_DRAGONSPIRE_HALL)
{
if (GetBossState(DATA_DRAGONSPIRE_ROOM) != DONE)
Events.ScheduleEvent(EVENT_DARGONSPIRE_ROOM_STORE, 1s);
Events.ScheduleEvent(EVENT_DRAGONSPIRE_ROOM_STORE, 1s);
}
break;
case DATA_SOLAKAR_FLAMEWREATH:
@@ -555,14 +555,14 @@ public:
{
switch (eventId)
{
case EVENT_DARGONSPIRE_ROOM_STORE:
case EVENT_DRAGONSPIRE_ROOM_STORE:
Dragonspireroomstore();
Events.ScheduleEvent(EVENT_DARGONSPIRE_ROOM_CHECK, 3s);
Events.ScheduleEvent(EVENT_DRAGONSPIRE_ROOM_CHECK, 3s);
break;
case EVENT_DARGONSPIRE_ROOM_CHECK:
case EVENT_DRAGONSPIRE_ROOM_CHECK:
Dragonspireroomcheck();
if ((GetBossState(DATA_DRAGONSPIRE_ROOM) != DONE))
Events.ScheduleEvent(EVENT_DARGONSPIRE_ROOM_CHECK, 3s);
Events.ScheduleEvent(EVENT_DRAGONSPIRE_ROOM_CHECK, 3s);
break;
case EVENT_SOLAKAR_WAVE:
SummonSolakarWave(CurrentSolakarWave);

View File

@@ -38,11 +38,12 @@ enum Spells
struct boss_maiden_of_virtue : public BossAI
{
boss_maiden_of_virtue(Creature* creature) : BossAI(creature, DATA_MAIDEN) { }
void Reset() override
boss_maiden_of_virtue(Creature* creature) : BossAI(creature, DATA_MAIDEN)
{
BossAI::Reset();
scheduler.SetValidator([this]
{
return !me->HasUnitState(UNIT_STATE_CASTING);
});
}
void JustEngagedWith(Unit* who) override
@@ -82,18 +83,6 @@ struct boss_maiden_of_virtue : public BossAI
BossAI::JustDied(killer);
Talk(SAY_DEATH);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
scheduler.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
DoMeleeAttackIfReady();
}
};
void AddSC_boss_maiden_of_virtue()

View File

@@ -40,30 +40,11 @@ struct boss_servant_quarters : public BossAI
void Reset() override
{
_scheduler.CancelAll();
me->SetVisible(false);
me->SetReactState(REACT_PASSIVE);
me->SetFaction(FACTION_FRIENDLY);
_scheduler.Schedule(5s, [this](TaskContext context)
{
if (instance->GetBossState(DATA_SERVANT_QUARTERS) == DONE)
{
me->SetVisible(true);
me->SetReactState(REACT_AGGRESSIVE);
me->RestoreFaction();
}
else
{
context.Repeat(5s);
}
});
if (me->GetEntry() == NPC_HYAKISS_THE_LURKER)
{
DoCastSelf(SPELL_SNEAK, true);
}
if (instance->GetData(DATA_SELECTED_RARE) != me->GetEntry())
{
me->DespawnOrUnsummon(1);
}
}
void JustEngagedWith(Unit* /*who*/) override

File diff suppressed because it is too large Load Diff

View File

@@ -35,7 +35,14 @@ const Position OptionalSpawn[] =
ObjectData const creatureData[] =
{
{ NPC_ATTUMEN_THE_HUNTSMAN, DATA_ATTUMEN },
{ NPC_MIDNIGHT, DATA_MIDNIGHT }
{ NPC_MIDNIGHT, DATA_MIDNIGHT },
{ NPC_DOROTHEE, DATA_DOROTHEE },
{ NPC_TITO, DATA_TITO },
{ NPC_ROAR, DATA_ROAR },
{ NPC_STRAWMAN, DATA_STRAWMAN },
{ NPC_TINHEAD, DATA_TINHEAD },
{ NPC_ROMULO, DATA_ROMULO },
{ NPC_JULIANNE, DATA_JULIANNE },
};
class instance_karazhan : public InstanceMapScript

View File

@@ -40,11 +40,10 @@ enum KZDataTypes
DATA_MALCHEZZAR = 10,
DATA_NIGHTBANE = 11,
DATA_SERVANT_QUARTERS = 12,
DATA_SELECTED_RARE = 13,
DATA_OPERA_OZ_DEATHCOUNT = 14,
DATA_KILREK = 15,
DATA_OPERA_OZ_DEATHCOUNT = 13,
DATA_KILREK = 14,
MAX_ENCOUNTERS = 16,
MAX_ENCOUNTERS = 15,
DATA_GO_CURTAINS = 18,
DATA_GO_STAGEDOORLEFT = 19,
@@ -67,7 +66,17 @@ enum KZDataTypes
DATA_CHESS_REINIT_PIECES = 34,
DATA_CHESS_GAME_PHASE = 35,
DATA_ECHO_OF_MEDIVH = 36,
DATA_DUST_COVERED_CHEST = 37
DATA_DUST_COVERED_CHEST = 37,
// Specific Opera Data
DATA_DOROTHEE = 38,
DATA_ROMULO = 39,
DATA_JULIANNE = 40,
DATA_ROAR = 41,
DATA_STRAWMAN = 42,
DATA_TINHEAD = 43,
DATA_TITO = 44
};
enum KZOperaEvents
@@ -101,6 +110,13 @@ enum KZCreatures
NPC_KILREK = 17229,
NPC_RELAY = 17645,
NPC_BARNES = 16812,
NPC_DOROTHEE = 17535,
NPC_TITO = 17548,
NPC_ROMULO = 17533,
NPC_JULIANNE = 17534,
NPC_ROAR = 17546,
NPC_STRAWMAN = 17543,
NPC_TINHEAD = 17547,
// Chess Event
NPC_ECHO_OF_MEDIVH = 16816,

View File

@@ -112,10 +112,6 @@ struct boss_lieutenant_drake : public BossAI
{
_JustDied();
Talk(SAY_DEATH);
if (InstanceScript* instance = me->GetInstanceScript())
{
instance->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_DRAKE_KILLED);
}
}
void MovementInform(uint32 type, uint32 point) override

View File

@@ -257,7 +257,7 @@ public:
{
switch (param)
{
case ENCOUNTER_PROGRESS_DRAKE_KILLED:
case ENCOUNTER_PROGRESS_BARRELS:
events.ScheduleEvent(EVENT_OPEN_DOORS, 0);
events.ScheduleEvent(EVENT_START_WP, 3000);
break;

View File

@@ -74,7 +74,7 @@ enum MiscIds
ENCOUNTER_PROGRESS_NONE = 0,
ENCOUNTER_PROGRESS_BARRELS = 1,
ENCOUNTER_PROGRESS_DRAKE_KILLED = 2,
//ENCOUNTER_PROGRESS_DRAKE_KILLED = 2, No longer used. Kept as reference as DB might rely on the existing order.
ENCOUNTER_PROGRESS_THRALL_ARMORED = 3,
ENCOUNTER_PROGRESS_AMBUSHES_1 = 4,
ENCOUNTER_PROGRESS_SKARLOC_KILLED = 5,

View File

@@ -39,6 +39,8 @@ EndContentData */
#include "ScriptedCreature.h"
#include "ScriptedEscortAI.h"
#include "ScriptedGossip.h"
#include "SpellAuras.h"
#include "SpellScript.h"
/*######
## npc_draenei_survivor
@@ -522,6 +524,55 @@ public:
}
};
enum NestlewoodOwlkin
{
NPC_NESTLEWOOD_OWLKIN_ENTRY = 16518,
NPC_INOCULATED_OWLKIN_ENTRY = 16534,
TALK_OWLKIN = 0
};
class spell_inoculate_nestlewood_owlkin : public AuraScript
{
public:
PrepareAuraScript(spell_inoculate_nestlewood_owlkin)
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (Creature* owlkin = GetTarget()->ToCreature())
if (owlkin->GetEntry() == NPC_NESTLEWOOD_OWLKIN_ENTRY)
owlkin->SetFacingToObject(GetCaster());
}
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
return;
if (Creature* owlkin = GetTarget()->ToCreature())
{
if (owlkin->GetEntry() == NPC_NESTLEWOOD_OWLKIN_ENTRY)
{
Player* caster = GetCaster()->ToPlayer();
if (owlkin->UpdateEntry(NPC_INOCULATED_OWLKIN_ENTRY))
{
owlkin->AI()->Talk(TALK_OWLKIN);
owlkin->GetMotionMaster()->MoveRandom(15.0f);
owlkin->SetUnitFlag(UnitFlags(UNIT_FLAG_IMMUNE_TO_PC));
owlkin->DespawnOrUnsummon(15s, 0s);
caster->RewardPlayerAndGroupAtEvent(NPC_INOCULATED_OWLKIN_ENTRY, caster);
}
}
}
}
void Register() override
{
OnEffectApply += AuraEffectApplyFn(spell_inoculate_nestlewood_owlkin::HandleEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
AfterEffectRemove += AuraEffectRemoveFn(spell_inoculate_nestlewood_owlkin::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
}
};
void AddSC_azuremyst_isle()
{
new npc_draenei_survivor();
@@ -531,4 +582,5 @@ void AddSC_azuremyst_isle()
new go_ravager_cage();
new npc_stillpine_capitive();
new go_bristlelimb_cage();
RegisterSpellScript(spell_inoculate_nestlewood_owlkin);
}

View File

@@ -702,7 +702,6 @@ public:
}
}
me->RemoveVehicleKit(); // not Crash (;
events.ScheduleEvent(EVENT_TAKE_OFF, 2s);
me->CastSpell(passenger, VEHICLE_SPELL_PARACHUTE, true);
}

View File

@@ -73,6 +73,13 @@ struct boss_harbinger_skyriss : public BossAI
});
}
void EnterEvadeMode(EvadeReason why) override
{
BossAI::EnterEvadeMode(why);
instance->DoRespawnCreature(DATA_WARDEN_MELLICHAR, true);
me->DespawnOrUnsummon();
}
void JustEngagedWith(Unit* /*who*/) override
{
Talk(SAY_AGGRO);

View File

@@ -4917,6 +4917,87 @@ class spell_gen_curse_of_pain : public AuraScript
}
};
enum SpiritofCompetition
{
// Spells
SPELL_SPIRIT_OF_COMPETITION_PARTICIPANT_EFFECT = 48056,
SPELL_SPIRIT_OF_COMPETITION_WINNER_EFFECT = 48057,
// Mail
MAIL_THE_COMPETITIORS_TABARD = 195,
MAIL_A_GOLD_MEDALLION = 196,
// NPC
NPC_SPIRIT_OF_COMPETITION = 27217,
// Items
ITEM_COMPETITORS_TABARD = 36941,
ITEM_GOLD_MEDALLION = 37297,
};
class spell_gen_spirit_of_competition_participant : public SpellScript
{
PrepareSpellScript(spell_gen_spirit_of_competition_participant);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_SPIRIT_OF_COMPETITION_PARTICIPANT_EFFECT });
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
if (Player* player = GetHitPlayer())
{
player->CastSpell(player, SPELL_SPIRIT_OF_COMPETITION_PARTICIPANT_EFFECT, true);
Item* item = Item::CreateItem(ITEM_COMPETITORS_TABARD, 1);
if (!item)
return;
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
MailDraft(MAIL_THE_COMPETITIORS_TABARD)
.AddItem(item)
.SendMailTo(trans, player, MailSender(NPC_SPIRIT_OF_COMPETITION), MAIL_CHECK_MASK_HAS_BODY);
CharacterDatabase.CommitTransaction(trans);
}
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_gen_spirit_of_competition_participant::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
class spell_gen_spirit_of_competition_winner : public SpellScript
{
PrepareSpellScript(spell_gen_spirit_of_competition_winner);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_SPIRIT_OF_COMPETITION_WINNER_EFFECT });
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
if (Player* player = GetHitPlayer())
{
player->CastSpell(player, SPELL_SPIRIT_OF_COMPETITION_WINNER_EFFECT, true);
Item* item = Item::CreateItem(ITEM_GOLD_MEDALLION, 1);
if (!item)
return;
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
MailDraft(MAIL_A_GOLD_MEDALLION)
.AddItem(item)
.SendMailTo(trans, player, MailSender(NPC_SPIRIT_OF_COMPETITION), MAIL_CHECK_MASK_HAS_BODY);
CharacterDatabase.CommitTransaction(trans);
}
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_gen_spirit_of_competition_winner::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
void AddSC_generic_spell_scripts()
{
RegisterSpellScript(spell_silithyst);
@@ -5063,4 +5144,6 @@ void AddSC_generic_spell_scripts()
RegisterSpellScript(spell_gen_threshalisk_charge);
RegisterSpellScript(spell_gen_shriveling_gaze);
RegisterSpellScript(spell_gen_curse_of_pain);
RegisterSpellScript(spell_gen_spirit_of_competition_participant);
RegisterSpellScript(spell_gen_spirit_of_competition_winner);
}

View File

@@ -2975,8 +2975,9 @@ class spell_item_nigh_invulnerability : public SpellScript
enum Poultryzer
{
SPELL_POULTRYIZER_SUCCESS = 30501,
SPELL_POULTRYIZER_BACKFIRE = 30504,
SPELL_POULTRYIZER_SUCCESS_1 = 30501,
SPELL_POULTRYIZER_SUCCESS_2 = 30504, // malfunction
SPELL_POULTRYIZER_BACKFIRE = 30506, // Not removed on damage
};
class spell_item_poultryizer : public SpellScript
@@ -2985,13 +2986,22 @@ class spell_item_poultryizer : public SpellScript
bool Validate(SpellInfo const* /*spell*/) override
{
return ValidateSpellInfo({ SPELL_POULTRYIZER_SUCCESS, SPELL_POULTRYIZER_BACKFIRE });
return ValidateSpellInfo({ SPELL_POULTRYIZER_SUCCESS_1, SPELL_POULTRYIZER_SUCCESS_2, SPELL_POULTRYIZER_BACKFIRE });
}
void HandleDummy(SpellEffIndex /* effIndex */)
{
if (GetCastItem() && GetHitUnit())
GetCaster()->CastSpell(GetHitUnit(), roll_chance_i(80) ? SPELL_POULTRYIZER_SUCCESS : SPELL_POULTRYIZER_BACKFIRE, true, GetCastItem());
{
if (roll_chance_i(80))
{
GetCaster()->CastSpell(GetHitUnit(), roll_chance_i(80) ? SPELL_POULTRYIZER_SUCCESS_1 : SPELL_POULTRYIZER_SUCCESS_2, true, GetCastItem());
}
else
{
GetCaster()->CastSpell(GetCaster(), SPELL_POULTRYIZER_BACKFIRE, true, GetCastItem());
}
}
}
void Register() override

View File

@@ -2451,6 +2451,27 @@ class spell_q4735_collect_rookery_egg : public SpellScript
}
};
enum BookOfFelNames
{
SPELL_METAMORPHOSIS = 36298
};
class spell_q10651_q10692_book_of_fel_names : public SpellScript
{
PrepareSpellScript(spell_q10651_q10692_book_of_fel_names);
void HandleScript(SpellEffIndex /*effIndex*/)
{
if (GetHitUnit()->HasAura(SPELL_METAMORPHOSIS))
GetHitUnit()->RemoveAurasDueToSpell(SPELL_METAMORPHOSIS);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_q10651_q10692_book_of_fel_names::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
void AddSC_quest_spell_scripts()
{
RegisterSpellAndAuraScriptPair(spell_q11065_wrangle_some_aether_rays, spell_q11065_wrangle_some_aether_rays_aura);
@@ -2522,4 +2543,5 @@ void AddSC_quest_spell_scripts()
RegisterSpellScript(spell_q12919_gymers_throw);
RegisterSpellScript(spell_q5056_summon_shy_rotam);
RegisterSpellScript(spell_q4735_collect_rookery_egg);
RegisterSpellScript(spell_q10651_q10692_book_of_fel_names);
}