| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- extends Node3D
- signal quit
- const RedRobot: PackedScene = preload("res://enemies/red_robot/red_robot.tscn")
- const PlayerScene: PackedScene = preload("res://player/player.tscn")
- var lightmap_gi: LightmapGI = null
- @onready var world_environment: WorldEnvironment = $WorldEnvironment
- @onready var robot_spawn_points: Node3D = $RobotSpawnpoints
- @onready var player_spawn_points: Node3D = $PlayerSpawnpoints
- @onready var spawned_nodes: Node3D = $SpawnedNodes
- func _ready() -> void:
- Settings.apply_graphics_settings(get_window(), world_environment.environment, self)
- if Settings.config_file.get_value("rendering", "gi_type") == Settings.GIType.SDFGI:
- setup_sdfgi()
- elif Settings.config_file.get_value("rendering", "gi_type") == Settings.GIType.VOXEL_GI:
- setup_voxelgi()
- else:
- setup_lightmapgi()
- if multiplayer.is_server():
- # Server will spawn the red robots
- for child in robot_spawn_points.get_children():
- spawn_robot(child)
- # Then spawn already connected players at random location
- randomize()
- var spawn_points = player_spawn_points.get_children()
- spawn_points.shuffle()
- add_player(1, spawn_points.pop_front())
- for id in multiplayer.get_peers():
- add_player(id, spawn_points.pop_front())
- # Then spawn/despawn players as they connect/disconnect
- multiplayer.peer_connected.connect(add_player)
- multiplayer.peer_disconnected.connect(del_player)
- func setup_sdfgi() -> void:
- world_environment.environment.sdfgi_enabled = true
- $VoxelGI.hide()
- $ReflectionProbes.hide()
- # LightmapGI nodes override SDFGI (even when hidden)
- # so we need to free the LightmapGI node if it exists
- if lightmap_gi != null:
- lightmap_gi.queue_free()
- if Settings.config_file.get_value("rendering", "gi_quality") == Settings.GIQuality.HIGH:
- RenderingServer.environment_set_sdfgi_ray_count(RenderingServer.ENV_SDFGI_RAY_COUNT_96)
- elif Settings.config_file.get_value("rendering", "gi_quality") == Settings.GIQuality.LOW:
- RenderingServer.environment_set_sdfgi_ray_count(RenderingServer.ENV_SDFGI_RAY_COUNT_32)
- else:
- world_environment.environment.sdfgi_enabled = false
- func setup_voxelgi() -> void:
- world_environment.environment.sdfgi_enabled = false
- $VoxelGI.show()
- $ReflectionProbes.hide()
- # LightmapGI nodes override VoxelGI (even when hidden)
- # so we need to free the LightmapGI node if it exists
- if lightmap_gi != null:
- lightmap_gi.queue_free()
- if Settings.config_file.get_value("rendering", "gi_quality") == Settings.GIQuality.HIGH:
- RenderingServer.voxel_gi_set_quality(RenderingServer.VOXEL_GI_QUALITY_HIGH)
- elif Settings.config_file.get_value("rendering", "gi_quality") == Settings.GIQuality.LOW:
- RenderingServer.voxel_gi_set_quality(RenderingServer.VOXEL_GI_QUALITY_LOW)
- else:
- $VoxelGI.hide()
- func setup_lightmapgi() -> void:
- world_environment.environment.sdfgi_enabled = false
- $VoxelGI.hide()
- $ReflectionProbes.show()
- # If no LightmapGI node, create one
- if lightmap_gi == null:
- var new_gi := LightmapGI.new()
- new_gi.light_data = load("res://level/level.lmbake")
- new_gi.name = "LightmapGI"
- lightmap_gi = new_gi
- add_child(new_gi)
- if Settings.config_file.get_value("rendering", "gi_quality") == Settings.GIQuality.DISABLED:
- lightmap_gi.hide()
- $ReflectionProbes.hide()
- func spawn_robot(spawn_point) -> void:
- var robot: CharacterBody3D = RedRobot.instantiate()
- robot.transform = spawn_point.transform
- robot.exploded.connect(_respawn_robot.bind(spawn_point))
- spawned_nodes.add_child(robot, true)
- func _respawn_robot(spawn_point) -> void:
- await get_tree().create_timer(15.0).timeout
- spawn_robot(spawn_point)
- func del_player(id: int) -> void:
- if not spawned_nodes.has_node(str(id)):
- return
- spawned_nodes.get_node(str(id)).queue_free()
- func add_player(id: int, spawn_point: Marker3D = null) -> void:
- if spawn_point == null:
- spawn_point = player_spawn_points.get_child(randi() % player_spawn_points.get_child_count())
- var player: CharacterBody3D = PlayerScene.instantiate()
- player.name = str(id)
- player.player_id = id
- player.transform = spawn_point.transform
- spawned_nodes.add_child(player)
- func _input(input_event: InputEvent) -> void:
- if input_event.is_action_pressed(&"quit"):
- Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
- quit.emit()
|