def release(self):
     if not self.sim:
         logger.error(
             "Could not clean up Rabbit Hole Liabiltiy because the Sim doesn't exist for Interaction: {}",
             self.interaction)
         return
     if not self.sim.client:
         logger.warn(
             'Could not clean up Rabbit Hole Liability because the Sim has no client. This is normal on zone shutdown.',
             owner='tingyul')
         return
     if not self._has_hidden:
         return
     sim_info = self.sim.sim_info
     self.sim.show(HiddenReasonFlag.RABBIT_HOLE)
     self.sim.client.selectable_sims.notify_dirty()
     pos = self.sim.position
     pos = sims4.math.Vector2(pos.x, pos.z)
     geo = sims4.geometry.QtCircle(pos, self.sim._quadtree_radius)
     services.sim_quadtree().insert(self.sim, self.sim.id,
                                    placement.ItemType.SIM_POSITION, geo,
                                    self.sim.routing_surface.secondary_id,
                                    False, 0)
     self.sim.fade_in()
     on_sim_spawned_baby_handle((sim_info, ))
     self._has_hidden = False
Beispiel #2
0
 def add_goal_suppression_region_to_quadtree(self):
     footprint_polygon = self.get_footprint_polygon()
     if footprint_polygon is None:
         return
     services.sim_quadtree().insert(self, self.spawn_point_id,
                                    placement.ItemType.ROUTE_GOAL_PENALIZER,
                                    footprint_polygon,
                                    self.routing_surface.secondary_id,
                                    False, 0)
Beispiel #3
0
 def add_location_to_quad_tree(self, location):
     if location is None:
         return
     sim = self.sim
     self.intended_location = location
     if location.routing_surface == sim.routing_surface and sims4.math.vector3_almost_equal_2d(sim.position, location.transform.translation) and sims4.math.quaternion_almost_equal(sim.orientation, location.transform.orientation):
         return
     pos_2d = sims4.math.Vector2(location.transform.translation.x, location.transform.translation.z)
     geo = sims4.geometry.QtCircle(pos_2d, sim.quadtree_radius)
     services.sim_quadtree().insert(sim, sim.sim_id, placement.ItemType.SIM_INTENDED_POSITION, geo, location.routing_surface.secondary_id, False, 0)
Beispiel #4
0
 def add_location_to_quad_tree(self, location):
     if location is None:
         return
     sim = self.sim
     self.intended_location = location
     if location.routing_surface == sim.routing_surface and sims4.math.vector3_almost_equal_2d(
             sim.position, location.transform.translation
     ) and sims4.math.quaternion_almost_equal(
             sim.orientation, location.transform.orientation):
         return
     pos_2d = sims4.math.Vector2(location.transform.translation.x,
                                 location.transform.translation.z)
     geo = sims4.geometry.QtCircle(pos_2d, sim.quadtree_radius)
     services.sim_quadtree().insert(
         sim, sim.sim_id, placement.ItemType.SIM_INTENDED_POSITION, geo,
         location.routing_surface.secondary_id, False, 0)
 def _on_quadtree_changed(self):
     quadtree = services.sim_quadtree()
     if quadtree is None:
         return
     zone = services.current_zone()
     pos = sims4.math.Vector2(0, 0)
     bounds = sims4.geometry.QtCircle(pos, 10000)
     all_sims_positions = quadtree.query(bounds=bounds, level=self.ALL_LEVELS, filter=placement.ItemType.SIM_POSITION, flags=sims4.geometry.ObjectQuadTreeQueryFlag.IGNORE_LEVEL)
     all_intended = quadtree.query(bounds=bounds, level=self.ALL_LEVELS, filter=placement.ItemType.SIM_INTENDED_POSITION, flags=sims4.geometry.ObjectQuadTreeQueryFlag.IGNORE_LEVEL)
     all_suppressors = quadtree.query(bounds=bounds, level=self.ALL_LEVELS, filter=placement.ItemType.ROUTE_GOAL_SUPPRESSOR, flags=sims4.geometry.ObjectQuadTreeQueryFlag.IGNORE_LEVEL)
     with Context(self.layer) as layer:
         layer.set_color(Color.GREEN)
         for o in all_sims_positions:
             height = terrain.get_lot_level_height(o[2].center.x, o[2].center.y, o[3], zone.id) + 0.1
             pos = sims4.math.Vector3(o[2].center.x, height, o[2].center.y)
             layer.add_circle(pos, o[2].radius, altitude=KEEP_ALTITUDE)
         layer.set_color(Color.YELLOW)
         for o in all_intended:
             if isinstance(o[2], Polygon):
                 routing_surface = routing.SurfaceIdentifier(zone.id, o[3], routing.SURFACETYPE_WORLD)
                 layer.add_polygon(o[2], altitude=0.1, routing_surface=routing_surface)
             else:
                 height = terrain.get_lot_level_height(o[2].center.x, o[2].center.y, o[3], zone.id) + 0.1
                 pos = sims4.math.Vector3(o[2].center.x, height, o[2].center.y)
                 layer.add_circle(pos, o[2].radius, altitude=KEEP_ALTITUDE)
         layer.set_color(Color.RED)
         for o in all_suppressors:
             if isinstance(o[2], Polygon):
                 routing_surface = routing.SurfaceIdentifier(zone.id, o[3], routing.SURFACETYPE_WORLD)
                 layer.add_polygon(o[2], altitude=0.1, routing_surface=routing_surface)
             else:
                 height = terrain.get_lot_level_height(o[2].center.x, o[2].center.y, o[3], zone.id) + 0.1
                 pos = sims4.math.Vector3(o[2].center.x, height, o[2].center.y)
                 layer.add_circle(pos, o[2].radius, altitude=KEEP_ALTITUDE)
