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")]