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 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)
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 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
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)
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
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)
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)
def _remove_goal_suppression_region(self): services.sim_quadtree().remove(self.spawn_point_id, placement.ItemType.ROUTE_GOAL_PENALIZER, 0)
def remove_from_quad_tree(self): sim = self.sim services.sim_quadtree().remove(sim.sim_id, placement.ItemType.SIM_INTENDED_POSITION, 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)
def remove_from_quad_tree(self): sim = self.sim services.sim_quadtree().remove( sim.sim_id, placement.ItemType.SIM_INTENDED_POSITION, 0)