Compare commits

..

1 Commits

Author SHA1 Message Date
9b1ab02b94
Add a map-loader sctipt 2025-01-28 21:38:27 +01:00
20 changed files with 182 additions and 229 deletions

View File

@ -0,0 +1,22 @@
extends Node
# This script shoud be able to find the player
var players: Dictionary = {}
func spawn_a_bullet():
# -- Get
pass
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
var world: MapController = find_parent("Map")
# Get all the players on the server and add
# corresponding nodes to them
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass

View File

@ -0,0 +1,8 @@
[gd_scene format=3 uid="uid://sh5diukewgs5"]
[node name="BulletSpawner" type="Node3D"]
[node name="MultiplayerSpawner" type="MultiplayerSpawner" parent="."]
spawn_path = NodePath("../Node3D")
[node name="Node3D" type="Node3D" parent="."]

View File

@ -1,10 +1,13 @@
extends Node
class_name MapController extends Node
@export_category("MapController")
const PLAYER_SPAWNER: String = "res://scenes/maps/base/player_spawner/PlayerSpawner.tscn"
const OBJECT_SPAWNER: String = "res://scenes/maps/base/object_spawner/ObjectSpawner.tscn"
const PLAYER_SPAWNER: String = "res://scenes/maps/base/player_spawner/player_spawner.tscn"
const OBJECT_SPAWNER: String = "res://scenes/maps/base/object_spawner/object_spawner.tscn"
var player_spawner: Node3D
var player_spawner: PlayerSpawnerController
var object_spawner: Node3D
@onready var spawn_locations: SpawnController = $SpawnLocations
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
@ -19,8 +22,8 @@ func _ready() -> void:
if err != OK:
print("Couldn't load object spawner")
# add objects spawner
_spawn_player()
if multiplayer.is_server():
_spawn_player()
pass # Replace with function body.
@ -28,21 +31,10 @@ func _ready() -> void:
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)
player_spawner.spawn_players(spawn_locations)
func _add_player_spawner() -> Error :
if not ResourceLoader.exists(PLAYER_SPAWNER):

View File

@ -0,0 +1,33 @@
class_name PlayerSpawnerController extends Node3D
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
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_spawner() -> MultiplayerSpawner:
return $MultiplayerSpawner
func _get_root() -> Node3D:
return $Players
# -- Spawn a player node and sync it across all peers
func spawn_players(spawn_location: SpawnController) -> Error:
print("spawning players")
var char : Node3D = null
print(GameServerManager.players)
for i in GameServerManager.players:
var player_data = GameServerManager.players[i]
char = ResourceLoader.load("res://scenes/characters/placeholder.tscn").instantiate()
char.name = "PlayerPlaceholder_" + str(player_data.name)
var position = spawn_location.get_spawner(SpawnController.Sides.BLUE)
char.global_position = position
char.global_position = position
_get_spawner().spawn(char)
_get_root().add_child(char)
return OK

View File

@ -1,6 +1,9 @@
[gd_scene format=3 uid="uid://xh710fr73bid"]
[gd_scene load_steps=2 format=3 uid="uid://xh710fr73bid"]
[ext_resource type="Script" path="res://scenes/maps/base/player_spawner/player_spawner.gd" id="1_2hsyd"]
[node name="PlayerSpawner" type="Node3D"]
script = ExtResource("1_2hsyd")
[node name="MultiplayerSpawner" type="MultiplayerSpawner" parent="."]
_spawnable_scenes = PackedStringArray("res://scenes/characters/placeholder.tscn")

View File

@ -26,13 +26,16 @@ func _process(delta: float) -> void:
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]
if multiplayer.is_server():
var spawns: Array[Node3D] = []
for spawn: Node3D in spawn_set.get_children():
if not spawn.busy:
spawns.push_back(spawn)
print(spawns.size())
var random_index: int = randi_range(0, spawns.size() - 1)
print(random_index)
return spawns[random_index]
return null
func get_spawner(team: Sides) -> Vector3:

View File

@ -1,23 +0,0 @@
extends CSGBox3D
var health = 5
@export var color: Color = Color(0, 0, 0)
var colors = [Color(1.0, 0.0, 0.0, 1.0),
Color(0.0, 1.0, 0.0, 1.0),
Color(0.0, 0.0, 1.0, 0.0)]
func take_damage():
color = Color(randf(), randf(), randf())
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
material_override.albedo_color = color
if health < 1:
queue_free()

View File

@ -1,43 +0,0 @@
extends Node3D
var player_side: String
@onready var intro_camera = $Intro/CameraMount/IntroCamera
@onready var intro_view_port = $Intro/CameraMount/IntroCamera/SubViewportContainer/SubViewport
@onready var spawns = $Spawns
@onready var root = $'.'
@onready var players = $Players
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
var char : Node3D = null
var red_spawn: Node3D = $Spawns/Blue/SpawnArea
var position := red_spawn.global_position
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)
char.global_position = position
var my_random_number = RandomNumberGenerator.new().randf_range(0.0, 5.0)
char.global_position = position
char.global_position.x += my_random_number
char.global_position.y += 300 + my_random_number
char.global_position.z += my_random_number
$MultiplayerSpawner.spawn(char)
players.add_child(char)
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
#$BulletSpawner.spawn(node)
$Bullets.add_child(node)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass

