mirror of
https://github.com/liyunfan1223/mod-playerbots.git
synced 2026-06-20 15:39:25 +02:00
<!--
Thank you for contributing to mod-playerbots, please make sure that
you...
1. Submit your PR to the test-staging branch, not master.
2. Read the guidelines below before submitting.
3. Don't delete parts of this template.
DESIGN PHILOSOPHY: We prioritize STABILITY, PERFORMANCE, AND
PREDICTABILITY over behavioral realism.
Every action and decision executes PER BOT AND PER TRIGGER. Small
increases in logic complexity scale
poorly across thousands of bots and negatively affect all. We prioritize
a stable system over a smarter
one. Bots don't need to behave perfectly; believable behavior is the
goal, not human simulation.
Default behavior must be cheap in processing; expensive behavior must be
opt-in.
Before submitting, make sure your changes aligns with these principles.
-->
## Pull Request Description
<!-- Describe what this change does and why it is needed -->
Pull strategy migration from cmangos for tank specializations
## How to Test the Changes
<!--
- Step-by-step instructions to test the change.
- Any required setup (e.g. multiple players, number of bots, specific
configuration).
- Expected behavior and how to verify it.
-->
1. Invite bot tank
2. Use `reset boAI` or `nc +pull,+pull back` + `co +pull,+pull back`
3. Order bot to pull using command `pull my target` or `pull rti target`
4. Bot should run to mob, use ranged skill and back to point where he
started pull
Without `pull back` strategy bot run to mob, use ranged skill and wait
on mob until he come to bot
## Impact Assessment
<!-- As a generic test, before and after measure of pmon (playerbot pmon
tick) can help you here. -->
- Does this change increase per-bot/per-tick processing or risk scaling
poorly with thousands of bots?
- - [x] No, not at all
- - [ ] Minimal impact (**explain below**)
- - [ ] Moderate impact (**explain below**)
- Does this change modify default bot behavior?
- - [x] No
- - [ ] Yes (**explain why**)
- Does this change add new decision branches or increase maintenance
complexity?
- - [x] No
- - [ ] Yes (**explain below**)
## AI Assistance
<!--
AI assistance is allowed, but all submitted code must be fully
understood, reviewed, and owned by the contributor.
We expect contributors to be honest about what they do and do not
understand.
-->
Was AI assistance used while working on this change?
- - [ ] No
- - [x] Yes (**explain below**)
<!--
If yes, please specify:
- Purpose of usage (e.g. brainstorming, refactoring, documentation, code
generation).
- Which parts of the change were influenced or generated, and whether it
was thoroughly reviewed.
-->
Help with migration and solving some problems
<!--
TRANSLATIONS:
Anything new that the bots say in chat must be in a translatable format.
This is done using GetBotTextOrDefault,
which you can search for in the codebase to find examples. Your code
needs to have English as the default fallback,
while the full translations need to be in an SQL update file. The
languages in the file are the nine language
options supported by AzerothCore: English, Korean, French, German,
Chinese, Taiwanese, Spanish, Spanish Mexico, and
Russian. See
data/sql/playerbots/updates/2025_12_27_ai_playerbot_fishing_text.sql as
an example of a translation SQL
update, whose content are called within the codebase at
src/strategy/actions/FishingAction.cpp
-->
## Final Checklist
- - [x] Stability is not compromised.
- - [x] Performance impact is understood, tested, and acceptable.
- - [x] Added logic complexity is justified and explained.
- - [x] Any new bot dialogue lines are translated.
- - [ ] Documentation updated if needed (Conf comments, WiKi commands).
## Notes for Reviewers
<!-- Anything else that's helpful to review or test your pull request.
-->
Stability test after randomize new bots
<img width="465" height="172" alt="obraz"
src="https://github.com/user-attachments/assets/6e39a8c0-f23b-47cc-852a-71fa98044a31"
/>
---------
Co-authored-by: Keleborn <22352763+Celandriel@users.noreply.github.com>
456 lines
31 KiB
C++
456 lines
31 KiB
C++
/*
|
|
* Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU AGPL v3 license, you may redistribute it
|
|
* and/or modify it under version 3 of the License, or (at your option), any later version.
|
|
*/
|
|
|
|
#ifndef _PLAYERBOT_TRIGGERCONTEXT_H
|
|
#define _PLAYERBOT_TRIGGERCONTEXT_H
|
|
|
|
#include "CureTriggers.h"
|
|
#include "FishingTriggers.h"
|
|
#include "GenericTriggers.h"
|
|
#include "GuildTriggers.h"
|
|
#include "LfgTriggers.h"
|
|
#include "LootTriggers.h"
|
|
#include "NamedObjectContext.h"
|
|
#include "NewRpgStrategy.h"
|
|
#include "NewRpgTriggers.h"
|
|
#include "PvpTriggers.h"
|
|
#include "PullTriggers.h"
|
|
#include "RpgTriggers.h"
|
|
#include "RtiTriggers.h"
|
|
#include "StuckTriggers.h"
|
|
#include "TravelTriggers.h"
|
|
#include "WaitForAttackTriggers.h"
|
|
|
|
class PlayerbotAI;
|
|
|
|
class TriggerContext : public NamedObjectContext<Trigger>
|
|
{
|
|
public:
|
|
TriggerContext()
|
|
{
|
|
creators["return"] = &TriggerContext::_return;
|
|
creators["sit"] = &TriggerContext::sit;
|
|
creators["return to stay position"] = &TriggerContext::return_to_stay_position;
|
|
creators["collision"] = &TriggerContext::collision;
|
|
|
|
creators["timer"] = &TriggerContext::Timer;
|
|
creators["timer bg"] = &TriggerContext::TimerBG;
|
|
creators["random"] = &TriggerContext::Random;
|
|
creators["seldom"] = &TriggerContext::seldom;
|
|
creators["often"] = &TriggerContext::often;
|
|
creators["very often"] = &TriggerContext::very_often;
|
|
|
|
creators["target critical health"] = &TriggerContext::TargetCriticalHealth;
|
|
|
|
creators["critical health"] = &TriggerContext::CriticalHealth;
|
|
creators["low health"] = &TriggerContext::LowHealth;
|
|
creators["medium health"] = &TriggerContext::MediumHealth;
|
|
creators["almost full health"] = &TriggerContext::AlmostFullHealth;
|
|
|
|
creators["low mana"] = &TriggerContext::LowMana;
|
|
creators["medium mana"] = &TriggerContext::MediumMana;
|
|
creators["high mana"] = &TriggerContext::HighMana;
|
|
creators["almost full mana"] = &TriggerContext::AlmostFullMana;
|
|
creators["enough mana"] = &TriggerContext::EnoughMana;
|
|
|
|
creators["party member critical health"] = &TriggerContext::PartyMemberCriticalHealth;
|
|
creators["party member low health"] = &TriggerContext::PartyMemberLowHealth;
|
|
creators["party member medium health"] = &TriggerContext::PartyMemberMediumHealth;
|
|
creators["party member almost full health"] = &TriggerContext::PartyMemberAlmostFullHealth;
|
|
|
|
creators["generic boost"] = &TriggerContext::generic_boost;
|
|
creators["loss of control"] = &TriggerContext::loss_of_control;
|
|
creators["fear charm sleep"] = &TriggerContext::fear_charm_sleep;
|
|
creators["fear sleep sap"] = &TriggerContext::fear_sleep_sap;
|
|
|
|
creators["protect party member"] = &TriggerContext::protect_party_member;
|
|
|
|
creators["light rage available"] = &TriggerContext::LightRageAvailable;
|
|
creators["medium rage available"] = &TriggerContext::MediumRageAvailable;
|
|
creators["high rage available"] = &TriggerContext::HighRageAvailable;
|
|
|
|
creators["light energy available"] = &TriggerContext::LightEnergyAvailable;
|
|
creators["medium energy available"] = &TriggerContext::MediumEnergyAvailable;
|
|
creators["high energy available"] = &TriggerContext::HighEnergyAvailable;
|
|
creators["almost full energy available"] = &TriggerContext::AlmostFullEnergyAvailable;
|
|
|
|
creators["loot available"] = &TriggerContext::LootAvailable;
|
|
creators["no attackers"] = &TriggerContext::NoAttackers;
|
|
creators["no target"] = &TriggerContext::NoTarget;
|
|
creators["target in sight"] = &TriggerContext::TargetInSight;
|
|
creators["not dps target active"] = &TriggerContext::not_dps_target_active;
|
|
creators["not dps aoe target active"] = &TriggerContext::not_dps_aoe_target_active;
|
|
creators["has nearest adds"] = &TriggerContext::has_nearest_adds;
|
|
creators["enemy player near"] = &TriggerContext::enemy_player_near;
|
|
|
|
creators["tank assist"] = &TriggerContext::TankAssist;
|
|
creators["lose aggro"] = &TriggerContext::LoseAggro;
|
|
creators["has aggro"] = &TriggerContext::HasAggro;
|
|
|
|
creators["light aoe"] = &TriggerContext::LightAoe;
|
|
creators["medium aoe"] = &TriggerContext::MediumAoe;
|
|
creators["high aoe"] = &TriggerContext::HighAoe;
|
|
|
|
creators["healer should attack"] = &TriggerContext::healer_should_attack;
|
|
creators["medium aoe and healer should attack"] = &TriggerContext::medium_aoe_and_healer_should_attack;
|
|
|
|
creators["has area debuff"] = &TriggerContext::HasAreaDebuff;
|
|
|
|
creators["enemy out of melee"] = &TriggerContext::EnemyOutOfMelee;
|
|
creators["enemy out of spell"] = &TriggerContext::EnemyOutOfSpell;
|
|
creators["enemy too close for spell"] = &TriggerContext::enemy_too_close_for_spell;
|
|
creators["enemy too close for shoot"] = &TriggerContext::enemy_too_close_for_shoot;
|
|
creators["enemy too close for auto shot"] = &TriggerContext::enemy_too_close_for_auto_shot;
|
|
creators["enemy too close for melee"] = &TriggerContext::enemy_too_close_for_melee;
|
|
creators["enemy is close"] = &TriggerContext::enemy_is_close;
|
|
creators["enemy within melee"] = &TriggerContext::enemy_within_melee;
|
|
creators["party member to heal out of spell range"] = &TriggerContext::party_member_to_heal_out_of_spell_range;
|
|
|
|
creators["combo points 5 available"] = &TriggerContext::ComboPoints5Available;
|
|
creators["combo points 4 available"] = &TriggerContext::ComboPoints4Available;
|
|
creators["combo points 3 available"] = &TriggerContext::ComboPoints3Available;
|
|
creators["target with combo points almost dead"] = &TriggerContext::target_with_combo_points_almost_dead;
|
|
creators["combo points not full"] = &TriggerContext::ComboPointsNotFull;
|
|
creators["combo points not full and high energy"] = &TriggerContext::ComboPointsNotFullAndHighEnergy;
|
|
|
|
creators["being attacked"] = &TriggerContext::BeingAttacked;
|
|
creators["medium threat"] = &TriggerContext::MediumThreat;
|
|
creators["low tank threat"] = &TriggerContext::low_tank_threat;
|
|
|
|
creators["dead"] = &TriggerContext::Dead;
|
|
creators["corpse near"] = &TriggerContext::corpse_near;
|
|
creators["party member dead"] = &TriggerContext::PartyMemberDead;
|
|
creators["combat party member dead"] = &TriggerContext::CombatPartyMemberDead;
|
|
creators["no pet"] = &TriggerContext::no_pet;
|
|
creators["has pet"] = &TriggerContext::has_pet;
|
|
creators["pet attack"] = &TriggerContext::pet_attack;
|
|
|
|
creators["has attackers"] = &TriggerContext::has_attackers;
|
|
creators["no possible targets"] = &TriggerContext::no_possible_targets;
|
|
creators["possible adds"] = &TriggerContext::possible_adds;
|
|
creators["pull start"] = &TriggerContext::pull_start;
|
|
creators["pull end"] = &TriggerContext::pull_end;
|
|
creators["return to pull position"] = &TriggerContext::return_to_pull_position;
|
|
|
|
creators["no drink"] = &TriggerContext::no_drink;
|
|
creators["no food"] = &TriggerContext::no_food;
|
|
|
|
creators["panic"] = &TriggerContext::panic;
|
|
creators["outnumbered"] = &TriggerContext::outnumbered;
|
|
creators["behind target"] = &TriggerContext::behind_target;
|
|
creators["not behind target"] = &TriggerContext::not_behind_target;
|
|
creators["not facing target"] = &TriggerContext::not_facing_target;
|
|
creators["far from master"] = &TriggerContext::far_from_master;
|
|
creators["far from loot target"] = &TriggerContext::far_from_loot_target;
|
|
creators["can loot"] = &TriggerContext::can_loot;
|
|
creators["swimming"] = &TriggerContext::swimming;
|
|
creators["target changed"] = &TriggerContext::target_changed;
|
|
|
|
creators["critical aoe heal"] = &TriggerContext::critical_aoe_heal;
|
|
creators["low aoe heal"] = &TriggerContext::low_aoe_heal;
|
|
creators["medium aoe heal"] = &TriggerContext::medium_aoe_heal;
|
|
creators["almost full aoe heal"] = &TriggerContext::almost_full_aoe_heal;
|
|
|
|
creators["group heal setting"] = &TriggerContext::group_heal_occasion;
|
|
creators["medium group heal setting"] = &TriggerContext::medium_group_heal_occasion;
|
|
creators["invalid target"] = &TriggerContext::invalid_target;
|
|
creators["lfg proposal active"] = &TriggerContext::lfg_proposal_active;
|
|
|
|
creators["unknown dungeon"] = &TriggerContext::unknown_dungeon;
|
|
|
|
creators["random bot update"] = &TriggerContext::random_bot_update_trigger;
|
|
creators["no non bot players around"] = &TriggerContext::no_non_bot_players_around;
|
|
creators["new player nearby"] = &TriggerContext::new_player_nearby;
|
|
creators["no rpg target"] = &TriggerContext::no_rpg_target;
|
|
creators["has rpg target"] = &TriggerContext::has_rpg_target;
|
|
creators["far from rpg target"] = &TriggerContext::far_from_rpg_target;
|
|
creators["near rpg target"] = &TriggerContext::near_rpg_target;
|
|
creators["no travel target"] = &TriggerContext::no_travel_target;
|
|
creators["far from travel target"] = &TriggerContext::far_from_travel_target;
|
|
creators["no rti target"] = &TriggerContext::no_rti;
|
|
|
|
creators["give food"] = &TriggerContext::give_food;
|
|
creators["give water"] = &TriggerContext::give_water;
|
|
|
|
creators["bg waiting"] = &TriggerContext::bg_waiting;
|
|
creators["bg active"] = &TriggerContext::bg_active;
|
|
creators["bg invite active"] = &TriggerContext::bg_invite_active;
|
|
creators["inside bg"] = &TriggerContext::inside_bg;
|
|
creators["player has no flag"] = &TriggerContext::player_has_no_flag;
|
|
creators["player has flag"] = &TriggerContext::player_has_flag;
|
|
creators["team has flag"] = &TriggerContext::team_has_flag;
|
|
creators["enemy team has flag"] = &TriggerContext::enemy_team_has_flag;
|
|
creators["enemy flagcarrier near"] = &TriggerContext::enemy_flagcarrier_near;
|
|
creators["in Battleground"] = &TriggerContext::player_is_in_BATTLEGROUND;
|
|
creators["in Battleground without flag"] = &TriggerContext::player_is_in_BATTLEGROUND_no_flag;
|
|
creators["wants in bg"] = &TriggerContext::player_wants_in_bg;
|
|
creators["alliance no snowfall gy"] = &TriggerContext::alliance_no_snowfall_gy;
|
|
|
|
creators["mounted"] = &TriggerContext::mounted;
|
|
|
|
// move to/enter dark portal if near
|
|
creators["near dark portal"] = &TriggerContext::near_dark_portal;
|
|
creators["at dark portal azeroth"] = &TriggerContext::at_dark_portal_azeroth;
|
|
creators["at dark portal outland"] = &TriggerContext::at_dark_portal_outland;
|
|
|
|
creators["vehicle near"] = &TriggerContext::vehicle_near;
|
|
creators["in vehicle"] = &TriggerContext::in_vehicle;
|
|
|
|
creators["need world buff"] = &TriggerContext::need_world_buff;
|
|
creators["falling"] = &TriggerContext::falling;
|
|
creators["falling far"] = &TriggerContext::falling_far;
|
|
creators["move stuck"] = &TriggerContext::move_stuck;
|
|
creators["move long stuck"] = &TriggerContext::move_long_stuck;
|
|
creators["combat stuck"] = &TriggerContext::combat_stuck;
|
|
creators["combat long stuck"] = &TriggerContext::combat_long_stuck;
|
|
|
|
creators["petition signed"] = &TriggerContext::petition_signed;
|
|
creators["buy tabard"] = &TriggerContext::buy_tabard;
|
|
creators["leave large guild"] = &TriggerContext::leave_large_guild;
|
|
|
|
creators["rpg"] = &TriggerContext::rpg;
|
|
creators["rpg taxi"] = &TriggerContext::rpg_taxi;
|
|
creators["rpg discover"] = &TriggerContext::rpg_discover;
|
|
creators["rpg start quest"] = &TriggerContext::rpg_start_quest;
|
|
creators["rpg end quest"] = &TriggerContext::rpg_end_quest;
|
|
creators["rpg buy"] = &TriggerContext::rpg_buy;
|
|
creators["rpg sell"] = &TriggerContext::rpg_sell;
|
|
creators["rpg repair"] = &TriggerContext::rpg_repair;
|
|
creators["rpg train"] = &TriggerContext::rpg_train;
|
|
creators["rpg heal"] = &TriggerContext::rpg_heal;
|
|
creators["rpg home bind"] = &TriggerContext::rpg_home_bind;
|
|
creators["rpg queue bg"] = &TriggerContext::rpg_queue_bg;
|
|
creators["rpg buy petition"] = &TriggerContext::rpg_buy_petition;
|
|
creators["rpg use"] = &TriggerContext::rpg_use;
|
|
creators["rpg spell"] = &TriggerContext::rpg_spell;
|
|
creators["rpg craft"] = &TriggerContext::rpg_craft;
|
|
creators["rpg trade useful"] = &TriggerContext::rpg_trade_useful;
|
|
creators["rpg duel"] = &TriggerContext::rpg_duel;
|
|
creators["go grind status"] = &TriggerContext::go_grind_status;
|
|
creators["go camp status"] = &TriggerContext::go_camp_status;
|
|
creators["wander random status"] = &TriggerContext::wander_random_status;
|
|
creators["wander npc status"] = &TriggerContext::wander_npc_status;
|
|
creators["do quest status"] = &TriggerContext::do_quest_status;
|
|
creators["travel flight status"] = &TriggerContext::travel_flight_status;
|
|
creators["outdoor pvp status"] = &TriggerContext::outdoor_pvp_status;
|
|
creators["can self resurrect"] = &TriggerContext::can_self_resurrect;
|
|
creators["can fish"] = &TriggerContext::can_fish;
|
|
creators["can use fishing bobber"] = &TriggerContext::can_use_fishing_bobber;
|
|
creators["new pet"] = &TriggerContext::new_pet;
|
|
creators["wait for attack safe distance"] = &TriggerContext::wait_for_attack_safe_distance;
|
|
}
|
|
|
|
private:
|
|
static Trigger* give_food(PlayerbotAI* botAI) { return new GiveFoodTrigger(botAI); }
|
|
static Trigger* give_water(PlayerbotAI* botAI) { return new GiveWaterTrigger(botAI); }
|
|
static Trigger* no_rti(PlayerbotAI* botAI) { return new NoRtiTrigger(botAI); }
|
|
static Trigger* _return(PlayerbotAI* botAI) { return new ReturnTrigger(botAI); }
|
|
static Trigger* return_to_stay_position(PlayerbotAI* ai) { return new ReturnToStayPositionTrigger(ai); }
|
|
static Trigger* sit(PlayerbotAI* botAI) { return new SitTrigger(botAI); }
|
|
static Trigger* far_from_rpg_target(PlayerbotAI* botAI) { return new FarFromRpgTargetTrigger(botAI); }
|
|
static Trigger* near_rpg_target(PlayerbotAI* botAI) { return new NearRpgTargetTrigger(botAI); }
|
|
static Trigger* far_from_travel_target(PlayerbotAI* botAI) { return new FarFromTravelTargetTrigger(botAI); }
|
|
static Trigger* no_travel_target(PlayerbotAI* botAI) { return new NoTravelTargetTrigger(botAI); }
|
|
static Trigger* no_rpg_target(PlayerbotAI* botAI) { return new NoRpgTargetTrigger(botAI); }
|
|
static Trigger* has_rpg_target(PlayerbotAI* botAI) { return new HasRpgTargetTrigger(botAI); }
|
|
static Trigger* collision(PlayerbotAI* botAI) { return new CollisionTrigger(botAI); }
|
|
static Trigger* lfg_proposal_active(PlayerbotAI* botAI) { return new LfgProposalActiveTrigger(botAI); }
|
|
static Trigger* unknown_dungeon(PlayerbotAI* botAI) { return new UnknownDungeonTrigger(botAI); }
|
|
static Trigger* invalid_target(PlayerbotAI* botAI) { return new InvalidTargetTrigger(botAI); }
|
|
static Trigger* critical_aoe_heal(PlayerbotAI* botAI)
|
|
{
|
|
return new AoeHealTrigger(botAI, "critical aoe heal", "critical", 2);
|
|
}
|
|
static Trigger* low_aoe_heal(PlayerbotAI* botAI) { return new AoeHealTrigger(botAI, "low aoe heal", "low", 2); }
|
|
static Trigger* medium_aoe_heal(PlayerbotAI* botAI)
|
|
{
|
|
return new AoeHealTrigger(botAI, "medium aoe heal", "medium", 2);
|
|
}
|
|
static Trigger* almost_full_aoe_heal(PlayerbotAI* botAI)
|
|
{
|
|
return new AoeHealTrigger(botAI, "almost full aoe heal", "almost full", 2);
|
|
}
|
|
static Trigger* group_heal_occasion(PlayerbotAI* ai)
|
|
{
|
|
return new AoeInGroupTrigger(ai, "group heal setting", "almost full");
|
|
}
|
|
static Trigger* medium_group_heal_occasion(PlayerbotAI* ai)
|
|
{
|
|
return new AoeInGroupTrigger(ai, "medium group heal setting", "medium");
|
|
}
|
|
static Trigger* target_changed(PlayerbotAI* botAI) { return new TargetChangedTrigger(botAI); }
|
|
static Trigger* swimming(PlayerbotAI* botAI) { return new IsSwimmingTrigger(botAI); }
|
|
static Trigger* no_possible_targets(PlayerbotAI* botAI) { return new NoPossibleTargetsTrigger(botAI); }
|
|
static Trigger* possible_adds(PlayerbotAI* botAI) { return new PossibleAddsTrigger(botAI); }
|
|
static Trigger* pull_start(PlayerbotAI* botAI) { return new PullStartTrigger(botAI); }
|
|
static Trigger* pull_end(PlayerbotAI* botAI) { return new PullEndTrigger(botAI); }
|
|
static Trigger* return_to_pull_position(PlayerbotAI* botAI) { return new ReturnToPullPositionTrigger(botAI); }
|
|
static Trigger* can_loot(PlayerbotAI* botAI) { return new CanLootTrigger(botAI); }
|
|
static Trigger* far_from_loot_target(PlayerbotAI* botAI) { return new FarFromCurrentLootTrigger(botAI); }
|
|
static Trigger* far_from_master(PlayerbotAI* botAI) { return new FarFromMasterTrigger(botAI); }
|
|
static Trigger* behind_target(PlayerbotAI* botAI) { return new IsBehindTargetTrigger(botAI); }
|
|
static Trigger* not_behind_target(PlayerbotAI* botAI) { return new IsNotBehindTargetTrigger(botAI); }
|
|
static Trigger* not_facing_target(PlayerbotAI* botAI) { return new IsNotFacingTargetTrigger(botAI); }
|
|
static Trigger* panic(PlayerbotAI* botAI) { return new PanicTrigger(botAI); }
|
|
static Trigger* outnumbered(PlayerbotAI* botAI) { return new OutNumberedTrigger(botAI); }
|
|
static Trigger* no_drink(PlayerbotAI* botAI) { return new NoDrinkTrigger(botAI); }
|
|
static Trigger* no_food(PlayerbotAI* botAI) { return new NoFoodTrigger(botAI); }
|
|
static Trigger* LightAoe(PlayerbotAI* botAI) { return new LightAoeTrigger(botAI); }
|
|
static Trigger* MediumAoe(PlayerbotAI* botAI) { return new MediumAoeTrigger(botAI); }
|
|
static Trigger* HighAoe(PlayerbotAI* botAI) { return new HighAoeTrigger(botAI); }
|
|
static Trigger* healer_should_attack(PlayerbotAI* botAI) { return new HealerShouldAttackTrigger(botAI); }
|
|
static Trigger* medium_aoe_and_healer_should_attack(PlayerbotAI* botAI) { return new TwoTriggers(botAI, "medium aoe", "healer should attack"); }
|
|
static Trigger* HasAreaDebuff(PlayerbotAI* botAI) { return new HasAreaDebuffTrigger(botAI); }
|
|
static Trigger* LoseAggro(PlayerbotAI* botAI) { return new LoseAggroTrigger(botAI); }
|
|
static Trigger* HasAggro(PlayerbotAI* botAI) { return new HasAggroTrigger(botAI); }
|
|
static Trigger* LowHealth(PlayerbotAI* botAI) { return new LowHealthTrigger(botAI); }
|
|
static Trigger* MediumHealth(PlayerbotAI* botAI) { return new MediumHealthTrigger(botAI); }
|
|
static Trigger* AlmostFullHealth(PlayerbotAI* botAI) { return new AlmostFullHealthTrigger(botAI); }
|
|
static Trigger* CriticalHealth(PlayerbotAI* botAI) { return new CriticalHealthTrigger(botAI); }
|
|
static Trigger* TargetCriticalHealth(PlayerbotAI* botAI) { return new TargetCriticalHealthTrigger(botAI); }
|
|
static Trigger* LowMana(PlayerbotAI* botAI) { return new LowManaTrigger(botAI); }
|
|
static Trigger* MediumMana(PlayerbotAI* botAI) { return new MediumManaTrigger(botAI); }
|
|
static Trigger* HighMana(PlayerbotAI* botAI) { return new HighManaTrigger(botAI); }
|
|
static Trigger* AlmostFullMana(PlayerbotAI* botAI) { return new AlmostFullManaTrigger(botAI); }
|
|
static Trigger* EnoughMana(PlayerbotAI* botAI) { return new EnoughManaTrigger(botAI); }
|
|
static Trigger* LightRageAvailable(PlayerbotAI* botAI) { return new LightRageAvailableTrigger(botAI); }
|
|
static Trigger* MediumRageAvailable(PlayerbotAI* botAI) { return new MediumRageAvailableTrigger(botAI); }
|
|
static Trigger* HighRageAvailable(PlayerbotAI* botAI) { return new HighRageAvailableTrigger(botAI); }
|
|
static Trigger* LightEnergyAvailable(PlayerbotAI* botAI) { return new LightEnergyAvailableTrigger(botAI); }
|
|
static Trigger* MediumEnergyAvailable(PlayerbotAI* botAI) { return new MediumEnergyAvailableTrigger(botAI); }
|
|
static Trigger* HighEnergyAvailable(PlayerbotAI* botAI) { return new HighEnergyAvailableTrigger(botAI); }
|
|
static Trigger* AlmostFullEnergyAvailable(PlayerbotAI* botAI) { return new EnergyAvailable(botAI, 90); }
|
|
static Trigger* LootAvailable(PlayerbotAI* botAI) { return new LootAvailableTrigger(botAI); }
|
|
static Trigger* NoAttackers(PlayerbotAI* botAI) { return new NoAttackersTrigger(botAI); }
|
|
static Trigger* TankAssist(PlayerbotAI* botAI) { return new TankAssistTrigger(botAI); }
|
|
static Trigger* Timer(PlayerbotAI* botAI) { return new TimerTrigger(botAI); }
|
|
static Trigger* TimerBG(PlayerbotAI* botAI) { return new TimerBGTrigger(botAI); }
|
|
static Trigger* NoTarget(PlayerbotAI* botAI) { return new NoTargetTrigger(botAI); }
|
|
static Trigger* TargetInSight(PlayerbotAI* botAI) { return new TargetInSightTrigger(botAI); }
|
|
static Trigger* not_dps_target_active(PlayerbotAI* botAI) { return new NotDpsTargetActiveTrigger(botAI); }
|
|
static Trigger* not_dps_aoe_target_active(PlayerbotAI* botAI) { return new NotDpsAoeTargetActiveTrigger(botAI); }
|
|
static Trigger* has_nearest_adds(PlayerbotAI* botAI) { return new HasNearestAddsTrigger(botAI); }
|
|
static Trigger* enemy_player_near(PlayerbotAI* botAI) { return new EnemyPlayerNear(botAI); }
|
|
static Trigger* Random(PlayerbotAI* botAI) { return new RandomTrigger(botAI, "random", 20); }
|
|
static Trigger* seldom(PlayerbotAI* botAI) { return new RandomTrigger(botAI, "seldom", 300); }
|
|
static Trigger* often(PlayerbotAI* botAI) { return new RandomTrigger(botAI, "often", 5); }
|
|
static Trigger* very_often(PlayerbotAI* botAI) { return new RandomTrigger(botAI, "often", 3); }
|
|
static Trigger* EnemyOutOfMelee(PlayerbotAI* botAI) { return new EnemyOutOfMeleeTrigger(botAI); }
|
|
static Trigger* EnemyOutOfSpell(PlayerbotAI* botAI) { return new EnemyOutOfSpellRangeTrigger(botAI); }
|
|
static Trigger* enemy_too_close_for_spell(PlayerbotAI* botAI) { return new EnemyTooCloseForSpellTrigger(botAI); }
|
|
static Trigger* enemy_too_close_for_auto_shot(PlayerbotAI* botAI)
|
|
{
|
|
return new EnemyTooCloseForAutoShotTrigger(botAI);
|
|
}
|
|
static Trigger* enemy_too_close_for_shoot(PlayerbotAI* botAI) { return new EnemyTooCloseForShootTrigger(botAI); }
|
|
static Trigger* enemy_too_close_for_melee(PlayerbotAI* botAI) { return new EnemyTooCloseForMeleeTrigger(botAI); }
|
|
static Trigger* enemy_is_close(PlayerbotAI* botAI) { return new EnemyIsCloseTrigger(botAI); }
|
|
static Trigger* enemy_within_melee(PlayerbotAI* botAI) { return new EnemyWithinMeleeTrigger(botAI); }
|
|
static Trigger* party_member_to_heal_out_of_spell_range(PlayerbotAI* botAI)
|
|
{
|
|
return new PartyMemberToHealOutOfSpellRangeTrigger(botAI);
|
|
}
|
|
static Trigger* ComboPoints5Available(PlayerbotAI* botAI) { return new ComboPointsAvailableTrigger(botAI, 5); }
|
|
static Trigger* ComboPoints4Available(PlayerbotAI* botAI) { return new ComboPointsAvailableTrigger(botAI, 4); }
|
|
static Trigger* ComboPoints3Available(PlayerbotAI* botAI) { return new ComboPointsAvailableTrigger(botAI, 3); }
|
|
static Trigger* target_with_combo_points_almost_dead(PlayerbotAI* ai)
|
|
{
|
|
return new TargetWithComboPointsLowerHealTrigger(ai, 3, 3.0f);
|
|
}
|
|
static Trigger* ComboPointsNotFull(PlayerbotAI* botAI) { return new ComboPointsNotFullTrigger(botAI); }
|
|
static Trigger* ComboPointsNotFullAndHighEnergy(PlayerbotAI* botAI) { return new TwoTriggers(botAI, "combo points not full", "high energy available"); }
|
|
static Trigger* BeingAttacked(PlayerbotAI* botAI) { return new BeingAttackedTrigger(botAI); }
|
|
static Trigger* MediumThreat(PlayerbotAI* botAI) { return new MediumThreatTrigger(botAI); }
|
|
static Trigger* low_tank_threat(PlayerbotAI* botAI) { return new LowTankThreatTrigger(botAI); }
|
|
// static Trigger* MediumThreat(PlayerbotAI* botAI) { return new MediumThreatTrigger(botAI); }
|
|
static Trigger* Dead(PlayerbotAI* botAI) { return new DeadTrigger(botAI); }
|
|
static Trigger* corpse_near(PlayerbotAI* botAI) { return new CorpseNearTrigger(botAI); }
|
|
static Trigger* PartyMemberDead(PlayerbotAI* botAI) { return new PartyMemberDeadTrigger(botAI); }
|
|
static Trigger* CombatPartyMemberDead(PlayerbotAI* botAI) { return new CombatPartyMemberDeadTrigger(botAI); }
|
|
static Trigger* PartyMemberLowHealth(PlayerbotAI* botAI) { return new PartyMemberLowHealthTrigger(botAI); }
|
|
static Trigger* PartyMemberMediumHealth(PlayerbotAI* botAI) { return new PartyMemberMediumHealthTrigger(botAI); }
|
|
static Trigger* PartyMemberAlmostFullHealth(PlayerbotAI* botAI)
|
|
{
|
|
return new PartyMemberAlmostFullHealthTrigger(botAI);
|
|
}
|
|
static Trigger* generic_boost(PlayerbotAI* botAI) { return new GenericBoostTrigger(botAI); }
|
|
static Trigger* loss_of_control(PlayerbotAI* botAI) { return new LossOfControlTrigger(botAI); }
|
|
static Trigger* fear_charm_sleep(PlayerbotAI* botAI) { return new FearCharmSleepTrigger(botAI); }
|
|
static Trigger* fear_sleep_sap(PlayerbotAI* botAI) { return new FearSleepSapTrigger(botAI); }
|
|
static Trigger* PartyMemberCriticalHealth(PlayerbotAI* botAI)
|
|
{
|
|
return new PartyMemberCriticalHealthTrigger(botAI);
|
|
}
|
|
static Trigger* protect_party_member(PlayerbotAI* botAI) { return new ProtectPartyMemberTrigger(botAI); }
|
|
static Trigger* no_pet(PlayerbotAI* botAI) { return new NoPetTrigger(botAI); }
|
|
static Trigger* has_pet(PlayerbotAI* botAI) { return new HasPetTrigger(botAI); }
|
|
static Trigger* pet_attack(PlayerbotAI* botAI) { return new PetAttackTrigger(botAI); }
|
|
static Trigger* has_attackers(PlayerbotAI* botAI) { return new HasAttackersTrigger(botAI); }
|
|
static Trigger* random_bot_update_trigger(PlayerbotAI* botAI) { return new RandomBotUpdateTrigger(botAI); }
|
|
static Trigger* no_non_bot_players_around(PlayerbotAI* botAI) { return new NoNonBotPlayersAroundTrigger(botAI); }
|
|
static Trigger* new_player_nearby(PlayerbotAI* botAI) { return new NewPlayerNearbyTrigger(botAI); }
|
|
static Trigger* bg_waiting(PlayerbotAI* botAI) { return new BgWaitingTrigger(botAI); }
|
|
static Trigger* bg_active(PlayerbotAI* botAI) { return new BgActiveTrigger(botAI); }
|
|
static Trigger* bg_invite_active(PlayerbotAI* botAI) { return new BgInviteActiveTrigger(botAI); }
|
|
static Trigger* inside_bg(PlayerbotAI* botAI) { return new InsideBGTrigger(botAI); }
|
|
static Trigger* player_has_no_flag(PlayerbotAI* botAI) { return new PlayerHasNoFlag(botAI); }
|
|
static Trigger* player_has_flag(PlayerbotAI* botAI) { return new PlayerHasFlag(botAI); }
|
|
static Trigger* team_has_flag(PlayerbotAI* botAI) { return new TeamHasFlag(botAI); }
|
|
static Trigger* enemy_team_has_flag(PlayerbotAI* botAI) { return new EnemyTeamHasFlag(botAI); }
|
|
static Trigger* enemy_flagcarrier_near(PlayerbotAI* botAI) { return new EnemyFlagCarrierNear(botAI); }
|
|
static Trigger* player_is_in_BATTLEGROUND(PlayerbotAI* botAI) { return new PlayerIsInBattleground(botAI); }
|
|
static Trigger* player_is_in_BATTLEGROUND_no_flag(PlayerbotAI* botAI) { return new PlayerIsInBattlegroundWithoutFlag(botAI); }
|
|
static Trigger* alliance_no_snowfall_gy(PlayerbotAI* botAI) { return new AllianceNoSnowfallGY(botAI); }
|
|
static Trigger* mounted(PlayerbotAI* botAI) { return new IsMountedTrigger(botAI); }
|
|
static Trigger* at_dark_portal_outland(PlayerbotAI* botAI) { return new AtDarkPortalOutlandTrigger(botAI); }
|
|
static Trigger* at_dark_portal_azeroth(PlayerbotAI* botAI) { return new AtDarkPortalAzerothTrigger(botAI); }
|
|
static Trigger* in_vehicle(PlayerbotAI* botAI) { return new InVehicleTrigger(botAI); }
|
|
static Trigger* vehicle_near(PlayerbotAI* botAI) { return new VehicleNearTrigger(botAI); }
|
|
static Trigger* near_dark_portal(PlayerbotAI* botAI) { return new NearDarkPortalTrigger(botAI); }
|
|
static Trigger* need_world_buff(PlayerbotAI* botAI) { return new NeedWorldBuffTrigger(botAI); }
|
|
static Trigger* falling(PlayerbotAI* botAI) { return new IsFallingTrigger(botAI); }
|
|
static Trigger* falling_far(PlayerbotAI* botAI) { return new IsFallingFarTrigger(botAI); }
|
|
static Trigger* move_stuck(PlayerbotAI* botAI) { return new MoveStuckTrigger(botAI); }
|
|
static Trigger* move_long_stuck(PlayerbotAI* botAI) { return new MoveLongStuckTrigger(botAI); }
|
|
static Trigger* combat_stuck(PlayerbotAI* botAI) { return new CombatStuckTrigger(botAI); }
|
|
static Trigger* combat_long_stuck(PlayerbotAI* botAI) { return new CombatLongStuckTrigger(botAI); }
|
|
static Trigger* player_wants_in_bg(PlayerbotAI* botAI) { return new PlayerWantsInBattlegroundTrigger(botAI); }
|
|
static Trigger* petition_signed(PlayerbotAI* botAI) { return new PetitionTurnInTrigger(botAI); }
|
|
static Trigger* buy_tabard(PlayerbotAI* botAI) { return new BuyTabardTrigger(botAI); }
|
|
static Trigger* leave_large_guild(PlayerbotAI* botAI) { return new LeaveLargeGuildTrigger(botAI); }
|
|
static Trigger* rpg(PlayerbotAI* botAI) { return new RpgTrigger(botAI); }
|
|
static Trigger* rpg_taxi(PlayerbotAI* botAI) { return new RpgTaxiTrigger(botAI); }
|
|
static Trigger* rpg_discover(PlayerbotAI* botAI) { return new RpgDiscoverTrigger(botAI); }
|
|
static Trigger* rpg_start_quest(PlayerbotAI* botAI) { return new RpgStartQuestTrigger(botAI); }
|
|
static Trigger* rpg_end_quest(PlayerbotAI* botAI) { return new RpgEndQuestTrigger(botAI); }
|
|
static Trigger* rpg_buy(PlayerbotAI* botAI) { return new RpgBuyTrigger(botAI); }
|
|
static Trigger* rpg_sell(PlayerbotAI* botAI) { return new RpgSellTrigger(botAI); }
|
|
static Trigger* rpg_repair(PlayerbotAI* botAI) { return new RpgRepairTrigger(botAI); }
|
|
static Trigger* rpg_train(PlayerbotAI* botAI) { return new RpgTrainTrigger(botAI); }
|
|
static Trigger* rpg_heal(PlayerbotAI* botAI) { return new RpgHealTrigger(botAI); }
|
|
static Trigger* rpg_home_bind(PlayerbotAI* botAI) { return new RpgHomeBindTrigger(botAI); }
|
|
static Trigger* rpg_queue_bg(PlayerbotAI* botAI) { return new RpgQueueBGTrigger(botAI); }
|
|
static Trigger* rpg_buy_petition(PlayerbotAI* botAI) { return new RpgBuyPetitionTrigger(botAI); }
|
|
static Trigger* rpg_use(PlayerbotAI* botAI) { return new RpgUseTrigger(botAI); }
|
|
static Trigger* rpg_spell(PlayerbotAI* botAI) { return new RpgUseTrigger(botAI); }
|
|
static Trigger* rpg_craft(PlayerbotAI* botAI) { return new RpgCraftTrigger(botAI); }
|
|
static Trigger* rpg_trade_useful(PlayerbotAI* botAI) { return new RpgTradeUsefulTrigger(botAI); }
|
|
static Trigger* rpg_duel(PlayerbotAI* botAI) { return new RpgDuelTrigger(botAI); }
|
|
static Trigger* go_grind_status(PlayerbotAI* botAI) { return new NewRpgStatusTrigger(botAI, RPG_GO_GRIND); }
|
|
static Trigger* go_camp_status(PlayerbotAI* botAI) { return new NewRpgStatusTrigger(botAI, RPG_GO_CAMP); }
|
|
static Trigger* wander_random_status(PlayerbotAI* botAI) { return new NewRpgStatusTrigger(botAI, RPG_WANDER_RANDOM); }
|
|
static Trigger* wander_npc_status(PlayerbotAI* botAI) { return new NewRpgStatusTrigger(botAI, RPG_WANDER_NPC); }
|
|
static Trigger* do_quest_status(PlayerbotAI* botAI) { return new NewRpgStatusTrigger(botAI, RPG_DO_QUEST); }
|
|
static Trigger* travel_flight_status(PlayerbotAI* botAI) { return new NewRpgStatusTrigger(botAI, RPG_TRAVEL_FLIGHT); }
|
|
static Trigger* outdoor_pvp_status(PlayerbotAI* botAI) { return new NewRpgStatusTrigger(botAI, RPG_OUTDOOR_PVP); }
|
|
static Trigger* can_self_resurrect(PlayerbotAI* ai) { return new SelfResurrectTrigger(ai); }
|
|
static Trigger* can_fish(PlayerbotAI* ai) { return new CanFishTrigger(ai); }
|
|
static Trigger* can_use_fishing_bobber(PlayerbotAI* ai) { return new CanUseFishingBobberTrigger(ai); }
|
|
static Trigger* new_pet(PlayerbotAI* ai) { return new NewPetTrigger(ai); }
|
|
static Trigger* wait_for_attack_safe_distance(PlayerbotAI* ai) { return new WaitForAttackSafeDistanceTrigger(ai); }
|
|
};
|
|
|
|
#endif
|