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); 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()); }