mirror of
https://github.com/mod-playerbots/mod-playerbots
synced 2025-11-29 15:58:20 +08:00
514 lines
26 KiB
C++
514 lines
26 KiB
C++
/*
|
|
* Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license, you may redistribute it
|
|
* and/or modify it under version 2 of the License, or (at your option), any later version.
|
|
*/
|
|
|
|
#ifndef _PLAYERBOT_AIOBJECT_H
|
|
#define _PLAYERBOT_AIOBJECT_H
|
|
|
|
#include "Common.h"
|
|
#include "PlayerbotAIAware.h"
|
|
|
|
class AiObjectContext;
|
|
class ChatHelper;
|
|
class Player;
|
|
class PlayerbotAI;
|
|
|
|
class AiObject : public PlayerbotAIAware
|
|
{
|
|
public:
|
|
AiObject(PlayerbotAI* botAI);
|
|
|
|
protected:
|
|
Player* bot;
|
|
Player* GetMaster();
|
|
AiObjectContext* context;
|
|
ChatHelper* chat;
|
|
};
|
|
|
|
class AiNamedObject : public AiObject
|
|
{
|
|
public:
|
|
AiNamedObject(PlayerbotAI* botAI, std::string const name) : AiObject(botAI), name(name) {}
|
|
|
|
public:
|
|
virtual std::string const getName() { return name; }
|
|
|
|
protected:
|
|
std::string const name;
|
|
};
|
|
|
|
//
|
|
// TRIGGERS
|
|
//
|
|
|
|
#define NEXT_TRIGGERS(name, relevance) \
|
|
virtual NextAction* getNextAction() { return new NextAction(name, relevance); }
|
|
|
|
#define BEGIN_TRIGGER(clazz, super) \
|
|
class clazz : public super \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : super(botAI) {} \
|
|
bool IsActive() override;
|
|
|
|
#define END_TRIGGER() \
|
|
} \
|
|
;
|
|
|
|
#define BUFF_TRIGGER(clazz, spell) \
|
|
class clazz : public BuffTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : BuffTrigger(botAI, spell) {} \
|
|
}
|
|
|
|
#define BUFF_TRIGGER_A(clazz, spell) \
|
|
class clazz : public BuffTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : BuffTrigger(botAI, spell) {} \
|
|
bool IsActive() override; \
|
|
}
|
|
|
|
#define BUFF_PARTY_TRIGGER(clazz, spell) \
|
|
class clazz : public BuffOnPartyTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : BuffOnPartyTrigger(botAI, spell) {} \
|
|
}
|
|
|
|
#define BUFF_PARTY_TRIGGER_A(clazz, spell) \
|
|
class clazz : public BuffOnPartyTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : BuffOnPartyTrigger(botAI, spell) {} \
|
|
bool IsActive() override; \
|
|
}
|
|
|
|
#define DEBUFF_TRIGGER(clazz, spell) \
|
|
class clazz : public DebuffTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : DebuffTrigger(botAI, spell) {} \
|
|
}
|
|
|
|
#define DEBUFF_CHECKISOWNER_TRIGGER(clazz, spell) \
|
|
class clazz : public DebuffTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : DebuffTrigger(botAI, spell, 1, true) {} \
|
|
}
|
|
|
|
#define DEBUFF_TRIGGER_A(clazz, spell) \
|
|
class clazz : public DebuffTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : DebuffTrigger(botAI, spell) {} \
|
|
bool IsActive() override; \
|
|
}
|
|
|
|
#define DEBUFF_ENEMY_TRIGGER(clazz, spell) \
|
|
class clazz : public DebuffOnAttackerTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : DebuffOnAttackerTrigger(botAI, spell) {} \
|
|
}
|
|
|
|
#define DEBUFF_ENEMY_TRIGGER_A(clazz, spell) \
|
|
class clazz : public DebuffOnAttackerTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : DebuffOnAttackerTrigger(botAI, spell) {} \
|
|
bool IsActive() override; \
|
|
}
|
|
|
|
#define CURE_TRIGGER(clazz, spell, dispel) \
|
|
class clazz : public NeedCureTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : NeedCureTrigger(botAI, spell, dispel) {} \
|
|
}
|
|
|
|
#define CURE_PARTY_TRIGGER(clazz, spell, dispel) \
|
|
class clazz : public PartyMemberNeedCureTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : PartyMemberNeedCureTrigger(botAI, spell, dispel) {} \
|
|
}
|
|
|
|
#define CAN_CAST_TRIGGER(clazz, spell) \
|
|
class clazz : public SpellCanBeCastTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : SpellCanBeCastTrigger(botAI, spell) {} \
|
|
}
|
|
|
|
#define CAN_CAST_TRIGGER_A(clazz, spell) \
|
|
class clazz : public SpellCanBeCastTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : SpellCanBeCastTrigger(botAI, spell) {} \
|
|
bool IsActive() override; \
|
|
}
|
|
|
|
#define CD_TRIGGER(clazz, spell) \
|
|
class clazz : public SpellNoCooldownTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : SpellNoCooldownTrigger(botAI, spell) {} \
|
|
}
|
|
|
|
#define INTERRUPT_TRIGGER(clazz, spell) \
|
|
class clazz : public InterruptSpellTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : InterruptSpellTrigger(botAI, spell) {} \
|
|
}
|
|
|
|
#define INTERRUPT_TRIGGER_A(clazz, spell) \
|
|
class clazz : public InterruptSpellTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : InterruptSpellTrigger(botAI, spell) {} \
|
|
bool IsActive() override; \
|
|
}
|
|
|
|
#define HAS_AURA_TRIGGER(clazz, spell) \
|
|
class clazz : public HasAuraTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : HasAuraTrigger(botAI, spell) {} \
|
|
}
|
|
|
|
#define HAS_AURA_TRIGGER_A(clazz, spell) \
|
|
class clazz : public HasAuraTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : HasAuraTrigger(botAI, spell) {} \
|
|
bool IsActive() override; \
|
|
}
|
|
|
|
#define SNARE_TRIGGER(clazz, spell) \
|
|
class clazz : public SnareTargetTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : SnareTargetTrigger(botAI, spell) {} \
|
|
}
|
|
|
|
#define SNARE_TRIGGER_A(clazz, spell) \
|
|
class clazz : public SnareTargetTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : SnareTargetTrigger(botAI, spell) {} \
|
|
bool IsActive() override; \
|
|
}
|
|
|
|
#define PROTECT_TRIGGER(clazz, spell) \
|
|
class clazz : public ProtectPartyMemberTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : ProtectPartyMemberTrigger(botAI) {} \
|
|
}
|
|
|
|
#define DEFLECT_TRIGGER(clazz, spell) \
|
|
class clazz : public DeflectSpellTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : DeflectSpellTrigger(botAI, spell) {} \
|
|
}
|
|
|
|
#define BOOST_TRIGGER(clazz, spell) \
|
|
class clazz : public BoostTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : BoostTrigger(botAI, spell) {} \
|
|
}
|
|
|
|
#define BOOST_TRIGGER_A(clazz, spell) \
|
|
class clazz : public BoostTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : BoostTrigger(botAI, spell) {} \
|
|
bool IsActive() override; \
|
|
}
|
|
|
|
#define INTERRUPT_HEALER_TRIGGER(clazz, spell) \
|
|
class clazz : public InterruptEnemyHealerTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : InterruptEnemyHealerTrigger(botAI, spell) {} \
|
|
}
|
|
|
|
#define INTERRUPT_HEALER_TRIGGER_A(clazz, spell) \
|
|
class clazz : public InterruptEnemyHealerTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : InterruptEnemyHealerTrigger(botAI, spell) {} \
|
|
bool IsActive() override; \
|
|
}
|
|
|
|
#define CC_TRIGGER(clazz, spell) \
|
|
class clazz : public HasCcTargetTrigger \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : HasCcTargetTrigger(botAI, spell) {} \
|
|
}
|
|
|
|
//
|
|
// ACTIONS
|
|
//
|
|
|
|
#define MELEE_ACTION(clazz, spell) \
|
|
class clazz : public CastMeleeSpellAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CastMeleeSpellAction(botAI, spell) {} \
|
|
}
|
|
|
|
#define MELEE_ACTION_U(clazz, spell, useful) \
|
|
class clazz : public CastMeleeSpellAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CastMeleeSpellAction(botAI, spell) {} \
|
|
bool isUseful() override { return useful; } \
|
|
}
|
|
|
|
#define SPELL_ACTION(clazz, spell) \
|
|
class clazz : public CastSpellAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CastSpellAction(botAI, spell) {} \
|
|
}
|
|
|
|
#define SPELL_ACTION_U(clazz, spell, useful) \
|
|
class clazz : public CastSpellAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CastSpellAction(botAI, spell) {} \
|
|
bool isUseful() override { return useful; } \
|
|
}
|
|
|
|
#define HEAL_ACTION(clazz, spell) \
|
|
class clazz : public CastHealingSpellAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CastHealingSpellAction(botAI, spell) {} \
|
|
}
|
|
|
|
#define HEAL_ACTION_U(clazz, spell, useful) \
|
|
class clazz : public CastHealingSpellAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CastHealingSpellAction(botAI, spell) {} \
|
|
bool isUseful() override { return useful; } \
|
|
}
|
|
|
|
#define HEAL_PARTY_ACTION(clazz, spell, estAmount, manaEfficiency) \
|
|
class clazz : public HealPartyMemberAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : HealPartyMemberAction(botAI, spell, estAmount, manaEfficiency) {} \
|
|
}
|
|
|
|
#define AOE_HEAL_ACTION(clazz, spell, estAmount, manaEfficiency) \
|
|
class clazz : public CastAoeHealSpellAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CastAoeHealSpellAction(botAI, spell) {} \
|
|
}
|
|
|
|
#define BUFF_ACTION(clazz, spell) \
|
|
class clazz : public CastBuffSpellAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CastBuffSpellAction(botAI, spell) {} \
|
|
}
|
|
|
|
#define BUFF_ACTION_U(clazz, spell, useful) \
|
|
class clazz : public CastBuffSpellAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CastBuffSpellAction(botAI, spell) {} \
|
|
bool isUseful() override { return useful; } \
|
|
}
|
|
|
|
#define BUFF_PARTY_ACTION(clazz, spell) \
|
|
class clazz : public BuffOnPartyAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : BuffOnPartyAction(botAI, spell) {} \
|
|
}
|
|
|
|
#define CURE_ACTION(clazz, spell) \
|
|
class clazz : public CastCureSpellAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CastCureSpellAction(botAI, spell) {} \
|
|
}
|
|
|
|
#define CURE_PARTY_ACTION(clazz, spell, dispel) \
|
|
class clazz : public CurePartyMemberAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CurePartyMemberAction(botAI, spell, dispel) {} \
|
|
}
|
|
|
|
#define RESS_ACTION(clazz, spell) \
|
|
class clazz : public ResurrectPartyMemberAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : ResurrectPartyMemberAction(botAI, spell) {} \
|
|
}
|
|
|
|
#define DEBUFF_ACTION(clazz, spell) \
|
|
class clazz : public CastDebuffSpellAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CastDebuffSpellAction(botAI, spell) {} \
|
|
}
|
|
|
|
#define DEBUFF_CHECKISOWNER_ACTION(clazz, spell) \
|
|
class clazz : public CastDebuffSpellAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CastDebuffSpellAction(botAI, spell, true) {} \
|
|
}
|
|
|
|
#define DEBUFF_ACTION_U(clazz, spell, useful) \
|
|
class clazz : public CastDebuffSpellAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CastDebuffSpellAction(botAI, spell) {} \
|
|
bool isUseful() override { return useful; } \
|
|
}
|
|
|
|
#define DEBUFF_ACTION_R(clazz, spell, distance) \
|
|
class clazz : public CastDebuffSpellAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CastDebuffSpellAction(botAI, spell) { range = distance; } \
|
|
}
|
|
|
|
#define DEBUFF_ENEMY_ACTION(clazz, spell) \
|
|
class clazz : public CastDebuffSpellOnAttackerAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CastDebuffSpellOnAttackerAction(botAI, spell) {} \
|
|
}
|
|
|
|
#define REACH_ACTION(clazz, spell, range) \
|
|
class clazz : public CastReachTargetSpellAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CastReachTargetSpellAction(botAI, spell, range) {} \
|
|
}
|
|
|
|
#define REACH_ACTION_U(clazz, spell, range, useful) \
|
|
class clazz : public CastReachTargetSpellAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CastReachTargetSpellAction(botAI, spell, range) {} \
|
|
bool isUseful() override { return useful; } \
|
|
}
|
|
|
|
#define ENEMY_HEALER_ACTION(clazz, spell) \
|
|
class clazz : public CastSpellOnEnemyHealerAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CastSpellOnEnemyHealerAction(botAI, spell) {} \
|
|
}
|
|
|
|
#define SNARE_ACTION(clazz, spell) \
|
|
class clazz : public CastSnareSpellAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CastSnareSpellAction(botAI, spell) {} \
|
|
}
|
|
|
|
#define CC_ACTION(clazz, spell) \
|
|
class clazz : public CastCrowdControlSpellAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CastCrowdControlSpellAction(botAI, spell) {} \
|
|
}
|
|
|
|
#define PROTECT_ACTION(clazz, spell) \
|
|
class clazz : public CastProtectSpellAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CastProtectSpellAction(botAI, spell) {} \
|
|
}
|
|
|
|
#define END_RANGED_SPELL_ACTION() \
|
|
} \
|
|
;
|
|
|
|
#define BEGIN_SPELL_ACTION(clazz, name) \
|
|
class clazz : public CastSpellAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CastSpellAction(botAI, name) {}
|
|
|
|
#define END_SPELL_ACTION() \
|
|
} \
|
|
;
|
|
|
|
#define BEGIN_DEBUFF_ACTION(clazz, name) \
|
|
class clazz : public CastDebuffSpellAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CastDebuffSpellAction(botAI, name) {}
|
|
|
|
#define BEGIN_RANGED_SPELL_ACTION(clazz, name) \
|
|
class clazz : public CastSpellAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CastSpellAction(botAI, name) {}
|
|
|
|
#define BEGIN_MELEE_SPELL_ACTION(clazz, name) \
|
|
class clazz : public CastMeleeSpellAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : CastMeleeSpellAction(botAI, name) {}
|
|
|
|
#define END_RANGED_SPELL_ACTION() \
|
|
} \
|
|
;
|
|
|
|
#define BEGIN_BUFF_ON_PARTY_ACTION(clazz, name) \
|
|
class clazz : public BuffOnPartyAction \
|
|
{ \
|
|
public: \
|
|
clazz(PlayerbotAI* botAI) : BuffOnPartyAction(botAI, name) {}
|
|
|
|
//
|
|
// Action node
|
|
//
|
|
|
|
// node_name , action, prerequisite
|
|
#define ACTION_NODE_P(name, spell, pre) \
|
|
static ActionNode* name(PlayerbotAI* botAI) \
|
|
{ \
|
|
return new ActionNode(spell, /*P*/ NextAction::array(0, new NextAction(pre), nullptr), /*A*/ nullptr, \
|
|
/*C*/ nullptr); \
|
|
}
|
|
|
|
// node_name , action, alternative
|
|
#define ACTION_NODE_A(name, spell, alt) \
|
|
static ActionNode* name(PlayerbotAI* botAI) \
|
|
{ \
|
|
return new ActionNode(spell, /*P*/ nullptr, /*A*/ NextAction::array(0, new NextAction(alt), nullptr), \
|
|
/*C*/ nullptr); \
|
|
}
|
|
|
|
// node_name , action, continuer
|
|
#define ACTION_NODE_C(name, spell, con) \
|
|
static ActionNode* name(PlayerbotAI* botAI) \
|
|
{ \
|
|
return new ActionNode(spell, /*P*/ nullptr, /*A*/ nullptr, \
|
|
/*C*/ NextAction::array(0, new NextAction(con), nullptr)); \
|
|
}
|
|
|
|
#endif
|