#pragma once #include "TargetGoal.h" #include "../../Entities/EntitySelector.h" class NearestAttackableTargetGoal; // Anonymous class from NearestAttackableTargetGoal class SubselectEntitySelector : public EntitySelector { private: EntitySelector* m_subselector; NearestAttackableTargetGoal* m_parent; public: SubselectEntitySelector(NearestAttackableTargetGoal* parent, EntitySelector* subselector); ~SubselectEntitySelector(); bool matches(std::shared_ptr entity) const; }; class NearestAttackableTargetGoal : public TargetGoal { friend class SubselectEntitySelector; public: class DistComp { private: Entity* source; public: DistComp(Entity* source); bool operator()(std::shared_ptr e1, std::shared_ptr e2); }; private: const std::type_info& targetType; int randomInterval; DistComp* distComp; EntitySelector* selector; std::weak_ptr target; public: NearestAttackableTargetGoal(PathfinderMob* mob, const std::type_info& targetType, int randomInterval, bool mustSee, bool mustReach = false, EntitySelector* entitySelector = NULL); virtual ~NearestAttackableTargetGoal(); virtual bool canUse(); void start(); };