|
@ -2,25 +2,24 @@ class_name World |
|
|
extends Node3D |
|
|
extends Node3D |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@export var default_spawn_position: Vector3 = Vector3.ZERO |
|
|
|
|
|
|
|
|
|
|
|
@export_group("Nodes and Scenes") |
|
|
@export_group("Nodes and Scenes") |
|
|
@export var blocks_container: Node3D ## Container where spawned blocks are added |
|
|
@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 dropped_items_container: Node3D ## Container where spawned dropped items are added |
|
|
@export var player_scene: PackedScene |
|
|
@export var player_scene: PackedScene |
|
|
|
|
|
@export var spawn_position: Marker3D |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _ready() -> void: |
|
|
func _ready() -> void: |
|
|
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED |
|
|
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED |
|
|
EntityManager.create_block.connect(_create_block) |
|
|
EntityManager.create_block.connect(_create_block) |
|
|
EntityManager.drop_block.connect(_create_dropped_block) |
|
|
EntityManager.drop_block.connect(_create_dropped_block) |
|
|
EntityManager.reset_world.connect(_on_reset_world) |
|
|
|
|
|
EntityManager.spawn_player.connect(_spawn_player) |
|
|
|
|
|
|
|
|
EntityManager.reset_world.connect(clear_world) |
|
|
|
|
|
EntityManager.spawn_player.connect(spawn_player) |
|
|
|
|
|
|
|
|
clear_world() |
|
|
clear_world() |
|
|
create_world() |
|
|
create_world() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## For resetting/emptying the world to allow for load_game or generating a new world |
|
|
func clear_world() -> void: |
|
|
func clear_world() -> void: |
|
|
for block: Block in blocks_container.get_children(): |
|
|
for block: Block in blocks_container.get_children(): |
|
|
block.queue_free() |
|
|
block.queue_free() |
|
@ -29,12 +28,34 @@ func clear_world() -> void: |
|
|
block.queue_free() |
|
|
block.queue_free() |
|
|
|
|
|
|
|
|
func create_world() -> void: |
|
|
func create_world() -> void: |
|
|
_initialize_ground() |
|
|
|
|
|
|
|
|
generate_world() |
|
|
_create_test_blocks() |
|
|
_create_test_blocks() |
|
|
|
|
|
|
|
|
var default_transform: Transform3D = Transform3D() |
|
|
var default_transform: Transform3D = Transform3D() |
|
|
default_transform.origin = default_spawn_position |
|
|
|
|
|
_spawn_player(default_transform) |
|
|
|
|
|
|
|
|
default_transform.origin = spawn_position.position |
|
|
|
|
|
spawn_player(default_transform) |
|
|
|
|
|
|
|
|
|
|
|
func generate_world() -> 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) |
|
|
|
|
|
|
|
|
|
|
|
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 _create_block(id: String, block_position: Vector3) -> void: |
|
|
func _create_block(id: String, block_position: Vector3) -> void: |
|
@ -57,29 +78,6 @@ func _create_test_blocks() -> void: |
|
|
_create_block("00" + str(index), Vector3(index, 3, -5)) |
|
|
_create_block("00" + str(index), Vector3(index, 3, -5)) |
|
|
_create_dropped_block("00" + str(index), Vector3(index, 2, -3)) |
|
|
_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: |
|
|
func _on_reset_world() -> void: |
|
|
clear_world() |
|
|
clear_world() |