1704 lines
68 KiB
C#
1704 lines
68 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using Game.WorldEntities;
|
|
using Game.Scripting;
|
|
using Game.AI;
|
|
using Framework.Constants;
|
|
using Framework.ObjectDefines;
|
|
using Game.Spells;
|
|
using Framework.Util;
|
|
using Game.Maps;
|
|
|
|
namespace Scripts.EasternKingdoms.Karazhan
|
|
{
|
|
|
|
enum blah
|
|
{
|
|
// texts
|
|
EMOTE_LIFT_CURSE = -1532131,
|
|
EMOTE_CHEAT = -1532132,
|
|
|
|
SOUND_ID_GAME_BEGIN = 10338,
|
|
SOUND_ID_LOSE_PAWN_PLAYER_1 = 10339,
|
|
SOUND_ID_LOSE_PAWN_PLAYER_2 = 10340,
|
|
SOUND_ID_LOSE_PAWN_PLAYER_3 = 10341,
|
|
SOUND_ID_LOSE_PAWN_MEDIVH_1 = 10342,
|
|
SOUND_ID_LOSE_PAWN_MEDIVH_2 = 10343,
|
|
SOUND_ID_LOSE_PAWN_MEDIVH_3 = 10344,
|
|
SOUND_ID_LOSE_ROOK_PLAYER = 10345,
|
|
SOUND_ID_LOSE_ROOK_MEDIVH = 10346,
|
|
SOUND_ID_LOSE_BISHOP_PLAYER = 10347,
|
|
SOUND_ID_LOSE_BISHOP_MEDIVH = 10348,
|
|
SOUND_ID_LOSE_KNIGHT_PLAYER = 10349,
|
|
SOUND_ID_LOSE_KNIGHT_MEDIVH = 10350,
|
|
SOUND_ID_LOSE_QUEEN_PLAYER = 10351,
|
|
SOUND_ID_LOSE_QUEEN_MEDIVH = 10352,
|
|
SOUND_ID_CHECK_PLAYER = 10353,
|
|
SOUND_ID_CHECK_MEDIVH = 10354,
|
|
SOUND_ID_WIN_PLAYER = 10355,
|
|
SOUND_ID_WIN_MEDIVH = 10356,
|
|
SOUND_ID_CHEAT_1 = 10357,
|
|
SOUND_ID_CHEAT_2 = 10358,
|
|
SOUND_ID_CHEAT_3 = 10359,
|
|
|
|
// movement spells
|
|
SPELL_MOVE_GENERIC = 30012, // spell which sends the signal to move - handled in core
|
|
SPELL_MOVE_1 = 32312, // spell which selects AI move square (for short range pieces)
|
|
SPELL_MOVE_2 = 37388, // spell which selects AI move square (for long range pieces)
|
|
// SPELL_MOVE_PAWN = 37146, // individual move spells (used only by controlled npcs)
|
|
// SPELL_MOVE_KNIGHT = 37144,
|
|
// SPELL_MOVE_QUEEN = 37148,
|
|
// SPELL_MOVE_ROCK = 37151,
|
|
// SPELL_MOVE_BISHOP = 37152,
|
|
// SPELL_MOVE_KING = 37153,
|
|
|
|
// additional movement spells
|
|
SPELL_CHANGE_FACING = 30284, // spell which sends the initial facing request - handled in core
|
|
SPELL_FACE_SQUARE = 30270, // change facing - finalize facing update
|
|
|
|
SPELL_MOVE_TO_SQUARE = 30253, // spell which sends the move response from the square to the piece
|
|
SPELL_MOVE_COOLDOWN = 30543, // add some cooldown to movement
|
|
SPELL_MOVE_MARKER = 32261, // white beam visual - used to mark the movement as complete
|
|
SPELL_DISABLE_SQUARE = 32745, // used by the White / Black triggers on the squares when a chess piece moves into place
|
|
SPELL_IS_SQUARE_USED = 39400, // cast when a chess piece moves to another square
|
|
// SPELL_SQUARED_OCCUPIED = 39399, // triggered by 39400; used to check if the square is occupied (if hits a target); Missing in 2.4.3
|
|
|
|
// generic spells
|
|
SPELL_IN_GAME = 30532, // teleport player near the entrance
|
|
SPELL_CONTROL_PIECE = 30019, // control a chess piece
|
|
SPELL_RECENTLY_IN_GAME = 30529, // debuff on player after chess piece uncharm
|
|
|
|
SPELL_CHESS_AI_ATTACK_TIMER = 32226, // melee action timer - triggers 32225
|
|
SPELL_ACTION_MELEE = 32225, // handle melee attacks
|
|
SPELL_MELEE_DAMAGE = 32247, // melee damage spell - used by all chess pieces
|
|
// SPELL_AI_SNAPSHOT_TIMER = 37440, // used to trigger spell 32260; purpose and usage unk
|
|
// SPELL_DISABLE_SQUARE_SELF = 32260, // used when a piece moves to another square
|
|
// SPELL_AI_ACTION_TIMER = 37504, // handle some kind of event check. Cast by npc 17459. Currently the way it works is unk
|
|
// SPELL_DISABLE_SQUARE = 30271, // not used
|
|
// SPELL_FIND_ENEMY = 32303, // not used
|
|
// SPELL_MOVE_NEAR_UNIT = 30417, // not used
|
|
// SPELL_GET_EMPTY_SQUARE = 30418, // not used
|
|
// SPELL_FACE_NEARBY_ENEMY = 37787, // not used
|
|
// SPELL_POST_MOVE_FACING = 38011, // not used
|
|
|
|
// melee action spells
|
|
SPELL_MELEE_FOOTMAN = 32227,
|
|
SPELL_MELEE_WATER_ELEM = 37142,
|
|
SPELL_MELEE_CHARGER = 37143,
|
|
SPELL_MELEE_CLERIC = 37147,
|
|
SPELL_MELEE_CONJURER = 37149,
|
|
SPELL_MELEE_KING_LLANE = 37150,
|
|
SPELL_MELEE_GRUNT = 32228,
|
|
SPELL_MELEE_DAEMON = 37220,
|
|
SPELL_MELEE_NECROLYTE = 37337,
|
|
SPELL_MELEE_WOLF = 37339,
|
|
SPELL_MELEE_WARLOCK = 37345,
|
|
SPELL_MELEE_WARCHIEF_BLACKHAND = 37348,
|
|
|
|
// cheat spells
|
|
SPELL_HAND_OF_MEDIVH_HORDE = 39338, // triggers 39339
|
|
SPELL_HAND_OF_MEDIVH_ALLIANCE = 39342, // triggers 39339
|
|
SPELL_FURY_OF_MEDIVH_HORDE = 39341, // triggers 39343
|
|
SPELL_FURY_OF_MEDIVH_ALLIANCE = 39344, // triggers 39345
|
|
SPELL_FURY_OF_MEDIVH_AURA = 39383,
|
|
// SPELL_FULL_HEAL_HORDE = 39334, // spells are not confirmed (probably removed after 2.4.3)
|
|
// SPELL_FULL_HEAL_ALLIANCE = 39335,
|
|
|
|
// spells used by the chess npcs
|
|
SPELL_HEROISM = 37471, // human king
|
|
SPELL_SWEEP = 37474,
|
|
SPELL_BLOODLUST = 37472, // orc king
|
|
SPELL_CLEAVE = 37476,
|
|
SPELL_HEROIC_BLOW = 37406, // human pawn
|
|
SPELL_SHIELD_BLOCK = 37414,
|
|
SPELL_VICIOUS_STRIKE = 37413, // orc pawn
|
|
SPELL_WEAPON_DEFLECTION = 37416,
|
|
SPELL_SMASH = 37453, // human knight
|
|
SPELL_STOMP = 37498,
|
|
SPELL_BITE = 37454, // orc knight
|
|
SPELL_HOWL = 37502,
|
|
SPELL_ELEMENTAL_BLAST = 37462, // human queen
|
|
SPELL_RAIN_OF_FIRE = 37465,
|
|
SPELL_FIREBALL = 37463, // orc queen
|
|
// SPELL_POISON_CLOUD = 37469,
|
|
SPELL_POISON_CLOUD_ACTION = 37775, // triggers 37469 - acts as a target selector spell for orc queen
|
|
SPELL_HEALING = 37455, // human bishop
|
|
SPELL_HOLY_LANCE = 37459,
|
|
// SPELL_SHADOW_MEND = 37456, // orc bishop
|
|
SPELL_SHADOW_MEND_ACTION = 37824, // triggers 37456 - acts as a target selector spell for orc bishop
|
|
SPELL_SHADOW_SPEAR = 37461,
|
|
SPELL_GEYSER = 37427, // human rook
|
|
SPELL_WATER_SHIELD = 37432,
|
|
SPELL_HELLFIRE = 37428, // orc rook
|
|
SPELL_FIRE_SHIELD = 37434,
|
|
|
|
// spells used to transform side trigger when npc dies
|
|
SPELL_TRANSFORM_FOOTMAN = 39350,
|
|
SPELL_TRANSFORM_CHARGER = 39352,
|
|
SPELL_TRANSFORM_CLERIC = 39353,
|
|
SPELL_TRANSFORM_WATER_ELEM = 39354,
|
|
SPELL_TRANSFORM_CONJURER = 39355,
|
|
SPELL_TRANSFORM_KING_LLANE = 39356,
|
|
SPELL_TRANSFORM_GRUNT = 39357,
|
|
SPELL_TRANSFORM_WOLF = 39358,
|
|
SPELL_TRANSFORM_NECROLYTE = 39359,
|
|
SPELL_TRANSFORM_DAEMON = 39360,
|
|
SPELL_TRANSFORM_WARLOCK = 39361,
|
|
SPELL_TRANSFORM_BLACKHAND = 39362,
|
|
|
|
// generic npcs
|
|
// NPC_SQUARE_OUTSIDE_B = 17316, // used to check the interior of the board
|
|
// NPC_SQUARE_OUTSIDE_W = 17317, // not used in our script; keep for reference only
|
|
NPC_FURY_MEDIVH_VISUAL = 22521, // has aura 39383
|
|
|
|
// gossip texts
|
|
GOSSIP_ITEM_ORC_GRUNT = -3532006,
|
|
GOSSIP_ITEM_ORC_WOLF = -3532007,
|
|
GOSSIP_ITEM_SUMMONED_DEAMON = -3532008,
|
|
GOSSIP_ITEM_ORC_WARLOCK = -3532009,
|
|
GOSSIP_ITEM_ORC_NECROLYTE = -3532010,
|
|
GOSSIP_ITEM_WARCHIEF_BLACKHAND = -3532011,
|
|
GOSSIP_ITEM_HUMAN_FOOTMAN = -3532012,
|
|
GOSSIP_ITEM_HUMAN_CHARGER = -3532013,
|
|
GOSSIP_ITEM_WATER_ELEMENTAL = -3532014,
|
|
GOSSIP_ITEM_HUMAN_CONJURER = -3532015,
|
|
GOSSIP_ITEM_HUMAN_CLERIC = -3532016,
|
|
GOSSIP_ITEM_KING_LLANE = -3532017,
|
|
GOSSIP_ITEM_RESET_BOARD = -3532018,
|
|
|
|
// gossip menu
|
|
GOSSIP_MENU_ID_GRUNT = 10425,
|
|
GOSSIP_MENU_ID_WOLF = 10439,
|
|
GOSSIP_MENU_ID_WARLOCK = 10440,
|
|
GOSSIP_MENU_ID_NECROLYTE = 10434,
|
|
GOSSIP_MENU_ID_DEAMON = 10426,
|
|
GOSSIP_MENU_ID_BLACKHAND = 10442,
|
|
GOSSIP_MENU_ID_FOOTMAN = 8952,
|
|
GOSSIP_MENU_ID_CHARGER = 10414,
|
|
GOSSIP_MENU_ID_CONJURER = 10417,
|
|
GOSSIP_MENU_ID_CLERIC = 10416,
|
|
GOSSIP_MENU_ID_ELEMENTAL = 10413,
|
|
GOSSIP_MENU_ID_LLANE = 10418,
|
|
GOSSIP_MENU_ID_MEDIVH = 10506,
|
|
GOSSIP_MENU_ID_MEDIVH_BEATEN = 10718,
|
|
|
|
// misc
|
|
TARGET_TYPE_RANDOM = 1,
|
|
TARGET_TYPE_FRIENDLY = 2,
|
|
}
|
|
|
|
// npc_echo_of_medivh
|
|
public class npc_echo_of_medivh : CreatureScript
|
|
{
|
|
public npc_echo_of_medivh() : base("npc_echo_of_medivh") { }
|
|
|
|
class npc_echo_of_medivhAI : ScriptedAI
|
|
{
|
|
public npc_echo_of_medivhAI(Creature pCreature) : base(pCreature)
|
|
{
|
|
m_pInstance = (instance_karazhan.instance_karazhan_InstanceMapScript)pCreature.GetInstanceScript();
|
|
Reset();
|
|
}
|
|
|
|
public override void Reset()
|
|
{
|
|
m_uiCheatTimer = 90000;
|
|
}
|
|
|
|
public override void MoveInLineOfSight(Unit pWho) { }
|
|
|
|
public override void AttackStart(Unit pWho) { }
|
|
|
|
public override void JustSummoned(Creature pSummoned)
|
|
{
|
|
if (pSummoned.GetEntry() == NPC_FURY_MEDIVH_VISUAL)
|
|
pSummoned.CastSpell(pSummoned, SPELL_FURY_OF_MEDIVH_AURA, true);
|
|
}
|
|
|
|
public override void UpdateAI(uint uiDiff)
|
|
{
|
|
if (m_pInstance == null || m_pInstance.GetData(TYPE_CHESS) != IN_PROGRESS)
|
|
return;
|
|
|
|
if (m_uiCheatTimer < uiDiff)
|
|
{
|
|
DoCastSpellIfCan(m_creature, RandomHelper.URand(0, 1) ? (m_pInstance.GetPlayerTeam() == ALLIANCE ? SPELL_HAND_OF_MEDIVH_HORDE : SPELL_HAND_OF_MEDIVH_ALLIANCE) :
|
|
(m_pInstance.GetPlayerTeam() == ALLIANCE ? SPELL_FURY_OF_MEDIVH_ALLIANCE : SPELL_FURY_OF_MEDIVH_HORDE));
|
|
|
|
switch (RandomHelper.URand(0, 2))
|
|
{
|
|
case 0: DoPlaySoundToSet(me, SOUND_ID_CHEAT_1); break;
|
|
case 1: DoPlaySoundToSet(me, SOUND_ID_CHEAT_2); break;
|
|
case 2: DoPlaySoundToSet(me, SOUND_ID_CHEAT_3); break;
|
|
}
|
|
|
|
DoScriptText(EMOTE_CHEAT, me);
|
|
m_uiCheatTimer = 90000;
|
|
}
|
|
else
|
|
m_uiCheatTimer -= uiDiff;
|
|
}
|
|
|
|
instance_karazhan.instance_karazhan_InstanceMapScript m_pInstance;
|
|
uint m_uiCheatTimer;
|
|
}
|
|
|
|
public override CreatureAI GetAI(Creature pCreature)
|
|
{
|
|
return new npc_echo_of_medivhAI(pCreature);
|
|
}
|
|
|
|
public override bool OnGossipHello(Player player, Creature creature)
|
|
{
|
|
InstanceScript pInstance = creature.GetInstanceScript();
|
|
if (pInstance != null)
|
|
{
|
|
if (pInstance.GetData(TYPE_CHESS) != DONE && pInstance.GetData(TYPE_CHESS) != SPECIAL)
|
|
player.SEND_GOSSIP_MENU(GOSSIP_MENU_ID_MEDIVH, pCreature.GetObjectGuid());
|
|
else
|
|
{
|
|
if (pInstance.GetData(TYPE_CHESS) == SPECIAL)
|
|
player.ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_ITEM_RESET_BOARD, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
|
|
|
player.SEND_GOSSIP_MENU(GOSSIP_MENU_ID_MEDIVH_BEATEN, pCreature.GetObjectGuid());
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public override bool OnGossipSelect(Player player, Creature creature, uint sender, uint action)
|
|
{
|
|
if (uiAction == GOSSIP_ACTION_INFO_DEF + 1)
|
|
{
|
|
// reset the board
|
|
InstanceScript pInstance = creature.GetInstanceScript();
|
|
if (pInstance != null)
|
|
pInstance.SetData(TYPE_CHESS, DONE);
|
|
|
|
player.CLOSE_GOSSIP_MENU();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
//npc_chess_piece_generic
|
|
public class npc_chess_piece_generic : CreatureScript
|
|
{
|
|
public npc_chess_piece_generic() : base("") { }
|
|
|
|
public class npc_chess_piece_genericAI : ScriptedAI
|
|
{
|
|
public npc_chess_piece_genericAI(Creature pCreature) : base(pCreature)
|
|
{
|
|
m_pInstance = (instance_karazhan.instance_karazhan_InstanceMapScript)pCreature.GetInstanceScript();
|
|
Reset();
|
|
}
|
|
|
|
public instance_karazhan.instance_karazhan_InstanceMapScript m_pInstance;
|
|
|
|
ObjectGuid m_currentSquareGuid;
|
|
|
|
uint m_uiMoveTimer;
|
|
uint m_uiMoveCommandTimer;
|
|
uint m_uiSpellCommandTimer;
|
|
|
|
bool m_bIsPrimarySpell;
|
|
float m_fCurrentOrientation;
|
|
|
|
public override void Reset()
|
|
{
|
|
m_uiMoveTimer = 0;
|
|
m_uiMoveCommandTimer = 1000;
|
|
m_uiSpellCommandTimer = m_creature.HasAura(SPELL_CONTROL_PIECE) ? 0 : 1000;
|
|
m_bIsPrimarySpell = true;
|
|
|
|
// cancel move timer for player faction npcs or for friendly games
|
|
if (m_pInstance)
|
|
{
|
|
if ((m_pInstance.GetPlayerTeam() == ALLIANCE && m_creature.getFaction() == FACTION_ID_CHESS_ALLIANCE) ||
|
|
(m_pInstance.GetPlayerTeam() == HORDE && m_creature.getFaction() == FACTION_ID_CHESS_HORDE) ||
|
|
m_pInstance.GetData(TYPE_CHESS) == DONE)
|
|
m_uiMoveCommandTimer = 0;
|
|
}
|
|
}
|
|
|
|
// no default attacking or evading
|
|
public override void MoveInLineOfSight(Unit pWho) { }
|
|
public override void AttackStart(Unit pWho) { }
|
|
public override void EnterEvadeMode() { }
|
|
|
|
public override void JustDied(Unit pKiller)
|
|
{
|
|
if (Creature pSquare = m_creature.GetMap().GetCreature(m_currentSquareGuid))
|
|
pSquare.RemoveAllAuras();
|
|
|
|
// ToDo: remove corpse after 10 sec
|
|
}
|
|
|
|
void ReceiveAIEvent(SmartEvents eventType, Creature pSender, Unit pInvoker, uint uiMiscValue)
|
|
{
|
|
// handle move event
|
|
if (eventType == AI_EVENT_CUSTOM_A)
|
|
{
|
|
// clear the current square
|
|
if (Creature pSquare = m_creature.GetMap().GetCreature(m_currentSquareGuid))
|
|
pSquare.RemoveAllAuras();
|
|
|
|
m_currentSquareGuid = pInvoker.GetObjectGuid();
|
|
m_uiMoveTimer = 2000;
|
|
}
|
|
// handle encounter start event
|
|
else if (eventType == AI_EVENT_CUSTOM_B)
|
|
{
|
|
// reset the variables
|
|
Reset();
|
|
m_currentSquareGuid = pInvoker.GetObjectGuid();
|
|
|
|
// ToDo: enable this when the scope of the spell is clear
|
|
//if (Creature pStalker = m_pInstance.GetSingleCreatureFromStorage(NPC_WAITING_ROOM_STALKER))
|
|
// pStalker.CastSpell(pStalker, SPELL_AI_ACTION_TIMER, true);
|
|
|
|
//DoCastSpellIfCan(m_creature, SPELL_AI_SNAPSHOT_TIMER, CAST_TRIGGERED);
|
|
DoCastSpellIfCan(m_creature, SPELL_CHESS_AI_ATTACK_TIMER, CAST_TRIGGERED);
|
|
|
|
pInvoker.CastSpell(pInvoker, SPELL_DISABLE_SQUARE, true);
|
|
pInvoker.CastSpell(pInvoker, SPELL_IS_SQUARE_USED, true);
|
|
}
|
|
}
|
|
|
|
void MovementInform(uint uiMotionType, uint uiPointId)
|
|
{
|
|
if (uiMotionType != POINT_MOTION_TYPE || !uiPointId)
|
|
return;
|
|
|
|
// update facing
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_RANDOM, 5.0f))
|
|
DoCastSpellIfCan(pTarget, SPELL_CHANGE_FACING);
|
|
else
|
|
m_creature.SetFacingTo(m_fCurrentOrientation);
|
|
}
|
|
|
|
public override void SpellHit(Unit pCaster, SpellInfo pSpell)
|
|
{
|
|
// do a soft reset when the piece is controlled
|
|
if (pCaster.GetTypeId() == TYPEID_PLAYER && pSpell.Id == SPELL_CONTROL_PIECE)
|
|
Reset();
|
|
}
|
|
|
|
// Function which returns a random target by type and range
|
|
public Unit GetTargetByType(byte uiType, float fRange, float fArc = MathFunctions.Pi)
|
|
{
|
|
if (!m_pInstance)
|
|
return NULL;
|
|
|
|
uint uiTeam = m_creature.getFaction() == FACTION_ID_CHESS_ALLIANCE ? FACTION_ID_CHESS_HORDE : FACTION_ID_CHESS_ALLIANCE;
|
|
|
|
// get friendly list for this type
|
|
if (uiType == TARGET_TYPE_FRIENDLY)
|
|
uiTeam = m_creature.getFaction();
|
|
|
|
// Get the list of enemies
|
|
GuidList lTempList;
|
|
std::vector<Creature> vTargets;
|
|
vTargets.reserve(lTempList.size());
|
|
|
|
m_pInstance.GetChessPiecesByFaction(lTempList, uiTeam);
|
|
for (GuidList::const_iterator itr = lTempList.begin(); itr != lTempList.end(); ++itr)
|
|
{
|
|
Creature pTemp = m_creature.GetMap().GetCreature(*itr);
|
|
if (pTemp && pTemp.isAlive())
|
|
{
|
|
// check for specified range targets and angle; Note: to be checked if the angle is right
|
|
if (fRange && !m_creature.isInFrontInMap(pTemp, fRange, fArc))
|
|
continue;
|
|
|
|
// skip friendly targets which are at full HP
|
|
if (uiType == TARGET_TYPE_FRIENDLY && pTemp.GetHealth() == pTemp.GetMaxHealth())
|
|
continue;
|
|
|
|
vTargets.push_back(pTemp);
|
|
}
|
|
}
|
|
|
|
if (vTargets.empty())
|
|
return NULL;
|
|
|
|
return vTargets[urand(0, vTargets.size() - 1)];
|
|
}
|
|
|
|
// Function to get a square as close as possible to the enemy
|
|
Unit GetMovementSquare()
|
|
{
|
|
if (!m_pInstance)
|
|
return NULL;
|
|
|
|
// define distance based on the spell radius
|
|
// this will replace the targeting sysmte of spells SPELL_MOVE_1 and SPELL_MOVE_2
|
|
float fRadius = 10.0f;
|
|
std::list<Creature> lSquaresList;
|
|
|
|
// some pieces have special distance
|
|
switch (m_creature.GetEntry())
|
|
{
|
|
case NPC_HUMAN_CONJURER:
|
|
case NPC_ORC_WARLOCK:
|
|
case NPC_HUMAN_CHARGER:
|
|
case NPC_ORC_WOLF:
|
|
fRadius = 15.0f;
|
|
break;
|
|
}
|
|
|
|
// get all available squares for movement
|
|
GetCreatureListWithEntryInGrid(lSquaresList, m_creature, NPC_SQUARE_BLACK, fRadius);
|
|
GetCreatureListWithEntryInGrid(lSquaresList, m_creature, NPC_SQUARE_WHITE, fRadius);
|
|
|
|
if (lSquaresList.empty())
|
|
return NULL;
|
|
|
|
// Get the list of enemies
|
|
GuidList lTempList;
|
|
std::list<Creature> lEnemies;
|
|
|
|
m_pInstance.GetChessPiecesByFaction(lTempList, m_creature.getFaction() == FACTION_ID_CHESS_ALLIANCE ? FACTION_ID_CHESS_HORDE : FACTION_ID_CHESS_ALLIANCE);
|
|
for (GuidList::const_iterator itr = lTempList.begin(); itr != lTempList.end(); ++itr)
|
|
{
|
|
Creature pTemp = m_creature.GetMap().GetCreature(*itr);
|
|
if (pTemp && pTemp.isAlive())
|
|
lEnemies.push_back(pTemp);
|
|
}
|
|
|
|
if (lEnemies.empty())
|
|
return NULL;
|
|
|
|
// Sort the enemies by distance and the squares compared to the distance to the closest enemy
|
|
lEnemies.sort(ObjectDistanceOrder(m_creature));
|
|
lSquaresList.sort(ObjectDistanceOrder(lEnemies.front()));
|
|
|
|
return lSquaresList.front();
|
|
}
|
|
|
|
public virtual uint DoCastPrimarySpell() { return 5000; }
|
|
public virtual uint DoCastSecondarySpell() { return 5000; }
|
|
|
|
public override void UpdateAI(uint uiDiff)
|
|
{
|
|
if (!m_pInstance || m_pInstance.GetData(TYPE_CHESS) != IN_PROGRESS)
|
|
return;
|
|
|
|
// issue move command
|
|
if (m_uiMoveCommandTimer)
|
|
{
|
|
if (m_uiMoveCommandTimer <= uiDiff)
|
|
{
|
|
// just update facing if some enemy is near
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_RANDOM, 5.0f))
|
|
DoCastSpellIfCan(pTarget, SPELL_CHANGE_FACING);
|
|
else
|
|
{
|
|
// the npc doesn't have a 100% chance to move; also there should be some GCD check in core for this part
|
|
if (roll_chance_i(15))
|
|
{
|
|
// Note: in a normal case the target would be chosen using the spells above
|
|
// However, because the core doesn't support special targeting, we'll provide explicit target
|
|
//uint uiMoveSpell = SPELL_MOVE_1;
|
|
//switch (m_creature.GetEntry())
|
|
//{
|
|
// case NPC_HUMAN_CONJURER:
|
|
// case NPC_ORC_WARLOCK:
|
|
// case NPC_HUMAN_CHARGER:
|
|
// case NPC_ORC_WOLF:
|
|
// uiMoveSpell = SPELL_MOVE_2;
|
|
// break;
|
|
//}
|
|
//DoCastSpellIfCan(m_creature, uiMoveSpell, CAST_TRIGGERED);
|
|
|
|
// workaround which provides specific move target
|
|
if (Unit pTarget = GetMovementSquare())
|
|
DoCastSpellIfCan(pTarget, SPELL_MOVE_GENERIC, CAST_TRIGGERED | CAST_INTERRUPT_PREVIOUS);
|
|
|
|
m_fCurrentOrientation = m_creature.GetOrientation();
|
|
}
|
|
}
|
|
|
|
m_uiMoveCommandTimer = 5000;
|
|
}
|
|
else
|
|
m_uiMoveCommandTimer -= uiDiff;
|
|
}
|
|
|
|
// issue spell command
|
|
if (m_uiSpellCommandTimer)
|
|
{
|
|
if (m_uiSpellCommandTimer <= uiDiff)
|
|
{
|
|
// alternate the spells and also reset the timer
|
|
m_uiSpellCommandTimer = m_bIsPrimarySpell ? DoCastPrimarySpell() : DoCastSecondarySpell();
|
|
m_bIsPrimarySpell = !m_bIsPrimarySpell;
|
|
}
|
|
else
|
|
m_uiSpellCommandTimer -= uiDiff;
|
|
}
|
|
|
|
// finish move timer
|
|
if (m_uiMoveTimer)
|
|
{
|
|
if (m_uiMoveTimer <= uiDiff)
|
|
{
|
|
if (Creature pSquare = m_creature.GetMap().GetCreature(m_currentSquareGuid))
|
|
{
|
|
DoCastSpellIfCan(pSquare, SPELL_MOVE_MARKER, CAST_TRIGGERED);
|
|
m_creature.GetMotionMaster().MovePoint(1, pSquare.GetPositionX(), pSquare.GetPositionY(), pSquare.GetPositionZ());
|
|
}
|
|
m_uiMoveTimer = 0;
|
|
}
|
|
else
|
|
m_uiMoveTimer -= uiDiff;
|
|
}
|
|
|
|
if (!m_creature.SelectHostileTarget() || !m_creature.getVictim())
|
|
return;
|
|
}
|
|
}
|
|
|
|
public override bool OnGossipSelect(Player player, Creature creature, uint sender, uint action)
|
|
{
|
|
if (uiAction == GOSSIP_ACTION_INFO_DEF + 1)
|
|
{
|
|
// start event when used on the king
|
|
if (ScriptedInstance* pInstance = (ScriptedInstance*)pCreature.GetInstanceData())
|
|
{
|
|
// teleport at the entrance and control the chess piece
|
|
player.CastSpell(player, SPELL_IN_GAME, true);
|
|
player.CastSpell(pCreature, SPELL_CONTROL_PIECE, true);
|
|
|
|
if (pInstance.GetData(TYPE_CHESS) == NOT_STARTED)
|
|
pInstance.SetData(TYPE_CHESS, IN_PROGRESS);
|
|
else if (pInstance.GetData(TYPE_CHESS) == DONE)
|
|
pInstance.SetData(TYPE_CHESS, SPECIAL);
|
|
}
|
|
|
|
player.CLOSE_GOSSIP_MENU();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public override bool OnDummyEffect(Unit caster, uint spellId, int effIndex, Creature target)
|
|
{
|
|
// movement perform spell
|
|
if (uiSpellId == SPELL_MOVE_TO_SQUARE && uiEffIndex == EFFECT_INDEX_0)
|
|
{
|
|
if (pCaster.GetTypeId() == TYPEID_UNIT)
|
|
{
|
|
pCaster.CastSpell(pCaster, SPELL_DISABLE_SQUARE, true);
|
|
pCaster.CastSpell(pCaster, SPELL_IS_SQUARE_USED, true);
|
|
|
|
pCreatureTarget.CastSpell(pCreatureTarget, SPELL_MOVE_COOLDOWN, true);
|
|
pCreatureTarget.AI().SendAIEvent(AI_EVENT_CUSTOM_A, pCaster, pCreatureTarget);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
// generic melee tick
|
|
else if (uiSpellId == SPELL_ACTION_MELEE && uiEffIndex == EFFECT_INDEX_0)
|
|
{
|
|
uint uiMeleeSpell = 0;
|
|
|
|
switch (pCreatureTarget.GetEntry())
|
|
{
|
|
case NPC_KING_LLANE: uiMeleeSpell = SPELL_MELEE_KING_LLANE; break;
|
|
case NPC_HUMAN_CHARGER: uiMeleeSpell = SPELL_MELEE_CHARGER; break;
|
|
case NPC_HUMAN_CLERIC: uiMeleeSpell = SPELL_MELEE_CLERIC; break;
|
|
case NPC_HUMAN_CONJURER: uiMeleeSpell = SPELL_MELEE_CONJURER; break;
|
|
case NPC_HUMAN_FOOTMAN: uiMeleeSpell = SPELL_MELEE_FOOTMAN; break;
|
|
case NPC_CONJURED_WATER_ELEMENTAL: uiMeleeSpell = SPELL_MELEE_WATER_ELEM; break;
|
|
case NPC_WARCHIEF_BLACKHAND: uiMeleeSpell = SPELL_MELEE_WARCHIEF_BLACKHAND; break;
|
|
case NPC_ORC_GRUNT: uiMeleeSpell = SPELL_MELEE_GRUNT; break;
|
|
case NPC_ORC_NECROLYTE: uiMeleeSpell = SPELL_MELEE_NECROLYTE; break;
|
|
case NPC_ORC_WARLOCK: uiMeleeSpell = SPELL_MELEE_WARLOCK; break;
|
|
case NPC_ORC_WOLF: uiMeleeSpell = SPELL_MELEE_WOLF; break;
|
|
case NPC_SUMMONED_DAEMON: uiMeleeSpell = SPELL_MELEE_DAEMON; break;
|
|
}
|
|
|
|
pCreatureTarget.CastSpell(pCreatureTarget, uiMeleeSpell, true);
|
|
return true;
|
|
}
|
|
// square facing
|
|
else if (uiSpellId == SPELL_FACE_SQUARE && uiEffIndex == EFFECT_INDEX_0)
|
|
{
|
|
if (pCaster.GetTypeId() == TYPEID_UNIT)
|
|
pCreatureTarget.SetFacingToObject(pCaster);
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/*######
|
|
## npc_king_llane
|
|
######*/
|
|
public class npc_king_llane : CreatureScript
|
|
{
|
|
public npc_king_llane() : base("npc_king_llane") { }
|
|
|
|
class npc_king_llaneAI : npc_chess_piece_generic.npc_chess_piece_genericAI
|
|
{
|
|
public npc_king_llaneAI(Creature pCreature) : base(pCreature)
|
|
{
|
|
m_bIsAttacked = false;
|
|
Reset();
|
|
}
|
|
|
|
bool m_bIsAttacked;
|
|
|
|
public override void DamageTaken(Unit pDoneBy, ref uint uiDamage)
|
|
{
|
|
if (!uiDamage || !m_bIsAttacked || !m_pInstance || pDoneBy.GetTypeId() != TYPEID_UNIT)
|
|
return;
|
|
|
|
if (Creature pMedivh = m_pInstance.GetSingleCreatureFromStorage(NPC_ECHO_MEDIVH))
|
|
{
|
|
if (m_pInstance.GetPlayerTeam() == ALLIANCE)
|
|
DoPlaySoundToSet(pMedivh, SOUND_ID_CHECK_PLAYER);
|
|
else
|
|
DoPlaySoundToSet(pMedivh, SOUND_ID_CHECK_MEDIVH);
|
|
}
|
|
|
|
m_bIsAttacked = true;
|
|
}
|
|
|
|
public override void JustDied(Unit pKiller)
|
|
{
|
|
base.JustDied(pKiller);
|
|
|
|
if (!m_pInstance)
|
|
return;
|
|
|
|
Creature pMedivh = m_pInstance.GetSingleCreatureFromStorage(NPC_ECHO_MEDIVH);
|
|
if (!pMedivh)
|
|
return;
|
|
|
|
if (m_pInstance.GetData(TYPE_CHESS) == SPECIAL)
|
|
m_pInstance.SetData(TYPE_CHESS, DONE);
|
|
else
|
|
{
|
|
if (m_pInstance.GetPlayerTeam() == HORDE)
|
|
{
|
|
DoPlaySoundToSet(pMedivh, SOUND_ID_WIN_PLAYER);
|
|
DoScriptText(EMOTE_LIFT_CURSE, pMedivh);
|
|
|
|
m_pInstance.SetData(TYPE_CHESS, DONE);
|
|
}
|
|
else
|
|
{
|
|
DoPlaySoundToSet(pMedivh, SOUND_ID_WIN_MEDIVH);
|
|
m_pInstance.SetData(TYPE_CHESS, FAIL);
|
|
}
|
|
}
|
|
|
|
m_pInstance.DoMoveChessPieceToSides(SPELL_TRANSFORM_KING_LLANE, FACTION_ID_CHESS_ALLIANCE, true);
|
|
}
|
|
|
|
public override uint DoCastPrimarySpell()
|
|
{
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_RANDOM, 20.0f))
|
|
{
|
|
DoCastSpellIfCan(m_creature, SPELL_HEROISM);
|
|
|
|
// reset timer based on spell values
|
|
SpellInfo pSpell = GetSpellStore().LookupEntry(SPELL_HEROISM);
|
|
return pSpell.RecoveryTime ? pSpell.RecoveryTime : pSpell.CategoryRecoveryTime;
|
|
}
|
|
|
|
return 5000;
|
|
}
|
|
|
|
public override uint DoCastSecondarySpell()
|
|
{
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_RANDOM, 10.0f))
|
|
{
|
|
DoCastSpellIfCan(m_creature, SPELL_SWEEP);
|
|
|
|
// reset timer based on spell values
|
|
SpellInfo pSpell = GetSpellStore().LookupEntry(SPELL_SWEEP);
|
|
return pSpell.RecoveryTime ? pSpell.RecoveryTime : pSpell.CategoryRecoveryTime;
|
|
}
|
|
|
|
return 5000;
|
|
}
|
|
}
|
|
|
|
public override CreatureAI GetAI(Creature pCreature)
|
|
{
|
|
return new npc_king_llaneAI(pCreature);
|
|
}
|
|
|
|
public override bool OnGossipHello(Player player, Creature creature)
|
|
{
|
|
if (player.HasAura(SPELL_RECENTLY_IN_GAME) || pCreature.HasAura(SPELL_CONTROL_PIECE))
|
|
return true;
|
|
|
|
if (instance_karazhan pInstance = (instance_karazhan)pCreature.GetInstanceData())
|
|
{
|
|
if ((pInstance.GetData(TYPE_CHESS) != DONE && player.GetTeam() == ALLIANCE) || pInstance.IsFriendlyGameReady())
|
|
player.ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KING_LLANE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
|
}
|
|
|
|
player.SEND_GOSSIP_MENU(GOSSIP_MENU_ID_LLANE, pCreature.GetObjectGuid());
|
|
return true;
|
|
}
|
|
}
|
|
|
|
/*######
|
|
## npc_warchief_blackhand
|
|
######*/
|
|
public class npc_warchief_blackhand : CreatureScript
|
|
{
|
|
public npc_warchief_blackhand() : base("npc_warchief_blackhand") { }
|
|
|
|
class npc_warchief_blackhandAI : npc_chess_piece_generic.npc_chess_piece_genericAI
|
|
{
|
|
public npc_warchief_blackhandAI(Creature pCreature) : base(pCreature)
|
|
{
|
|
m_bIsAttacked = false;
|
|
Reset();
|
|
}
|
|
|
|
bool m_bIsAttacked;
|
|
|
|
public override void DamageTaken(Unit pDoneBy, ref uint uiDamage)
|
|
{
|
|
if (!uiDamage || !m_bIsAttacked || !m_pInstance || pDoneBy.GetTypeId() != TYPEID_UNIT)
|
|
return;
|
|
|
|
if (Creature pMedivh = m_pInstance.GetSingleCreatureFromStorage(NPC_ECHO_MEDIVH))
|
|
{
|
|
if (m_pInstance.GetPlayerTeam() == HORDE)
|
|
DoPlaySoundToSet(pMedivh, SOUND_ID_CHECK_PLAYER);
|
|
else
|
|
DoPlaySoundToSet(pMedivh, SOUND_ID_CHECK_MEDIVH);
|
|
}
|
|
|
|
m_bIsAttacked = true;
|
|
}
|
|
|
|
public override void JustDied(Unit pKiller)
|
|
{
|
|
base.JustDied(pKiller);
|
|
|
|
if (!m_pInstance)
|
|
return;
|
|
|
|
Creature pMedivh = m_pInstance.GetSingleCreatureFromStorage(NPC_ECHO_MEDIVH);
|
|
if (!pMedivh)
|
|
return;
|
|
|
|
if (m_pInstance.GetData(TYPE_CHESS) == SPECIAL)
|
|
m_pInstance.SetData(TYPE_CHESS, DONE);
|
|
else
|
|
{
|
|
if (m_pInstance.GetPlayerTeam() == ALLIANCE)
|
|
{
|
|
DoPlaySoundToSet(pMedivh, SOUND_ID_WIN_PLAYER);
|
|
DoScriptText(EMOTE_LIFT_CURSE, pMedivh);
|
|
|
|
m_pInstance.SetData(TYPE_CHESS, DONE);
|
|
}
|
|
else
|
|
{
|
|
DoPlaySoundToSet(pMedivh, SOUND_ID_WIN_MEDIVH);
|
|
m_pInstance.SetData(TYPE_CHESS, FAIL);
|
|
}
|
|
}
|
|
|
|
m_pInstance.DoMoveChessPieceToSides(SPELL_TRANSFORM_BLACKHAND, FACTION_ID_CHESS_HORDE, true);
|
|
}
|
|
|
|
public override uint DoCastPrimarySpell()
|
|
{
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_RANDOM, 20.0f))
|
|
{
|
|
DoCastSpellIfCan(m_creature, SPELL_BLOODLUST);
|
|
|
|
// reset timer based on spell values
|
|
SpellInfo pSpell = GetSpellStore().LookupEntry(SPELL_BLOODLUST);
|
|
return pSpell.RecoveryTime ? pSpell.RecoveryTime : pSpell.CategoryRecoveryTime;
|
|
}
|
|
|
|
return 5000;
|
|
}
|
|
|
|
public override uint DoCastSecondarySpell()
|
|
{
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_RANDOM, 10.0f))
|
|
{
|
|
DoCastSpellIfCan(m_creature, SPELL_CLEAVE);
|
|
|
|
// reset timer based on spell values
|
|
SpellInfo pSpell = GetSpellStore().LookupEntry(SPELL_CLEAVE);
|
|
return pSpell.RecoveryTime ? pSpell.RecoveryTime : pSpell.CategoryRecoveryTime;
|
|
}
|
|
|
|
return 5000;
|
|
}
|
|
}
|
|
|
|
public override CreatureAI GetAI(Creature pCreature)
|
|
{
|
|
return new npc_warchief_blackhandAI(pCreature);
|
|
}
|
|
|
|
public override bool OnGossipHello(Player player, Creature creature)
|
|
{
|
|
if (player.HasAura(SPELL_RECENTLY_IN_GAME) || pCreature.HasAura(SPELL_CONTROL_PIECE))
|
|
return true;
|
|
|
|
if (instance_karazhan pInstance = (instance_karazhan)pCreature.GetInstanceData())
|
|
{
|
|
if (pInstance.GetData(TYPE_CHESS) != DONE && player.GetTeam() == HORDE || pInstance.IsFriendlyGameReady())
|
|
player.ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_ITEM_WARCHIEF_BLACKHAND, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
|
}
|
|
|
|
player.SEND_GOSSIP_MENU(GOSSIP_MENU_ID_BLACKHAND, pCreature.GetObjectGuid());
|
|
return true;
|
|
}
|
|
}
|
|
|
|
/*######
|
|
## npc_human_conjurer
|
|
######*/
|
|
public class npc_human_conjurer : CreatureScript
|
|
{
|
|
public npc_human_conjurer() : base("npc_human_conjurer") { }
|
|
|
|
class npc_human_conjurerAI : npc_chess_piece_generic.npc_chess_piece_genericAI
|
|
{
|
|
public npc_human_conjurerAI(Creature pCreature) : base(pCreature) { Reset(); }
|
|
|
|
public override void JustDied(Unit pKiller)
|
|
{
|
|
base.JustDied(pKiller);
|
|
|
|
if (!m_pInstance)
|
|
return;
|
|
|
|
Creature pMedivh = m_pInstance.GetSingleCreatureFromStorage(NPC_ECHO_MEDIVH);
|
|
if (!pMedivh)
|
|
return;
|
|
|
|
if (m_pInstance.GetPlayerTeam() == ALLIANCE)
|
|
DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_QUEEN_PLAYER);
|
|
else
|
|
DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_QUEEN_MEDIVH);
|
|
|
|
m_pInstance.DoMoveChessPieceToSides(SPELL_TRANSFORM_CONJURER, FACTION_ID_CHESS_ALLIANCE);
|
|
}
|
|
|
|
public override uint DoCastPrimarySpell()
|
|
{
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_RANDOM, 20.0f))
|
|
{
|
|
DoCastSpellIfCan(pTarget, SPELL_ELEMENTAL_BLAST);
|
|
|
|
// reset timer based on spell values
|
|
SpellInfo pSpell = GetSpellStore().LookupEntry(SPELL_ELEMENTAL_BLAST);
|
|
return pSpell.RecoveryTime ? pSpell.RecoveryTime : pSpell.CategoryRecoveryTime;
|
|
}
|
|
|
|
return 5000;
|
|
}
|
|
|
|
public override uint DoCastSecondarySpell()
|
|
{
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_RANDOM, 25.0f))
|
|
{
|
|
DoCastSpellIfCan(pTarget, SPELL_RAIN_OF_FIRE);
|
|
|
|
// reset timer based on spell values
|
|
SpellInfo pSpell = GetSpellStore().LookupEntry(SPELL_RAIN_OF_FIRE);
|
|
return pSpell.RecoveryTime ? pSpell.RecoveryTime : pSpell.CategoryRecoveryTime;
|
|
}
|
|
|
|
return 5000;
|
|
}
|
|
}
|
|
|
|
public override CreatureAI GetAI(Creature pCreature)
|
|
{
|
|
return new npc_human_conjurerAI(pCreature);
|
|
}
|
|
|
|
public override bool OnGossipHello(Player player, Creature creature)
|
|
{
|
|
if (player.HasAura(SPELL_RECENTLY_IN_GAME) || pCreature.HasAura(SPELL_CONTROL_PIECE))
|
|
return true;
|
|
|
|
if (ScriptedInstance* pInstance = (ScriptedInstance*)pCreature.GetInstanceData())
|
|
{
|
|
if ((pInstance.GetData(TYPE_CHESS) == IN_PROGRESS && player.GetTeam() == ALLIANCE) || pInstance.GetData(TYPE_CHESS) == SPECIAL)
|
|
player.ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_ITEM_HUMAN_CONJURER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
|
}
|
|
|
|
player.SEND_GOSSIP_MENU(GOSSIP_MENU_ID_CONJURER, pCreature.GetObjectGuid());
|
|
return true;
|
|
}
|
|
}
|
|
|
|
/*######
|
|
## npc_orc_warlock
|
|
######*/
|
|
class npc_orc_warlock : CreatureScript
|
|
{
|
|
public npc_orc_warlock() : base("npc_orc_warlock") { }
|
|
|
|
class npc_orc_warlockAI : npc_chess_piece_generic.npc_chess_piece_genericAI
|
|
{
|
|
public npc_orc_warlockAI(Creature pCreature) : base(pCreature) { Reset(); }
|
|
|
|
public override void JustDied(Unit pKiller)
|
|
{
|
|
base.JustDied(pKiller);
|
|
|
|
if (!m_pInstance)
|
|
return;
|
|
|
|
Creature pMedivh = m_pInstance.GetSingleCreatureFromStorage(NPC_ECHO_MEDIVH);
|
|
if (!pMedivh)
|
|
return;
|
|
|
|
if (m_pInstance.GetPlayerTeam() == HORDE)
|
|
DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_QUEEN_PLAYER);
|
|
else
|
|
DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_QUEEN_MEDIVH);
|
|
|
|
m_pInstance.DoMoveChessPieceToSides(SPELL_TRANSFORM_WARLOCK, FACTION_ID_CHESS_HORDE);
|
|
}
|
|
|
|
public override uint DoCastPrimarySpell()
|
|
{
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_RANDOM, 20.0f))
|
|
{
|
|
DoCastSpellIfCan(pTarget, SPELL_FIREBALL);
|
|
|
|
// reset timer based on spell values
|
|
SpellInfo pSpell = GetSpellStore().LookupEntry(SPELL_FIREBALL);
|
|
return pSpell.RecoveryTime ? pSpell.RecoveryTime : pSpell.CategoryRecoveryTime;
|
|
}
|
|
|
|
return 5000;
|
|
}
|
|
|
|
public override uint DoCastSecondarySpell()
|
|
{
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_RANDOM, 25.0f))
|
|
{
|
|
DoCastSpellIfCan(pTarget, SPELL_POISON_CLOUD_ACTION);
|
|
|
|
// reset timer based on spell values
|
|
SpellInfo pSpell = GetSpellStore().LookupEntry(SPELL_POISON_CLOUD_ACTION);
|
|
return pSpell.RecoveryTime ? pSpell.RecoveryTime : pSpell.CategoryRecoveryTime;
|
|
}
|
|
|
|
return 5000;
|
|
}
|
|
}
|
|
|
|
public override CreatureAI GetAI(Creature pCreature)
|
|
{
|
|
return new npc_orc_warlockAI(pCreature);
|
|
}
|
|
|
|
public override bool OnGossipHello(Player player, Creature creature)
|
|
{
|
|
if (player.HasAura(SPELL_RECENTLY_IN_GAME) || pCreature.HasAura(SPELL_CONTROL_PIECE))
|
|
return true;
|
|
|
|
if (ScriptedInstance* pInstance = (ScriptedInstance*)pCreature.GetInstanceData())
|
|
{
|
|
if ((pInstance.GetData(TYPE_CHESS) == IN_PROGRESS && player.GetTeam() == HORDE) || pInstance.GetData(TYPE_CHESS) == SPECIAL)
|
|
player.ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ORC_WARLOCK, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
|
}
|
|
|
|
player.SEND_GOSSIP_MENU(GOSSIP_MENU_ID_WARLOCK, pCreature.GetObjectGuid());
|
|
return true;
|
|
}
|
|
}
|
|
|
|
/*######
|
|
## npc_human_footman
|
|
######*/
|
|
class npc_human_footman : CreatureScript
|
|
{
|
|
public npc_human_footman() : base("npc_human_footman") { }
|
|
|
|
class npc_human_footmanAI : npc_chess_piece_generic.npc_chess_piece_genericAI
|
|
{
|
|
public npc_human_footmanAI(Creature pCreature) : base(pCreature) { Reset(); }
|
|
|
|
public override void JustDied(Unit pKiller)
|
|
{
|
|
base.JustDied(pKiller);
|
|
|
|
if (!m_pInstance)
|
|
return;
|
|
|
|
Creature pMedivh = m_pInstance.GetSingleCreatureFromStorage(NPC_ECHO_MEDIVH);
|
|
if (!pMedivh)
|
|
return;
|
|
|
|
if (m_pInstance.GetPlayerTeam() == ALLIANCE)
|
|
{
|
|
switch (urand(0, 2))
|
|
{
|
|
case 0: DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_PAWN_PLAYER_1); break;
|
|
case 1: DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_PAWN_PLAYER_2); break;
|
|
case 2: DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_PAWN_PLAYER_3); break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switch (urand(0, 2))
|
|
{
|
|
case 0: DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_PAWN_MEDIVH_1); break;
|
|
case 1: DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_PAWN_MEDIVH_2); break;
|
|
case 2: DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_PAWN_MEDIVH_3); break;
|
|
}
|
|
}
|
|
|
|
m_pInstance.DoMoveChessPieceToSides(SPELL_TRANSFORM_FOOTMAN, FACTION_ID_CHESS_ALLIANCE);
|
|
}
|
|
|
|
public override uint DoCastPrimarySpell()
|
|
{
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_RANDOM, 8.0f, M_PI_F / 12))
|
|
{
|
|
DoCastSpellIfCan(m_creature, SPELL_HEROIC_BLOW);
|
|
|
|
// reset timer based on spell values
|
|
SpellInfo pSpell = GetSpellStore().LookupEntry(SPELL_HEROIC_BLOW);
|
|
return pSpell.RecoveryTime ? pSpell.RecoveryTime : pSpell.CategoryRecoveryTime;
|
|
}
|
|
|
|
return 5000;
|
|
}
|
|
|
|
public override uint DoCastSecondarySpell()
|
|
{
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_RANDOM, 8.0f))
|
|
{
|
|
DoCastSpellIfCan(m_creature, SPELL_SHIELD_BLOCK);
|
|
|
|
// reset timer based on spell values
|
|
SpellInfo pSpell = GetSpellStore().LookupEntry(SPELL_SHIELD_BLOCK);
|
|
return pSpell.RecoveryTime ? pSpell.RecoveryTime : pSpell.CategoryRecoveryTime;
|
|
}
|
|
|
|
return 5000;
|
|
}
|
|
}
|
|
|
|
public override CreatureAI GetAI(Creature pCreature)
|
|
{
|
|
return new npc_human_footmanAI(pCreature);
|
|
}
|
|
|
|
public override bool OnGossipHello(Player player, Creature creature)
|
|
{
|
|
if (player.HasAura(SPELL_RECENTLY_IN_GAME) || pCreature.HasAura(SPELL_CONTROL_PIECE))
|
|
return true;
|
|
|
|
if (ScriptedInstance* pInstance = (ScriptedInstance*)pCreature.GetInstanceData())
|
|
{
|
|
if ((pInstance.GetData(TYPE_CHESS) == IN_PROGRESS && player.GetTeam() == ALLIANCE) || pInstance.GetData(TYPE_CHESS) == SPECIAL)
|
|
player.ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_ITEM_HUMAN_FOOTMAN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
|
}
|
|
|
|
player.SEND_GOSSIP_MENU(GOSSIP_MENU_ID_FOOTMAN, pCreature.GetObjectGuid());
|
|
return true;
|
|
}
|
|
}
|
|
|
|
/*######
|
|
## npc_orc_grunt
|
|
######*/
|
|
class npc_orc_grunt : CreatureScript
|
|
{
|
|
public npc_orc_grunt() : base("npc_orc_grunt") { }
|
|
|
|
class npc_orc_gruntAI : npc_chess_piece_generic.npc_chess_piece_genericAI
|
|
{
|
|
public npc_orc_gruntAI(Creature pCreature) : base(pCreature) { Reset(); }
|
|
|
|
public override void JustDied(Unit pKiller)
|
|
{
|
|
base.JustDied(pKiller);
|
|
|
|
if (!m_pInstance)
|
|
return;
|
|
|
|
Creature pMedivh = m_pInstance.GetSingleCreatureFromStorage(NPC_ECHO_MEDIVH);
|
|
if (!pMedivh)
|
|
return;
|
|
|
|
if (m_pInstance.GetPlayerTeam() == HORDE)
|
|
{
|
|
switch (urand(0, 2))
|
|
{
|
|
case 0: DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_PAWN_PLAYER_1); break;
|
|
case 1: DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_PAWN_PLAYER_2); break;
|
|
case 2: DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_PAWN_PLAYER_3); break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switch (urand(0, 2))
|
|
{
|
|
case 0: DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_PAWN_MEDIVH_1); break;
|
|
case 1: DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_PAWN_MEDIVH_2); break;
|
|
case 2: DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_PAWN_MEDIVH_3); break;
|
|
}
|
|
}
|
|
|
|
m_pInstance.DoMoveChessPieceToSides(SPELL_TRANSFORM_GRUNT, FACTION_ID_CHESS_HORDE);
|
|
}
|
|
|
|
public override uint DoCastPrimarySpell()
|
|
{
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_RANDOM, 8.0f, M_PI_F / 12))
|
|
{
|
|
DoCastSpellIfCan(m_creature, SPELL_VICIOUS_STRIKE);
|
|
|
|
// reset timer based on spell values
|
|
SpellInfo pSpell = GetSpellStore().LookupEntry(SPELL_VICIOUS_STRIKE);
|
|
return pSpell.RecoveryTime ? pSpell.RecoveryTime : pSpell.CategoryRecoveryTime;
|
|
}
|
|
|
|
return 5000;
|
|
}
|
|
|
|
public override uint DoCastSecondarySpell()
|
|
{
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_RANDOM, 8.0f))
|
|
{
|
|
DoCastSpellIfCan(m_creature, SPELL_WEAPON_DEFLECTION);
|
|
|
|
// reset timer based on spell values
|
|
SpellInfo pSpell = GetSpellStore().LookupEntry(SPELL_WEAPON_DEFLECTION);
|
|
return pSpell.RecoveryTime ? pSpell.RecoveryTime : pSpell.CategoryRecoveryTime;
|
|
}
|
|
|
|
return 5000;
|
|
}
|
|
}
|
|
|
|
public override CreatureAI GetAI(Creature pCreature)
|
|
{
|
|
return new npc_orc_gruntAI(pCreature);
|
|
}
|
|
|
|
public override bool OnGossipHello(Player player, Creature creature)
|
|
{
|
|
if (player.HasAura(SPELL_RECENTLY_IN_GAME) || pCreature.HasAura(SPELL_CONTROL_PIECE))
|
|
return true;
|
|
|
|
if (ScriptedInstance* pInstance = (ScriptedInstance*)pCreature.GetInstanceData())
|
|
{
|
|
if ((pInstance.GetData(TYPE_CHESS) == IN_PROGRESS && player.GetTeam() == HORDE) || pInstance.GetData(TYPE_CHESS) == SPECIAL)
|
|
player.ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ORC_GRUNT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
|
}
|
|
|
|
player.SEND_GOSSIP_MENU(GOSSIP_MENU_ID_GRUNT, pCreature.GetObjectGuid());
|
|
return true;
|
|
}
|
|
}
|
|
|
|
/*######
|
|
## npc_water_elemental
|
|
######*/
|
|
class npc_water_elemental : CreatureScript
|
|
{
|
|
public npc_water_elemental() : base("npc_water_elemental") { }
|
|
|
|
class npc_water_elementalAI : npc_chess_piece_generic.npc_chess_piece_genericAI
|
|
{
|
|
public npc_water_elementalAI(Creature pCreature) : base(pCreature) { Reset(); }
|
|
|
|
public override void JustDied(Unit pKiller)
|
|
{
|
|
base.JustDied(pKiller);
|
|
|
|
if (!m_pInstance)
|
|
return;
|
|
|
|
Creature pMedivh = m_pInstance.GetSingleCreatureFromStorage(NPC_ECHO_MEDIVH);
|
|
if (!pMedivh)
|
|
return;
|
|
|
|
if (m_pInstance.GetPlayerTeam() == ALLIANCE)
|
|
DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_ROOK_PLAYER);
|
|
else
|
|
DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_ROOK_MEDIVH);
|
|
|
|
m_pInstance.DoMoveChessPieceToSides(SPELL_TRANSFORM_WATER_ELEM, FACTION_ID_CHESS_ALLIANCE);
|
|
}
|
|
|
|
public override uint DoCastPrimarySpell()
|
|
{
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_RANDOM, 9.0f))
|
|
{
|
|
DoCastSpellIfCan(m_creature, SPELL_GEYSER);
|
|
|
|
// reset timer based on spell values
|
|
SpellInfo pSpell = GetSpellStore().LookupEntry(SPELL_GEYSER);
|
|
return pSpell.RecoveryTime ? pSpell.RecoveryTime : pSpell.CategoryRecoveryTime;
|
|
}
|
|
|
|
return 5000;
|
|
}
|
|
|
|
public override uint DoCastSecondarySpell()
|
|
{
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_RANDOM, 9.0f))
|
|
{
|
|
DoCastSpellIfCan(m_creature, SPELL_WATER_SHIELD);
|
|
|
|
// reset timer based on spell values
|
|
SpellInfo pSpell = GetSpellStore().LookupEntry(SPELL_WATER_SHIELD);
|
|
return pSpell.RecoveryTime ? pSpell.RecoveryTime : pSpell.CategoryRecoveryTime;
|
|
}
|
|
|
|
return 5000;
|
|
}
|
|
}
|
|
|
|
public override CreatureAI GetAI(Creature pCreature)
|
|
{
|
|
return new npc_water_elementalAI(pCreature);
|
|
}
|
|
|
|
public override bool OnGossipHello(Player player, Creature creature)
|
|
{
|
|
if (player.HasAura(SPELL_RECENTLY_IN_GAME) || pCreature.HasAura(SPELL_CONTROL_PIECE))
|
|
return true;
|
|
|
|
if (ScriptedInstance* pInstance = (ScriptedInstance*)pCreature.GetInstanceData())
|
|
{
|
|
if ((pInstance.GetData(TYPE_CHESS) == IN_PROGRESS && player.GetTeam() == ALLIANCE) || pInstance.GetData(TYPE_CHESS) == SPECIAL)
|
|
player.ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_ITEM_WATER_ELEMENTAL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
|
}
|
|
|
|
player.SEND_GOSSIP_MENU(GOSSIP_MENU_ID_ELEMENTAL, pCreature.GetObjectGuid());
|
|
return true;
|
|
}
|
|
}
|
|
|
|
/*######
|
|
## npc_summoned_daemon
|
|
######*/
|
|
class npc_summoned_daemon : CreatureScript
|
|
{
|
|
public npc_summoned_daemon() : base("npc_summoned_daemon") { }
|
|
|
|
class npc_summoned_daemonAI : npc_chess_piece_generic.npc_chess_piece_genericAI
|
|
{
|
|
public npc_summoned_daemonAI(Creature pCreature) : base(pCreature) { Reset(); }
|
|
|
|
public override void JustDied(Unit pKiller)
|
|
{
|
|
base.JustDied(pKiller);
|
|
|
|
if (!m_pInstance)
|
|
return;
|
|
|
|
Creature pMedivh = m_pInstance.GetSingleCreatureFromStorage(NPC_ECHO_MEDIVH);
|
|
if (!pMedivh)
|
|
return;
|
|
|
|
if (m_pInstance.GetPlayerTeam() == HORDE)
|
|
DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_ROOK_PLAYER);
|
|
else
|
|
DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_ROOK_MEDIVH);
|
|
|
|
m_pInstance.DoMoveChessPieceToSides(SPELL_TRANSFORM_DAEMON, FACTION_ID_CHESS_HORDE);
|
|
}
|
|
|
|
public override uint DoCastPrimarySpell()
|
|
{
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_RANDOM, 9.0f))
|
|
{
|
|
DoCastSpellIfCan(m_creature, SPELL_HELLFIRE);
|
|
|
|
// reset timer based on spell values
|
|
SpellInfo pSpell = GetSpellStore().LookupEntry(SPELL_HELLFIRE);
|
|
return pSpell.RecoveryTime ? pSpell.RecoveryTime : pSpell.CategoryRecoveryTime;
|
|
}
|
|
|
|
return 5000;
|
|
}
|
|
|
|
public override uint DoCastSecondarySpell()
|
|
{
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_RANDOM, 9.0f))
|
|
{
|
|
DoCastSpellIfCan(m_creature, SPELL_FIRE_SHIELD);
|
|
|
|
// reset timer based on spell values
|
|
SpellInfo pSpell = GetSpellStore().LookupEntry(SPELL_FIRE_SHIELD);
|
|
return pSpell.RecoveryTime ? pSpell.RecoveryTime : pSpell.CategoryRecoveryTime;
|
|
}
|
|
|
|
return 5000;
|
|
}
|
|
}
|
|
|
|
public override CreatureAI GetAI(Creature pCreature)
|
|
{
|
|
return new npc_summoned_daemonAI(pCreature);
|
|
}
|
|
|
|
public override bool OnGossipHello(Player player, Creature creature)
|
|
{
|
|
if (player.HasAura(SPELL_RECENTLY_IN_GAME) || pCreature.HasAura(SPELL_CONTROL_PIECE))
|
|
return true;
|
|
|
|
if (ScriptedInstance* pInstance = (ScriptedInstance*)pCreature.GetInstanceData())
|
|
{
|
|
if ((pInstance.GetData(TYPE_CHESS) == IN_PROGRESS && player.GetTeam() == HORDE) || pInstance.GetData(TYPE_CHESS) == SPECIAL)
|
|
player.ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_ITEM_SUMMONED_DEAMON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
|
}
|
|
|
|
player.SEND_GOSSIP_MENU(GOSSIP_MENU_ID_DEAMON, pCreature.GetObjectGuid());
|
|
return true;
|
|
}
|
|
}
|
|
|
|
/*######
|
|
## npc_human_charger
|
|
######*/
|
|
class npc_human_charger : CreatureScript
|
|
{
|
|
public npc_human_charger() : base("npc_human_charger") { }
|
|
|
|
class npc_human_chargerAI : npc_chess_piece_generic.npc_chess_piece_genericAI
|
|
{
|
|
public npc_human_chargerAI(Creature pCreature) : base(pCreature) { Reset(); }
|
|
|
|
public override void JustDied(Unit pKiller)
|
|
{
|
|
base.JustDied(pKiller);
|
|
|
|
if (!m_pInstance)
|
|
return;
|
|
|
|
Creature pMedivh = m_pInstance.GetSingleCreatureFromStorage(NPC_ECHO_MEDIVH);
|
|
if (!pMedivh)
|
|
return;
|
|
|
|
if (m_pInstance.GetPlayerTeam() == ALLIANCE)
|
|
DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_KNIGHT_PLAYER);
|
|
else
|
|
DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_KNIGHT_MEDIVH);
|
|
|
|
m_pInstance.DoMoveChessPieceToSides(SPELL_TRANSFORM_CHARGER, FACTION_ID_CHESS_ALLIANCE);
|
|
}
|
|
|
|
public override uint DoCastPrimarySpell()
|
|
{
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_RANDOM, 8.0f, M_PI_F / 12))
|
|
{
|
|
DoCastSpellIfCan(m_creature, SPELL_SMASH);
|
|
|
|
// reset timer based on spell values
|
|
SpellInfo pSpell = GetSpellStore().LookupEntry(SPELL_SMASH);
|
|
return pSpell.RecoveryTime ? pSpell.RecoveryTime : pSpell.CategoryRecoveryTime;
|
|
}
|
|
|
|
return 5000;
|
|
}
|
|
|
|
public override uint DoCastSecondarySpell()
|
|
{
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_RANDOM, 10.0f, M_PI_F / 12))
|
|
{
|
|
DoCastSpellIfCan(m_creature, SPELL_STOMP);
|
|
|
|
// reset timer based on spell values
|
|
SpellInfo pSpell = GetSpellStore().LookupEntry(SPELL_STOMP);
|
|
return pSpell.RecoveryTime ? pSpell.RecoveryTime : pSpell.CategoryRecoveryTime;
|
|
}
|
|
|
|
return 5000;
|
|
}
|
|
}
|
|
|
|
public override CreatureAI GetAI(Creature pCreature)
|
|
{
|
|
return new npc_human_chargerAI(pCreature);
|
|
}
|
|
|
|
public override bool OnGossipHello(Player player, Creature creature)
|
|
{
|
|
if (player.HasAura(SPELL_RECENTLY_IN_GAME) || pCreature.HasAura(SPELL_CONTROL_PIECE))
|
|
return true;
|
|
|
|
if (ScriptedInstance* pInstance = (ScriptedInstance*)pCreature.GetInstanceData())
|
|
{
|
|
if ((pInstance.GetData(TYPE_CHESS) == IN_PROGRESS && player.GetTeam() == ALLIANCE) || pInstance.GetData(TYPE_CHESS) == SPECIAL)
|
|
player.ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_ITEM_HUMAN_CHARGER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
|
}
|
|
|
|
player.SEND_GOSSIP_MENU(GOSSIP_MENU_ID_CHARGER, pCreature.GetObjectGuid());
|
|
return true;
|
|
}
|
|
}
|
|
|
|
/*######
|
|
## npc_orc_wolf
|
|
######*/
|
|
class npc_orc_wolf : CreatureScript
|
|
{
|
|
public npc_orc_wolf() : base("npc_orc_wolf") { }
|
|
|
|
class npc_orc_wolfAI : npc_chess_piece_generic.npc_chess_piece_genericAI
|
|
{
|
|
public npc_orc_wolfAI(Creature pCreature) : base(pCreature) { Reset(); }
|
|
|
|
public override void JustDied(Unit pKiller)
|
|
{
|
|
base.JustDied(pKiller);
|
|
|
|
if (!m_pInstance)
|
|
return;
|
|
|
|
Creature pMedivh = m_pInstance.GetSingleCreatureFromStorage(NPC_ECHO_MEDIVH);
|
|
if (!pMedivh)
|
|
return;
|
|
|
|
if (m_pInstance.GetPlayerTeam() == HORDE)
|
|
DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_KNIGHT_PLAYER);
|
|
else
|
|
DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_KNIGHT_MEDIVH);
|
|
|
|
m_pInstance.DoMoveChessPieceToSides(SPELL_TRANSFORM_WOLF, FACTION_ID_CHESS_HORDE);
|
|
}
|
|
|
|
public override uint DoCastPrimarySpell()
|
|
{
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_RANDOM, 8.0f, M_PI_F / 12))
|
|
{
|
|
DoCastSpellIfCan(m_creature, SPELL_BITE);
|
|
|
|
// reset timer based on spell values
|
|
SpellInfo pSpell = GetSpellStore().LookupEntry(SPELL_BITE);
|
|
return pSpell.RecoveryTime ? pSpell.RecoveryTime : pSpell.CategoryRecoveryTime;
|
|
}
|
|
|
|
return 5000;
|
|
}
|
|
|
|
public override uint DoCastSecondarySpell()
|
|
{
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_RANDOM, 10.0f, M_PI_F / 12))
|
|
{
|
|
DoCastSpellIfCan(m_creature, SPELL_HOWL);
|
|
|
|
// reset timer based on spell values
|
|
SpellInfo pSpell = GetSpellStore().LookupEntry(SPELL_HOWL);
|
|
return pSpell.RecoveryTime ? pSpell.RecoveryTime : pSpell.CategoryRecoveryTime;
|
|
}
|
|
|
|
return 5000;
|
|
}
|
|
}
|
|
|
|
public override CreatureAI GetAI(Creature pCreature)
|
|
{
|
|
return new npc_orc_wolfAI(pCreature);
|
|
}
|
|
|
|
public override bool OnGossipHello(Player player, Creature creature)
|
|
{
|
|
if (player.HasAura(SPELL_RECENTLY_IN_GAME) || pCreature.HasAura(SPELL_CONTROL_PIECE))
|
|
return true;
|
|
|
|
if (ScriptedInstance* pInstance = (ScriptedInstance*)pCreature.GetInstanceData())
|
|
{
|
|
if ((pInstance.GetData(TYPE_CHESS) == IN_PROGRESS && player.GetTeam() == HORDE) || pInstance.GetData(TYPE_CHESS) == SPECIAL)
|
|
player.ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ORC_WOLF, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
|
}
|
|
|
|
player.SEND_GOSSIP_MENU(GOSSIP_MENU_ID_WOLF, pCreature.GetObjectGuid());
|
|
return true;
|
|
}
|
|
}
|
|
|
|
/*######
|
|
## npc_human_cleric
|
|
######*/
|
|
class npc_human_cleric : CreatureScript
|
|
{
|
|
public npc_human_cleric() : base("npc_human_cleric") { }
|
|
|
|
class npc_human_clericAI : npc_chess_piece_generic.npc_chess_piece_genericAI
|
|
{
|
|
public npc_human_clericAI(Creature pCreature) : base(pCreature) { Reset(); }
|
|
|
|
public override void JustDied(Unit pKiller)
|
|
{
|
|
base.JustDied(pKiller);
|
|
|
|
if (!m_pInstance)
|
|
return;
|
|
|
|
Creature pMedivh = m_pInstance.GetSingleCreatureFromStorage(NPC_ECHO_MEDIVH);
|
|
if (!pMedivh)
|
|
return;
|
|
|
|
if (m_pInstance.GetPlayerTeam() == ALLIANCE)
|
|
DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_BISHOP_PLAYER);
|
|
else
|
|
DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_BISHOP_MEDIVH);
|
|
|
|
m_pInstance.DoMoveChessPieceToSides(SPELL_TRANSFORM_CLERIC, FACTION_ID_CHESS_ALLIANCE);
|
|
}
|
|
|
|
public override uint DoCastPrimarySpell()
|
|
{
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_FRIENDLY, 25.0f))
|
|
{
|
|
DoCastSpellIfCan(pTarget, SPELL_HEALING);
|
|
|
|
// reset timer based on spell values
|
|
SpellInfo pSpell = GetSpellStore().LookupEntry(SPELL_HEALING);
|
|
return pSpell.RecoveryTime ? pSpell.RecoveryTime : pSpell.CategoryRecoveryTime;
|
|
}
|
|
|
|
return 5000;
|
|
}
|
|
|
|
public override uint DoCastSecondarySpell()
|
|
{
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_RANDOM, 18.0f, M_PI_F / 12))
|
|
{
|
|
DoCastSpellIfCan(m_creature, SPELL_HOLY_LANCE);
|
|
|
|
// reset timer based on spell values
|
|
SpellInfo pSpell = GetSpellStore().LookupEntry(SPELL_HOLY_LANCE);
|
|
return pSpell.RecoveryTime ? pSpell.RecoveryTime : pSpell.CategoryRecoveryTime;
|
|
}
|
|
|
|
return 5000;
|
|
}
|
|
}
|
|
|
|
public override CreatureAI GetAI(Creature pCreature)
|
|
{
|
|
return new npc_human_clericAI(pCreature);
|
|
}
|
|
|
|
public override bool OnGossipHello(Player player, Creature creature)
|
|
{
|
|
if (player.HasAura(SPELL_RECENTLY_IN_GAME) || pCreature.HasAura(SPELL_CONTROL_PIECE))
|
|
return true;
|
|
|
|
if (ScriptedInstance* pInstance = (ScriptedInstance*)pCreature.GetInstanceData())
|
|
{
|
|
if ((pInstance.GetData(TYPE_CHESS) == IN_PROGRESS && player.GetTeam() == ALLIANCE) || pInstance.GetData(TYPE_CHESS) == SPECIAL)
|
|
player.ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_ITEM_HUMAN_CLERIC, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
|
}
|
|
|
|
player.SEND_GOSSIP_MENU(GOSSIP_MENU_ID_CLERIC, pCreature.GetObjectGuid());
|
|
return true;
|
|
}
|
|
}
|
|
|
|
/*######
|
|
## npc_orc_necrolyte
|
|
######*/
|
|
class npc_orc_necrolyte : CreatureScript
|
|
{
|
|
public npc_orc_necrolyte() : base("npc_orc_necrolyte") { }
|
|
|
|
class npc_orc_necrolyteAI : npc_chess_piece_generic.npc_chess_piece_genericAI
|
|
{
|
|
public npc_orc_necrolyteAI(Creature pCreature) : base(pCreature) { Reset(); }
|
|
|
|
public override void JustDied(Unit pKiller)
|
|
{
|
|
base.JustDied(pKiller);
|
|
|
|
if (!m_pInstance)
|
|
return;
|
|
|
|
Creature pMedivh = m_pInstance.GetSingleCreatureFromStorage(NPC_ECHO_MEDIVH);
|
|
if (!pMedivh)
|
|
return;
|
|
|
|
if (m_pInstance.GetPlayerTeam() == HORDE)
|
|
DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_BISHOP_PLAYER);
|
|
else
|
|
DoPlaySoundToSet(pMedivh, SOUND_ID_LOSE_BISHOP_MEDIVH);
|
|
|
|
m_pInstance.DoMoveChessPieceToSides(SPELL_TRANSFORM_NECROLYTE, FACTION_ID_CHESS_HORDE);
|
|
}
|
|
|
|
public override uint DoCastPrimarySpell()
|
|
{
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_FRIENDLY, 25.0f))
|
|
{
|
|
DoCastSpellIfCan(pTarget, SPELL_SHADOW_MEND_ACTION);
|
|
|
|
// reset timer based on spell values
|
|
SpellInfo pSpell = GetSpellStore().LookupEntry(SPELL_SHADOW_MEND_ACTION);
|
|
return pSpell.RecoveryTime ? pSpell.RecoveryTime : pSpell.CategoryRecoveryTime;
|
|
}
|
|
|
|
return 5000;
|
|
}
|
|
|
|
public override uint DoCastSecondarySpell()
|
|
{
|
|
if (Unit pTarget = GetTargetByType(TARGET_TYPE_RANDOM, 18.0f, M_PI_F / 12))
|
|
{
|
|
DoCastSpellIfCan(m_creature, SPELL_SHADOW_SPEAR);
|
|
|
|
// reset timer based on spell values
|
|
SpellInfo pSpell = GetSpellStore().LookupEntry(SPELL_SHADOW_SPEAR);
|
|
return pSpell.RecoveryTime ? pSpell.RecoveryTime : pSpell.CategoryRecoveryTime;
|
|
}
|
|
|
|
return 5000;
|
|
}
|
|
}
|
|
|
|
public override CreatureAI GetAI(Creature pCreature)
|
|
{
|
|
return new npc_orc_necrolyteAI(pCreature);
|
|
}
|
|
|
|
public override bool OnGossipHello(Player player, Creature creature)
|
|
{
|
|
if (player.HasAura(SPELL_RECENTLY_IN_GAME) || pCreature.HasAura(SPELL_CONTROL_PIECE))
|
|
return true;
|
|
|
|
if (ScriptedInstance* pInstance = (ScriptedInstance*)pCreature.GetInstanceData())
|
|
{
|
|
if ((pInstance.GetData(TYPE_CHESS) == IN_PROGRESS && player.GetTeam() == HORDE) || pInstance.GetData(TYPE_CHESS) == SPECIAL)
|
|
player.ADD_GOSSIP_ITEM_ID(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ORC_NECROLYTE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
|
}
|
|
|
|
player.SEND_GOSSIP_MENU(GOSSIP_MENU_ID_NECROLYTE, pCreature.GetObjectGuid());
|
|
return true;
|
|
}
|
|
}
|
|
}
|