def _get_nearby_items(position,
                      level,
                      radius=None,
                      exclude=None,
                      flags=sims4.geometry.ObjectQuadTreeQueryFlag.NONE,
                      query_filter=ItemType.UNKNOWN):
    if radius is None:
        radius = routing.get_default_agent_radius()
    position_2d = sims4.math.Vector2(position.x, position.z)
    bounds = sims4.geometry.QtCircle(position_2d, radius)
    exclude_ids = []
    if exclude:
        for sim in exclude:
            exclude_ids.append(sim.sim_id)
    nearby_items = []
    query = services.sim_quadtree().query(bounds,
                                          level,
                                          filter=query_filter,
                                          flags=flags,
                                          exclude=exclude_ids)
    for q in query:
        obj = q[0]
        if exclude and obj in exclude:
            pass
        nearby_items.append(q[0])
    return nearby_items
Beispiel #7
0
def _get_nearby_items(position,
                      level,
                      radius=None,
                      exclude=None,
                      flags=sims4.geometry.ObjectQuadTreeQueryFlag.NONE,
                      query_filter=ItemType.UNKNOWN):
    if radius is None:
        radius = routing.get_default_agent_radius()
    position_2d = sims4.math.Vector2(position.x, position.z)
    bounds = sims4.geometry.QtCircle(position_2d, radius)
    exclude_ids = []
    if exclude:
        for sim in exclude:
            exclude_ids.append(sim.sim_id)
    nearby_items = []
    query = services.sim_quadtree().query(bounds,
                                          level,
                                          filter=query_filter,
                                          flags=flags,
                                          exclude=exclude_ids)
    for q in query:
        obj = q[0]
        if exclude and obj in exclude:
            pass
        nearby_items.append(q[0])
    return nearby_items
