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()