class_name InteractionAvailabilityDecision extends RefCounted var _enabled := true var _reason_code: StringName var _reason_message := "" var _reason_trace: Array[StringName] = [] var _parameters: Dictionary = {} var _valid := false func _init( enabled: bool = true, reason_code: StringName = &"", reason_message: String = "", reason_trace: Array = [], parameters: Dictionary = {} ) -> void: _enabled = enabled _reason_code = reason_code _reason_message = reason_message _parameters = parameters.duplicate(true) _valid = not WorldTargetCapability._contains_object(_parameters) for trace_value in reason_trace: if trace_value is not String and trace_value is not StringName: _valid = false continue var trace_id := StringName(trace_value) if trace_id.is_empty(): _valid = false continue _reason_trace.append(trace_id) if not _enabled and (_reason_code.is_empty() or _reason_message.is_empty()): _valid = false static func allowed( reason_trace: Array = [&"availability_allowed"], parameters: Dictionary = {} ) -> InteractionAvailabilityDecision: return InteractionAvailabilityDecision.new(true, &"", "", reason_trace, parameters) static func denied( reason_code: StringName, reason_message: String, reason_trace: Array, parameters: Dictionary = {} ) -> InteractionAvailabilityDecision: return InteractionAvailabilityDecision.new( false, reason_code, reason_message, reason_trace, parameters ) func is_valid() -> bool: return _valid func is_enabled() -> bool: return _enabled func get_reason_code() -> StringName: return _reason_code func get_reason_message() -> String: return _reason_message func get_reason_trace() -> Array[StringName]: return _reason_trace.duplicate() func get_parameters() -> Dictionary: return _parameters.duplicate(true)