39#include <G3D/Vector3.h>
230 { 8.130936f, -0.2699585f, 20.31728f },
231 { 6.380936f, -0.2699585f, 20.31728f },
232 { 3.507703f, 0.02986573f, 20.78463f },
233 { -2.767633f, 3.743143f, 20.37663f },
234 { -4.017633f, 4.493143f, 20.12663f },
235 { -7.242224f, 6.856013f, 20.03468f },
236 { -7.742224f, 8.606013f, 20.78468f },
237 { -7.992224f, 9.856013f, 21.28468f },
238 { -12.24222f, 23.10601f, 21.28468f },
239 { -14.88477f, 25.20844f, 21.59985f },
245 { 30.43987f, 0.1475817f, 36.10674f },
246 { 21.36141f, -3.056458f, 35.42970f },
247 { 19.11141f, -3.806458f, 35.42970f },
248 { 19.01736f, -3.299440f, 35.39428f },
249 { 18.6747f, -5.862823f, 35.66611f },
250 { 18.6747f, -7.862823f, 35.66611f },
251 { 18.1747f, -17.36282f, 35.66611f },
252 { 18.1747f, -22.61282f, 35.66611f },
253 { 17.9247f, -24.36282f, 35.41611f },
254 { 17.9247f, -26.61282f, 35.66611f },
255 { 17.9247f, -27.86282f, 35.66611f },
256 { 17.9247f, -29.36282f, 35.66611f },
257 { 15.33203f, -30.42621f, 35.93796f }
407 bool summoned =
false;
409 for (
int32 i = first; i <= last; ++i)
417 if (current && current->
IsAlive())
441 for (
int32 i = first; i <= last; ++i)
452 float angle =
frand(
float(-
M_PI) * 0.5f,
float(
M_PI) * 0.5f);
479 init.DisableTransportPathTransformations();
480 init.MoveTo(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ(),
false);
503 go->AddObjectToRemoveList();
569 float hx = x, hy = y, hz = z, ho = o;
575 init.DisableTransportPathTransformations();
576 init.MoveTo(x, y, z,
false);
728 std::list<Creature*> creatures;
730 for (std::list<Creature*>::iterator itr = creatures.begin(); itr != creatures.end(); ++itr)
740 for (std::list<Creature*>::iterator itr = creatures.begin(); itr != creatures.end(); ++itr)
751 for (std::list<Creature*>::iterator itr = creatures.begin(); itr != creatures.end(); ++itr)
778 creature->AI()->Talk(textId);
783 otherTransport->EnableMovement(
true);
799 for (std::list<Creature*>::iterator itr = creatures.begin(); itr != creatures.end(); ++itr)
800 (*itr)->DespawnOrUnsummon(1ms);
815 std::map<ObjectGuid, uint32>::iterator itr =
_shipVisits.find(guid);
828 for (std::map<ObjectGuid, uint32>::const_iterator itr =
_shipVisits.begin(); itr !=
_shipVisits.end(); ++itr)
829 max = std::max(max, itr->second);
846 return GetIcecrownCitadelAI<npc_gunshipAI>(creature);
947 init.DisableTransportPathTransformations();
948 init.MovebyPath(path, 0);
1110 _instance(creature->GetInstanceScript())
1203 init.DisableTransportPathTransformations();
1204 init.MovebyPath(path, 0);
1431 float angle =
frand(0,
float(
M_PI) * 2.0f);
1432 x += 2.0f * std::cos(angle);
1433 y += 2.0f * std::sin(angle);
1445 std::list<Player*> players;
1450 players.remove_if([
this](
Player* player)
1455 if (!players.empty())
1458 for (std::list<Player*>::iterator itr = players.begin(); itr != players.end(); ++itr)
1504 return target->
HasAura(spellId) || target->
GetEntry() == creatureEntry;
1509 std::list<Player*> players;
1514 players.remove_if([
this](
Player* player)
1519 return !players.empty();
1588 return GetIcecrownCitadelAI<npc_gunship_boarding_addAI>(creature);
1892 if (
Unit* passenger = vehicle->GetPassenger(0))
1956 if (
Unit* passenger = vehicle->GetPassenger(0))
1962 data <<
uint8(value);
1963 player->SendDirectMessage(&data);
2040 targets.remove_if([team](
WorldObject* target) ->
bool
2047 if (!targets.empty())
2051 targets.push_back(target);
2095 if (!targets.empty())
2099 targets.push_back(target);
2225 targets.remove_if([instance](
WorldObject* target) ->
bool
@ NPC_ALLIANCE_GUNSHIP_CANNON
@ NPC_HORDE_GUNSHIP_CANNON
std::chrono::steady_clock::time_point TimePoint
time_point shorthand typedefs
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
@ ENCOUNTER_FRAME_DISENGAGE
@ TEMPSUMMON_TIMED_DESPAWN
@ TEMPSUMMON_CORPSE_TIMED_DESPAWN
float frand(float min, float max)
uint32 urand(uint32 min, uint32 max)
#define RegisterSpellScript(spell_script)
void GetCreatureListWithEntryInGrid(Container &container, WorldObject *source, uint32 entry, float maxSearchRange)
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_TRIGGER_MISSILE
@ SPELL_EFFECT_SCHOOL_DAMAGE
@ SPELL_EFFECT_TELEPORT_UNITS
@ TARGET_UNIT_SRC_AREA_ENTRY
@ TARGET_DEST_NEARBY_ENTRY
@ TARGET_UNIT_SRC_AREA_ENEMY
@ TARGET_UNIT_DEST_AREA_ENTRY
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_PERIODIC_DUMMY
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
@ TRIGGERED_IGNORE_POWER_AND_REAGENT_COST
Will ignore Spell and Category cooldowns.
#define BeforeSpellHitFn(F)
#define SpellObjectTargetSelectFn(F, I, N)
#define SpellEffectFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define AuraEffectApplyFn(F, I, N, M)
#define AuraCheckProcFn(F)
#define AuraCheckAreaTargetFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
@ SPELL_CREATE_ROCKET_PACK
@ ITEM_GOBLIN_ROCKET_PACK
uint32 const SaurfangExitPathSize
@ SAY_ZAFOD_ROCKET_PACK_ACTIVE
@ SAY_SAURFANG_ENTER_SKYBREAKER
@ SAY_MURADIN_ENTER_ORGRIMMS_HAMMER
@ SAY_SAURFANG_AXETHROWERS
@ SAY_ZAFOD_ROCKET_PACK_DISABLED
@ SAY_SAURFANG_ROCKETEERS
G3D::Vector3 const SaurfangExitPath[SaurfangExitPathSize]
SlotInfo const SkybreakerSlotInfo[MAX_SLOTS]
Position const SkybreakerTeleportPortal
Position const OrgrimsHammerTeleportPortal
Position const OrgrimsHammerTeleportExit
@ SPELL_FRIENDLY_BOSS_DAMAGE_MOD
@ SPELL_ON_SKYBREAKER_DECK
@ SPELL_ROCKET_PACK_USEABLE
@ SPELL_ON_ORGRIMS_HAMMER_DECK
@ SPELL_ROCKET_ARTILLERY_H
@ SPELL_BATTLE_EXPERIENCE
@ SPELL_EJECT_ALL_PASSENGERS_WIPE
@ SPELL_AWARD_REPUTATION_BOSS_KILL
@ SPELL_GUNSHIP_FALL_TELEPORT
@ SPELL_MELEE_TARGETING_ON_SKYBREAKER
@ SPELL_DESPERATE_RESOLVE
@ SPELL_MELEE_TARGETING_ON_ORGRIMS_HAMMER
@ SPELL_LOCK_PLAYERS_AND_TAP_CHEST
@ SPELL_ROCKET_PACK_DAMAGE
@ SPELL_TELEPORT_PLAYERS_ON_RESET_H
@ SPELL_BURNING_PITCH_DAMAGE_A
@ SPELL_ROCKET_ARTILLERY_A
@ SPELL_EXPLOSION_VICTORY
@ SPELL_CHECK_FOR_PLAYERS
@ SPELL_TELEPORT_PLAYERS_ON_RESET_A
@ SPELL_TELEPORT_PLAYERS_ON_VICTORY
@ SPELL_TELEPORT_TO_ENEMY_SHIP
@ SPELL_EJECT_ALL_PASSENGERS_BELOW_ZERO
@ SPELL_SHADOW_CHANNELING
@ SPELL_BURNING_PITCH_DAMAGE_H
SlotInfo const OrgrimsHammerSlotInfo[MAX_SLOTS]
Position const SkybreakerAddsSpawnPos
Position const OrgrimsHammerAddsSpawnPos
G3D::Vector3 const MuradinExitPath[MuradinExitPathSize]
void AddSC_boss_icecrown_gunship_battle()
uint32 const MuradinExitPathSize
Position const SkybreakerTeleportExit
@ EVENT_INTRO_SUMMON_ORGRIMS_HAMMER
@ EVENT_INTRO_SUMMON_SKYBREAKER
@ EVENT_KEEP_PLAYER_IN_COMBAT
uint32 GetTickNumber() const
SpellEffectInfo const & GetSpellEffectInfo() const
void PreventDefaultAction()
AuraObjectType GetType() const
HookList< EffectApplyHandler > AfterEffectRemove
HookList< EffectPeriodicHandler > OnEffectPeriodic
SpellInfo const * GetSpellInfo() const
WorldObject * GetOwner() const
HookList< EffectApplyHandler > AfterEffectApply
HookList< CheckAreaTargetHandler > DoCheckAreaTarget
HookList< CheckProcHandler > DoCheckProc
HookList< EffectApplyHandler > OnEffectRemove
void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Unit * GetUnitOwner() const
BattleExperienceEvent(Creature *creature)
bool Execute(uint64 timer, uint32) override
static uint32 const ExperiencedSpells[5]
static Milliseconds const ExperiencedTimes[5]
virtual void JustEngagedWith(Unit *)
virtual void JustDied(Unit *)
void SetHomePosition(float x, float y, float z, float o)
bool _IsTargetAcceptable(Unit const *target) const
bool HasReactState(ReactStates state) const
void SetReactState(ReactStates st)
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
void SetRegenerateHealth(bool value)
void SetTransportHomePosition(float x, float y, float z, float o)
bool CanStartAttack(Unit const *u, bool force) const
bool HasSpellFocus(Spell const *focusSpell=nullptr) const override
DelayedMovementEvent(Creature *owner, Position const &dest)
bool Execute(uint64, uint32) override
bool IsInPhase(PhaseIndex phase) const
void SetPhase(PhaseIndex phase)
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
void AddEvent(BasicEvent *event, Milliseconds e_time, bool set_addtime=true)
Milliseconds CalculateTime(Milliseconds t_offset) const
static T * Find(ObjectGuid guid)
virtual bool SetBossState(uint32 id, EncounterState state)
void DoCastSpellOnPlayers(uint32 spell, bool includePets=false, bool includeControlled=false)
virtual ObjectGuid GetGuidData(uint32 type) const override
EncounterState GetBossState(uint32 id) const
void SendEncounterUnit(EncounterFrameType type, Unit const *unit=nullptr, uint8 param1=0, uint8 param2=0)
void SetZoneMusic(uint32 zoneId, uint32 musicId)
void LaunchMoveSpline(std::function< void(Movement::MoveSplineInit &init)> &&initializer, uint32 id=0, MovementGeneratorPriority priority=MOTION_PRIORITY_NORMAL, MovementGeneratorType type=EFFECT_MOTION_TYPE)
static Creature * ToCreature(Object *o)
PackedGuid const & GetPackGUID() const
static ObjectGuid GetGUID(Object const *o)
static Player * ToPlayer(Object *o)
void ResetSlots(uint32 team)
void SetTransport(Transport *transport)
Position SelectSpawnPoint() const
bool SlotsNeedRefill(GunshipPassengerSlots first, GunshipPassengerSlots last) const
bool SummonCreatures(GunshipPassengerSlots first, GunshipPassengerSlots last)
void ClearSlot(GunshipPassengerSlots slot)
time_t _respawnCooldowns[MAX_SLOTS]
SlotInfo const * _slotInfo
Position const * _spawnPoint
ObjectGuid _controlledSlots[MAX_SLOTS]
PlayerMenu * PlayerTalkClass
ObjectGuid _otherTransport
ResetEncounterEvent(Unit *caster, uint32 spellId, ObjectGuid otherTransport)
bool Execute(uint64, uint32) override
int32 CalcValue(WorldObject const *caster=nullptr, int32 const *basePoints=nullptr) const
void AddCooldown(uint32 spellId, uint32 itemId, std::chrono::duration< Type, Period > cooldownDuration)
bool HasCooldown(SpellInfo const *spellInfo, uint32 itemId=0, bool ignoreCategoryCooldown=false) const
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
HookList< CastHandler > AfterCast
WorldLocation * GetHitDest() const
void SetEffectValue(int32 value)
HookList< HitHandler > AfterHit
HookList< EffectHandler > OnEffectHit
void PreventHitDefaultEffect(SpellEffIndex effIndex)
Unit * GetHitUnit() const
int32 GetEffectValue() const
HookList< EffectHandler > OnEffectHitTarget
HookList< ObjectTargetSelectHandler > OnObjectTargetSelect
HookList< CastHandler > OnCast
HookList< EffectHandler > OnEffectLaunchTarget
HookList< BeforeHitHandler > BeforeHit
HookList< EffectHandler > OnEffectLaunch
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
bool IsThreatListEmpty(bool includeOffline=false) const
void CalculatePassengerOffset(float &x, float &y, float &z, float *o=nullptr) const override
This method transforms supplied global coordinates into local offsets.
void EnableMovement(bool enabled)
TempSummon * SummonPassenger(uint32 entry, Position const &pos, TempSummonType summonType, SummonPropertiesEntry const *properties=nullptr, uint32 duration=0, Unit *summoner=nullptr, uint32 spellId=0, uint32 vehId=0)
Temporarily summons a creature as passenger on this transport.
void CalculatePassengerPosition(float &x, float &y, float &z, float *o=nullptr) const override
This method transforms supplied transport offsets into global coordinates.
void DoMeleeAttackIfReady()
virtual void InitializeAI()
virtual uint32 GetData(uint32) const
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
bool DoSpellAttackIfReady(uint32 spell)
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
SpellCastResult DoCast(uint32 spellId)
bool IsWithinMeleeRange(Unit const *obj) const
ThreatManager & GetThreatManager()
void SetControlled(bool apply, UnitState state)
MotionMaster * GetMotionMaster()
void RemoveNpcFlag(NPCFlags flags)
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
bool Attack(Unit *victim, bool meleeAttack)
void SetPower(Powers power, uint32 val, bool withPowerUpdate=true, bool force=false)
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
bool HasUnitState(const uint32 f) const
void SetFacingTo(float ori, bool force=true, uint32 movementId=EVENT_FACE)
SpellHistory * GetSpellHistory()
bool HealthBelowPctDamaged(int32 pct, uint32 damage) const
uint32 GetPower(Powers power) const
void CombatStop(bool includingCast=false, bool mutualPvP=true)
bool isAttackReady(WeaponAttackType type=BASE_ATTACK) const
void resetAttackTimer(WeaponAttackType type=BASE_ATTACK)
virtual void SendMessageToSet(WorldPacket const *data, bool self) const
InstanceScript * GetInstanceScript() const
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
void AddObjectToRemoveList()
virtual ObjectGuid GetTransGUID() const
Transport * GetTransport() const
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
MovementInfo m_movementInfo
virtual uint32 GetData(uint32) const
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
achievement_im_on_a_boat()
bool OnCheck(Player *, Unit *target) override
npc_gunship_boarding_add()
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
PrepareAuraScript(spell_igb_battle_experience_check)
bool CheckProc(ProcEventInfo &)
PrepareSpellScript(spell_igb_below_zero)
void RemovePassengers(SpellMissInfo missInfo)
void HandleDummy(SpellEffIndex effIndex)
void FilterTargets(std::list< WorldObject * > &targets)
PrepareSpellScript(spell_igb_burning_pitch_selector)
PrepareSpellScript(spell_igb_burning_pitch)
void HandleDummy(SpellEffIndex effIndex)
PrepareSpellScript(spell_igb_cannon_blast)
PrepareSpellScript(spell_igb_check_for_players)
void CountTargets(std::list< WorldObject * > &targets)
spell_igb_check_for_players()
void TeleportPlayer(SpellEffIndex)
void SelectTransport(WorldObject *&target)
PrepareSpellScript(spell_igb_gunship_fall_teleport)
void RelocateDest(SpellEffIndex)
void CalculateDamage(SpellEffIndex)
spell_igb_incinerating_blast()
PrepareSpellScript(spell_igb_incinerating_blast)
bool CheckAreaTarget(Unit *unit)
spell_igb_on_gunship_deck()
PrepareAuraScript(spell_igb_on_gunship_deck)
void HandleApply(AuraEffect const *, AuraEffectHandleModes)
void HandleRemove(AuraEffect const *, AuraEffectHandleModes)
void SendClientControl(uint8 value)
void HandleApply(AuraEffect const *, AuraEffectHandleModes)
PrepareAuraScript(spell_igb_overheat)
PrepareAuraScript(spell_igb_periodic_trigger_with_power_cost)
void HandlePeriodicTick(AuraEffect const *aurEff)
void DamageGunship(SpellEffIndex)
PrepareSpellScript(spell_igb_rocket_artillery_explosion)
void SelectRandomTarget(std::list< WorldObject * > &targets)
PrepareSpellScript(spell_igb_rocket_artillery)
void HandleScript(SpellEffIndex effIndex)
PrepareAuraScript(spell_igb_rocket_pack_useable)
bool CheckAreaTarget(Unit *target)
void HandleApply(AuraEffect const *, AuraEffectHandleModes)
void HandleRemove(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
PrepareAuraScript(spell_igb_rocket_pack)
void HandlePeriodic(AuraEffect const *)
void HandleRemove(AuraEffect const *aurEff, AuraEffectHandleModes)
void FilterTargets(std::list< WorldObject * > &targets)
PrepareSpellScript(spell_igb_teleport_players_on_victory)
PrepareSpellScript(spell_igb_teleport_to_enemy_ship)
void RelocateTransportOffset(SpellEffIndex)
@ SMSG_PLAYER_VEHICLE_DATA
@ SMSG_CLIENT_CONTROL_UPDATE
#define RegisterIcecrownCitadelCreatureAI(ai_name)
@ ACTION_ENEMY_GUNSHIP_TALK
@ DATA_ICECROWN_GUNSHIP_BATTLE
@ NPC_SKYBREAKER_SORCERER
@ NPC_IGB_MURADIN_BRONZEBEARD
@ NPC_SKYBREAKER_MORTAR_SOLDIER
@ NPC_KOR_KRON_BATTLE_MAGE
@ NPC_MARTYR_STALKER_IGB_SAURFANG
@ NPC_KOR_KRON_AXETHROWER
@ NPC_IGB_HIGH_OVERLORD_SAURFANG
@ NPC_SKYBREAKER_RIFLEMAN
@ NPC_SKYBREAKER_SERGEANT
TimePoint Now()
Current chrono steady_clock time point.
std::vector< Vector3 > PointsArray
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
static void VisitWorldObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
struct MovementInfo::TransportInfo transport
float GetPositionZ() const
float GetOrientation() const
void SetOrientation(float orientation)
float GetPositionX() const
void GetPosition(float &x, float &y) const
float GetPositionY() const
void RelocateOffset(Position const &offset)
void Relocate(float x, float y)
void AttackStart(Unit *) override
void AddThreat(Unit *victim, float amount, Unit *who=nullptr)
void TriggerBurningPitch()
gunship_npc_AI(Creature *creature)
void MovementInform(uint32 type, uint32 pointId) override
void EnterEvadeMode(EvadeReason) override
bool CanAIAttack(Unit const *target) const override
InstanceScript * Instance
void SetData(uint32 type, uint32 data) override
void JustDied(Unit *) override
void SetSlotInfo(uint32 index)
uint32 GetData(uint32 id) const override
std::map< ObjectGuid, uint32 > _shipVisits
npc_gunshipAI(Creature *creature)
void SetGUID(ObjectGuid const &guid, int32 id) override
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
void JustDied(Unit *) override
bool HasAttackablePlayerNearby()
void UpdateAI(uint32) override
void SetData(uint32 type, uint32 data) override
bool CanAIAttack(Unit const *target) const override
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
void MovementInform(uint32 type, uint32 pointId) override
bool _usedDesperateResolve
npc_gunship_boarding_addAI(Creature *creature)
npc_gunship_boarding_leader(Creature *creature)
void JustEngagedWith(Unit *target) override
void UpdateAI(uint32 diff) override
void PassengerBoarded(Unit *, int8, bool apply) override
== Fields =======================================
void OnCharmed(bool) override
npc_gunship_cannon(Creature *creature)
npc_gunship_gunner(Creature *creature)
void AttackStart(Unit *target) override
void MovementInform(uint32 type, uint32 pointId) override
void UpdateAI(uint32) override
npc_gunship_mage(Creature *creature)
void EnterEvadeMode(EvadeReason) override
void UpdateAI(uint32) override
bool CanAIAttack(Unit const *) const override
void MovementInform(uint32 type, uint32 pointId) override
void UpdateAI(uint32) override
npc_gunship_rocketeer(Creature *creature)
void MovementInform(uint32 type, uint32 pointId) override
InstanceScript * _instance
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
void SetData(uint32 type, uint32 data) override
void UpdateAI(uint32 diff) override
TimePoint _firstMageCooldown
PassengerController _controller
time_t _rocketeersYellCooldown
npc_high_overlord_saurfang_igb(Creature *creature)
bool CanAIAttack(Unit const *target) const override
void InitializeAI() override
void DoAction(int32 action) override
bool OnGossipSelect(Player *, uint32, uint32) override
time_t _axethrowersYellCooldown
void EnterEvadeMode(EvadeReason) override
void JustEngagedWith(Unit *) override
InstanceScript * _instance
bool OnGossipSelect(Player *, uint32, uint32) override
void UpdateAI(uint32 diff) override
npc_muradin_bronzebeard_igb(Creature *creature)
void DoAction(int32 action) override
TimePoint _firstMageCooldown
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
void EnterEvadeMode(EvadeReason) override
bool CanAIAttack(Unit const *target) const override
PassengerController _controller
void SetData(uint32 type, uint32 data) override
void InitializeAI() override
time_t _riflemanYellCooldown
time_t _mortarYellCooldown
void JustEngagedWith(Unit *) override
bool OnGossipSelect(Player *player, uint32, uint32) override
void UpdateAI(uint32) override
npc_zafod_boombox(Creature *creature)