From 05c8e66668d3c95e64fe0b9a974452a4a6176f91 Mon Sep 17 00:00:00 2001 From: tovjemam Date: Fri, 8 May 2026 21:01:53 +0200 Subject: [PATCH] Make npcs not die inside when stuck but use reverse strategy again --- src/game/npc_character.cpp | 27 +++++++++++++++++++++++++-- src/game/npc_character.hpp | 8 ++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/game/npc_character.cpp b/src/game/npc_character.cpp index 7400c63..2df34be 100644 --- a/src/game/npc_character.cpp +++ b/src/game/npc_character.cpp @@ -15,6 +15,7 @@ void game::NpcCharacter::VehicleChanged() path_.clear(); gas_ = false; stuck_counter_ = 0; + vehicle_state_ = NVT_NORMAL; speed_limit_ = 0.0f; if (GetVehicle() && IsDriver()) @@ -87,6 +88,22 @@ void game::NpcCharacter::VehicleThink() if (!IsDriver() || !GetVehicle() || !roads_) 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 glm::vec3& pos = vehicle_trans.position; @@ -203,8 +220,14 @@ void game::NpcCharacter::VehicleThink() // BotThink(s); //}); - GetVehicle()->SetInputs(0); // stop - is_driver_ = false; // TODO: fix + vehicle_->SetSteering(true, -angle); // try turn away while reversing + 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; } } diff --git a/src/game/npc_character.hpp b/src/game/npc_character.hpp index 8bf05a5..31aba51 100644 --- a/src/game/npc_character.hpp +++ b/src/game/npc_character.hpp @@ -8,6 +8,12 @@ namespace game class OpenWorld; +enum NpcVehicleThinkState +{ + NVT_NORMAL, + NVT_REVERSING, +}; + class NpcCharacter : public ControllableCharacter { public: @@ -32,11 +38,13 @@ private: private: // driver + NpcVehicleThinkState vehicle_state_ = NVT_NORMAL; const assets::MapGraph* roads_; glm::vec3 seg_start_; std::deque path_; bool gas_ = false; size_t stuck_counter_ = 0; + size_t reversing_frames_ = 0; glm::vec3 last_pos_ = glm::vec3(0.0f); float speed_limit_ = 0.0f; };