Variable keeps deleting his value

Godot Version

Godot 4

Question

hi im trying to change scene using “”“load_level_scene_index”“” but it seems like the loadable_scenes value and theeditor_scenes keep deleting all the content of them so it shows that they are empty

Here’s the code imusing:

extends Node
@export var start_word_script: Node
@export var first_scene_index: int =0 ;
@export var editor_scenes:Array[PackedScene];
var is_dialogue_over:bool=false
var index: int = 0
var loadable_scenes : Array[Loadablescene]
var current_scene :LoadedScene
var scene_name :String
var sit_time: bool =false
func _ready() -> void:
	print(editor_scenes.size())
	print(loadable_scenes.size())
	print("e")
	populate_loadable_scenes_list()
	load_level_scene_by_index(first_scene_index)
func _process(delta: float) -> void:
	
	return


func load_level_scene_by_index(index: int) ->LoadedScene:
	if (index< -1 or index>=editor_scenes.size()):
		push_error()
		return null
	return load_level_scene(loadable_scenes[index], index)
func load_level_scene_by_name(scene_name:String) -> LoadedScene:
	var i: int=0
	while i < loadable_scenes.size():
		if scene_name == loadable_scenes[i].scene_name:
			return load_level_scene(loadable_scenes[i], i)
		i +=1
	push_error()
	return null

func load_level_scene(scene_to_load: Loadablescene, index:int) -> LoadedScene:
	if (not scene_to_load.scene.can_instantiate()):
		push_error()
		return null
	if (current_scene != null):
		current_scene.scene.queue_free()
		current_scene=null
	var new_scene : Node = scene_to_load.scene.instantiate()
	
	if new_scene==null:
		push_error()
		return null
	current_scene=LoadedScene.new()
	
	current_scene.scene=new_scene
	current_scene.scene_index=index
	current_scene.scene_name=scene_to_load.scene_name
	
	add_child(new_scene)
	print(new_scene.name)
	return current_scene
class LoadedScene:
	var scene_index : int
	var scene_name :String
	var scene:Node

func populate_loadable_scenes_list() -> void:
	for scene in editor_scenes:
		print(add_level_scene_to_scene_array(scene));
		
func add_level_scene_to_scene_array(scene:PackedScene) -> int:
	if (scene==null):
		return -1
	
	var scene_name =scene.resource_path.get_file().get_basename()
	
	print(scene_name)
	
	var i : int=0;
	while i < loadable_scenes.size():
		if (scene_name==loadable_scenes[i].scene_name):
			printerr("duplicate scene name: "+ name)
			return -1
		i +=1
	var loadable_scene :Loadablescene = Loadablescene.new()
	
	loadable_scene.scene_name=scene_name
	loadable_scene.scene= scene
	loadable_scenes.append(loadable_scene)
	
	return loadable_scenes.size() -1
	
class Loadablescene:
	var scene_name:String
	var scene:PackedScene
	
	
	
func remove_level_scene_drom_array_by_index(index: int) -> bool :
	if (index< 0 or index>loadable_scenes.size()):
		return false
		
	loadable_scenes.remove_at(index)
	readjust_current_level_scenes_index()
	
	return true
	
func readjust_current_level_scenes_index() -> void:
	var i : int=0
	while i < loadable_scenes.size():
		if loadable_scenes[i].scene_name==current_scene.scene_name:
			current_scene.scene_index=i
			return
		i+=1
func remove_level_scene_drom_array_by_name(scene_name:String) -> bool:
	var i : int=0
	while i < loadable_scenes.size():
		if loadable_scenes[i].scene_name==scene_name:
			loadable_scenes.remove_at(i)
			readjust_current_level_scenes_index()
			return true
		i +=1
	return false

How do you fill editor_scenes array?

Is this used as a Global? Did you add the script .gd to the autoload or a scene .tscn?

If you add a script .gd as an Autoload then Godot will create a new instance of that script/node to be loaded, it will not have any exported values assign other than the defaults inside the script, it will also not have any children.

hi the script is an autoload but i also have the script on an empty scene

hi i just add the tscn into editor scenes like shown in the image the script is on am em

pty3D node

Well it should be either or. Autoloaded scripts are not supposed to run elsewhere in the scene tree. Otherwise you’ll run two versions of the script “simultaneously” and the autoloaded version won’t have the running context you expect it to have by setting up the other version.

Read up in the docs on how autoloads actually work.

thanks

This is autoloading just the script as I described, notice the path is to a script .gd, not a scene .tscn

thanks i changed it and now it doesn’t seem to reset the value