feat: index loaded resource discovery
This commit is contained in:
@@ -1,26 +1,62 @@
|
||||
class_name ActiveWorldAdapter
|
||||
extends Node
|
||||
|
||||
const LoadedResourceSpatialIndexScript := preload(
|
||||
"res://world/resource_nodes/LoadedResourceSpatialIndex.gd"
|
||||
)
|
||||
|
||||
@export var pantry_storage: StorageNode
|
||||
@export var woodpile_storage: StorageNode
|
||||
@export_range(4.0, 128.0, 1.0) var resource_cell_size := 24.0
|
||||
|
||||
var _resource_index := LoadedResourceSpatialIndexScript.new()
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
_resource_index.configure(resource_cell_size)
|
||||
add_to_group("active_world_adapter")
|
||||
rebuild_resource_index()
|
||||
|
||||
|
||||
func rebuild_resource_index() -> void:
|
||||
_resource_index.clear()
|
||||
for node in ResourceNode.get_all():
|
||||
_resource_index.register_node(node, node.state)
|
||||
|
||||
|
||||
func register_resource_node(node: ResourceNode, state: ResourceStateRecord = null) -> bool:
|
||||
return _resource_index.register_node(node, state)
|
||||
|
||||
|
||||
func unregister_resource_node(node_id: StringName) -> void:
|
||||
_resource_index.unregister_node(node_id)
|
||||
|
||||
|
||||
func get_resource_candidates(action_id: StringName) -> Array[Dictionary]:
|
||||
var candidates: Array[Dictionary] = []
|
||||
for node in ResourceNode.get_all():
|
||||
if node.action_id != action_id or node.interaction_point == null:
|
||||
continue
|
||||
candidates.append(
|
||||
{
|
||||
"target_id": String(node.node_id),
|
||||
"position": node.interaction_point.global_position,
|
||||
"resource_id": String(node.resource_id),
|
||||
"safety_risk": node.safety_risk,
|
||||
"comfort_distance": node.comfort_distance,
|
||||
"discovery_priority": node.discovery_priority
|
||||
}
|
||||
)
|
||||
return candidates
|
||||
return _resource_index.get_all_candidates(action_id)
|
||||
|
||||
|
||||
func get_resource_candidates_in_radius(
|
||||
action_id: StringName,
|
||||
origin: Vector3,
|
||||
max_distance: float,
|
||||
min_distance_exclusive: float = -1.0
|
||||
) -> Array[Dictionary]:
|
||||
return _resource_index.get_candidates_in_radius(
|
||||
action_id, origin, max_distance, min_distance_exclusive
|
||||
)
|
||||
|
||||
|
||||
func get_resource_query_profile(action_id: StringName, origin: Vector3) -> Dictionary:
|
||||
return _resource_index.get_query_profile(action_id, origin)
|
||||
|
||||
|
||||
func get_resource_nodes_in_radius(origin: Vector3, max_distance: float) -> Array[ResourceNode]:
|
||||
return _resource_index.get_nodes_in_radius(origin, max_distance)
|
||||
|
||||
|
||||
func get_resource_index_stats() -> Dictionary:
|
||||
return _resource_index.get_stats()
|
||||
|
||||
|
||||
func get_activity_target(action_id: StringName, origin: Vector3 = Vector3.ZERO) -> Dictionary:
|
||||
|
||||
Reference in New Issue
Block a user