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); } } }
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; }
bool driver_system::release_car_ownership(const entity_handle driver) { return change_car_ownership(driver, driver.get_cosmos()[entity_id()], true); }