Beispiel #8
0
 def _add_route_goal_suppression_region_to_quadtree(self, *args, **kwargs):
     if self.target is None:
         return
     object_point = self.target.location.transform.translation
     sim_point = self.sim.intended_location.transform.translation
     delta = object_point - sim_point
     delta_length = delta.magnitude()
     sim_point_offset = self.sim_view_discourage_area_width * 2
     if delta_length < sim_point_offset:
         return
     start_point = sim_point + delta / (delta_length / sim_point_offset)
     geo = build_rectangle_from_two_points_and_radius(
         object_point, start_point, self.sim_view_discourage_area_width)
     services.sim_quadtree().insert(self.sim, self.id,
                                    placement.ItemType.ROUTE_GOAL_PENALIZER,
                                    geo, self.sim.routing_surface, False, 0)
 def _on_quadtree_changed(self):
     quadtree = services.sim_quadtree()
     if quadtree is None:
         return
     zone = services.current_zone()
     pos = sims4.math.Vector2(0, 0)
     bounds = sims4.geometry.QtCircle(pos, 10000)
     all_sims_positions = quadtree.query(
         bounds=bounds,
         level=self.ALL_LEVELS,
         filter=placement.ItemType.SIM_POSITION,
         flags=sims4.geometry.ObjectQuadTreeQueryFlag.IGNORE_LEVEL)
     all_intended = quadtree.query(
         bounds=bounds,
         level=self.ALL_LEVELS,
         filter=placement.ItemType.SIM_INTENDED_POSITION,
         flags=sims4.geometry.ObjectQuadTreeQueryFlag.IGNORE_LEVEL)
     all_suppressors = quadtree.query(
         bounds=bounds,
         level=self.ALL_LEVELS,
         filter=placement.ItemType.ROUTE_GOAL_SUPPRESSOR,
         flags=sims4.geometry.ObjectQuadTreeQueryFlag.IGNORE_LEVEL)
     with Context(self.layer) as layer:
         layer.set_color(Color.GREEN)
         for o in all_sims_positions:
             height = terrain.get_lot_level_height(
                 o[2].center.x, o[2].center.y, o[3], zone.id) + 0.1
             pos = sims4.math.Vector3(o[2].center.x, height, o[2].center.y)
             layer.add_circle(pos, o[2].radius, altitude=KEEP_ALTITUDE)
         layer.set_color(Color.YELLOW)
         for o in all_intended:
             if isinstance(o[2], Polygon):
                 routing_surface = routing.SurfaceIdentifier(
                     zone.id, o[3], routing.SURFACETYPE_WORLD)
                 layer.add_polygon(o[2],
                                   altitude=0.1,
                                   routing_surface=routing_surface)
             else:
                 height = terrain.get_lot_level_height(
                     o[2].center.x, o[2].center.y, o[3], zone.id) + 0.1
                 pos = sims4.math.Vector3(o[2].center.x, height,
                                          o[2].center.y)
                 layer.add_circle(pos, o[2].radius, altitude=KEEP_ALTITUDE)
         layer.set_color(Color.RED)
         for o in all_suppressors:
             if isinstance(o[2], Polygon):
                 routing_surface = routing.SurfaceIdentifier(
                     zone.id, o[3], routing.SURFACETYPE_WORLD)
                 layer.add_polygon(o[2],
                                   altitude=0.1,
                                   routing_surface=routing_surface)
             else:
                 height = terrain.get_lot_level_height(
                     o[2].center.x, o[2].center.y, o[3], zone.id) + 0.1
                 pos = sims4.math.Vector3(o[2].center.x, height,
                                          o[2].center.y)
                 layer.add_circle(pos, o[2].radius, altitude=KEEP_ALTITUDE)
 def add_location_to_quadtree(self,
                              placement_type,
                              position=DEFAULT,
                              orientation=DEFAULT,
                              routing_surface=DEFAULT,
                              index=0):
     position = self._agent.position if position is DEFAULT else position
     orientation = self._agent.orientation if orientation is DEFAULT else orientation
     routing_surface = self._agent.routing_surface if routing_surface is DEFAULT else routing_surface
     if placement_type in (placement.ItemType.SIM_POSITION,
                           placement.ItemType.SIM_INTENDED_POSITION):
         quadtree_geometry = self.get_quadtree_polygon(
             position=position, orientation=orientation)
     else:
         quadtree_geometry = QtCircle(Vector2(position.x, position.z),
                                      self.agent_goal_radius)
     services.sim_quadtree().insert(self._agent, self._agent.id,
                                    placement_type, quadtree_geometry,
                                    routing_surface, False, index)
 def release(self):
     if not self.sim:
         logger.error("Could not clean up Rabbit Hole Liabiltiy because the Sim doesn't exist for Interaction: {}", self.interaction)
         return
     if not self.sim.client:
         logger.warn('Could not clean up Rabbit Hole Liability because the Sim has no client. This is normal on zone shutdown.', owner='tingyul')
         return
     if not self._has_hidden:
         return
     sim_info = self.sim.sim_info
     self.sim.show(HiddenReasonFlag.RABBIT_HOLE)
     self.sim.client.selectable_sims.notify_dirty()
     pos = self.sim.position
     pos = sims4.math.Vector2(pos.x, pos.z)
     geo = sims4.geometry.QtCircle(pos, self.sim._quadtree_radius)
     services.sim_quadtree().insert(self.sim, self.sim.id, placement.ItemType.SIM_POSITION, geo, self.sim.routing_surface.secondary_id, False, 0)
     self.sim.fade_in()
     on_sim_spawned_baby_handle((sim_info,))
     self._has_hidden = False
 def _on_quadtree_changed(self):
     quadtree = services.sim_quadtree()
     if quadtree is None:
         return
     bounds = QtCircle(Vector2(0, 0), 10000)
     with Context(self.layer) as layer:
         filter_visualizers = ((placement.ItemType.SIM_POSITION, Color.GREEN), (placement.ItemType.SIM_INTENDED_POSITION, Color.YELLOW), (placement.ItemType.ROUTE_GOAL_SUPPRESSOR, Color.RED), (placement.ItemType.ROUTABLE_OBJECT_SURFACE, Color.CYAN))
         for (quadtree_filter, color) in filter_visualizers:
             layer.set_color(color)
             for o in quadtree.query(bounds=bounds, surface_id=routing.SurfaceIdentifier(0, 0, 0), filter=quadtree_filter, flags=ObjectQuadTreeQueryFlag.IGNORE_SURFACE):
                 if isinstance(o[2], Polygon):
                     layer.add_polygon(o[2], altitude=0.1, routing_surface=o[3])
                 else:
                     height = terrain.get_lot_level_height(o[2].center.x, o[2].center.y, o[3].secondary_id, services.current_zone_id()) + 0.1
                     layer.add_circle(sims4.math.Vector3(o[2].center.x, height, o[2].center.y), o[2].radius, altitude=KEEP_ALTITUDE)
