Godot Version
v4.2.2.stable.official [15073afe3]
Question
Hey everyone!
Lately, I’ve been working on a game in Godot 4.2 and encountered an issue with the inventory system. So, when I add an item to Slot 0, everything seems to work fine - the item appears in the slot as it should. However, upon restarting the game, I find that Slot 0 is empty and has reverted to its default state.
Initially, I thought the problem might lie in how the game state is being saved, but upon checking the code, everything seems to be in order. Here’s he source code:
Scroll Down for screen shots.
InventoryData.gd
extends Resource
class_name InventoryData
signal inventory_updated(inventory_data: InventoryData) # Sygnał emitowany po zmianie danych ekwipunku
signal inventory_interact(inventory_data: InventoryData, index: int, button: int) # Sygnał dla interakcji ze slotami
@export var slot_datas: Array[SlotData] # Tablica do przechowywania danych slotu
func load_inventory():
var inventory_data = load("res://test_inventory.tres") as InventoryData
if inventory_data != null:
slot_datas = inventory_data.slot_datas
func save_inventory():
var inventory_data := InventoryData.new()
inventory_data.slot_datas = slot_datas
# Pobranie danych z okreslonego slotu
func grab_slot_data(index: int) -> SlotData:
var slot_data = slot_datas[index] # Pobierz dane ze wskazanego indeksu
if slot_data: # Jeśli są dane
slot_datas[index] = null # Usuń dane ze slotu
inventory_updated.emit(self) # Wyemituj sygnał inventory_updated
return slot_data # Zwróć dane slotu
else:
return null #Jesli brak danych, zwroc null
# Funkja upuszczenia danych slotu
func drop_slot_data(grabbed_slot_data: SlotData, index: int) -> SlotData:
var slot_data = slot_datas[index]
var return_slot_data: SlotData
# Jeśli istnieją dane i mogą być całkowicie scalone
if slot_data and slot_data.can_fully_merge_with(grabbed_slot_data):
slot_data.fully_merge_with(grabbed_slot_data)
else:
# Jeśli brak istniejących danych lub nie można scalić całkowicie, zastąp dane slotu
slot_datas[index] = grabbed_slot_data
return_slot_data = slot_data
inventory_updated.emit(self) # Wyemituj sygnał inventory_updated
return return_slot_data # Zwróć potencjalnie zastąpione dane
# Funkja upuszczenia jednego przedmiotu ze slotu
func drop_single_slot_data(grabbed_slot_data: SlotData, index: int) -> SlotData:
var slot_data = slot_datas[index]
if not slot_data:
slot_datas[index] = grabbed_slot_data.create_single_slot_data()
elif slot_data.can_merge_with(grabbed_slot_data):
slot_data.fully_merge_with(grabbed_slot_data.create_single_slot_data())
inventory_updated.emit(self)
if grabbed_slot_data.quantity > 0:
return grabbed_slot_data
else:
return null
# Obsługa kliknięcia na slot
func on_slot_clicked(index: int, button: int) -> void:
inventory_interact.emit(self, index, button)
func is_inventory_full() -> bool:
for slot_data in slot_datas:
if not slot_data:
return false # Znaleziono pusty slot, więc ekwipunek nie jest pełny
return true # W ekwipunku nie ma pustych slotów, więc jest pełny
Meteor.gd
extends Node3D
# Licznik trafień
var hit_count:int = 0
@onready var particles1 = $GPUParticles3D2
@onready var particles_red = $CrystalRedParticle
# Funkcja do aktualizacji licznika trafień
func increment_hit_count():
hit_count += 1
if hit_count >= 2:
particles1.emitting = true
particles_red.emitting = true
await get_tree().create_timer(0.5).timeout
queue_free() # Usuń meteoryt z gry
add_crystal() # Dodaje Red Crystal do ekwipunku
func _on_area_3d_area_entered(_area):
particles1.amount_ratio = 8
particles1.emitting = true
particles1.amount_ratio = 60
increment_hit_count()
func add_crystal():
var inventory_data = load("res://test_inventory.tres")
# Utwórz SlotData dla Czerwonego Kryształu
var Red_Crystal = SlotData.new()
Red_Crystal.item_data = load("res://Items/Red_Crystla.tres")
Red_Crystal.quantity = randi_range(5, 15)
# Dodaj Czerwony Kryształ do slotu 0
inventory_data.drop_slot_data(Red_Crystal, 0)
inventory_data.save_inventory()
#inventory_data.save_slots("res://Manager/save.json")
Has anyone encountered a similar problem or knows of a solution? Any help would be greatly appreciated!
Thank you!