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; }
void ObjectRenderer::renderCharacter(CharacterObject* pedestrian, RenderList& outList) { const auto& clump = pedestrian->getClump(); if (pedestrian->getCurrentVehicle()) { auto vehicle = pedestrian->getCurrentVehicle(); const auto& vehicleclump = vehicle->getClump(); auto seat = pedestrian->getCurrentSeat(); auto matrixModel = vehicleclump->getFrame()->getWorldTransform(); if (pedestrian->isEnteringOrExitingVehicle()) { matrixModel = glm::translate(matrixModel, vehicle->getSeatEntryPosition(seat)); clump->getFrame()->setTransform(matrixModel); } else { if (seat < vehicle->info->seats.size()) { matrixModel = glm::translate(matrixModel, vehicle->info->seats[seat].offset); clump->getFrame()->setTransform(matrixModel); } } } renderClump(pedestrian->getClump().get(), glm::mat4(), nullptr, outList); auto item = pedestrian->getActiveItem(); const auto& weapon = pedestrian->engine->data->weaponData[item]; if (weapon->modelID == -1) { return; // No model for this item } auto handFrame = pedestrian->getClump()->findFrame("srhand"); if (handFrame) { auto simple = m_world->data->findModelInfo<SimpleModelInfo>(weapon->modelID); auto itematomic = simple->getAtomic(0); renderAtomic(itematomic, handFrame->getWorldTransform(), nullptr, outList); } }
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; }