From 82fe344c127a7baa09e6353c587398a0fcde7b1d Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Fri, 28 Mar 2025 15:44:30 -0400 Subject: [PATCH 1/4] Allow for Node type resource saving --- addons/save_load_system/autoloads/save_game_manager.gd | 4 ++-- .../save_load_system/components/save_data_component.gd | 4 ++-- .../resources/node_types/node3d_data_resource.gd | 2 +- .../resources/node_types/node_data_resource.gd | 10 ++++++++++ .../resources/node_types/node_data_resource.gd.uid | 1 + .../resources/node_types/node_data_resource.tres | 7 +++++++ .../resources/save_game_data_resource.gd | 2 +- 7 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 addons/save_load_system/resources/node_types/node_data_resource.gd create mode 100644 addons/save_load_system/resources/node_types/node_data_resource.gd.uid create mode 100644 addons/save_load_system/resources/node_types/node_data_resource.tres diff --git a/addons/save_load_system/autoloads/save_game_manager.gd b/addons/save_load_system/autoloads/save_game_manager.gd index 61e4c86..ecbfc13 100644 --- a/addons/save_load_system/autoloads/save_game_manager.gd +++ b/addons/save_load_system/autoloads/save_game_manager.gd @@ -130,8 +130,8 @@ func _generate_save_game_resource() -> SaveGameDataResource: for node: Node in nodes: if node is SaveDataComponent: @warning_ignore("unsafe_method_access") - var save_data_resource: Node3DDataResource = node._save_data() - var save_final_resource: Node3DDataResource = save_data_resource.duplicate() + var save_data_resource: NodeDataResource = node._save_data() + var save_final_resource: NodeDataResource = save_data_resource.duplicate() _resource.save_data_nodes.append(save_final_resource) return _resource diff --git a/addons/save_load_system/components/save_data_component.gd b/addons/save_load_system/components/save_data_component.gd index 9c801e1..52ab333 100644 --- a/addons/save_load_system/components/save_data_component.gd +++ b/addons/save_load_system/components/save_data_component.gd @@ -5,9 +5,9 @@ class_name SaveDataComponent extends Node -@export var save_data_resource: Node3DDataResource ## The resource describing the type of object being saved +@export var save_data_resource: Resource ## The resource describing the type of object being saved -@onready var parent_node: Node3D = get_parent() +@onready var parent_node: Node = get_parent() func _ready() -> void: diff --git a/addons/save_load_system/resources/node_types/node3d_data_resource.gd b/addons/save_load_system/resources/node_types/node3d_data_resource.gd index ccde21c..9a4e46f 100644 --- a/addons/save_load_system/resources/node_types/node3d_data_resource.gd +++ b/addons/save_load_system/resources/node_types/node3d_data_resource.gd @@ -1,6 +1,6 @@ ## The base resource for saving a specific Node class_name Node3DDataResource -extends Resource +extends NodeDataResource @export var transform: Transform3D diff --git a/addons/save_load_system/resources/node_types/node_data_resource.gd b/addons/save_load_system/resources/node_types/node_data_resource.gd new file mode 100644 index 0000000..0a08552 --- /dev/null +++ b/addons/save_load_system/resources/node_types/node_data_resource.gd @@ -0,0 +1,10 @@ +## The base resource for saving a specific Node +class_name NodeDataResource +extends Resource + + +func _save_data(node: Node3D) -> void: + pass + +func _load_data(_window: Window) -> void: + pass diff --git a/addons/save_load_system/resources/node_types/node_data_resource.gd.uid b/addons/save_load_system/resources/node_types/node_data_resource.gd.uid new file mode 100644 index 0000000..aaef0a3 --- /dev/null +++ b/addons/save_load_system/resources/node_types/node_data_resource.gd.uid @@ -0,0 +1 @@ +uid://ku7pqlxdta2r diff --git a/addons/save_load_system/resources/node_types/node_data_resource.tres b/addons/save_load_system/resources/node_types/node_data_resource.tres new file mode 100644 index 0000000..5f783b7 --- /dev/null +++ b/addons/save_load_system/resources/node_types/node_data_resource.tres @@ -0,0 +1,7 @@ +[gd_resource type="Resource" script_class="NodeDataResource" load_steps=2 format=3 uid="uid://btcyin8cer74n"] + +[ext_resource type="Script" uid="uid://ku7pqlxdta2r" path="res://addons/save_load_system/resources/node_types/node_data_resource.gd" id="1_0d08a"] + +[resource] +script = ExtResource("1_0d08a") +metadata/_custom_type_script = "uid://ku7pqlxdta2r" diff --git a/addons/save_load_system/resources/save_game_data_resource.gd b/addons/save_load_system/resources/save_game_data_resource.gd index 3da5a77..8042047 100644 --- a/addons/save_load_system/resources/save_game_data_resource.gd +++ b/addons/save_load_system/resources/save_game_data_resource.gd @@ -5,7 +5,7 @@ extends Resource @export var game_version: String = ProjectSettings.get_setting("application/config/version") -@export var save_data_nodes: Array[Node3DDataResource] +@export var save_data_nodes: Array[NodeDataResource] @export var save_name: String @export var save_date: String From 13c4781ee8ca8ce97a7dbaddb7feb3bc6325c73f Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Fri, 28 Mar 2025 15:50:13 -0400 Subject: [PATCH 2/4] Fixing loading non-Node3DDataResources --- addons/save_load_system/autoloads/save_game_manager.gd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/save_load_system/autoloads/save_game_manager.gd b/addons/save_load_system/autoloads/save_game_manager.gd index ecbfc13..d7ecbc7 100644 --- a/addons/save_load_system/autoloads/save_game_manager.gd +++ b/addons/save_load_system/autoloads/save_game_manager.gd @@ -244,8 +244,8 @@ func _on_apply_save() -> void: var root_node: Window = get_tree().root for resource: Resource in _loaded_save_resource.save_data_nodes: - if resource is Node3DDataResource: - (resource as Node3DDataResource)._load_data(root_node) + if resource is NodeDataResource: + (resource as NodeDataResource)._load_data(root_node) apply_complete.emit() From f17171e41a020b8b5b56c43a1386e24cd8c7e724 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Fri, 28 Mar 2025 15:52:03 -0400 Subject: [PATCH 3/4] Moving DayNightCycleComponent to Node and saving time when performing a save --- .../day_night_cycle_data_resource.gd | 19 +++++++++++++++++++ .../day_night_cycle_data_resource.gd.uid | 1 + .../day_night_cycle_data_resource.tres | 9 +++++++++ scenes/world/day_night_cycle_component.gd | 4 +++- scenes/world/day_night_cycle_component.tscn | 9 +++++++-- 5 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 resources/save_load_node_types/day_night_cycle_data_resource.gd create mode 100644 resources/save_load_node_types/day_night_cycle_data_resource.gd.uid create mode 100644 resources/save_load_node_types/day_night_cycle_data_resource.tres diff --git a/resources/save_load_node_types/day_night_cycle_data_resource.gd b/resources/save_load_node_types/day_night_cycle_data_resource.gd new file mode 100644 index 0000000..51da62c --- /dev/null +++ b/resources/save_load_node_types/day_night_cycle_data_resource.gd @@ -0,0 +1,19 @@ +## The base resource for saving a specific Node +class_name DayNightCycleDataResource +extends NodeDataResource + + +@export var time: float ## Time from DayNightCycleComponent.time +@export var node_path: NodePath + + +func _save_data(node: Node) -> void: + node_path = node.get_path() + time = node.time + +func _load_data(window: Window) -> void: + var scene_node: DayNightCycleComponent = window.get_node_or_null(node_path) + if scene_node == null: + printerr("Couldn't find DayNightCycleDataResource.node_path") + return + scene_node.set_time.emit(time) diff --git a/resources/save_load_node_types/day_night_cycle_data_resource.gd.uid b/resources/save_load_node_types/day_night_cycle_data_resource.gd.uid new file mode 100644 index 0000000..a4affe6 --- /dev/null +++ b/resources/save_load_node_types/day_night_cycle_data_resource.gd.uid @@ -0,0 +1 @@ +uid://7gwknxsl1fgd diff --git a/resources/save_load_node_types/day_night_cycle_data_resource.tres b/resources/save_load_node_types/day_night_cycle_data_resource.tres new file mode 100644 index 0000000..193e461 --- /dev/null +++ b/resources/save_load_node_types/day_night_cycle_data_resource.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="DayNightCycleDataResource" load_steps=2 format=3 uid="uid://ccv6fi1lk8ofm"] + +[ext_resource type="Script" uid="uid://7gwknxsl1fgd" path="res://resources/save_load_node_types/day_night_cycle_data_resource.gd" id="1_jnnxf"] + +[resource] +script = ExtResource("1_jnnxf") +time = 0.0 +node_path = NodePath("") +metadata/_custom_type_script = "uid://7gwknxsl1fgd" diff --git a/scenes/world/day_night_cycle_component.gd b/scenes/world/day_night_cycle_component.gd index c4c66a1..77d3cc4 100644 --- a/scenes/world/day_night_cycle_component.gd +++ b/scenes/world/day_night_cycle_component.gd @@ -1,4 +1,5 @@ -extends Node3D +class_name DayNightCycleComponent +extends Node signal end_of_day @@ -66,6 +67,7 @@ func _ready() -> void: resume_time.connect(_on_resume_time) set_day_length.connect(_on_set_day_length) set_rate_of_time.connect(_on_set_rate_of_time) + set_time.connect(_on_set_time) func update_tick_rate(new_rate: float = 1.0) -> void: diff --git a/scenes/world/day_night_cycle_component.tscn b/scenes/world/day_night_cycle_component.tscn index aa047b4..4ae3ef1 100644 --- a/scenes/world/day_night_cycle_component.tscn +++ b/scenes/world/day_night_cycle_component.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=11 format=3 uid="uid://58cvwtpnkq8r"] +[gd_scene load_steps=13 format=3 uid="uid://58cvwtpnkq8r"] [ext_resource type="Script" uid="uid://odh7sbmaku32" path="res://scenes/world/day_night_cycle_component.gd" id="1_xc0aj"] [ext_resource type="Gradient" uid="uid://bgsedjexjylfr" path="res://resources/world/moon_color_gradient.tres" id="2_65gyo"] @@ -7,6 +7,8 @@ [ext_resource type="Curve" uid="uid://ds0dqy41plskw" path="res://resources/world/sun_intensity_curve.tres" id="5_wylv2"] [ext_resource type="Gradient" uid="uid://d0cpq2rok3jsi" path="res://resources/world/sky_top_color_gradient.tres" id="6_ckt1h"] [ext_resource type="Gradient" uid="uid://dvpnjt66dtk46" path="res://resources/world/sky_horizon_color_gradient.tres" id="7_03v7x"] +[ext_resource type="PackedScene" uid="uid://baki8rbf1ti0r" path="res://addons/save_load_system/components/save_data_component.tscn" id="8_65gyo"] +[ext_resource type="Resource" uid="uid://ccv6fi1lk8ofm" path="res://resources/save_load_node_types/day_night_cycle_data_resource.tres" id="9_bdvt6"] [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_4rhad"] @@ -19,7 +21,7 @@ sky = SubResource("Sky_dphjl") tonemap_mode = 2 glow_enabled = true -[node name="DayNightCycleComponent" type="Node3D" node_paths=PackedStringArray("environment", "sun", "moon")] +[node name="DayNightCycleComponent" type="Node" node_paths=PackedStringArray("environment", "sun", "moon")] script = ExtResource("1_xc0aj") moon_color = ExtResource("2_65gyo") moon_intensity = ExtResource("3_bdvt6") @@ -42,3 +44,6 @@ shadow_enabled = true [node name="Moon" type="DirectionalLight3D" parent="."] shadow_enabled = true sky_mode = 1 + +[node name="SaveDataComponent" parent="." instance=ExtResource("8_65gyo")] +save_data_resource = ExtResource("9_bdvt6") From d6b02a9fb3ab63c8ec93942a830f82340bedd5de Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Fri, 28 Mar 2025 16:30:55 -0400 Subject: [PATCH 4/4] Adding DroppedBlockDataResource for saving dropped block positions --- .../dropped_block_data_resource.gd | 15 +++++++++++++++ .../dropped_block_data_resource.gd.uid | 1 + .../dropped_block_data_resource.tres | 11 +++++++++++ scenes/blocks/dropped_block.tscn | 7 ++++++- 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 resources/save_load_node_types/dropped_block_data_resource.gd create mode 100644 resources/save_load_node_types/dropped_block_data_resource.gd.uid create mode 100644 resources/save_load_node_types/dropped_block_data_resource.tres diff --git a/resources/save_load_node_types/dropped_block_data_resource.gd b/resources/save_load_node_types/dropped_block_data_resource.gd new file mode 100644 index 0000000..7de035c --- /dev/null +++ b/resources/save_load_node_types/dropped_block_data_resource.gd @@ -0,0 +1,15 @@ +class_name DroppedBlockDataResource +extends Node3DDataResource + + +@export var block_id: String = "001" + + +func _save_data(node: Node3D) -> void: + super._save_data(node) + + block_id = node.id + + +func _load_data(_window: Window) -> void: + EntityManager.drop_block.emit(block_id, transform.origin, Vector3.ZERO, 0.0) diff --git a/resources/save_load_node_types/dropped_block_data_resource.gd.uid b/resources/save_load_node_types/dropped_block_data_resource.gd.uid new file mode 100644 index 0000000..f79bb2f --- /dev/null +++ b/resources/save_load_node_types/dropped_block_data_resource.gd.uid @@ -0,0 +1 @@ +uid://ddk34r80lscu0 diff --git a/resources/save_load_node_types/dropped_block_data_resource.tres b/resources/save_load_node_types/dropped_block_data_resource.tres new file mode 100644 index 0000000..a46308c --- /dev/null +++ b/resources/save_load_node_types/dropped_block_data_resource.tres @@ -0,0 +1,11 @@ +[gd_resource type="Resource" script_class="DroppedBlockDataResource" load_steps=2 format=3 uid="uid://g26k1qtkabwf"] + +[ext_resource type="Script" uid="uid://ddk34r80lscu0" path="res://resources/save_load_node_types/dropped_block_data_resource.gd" id="1_ax78v"] + +[resource] +script = ExtResource("1_ax78v") +block_id = "001" +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +node_path = NodePath("") +parent_node_path = NodePath("") +metadata/_custom_type_script = "uid://ddk34r80lscu0" diff --git a/scenes/blocks/dropped_block.tscn b/scenes/blocks/dropped_block.tscn index 0473dae..a2fe66a 100644 --- a/scenes/blocks/dropped_block.tscn +++ b/scenes/blocks/dropped_block.tscn @@ -1,7 +1,9 @@ -[gd_scene load_steps=8 format=3 uid="uid://dq6alec7d35gc"] +[gd_scene load_steps=10 format=3 uid="uid://dq6alec7d35gc"] [ext_resource type="Script" uid="uid://d2uws50yjvp6w" path="res://scenes/blocks/dropped_block.gd" id="1_y8usf"] [ext_resource type="PackedScene" uid="uid://c8dch55d3txns" path="res://scenes/blocks/block_mesh.tscn" id="2_5kft2"] +[ext_resource type="PackedScene" uid="uid://baki8rbf1ti0r" path="res://addons/save_load_system/components/save_data_component.tscn" id="3_ix4xk"] +[ext_resource type="Resource" uid="uid://g26k1qtkabwf" path="res://resources/save_load_node_types/dropped_block_data_resource.tres" id="4_8xfh1"] [sub_resource type="Animation" id="Animation_kym7p"] length = 0.001 @@ -124,4 +126,7 @@ monitorable = false visible = false shape = SubResource("SphereShape3D_5kft2") +[node name="SaveDataComponent" parent="." instance=ExtResource("3_ix4xk")] +save_data_resource = ExtResource("4_8xfh1") + [connection signal="body_entered" from="PickupArea" to="." method="_on_pickup_area_body_entered"]