|  | class_name World | 
						
						
							|  | extends Node3D | 
						
						
							|  | 
 | 
						
						
							|  | 
 | 
						
						
							|  | @export var default_spawn_position: Vector3 = Vector3.ZERO | 
						
						
							|  | 
 | 
						
						
							|  | @export_group("Nodes and Scenes") | 
						
						
							|  | @export var blocks_container: Node3D ## Container where spawned blocks are added | 
						
						
							|  | @export var dropped_items_container: Node3D ## Container where spawned dropped items are added | 
						
						
							|  | @export var player_scene: PackedScene | 
						
						
							|  | 
 | 
						
						
							|  | 
 | 
						
						
							|  | func _ready() -> void: | 
						
						
							|  | 	Input.mouse_mode = Input.MOUSE_MODE_CAPTURED | 
						
						
							|  | 	EntityManager.create_block.connect(_create_block.bind()) | 
						
						
							|  | 	EntityManager.drop_block.connect(_create_dropped_block.bind()) | 
						
						
							|  | 	EntityManager.reset_world.connect(_on_reset_world.bind()) | 
						
						
							|  | 	EntityManager.spawn_player.connect(_spawn_player.bind()) | 
						
						
							|  | 
 | 
						
						
							|  | 	_initialize_ground() | 
						
						
							|  | 	_create_test_blocks() | 
						
						
							|  | 
 | 
						
						
							|  | 	var default_transform: Transform3D = Transform3D() | 
						
						
							|  | 	default_transform.origin = default_spawn_position | 
						
						
							|  | 	_spawn_player(default_transform) | 
						
						
							|  | 
 | 
						
						
							|  | 
 | 
						
						
							|  | func _create_block(id: String, block_position: Vector3) -> void: | 
						
						
							|  | 	var block: Block = Globals.BLOCK_PREFAB.instantiate() | 
						
						
							|  | 	block.position = block_position | 
						
						
							|  | 	block.set_id(id) | 
						
						
							|  | 
 | 
						
						
							|  | 	blocks_container.add_child(block) | 
						
						
							|  | 
 | 
						
						
							|  | func _create_dropped_block(id: String, start_position: Vector3, direction: Vector3 = Vector3.ZERO, velocity: float = 0.0) -> void: | 
						
						
							|  | 	var block: DroppedBlock = Globals.DROPPED_BLOCK_PREFAB.instantiate() | 
						
						
							|  | 	dropped_items_container.add_child(block) | 
						
						
							|  | 	block.initialize(id, start_position, direction, velocity) | 
						
						
							|  | 
 | 
						
						
							|  | func _create_test_blocks() -> void: | 
						
						
							|  | 	var test_blocks: Array = ["001", "002", "003", "004", "005", "006"] | 
						
						
							|  | 	for index: int in range(1, test_blocks.size() + 1): | 
						
						
							|  | 		_create_block("00" + str(index), Vector3(index, 1, -3)) | 
						
						
							|  | 		_create_block("00" + str(index), Vector3(index, 2, -4)) | 
						
						
							|  | 		_create_block("00" + str(index), Vector3(index, 3, -5)) | 
						
						
							|  | 		_create_dropped_block("00" + str(index), Vector3(index, 2, -3)) | 
						
						
							|  | 
 | 
						
						
							|  | func _spawn_player(player_position: Transform3D) -> void: | 
						
						
							|  | 	if has_node("Player"): | 
						
						
							|  | 		$Player.queue_free() | 
						
						
							|  | 		await $Player.tree_exited | 
						
						
							|  | 
 | 
						
						
							|  | 	var player: Player = player_scene.instantiate() | 
						
						
							|  | 	player.transform = player_position | 
						
						
							|  | 	player.name = "Player" | 
						
						
							|  | 	add_child(player) | 
						
						
							|  | 
 | 
						
						
							|  | 
 | 
						
						
							|  | func _initialize_ground() -> void: | 
						
						
							|  | 	for x: int in range(-10, 11): | 
						
						
							|  | 		for z: int in range(-10, 11): | 
						
						
							|  | 			var ground_position: Vector3 = Vector3(x, 0, z) | 
						
						
							|  | 
 | 
						
						
							|  | 			var random: int = randi_range(0, 1) | 
						
						
							|  | 			if random: | 
						
						
							|  | 				# Just for testing.. Would make more sense to just call _create_block() directly | 
						
						
							|  | 				EntityManager.create_block.emit("001", ground_position) | 
						
						
							|  | 			else: | 
						
						
							|  | 				EntityManager.create_block.emit("002", ground_position) | 
						
						
							|  | 
 | 
						
						
							|  | ## Generally for resetting/emptying the world to allow for load_game | 
						
						
							|  | func _on_reset_world() -> void: | 
						
						
							|  | 	for block: Block in blocks_container.get_children(): | 
						
						
							|  | 		block.queue_free() | 
						
						
							|  | 
 | 
						
						
							|  | 	for block: DroppedBlock in dropped_items_container.get_children(): | 
						
						
							|  | 		block.queue_free()
 |