Beispiel #1
0
void drop_from_all_slots(const entity_handle c, logic_step& step) {
	const auto& container = c.get<components::container>();

	for (const auto& s : container.slots) {
		const auto items_uninvalidated = s.second.items_inside;

		for (const auto item : items_uninvalidated) {
			perform_transfer({ c.get_cosmos()[item], c.get_cosmos()[inventory_slot_id()] }, step);
		}
	}
}
Beispiel #2
0
bool driver_system::change_car_ownership(const entity_handle driver_entity, const entity_handle car_entity, const bool lost_ownership) {
	auto& driver = driver_entity.get<components::driver>();
	auto& cosmos = driver_entity.get_cosmos();
	const auto& physics = cosmos.systems_temporary.get<physics_system>();

	auto* const maybe_rotation_copying = driver_entity.find<components::rotation_copying>();
	const bool has_physics = driver_entity.has<components::physics>();
	auto* const maybe_movement = driver_entity.find<components::movement>();
	auto& force_joint = driver_entity.get<components::force_joint>();

	if (!lost_ownership) {
		auto& car = car_entity.get<components::car>();

		if (cosmos[car.current_driver].alive())
			return false;

		driver.owned_vehicle = car_entity;
		car.current_driver = driver_entity;
		force_joint.chased_entity = car.left_wheel_trigger;
		driver_entity.get<components::processing>().enable_in(processing_subjects::WITH_FORCE_JOINT);

		if (maybe_movement) {
			maybe_movement->reset_movement_flags();
			maybe_movement->enable_braking_damping = false;
			maybe_movement->enable_animation = false;
		}

		if (maybe_rotation_copying && has_physics) {
			maybe_rotation_copying->stash();
			maybe_rotation_copying->target = car.left_wheel_trigger;
			maybe_rotation_copying->look_mode = components::rotation_copying::look_type::ROTATION;
		}

		if (has_physics) {
			auto& physics = driver_entity.get<components::physics>();
			physics.set_transform(car.left_wheel_trigger);
			physics.set_velocity(vec2(0, 0));
			resolve_density_of_associated_fixtures(driver_entity);
		}
	}
	else {
		auto& car = cosmos[driver.owned_vehicle].get<components::car>();

		driver.owned_vehicle.unset();
		car.current_driver.unset();
		driver_entity.get<components::processing>().disable_in(processing_subjects::WITH_FORCE_JOINT);

		if (maybe_movement) {
			maybe_movement->reset_movement_flags();
			maybe_movement->enable_braking_damping = true;
			maybe_movement->enable_animation = true;

			maybe_movement->moving_left = car.turning_left;
			maybe_movement->moving_right = car.turning_right;
			maybe_movement->moving_forward = car.accelerating;
			maybe_movement->moving_backward = car.decelerating;
		}
		
		car.reset_movement_flags();

		if (maybe_rotation_copying && has_physics) {
			maybe_rotation_copying->unstash();
		}

		if (has_physics) {
			resolve_density_of_associated_fixtures(driver_entity);
		}
	}

	// networking the message, since it was successful

	return true;
}
Beispiel #3
0
bool driver_system::release_car_ownership(const entity_handle driver) {
	return change_car_ownership(driver, driver.get_cosmos()[entity_id()], true);
}