diff --git a/Containers/container.gd b/Containers/container.gd index 85dad62..bedf673 100644 --- a/Containers/container.gd +++ b/Containers/container.gd @@ -23,10 +23,8 @@ var _pending_absorb: Array[Node3D] = [] func _ready() -> void: area_3d.body_entered.connect(_on_body_entered) - if not area_3d: - SweetLogger.warning("{0} missing area_3d reference", [name]) - if not xr_pickable: - SweetLogger.warning("{0} missing xr_pickable reference", [name]) + Helper.check_reference(self, area_3d, Area3D) + Helper.check_reference(self, xr_pickable, XRToolsPickable) # Absorbing items is a server decision (the container's holder is server- diff --git a/Containers/plate_controller.gd b/Containers/plate_controller.gd index 16bc10c..a97db18 100644 --- a/Containers/plate_controller.gd +++ b/Containers/plate_controller.gd @@ -29,5 +29,4 @@ func get_food_items() -> Array[FoodItem]: return container.contained_items func _ready() -> void: - if not dirty_node: - SweetLogger.warning("{0} missing dirty_node reference", [name]) \ No newline at end of file + Helper.check_reference(self, dirty_node, Node3D) \ No newline at end of file diff --git a/Prefabs/combinable_item.gd b/Prefabs/combinable_item.gd index 2b47aab..665630b 100644 --- a/Prefabs/combinable_item.gd +++ b/Prefabs/combinable_item.gd @@ -14,14 +14,11 @@ var _food_item: FoodItem func _ready() -> void: SweetLogger.debug("{0} ready", [_pickable.name]) _food_item = get_parent().get_node_or_null("FoodItem") as FoodItem - if not _food_item: - SweetLogger.warning("{0} missing FoodItem reference, must be a sibling of a FoodItem", [get_parent().name]) if not _pickable: SweetLogger.error("{0} must be a grandchild of an XRToolsPickable", [get_parent().name]) return - if not _food_item: - SweetLogger.warning("{0} requires a FoodItem sibling", [_pickable.name]) + if not Helper.check_reference(get_parent(), _food_item, FoodItem): return if not enabled: return diff --git a/Prefabs/cookable_item.gd b/Prefabs/cookable_item.gd index a6352ae..c74cc0c 100644 --- a/Prefabs/cookable_item.gd +++ b/Prefabs/cookable_item.gd @@ -5,5 +5,4 @@ extends Node @export var turns_into: PackedScene func _ready() -> void: - if not turns_into: - SweetLogger.warning("{0} missing turns_into reference", [name]) + Helper.check_reference(self, turns_into, PackedScene) diff --git a/Prefabs/kitchen_instantiator.gd b/Prefabs/kitchen_instantiator.gd index a13ad55..214614d 100644 --- a/Prefabs/kitchen_instantiator.gd +++ b/Prefabs/kitchen_instantiator.gd @@ -5,9 +5,7 @@ extends Node3D func _ready() -> void: - - if not kitchen_scene: - SweetLogger.warning("{0} missing kitchen_scene reference", [name]) + Helper.check_reference(self, kitchen_scene, PackedScene) SweetLogger.debug("->[]") diff --git a/Stations/counter.gd b/Stations/counter.gd index 737532d..fe6b094 100644 --- a/Stations/counter.gd +++ b/Stations/counter.gd @@ -12,12 +12,9 @@ extends WorkStation func _ready() -> void: super.ready() SweetLogger.debug("Counter {0} _ready", [name]) - if not audio: - SweetLogger.warning("{0} missing audio reference", [name]) - if not chop_audio: - SweetLogger.warning("{0} missing chop_audio reference", [name]) - if not knife: - SweetLogger.warning("{0} missing knife reference", [name]) + Helper.check_reference(self, audio, AudioStreamPlayer3D) + Helper.check_reference(self, chop_audio, AudioStream) + Helper.check_reference(self, knife, XRToolsPickable) _disable_all_tools() diff --git a/Stations/hob.gd b/Stations/hob.gd index 88aec49..3eb8fb4 100644 --- a/Stations/hob.gd +++ b/Stations/hob.gd @@ -9,9 +9,8 @@ extends WorkStation func _ready() -> void: super.ready() SweetLogger.debug("Hob {0} _ready", [name]) - if not animation_player: - SweetLogger.warning("{0} missing animation_player reference", [name]) - + Helper.check_reference(self, animation_player, AnimationPlayer) + func _start_cooking(id: String, work: float) -> void: animation_player.play("hob") if not enabled: diff --git a/Stations/item_dispenser.gd b/Stations/item_dispenser.gd index 2512728..5dc5dea 100644 --- a/Stations/item_dispenser.gd +++ b/Stations/item_dispenser.gd @@ -7,8 +7,7 @@ extends Station func _ready() -> void: super.ready() SweetLogger.debug("ItemDispenser {0} _ready", [name]) - if not item_scene: - SweetLogger.warning("{0} missing item_scene reference", [name]) + Helper.check_reference(self, item_scene, PackedScene) func _process(delta: float) -> void: diff --git a/Stations/station_movement.gd b/Stations/station_movement.gd index 56b1f72..0d7d1f5 100644 --- a/Stations/station_movement.gd +++ b/Stations/station_movement.gd @@ -38,12 +38,9 @@ func _on_station_bought(_instance: Node3D): func _ready() -> void: SweetLogger.debug("->[]") - if not station: - SweetLogger.warning("{0} missing station reference", [name]) - if not move_handle: - SweetLogger.warning("{0} missing move_handle reference", [name]) - if not move_ghost: - SweetLogger.warning("{0} missing move_ghost reference", [name]) + Helper.check_reference(self, station, StaticBody3D) + Helper.check_reference(self, move_handle, XRToolsPickable) + Helper.check_reference(self, move_ghost, Area3D) move_handle_rigid = move_handle as RigidBody3D original_collision_layer = station.collision_layer diff --git a/Stations/table.gd b/Stations/table.gd index 4444e14..eeea008 100644 --- a/Stations/table.gd +++ b/Stations/table.gd @@ -152,19 +152,15 @@ func _enter_tree() -> void: func _ready() -> void: super.ready() - if not label_3d: - SweetLogger.warning("{0} missing label_3d reference", [name]) - if not label_3d_time: - SweetLogger.warning("{0} missing label_3d_time reference", [name]) - if not progress_bar or progress_bar is not ProgressBar3D: - SweetLogger.warning("{0} missing progress_bar reference", [name]) + Helper.check_reference(self, label_3d, Label3D) + Helper.check_reference(self, label_3d_time, Label3D) + Helper.check_reference(self, progress_bar, ProgressBar3D) progress_bar.y_billboard = true progress_bar.exponential = true # Render whatever state already arrived from the server before we were in # the tree (see the guard in _refresh_display). _refresh_display.call_deferred() - if not audio_player: - SweetLogger.warning("{0} missing audio_player reference", [name]) + Helper.check_reference(self, audio_player, AudioStreamPlayer3D) # Get snap_zones for plates, store in array snap_zones for child in get_children(): @@ -371,8 +367,10 @@ func _refresh_display() -> void: # tree — so these setters fire while the @onready children below are still # null. Bail out until _ready() has resolved them; _ready() calls back in # once it has, so nothing that arrived early is lost. - if not progress_bar or not label_3d or not label_3d_time: - SweetLogger.warning("{0} missing progress_bar or label reference", [name]) + var a := Helper.check_reference(self, progress_bar, ProgressBar3D) + var b := Helper.check_reference(self, label_3d, Label3D) + var c := Helper.check_reference(self, label_3d_time, Label3D) + if not (a and b and c): return match _state: TableState.IDLE: diff --git a/UI/progress_bar_3d.gd b/UI/progress_bar_3d.gd index 7f125a8..679e029 100644 --- a/UI/progress_bar_3d.gd +++ b/UI/progress_bar_3d.gd @@ -9,8 +9,7 @@ class_name ProgressBar3D func _ready() -> void: - if not progress_bar: - SweetLogger.warning("{0} missing progress_bar reference", [name]) + Helper.check_reference(self, progress_bar, ProgressBar) if y_billboard: $Sprite3D.billboard = BaseMaterial3D.BillboardMode.BILLBOARD_FIXED_Y diff --git a/abstract/station.gd b/abstract/station.gd index 6f7ba34..3521ed1 100644 --- a/abstract/station.gd +++ b/abstract/station.gd @@ -39,14 +39,10 @@ func _enter_tree() -> void: # The child station has to call super.ready() for this to be called func ready() -> void: SweetLogger.debug("Station {0} ready", [name]) - if not notification_audio: - SweetLogger.warning("{0} missing notification_audio reference", [name]) - if not ambient_audio: - SweetLogger.warning("{0} missing ambient_audio reference", [name]) - if not snap_zone: - SweetLogger.warning("{0} missing snap_zone reference", [name]) - if not synchronizer: - SweetLogger.warning("{0} missing synchronizer reference", [name]) + Helper.check_reference(self, notification_audio, AudioStreamPlayer3D) + Helper.check_reference(self, ambient_audio, AudioStreamPlayer3D) + Helper.check_reference(self, snap_zone, XRToolsSnapZone) + Helper.check_reference(self, synchronizer, MultiplayerSynchronizer) # Disable if we're not the server. if not NetworkManager.owns_world(): enabled = false diff --git a/abstract/work_station.gd b/abstract/work_station.gd index d34a66f..9541ec4 100644 --- a/abstract/work_station.gd +++ b/abstract/work_station.gd @@ -32,8 +32,7 @@ func _enter_tree() -> void: # The child station has to call super.ready() for this to be called func ready() -> void: super.ready() - if not progress_bar: - SweetLogger.warning("{0} missing progress_bar reference", [name]) + Helper.check_reference(self, progress_bar, ProgressBar3D) # The child station has to call super.process(delta) for this to be called diff --git a/global/helper.gd b/global/helper.gd index 4bd05e4..409683e 100644 --- a/global/helper.gd +++ b/global/helper.gd @@ -72,6 +72,22 @@ static func get_node_from_path(from: Node, node_path: NodePath) -> Node3D: +static func check_reference(node: Node, ref: Variant, type: Variant) -> bool: + if is_instance_valid(ref) and is_instance_of(ref, type): + return true + var type_name: String + if type is Script: + type_name = type.get_global_name() + else: + var probe: Object = type.new() + type_name = probe.get_class() + if not (probe is RefCounted): + probe.free() + SweetLogger.warning("{0} missing reference {1} ({2})", [node.name, type_name, _get_caller_label()]) + return false + + + static func play_sound(player: AudioStreamPlayer3D, stream: AudioStream, pitch_scale: float = 1): if not player: SweetLogger.warning("{0}: AudioStreamPlayer3D is null, can not play sound", [_get_caller_label()])