How to reset resources?

Godot Version

Godot 4.3

Question

I’ve made resources to hold my weapons stats and used export variables to change them according to the weapon level:

item.gd:

extends Resource
class_name Item

@export var item_name: String
@export var item_description: String
@export var item_type: String
@export var item_icon: Texture2D
@export var item_level: int
@export var item_max_level: int
@export var item_leveldesc: String

# Método para usar o item
func _ready() -> void:
	pass

The problem is, when I reload the scene, the resource keeps the item level and I have to close the game and open it again for the resource to return to the original value.

This is one of my weapon scripts:


extends Area2D

@export var sprite: Sprite2D
@export var timer: Timer
@export var audio_stream: AudioStreamPlayer2D
@export var gunrange: CollisionShape2D
@export var animation_player: AnimationPlayer
@export var piercing: bool
@export var item_data: Weapon

func _ready() -> void:
	pass
func _physics_process(delta: float) -> void:
	gunrange.scale = Vector2(item_data.range_size, item_data.range_size)
	var enemies_in_range = get_overlapping_bodies()
	timer.wait_time = item_data.fire_rate
	if enemies_in_range.size() > 0:
		var target_enemy = enemies_in_range.front()
		look_at(target_enemy.global_position)

		# Verifica se a rotação exige espelhamento
		update_weapon_flip()
		
		# Lógica de disparo
		if timer.is_stopped():
			timer.start()
	else:
		# Se não houver inimigos no range, desativa o timer
		if not timer.is_stopped():
			timer.stop()

func update_weapon_flip() -> void:
	# Posição global do pivot (arma) e do inimigo
	var enemy_pos = get_overlapping_bodies().front().global_position
	var player_pos = global_position

	# Verifica se o inimigo está à esquerda ou à direita do jogador
	if enemy_pos.x < player_pos.x:
		sprite.scale.y = -4  # Espelha se o inimigo está à esquerda
	else:
		sprite.scale.y = 4  # Mantém posição padrão se o inimigo está à direita

func shoot():
	const BULLET = preload("res://scenes/bullet.tscn")
	var new_bullet = BULLET.instantiate()
	var final_damage = item_data.dmg_var()
	new_bullet.dmg = final_damage
	new_bullet.piercing = piercing
	new_bullet.knockback = item_data.knockback
	new_bullet.global_position = %ShootingPoint.global_position
	new_bullet.global_rotation = %ShootingPoint.global_rotation
	%ShootingPoint.add_child(new_bullet)
	audio_stream.play()
	if animation_player.is_playing():
		animation_player.stop()
	animation_player.play("shoot")
	animation_player.queue("idle")

func _on_timer_timeout() -> void:
	shoot()
	
func level_up():
	if not item_data.item_level >= item_data.item_max_level:
		item_data.item_level += 1
		level_state()
		
func level_down():
	if not item_data.item_level <= 0:
		item_data.item_level -= 1
		level_state()
		
func level_state():
	print("fire_rate = " + str(item_data.fire_rate))
	match item_data.item_level:
		1:
			item_data.item_name = "Pistol 1"
			item_data.damage = 30
			item_data.fire_rate = 1.0
			item_data.range_size = 1
			item_data.knockback = 1000
		2:
			item_data.item_name = "Pistol 2"
			item_data.damage = 40
			item_data.fire_rate = 0.9
			item_data.range_size = 1.0
			item_data.knockback = 1000
			piercing = true
			#sprite.texture = preload("res://graphics/gem_9.png")
			#item_data.item_icon = preload("res://graphics/gem_9.png")
		3:
			item_data.item_name = "Pistol 3"
			item_data.damage = 50
			item_data.fire_rate = 0.8
			item_data.range_size = 1.2
			item_data.knockback = 1200
		4:
			item_data.damage = 60
			item_data.fire_rate = 0.7
			item_data.range_size = 1.2
			item_data.knockback = 1200
		5:
			item_data.damage = 65
			item_data.fire_rate = 0.6
			item_data.range_size = 1.4
			item_data.knockback = 1400
		6:
			item_data.damage = 70
			item_data.fire_rate = 0.5
			item_data.range_size = 1.4
			item_data.knockback = 1400
		7:
			item_data.damage = 75
			item_data.fire_rate = 0.4
			item_data.range_size = 1.6
			item_data.knockback = 1600
		8:
			item_data.damage = 75
			item_data.fire_rate = 0.3
			item_data.range_size = 1.6
			item_data.knockback = 1600
		9:
			item_data.damage = 75
			item_data.fire_rate = 0.2
			item_data.range_size = 2.0
			item_data.knockback = 1800
		10:
			item_data.damage = 80
			item_data.fire_rate = 0.1
			item_data.range_size = 2.0
			item_data.knockback = 1800

How can I reload the “item_data” resource? I use this code on the scene root to manage the game over:

## Game Over
func _on_player_health_depleted() -> void:
	pause_game()
	gameover = true
	mobtimer.queue_free()
	%GameOver.visible = true
	player.smoke()
	player.orbcollectrange = 0
	print("Game Over")

## Reiniciar Jogo
func _on_button_pressed() -> void:
	%GameOver.visible = false
	pause_game()
	get_tree().reload_current_scene()

From the docs comments:

Resources loaded from files are cached by default, so as long as they stay loaded, changes will be remembered. You can use “local to scene” or call .duplicate() on the resource to work around this.

Thanks a bunch! So simple!

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.