64 lines
2.6 KiB
GDScript
64 lines
2.6 KiB
GDScript
extends Node
|
|
|
|
func saveGameData(file_name: String):
|
|
var save_data = GameSaveResource.new()
|
|
var objects_container = get_node_or_null("/root/World/objects")
|
|
if objects_container:
|
|
for object in objects_container.get_children():
|
|
for child in object.get_children():
|
|
child.owner = object
|
|
var packed_node = PackedScene.new()
|
|
if packed_node.pack(object) == OK:
|
|
save_data.stored_scenes.append(packed_node)
|
|
var player_node = get_node_or_null("/root/World/PlayerController")
|
|
if player_node:
|
|
var hotbar_control = player_node.get_node_or_null("Camera3D/CanvasLayer/HotBar")
|
|
if hotbar_control and "hotbar" in hotbar_control:
|
|
save_data.stored_hotbar = hotbar_control.hotbar.duplicate(true)
|
|
for child in player_node.get_children():
|
|
child.owner = player_node
|
|
var packed_player = PackedScene.new()
|
|
if packed_player.pack(player_node) == OK:
|
|
save_data.stored_player = packed_player
|
|
var full_path = "user://" + file_name
|
|
var save_result = ResourceSaver.save(save_data, full_path)
|
|
if save_result == OK:
|
|
print("Successfully saved all nodes and items to: ", full_path)
|
|
|
|
|
|
func loadGameData(file_name: String):
|
|
var full_path = "user://" + file_name
|
|
if not ResourceLoader.exists(full_path):
|
|
print("Error: Save file '", full_path, "' does not exist.")
|
|
return
|
|
var save_data = ResourceLoader.load(full_path) as GameSaveResource
|
|
if not save_data:
|
|
print("Error: Could not parse save file.")
|
|
return
|
|
var objects_node = get_node_or_null("/root/World/objects")
|
|
if objects_node:
|
|
for child in objects_node.get_children():
|
|
child.queue_free()
|
|
for packed_node in save_data.stored_scenes:
|
|
if packed_node:
|
|
objects_node.add_child(packed_node.instantiate())
|
|
if save_data.stored_player:
|
|
var current_player = get_node_or_null("/root/World/PlayerController")
|
|
if current_player:
|
|
var player_parent = current_player.get_parent()
|
|
var restored_player = save_data.stored_player.instantiate()
|
|
restored_player.name = "PlayerController_New"
|
|
var hotbar_control = restored_player.get_node_or_null("Camera3D/CanvasLayer/HotBar")
|
|
if hotbar_control and save_data.stored_hotbar:
|
|
hotbar_control.hotbar = save_data.stored_hotbar.duplicate(true)
|
|
player_parent.add_child(restored_player)
|
|
current_player.queue_free()
|
|
await get_tree().process_frame
|
|
if is_instance_valid(restored_player):
|
|
restored_player.name = "PlayerController"
|
|
var final_hotbar = restored_player.get_node_or_null("Camera3D/CanvasLayer/HotBar")
|
|
if final_hotbar and final_hotbar.has_method("updateHotbar"):
|
|
final_hotbar.updateHotbar(final_hotbar.hotbar)
|
|
print("Player and inventory data successfully restored!")
|
|
print("Successfully reloaded game state from disk!")
|