View File

@ -1,11 +0,0 @@
extends CSGBox3D
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass

View File

@ -1,17 +0,0 @@
extends Control
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
@onready var health_indicator: Label = $HealthIndicator
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
var root := get_tree().get_root()
var id := multiplayer.get_unique_id()
var player_data = GameServerManager.get_player_health.rpc_id(1, id)
health_indicator.text = str(player_data["health"])
pass

View File

@ -1,23 +0,0 @@
extends Node3D
var target_node_name: String = "TargetNode" # Name of the Node3D to detect
@onready var raycast : RayCast3D = $CameraMount/Camera3D/RayCast3D
@onready var camera : Camera3D = $CameraMount/Camera3D
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
var blue := $ChooseTeam/Blue
var red := $ChooseTeam/Read
if raycast.is_colliding():
var collider = raycast.get_collider()
if collider and collider.name == target_node_name:
print("Mouse is pointing at:", collider.name)
else:
print("Mouse is not pointing at the target node.")
else:
print("Mouse is not pointing at anything.")

View File

@ -1,10 +1,54 @@
[gd_scene load_steps=81 format=4 uid="uid://c1v6kb00y77ij"]
[ext_resource type="Script" path="res://scenes/maps/el_test.gd" id="1_5rsqk"]
[ext_resource type="Texture2D" uid="uid://60qg81svnxfd" path="res://assets/models/maps/el_test_Image_0.png" id="2_hsvct"]
[ext_resource type="Texture2D" uid="uid://blj7gvw33u8qd" path="res://assets/models/maps/el_test_Image_1.png" id="3_1mmpv"]
[ext_resource type="Texture2D" uid="uid://to0g5ktan37x" path="res://assets/models/maps/el_test_Image_2.png" id="4_r2n1c"]
[ext_resource type="Script" path="res://scenes/maps/csg_box_3d.gd" id="5_ieyhq"]
[sub_resource type="GDScript" id="GDScript_fyi6q"]
script/source = "extends Node3D
var player_side: String
@onready var intro_camera = $Intro/CameraMount/IntroCamera
@onready var intro_view_port = $Intro/CameraMount/IntroCamera/SubViewportContainer/SubViewport
@onready var spawns = $Spawns
@onready var root = $'.'
@onready var players = $Players
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
var char : Node3D = null
var red_spawn: Node3D = $Spawns/Blue/SpawnArea
var position := red_spawn.global_position
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)
char.global_position = position
var my_random_number = RandomNumberGenerator.new().randf_range(0.0, 5.0)
char.global_position = position
char.global_position.x += my_random_number
char.global_position.y += 300 + my_random_number
char.global_position.z += my_random_number
$MultiplayerSpawner.spawn(char)
players.add_child(char)
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
#$BulletSpawner.spawn(node)
$Bullets.add_child(node)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass
"
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_1on1b"]
resource_name = "Orange_Playground_Base_Color"
@ -837,13 +881,39 @@ data = PackedVector3Array(0, 0, 100, -100, 100, 100, 0, 100, 100, 0, 0, 100, -10
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_0rtro"]
[sub_resource type="GDScript" id="GDScript_js4tj"]
script/source = "extends CSGBox3D
var health = 5
@export var color: Color = Color(0, 0, 0)
var colors = [Color(1.0, 0.0, 0.0, 1.0),
Color(0.0, 1.0, 0.0, 1.0),
Color(0.0, 0.0, 1.0, 0.0)]
func take_damage():
color = Color(randf(), randf(), randf())
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
material_override.albedo_color = color
if health < 1:
queue_free()
"
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_bhqft"]
properties/0/path = NodePath("CSGBox3D:color")
properties/0/spawn = true
properties/0/replication_mode = 1
[node name="ElTest" type="Node3D"]
script = ExtResource("1_5rsqk")
script = SubResource("GDScript_fyi6q")
[node name="Light" type="DirectionalLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 0.508004, 0.861354, 0, -0.861354, 0.508004, 0, 2.97783, 2.62213)
@ -1169,7 +1239,7 @@ shape = SubResource("ConcavePolygonShape3D_1uclv")
transform = Transform3D(1, 0, 0, 0, 1.48122, 0, 0, 0, 1, 2.17806, 1.80141, 0)
material_override = SubResource("StandardMaterial3D_0rtro")
use_collision = true
script = ExtResource("5_ieyhq")
script = SubResource("GDScript_js4tj")
[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="Map"]
replication_config = SubResource("SceneReplicationConfig_bhqft")

View File

@ -947,7 +947,4 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.234959, 25.2818, 2.12756)
[node name="Spawn2" type="Node3D" parent="SpawnLocations/Blue"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 29.4253, 15.2112, 4.25512)
[node name="Spawn2" type="Node3D" parent="SpawnLocations/Blue/Spawn2"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.29334, 15.2112, -11.6859)
[node name="Red" type="Node3D" parent="SpawnLocations"]

View File

@ -1,76 +0,0 @@
[gd_scene load_steps=14 format=3 uid="uid://hivk5ek6u887"]
[ext_resource type="Texture2D" uid="uid://c5uytbu1wc1bq" path="res://addons/kenney_prototype_textures/orange/texture_09.png" id="1_llm1c"]
[ext_resource type="Texture2D" uid="uid://e4nd8b6f0tw7" path="res://addons/kenney_prototype_textures/dark/texture_04.png" id="2_k2arh"]
[ext_resource type="PackedScene" uid="uid://1j5ajc26w5xk" path="res://scenes/utils/character_bak.tscn" id="3_6anfg"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_bcdcw"]
albedo_texture = ExtResource("1_lae2b")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_p4psn"]
albedo_texture = ExtResource("2_7newm")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_0jiki"]
albedo_texture = ExtResource("2_7newm")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_1pwnn"]
albedo_texture = ExtResource("2_7newm")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_1yo6k"]
albedo_texture = ExtResource("2_7newm")
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_3aaun"]
[sub_resource type="Sky" id="Sky_xco2g"]
sky_material = SubResource("ProceduralSkyMaterial_3aaun")
[sub_resource type="Environment" id="Environment_5t2t5"]
background_mode = 2
sky = SubResource("Sky_xco2g")
sdfgi_enabled = true
fog_light_energy = 0.52
fog_density = 0.1387
volumetric_fog_enabled = true
volumetric_fog_density = 0.0
[sub_resource type="CameraAttributesPractical" id="CameraAttributesPractical_32hnm"]
[node name="TestMap" type="Node3D"]
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 50, 0)
[node name="World" type="Node3D" parent="."]
[node name="Base" type="Node3D" parent="World"]
[node name="Floor" type="CSGBox3D" parent="World/Base"]
use_collision = true
size = Vector3(100, 1, 100)
[node name="Wall_1" type="CSGBox3D" parent="World/Base"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 50, 0, 0)
material_override = SubResource("StandardMaterial3D_p4psn")
use_collision = true
size = Vector3(1, 20, 100)
[node name="Wall_2" type="CSGBox3D" parent="World/Base"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -50, 0, 0)
material_override = SubResource("StandardMaterial3D_0jiki")
use_collision = true
size = Vector3(1, 20, 100)
[node name="Wall_3" type="CSGBox3D" parent="World/Base"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 50)
material_override = SubResource("StandardMaterial3D_1pwnn")
use_collision = true
size = Vector3(100, 20, 1)
[node name="Wall_4" type="CSGBox3D" parent="World/Base"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -50)
material_override = SubResource("StandardMaterial3D_1yo6k")
use_collision = true
size = Vector3(100, 20, 1)
[node name="Character" parent="World" instance=ExtResource("3_6anfg")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 14.6432, 0)

View File

@ -0,0 +1,14 @@
class_name PlayerState extends Object
@export_category("PlayerState")
# -- Player's metadata
var name: String
var id: int
# -- Player's in-game data
var health: int
var current_weapon_slot: int
func init(id: int, name: String):
id = id
name = name

View File

@ -1,4 +1,5 @@
extends Node3D
class_name WeaponController extends Node3D
@export_category("WeaponController")
# ---------------------------------------------------------------------
# Main weapon params
@ -8,6 +9,8 @@ extends Node3D
@export var cooldown: float = 0
# bullet speed in m/s
@export var bullet_speed: int = 0
@export var bullet_spread_script: GDScript
# Called when the node enters the scene tree for the first time.
func _ready() -> void:

View File

@ -6,7 +6,6 @@ func _ready() -> void:
pass # Replace with function body.
@onready var bullet_trace_distance: Node3D = $BulletTraceDistance
@onready var bullet_trail_end: Node3D = $BulletTrailEnd
func shoot() -> Error:
var bullet_start_node: Node3D = bullet_trace_distance.find_child("Start")
var bullet_end_node: Node3D = bullet_trace_distance.find_child("End")

View File

@ -3,10 +3,12 @@ extends Node
var players = {}
var local_player_health = 0
# Called when the node enters the scene tree for the first time.
@rpc("reliable", "call_local")
func get_player_health(id: int) -> int:
return players.get(id)["health"]
func _ready() -> void:
pass # Replace with function body.

View File

@ -194,7 +194,7 @@ func _process(delta: float) -> void:
fps_indicator.text = str(Engine.get_frames_per_second())
if health == 0:
alive = false
var world: Node3D = find_parent("Map")
var world: Node3D = find_parent("Map")
var spawner: MultiplayerSpawner = world.find_child("ObjectSpawner").find_child("MultiplayerSpawner")
var objects_root: Node3D = world.find_child("ObjectSpawner").find_child("Objects")
spawner.spawn(model)