From 7efa2e992a64e76d9ce9b45784bd5462ee954a42 Mon Sep 17 00:00:00 2001 From: tovjemam Date: Sun, 22 Mar 2026 16:58:23 +0100 Subject: [PATCH] Use targets with delay --- src/game/drivable_vehicle.cpp | 2 +- src/game/player_character.cpp | 93 +++++++++++++++++++++++++++-------- src/game/player_character.hpp | 10 ++++ 3 files changed, 84 insertions(+), 21 deletions(-) diff --git a/src/game/drivable_vehicle.cpp b/src/game/drivable_vehicle.cpp index 544420b..c61e075 100644 --- a/src/game/drivable_vehicle.cpp +++ b/src/game/drivable_vehicle.cpp @@ -19,7 +19,7 @@ bool game::DrivableVehicle::QueryUseTarget(PlayerCharacter& character, uint32_t res.error_text = nullptr; bool seat_occupied = seats_[target_id].occupant != nullptr; - res.delay = seat_occupied ? 2.0f : 0.0f; + res.delay = seat_occupied ? 2.0f : 0.25f; return true; } diff --git a/src/game/player_character.cpp b/src/game/player_character.cpp index 0589ad1..150dd14 100644 --- a/src/game/player_character.cpp +++ b/src/game/player_character.cpp @@ -7,13 +7,14 @@ game::PlayerCharacter::PlayerCharacter(World& world, Player& player, const Chara VehicleChanged(); SetNametag(player.GetName()); + + SendUseTargetInfo(); } void game::PlayerCharacter::Update() { - Super::Update(); - UpdateUseTarget(); + Super::Update(); } void game::PlayerCharacter::VehicleChanged() @@ -38,23 +39,7 @@ void game::PlayerCharacter::ProcessInput(PlayerInputType type, bool enabled) switch (type) { case IN_USE: - if (enabled) - { - if (!vehicle_) - { - UseTargetQueryResult res; - auto use_target = world_.GetBestUseTarget(*this, res); - if (use_target) - { - use_target->usable->Use(*this, use_target->id); - } - } - else - { - SetVehicle(nullptr, 0); - } - - } + UseChanged(enabled); break; default: @@ -123,4 +108,72 @@ void game::PlayerCharacter::UpdateInputs() } } -void game::PlayerCharacter::UpdateUseTarget() {} +void game::PlayerCharacter::UpdateUseTarget() +{ + UseTargetQueryResult res{}; + auto new_use_target = world_.GetBestUseTarget(*this, res); + + if (new_use_target != use_target_ || res.enabled != use_enabled_ || res.error_text != use_error_ || res.delay != use_delay_) + { + use_target_ = new_use_target; + use_enabled_ = res.enabled; + use_delay_ = res.delay; + use_error_ = res.error_text; + use_progress_ = 0.0f; + using_ = false; + + SendUseTargetInfo(); + } + + if (use_target_ && using_) + { + use_progress_ += 0.04f; + if (use_progress_ >= use_delay_) + { + using_ = false; + use_progress_ = 0.0f; + use_target_->usable->Use(*this, use_target_->id); + } + } + +} + +void game::PlayerCharacter::UseChanged(bool enabled) +{ + if (!use_target_) + { + if (vehicle_ && enabled) + SetVehicle(nullptr, 0);// no use target and in vehicle -> exit + + return; + } + + use_progress_ = 0.0f; + bool change = using_ != enabled; + using_ = enabled; + + if (change) + SendUseTargetInfo(); + +} + +void game::PlayerCharacter::SendUseTargetInfo() +{ + if (!player_) + return; + + if (!use_target_) + { + player_->SendChat("už nejde nic použít"); + return; + } + + std::string msg = "[E] " + use_target_->desc; + + if (using_) + { + msg += " (zbývá " + std::to_string(use_delay_ - use_progress_) + ")"; + } + + player_->SendChat(msg); +} diff --git a/src/game/player_character.hpp b/src/game/player_character.hpp index 60caac8..0180bf6 100644 --- a/src/game/player_character.hpp +++ b/src/game/player_character.hpp @@ -27,9 +27,19 @@ public: private: void UpdateInputs(); void UpdateUseTarget(); + void UseChanged(bool enabled); + void SendUseTargetInfo(); private: Player* player_; + + // use target + const UseTarget* use_target_ = nullptr; + bool use_enabled_ = false; + float use_delay_ = 0.0f; + const char* use_error_ = nullptr; + bool using_ = false; // not drugs lol + float use_progress_ = 0.0f; };