From f5f89144f8d68a6a530e919f61f25f8892c5e669 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Thu, 20 Mar 2025 22:32:29 -0400 Subject: [PATCH 01/18] Initial work toward system --- save_load/autoloads/save_game_manager.gd | 32 +++++++++ save_load/autoloads/save_game_manager.gd.uid | 1 + save_load/components/save_data_component.gd | 26 ++++++++ .../components/save_data_component.gd.uid | 1 + save_load/components/save_data_component.tscn | 6 ++ .../components/save_level_data_component.gd | 66 +++++++++++++++++++ .../save_level_data_component.gd.uid | 1 + .../components/save_level_data_component.tscn | 6 ++ .../test_scene_save_data_manager_component.gd | 13 ++++ ...t_scene_save_data_manager_component.gd.uid | 1 + ...est_scene_save_data_manager_component.tscn | 6 ++ .../node_types/block_data_resource.gd | 23 +++++++ .../node_types/block_data_resource.gd.uid | 1 + .../node_types/block_data_resource.tres | 12 ++++ .../node_types/node_data_resource.gd | 21 ++++++ .../node_types/node_data_resource.gd.uid | 1 + .../node_types/node_data_resource.tres | 9 +++ .../node_types/player_data_resource.gd | 16 +++++ .../node_types/player_data_resource.gd.uid | 1 + .../node_types/player_data_resource.tres | 10 +++ .../resources/save_game_data_resource.gd | 7 ++ .../resources/save_game_data_resource.gd.uid | 1 + .../resources/save_game_data_resource.tres | 9 +++ save_load/resources/scene_data_resource.gd | 30 +++++++++ .../resources/scene_data_resource.gd.uid | 1 + save_load/resources/scene_data_resource.tres | 10 +++ 26 files changed, 311 insertions(+) create mode 100644 save_load/autoloads/save_game_manager.gd create mode 100644 save_load/autoloads/save_game_manager.gd.uid create mode 100644 save_load/components/save_data_component.gd create mode 100644 save_load/components/save_data_component.gd.uid create mode 100644 save_load/components/save_data_component.tscn create mode 100644 save_load/components/save_level_data_component.gd create mode 100644 save_load/components/save_level_data_component.gd.uid create mode 100644 save_load/components/save_level_data_component.tscn create mode 100644 save_load/components/test_scene_save_data_manager_component.gd create mode 100644 save_load/components/test_scene_save_data_manager_component.gd.uid create mode 100644 save_load/components/test_scene_save_data_manager_component.tscn create mode 100644 save_load/resources/node_types/block_data_resource.gd create mode 100644 save_load/resources/node_types/block_data_resource.gd.uid create mode 100644 save_load/resources/node_types/block_data_resource.tres create mode 100644 save_load/resources/node_types/node_data_resource.gd create mode 100644 save_load/resources/node_types/node_data_resource.gd.uid create mode 100644 save_load/resources/node_types/node_data_resource.tres create mode 100644 save_load/resources/node_types/player_data_resource.gd create mode 100644 save_load/resources/node_types/player_data_resource.gd.uid create mode 100644 save_load/resources/node_types/player_data_resource.tres create mode 100644 save_load/resources/save_game_data_resource.gd create mode 100644 save_load/resources/save_game_data_resource.gd.uid create mode 100644 save_load/resources/save_game_data_resource.tres create mode 100644 save_load/resources/scene_data_resource.gd create mode 100644 save_load/resources/scene_data_resource.gd.uid create mode 100644 save_load/resources/scene_data_resource.tres diff --git a/save_load/autoloads/save_game_manager.gd b/save_load/autoloads/save_game_manager.gd new file mode 100644 index 0000000..697f602 --- /dev/null +++ b/save_load/autoloads/save_game_manager.gd @@ -0,0 +1,32 @@ +## Performs the actual Saving[br][br] +## +## Below is a basic definition of various components and resources for reference:[br] +## * SaveLevelDataComponent - The root save component that performs saving and loading of the actual data from disk +## * SaveDataComponent - Attached to a node that has properties that need to be saved +## * Node Type Resources - Each type of node that requires saving, such as a TileMapLayer, needs a resource created +extends Node + + +func _unhandled_input(event: InputEvent) -> void: + if event.is_action_pressed("quick_save"): + save_game() + if event.is_action_pressed("quick_load"): + load_game() + + +func save_game() -> void: + var save_level_data_component: SaveLevelDataComponent = get_tree().get_first_node_in_group("save_level_data_component") + + if save_level_data_component == null: + push_error("Could not find SaveLevelDataComponent node in level") + return + + save_level_data_component.save_game() + +func load_game() -> void: + var save_level_data_component: SaveLevelDataComponent = get_tree().get_first_node_in_group("save_level_data_component") + + if save_level_data_component == null: # Nothing to load + return + + save_level_data_component.load_game() diff --git a/save_load/autoloads/save_game_manager.gd.uid b/save_load/autoloads/save_game_manager.gd.uid new file mode 100644 index 0000000..308cfeb --- /dev/null +++ b/save_load/autoloads/save_game_manager.gd.uid @@ -0,0 +1 @@ +uid://dau7tp2xpp0w diff --git a/save_load/components/save_data_component.gd b/save_load/components/save_data_component.gd new file mode 100644 index 0000000..631fff3 --- /dev/null +++ b/save_load/components/save_data_component.gd @@ -0,0 +1,26 @@ +## Add to any node that has data we need to save +## Each node type, such as TileMapLayer, will need a resource created for it +## See `res://save_load/resources/node_types/` +class_name SaveDataComponent +extends Node + + +@export var save_data_resource: NodeDataResource ## The resource describing the type of object being saved + +@onready var parent_node: Node3D = get_parent() + + +func _ready() -> void: + add_to_group("save_data_component") + + +func _save_data() -> Resource: + if parent_node == null: + return + + if save_data_resource == null: + push_error("save_data_resource not defined on node ", parent_node.name) + return + + save_data_resource._save_data(parent_node) + return save_data_resource diff --git a/save_load/components/save_data_component.gd.uid b/save_load/components/save_data_component.gd.uid new file mode 100644 index 0000000..a5b6b36 --- /dev/null +++ b/save_load/components/save_data_component.gd.uid @@ -0,0 +1 @@ +uid://b0400fjcqflgh diff --git a/save_load/components/save_data_component.tscn b/save_load/components/save_data_component.tscn new file mode 100644 index 0000000..ba91d49 --- /dev/null +++ b/save_load/components/save_data_component.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://baki8rbf1ti0r"] + +[ext_resource type="Script" uid="uid://b0400fjcqflgh" path="res://save_load/components/save_data_component.gd" id="1_nm1vf"] + +[node name="SaveDataComponent" type="Node"] +script = ExtResource("1_nm1vf") diff --git a/save_load/components/save_level_data_component.gd b/save_load/components/save_level_data_component.gd new file mode 100644 index 0000000..6a778e0 --- /dev/null +++ b/save_load/components/save_level_data_component.gd @@ -0,0 +1,66 @@ +## Performs the actual saving and loading of data related to this level/scene +## Utilized by the SaveGameManager +class_name SaveLevelDataComponent +extends Node + +## See documentation to where this path is: https://docs.godotengine.org/en/stable/tutorials/io/data_paths.html#accessing-persistent-user-data-user[br][br] +## Default Paths:[br] +## * Windows: %APPDATA%\Godot\app_userdata\[project_name][br] +## * macOS: ~/Library/Application Support/Godot/app_userdata/[project_name][br] +## * Linux: ~/.local/share/godot/app_userdata/[project_name][br] +@export var save_game_data_path: String = "user://game_data/" +@export var save_file_name: String = "save_%s_game_data.tres" + +var level_scene_name: String +var game_data_resource: SaveGameDataResource +var level_save_file_name: String +var save_game_file_path: String + + +func _ready() -> void: + add_to_group("save_level_data_component") + level_scene_name = get_parent().name + + level_save_file_name = save_file_name % level_scene_name + save_game_file_path = save_game_data_path + level_save_file_name + + +func save_node_data() -> void: + var nodes: Array = get_tree().get_nodes_in_group("save_data_component") + + if nodes == null: return + + game_data_resource = SaveGameDataResource.new() + for node: Node in nodes: + if node is SaveDataComponent: + @warning_ignore("unsafe_method_access") + var save_data_resource: NodeDataResource = node._save_data() + var save_final_resource: NodeDataResource = save_data_resource.duplicate() + game_data_resource.save_data_nodes.append(save_final_resource) + +func save_game() -> void: + if !DirAccess.dir_exists_absolute(save_game_data_path): + DirAccess.make_dir_absolute(save_game_data_path) + + save_node_data() + + var result: int = ResourceSaver.save(game_data_resource, save_game_file_path) + print("Save Result: ", result) + + +func load_game() -> void: + if !FileAccess.file_exists(save_game_file_path): + #push_error("Save file does not exist: ", save_game_file_path) + return + + game_data_resource = ResourceLoader.load(save_game_file_path) + + if game_data_resource == null: + push_error("Could not load save file: ", save_game_file_path) + return + + var root_node: Window = get_tree().root + + for resource: Resource in game_data_resource.save_data_nodes: + if resource is NodeDataResource: + (resource as NodeDataResource)._load_data(root_node) diff --git a/save_load/components/save_level_data_component.gd.uid b/save_load/components/save_level_data_component.gd.uid new file mode 100644 index 0000000..4e5b5f3 --- /dev/null +++ b/save_load/components/save_level_data_component.gd.uid @@ -0,0 +1 @@ +uid://c7x2qvyu62230 diff --git a/save_load/components/save_level_data_component.tscn b/save_load/components/save_level_data_component.tscn new file mode 100644 index 0000000..ccdc1d0 --- /dev/null +++ b/save_load/components/save_level_data_component.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://c3pqilb6yh5kc"] + +[ext_resource type="Script" uid="uid://c7x2qvyu62230" path="res://save_load/components/save_level_data_component.gd" id="1_exguq"] + +[node name="SaveLevelDataComponent" type="Node"] +script = ExtResource("1_exguq") diff --git a/save_load/components/test_scene_save_data_manager_component.gd b/save_load/components/test_scene_save_data_manager_component.gd new file mode 100644 index 0000000..e3ebe65 --- /dev/null +++ b/save_load/components/test_scene_save_data_manager_component.gd @@ -0,0 +1,13 @@ +## Basically just load any saved data for the scene that already exists +## Attach this to any test scene to automatically load any data found +class_name TestSceneSaveDataManagerComponent +extends Node + + +func _ready() -> void: + call_deferred("load_test_scene") + + +func load_test_scene() -> void: + SaveGameManager.load_game() + print("Save Game Data Loaded") diff --git a/save_load/components/test_scene_save_data_manager_component.gd.uid b/save_load/components/test_scene_save_data_manager_component.gd.uid new file mode 100644 index 0000000..d5f3a82 --- /dev/null +++ b/save_load/components/test_scene_save_data_manager_component.gd.uid @@ -0,0 +1 @@ +uid://b763cjyd7t2ju diff --git a/save_load/components/test_scene_save_data_manager_component.tscn b/save_load/components/test_scene_save_data_manager_component.tscn new file mode 100644 index 0000000..7101ad6 --- /dev/null +++ b/save_load/components/test_scene_save_data_manager_component.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://dftxu6qsgxyjb"] + +[ext_resource type="Script" uid="uid://b763cjyd7t2ju" path="res://save_load/components/test_scene_save_data_manager_component.gd" id="1_toc0k"] + +[node name="TestSceneSaveDataManagerComponent" type="Node"] +script = ExtResource("1_toc0k") diff --git a/save_load/resources/node_types/block_data_resource.gd b/save_load/resources/node_types/block_data_resource.gd new file mode 100644 index 0000000..25ce0e3 --- /dev/null +++ b/save_load/resources/node_types/block_data_resource.gd @@ -0,0 +1,23 @@ +## The resource utilized for saving a Block +class_name BlockDataResource +extends NodeDataResource + + +@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: + var scene_node: Node = window.get_node_or_null(node_path) + + if scene_node == null: return + + var block: Block = scene_node + block.transform = transform + block.set_id(block_id) + print("Loaded Block: ", block.name) diff --git a/save_load/resources/node_types/block_data_resource.gd.uid b/save_load/resources/node_types/block_data_resource.gd.uid new file mode 100644 index 0000000..ce2e53a --- /dev/null +++ b/save_load/resources/node_types/block_data_resource.gd.uid @@ -0,0 +1 @@ +uid://syaia0l6vjt1 diff --git a/save_load/resources/node_types/block_data_resource.tres b/save_load/resources/node_types/block_data_resource.tres new file mode 100644 index 0000000..8a2bee8 --- /dev/null +++ b/save_load/resources/node_types/block_data_resource.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="BlockDataResource" load_steps=2 format=3 uid="uid://dfos8np8agysk"] + +[ext_resource type="Script" uid="uid://syaia0l6vjt1" path="res://save_load/resources/node_types/block_data_resource.gd" id="1_a06et"] + +[resource] +script = ExtResource("1_a06et") +block_id = "001" +block_position = Vector3(0, 0, 0) +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://syaia0l6vjt1" diff --git a/save_load/resources/node_types/node_data_resource.gd b/save_load/resources/node_types/node_data_resource.gd new file mode 100644 index 0000000..45f9d9f --- /dev/null +++ b/save_load/resources/node_types/node_data_resource.gd @@ -0,0 +1,21 @@ +## The base resource for saving a specific Node +class_name NodeDataResource +extends Resource + + +@export var transform: Transform3D +@export var node_path: NodePath +@export var parent_node_path: NodePath + + + +func _load_data(_window: Window) -> void: + pass + +func _save_data(node: Node3D) -> void: + transform = node.transform + node_path = node.get_path() + + var parent_node: Node3D = node.get_parent() + if parent_node != null: + parent_node_path = parent_node.get_path() diff --git a/save_load/resources/node_types/node_data_resource.gd.uid b/save_load/resources/node_types/node_data_resource.gd.uid new file mode 100644 index 0000000..588b1a0 --- /dev/null +++ b/save_load/resources/node_types/node_data_resource.gd.uid @@ -0,0 +1 @@ +uid://drj0sfem1gmsk diff --git a/save_load/resources/node_types/node_data_resource.tres b/save_load/resources/node_types/node_data_resource.tres new file mode 100644 index 0000000..d97c773 --- /dev/null +++ b/save_load/resources/node_types/node_data_resource.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="NodeDataResource" load_steps=2 format=3 uid="uid://dald1lud7ktsj"] + +[ext_resource type="Script" uid="uid://drj0sfem1gmsk" path="res://save_load/resources/node_types/node_data_resource.gd" id="1_b70a7"] + +[resource] +script = ExtResource("1_b70a7") +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +node_path = NodePath("") +parent_node_path = NodePath("") diff --git a/save_load/resources/node_types/player_data_resource.gd b/save_load/resources/node_types/player_data_resource.gd new file mode 100644 index 0000000..cb43adf --- /dev/null +++ b/save_load/resources/node_types/player_data_resource.gd @@ -0,0 +1,16 @@ +## The resource utilized for saving a Player +class_name PlayerDataResource +extends NodeDataResource + + +func _save_data(node: Node3D) -> void: + super._save_data(node) + # TODO: Save inventory or any other data + + +func _load_data(window: Window) -> void: + var scene_node: Node = window.get_node_or_null(node_path) + + if scene_node == null: return + + #var player: Player = scene_node diff --git a/save_load/resources/node_types/player_data_resource.gd.uid b/save_load/resources/node_types/player_data_resource.gd.uid new file mode 100644 index 0000000..76f78ef --- /dev/null +++ b/save_load/resources/node_types/player_data_resource.gd.uid @@ -0,0 +1 @@ +uid://dodqpooodtguo diff --git a/save_load/resources/node_types/player_data_resource.tres b/save_load/resources/node_types/player_data_resource.tres new file mode 100644 index 0000000..b1d3f4f --- /dev/null +++ b/save_load/resources/node_types/player_data_resource.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="PlayerDataResource" load_steps=2 format=3 uid="uid://bvsurbn5xgchr"] + +[ext_resource type="Script" uid="uid://dodqpooodtguo" path="res://save_load/resources/node_types/player_data_resource.gd" id="1_scty6"] + +[resource] +script = ExtResource("1_scty6") +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://dodqpooodtguo" diff --git a/save_load/resources/save_game_data_resource.gd b/save_load/resources/save_game_data_resource.gd new file mode 100644 index 0000000..0bc84d2 --- /dev/null +++ b/save_load/resources/save_game_data_resource.gd @@ -0,0 +1,7 @@ +## The entire save structure that contains all NodeDataResources +## NodeDataResources will be located by the SaveLevelDataComponent +class_name SaveGameDataResource +extends Resource + + +@export var save_data_nodes: Array[NodeDataResource] diff --git a/save_load/resources/save_game_data_resource.gd.uid b/save_load/resources/save_game_data_resource.gd.uid new file mode 100644 index 0000000..887ce2e --- /dev/null +++ b/save_load/resources/save_game_data_resource.gd.uid @@ -0,0 +1 @@ +uid://di6ov7tpewhft diff --git a/save_load/resources/save_game_data_resource.tres b/save_load/resources/save_game_data_resource.tres new file mode 100644 index 0000000..18f86c8 --- /dev/null +++ b/save_load/resources/save_game_data_resource.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="SaveGameDataResource" load_steps=3 format=3 uid="uid://dkniygoky2jcx"] + +[ext_resource type="Script" uid="uid://drj0sfem1gmsk" path="res://save_load/resources/node_types/node_data_resource.gd" id="1_7yx7n"] +[ext_resource type="Script" uid="uid://di6ov7tpewhft" path="res://save_load/resources/save_game_data_resource.gd" id="1_sbw5t"] + +[resource] +script = ExtResource("1_sbw5t") +save_data_nodes = Array[ExtResource("1_7yx7n")]([]) +metadata/_custom_type_script = "uid://di6ov7tpewhft" diff --git a/save_load/resources/scene_data_resource.gd b/save_load/resources/scene_data_resource.gd new file mode 100644 index 0000000..13f3e75 --- /dev/null +++ b/save_load/resources/scene_data_resource.gd @@ -0,0 +1,30 @@ +## Used with the SaveDataComponent for defining node and scene_file_path +class_name SceneDataResource +extends NodeDataResource + + +@export var node_name: String +@export var scene_file_path: String + + +func _save_data(node: Node3D) -> void: + super._save_data(node) + + node_name = node.name + scene_file_path = node.scene_file_path + + +func _load_data(window: Window) -> void: + var parent_node: Node3D + if parent_node_path != null: + parent_node = window.get_node_or_null(parent_node_path) + + var scene_node: Node3D + if node_path != null: + var scene_file_resource: Resource = load(scene_file_path) + scene_node = scene_file_resource.instantiate() + + if parent_node != null and scene_node != null: + #scene_node.position = position + print("Loading Child: ", scene_node.name) + parent_node.add_child(scene_node) diff --git a/save_load/resources/scene_data_resource.gd.uid b/save_load/resources/scene_data_resource.gd.uid new file mode 100644 index 0000000..76433c3 --- /dev/null +++ b/save_load/resources/scene_data_resource.gd.uid @@ -0,0 +1 @@ +uid://bxr74kmjt6heh diff --git a/save_load/resources/scene_data_resource.tres b/save_load/resources/scene_data_resource.tres new file mode 100644 index 0000000..dc3de75 --- /dev/null +++ b/save_load/resources/scene_data_resource.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="SceneDataResource" load_steps=2 format=3 uid="uid://duqhhi2nlic6n"] + +[ext_resource type="Script" uid="uid://bxr74kmjt6heh" path="res://save_load/resources/scene_data_resource.gd" id="1_ihw72"] + +[resource] +script = ExtResource("1_ihw72") +global_position = Vector2(0, 0) +node_path = NodePath("") +parent_node_path = NodePath("") +metadata/_custom_type_script = "uid://bxr74kmjt6heh" -- 2.30.1 From 18afa0c9236c4d4ce1a5f281b943952cf4e38acc Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Thu, 20 Mar 2025 22:39:11 -0400 Subject: [PATCH 02/18] Renaming NodeDataResource to Node3DDataResource --- save_load/components/save_data_component.gd | 2 +- save_load/components/save_level_data_component.gd | 8 ++++---- save_load/resources/node_types/block_data_resource.gd | 2 +- .../{node_data_resource.gd => node3d_data_resource.gd} | 2 +- ...e_data_resource.gd.uid => node3d_data_resource.gd.uid} | 0 ...{node_data_resource.tres => node3d_data_resource.tres} | 2 +- save_load/resources/node_types/player_data_resource.gd | 2 +- save_load/resources/save_game_data_resource.gd | 6 +++--- save_load/resources/save_game_data_resource.tres | 2 +- save_load/resources/scene_data_resource.gd | 2 +- 10 files changed, 14 insertions(+), 14 deletions(-) rename save_load/resources/node_types/{node_data_resource.gd => node3d_data_resource.gd} (93%) rename save_load/resources/node_types/{node_data_resource.gd.uid => node3d_data_resource.gd.uid} (100%) rename save_load/resources/node_types/{node_data_resource.tres => node3d_data_resource.tres} (82%) diff --git a/save_load/components/save_data_component.gd b/save_load/components/save_data_component.gd index 631fff3..9c801e1 100644 --- a/save_load/components/save_data_component.gd +++ b/save_load/components/save_data_component.gd @@ -5,7 +5,7 @@ class_name SaveDataComponent extends Node -@export var save_data_resource: NodeDataResource ## The resource describing the type of object being saved +@export var save_data_resource: Node3DDataResource ## The resource describing the type of object being saved @onready var parent_node: Node3D = get_parent() diff --git a/save_load/components/save_level_data_component.gd b/save_load/components/save_level_data_component.gd index 6a778e0..e380e8d 100644 --- a/save_load/components/save_level_data_component.gd +++ b/save_load/components/save_level_data_component.gd @@ -34,8 +34,8 @@ func save_node_data() -> void: for node: Node in nodes: if node is SaveDataComponent: @warning_ignore("unsafe_method_access") - var save_data_resource: NodeDataResource = node._save_data() - var save_final_resource: NodeDataResource = save_data_resource.duplicate() + var save_data_resource: Node3DDataResource = node._save_data() + var save_final_resource: Node3DDataResource = save_data_resource.duplicate() game_data_resource.save_data_nodes.append(save_final_resource) func save_game() -> void: @@ -62,5 +62,5 @@ func load_game() -> void: var root_node: Window = get_tree().root for resource: Resource in game_data_resource.save_data_nodes: - if resource is NodeDataResource: - (resource as NodeDataResource)._load_data(root_node) + if resource is Node3DDataResource: + (resource as Node3DDataResource)._load_data(root_node) diff --git a/save_load/resources/node_types/block_data_resource.gd b/save_load/resources/node_types/block_data_resource.gd index 25ce0e3..344cc45 100644 --- a/save_load/resources/node_types/block_data_resource.gd +++ b/save_load/resources/node_types/block_data_resource.gd @@ -1,6 +1,6 @@ ## The resource utilized for saving a Block class_name BlockDataResource -extends NodeDataResource +extends Node3DDataResource @export var block_id: String = "001" diff --git a/save_load/resources/node_types/node_data_resource.gd b/save_load/resources/node_types/node3d_data_resource.gd similarity index 93% rename from save_load/resources/node_types/node_data_resource.gd rename to save_load/resources/node_types/node3d_data_resource.gd index 45f9d9f..0ac6fb9 100644 --- a/save_load/resources/node_types/node_data_resource.gd +++ b/save_load/resources/node_types/node3d_data_resource.gd @@ -1,5 +1,5 @@ ## The base resource for saving a specific Node -class_name NodeDataResource +class_name Node3DDataResource extends Resource diff --git a/save_load/resources/node_types/node_data_resource.gd.uid b/save_load/resources/node_types/node3d_data_resource.gd.uid similarity index 100% rename from save_load/resources/node_types/node_data_resource.gd.uid rename to save_load/resources/node_types/node3d_data_resource.gd.uid diff --git a/save_load/resources/node_types/node_data_resource.tres b/save_load/resources/node_types/node3d_data_resource.tres similarity index 82% rename from save_load/resources/node_types/node_data_resource.tres rename to save_load/resources/node_types/node3d_data_resource.tres index d97c773..6ee5050 100644 --- a/save_load/resources/node_types/node_data_resource.tres +++ b/save_load/resources/node_types/node3d_data_resource.tres @@ -1,6 +1,6 @@ [gd_resource type="Resource" script_class="NodeDataResource" load_steps=2 format=3 uid="uid://dald1lud7ktsj"] -[ext_resource type="Script" uid="uid://drj0sfem1gmsk" path="res://save_load/resources/node_types/node_data_resource.gd" id="1_b70a7"] +[ext_resource type="Script" uid="uid://drj0sfem1gmsk" path="res://save_load/resources/node_types/node3d_data_resource.gd" id="1_b70a7"] [resource] script = ExtResource("1_b70a7") diff --git a/save_load/resources/node_types/player_data_resource.gd b/save_load/resources/node_types/player_data_resource.gd index cb43adf..c88bc39 100644 --- a/save_load/resources/node_types/player_data_resource.gd +++ b/save_load/resources/node_types/player_data_resource.gd @@ -1,6 +1,6 @@ ## The resource utilized for saving a Player class_name PlayerDataResource -extends NodeDataResource +extends Node3DDataResource func _save_data(node: Node3D) -> void: diff --git a/save_load/resources/save_game_data_resource.gd b/save_load/resources/save_game_data_resource.gd index 0bc84d2..bf8f8df 100644 --- a/save_load/resources/save_game_data_resource.gd +++ b/save_load/resources/save_game_data_resource.gd @@ -1,7 +1,7 @@ -## The entire save structure that contains all NodeDataResources -## NodeDataResources will be located by the SaveLevelDataComponent +## The entire save structure that contains all Node3DDataResources +## Node3DDataResources will be located by the SaveLevelDataComponent class_name SaveGameDataResource extends Resource -@export var save_data_nodes: Array[NodeDataResource] +@export var save_data_nodes: Array[Node3DDataResource] diff --git a/save_load/resources/save_game_data_resource.tres b/save_load/resources/save_game_data_resource.tres index 18f86c8..9dc8a6b 100644 --- a/save_load/resources/save_game_data_resource.tres +++ b/save_load/resources/save_game_data_resource.tres @@ -1,6 +1,6 @@ [gd_resource type="Resource" script_class="SaveGameDataResource" load_steps=3 format=3 uid="uid://dkniygoky2jcx"] -[ext_resource type="Script" uid="uid://drj0sfem1gmsk" path="res://save_load/resources/node_types/node_data_resource.gd" id="1_7yx7n"] +[ext_resource type="Script" uid="uid://drj0sfem1gmsk" path="res://save_load/resources/node_types/node3d_data_resource.gd" id="1_7yx7n"] [ext_resource type="Script" uid="uid://di6ov7tpewhft" path="res://save_load/resources/save_game_data_resource.gd" id="1_sbw5t"] [resource] diff --git a/save_load/resources/scene_data_resource.gd b/save_load/resources/scene_data_resource.gd index 13f3e75..5478518 100644 --- a/save_load/resources/scene_data_resource.gd +++ b/save_load/resources/scene_data_resource.gd @@ -1,6 +1,6 @@ ## Used with the SaveDataComponent for defining node and scene_file_path class_name SceneDataResource -extends NodeDataResource +extends Node3DDataResource @export var node_name: String -- 2.30.1 From b7a1f2168db5f8a9364418fd1e65b32d5530d397 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Fri, 21 Mar 2025 16:37:20 -0400 Subject: [PATCH 03/18] Getting loading working, moving player to spawn, and adding signal clearing the world --- autoloads/entity_manager.gd | 2 ++ project.godot | 11 ++++++++++ save_load/autoloads/save_game_manager.gd | 16 ++++++++++---- .../node_types/block_data_resource.gd | 5 +---- .../node_types/player_data_resource.gd | 2 +- scenes/blocks/block.tscn | 7 +++++- scenes/player/player.tscn | 7 +++++- scenes/world/world.gd | 22 +++++++++++++++++++ scenes/world/world.tscn | 8 ++++--- 9 files changed, 66 insertions(+), 14 deletions(-) diff --git a/autoloads/entity_manager.gd b/autoloads/entity_manager.gd index bcf28ef..5cdf46a 100644 --- a/autoloads/entity_manager.gd +++ b/autoloads/entity_manager.gd @@ -2,3 +2,5 @@ extends Node signal create_block(id: String, position: Vector3) signal drop_block(id: String, position: Vector3) +signal clear_blocks ## Used for signaling a deletion of all in the BlocksContainer and DroppedItemsContainer +signal spawn_player(position: Vector3) diff --git a/project.godot b/project.godot index 76d988c..cbfdbc4 100644 --- a/project.godot +++ b/project.godot @@ -21,6 +21,7 @@ Globals="*res://autoloads/globals.gd" EntityManager="*res://autoloads/entity_manager.gd" InventoryManager="*res://autoloads/inventory_manager.gd" DBItems="*res://autoloads/db_items.gd" +SaveGameManager="*res://save_load/autoloads/save_game_manager.gd" [debug] @@ -139,6 +140,16 @@ open_inventory={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":73,"key_label":0,"unicode":105,"location":0,"echo":false,"script":null) ] } +quick_load={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194337,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} +quick_save={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194336,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} [layer_names] diff --git a/save_load/autoloads/save_game_manager.gd b/save_load/autoloads/save_game_manager.gd index 697f602..806d47b 100644 --- a/save_load/autoloads/save_game_manager.gd +++ b/save_load/autoloads/save_game_manager.gd @@ -7,14 +7,18 @@ extends Node +signal game_saved +signal game_loaded + + func _unhandled_input(event: InputEvent) -> void: if event.is_action_pressed("quick_save"): - save_game() + _save_game() if event.is_action_pressed("quick_load"): - load_game() + _load_game() -func save_game() -> void: +func _save_game() -> void: var save_level_data_component: SaveLevelDataComponent = get_tree().get_first_node_in_group("save_level_data_component") if save_level_data_component == null: @@ -22,11 +26,15 @@ func save_game() -> void: return save_level_data_component.save_game() + game_saved.emit() + +func _load_game() -> void: + EntityManager.clear_blocks.emit() -func load_game() -> void: var save_level_data_component: SaveLevelDataComponent = get_tree().get_first_node_in_group("save_level_data_component") if save_level_data_component == null: # Nothing to load return save_level_data_component.load_game() + game_loaded.emit() diff --git a/save_load/resources/node_types/block_data_resource.gd b/save_load/resources/node_types/block_data_resource.gd index 344cc45..6050d7e 100644 --- a/save_load/resources/node_types/block_data_resource.gd +++ b/save_load/resources/node_types/block_data_resource.gd @@ -17,7 +17,4 @@ func _load_data(window: Window) -> void: if scene_node == null: return - var block: Block = scene_node - block.transform = transform - block.set_id(block_id) - print("Loaded Block: ", block.name) + EntityManager.create_block.emit(block_id, transform.origin) diff --git a/save_load/resources/node_types/player_data_resource.gd b/save_load/resources/node_types/player_data_resource.gd index c88bc39..89278d6 100644 --- a/save_load/resources/node_types/player_data_resource.gd +++ b/save_load/resources/node_types/player_data_resource.gd @@ -13,4 +13,4 @@ func _load_data(window: Window) -> void: if scene_node == null: return - #var player: Player = scene_node + EntityManager.spawn_player.emit(transform.origin) diff --git a/scenes/blocks/block.tscn b/scenes/blocks/block.tscn index 6334e95..8c1e73e 100644 --- a/scenes/blocks/block.tscn +++ b/scenes/blocks/block.tscn @@ -1,8 +1,10 @@ -[gd_scene load_steps=8 format=3 uid="uid://b8evbp40gnomt"] +[gd_scene load_steps=10 format=3 uid="uid://b8evbp40gnomt"] [ext_resource type="Script" uid="uid://buvqmrrtmxs2h" path="res://scenes/blocks/block.gd" id="1_7fut1"] [ext_resource type="Material" uid="uid://bgc6efqf8aiqo" path="res://assets/materials/block_highlight.tres" id="2_524ei"] [ext_resource type="Texture2D" uid="uid://dsvk3faenewrl" path="res://assets/textures/grass-block.png" id="3_qi7hx"] +[ext_resource type="PackedScene" uid="uid://baki8rbf1ti0r" path="res://save_load/components/save_data_component.tscn" id="4_60een"] +[ext_resource type="Resource" uid="uid://dfos8np8agysk" path="res://save_load/resources/node_types/block_data_resource.tres" id="5_60een"] [sub_resource type="BoxShape3D" id="BoxShape3D_n5naa"] @@ -29,3 +31,6 @@ mesh = SubResource("BoxMesh_7fut1") [node name="BlockMesh" type="MeshInstance3D" parent="."] mesh = SubResource("BoxMesh_e15ke") surface_material_override/0 = SubResource("StandardMaterial3D_4e127") + +[node name="SaveDataComponent" parent="." instance=ExtResource("4_60een")] +save_data_resource = ExtResource("5_60een") diff --git a/scenes/player/player.tscn b/scenes/player/player.tscn index e21297d..6e9b83a 100644 --- a/scenes/player/player.tscn +++ b/scenes/player/player.tscn @@ -1,7 +1,9 @@ -[gd_scene load_steps=5 format=3 uid="uid://beu1b4leqwgh3"] +[gd_scene load_steps=7 format=3 uid="uid://beu1b4leqwgh3"] [ext_resource type="Script" uid="uid://daly0bs0oat3j" path="res://scenes/player/player.gd" id="1_7sql3"] [ext_resource type="Script" uid="uid://bruuttf8j7wet" path="res://scenes/player/ray_cast_look.gd" id="2_dovo2"] +[ext_resource type="PackedScene" uid="uid://baki8rbf1ti0r" path="res://save_load/components/save_data_component.tscn" id="3_lvxji"] +[ext_resource type="Resource" uid="uid://bvsurbn5xgchr" path="res://save_load/resources/node_types/player_data_resource.tres" id="4_p47bc"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_tv3cd"] radius = 0.47 @@ -39,3 +41,6 @@ script = ExtResource("2_dovo2") [node name="RayCastCrouch" type="RayCast3D" parent="."] editor_description = "Y should be just slightly higher than the height of the standing collision shape" target_position = Vector3(0, 1.96, 0) + +[node name="SaveDataComponent" parent="." instance=ExtResource("3_lvxji")] +save_data_resource = ExtResource("4_p47bc") diff --git a/scenes/world/world.gd b/scenes/world/world.gd index 4741618..4497175 100644 --- a/scenes/world/world.gd +++ b/scenes/world/world.gd @@ -2,17 +2,24 @@ class_name World extends Node3D +@export var default_spawn_position: Vector3 = Vector3.ZERO + +@export_group("Nodes and Scenes") @export var blocks_container: Node3D @export var dropped_items_container: Node3D +@export var player: PackedScene func _ready() -> void: Input.mouse_mode = Input.MOUSE_MODE_CAPTURED EntityManager.create_block.connect(_create_block.bind()) EntityManager.drop_block.connect(_create_dropped_block.bind()) + EntityManager.clear_blocks.connect(_on_clear_blocks.bind()) + EntityManager.spawn_player.connect(_spawn_player.bind()) _initialize_ground() _create_test_blocks() + _spawn_player(default_spawn_position) func _create_block(id: String, block_position: Vector3) -> void: @@ -35,6 +42,13 @@ func _create_test_blocks() -> void: _create_block("00" + str(index), Vector3(index, 3, -5)) _create_dropped_block("00" + str(index), Vector3(index, 2, -3)) +func _spawn_player(player_position: Vector3) -> void: + if has_node("Player"): + $Player.queue_free() + + var _player: Player = player.instantiate() + _player.position = player_position + add_child(_player) func _initialize_ground() -> void: for x: int in range(-10, 11): @@ -47,3 +61,11 @@ func _initialize_ground() -> void: EntityManager.create_block.emit("001", ground_position) else: EntityManager.create_block.emit("002", ground_position) + +## Generally for resetting/emptying the world to allow for load_game +func _on_clear_blocks() -> void: + for block: Block in blocks_container.get_children(): + block.queue_free() + + for block: DroppedBlock in dropped_items_container.get_children(): + block.queue_free() diff --git a/scenes/world/world.tscn b/scenes/world/world.tscn index a1dcf5b..238911e 100644 --- a/scenes/world/world.tscn +++ b/scenes/world/world.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=6 format=3 uid="uid://mkfitwqnerku"] +[gd_scene load_steps=7 format=3 uid="uid://mkfitwqnerku"] [ext_resource type="Script" uid="uid://c0jbvki2cylct" path="res://scenes/world/world.gd" id="1_6m72w"] [ext_resource type="PackedScene" uid="uid://beu1b4leqwgh3" path="res://scenes/player/player.tscn" id="2_sl2e5"] +[ext_resource type="PackedScene" uid="uid://c3pqilb6yh5kc" path="res://save_load/components/save_level_data_component.tscn" id="3_1fp7r"] [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_4rhad"] sky_horizon_color = Color(0.662243, 0.671743, 0.686743, 1) @@ -20,6 +21,7 @@ glow_enabled = true script = ExtResource("1_6m72w") blocks_container = NodePath("BlocksContainer") dropped_items_container = NodePath("DroppedItemsContainer") +player = ExtResource("2_sl2e5") [node name="WorldEnvironment" type="WorldEnvironment" parent="."] environment = SubResource("Environment_sl2e5") @@ -28,8 +30,8 @@ environment = SubResource("Environment_sl2e5") transform = Transform3D(-0.866025, -0.433013, 0.25, 0, 0.5, 0.866025, -0.5, 0.75, -0.433013, 0, 0, 0) shadow_enabled = true -[node name="Player" parent="." instance=ExtResource("2_sl2e5")] - [node name="BlocksContainer" type="Node3D" parent="."] [node name="DroppedItemsContainer" type="Node3D" parent="."] + +[node name="SaveLevelDataComponent" parent="." instance=ExtResource("3_1fp7r")] -- 2.30.1 From c095078d42baa34c24c485f8ae482fef6bd308d5 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Fri, 21 Mar 2025 16:38:27 -0400 Subject: [PATCH 04/18] Moving away from instantiated block to ensure not including within save data --- scenes/blocks/dropped_block.tscn | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/scenes/blocks/dropped_block.tscn b/scenes/blocks/dropped_block.tscn index a813d93..ad99a30 100644 --- a/scenes/blocks/dropped_block.tscn +++ b/scenes/blocks/dropped_block.tscn @@ -1,7 +1,9 @@ -[gd_scene load_steps=7 format=3 uid="uid://bn2olldntd7a6"] +[gd_scene load_steps=13 format=3 uid="uid://bn2olldntd7a6"] [ext_resource type="Script" uid="uid://dkd2qbndc3q1o" path="res://scenes/blocks/dropped_block.gd" id="1_50ggx"] -[ext_resource type="PackedScene" uid="uid://b8evbp40gnomt" path="res://scenes/blocks/block.tscn" id="3_qtifl"] +[ext_resource type="Script" uid="uid://buvqmrrtmxs2h" path="res://scenes/blocks/block.gd" id="2_qtifl"] +[ext_resource type="Material" uid="uid://bgc6efqf8aiqo" path="res://assets/materials/block_highlight.tres" id="3_8xfh1"] +[ext_resource type="Texture2D" uid="uid://dsvk3faenewrl" path="res://assets/textures/grass-block.png" id="3_ix4xk"] [sub_resource type="Animation" id="Animation_kym7p"] length = 0.001 @@ -66,6 +68,18 @@ _data = { &"start_animation": SubResource("Animation_50ggx") } +[sub_resource type="BoxShape3D" id="BoxShape3D_n5naa"] + +[sub_resource type="BoxMesh" id="BoxMesh_7fut1"] +material = ExtResource("3_8xfh1") +size = Vector3(1.01, 1.01, 1.01) + +[sub_resource type="BoxMesh" id="BoxMesh_e15ke"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_4e127"] +albedo_texture = ExtResource("3_ix4xk") +texture_filter = 0 + [sub_resource type="SphereShape3D" id="SphereShape3D_5kft2"] radius = 1.0 @@ -78,7 +92,19 @@ libraries = { } autoplay = "start_animation" -[node name="Block" parent="." instance=ExtResource("3_qtifl")] +[node name="Block" type="StaticBody3D" parent="."] +script = ExtResource("2_qtifl") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Block"] +shape = SubResource("BoxShape3D_n5naa") + +[node name="HighlightMesh" type="MeshInstance3D" parent="Block"] +visible = false +mesh = SubResource("BoxMesh_7fut1") + +[node name="BlockMesh" type="MeshInstance3D" parent="Block"] +mesh = SubResource("BoxMesh_e15ke") +surface_material_override/0 = SubResource("StandardMaterial3D_4e127") [node name="PickupArea" type="Area3D" parent="Block"] transform = Transform3D(0.965926, -0.258819, 0, 0.258819, 0.965926, 0, 0, 0, 1, 0, 0, 0) -- 2.30.1 From e0f6a76dac3ef9e9fbc7044d27d4ddbe38c0c844 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Fri, 21 Mar 2025 16:44:59 -0400 Subject: [PATCH 05/18] Renaming clear_blocks to reset_world --- autoloads/entity_manager.gd | 2 +- save_load/autoloads/save_game_manager.gd | 2 +- scenes/world/world.gd | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/autoloads/entity_manager.gd b/autoloads/entity_manager.gd index 5cdf46a..0919d31 100644 --- a/autoloads/entity_manager.gd +++ b/autoloads/entity_manager.gd @@ -2,5 +2,5 @@ extends Node signal create_block(id: String, position: Vector3) signal drop_block(id: String, position: Vector3) -signal clear_blocks ## Used for signaling a deletion of all in the BlocksContainer and DroppedItemsContainer +signal reset_world ## Used for signaling a deletion of all in the BlocksContainer and DroppedItemsContainer signal spawn_player(position: Vector3) diff --git a/save_load/autoloads/save_game_manager.gd b/save_load/autoloads/save_game_manager.gd index 806d47b..a6e3b3a 100644 --- a/save_load/autoloads/save_game_manager.gd +++ b/save_load/autoloads/save_game_manager.gd @@ -29,7 +29,7 @@ func _save_game() -> void: game_saved.emit() func _load_game() -> void: - EntityManager.clear_blocks.emit() + EntityManager.reset_world.emit() var save_level_data_component: SaveLevelDataComponent = get_tree().get_first_node_in_group("save_level_data_component") diff --git a/scenes/world/world.gd b/scenes/world/world.gd index 4497175..70ac643 100644 --- a/scenes/world/world.gd +++ b/scenes/world/world.gd @@ -14,7 +14,7 @@ func _ready() -> void: Input.mouse_mode = Input.MOUSE_MODE_CAPTURED EntityManager.create_block.connect(_create_block.bind()) EntityManager.drop_block.connect(_create_dropped_block.bind()) - EntityManager.clear_blocks.connect(_on_clear_blocks.bind()) + EntityManager.reset_world.connect(_on_reset_world.bind()) EntityManager.spawn_player.connect(_spawn_player.bind()) _initialize_ground() @@ -63,7 +63,7 @@ func _initialize_ground() -> void: EntityManager.create_block.emit("002", ground_position) ## Generally for resetting/emptying the world to allow for load_game -func _on_clear_blocks() -> void: +func _on_reset_world() -> void: for block: Block in blocks_container.get_children(): block.queue_free() -- 2.30.1 From 5e4f49e21c8222751ca5ef369d048e199dbe7ee0 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Fri, 21 Mar 2025 16:45:15 -0400 Subject: [PATCH 06/18] Ensuring id is defined before trying to hook the target --- scenes/ui/waila.gd | 1 + 1 file changed, 1 insertion(+) diff --git a/scenes/ui/waila.gd b/scenes/ui/waila.gd index ed262e5..d70c0aa 100644 --- a/scenes/ui/waila.gd +++ b/scenes/ui/waila.gd @@ -30,6 +30,7 @@ func get_target() -> Block: func hook_target(id: String) -> void: if not Globals.enable_waila: return + if not id: return var item: ItemResource = DBItems.data[id] name_label.text = item.name + " (" + id + ")" -- 2.30.1 From e65c319cb13f3ef4cb064507a430d66eb2f03e44 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Fri, 21 Mar 2025 16:45:20 -0400 Subject: [PATCH 07/18] Minor formatting --- save_load/resources/node_types/node3d_data_resource.gd | 1 - 1 file changed, 1 deletion(-) diff --git a/save_load/resources/node_types/node3d_data_resource.gd b/save_load/resources/node_types/node3d_data_resource.gd index 0ac6fb9..5e7d65c 100644 --- a/save_load/resources/node_types/node3d_data_resource.gd +++ b/save_load/resources/node_types/node3d_data_resource.gd @@ -8,7 +8,6 @@ extends Resource @export var parent_node_path: NodePath - func _load_data(_window: Window) -> void: pass -- 2.30.1 From 93654d6d0383fc38589dbe315b3c3f3f8c13b746 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Fri, 21 Mar 2025 16:50:40 -0400 Subject: [PATCH 08/18] Adding key bindings --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index d81f41a..ca70c17 100644 --- a/README.md +++ b/README.md @@ -6,3 +6,15 @@ Building a Minecraft clone of sorts to learn Godot. This was initially based on Sable Spirit Studio's YT series but has evolved to be quite a bit different. + +## Key Bindings + +| Input | Description | +| ----- | ----------- | +| `F5` | Quick Save | +| `F6` | Quick Load | +| `left-mouse-click` | Delete block | +| `right-mouse-click` | Create block | +| `scroll-wheel` | Change selected block (does not show the currently select item in the quickslots yet) | +| `Shift` | Sprint/Run | +| `Ctrl` | Crouch | -- 2.30.1 From 4ff98118eeb97dd5fb8b35801427f73acc28d303 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Fri, 21 Mar 2025 17:58:55 -0400 Subject: [PATCH 09/18] Updating variable names --- scenes/world/world.gd | 12 ++++++------ scenes/world/world.tscn | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/scenes/world/world.gd b/scenes/world/world.gd index 70ac643..55aa075 100644 --- a/scenes/world/world.gd +++ b/scenes/world/world.gd @@ -5,9 +5,9 @@ extends Node3D @export var default_spawn_position: Vector3 = Vector3.ZERO @export_group("Nodes and Scenes") -@export var blocks_container: Node3D -@export var dropped_items_container: Node3D -@export var player: PackedScene +@export var blocks_container: Node3D ## Container where spawned blocks are added +@export var dropped_items_container: Node3D ## Container where spawned dropped items are added +@export var player_scene: PackedScene func _ready() -> void: @@ -46,9 +46,9 @@ func _spawn_player(player_position: Vector3) -> void: if has_node("Player"): $Player.queue_free() - var _player: Player = player.instantiate() - _player.position = player_position - add_child(_player) + var player: Player = player_scene.instantiate() + player.position = player_position + add_child(player) func _initialize_ground() -> void: for x: int in range(-10, 11): diff --git a/scenes/world/world.tscn b/scenes/world/world.tscn index 238911e..62afba0 100644 --- a/scenes/world/world.tscn +++ b/scenes/world/world.tscn @@ -21,7 +21,7 @@ glow_enabled = true script = ExtResource("1_6m72w") blocks_container = NodePath("BlocksContainer") dropped_items_container = NodePath("DroppedItemsContainer") -player = ExtResource("2_sl2e5") +player_scene = ExtResource("2_sl2e5") [node name="WorldEnvironment" type="WorldEnvironment" parent="."] environment = SubResource("Environment_sl2e5") -- 2.30.1 From 40afee187bfa808b04a1222275bb7fe3ce3a0ea0 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Fri, 21 Mar 2025 18:02:59 -0400 Subject: [PATCH 10/18] Cleanup --- .../test_scene_save_data_manager_component.gd | 13 ------------- .../test_scene_save_data_manager_component.gd.uid | 1 - .../test_scene_save_data_manager_component.tscn | 6 ------ save_load/resources/scene_data_resource.gd | 2 -- 4 files changed, 22 deletions(-) delete mode 100644 save_load/components/test_scene_save_data_manager_component.gd delete mode 100644 save_load/components/test_scene_save_data_manager_component.gd.uid delete mode 100644 save_load/components/test_scene_save_data_manager_component.tscn diff --git a/save_load/components/test_scene_save_data_manager_component.gd b/save_load/components/test_scene_save_data_manager_component.gd deleted file mode 100644 index e3ebe65..0000000 --- a/save_load/components/test_scene_save_data_manager_component.gd +++ /dev/null @@ -1,13 +0,0 @@ -## Basically just load any saved data for the scene that already exists -## Attach this to any test scene to automatically load any data found -class_name TestSceneSaveDataManagerComponent -extends Node - - -func _ready() -> void: - call_deferred("load_test_scene") - - -func load_test_scene() -> void: - SaveGameManager.load_game() - print("Save Game Data Loaded") diff --git a/save_load/components/test_scene_save_data_manager_component.gd.uid b/save_load/components/test_scene_save_data_manager_component.gd.uid deleted file mode 100644 index d5f3a82..0000000 --- a/save_load/components/test_scene_save_data_manager_component.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://b763cjyd7t2ju diff --git a/save_load/components/test_scene_save_data_manager_component.tscn b/save_load/components/test_scene_save_data_manager_component.tscn deleted file mode 100644 index 7101ad6..0000000 --- a/save_load/components/test_scene_save_data_manager_component.tscn +++ /dev/null @@ -1,6 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://dftxu6qsgxyjb"] - -[ext_resource type="Script" uid="uid://b763cjyd7t2ju" path="res://save_load/components/test_scene_save_data_manager_component.gd" id="1_toc0k"] - -[node name="TestSceneSaveDataManagerComponent" type="Node"] -script = ExtResource("1_toc0k") diff --git a/save_load/resources/scene_data_resource.gd b/save_load/resources/scene_data_resource.gd index 5478518..d06fd00 100644 --- a/save_load/resources/scene_data_resource.gd +++ b/save_load/resources/scene_data_resource.gd @@ -25,6 +25,4 @@ func _load_data(window: Window) -> void: scene_node = scene_file_resource.instantiate() if parent_node != null and scene_node != null: - #scene_node.position = position - print("Loading Child: ", scene_node.name) parent_node.add_child(scene_node) -- 2.30.1 From 21067303027d71a5c4799f7a51fd57ec88f750bf Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Fri, 21 Mar 2025 18:15:41 -0400 Subject: [PATCH 11/18] Adding/Updating error messages when saving/loading --- save_load/components/save_level_data_component.gd | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/save_load/components/save_level_data_component.gd b/save_load/components/save_level_data_component.gd index e380e8d..8e43f10 100644 --- a/save_load/components/save_level_data_component.gd +++ b/save_load/components/save_level_data_component.gd @@ -45,22 +45,20 @@ func save_game() -> void: save_node_data() var result: int = ResourceSaver.save(game_data_resource, save_game_file_path) - print("Save Result: ", result) - + if result != OK: + printerr("Failed to save game: ", result) func load_game() -> void: if !FileAccess.file_exists(save_game_file_path): - #push_error("Save file does not exist: ", save_game_file_path) + printerr("Failed to load save. File does not exist: ", save_game_file_path) return game_data_resource = ResourceLoader.load(save_game_file_path) - if game_data_resource == null: - push_error("Could not load save file: ", save_game_file_path) + printerr("Failed to load save. Unknown format? ", save_game_file_path) return var root_node: Window = get_tree().root - for resource: Resource in game_data_resource.save_data_nodes: if resource is Node3DDataResource: (resource as Node3DDataResource)._load_data(root_node) -- 2.30.1 From 5556483af38fbe771f094210bef69402d6f04941 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Fri, 21 Mar 2025 18:32:38 -0400 Subject: [PATCH 12/18] Updating error --- save_load/autoloads/save_game_manager.gd | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/save_load/autoloads/save_game_manager.gd b/save_load/autoloads/save_game_manager.gd index a6e3b3a..3a2a1e0 100644 --- a/save_load/autoloads/save_game_manager.gd +++ b/save_load/autoloads/save_game_manager.gd @@ -33,7 +33,8 @@ func _load_game() -> void: var save_level_data_component: SaveLevelDataComponent = get_tree().get_first_node_in_group("save_level_data_component") - if save_level_data_component == null: # Nothing to load + if save_level_data_component == null: + push_error("Could not find SaveLevelDataComponent node in level") return save_level_data_component.load_game() -- 2.30.1 From 1538eb2ff50cdd59da35be1300f9378c8758b81e Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Fri, 21 Mar 2025 18:38:34 -0400 Subject: [PATCH 13/18] Fixing player spawning on load --- scenes/world/world.gd | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scenes/world/world.gd b/scenes/world/world.gd index 55aa075..d87dcb0 100644 --- a/scenes/world/world.gd +++ b/scenes/world/world.gd @@ -45,11 +45,14 @@ func _create_test_blocks() -> void: func _spawn_player(player_position: Vector3) -> void: if has_node("Player"): $Player.queue_free() + await $Player.tree_exited var player: Player = player_scene.instantiate() player.position = player_position + player.name = "Player" add_child(player) + func _initialize_ground() -> void: for x: int in range(-10, 11): for z: int in range(-10, 11): -- 2.30.1 From 06998f15fd5ed273bb510bf54024a59c343b32c4 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Fri, 21 Mar 2025 19:43:00 -0400 Subject: [PATCH 14/18] Adding game_version to save files --- project.godot | 1 + save_load/resources/save_game_data_resource.gd | 1 + 2 files changed, 2 insertions(+) diff --git a/project.godot b/project.godot index cbfdbc4..76e9f90 100644 --- a/project.godot +++ b/project.godot @@ -11,6 +11,7 @@ config_version=5 [application] config/name="Skyblock" +config/version="0.0.1" run/main_scene="uid://cgx0nawwjjj7g" config/features=PackedStringArray("4.4", "Forward Plus") config/icon="res://icon.svg" diff --git a/save_load/resources/save_game_data_resource.gd b/save_load/resources/save_game_data_resource.gd index bf8f8df..fc7c193 100644 --- a/save_load/resources/save_game_data_resource.gd +++ b/save_load/resources/save_game_data_resource.gd @@ -4,4 +4,5 @@ class_name SaveGameDataResource extends Resource +@export var game_version: String = ProjectSettings.get_setting("application/config/version") @export var save_data_nodes: Array[Node3DDataResource] -- 2.30.1 From f757020bcfd354f34099f011edd13880c993e29d Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Fri, 21 Mar 2025 19:56:01 -0400 Subject: [PATCH 15/18] Fixing issue with loading more than once in a session --- save_load/resources/node_types/block_data_resource.gd | 4 ---- 1 file changed, 4 deletions(-) diff --git a/save_load/resources/node_types/block_data_resource.gd b/save_load/resources/node_types/block_data_resource.gd index 6050d7e..861cfaa 100644 --- a/save_load/resources/node_types/block_data_resource.gd +++ b/save_load/resources/node_types/block_data_resource.gd @@ -13,8 +13,4 @@ func _save_data(node: Node3D) -> void: func _load_data(window: Window) -> void: - var scene_node: Node = window.get_node_or_null(node_path) - - if scene_node == null: return - EntityManager.create_block.emit(block_id, transform.origin) -- 2.30.1 From c4a21a802b56b628f454f307e036689819257d68 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Fri, 21 Mar 2025 19:56:06 -0400 Subject: [PATCH 16/18] Cleanup --- save_load/resources/node_types/node3d_data_resource.gd | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/save_load/resources/node_types/node3d_data_resource.gd b/save_load/resources/node_types/node3d_data_resource.gd index 5e7d65c..ccde21c 100644 --- a/save_load/resources/node_types/node3d_data_resource.gd +++ b/save_load/resources/node_types/node3d_data_resource.gd @@ -8,9 +8,6 @@ extends Resource @export var parent_node_path: NodePath -func _load_data(_window: Window) -> void: - pass - func _save_data(node: Node3D) -> void: transform = node.transform node_path = node.get_path() @@ -18,3 +15,6 @@ func _save_data(node: Node3D) -> void: var parent_node: Node3D = node.get_parent() if parent_node != null: parent_node_path = parent_node.get_path() + +func _load_data(_window: Window) -> void: + pass -- 2.30.1 From e4eb18a30ac7c869b1e7e4cd7ce0b7673a2833dc Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Fri, 21 Mar 2025 19:57:28 -0400 Subject: [PATCH 17/18] Correcting warning --- save_load/resources/node_types/block_data_resource.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/save_load/resources/node_types/block_data_resource.gd b/save_load/resources/node_types/block_data_resource.gd index 861cfaa..1c08dc6 100644 --- a/save_load/resources/node_types/block_data_resource.gd +++ b/save_load/resources/node_types/block_data_resource.gd @@ -12,5 +12,5 @@ func _save_data(node: Node3D) -> void: block_id = node.id -func _load_data(window: Window) -> void: +func _load_data(_window: Window) -> void: EntityManager.create_block.emit(block_id, transform.origin) -- 2.30.1 From ab239e937a0def46eb7cb5bb4e72602f1ff9b306 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Fri, 21 Mar 2025 20:04:04 -0400 Subject: [PATCH 18/18] Utilize the player Transform for rotation and position --- autoloads/entity_manager.gd | 2 +- save_load/resources/node_types/player_data_resource.gd | 2 +- scenes/world/world.gd | 9 ++++++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/autoloads/entity_manager.gd b/autoloads/entity_manager.gd index 0919d31..df62167 100644 --- a/autoloads/entity_manager.gd +++ b/autoloads/entity_manager.gd @@ -3,4 +3,4 @@ extends Node signal create_block(id: String, position: Vector3) signal drop_block(id: String, position: Vector3) signal reset_world ## Used for signaling a deletion of all in the BlocksContainer and DroppedItemsContainer -signal spawn_player(position: Vector3) +signal spawn_player(transform: Transform3D) diff --git a/save_load/resources/node_types/player_data_resource.gd b/save_load/resources/node_types/player_data_resource.gd index 89278d6..c2b7cfb 100644 --- a/save_load/resources/node_types/player_data_resource.gd +++ b/save_load/resources/node_types/player_data_resource.gd @@ -13,4 +13,4 @@ func _load_data(window: Window) -> void: if scene_node == null: return - EntityManager.spawn_player.emit(transform.origin) + EntityManager.spawn_player.emit(transform) diff --git a/scenes/world/world.gd b/scenes/world/world.gd index d87dcb0..0dde3c0 100644 --- a/scenes/world/world.gd +++ b/scenes/world/world.gd @@ -19,7 +19,10 @@ func _ready() -> void: _initialize_ground() _create_test_blocks() - _spawn_player(default_spawn_position) + + var default_transform: Transform3D = Transform3D() + default_transform.origin = default_spawn_position + _spawn_player(default_transform) func _create_block(id: String, block_position: Vector3) -> void: @@ -42,13 +45,13 @@ func _create_test_blocks() -> void: _create_block("00" + str(index), Vector3(index, 3, -5)) _create_dropped_block("00" + str(index), Vector3(index, 2, -3)) -func _spawn_player(player_position: Vector3) -> void: +func _spawn_player(player_position: Transform3D) -> void: if has_node("Player"): $Player.queue_free() await $Player.tree_exited var player: Player = player_scene.instantiate() - player.position = player_position + player.transform = player_position player.name = "Player" add_child(player) -- 2.30.1