Make npcs not die inside when stuck but use reverse strategy again

This commit is contained in:
tovjemam 2026-05-08 21:01:53 +02:00
parent 5fa315fbcf
commit 05c8e66668
2 changed files with 33 additions and 2 deletions

View File

@ -15,6 +15,7 @@ void game::NpcCharacter::VehicleChanged()
path_.clear(); path_.clear();
gas_ = false; gas_ = false;
stuck_counter_ = 0; stuck_counter_ = 0;
vehicle_state_ = NVT_NORMAL;
speed_limit_ = 0.0f; speed_limit_ = 0.0f;
if (GetVehicle() && IsDriver()) if (GetVehicle() && IsDriver())
@ -87,6 +88,22 @@ void game::NpcCharacter::VehicleThink()
if (!IsDriver() || !GetVehicle() || !roads_) if (!IsDriver() || !GetVehicle() || !roads_)
return; return;
if (vehicle_state_ == NVT_REVERSING)
{
if (reversing_frames_ > 0)
{
--reversing_frames_;
}
else
{
vehicle_state_ = NVT_NORMAL;
stuck_counter_ = 0;
vehicle_->SetInput(game::VIN_BACKWARD, false);
}
return;
}
const auto& vehicle_trans = GetVehicle()->GetRootTransform(); const auto& vehicle_trans = GetVehicle()->GetRootTransform();
const glm::vec3& pos = vehicle_trans.position; const glm::vec3& pos = vehicle_trans.position;
@ -203,8 +220,14 @@ void game::NpcCharacter::VehicleThink()
// BotThink(s); // BotThink(s);
//}); //});
GetVehicle()->SetInputs(0); // stop vehicle_->SetSteering(true, -angle); // try turn away while reversing
is_driver_ = false; // TODO: fix vehicle_->SetInputs(0); // stop
vehicle_->SetInput(game::VIN_BACKWARD, true);
vehicle_state_ = NVT_REVERSING;
reversing_frames_ = 50; // reverse for 50 frames
// GetVehicle()->SetInputs(0); // stop
// is_driver_ = false; // TODO: fix
return; return;
} }
} }

View File

@ -8,6 +8,12 @@ namespace game
class OpenWorld; class OpenWorld;
enum NpcVehicleThinkState
{
NVT_NORMAL,
NVT_REVERSING,
};
class NpcCharacter : public ControllableCharacter class NpcCharacter : public ControllableCharacter
{ {
public: public:
@ -32,11 +38,13 @@ private:
private: private:
// driver // driver
NpcVehicleThinkState vehicle_state_ = NVT_NORMAL;
const assets::MapGraph* roads_; const assets::MapGraph* roads_;
glm::vec3 seg_start_; glm::vec3 seg_start_;
std::deque<size_t> path_; std::deque<size_t> path_;
bool gas_ = false; bool gas_ = false;
size_t stuck_counter_ = 0; size_t stuck_counter_ = 0;
size_t reversing_frames_ = 0;
glm::vec3 last_pos_ = glm::vec3(0.0f); glm::vec3 last_pos_ = glm::vec3(0.0f);
float speed_limit_ = 0.0f; float speed_limit_ = 0.0f;
}; };