Beispiel #13
0
 def get_portal_locations(self, obj):
     locations = []
     for portal_entry in self.object_portals:
         there_entry = portal_entry.location_entry(obj)
         bounds = sims4.geometry.QtCircle(
             sims4.math.Vector2(there_entry.position.x,
                                there_entry.position.z),
             self.PORTAL_SEARCH_RADIUS + self.additional_search_radius)
         try:
             object_surfaces = services.sim_quadtree().query(
                 bounds=bounds,
                 surface_id=there_entry.routing_surface,
                 filter=ItemType.ROUTABLE_OBJECT_SURFACE,
                 flags=sims4.geometry.ObjectQuadTreeQueryFlag.
                 IGNORE_SURFACE_TYPE)
         except:
             continue
         for object_data in object_surfaces:
             obj_id = object_data[PY_OBJ_DATA][SURFACE_OBJ_ID]
             other_obj = services.object_manager().get(obj_id)
             if other_obj is None:
                 continue
             if other_obj.id == obj.id:
                 continue
             for (there_exit, other_obj_angle_restriction
                  ) in other_obj.get_dynamic_portal_locations_gen():
                 self._update_portal_location(locations, there_entry,
                                              there_exit, obj, other_obj,
                                              other_obj_angle_restriction)
             if other_obj.parts is None:
                 pass
             else:
                 for part in other_obj.parts:
                     distance = (obj.position -
                                 part.position).magnitude_2d()
                     if distance <= self.PORTAL_PART_SEARCH_RADIUS + self.additional_search_radius:
                         for portal_data in part.part_definition.portal_data:
                             for (
                                     there_exit, other_obj_angle_restriction
                             ) in portal_data.get_dynamic_portal_locations_gen(
                                     part):
                                 self._update_portal_location(
                                     locations, there_entry, there_exit,
                                     obj, other_obj,
                                     other_obj_angle_restriction)
     return locations
