From 6caf7be879b07cd45ada594ab52539185034b831 Mon Sep 17 00:00:00 2001 From: Sebastiaan de Schaetzen Date: Sun, 29 Sep 2019 21:25:29 +0200 Subject: [PATCH 1/2] Fix compile warning --- rwengine/src/script/ScriptMachine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rwengine/src/script/ScriptMachine.cpp b/rwengine/src/script/ScriptMachine.cpp index 0a3af8cf1..a4746ee9c 100644 --- a/rwengine/src/script/ScriptMachine.cpp +++ b/rwengine/src/script/ScriptMachine.cpp @@ -133,7 +133,7 @@ void ScriptMachine::executeThread(SCMThread& t, int msPassed) { if (a.type == SCMType::TString) { printf(" %1x:'%s'", a.type, a.string); } else if (a.type == SCMType::TFloat16) { - printf(" %1x:%f", a.type, a.realValue()); + printf(" %1x:%f", a.type, static_cast(a.realValue())); } else { printf(" %1x:%d", a.type, a.integerValue()); } From 91ce43c459b874d7a790107f6696e92a0aed2e3d Mon Sep 17 00:00:00 2001 From: Sebastiaan de Schaetzen Date: Mon, 30 Sep 2019 16:22:35 +0200 Subject: [PATCH 2/2] Improve vehicle enter behaviour The implementation of the vehicle enter behaviour was extremely buggy and would sometimes cause the player to get stuck in an animation. This patch brings the behaviour more inline with the actual game behaviour, although it is still not completely correct. --- rwengine/src/ai/CharacterController.cpp | 27 ++++++++++++++++++++---- rwengine/src/objects/CharacterObject.cpp | 14 ++++++------ rwengine/src/objects/VehicleObject.cpp | 14 ++++++++++++ rwengine/src/objects/VehicleObject.hpp | 5 +++++ 4 files changed, 48 insertions(+), 12 deletions(-) diff --git a/rwengine/src/ai/CharacterController.cpp b/rwengine/src/ai/CharacterController.cpp index 99780adc4..cffeeb88c 100644 --- a/rwengine/src/ai/CharacterController.cpp +++ b/rwengine/src/ai/CharacterController.cpp @@ -373,13 +373,28 @@ bool Activities::Jump::update(CharacterObject *character, bool Activities::EnterVehicle::canSkip(CharacterObject *character, CharacterController *) const { // If we're already inside the vehicle, it can't helped. - return character->getCurrentVehicle() == nullptr; + if (character->getCurrentVehicle() != nullptr) { + return false; + } + + switch (character->getCurrentCycle()) + { + case AnimCycle::CarOpenLHS: + case AnimCycle::CarGetInLHS: + case AnimCycle::CarPullOutLHS: + case AnimCycle::CarOpenRHS: + case AnimCycle::CarGetInRHS: + case AnimCycle::CarPullOutRHS: + return false; + default: + return true; + } } bool Activities::EnterVehicle::update(CharacterObject *character, CharacterController *controller) { constexpr float kSprintToEnterDistance = 5.f; - constexpr float kGiveUpDistance = 100.f; + constexpr float kGiveUpDistance = 50.f; RW_UNUSED(controller); @@ -424,6 +439,7 @@ bool Activities::EnterVehicle::update(CharacterObject *character, bool tryToEnter = false; if (entering) { + character->setPosition(entryPos); if (character->getCurrentCycle() == cycle_open) { if (character->animator->isCompleted(AnimIndexAction)) { tryToEnter = true; @@ -432,7 +448,6 @@ bool Activities::EnterVehicle::update(CharacterObject *character, 0.5f) { vehicle->setPartTarget(entryDoor, true, entryDoor->openAngle); } else { - // character->setPosition(vehicle->getSeatEntryPosition(seat)); character->rotation = vehicle->getRotation(); } } else if (character->getCurrentCycle() == cycle_pullout) { @@ -443,6 +458,7 @@ bool Activities::EnterVehicle::update(CharacterObject *character, if (character->animator->isCompleted(AnimIndexAction)) { /// @todo move to a more suitable place vehicle->grantOccupantRewards(character); + vehicle->setImmobilised(false); // VehicleGetIn is over, finish activity return true; @@ -455,6 +471,7 @@ bool Activities::EnterVehicle::update(CharacterObject *character, float targetDistance = glm::length(targetDirection); if (targetDistance <= 0.4f) { + character->setPosition(entryPos); entering = true; // Warp character to vehicle orientation character->controller->setMoveDirection({0.f, 0.f, 0.f}); @@ -495,6 +512,8 @@ bool Activities::EnterVehicle::update(CharacterObject *character, currentOccupant->controller->setNextActivity( std::make_unique(true)); + + vehicle->setImmobilised(true); } else { character->playCycle(cycle_enter); character->enterVehicle(vehicle, seat); @@ -528,7 +547,7 @@ bool Activities::ExitVehicle::update(CharacterObject *character, character->rotation = vehicle->getRotation(); - // Exit the vehicle immediatley + // Exit the vehicle immediately character->enterVehicle(nullptr, seat); character->setPosition(exitPos); diff --git a/rwengine/src/objects/CharacterObject.cpp b/rwengine/src/objects/CharacterObject.cpp index 5816b50fb..2c6abf122 100644 --- a/rwengine/src/objects/CharacterObject.cpp +++ b/rwengine/src/objects/CharacterObject.cpp @@ -492,14 +492,12 @@ bool CharacterObject::enterVehicle(VehicleObject* vehicle, size_t seat) { // enterAction(VehicleSit); return true; } - } else { - if (currentVehicle) { - currentVehicle->setOccupant(seat, nullptr); - // Disabled due to crashing. - // setPosition(currentVehicle->getPosition()); - setCurrentVehicle(nullptr, 0); - return true; - } + } else if (currentVehicle) { + currentVehicle->setOccupant(seat, nullptr); + // Disabled due to crashing. + // setPosition(currentVehicle->getPosition()); + setCurrentVehicle(nullptr, 0); + return true; } return false; } diff --git a/rwengine/src/objects/VehicleObject.cpp b/rwengine/src/objects/VehicleObject.cpp index a43748094..a79e0dc26 100644 --- a/rwengine/src/objects/VehicleObject.cpp +++ b/rwengine/src/objects/VehicleObject.cpp @@ -406,6 +406,12 @@ void VehicleObject::tickPhysics(float dt) { } } + if (immobilised) { + // An immobilised car should not be able to move on it's own. + engineForce = 0.f; + brakeF = 5.f; + } + for (int w = 0; w < physVehicle->getNumWheels(); ++w) { btWheelInfo& wi = physVehicle->getWheelInfo(w); @@ -694,6 +700,14 @@ bool VehicleObject::getHandbraking() const { return handbrake; } +void VehicleObject::setImmobilised(bool immobile) { + immobilised = immobile; +} + +bool VehicleObject::getImmobilised() const { + return immobilised; +} + void VehicleObject::ejectAll() { for (std::map::iterator it = seatOccupants.begin(); it != seatOccupants.end();) { diff --git a/rwengine/src/objects/VehicleObject.hpp b/rwengine/src/objects/VehicleObject.hpp index fac730ff2..fc2828318 100644 --- a/rwengine/src/objects/VehicleObject.hpp +++ b/rwengine/src/objects/VehicleObject.hpp @@ -45,6 +45,7 @@ class VehicleObject final : public GameObject { float throttle{0.f}; float brake{0.f}; bool handbrake = true; + bool immobilised = false; std::vector wheelsRotation; Atomic* chassishigh_ = nullptr; @@ -147,6 +148,10 @@ class VehicleObject final : public GameObject { bool getHandbraking() const; + void setImmobilised(bool); + + bool getImmobilised() const; + void tick(float dt) override; void tickPhysics(float dt);