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;
}
Esempio n. 2
0
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);
    }
}
Esempio n. 3
0
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;
}