/* * Copyright (C) 2016+ AzerothCore , 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. */ #pragma once #include "Action.h" #include "Common.h" class PlayerbotAI; class Unit; class Trigger : public AiNamedObject { public: Trigger( PlayerbotAI* botAI, const std::string name = "trigger", int32_t checkInterval = 1 ); virtual ~Trigger() {} virtual Event Check(); virtual void ExternalEvent([[maybe_unused]] std::string const param, [[maybe_unused]] Player* owner = nullptr) {} virtual void ExternalEvent([[maybe_unused]] WorldPacket& packet, [[maybe_unused]] Player* owner = nullptr) {} virtual bool IsActive() { return false; } virtual std::vector getHandlers() { return {}; } void Update() {} virtual void Reset() {} virtual Unit* GetTarget(); virtual Value* GetTargetValue(); virtual std::string const GetTargetName() { return "self target"; } bool needCheck(uint32 now); protected: int32_t checkInterval; uint32_t lastCheckTime; }; class TriggerNode { public: TriggerNode( const std::string& name, std::vector handlers = {} ) : trigger(nullptr), handlers(std::move(handlers)), name(name) {} Trigger* getTrigger() { return trigger; } void setTrigger(Trigger* trigger) { this->trigger = trigger; } const std::string getName() { return name; } std::vector getHandlers() { std::vector result = this->handlers; if (trigger != nullptr) { std::vector extra = trigger->getHandlers(); result.insert(result.end(), extra.begin(), extra.end()); } return result; } float getFirstRelevance() { if (this->handlers.size() > 0) return this->handlers[0].getRelevance(); return -1; } private: Trigger* trigger; std::vector handlers; const std::string name; };