/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*/
#include "alterac_valley.h"
#include "ScriptMgr.h"
#include "Battleground.h"
#include "GameObject.h"
#include "GameObjectAI.h"
#include "Player.h"
#include "ScriptedCreature.h"
#include
enum Spells
{
SPELL_CHARGE = 22911,
SPELL_CLEAVE = 40504,
SPELL_DEMORALIZING_SHOUT = 23511,
SPELL_ENRAGE = 8599,
SPELL_WHIRLWIND = 13736
};
enum Creatures
{
NPC_NORTH_MARSHAL = 14762,
NPC_SOUTH_MARSHAL = 14763,
NPC_ICEWING_MARSHAL = 14764,
NPC_STONEHEARTH_MARSHAL = 14765,
NPC_EAST_FROSTWOLF_WARMASTER = 14772,
NPC_ICEBLOOD_WARMASTER = 14773,
NPC_TOWER_POINT_WARMASTER = 14776,
NPC_WEST_FROSTWOLF_WARMASTER = 14777
};
enum Events
{
EVENT_CHARGE_TARGET = 1,
EVENT_CLEAVE = 2,
EVENT_DEMORALIZING_SHOUT = 3,
EVENT_WHIRLWIND = 4,
EVENT_ENRAGE = 5,
EVENT_CHECK_RESET = 6
};
struct npc_av_marshal_or_warmaster : public ScriptedAI
{
npc_av_marshal_or_warmaster(Creature* creature) : ScriptedAI(creature) { }
void Reset() override
{
events.Reset();
events.ScheduleEvent(EVENT_CHARGE_TARGET, 2s, 12s);
events.ScheduleEvent(EVENT_CLEAVE, 1s, 11s);
events.ScheduleEvent(EVENT_DEMORALIZING_SHOUT, 2s);
events.ScheduleEvent(EVENT_WHIRLWIND, 5s, 20s);
events.ScheduleEvent(EVENT_ENRAGE, 5s, 20s);
events.ScheduleEvent(EVENT_CHECK_RESET, 5s);
}
void JustAppeared() override
{
Reset();
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_CHARGE_TARGET:
DoCastVictim(SPELL_CHARGE);
events.ScheduleEvent(EVENT_CHARGE, 10s, 25s);
break;
case EVENT_CLEAVE:
DoCastVictim(SPELL_CLEAVE);
events.ScheduleEvent(EVENT_CLEAVE, 10s, 16s);
break;
case EVENT_DEMORALIZING_SHOUT:
DoCast(me, SPELL_DEMORALIZING_SHOUT);
events.ScheduleEvent(EVENT_DEMORALIZING_SHOUT, 10s, 15s);
break;
case EVENT_WHIRLWIND:
DoCast(me, SPELL_WHIRLWIND);
events.ScheduleEvent(EVENT_WHIRLWIND, 10s, 25s);
break;
case EVENT_ENRAGE:
DoCast(me, SPELL_ENRAGE);
events.ScheduleEvent(EVENT_ENRAGE, 10s, 30s);
break;
case EVENT_CHECK_RESET:
{
Position const& _homePosition = me->GetHomePosition();
if (me->GetDistance2d(_homePosition.GetPositionX(), _homePosition.GetPositionY()) > 50.0f)
{
EnterEvadeMode();
return;
}
events.ScheduleEvent(EVENT_CHECK_RESET, 5s);
break;
}
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
}
}
private:
EventMap events;
};
struct go_av_capturable_object : public GameObjectAI
{
go_av_capturable_object(GameObject* go) : GameObjectAI(go) { }
void Reset() override
{
me->setActive(true);
}
bool OnGossipHello(Player* player) override
{
if (me->GetGoState() != GO_STATE_READY)
return true;
if (ZoneScript* zonescript = me->GetZoneScript())
{
zonescript->DoAction(ACTION_AV_INTERACT_CAPTURABLE_OBJECT, player, me);
return false;
}
return true;
}
};
struct go_av_contested_object : public go_av_capturable_object
{
go_av_contested_object(GameObject* go) : go_av_capturable_object(go) { }
void Reset() override
{
go_av_capturable_object::Reset();
_scheduler.Schedule(4min, [&](TaskContext)
{
if (ZoneScript* zonescript = me->GetZoneScript())
zonescript->DoAction(ACTION_AV_CAPTURE_CAPTURABLE_OBJECT, me, me);
});
}
void UpdateAI(uint32 diff) override
{
_scheduler.Update(diff);
}
private:
TaskScheduler _scheduler;
};
class at_av_exploit : public AreaTriggerScript
{
public:
at_av_exploit() : AreaTriggerScript("at_av_exploit") { }
bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/) override
{
if (Battleground* battleground = player->GetBattleground())
if (battleground->GetStatus() == STATUS_WAIT_JOIN)
battleground->TeleportPlayerToExploitLocation(player);
return true;
}
};
template
class quest_alterac_valley : public QuestScript
{
public:
quest_alterac_valley(char const* scriptName) : QuestScript(scriptName) { }
void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
{
if (newStatus != QUEST_STATUS_REWARDED)
return;
if (ZoneScript* zoneScript = player->FindZoneScript())
zoneScript->DoAction(ActionId, player, player);
}
};
void AddSC_alterac_valley()
{
RegisterCreatureAI(npc_av_marshal_or_warmaster);
RegisterGameObjectAI(go_av_capturable_object);
RegisterGameObjectAI(go_av_contested_object);
new at_av_exploit();
new quest_alterac_valley("quest_alterac_valley_armor_scraps");
new quest_alterac_valley("quest_alterac_valley_call_of_air_slidore_guse");
new quest_alterac_valley("quest_alterac_valley_call_of_air_vipore_jeztor");
new quest_alterac_valley("quest_alterac_valley_call_of_air_ichman_mulverick");
new quest_alterac_valley("quest_alterac_valley_boss_5");
new quest_alterac_valley("quest_alterac_valley_boss_1");
new quest_alterac_valley("quest_alterac_valley_near_mine");
new quest_alterac_valley("quest_alterac_valley_other_mine");
new quest_alterac_valley("quest_alterac_valley_ram_harnesses");
new quest_alterac_valley("quest_alterac_valley_empty_stables");
}