Scripts/ScarletEnclave: ported several fixes from 335
This commit is contained in:
1 parent
adf9e6a004
commit
893b80d0c4
4 files changed
+461
-436
No files matched your search
+91
-289
@@ -17,6 +17,7 @@
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "CombatAI.h"
|
||||
#include "CreatureAIImpl.h"
|
||||
#include "GameObject.h"
|
||||
#include "GameObjectAI.h"
|
||||
#include "Log.h"
|
||||
@@ -39,8 +40,7 @@
|
||||
|
||||
enum UnworthyInitiate
|
||||
{
|
||||
SPELL_SOUL_PRISON_CHAIN_SELF = 54612,
|
||||
SPELL_SOUL_PRISON_CHAIN = 54613,
|
||||
SPELL_SOUL_PRISON_CHAIN = 54612,
|
||||
SPELL_DK_INITIATE_VISUAL = 51519,
|
||||
|
||||
SPELL_ICY_TOUCH = 52372,
|
||||
@@ -166,7 +166,6 @@ public:
|
||||
phase = PHASE_TO_EQUIP;
|
||||
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
me->RemoveAurasDueToSpell(SPELL_SOUL_PRISON_CHAIN_SELF);
|
||||
me->RemoveAurasDueToSpell(SPELL_SOUL_PRISON_CHAIN);
|
||||
|
||||
float z;
|
||||
@@ -236,6 +235,7 @@ public:
|
||||
{
|
||||
me->SetFaction(FACTION_MONSTER);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
phase = PHASE_ATTACKING;
|
||||
|
||||
if (Player* target = ObjectAccessor::GetPlayer(*me, playerGUID))
|
||||
@@ -905,11 +905,14 @@ public:
|
||||
};
|
||||
|
||||
// correct way: 52312 52314 52555 ...
|
||||
enum Creatures_SG
|
||||
enum TheGiftThatKeepsOnGiving
|
||||
{
|
||||
SAY_LINE_0 = 0,
|
||||
|
||||
NPC_GHOULS = 28845,
|
||||
NPC_GHOSTS = 28846,
|
||||
};
|
||||
|
||||
class npc_dkc1_gothik : public CreatureScript
|
||||
{
|
||||
public:
|
||||
@@ -954,312 +957,112 @@ public:
|
||||
|
||||
};
|
||||
|
||||
class npc_scarlet_ghoul : public CreatureScript
|
||||
struct npc_scarlet_ghoul : public ScriptedAI
|
||||
{
|
||||
public:
|
||||
npc_scarlet_ghoul() : CreatureScript("npc_scarlet_ghoul") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
npc_scarlet_ghoul(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
return new npc_scarlet_ghoulAI(creature);
|
||||
me->SetReactState(REACT_DEFENSIVE);
|
||||
}
|
||||
|
||||
struct npc_scarlet_ghoulAI : public ScriptedAI
|
||||
void JustAppeared() override
|
||||
{
|
||||
npc_scarlet_ghoulAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
// Ghouls should display their Birth Animation
|
||||
// Crawling out of the ground
|
||||
//DoCast(me, 35177, true);
|
||||
//me->MonsterSay("Mommy?", LANG_UNIVERSAL, 0);
|
||||
me->SetReactState(REACT_DEFENSIVE);
|
||||
}
|
||||
CreatureAI::JustAppeared();
|
||||
|
||||
void FindMinions(Unit* owner)
|
||||
{
|
||||
std::list<Creature*> MinionList;
|
||||
owner->GetAllMinionsByEntry(MinionList, NPC_GHOULS);
|
||||
if (urand(0, 1))
|
||||
if (Unit* owner = me->GetOwner())
|
||||
Talk(SAY_LINE_0, owner);
|
||||
}
|
||||
|
||||
if (!MinionList.empty())
|
||||
void FindMinions(Unit* owner)
|
||||
{
|
||||
std::list<Creature*> MinionList;
|
||||
owner->GetAllMinionsByEntry(MinionList, NPC_GHOULS);
|
||||
|
||||
if (!MinionList.empty())
|
||||
{
|
||||
for (Creature* creature : MinionList)
|
||||
{
|
||||
for (std::list<Creature*>::const_iterator itr = MinionList.begin(); itr != MinionList.end(); ++itr)
|
||||
if (creature->GetOwner()->GetGUID() == me->GetOwner()->GetGUID())
|
||||
{
|
||||
if ((*itr)->GetOwner()->GetGUID() == me->GetOwner()->GetGUID())
|
||||
if (creature->IsInCombat() && creature->getAttackerForHelper())
|
||||
{
|
||||
if ((*itr)->IsInCombat() && (*itr)->getAttackerForHelper())
|
||||
{
|
||||
AttackStart((*itr)->getAttackerForHelper());
|
||||
}
|
||||
AttackStart(creature->getAttackerForHelper());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 /*diff*/) override
|
||||
void UpdateAI(uint32 /*diff*/) override
|
||||
{
|
||||
if (!me->IsInCombat())
|
||||
{
|
||||
if (!me->IsInCombat())
|
||||
if (Unit* owner = me->GetOwner())
|
||||
{
|
||||
if (Unit* owner = me->GetOwner())
|
||||
Player* plrOwner = owner->ToPlayer();
|
||||
if (plrOwner && plrOwner->IsInCombat())
|
||||
{
|
||||
Player* plrOwner = owner->ToPlayer();
|
||||
if (plrOwner && plrOwner->IsInCombat())
|
||||
{
|
||||
if (plrOwner->getAttackerForHelper() && plrOwner->getAttackerForHelper()->GetEntry() == NPC_GHOSTS)
|
||||
AttackStart(plrOwner->getAttackerForHelper());
|
||||
else
|
||||
FindMinions(owner);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!UpdateVictim() || !me->GetVictim())
|
||||
return;
|
||||
|
||||
//ScriptedAI::UpdateAI(diff);
|
||||
//Check if we have a current target
|
||||
if (me->EnsureVictim()->GetEntry() == NPC_GHOSTS)
|
||||
{
|
||||
if (me->isAttackReady())
|
||||
{
|
||||
//If we are within range melee the target
|
||||
if (me->IsWithinMeleeRange(me->GetVictim()))
|
||||
{
|
||||
me->AttackerStateUpdate(me->GetVictim());
|
||||
me->resetAttackTimer();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
/*####
|
||||
## npc_scarlet_miner_cart
|
||||
####*/
|
||||
|
||||
enum ScarletMinerCart
|
||||
{
|
||||
SPELL_CART_CHECK = 54173,
|
||||
SPELL_SUMMON_CART = 52463,
|
||||
SPELL_SUMMON_MINER = 52464,
|
||||
SPELL_CART_DRAG = 52465,
|
||||
|
||||
NPC_MINER = 28841
|
||||
};
|
||||
|
||||
class npc_scarlet_miner_cart : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_scarlet_miner_cart() : CreatureScript("npc_scarlet_miner_cart") { }
|
||||
|
||||
struct npc_scarlet_miner_cartAI : public PassiveAI
|
||||
{
|
||||
npc_scarlet_miner_cartAI(Creature* creature) : PassiveAI(creature)
|
||||
{
|
||||
me->SetDisplayId(me->GetCreatureTemplate()->Modelid1); // Modelid2 is a horse.
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon) override
|
||||
{
|
||||
if (summon->GetEntry() == NPC_MINER)
|
||||
{
|
||||
_minerGUID = summon->GetGUID();
|
||||
summon->AI()->SetGUID(_playerGUID);
|
||||
}
|
||||
}
|
||||
|
||||
void SummonedCreatureDespawn(Creature* summon) override
|
||||
{
|
||||
if (summon->GetEntry() == NPC_MINER)
|
||||
_minerGUID.Clear();
|
||||
}
|
||||
|
||||
void DoAction(int32 /*param*/) override
|
||||
{
|
||||
if (Creature* miner = ObjectAccessor::GetCreature(*me, _minerGUID))
|
||||
{
|
||||
me->SetWalk(false);
|
||||
|
||||
// Not 100% correct, but movement is smooth. Sometimes miner walks faster
|
||||
// than normal, this speed is fast enough to keep up at those times.
|
||||
me->SetSpeedRate(MOVE_RUN, 1.25f);
|
||||
|
||||
me->GetMotionMaster()->MoveFollow(miner, 1.0f, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) override
|
||||
{
|
||||
if (apply)
|
||||
{
|
||||
_playerGUID = who->GetGUID();
|
||||
me->CastSpell((Unit*)nullptr, SPELL_SUMMON_MINER, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
_playerGUID.Clear();
|
||||
if (Creature* miner = ObjectAccessor::GetCreature(*me, _minerGUID))
|
||||
miner->DespawnOrUnsummon();
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
ObjectGuid _minerGUID;
|
||||
ObjectGuid _playerGUID;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new npc_scarlet_miner_cartAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
/*####
|
||||
## npc_scarlet_miner
|
||||
####*/
|
||||
|
||||
enum Says_SM
|
||||
{
|
||||
SAY_SCARLET_MINER_0 = 0,
|
||||
SAY_SCARLET_MINER_1 = 1
|
||||
};
|
||||
|
||||
class npc_scarlet_miner : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_scarlet_miner() : CreatureScript("npc_scarlet_miner") { }
|
||||
|
||||
struct npc_scarlet_minerAI : public EscortAI
|
||||
{
|
||||
npc_scarlet_minerAI(Creature* creature) : EscortAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
carGUID.Clear();
|
||||
IntroTimer = 0;
|
||||
IntroPhase = 0;
|
||||
}
|
||||
|
||||
uint32 IntroTimer;
|
||||
uint32 IntroPhase;
|
||||
ObjectGuid carGUID;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void IsSummonedBy(Unit* summoner) override
|
||||
{
|
||||
carGUID = summoner->GetGUID();
|
||||
}
|
||||
|
||||
void InitWaypoint()
|
||||
{
|
||||
AddWaypoint(1, 2389.03f, -5902.74f, 109.014f, 0.f, 5000);
|
||||
AddWaypoint(2, 2341.812012f, -5900.484863f, 102.619743f);
|
||||
AddWaypoint(3, 2306.561279f, -5901.738281f, 91.792419f);
|
||||
AddWaypoint(4, 2300.098389f, -5912.618652f, 86.014885f);
|
||||
AddWaypoint(5, 2294.142090f, -5927.274414f, 75.316849f);
|
||||
AddWaypoint(6, 2286.984375f, -5944.955566f, 63.714966f);
|
||||
AddWaypoint(7, 2280.001709f, -5961.186035f, 54.228283f);
|
||||
AddWaypoint(8, 2259.389648f, -5974.197754f, 42.359348f);
|
||||
AddWaypoint(9, 2242.882812f, -5984.642578f, 32.827850f);
|
||||
AddWaypoint(10, 2217.265625f, -6028.959473f, 7.675705f);
|
||||
AddWaypoint(11, 2202.595947f, -6061.325684f, 5.882018f);
|
||||
AddWaypoint(12, 2188.974609f, -6080.866699f, 3.370027f);
|
||||
|
||||
if (urand(0, 1))
|
||||
{
|
||||
AddWaypoint(13, 2176.483887f, -6110.407227f, 1.855181f);
|
||||
AddWaypoint(14, 2172.516602f, -6146.752441f, 1.074235f);
|
||||
AddWaypoint(15, 2138.918457f, -6158.920898f, 1.342926f);
|
||||
AddWaypoint(16, 2129.866699f, -6174.107910f, 4.380779f);
|
||||
AddWaypoint(17, 2117.709473f, -6193.830078f, 13.3542f, 0.f, 10000);
|
||||
}
|
||||
else
|
||||
{
|
||||
AddWaypoint(13, 2184.190186f, -6166.447266f, 0.968877f);
|
||||
AddWaypoint(14, 2234.265625f, -6163.741211f, 0.916021f);
|
||||
AddWaypoint(15, 2268.071777f, -6158.750977f, 1.822252f);
|
||||
AddWaypoint(16, 2270.028320f, -6176.505859f, 6.340538f);
|
||||
AddWaypoint(17, 2271.739014f, -6195.401855f, 13.3542f, 0.f, 10000);
|
||||
}
|
||||
}
|
||||
|
||||
void SetGUID(ObjectGuid const& guid, int32 /*id*/) override
|
||||
{
|
||||
InitWaypoint();
|
||||
Start(false, false, guid);
|
||||
SetDespawnAtFar(false);
|
||||
}
|
||||
|
||||
void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
|
||||
{
|
||||
switch (waypointId)
|
||||
{
|
||||
case 1:
|
||||
if (Unit* car = ObjectAccessor::GetCreature(*me, carGUID))
|
||||
me->SetFacingToObject(car);
|
||||
Talk(SAY_SCARLET_MINER_0);
|
||||
SetRun(true);
|
||||
IntroTimer = 4000;
|
||||
IntroPhase = 1;
|
||||
break;
|
||||
case 17:
|
||||
if (Unit* car = ObjectAccessor::GetCreature(*me, carGUID))
|
||||
{
|
||||
me->SetFacingToObject(car);
|
||||
car->Relocate(car->GetPositionX(), car->GetPositionY(), me->GetPositionZ() + 1);
|
||||
car->StopMoving();
|
||||
car->RemoveAura(SPELL_CART_DRAG);
|
||||
}
|
||||
Talk(SAY_SCARLET_MINER_1);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (IntroPhase)
|
||||
{
|
||||
if (IntroTimer <= diff)
|
||||
{
|
||||
if (IntroPhase == 1)
|
||||
{
|
||||
if (Creature* car = ObjectAccessor::GetCreature(*me, carGUID))
|
||||
DoCast(car, SPELL_CART_DRAG);
|
||||
IntroTimer = 800;
|
||||
IntroPhase = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Creature* car = ObjectAccessor::GetCreature(*me, carGUID))
|
||||
car->AI()->DoAction(0);
|
||||
IntroPhase = 0;
|
||||
}
|
||||
}
|
||||
if (plrOwner->getAttackerForHelper() && plrOwner->getAttackerForHelper()->GetEntry() == NPC_GHOSTS)
|
||||
AttackStart(plrOwner->getAttackerForHelper());
|
||||
else
|
||||
IntroTimer -= diff;
|
||||
FindMinions(owner);
|
||||
}
|
||||
EscortAI::UpdateAI(diff);
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new npc_scarlet_minerAI(creature);
|
||||
}
|
||||
|
||||
if (!UpdateVictim() || !me->GetVictim())
|
||||
return;
|
||||
|
||||
//ScriptedAI::UpdateAI(diff);
|
||||
//Check if we have a current target
|
||||
if (me->EnsureVictim()->GetEntry() == NPC_GHOSTS)
|
||||
{
|
||||
if (me->isAttackReady())
|
||||
{
|
||||
//If we are within range melee the target
|
||||
if (me->IsWithinMeleeRange(me->GetVictim()))
|
||||
{
|
||||
me->AttackerStateUpdate(me->GetVictim());
|
||||
me->resetAttackTimer();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// npc 28912 quest 17217 boss 29001 mob 29007 go 191092
|
||||
enum GiftOfTheHarvester
|
||||
{
|
||||
SPELL_GHOUL_TRANFORM = 52490,
|
||||
SPELL_GHOST_TRANSFORM = 52505
|
||||
};
|
||||
|
||||
class spell_gift_of_the_harvester : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_gift_of_the_harvester);
|
||||
|
||||
bool Validate(SpellInfo const* /*spell*/) override
|
||||
{
|
||||
return ValidateSpellInfo(
|
||||
{
|
||||
SPELL_GHOUL_TRANFORM,
|
||||
SPELL_GHOST_TRANSFORM
|
||||
});
|
||||
}
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
Unit* originalCaster = GetOriginalCaster();
|
||||
Unit* target = GetHitUnit();
|
||||
|
||||
if (originalCaster && target)
|
||||
originalCaster->CastSpell(target, RAND(SPELL_GHOUL_TRANFORM, SPELL_GHOST_TRANSFORM), true);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_gift_of_the_harvester::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_the_scarlet_enclave_chapter_1()
|
||||
{
|
||||
@@ -1272,7 +1075,6 @@ void AddSC_the_scarlet_enclave_chapter_1()
|
||||
new npc_dark_rider_of_acherus();
|
||||
new npc_ros_dark_rider();
|
||||
new npc_dkc1_gothik();
|
||||
new npc_scarlet_ghoul();
|
||||
new npc_scarlet_miner();
|
||||
new npc_scarlet_miner_cart();
|
||||
RegisterCreatureAI(npc_scarlet_ghoul);
|
||||
RegisterSpellScript(spell_gift_of_the_harvester);
|
||||
}
|
||||
@@ -24,148 +24,6 @@
|
||||
#include "ScriptedEscortAI.h"
|
||||
#include "SpellInfo.h"
|
||||
|
||||
//How to win friends and influence enemies
|
||||
// texts signed for creature 28939 but used for 28939, 28940, 28610
|
||||
enum win_friends
|
||||
{
|
||||
SAY_CRUSADER = 1,
|
||||
SAY_PERSUADED1 = 2,
|
||||
SAY_PERSUADED2 = 3,
|
||||
SAY_PERSUADED3 = 4,
|
||||
SAY_PERSUADED4 = 5,
|
||||
SAY_PERSUADED5 = 6,
|
||||
SAY_PERSUADED6 = 7,
|
||||
SAY_PERSUADE_RAND = 8,
|
||||
SPELL_PERSUASIVE_STRIKE = 52781,
|
||||
SPELL_THREAT_PULSE = 58111,
|
||||
QUEST_HOW_TO_WIN_FRIENDS = 12720,
|
||||
};
|
||||
|
||||
class npc_crusade_persuaded : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_crusade_persuaded() : CreatureScript("npc_crusade_persuaded") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new npc_crusade_persuadedAI(creature);
|
||||
}
|
||||
|
||||
struct npc_crusade_persuadedAI : public ScriptedAI
|
||||
{
|
||||
npc_crusade_persuadedAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
speechTimer = 0;
|
||||
speechCounter = 0;
|
||||
playerGUID.Clear();
|
||||
}
|
||||
|
||||
uint32 speechTimer;
|
||||
uint32 speechCounter;
|
||||
ObjectGuid playerGUID;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Initialize();
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->RestoreFaction();
|
||||
}
|
||||
|
||||
void SpellHit(Unit* caster, SpellInfo const* spell) override
|
||||
{
|
||||
if (spell->Id == SPELL_PERSUASIVE_STRIKE && caster->GetTypeId() == TYPEID_PLAYER && me->IsAlive() && !speechCounter)
|
||||
{
|
||||
if (Player* player = caster->ToPlayer())
|
||||
{
|
||||
if (player->GetQuestStatus(QUEST_HOW_TO_WIN_FRIENDS) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
playerGUID = player->GetGUID();
|
||||
speechTimer = 1000;
|
||||
speechCounter = 1;
|
||||
me->SetFaction(player->GetFaction());
|
||||
me->CombatStop(true);
|
||||
me->GetMotionMaster()->MoveIdle();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
DoCastAOE(SPELL_THREAT_PULSE, true);
|
||||
|
||||
sCreatureTextMgr->SendChat(me, SAY_PERSUADE_RAND, nullptr, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_NORMAL, 0, TEAM_OTHER, false, player);
|
||||
Talk(SAY_CRUSADER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (speechCounter)
|
||||
{
|
||||
if (speechTimer <= diff)
|
||||
{
|
||||
Player* player = ObjectAccessor::GetPlayer(*me, playerGUID);
|
||||
if (!player)
|
||||
{
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
|
||||
switch (speechCounter)
|
||||
{
|
||||
case 1:
|
||||
Talk(SAY_PERSUADED1);
|
||||
speechTimer = 8000;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
Talk(SAY_PERSUADED2);
|
||||
speechTimer = 8000;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
Talk(SAY_PERSUADED3);
|
||||
speechTimer = 8000;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
Talk(SAY_PERSUADED4);
|
||||
speechTimer = 8000;
|
||||
break;
|
||||
|
||||
case 5:
|
||||
sCreatureTextMgr->SendChat(me, SAY_PERSUADED5, nullptr, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_NORMAL, 0, TEAM_OTHER, false, player);
|
||||
speechTimer = 8000;
|
||||
break;
|
||||
|
||||
case 6:
|
||||
Talk(SAY_PERSUADED6);
|
||||
player->Kill(me);
|
||||
speechCounter = 0;
|
||||
player->GroupEventHappens(QUEST_HOW_TO_WIN_FRIENDS, me);
|
||||
return;
|
||||
}
|
||||
|
||||
++speechCounter;
|
||||
DoCastAOE(SPELL_THREAT_PULSE, true);
|
||||
|
||||
} else
|
||||
speechTimer -= diff;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
/*######
|
||||
## npc_koltira_deathweaver
|
||||
######*/
|
||||
@@ -748,7 +606,6 @@ public:
|
||||
|
||||
void AddSC_the_scarlet_enclave_chapter_2()
|
||||
{
|
||||
new npc_crusade_persuaded();
|
||||
new npc_scarlet_courier();
|
||||
new npc_koltira_deathweaver();
|
||||
new npc_high_inquisitor_valroth();
|
||||
|
||||
Reference in new issue
Block a user