void CharacterController::update(float dt) { if( character->getCurrentVehicle() ) { // Nevermind, the player is in a vehicle. auto& d = character->getMovement(); if( character->getCurrentSeat() == 0 ) { character->getCurrentVehicle()->setSteeringAngle(d.y); if( std::abs(d.x) > 0.01f ) { character->getCurrentVehicle()->setHandbraking(false); } character->getCurrentVehicle()->setThrottle(d.x); } if( _currentActivity == nullptr ) { if( glm::length( d ) <= 0.1f ) { vehicleIdle += dt; } else { vehicleIdle = 0.f; } if( vehicleIdle >= 1.f ) { // If character is idle in vehicle, try to close the door. auto v = character->getCurrentVehicle(); auto entryDoor = v->getSeatEntryDoor(character->getCurrentSeat()); if( entryDoor && entryDoor->constraint ) { character->getCurrentVehicle()->setPartTarget(entryDoor, true, entryDoor->closedAngle); } } } } if( updateActivity() ) { character->activityFinished(); if( _currentActivity ) { delete _currentActivity; _currentActivity = nullptr; } if( _nextActivity ) { setActivity( _nextActivity ); _nextActivity = nullptr; } } }
bool Activities::ExitVehicle::update(CharacterObject *character, CharacterController *controller) { RW_UNUSED(controller); if( character->getCurrentVehicle() == nullptr ) return true; auto vehicle = character->getCurrentVehicle(); auto seat = character->getCurrentSeat(); auto door = vehicle->getSeatEntryDoor(seat); auto anm_exit = character->animations.car_getout_lhs; if( door->dummy->getDefaultTranslation().x > 0.f ) { anm_exit = character->animations.car_getout_rhs; } if( vehicle->vehicle->type == VehicleData::BOAT ) { auto ppos = character->getPosition(); character->enterVehicle(nullptr, seat); character->setPosition(ppos); return true; } if( character->animator->getAnimation(AnimIndexAction) == anm_exit ) { if( character->animator->isCompleted(AnimIndexAction) ) { auto exitpos = vehicle->getSeatEntryPosition(seat); character->enterVehicle(nullptr, seat); character->setPosition(exitpos); return true; } } else { character->playActivityAnimation(anm_exit, false, true); if( door ) { vehicle->setPartTarget(door, true, door->openAngle); } } return false; }
bool Activities::ExitVehicle::update(CharacterObject *character, CharacterController *controller) { RW_UNUSED(controller); if (jacked) { const auto jacked_lhs = AnimCycle::CarJackedLHS; const auto jacked_rhs = AnimCycle::CarJackedRHS; const auto cycle_current = character->getCurrentCycle(); if (cycle_current == jacked_lhs || cycle_current == jacked_rhs) { if (character->animator->isCompleted(AnimIndexAction)) { return true; } } else { if (character->getCurrentVehicle() == nullptr) return true; auto vehicle = character->getCurrentVehicle(); auto seat = character->getCurrentSeat(); auto door = vehicle->getSeatEntryDoor(seat); RW_UNUSED(door); auto exitPos = vehicle->getSeatEntryPositionWorld(seat); auto exitPosLocal = vehicle->getSeatEntryPosition(seat); character->rotation = vehicle->getRotation(); // Exit the vehicle immediatley character->enterVehicle(nullptr, seat); character->setPosition(exitPos); if (exitPosLocal.x > 0.f) { character->playCycle(jacked_rhs); } else { character->playCycle(jacked_lhs); } // No need to open the door, it should already be open. } return false; } if (character->getCurrentVehicle() == nullptr) return true; auto vehicle = character->getCurrentVehicle(); auto seat = character->getCurrentSeat(); auto door = vehicle->getSeatEntryDoor(seat); auto exitPos = vehicle->getSeatEntryPositionWorld(seat); auto exitPosLocal = vehicle->getSeatEntryPosition(seat); auto cycle_exit = AnimCycle::CarGetOutLHS; if (exitPosLocal.x > 0.f) { cycle_exit = AnimCycle::CarGetOutRHS; } if (vehicle->getVehicle()->vehicletype_ == VehicleModelInfo::BOAT) { auto ppos = character->getPosition(); character->enterVehicle(nullptr, seat); character->setPosition(ppos); return true; } bool isDriver = vehicle->isOccupantDriver(character->getCurrentSeat()); // If the vehicle is going too fast, slow down if (isDriver) { if (!vehicle->canOccupantExit()) { vehicle->setBraking(1.f); return false; } } if (character->getCurrentCycle() == cycle_exit) { if (character->animator->isCompleted(AnimIndexAction)) { character->enterVehicle(nullptr, seat); character->setPosition(exitPos); if (isDriver) { // Apply the handbrake vehicle->setHandbraking(true); vehicle->setThrottle(0.f); } return true; } } else { character->playCycle(cycle_exit); if (door) { vehicle->setPartTarget(door, true, door->openAngle); } } return false; }