#ifndef _PLAYERBOT_NEWRPGBASEACTION_H #define _PLAYERBOT_NEWRPGBASEACTION_H #include "Duration.h" #include "LastMovementValue.h" #include "MovementActions.h" #include "NewRpgInfo.h" #include "NewRpgStrategy.h" #include "Object.h" #include "ObjectDefines.h" #include "ObjectGuid.h" #include "PlayerbotAI.h" #include "QuestDef.h" #include "TravelMgr.h" struct POIInfo { G3D::Vector2 pos; int32 objectiveIdx; }; /// A base (composition) class for all new rpg actions /// All functions that may be shared by multiple actions should be declared here /// And we should make all actions composable instead of inheritable class NewRpgBaseAction : public MovementAction { public: NewRpgBaseAction(PlayerbotAI* botAI, std::string name) : MovementAction(botAI, name) {} protected: /* MOVEMENT RELATED */ bool MoveFarTo(WorldPosition dest); bool MoveWorldObjectTo(ObjectGuid guid, float distance = INTERACTION_DISTANCE); bool MoveRandomNear(float moveStep = 50.0f, MovementPriority priority = MovementPriority::MOVEMENT_NORMAL); bool ForceToWait(uint32 duration, MovementPriority priority = MovementPriority::MOVEMENT_NORMAL); /* QUEST RELATED CHECK */ ObjectGuid ChooseNpcOrGameObjectToInteract(bool questgiverOnly = false, float distanceLimit = 0.0f); bool HasQuestToAcceptOrReward(WorldObject* object); bool InteractWithNpcOrGameObjectForQuest(ObjectGuid guid); bool CanInteractWithQuestGiver(Object* questGiver); bool IsWithinInteractionDist(Object* object); uint32 BestRewardIndex(Quest const* quest); bool IsQuestWorthDoing(Quest const* quest); bool IsQuestCapableDoing(Quest const* quest); /* QUEST RELATED ACTION */ bool SearchQuestGiverAndAcceptOrReward(); bool AcceptQuest(Quest const* quest, ObjectGuid guid); bool TurnInQuest(Quest const* quest, ObjectGuid guid); bool OrganizeQuestLog(); protected: bool GetQuestPOIPosAndObjectiveIdx(uint32 questId, std::vector& poiInfo, bool toComplete = false); static WorldPosition SelectRandomGrindPos(Player* bot); static WorldPosition SelectRandomCampPos(Player* bot); bool SelectRandomFlightTaxiNode(ObjectGuid& flightMaster, uint32& fromNode, uint32& toNode); bool RandomChangeStatus(std::vector candidateStatus); bool CheckRpgStatusAvailable(NewRpgStatus status); protected: /* FOR MOVE FAR */ const float pathFinderDis = 70.0f; const uint32 stuckTime = 5 * 60 * 1000; }; #endif