Use targets with delay
This commit is contained in:
parent
876f91d38d
commit
7efa2e992a
@ -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;
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user