128 { 1465.3872f, 3283.8604f, 137.69096f },
129 { 1431.401f, 3264.001f, 136.02579f },
130 { 1397.2067f, 3276.5618f, 133.84508f },
131 { 1441.566f, 3232.8013f, 135.01802f },
132 { 1403.632f, 3229.1094f, 132.14877f },
133 { 1347.1927f, 3286.5842f, 131.94803f },
134 { 1365.1865f, 3338.9502f, 128.57233f },
135 { 1349.6024f, 3315.0574f, 130.97443f },
136 { 1335.4618f, 3344.019f, 130.42047f },
137 { 1360.1198f, 3378.02f, 127.34183f },
138 { 1435.8524f, 3355.6423f, 173.77744f },
139 { 1432.7031f, 3385.1572f, 184.4187f },
140 { 1452.6094f, 3373.3315f, 187.0402f },
141 { 1426.7778f, 3364.7517f, 184.39569f },
142 { 1450.3646f, 3361.264f, 184.42484f },
196 float currentDist = 1000.0f;
200 if (dist >= currentDist)
203 currentPosition = pos;
415 std::list<Creature*> traineeList;
420 for (
Creature* trainee : traineeList)
421 trainee->HandleEmoteCommand(emote);
632 me->GetMotionMaster()->MovePoint(POINT_RANDOM_DEST, me->GetFirstCollisionPosition(40.0f, orientation));
736 { 1410.2014f, 3598.6494f, 89.59319f },
737 { 1456.201f, 3568.265f, 88.39075f },
738 { 1383.158f, 3595.447f, 90.3155f },
739 { 1367.333f, 3594.927f, 88.89806f },
740 { 1350.278f, 3588.938f, 89.17908f }
782 if (!amberleafScamp1 || !amberleafScamp2 || !amberleafScamp3 || !amberleafScamp5)
798 if (!amberleafScamp4)
858 Unit* summoner = me->ToTempSummon()->GetSummonerUnit();
863 summoner->RemoveAurasDueToSpell(SPELL_SUMMON_CART_DRIVER);
864 PhasingHandler::OnConditionChange(summoner);
926 { 1196.72f, 3492.85f, 90.9836f },
927 { 1192.29f, 3478.69f, 108.788f },
928 { 1197.99f, 3460.63f, 103.04f }
1310template<u
int32 CurseSpellID>
1321 if (!player->
HasAura(CurseSpellID))
1322 player->
CastSpell(player, CurseSpellID);
1499 .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
1500 .TriggeringAura = aurEff
1570 if (data.Entry == entry)
First const & RAND(First const &first, Second const &second, Rest const &... rest)
T GetEntry(std::unordered_map< uint32, T > const &map, CriteriaTreeEntry const *tree)
std::chrono::seconds Seconds
Seconds shorthand typedef.
std::optional< T > Optional
Optional helper class to wrap optional values within.
@ QUEST_STATUS_INCOMPLETE
#define RegisterCreatureAI(ai_name)
#define RegisterGameObjectAI(ai_name)
#define RegisterSpellScript(spell_script)
@ TARGET_DEST_NEARBY_ENTRY
@ EMOTE_ONESHOT_MONKOFFENSE_ATTACKUNARMEDOFF
@ EMOTE_ONESHOT_MONKOFFENSE_PARRYUNARMED
@ EMOTE_STATE_READY_UNARMED
@ EMOTE_ONESHOT_PALMSTRIKE
@ EMOTE_STATE_MONKOFFENSE_READYUNARMED
@ EMOTE_ONESHOT_MONKOFFENSE_SPECIALUNARMED
@ EMOTE_ONESHOT_MONKOFFENSE_ATTACKUNARMED
@ SPELL_EFFECT_SCRIPT_EFFECT
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_CONTROL_VEHICLE
@ SPELL_AURA_PERIODIC_DUMMY
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
@ TRIGGERED_FULL_MASK
Used when doing CastSpell with triggered == true.
@ TRIGGERED_IGNORE_CAST_IN_PROGRESS
Will not check if a current cast is in progress.
@ TRIGGERED_DONT_REPORT_CAST_ERROR
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
#define SpellEffectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define SpellDestinationTargetSelectFn(F, I, N)
#define AuraEffectRemoveFn(F, I, N, M)
@ UNIT_FLAG_NON_ATTACKABLE_2
void PreventDefaultAction()
HookList< EffectApplyHandler > AfterEffectRemove
HookList< EffectPeriodicHandler > OnEffectPeriodic
HookList< EffectApplyHandler > OnEffectRemove
ObjectGuid const & GetGUID() const
virtual void EnterEvadeMode(EvadeReason why=EvadeReason::Other)
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
void SetImmuneToPC(bool apply) override
void SetReactState(ReactStates st)
GuidUnorderedSet const & GetTapList() const
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
void InitializeReactState()
bool IsInEvadeMode() const
void Repeat(Milliseconds time)
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
void CancelEvent(uint32 eventId)
GameObjectAI(GameObject *go, uint32 scriptId={}) noexcept
void DespawnOrUnsummon(Milliseconds delay=0ms, Seconds forceRespawnTime=0s)
void MoveRandom(float wanderDistance=0.0f, Optional< Milliseconds > duration={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::ForceWalk, MovementSlot slot=MOTION_SLOT_DEFAULT, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={}, Optional< MovementFadeObject > fadeObject={}, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
void MovePath(uint32 pathId, bool repeatable, Optional< Milliseconds > duration={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< std::pair< Milliseconds, Milliseconds > > waitTimeRangeAtPathEnd={}, Optional< float > wanderDistanceAtPathEnds={}, Optional< bool > followPathBackwardsFromEndToStart={}, Optional< bool > exactSplinePath={}, bool generatePath=true, Optional< MovementFadeObject > fadeObject={}, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
static ObjectGuid const Empty
virtual bool hasQuest(uint32) const
static bool OnConditionChange(WorldObject *object, bool updateVisibility=true)
void KilledMonsterCredit(uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
QuestStatus GetQuestStatus(uint32 quest_id) const
void FailQuest(uint32 quest_id)
uint32 GetQuestId() const
HuojinTraineePartnerSearch(Creature *partner)
bool operator()(Creature const *target)
TushuiTraineeSearch(Creature *leader, float maxDist)
bool operator()(Creature const *target) const
bool OnExit(Player *player, AreaTriggerEntry const *) override
bool OnTrigger(Player *player, AreaTriggerEntry const *) override
bool OnExit(Player *player, AreaTriggerEntry const *) override
at_inside_of_cave_of_meditation()
bool OnTrigger(Player *player, AreaTriggerEntry const *) override
bool OnTrigger(Player *player, AreaTriggerEntry const *) override
at_min_dimwind_captured()
bool Validate(SpellInfo const *) override
void PeriodicTick(AuraEffect const *aurEff)
static constexpr Position PlayerJumpPos
void SetDest(SpellDestination &dest) const
bool Validate(SpellInfo const *) override
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
void HandleHitTarget(SpellEffIndex)
bool Validate(SpellInfo const *) override
void HandleScript(SpellEffIndex) const
void HandleEffectPeriodic(AuraEffect const *)
void OnRemoveVehicle(AuraEffect const *, AuraEffectHandleModes) const
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
HookList< DestinationTargetSelectHandler > OnDestinationTargetSelect
int32 GetEffectValueAsInt() const
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
TaskContext & Schedule(TaskScheduler::duration_t time, TaskScheduler::task_handler_t task)
TaskContext & Repeat(TaskScheduler::duration_t duration)
TaskScheduler & CancelAll()
TaskScheduler & Schedule(duration_t time, task_handler_t task)
TaskScheduler & Update()
Update the scheduler to the current time.
Unit * GetSummonerUnit() const
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
virtual void DoAction(int32 param)
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
SpellCastResult DoCast(uint32 spellId)
void CombatStop(bool includingCast=false, bool mutualPvP=true, bool(*unitFilter)(Unit const *otherUnit)=nullptr)
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
void SetStandState(UnitStandStateType state, uint32 animKitID=0)
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
MotionMaster * GetMotionMaster()
void SetFacingToObject(WorldObject const *object, bool force=true)
TempSummon * ToTempSummon()
void SetUninteractible(bool apply)
void SetEmoteState(Emote emote)
bool HealthBelowPctDamaged(float pct, uint32 damage) const
void SetSpeedRate(UnitMoveType mtype, float rate)
void SetFacingTo(float const ori, bool force=true)
bool HasUnitState(const uint32 f) const
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
void HandleEmoteCommand(Emote emoteId, Player *target=nullptr, Trinity::IteratorPair< int32 const * > spellVisualKitIds={}, int32 sequenceVariation=0)
void SetUnitFlag(UnitFlags flags)
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
void RemoveUnitFlag(UnitFlags flags)
Creature * FindNearestCreatureWithOptions(float range, FindCreatureOptions const &options) const
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
float GetDistance(WorldObject const *obj) const
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
static constexpr uint32 CartSingingPools
static constexpr uint32 CartVehicleForest
static constexpr uint32 CartForest
static constexpr uint32 MasterLiFeiCombat
static constexpr uint32 CartVehicleFarmstead
static constexpr uint32 CartFarmstead
static constexpr uint32 MasterLiFei
static constexpr uint32 CartVehicleSingingPools
static constexpr int8 YakCartPathStart
static constexpr int8 YakCartRopes
static constexpr uint32 CartSingingPools
static constexpr uint32 CartFarmstead
static constexpr uint32 CartForest
static constexpr int8 NodeForestCartRemovePassenger
static constexpr int8 NodeCartRemovePassenger
static constexpr uint32 TheSourceOfLivelihood
static constexpr uint32 OnlyTheWorthyShallPass
static constexpr uint32 TheSpiritAndBodyOfShenzinsu
static constexpr uint32 NewAllies
static constexpr uint32 TrainingBellPoleExitExclusion
static constexpr uint32 RideVehiclePole
static constexpr uint32 FireCrashCover
static constexpr uint32 EjectPassengers
static constexpr uint32 CurseOfTheTurtle
static constexpr uint32 CurseOfTheCrane
static constexpr uint32 FireCrashPhaseShift
static constexpr uint32 FlyingShadowKick
static constexpr uint32 CurseOfTheFrog
static constexpr uint32 FeetOfFury
static constexpr uint32 FireCrashInvis
static constexpr uint32 CurseOfTheCrocodile
static constexpr uint32 OxCartRopeLeft
static constexpr uint32 FlyingShadowKickJump
static constexpr uint32 FeetOfFuryDamage
static constexpr uint32 ForceVehicleRide
static constexpr uint32 CurseOfTheSkunk
static constexpr uint32 LiFeiDefeat
@ PATH_CAVE_OF_MEDITATION
static constexpr CartData CartDataTable[]
static CartData GetCartData(uint32 entry)
Emote constexpr TraineeEmotes[5]
@ SPELL_UPDATE_PHASE_SHIFT_DEMON_CREATOR
@ QUEST_THE_MISSING_DRIVER
@ SPELL_SUMMON_CART_DRIVER
@ SPELL_FORCE_SUMMON_CART_DRIVER
@ SPELL_SERVERSIDE_DRIVER_CREDIT
@ NPC_HUOJIN_TRAINEE_FEMALE
@ NPC_HUOJIN_TRAINEE_MALE
@ NPC_TUSHUI_TRAINEE_MALE
@ NPC_TUSHUI_TRAINEE_FEMALE
@ SPELL_HAWK_DIVING_TO_EARTH
@ SPELL_EJECT_ALL_PASSENGERS
@ SPELL_BABY_ELEPHANT_TAKES_A_BATH
@ SPELL_CSA_AREATRIGGER_DUMMY
@ SPELL_FORCE_SUMMONER_TO_RIDE
@ SPELL_HAWK_DIVING_TO_EARTH_DMG
@ SPELL_SERVERSIDE_KILL_CREDIT
@ ACTION_PARTNER_ENTERED_COMBAT
Position const TraineeEndpoints[]
@ SPELL_SUMMON_AMBERLEAF_TROUBLEMAKER
@ QUEST_THE_WAY_OF_THE_TUSHUI
@ ACTION_START_MEDITATION
@ SPELL_CAVE_OF_SCROLLS_CREDIT
@ SPELL_SUMMON_MASTER_LI_FEI
@ SPELL_AYSA_CAVE_OF_SCROLLS_COMP
@ ACTION_FINISH_MEDITATION
@ SAY_AYSA_FINISH_MEDITATION
@ SPELL_MEDITATION_TIMER_BAR
void HandleEmoteNearbyTushuiTrainees(Creature *leader, Emote emote)
constexpr Position aysaJumpPos[3]
@ SPELL_FLAME_SPOUT_VISUAL
constexpr Position amberleafPos[5]
auto SelectRandomContainerElement(C const &container) -> std::add_const_t< decltype(*std::ranges::begin(container))> &
static void VisitGridObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
constexpr void SetOrientation(float orientation)
float GetExactDist(float x, float y, float z) const
float GetAbsoluteAngle(float x, float y) const
constexpr float GetOrientation() const
ScriptedAI(Creature *creature, uint32 scriptId=0) noexcept
Optional< uint32 > CreditNPC
Optional< uint32 > QuestId
Optional< uint32 > YakNPC
Optional< uint8 > EjectNodeId
bool OnGossipHello(Player *) override
void JustReachedHome() override
void MovementInform(uint32 type, uint32 id) override
void UpdateAI(uint32 diff) override
npc_aysa_cloudsinger_cave_of_meditation(Creature *creature)
void DoAction(int32 action) override
void UpdateAI(uint32 diff) override
void WaypointPathEnded(uint32, uint32 pathId) override
npc_aysa_cloudsinger_summon(Creature *creature)
void UpdateAI(uint32 diff) override
void IsSummonedBy(WorldObject *summoner) override
void MovementInform(uint32 type, uint32 pointId) override
void WaypointReached(uint32 nodeId, uint32) override
npc_delivery_cart(Creature *creature)
void UpdateAI(uint32 diff) override
void PassengerBoarded(Unit *passenger, int8, bool apply) override
== Fields =======================================
void WaypointPathEnded(uint32, uint32) override
void BeginSparringDelayed(ObjectGuid partnerGuid)
void DoAction(int32 action) override
void JustEngagedWith(Unit *attacker) override
void JustReachedHome() override
Creature * GetNewPartner() const
void BeginSparring(ObjectGuid guid)
void JustAppeared() override
npc_huojin_trainee(Creature *creature)
void JustAppeared() override
npc_instructor_zhi(Creature *creature)
void UpdateAI(uint32 diff) override
void IsSummonedBy(WorldObject *summonerWO) override
void JustAppeared() override
void MovementInform(uint32 type, uint32 pointId) override
void UpdateAI(uint32 diff) override
void SpellHitTarget(WorldObject *target, SpellInfo const *spellInfo) override
void JustReachedHome() override
void JustEngagedWith(Unit *) override
void SpellHitTarget(WorldObject *target, SpellInfo const *spellInfo) override
void OnHealthDepleted(Unit *attacker, bool) override
void UpdateAI(uint32 diff) override
void KilledUnit(Unit *victim) override
npc_li_fei_combat(Creature *creature)
void UpdateAI(uint32 diff) override
void DamageTaken(Unit *attacker, uint32 &damage, DamageEffectType, SpellInfo const *) override
void JustEngagedWith(Unit *) override
void OnQuestAccept(Player *player, Quest const *quest) override
npc_li_fei(Creature *creature)
void IsSummonedBy(WorldObject *summoner) override
void UpdateAI(uint32 diff) override
npc_master_li_fei_summon(Creature *creature)
void IsSummonedBy(WorldObject *summoner) override
void WaypointReached(uint32 waypointId, uint32 pathId) override
void UpdateAI(uint32 diff) override
npc_tushui_huojin_trainee(Creature *creature)
void EnterEvadeMode(EvadeReason why) override
void DamageTaken(Unit *attacker, uint32 &damage, DamageEffectType, SpellInfo const *) override
void MovementInform(uint32 type, uint32 id) override
void JustEngagedWith(Unit *) override
Emote PlayRandomEmote() const
void UpdateAI(uint32 diff) override
void ScheduleEmoteExecution()
void JustEngagedWith(Unit *attacker) override
void JustReachedHome() override
npc_tushui_leading_trainee(Creature *creature)
void JustAppeared() override
void Relocate(Position const &pos)
void AddSC_zone_the_wandering_isle()