Add a map-loader sctipt

This commit is contained in:
2025-01-28 19:32:38 +01:00
parent b54ffaeb0d
commit a5018a911a
19 changed files with 16120 additions and 2595 deletions

View File

@ -0,0 +1,84 @@
extends Node
const PLAYER_SPAWNER: String = "res://scenes/maps/base/player_spawner/PlayerSpawner.tscn"
const OBJECT_SPAWNER: String = "res://scenes/maps/base/object_spawner/ObjectSpawner.tscn"
var player_spawner: Node3D
var object_spawner: Node3D
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
# add player spawner
var err: Error = OK
err = _add_player_spawner()
if err != OK:
print("Couldn't load player spawner")
err = _add_object_spawner()
if err != OK:
print("Couldn't load object spawner")
# add objects spawner
_spawn_player()
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass
@onready var SpawnLocations: SpawnController = $SpawnLocations
func _spawn_player():
var char : Node3D = null
if multiplayer.is_server():
for i in GameServerManager.players:
char = ResourceLoader.load("res://scenes/characters/placeholder.tscn").instantiate()
char.name = "PlayerPlaceholder_" + str(GameServerManager.players[i].name)
var position = SpawnLocations.get_spawner(SpawnController.Sides.BLUE)
char.global_position = position
char.global_position = position
var spawner: MultiplayerSpawner = player_spawner.find_child("MultiplayerSpawner")
var root_node: Node3D = player_spawner.find_child("Players")
spawner.spawn(char)
root_node.add_child(char)
func _add_player_spawner() -> Error :
if not ResourceLoader.exists(PLAYER_SPAWNER):
return ERR_DOES_NOT_EXIST
var scene: PackedScene = ResourceLoader.load(PLAYER_SPAWNER)
if not scene.can_instantiate():
return ERR_CANT_OPEN
var node: Node3D = scene.instantiate()
add_child(node)
player_spawner = node
return OK
func _add_object_spawner() -> Error :
if not ResourceLoader.exists(OBJECT_SPAWNER):
return ERR_DOES_NOT_EXIST
var scene: PackedScene = ResourceLoader.load(OBJECT_SPAWNER)
if not scene.can_instantiate():
return ERR_CANT_OPEN
var node: Node3D = scene.instantiate()
add_child(node)
object_spawner = node
return OK
var bullet_amount: int = 0
func spawn_bullet(starting_point: Node3D, speed: int, damage: int):
var node: Node3D = ResourceLoader.load("res://scenes/weapon/bullet.tscn").instantiate()
node.position = starting_point.global_position
node.transform.basis = starting_point.global_transform.basis
node.name = str(bullet_amount)
node.speed = speed
node.damage = damage
bullet_amount += 1
var spawner: MultiplayerSpawner = object_spawner.find_child("MultiplayerSpawner")
var root_node: Node3D = object_spawner.find_child("Objects")
spawner.spawn(node)
root_node.add_child(node)

View File

@ -0,0 +1,9 @@
[gd_scene format=3 uid="uid://b0k17hibnhnv4"]
[node name="ObjectSpawner" type="Node3D"]
[node name="MultiplayerSpawner" type="MultiplayerSpawner" parent="."]
spawn_path = NodePath("../Objects")
spawn_limit = 10000
[node name="Objects" type="Node3D" parent="."]

View File

@ -0,0 +1,10 @@
[gd_scene format=3 uid="uid://xh710fr73bid"]
[node name="PlayerSpawner" type="Node3D"]
[node name="MultiplayerSpawner" type="MultiplayerSpawner" parent="."]
_spawnable_scenes = PackedStringArray("res://scenes/characters/placeholder.tscn")
spawn_path = NodePath("../Players")
spawn_limit = 10
[node name="Players" type="Node3D" parent="."]

View File

@ -0,0 +1,11 @@
extends Node3D
var busy: bool = false
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
func choose_spawn_location() -> Vector3:
busy = true
return global_position

View File

@ -0,0 +1,49 @@
class_name SpawnController extends Node3D
@export_category("SpawnController")
@onready var blue_spawners: Node3D = $Blue
@onready var red_spawners: Node3D = $Red
const SINGLE_SPAWN_CONTROLLER_PATH = "res://scenes/maps/base/single_spawn_controller.gd"
enum Sides {BLUE, RED, UNDEFINED}
@export var side: Sides = Sides.UNDEFINED
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
var single_spawn_controller: GDScript = ResourceLoader.load(SINGLE_SPAWN_CONTROLLER_PATH)
for spawn: Node3D in blue_spawners.get_children():
spawn.set_script(single_spawn_controller)
for spawn: Node3D in red_spawners.get_children():
spawn.set_script(single_spawn_controller)
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass
func _get_available_spawn(spawn_set: Node3D) -> Node3D:
var spawns: Array[Node3D] = []
for spawn: Node3D in spawn_set.get_children():
if not spawn.busy:
spawns.push_back(spawn)
var random_index: int = randi_range(0, spawns.size())
return spawns[random_index - 1]
func get_spawner(team: Sides) -> Vector3:
match team:
Sides.BLUE:
var spawn := _get_available_spawn(blue_spawners)
return spawn.choose_spawn_location()
Sides.RED:
print("red")
return Vector3(0,0,0)
_:
print("хз")
return Vector3(0,0,0)
# Get all spawners for each team

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long