Improve AdventureBot travel recovery and destination eligibility
GCC PCH / build (push) Waiting to run
clang PCH / build (push) Canceled after 0s

This commit is contained in:
Nico committed 2026-10-29 11:10:27 +01:00
1 parent 321a28640c
commit 49712aadfe
50 files changed
+984 -44

No files matched your search

@@ -1,3 +1,4 @@
#include "ClientlessPositioning.h"
#include "AdventureSocialActions.h"
#include "AdventureLocationMgr.h"
#include "AdventureEconomyPolicy.h"
@@ -167,12 +168,14 @@ namespace
bool Approach(Player* player,AdventureSocialScene& scene,WorldObject* target,AdventureSocialContext& c)
{
if(!InBounds(player,target,c))return false;
Position crowded;bool hasCrowded=false,already=false;
if(player->GetExactDist(target)<=3.8f && (scene.Kind=="work_skinning" || AtFront(player,target)) &&
((AdventureEconomyPolicy::Economic(scene.Kind) || AdventureProfessionPolicy::Recognized(scene.Kind))?TargetVisible(player,target,scene.Kind):
player->IsWithinLOS(target->GetPositionX(),target->GetPositionY(),target->GetPositionZ()+1.5f)))
{
scene.Approaching=false;
return true;
already=true;
if(ClientlessPositioning::Clearance(player,*player)>=1.1f)
{scene.Approaching=false;return true;}
}
// People are approached in front of their actual facing, not from the
// bot's current bearing. Furniture may still be reached from any side.
@@ -191,9 +194,15 @@ namespace
if(!player->GetMap()->isInLineOfSight(player->GetPhaseShift(),p.GetPositionX(),p.GetPositionY(),floor+((AdventureEconomyPolicy::Economic(scene.Kind) || AdventureProfessionPolicy::Recognized(scene.Kind))?player->GetCollisionHeight():1.5f),
target->GetPositionX(),target->GetPositionY(),target->GetPositionZ()+(AdventureProfessionPolicy::Recognized(scene.Kind) && target->ToGameObject()?std::max(1.5f,target->GetCollisionHeight()):AdventureEconomyPolicy::Economic(scene.Kind)?target->GetCollisionHeight():1.5f),
LINEOFSIGHT_ALL_CHECKS,VMAP::ModelIgnoreFlags::Nothing))continue;
if(ClientlessPositioning::Clearance(player,p)<1.1f)
{if(!hasCrowded){crowded=p;hasCrowded=true;}continue;}
if(!c.Move(p,(AdventureEconomyPolicy::Economic(scene.Kind) || AdventureExplorationPolicy::Inspection(scene.Kind) || AdventureProfessionPolicy::Recognized(scene.Kind))?350:55))continue;
ClientlessPositioning::Reserve(player,p);
scene.Destination=p;scene.Approaching=true;return true;
}
if(already){scene.Approaching=false;return true;}
if(hasCrowded && c.Move(crowded,(AdventureEconomyPolicy::Economic(scene.Kind) || AdventureExplorationPolicy::Inspection(scene.Kind) || AdventureProfessionPolicy::Recognized(scene.Kind))?350:55))
{scene.Destination=crowded;scene.Approaching=true;return true;}
return false;
}
bool OnChair(Player* player,GameObject* chair,float& error)