class_name WorldTargetCapability extends RefCounted var _capability_id: StringName var _attributes: Dictionary func _init(capability_id: StringName = &"", attributes: Dictionary = {}) -> void: _capability_id = capability_id _attributes = attributes.duplicate(true) func is_valid() -> bool: return not _capability_id.is_empty() and not _contains_object(_attributes) func get_capability_id() -> StringName: return _capability_id func get_attributes() -> Dictionary: return _attributes.duplicate(true) func get_attribute(attribute_id: StringName, default_value: Variant = null) -> Variant: var value: Variant = _attributes.get(String(attribute_id), default_value) return value.duplicate(true) if value is Array or value is Dictionary else value func to_dictionary() -> Dictionary: return { "capability_id": String(_capability_id), "attributes": _attributes.duplicate(true), } func copy() -> WorldTargetCapability: return WorldTargetCapability.new(_capability_id, _attributes) static func _contains_object(value: Variant) -> bool: if value is Object: return true if value is Array: for item in value: if _contains_object(item): return true elif value is Dictionary: for key in value: if _contains_object(key) or _contains_object(value[key]): return true return false