Beispiel #14
0
def _get_nearby_items_gen(position,
                          surface_id,
                          radius=None,
                          exclude=None,
                          flags=sims4.geometry.ObjectQuadTreeQueryFlag.NONE,
                          *,
                          query_filter):
    radius = routing.get_default_agent_radius()
    position_2d = sims4.math.Vector2(position.x, position.z)
    bounds = sims4.geometry.QtCircle(position_2d, radius)
    exclude_ids = []
    for routing_agent in exclude:
        exclude_ids.append(routing_agent.id)
    query = services.sim_quadtree().query(bounds,
                                          surface_id,
                                          filter=query_filter,
                                          flags=flags,
                                          exclude=exclude_ids)
    for q in query:
        obj = q[0]
        if not not exclude and obj in exclude:
            continue
        yield q[0]
 def remove_location_from_quadtree(self, placement_type, index=0):
     services.sim_quadtree().remove(self._agent.id, placement_type, index)
Beispiel #16
0
 def _remove_route_goal_suppression_region_from_quadtree(self):
     services.sim_quadtree().remove(self.id, placement.ItemType.ROUTE_GOAL_PENALIZER, 0)
 def _query_quadtree_for_sim(self, position, level, filter_type, radius=DEFAULT):
     sim_quadtree = services.sim_quadtree()
     radius = self.FIRE_QUADTREE_RADIUS if radius is DEFAULT else radius
     return sim_quadtree.query(sims4.geometry.QtCircle(position, radius), level=level, filter=filter_type)
Beispiel #18
0
 def _remove_goal_suppression_region(self):
     services.sim_quadtree().remove(self.spawn_point_id, placement.ItemType.ROUTE_GOAL_PENALIZER, 0)
Beispiel #19
0
 def remove_from_quad_tree(self):
     sim = self.sim
     services.sim_quadtree().remove(sim.sim_id, placement.ItemType.SIM_INTENDED_POSITION, 0)
Beispiel #20
0
 def _add_route_goal_suppression_region_to_quadtree(self, *args, **kwargs):
     object_point = self.target.location.transform.translation
     sim_point = self.sim.intended_location.transform.translation
     geo = build_rectangle_from_two_points_and_radius(object_point, sim_point, self.sim_view_discourage_area_width)
     services.sim_quadtree().insert(self.sim, self.id, placement.ItemType.ROUTE_GOAL_PENALIZER, geo, self.sim.routing_surface.secondary_id, False, 0)
 def release(self):
     for interaction_id in self._quadtree_object_ids:
         services.sim_quadtree().remove(interaction_id, placement.ItemType.ROUTE_GOAL_PENALIZER, 0)
     if self._intended_position_changed in self._participant.routing_component.on_intended_location_changed:
         self._participant.routing_component.on_intended_location_changed.remove(self._intended_position_changed)
 def _add_region(self, position, routing_surface):
     self._quadtree_object_ids.append(self._current_interaction.id)
     circle = sims4.geometry.generate_circle_constraint(Circle.NUM_SIDES, position, self.radius)
     services.sim_quadtree().insert(self._current_interaction, self._current_interaction.id, placement.ItemType.ROUTE_GOAL_PENALIZER, circle, routing_surface, False, 0)
Beispiel #23
0
 def _remove_route_goal_suppression_region_from_quadtree(self):
     services.sim_quadtree().remove(self.id,
                                    placement.ItemType.ROUTE_GOAL_PENALIZER,
                                    0)
 def add_goal_suppression_region_to_quadtree(self):
     footprint_polygon = self.get_footprint_polygon()
     if footprint_polygon is None:
         return
     services.sim_quadtree().insert(self, self.spawn_point_id, placement.ItemType.ROUTE_GOAL_PENALIZER, footprint_polygon, self.routing_surface.secondary_id, False, 0)
Beispiel #25
0
 def remove_from_quad_tree(self):
     sim = self.sim
     services.sim_quadtree().remove(
         sim.sim_id, placement.ItemType.SIM_INTENDED_POSITION, 0)