Introduce a map manager

This commit is contained in:
Squinty 2024-04-21 07:32:52 +00:00
parent 66270e65cd
commit 3c2e07eae5
3 changed files with 80 additions and 20 deletions

View file

@ -1,11 +1,21 @@
[gd_scene load_steps=5 format=3 uid="uid://chbno00ugl6te"]
[gd_scene load_steps=8 format=3 uid="uid://chbno00ugl6te"]
[ext_resource type="Environment" uid="uid://d2ahijqqspw5f" path="res://environments/default.tres" id="1_3nr12"]
[ext_resource type="Script" path="res://maps/map.gd" id="1_6ysiv"]
[ext_resource type="Terrain3DStorage" uid="uid://dyon4xda4k40d" path="res://maps/genesis/resources/storage.res" id="1_a88qe"]
[ext_resource type="Terrain3DMaterial" uid="uid://bd4lr5sxu8xu" path="res://maps/genesis/resources/material.res" id="2_o2y3d"]
[ext_resource type="Terrain3DTextureList" uid="uid://dnqa8kxgm3xuw" path="res://maps/genesis/resources/textures.res" id="3_1cww7"]
[node name="Terrain3D" type="Terrain3D"]
[sub_resource type="CapsuleMesh" id="CapsuleMesh_k2vhq"]
[sub_resource type="CapsuleMesh" id="CapsuleMesh_5ytwx"]
[node name="Map" type="Node" node_paths=PackedStringArray("_flagstand", "_player_spawns_root")]
script = ExtResource("1_6ysiv")
_flagstand = NodePath("Terrain3D/FlagPillar/CSGCylinder3D/FlagStand")
_player_spawns_root = NodePath("Terrain3D/PlayerSpawns")
[node name="Terrain3D" type="Terrain3D" parent="."]
storage = ExtResource("1_a88qe")
material = ExtResource("2_o2y3d")
texture_list = ExtResource("3_1cww7")
@ -13,8 +23,41 @@ collision_layer = 2147483648
collision_mask = 2147483648
mesh_size = 24
[node name="PlayerSpawns" type="Node" parent="Terrain3D"]
[node name="Spawn1" type="Marker3D" parent="Terrain3D/PlayerSpawns"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 95.5378, -32.735)
visible = false
[node name="MeshInstance3D" type="MeshInstance3D" parent="Terrain3D/PlayerSpawns/Spawn1"]
mesh = SubResource("CapsuleMesh_k2vhq")
[node name="Spawn2" type="Marker3D" parent="Terrain3D/PlayerSpawns"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9, 98.3078, 18.061)
visible = false
[node name="MeshInstance3D" type="MeshInstance3D" parent="Terrain3D/PlayerSpawns/Spawn2"]
mesh = SubResource("CapsuleMesh_5ytwx")
[node name="FlagPillar" type="CSGCombiner3D" parent="Terrain3D"]
transform = Transform3D(1, 0, 0, 0, 2.83726, 0, 0, 0, 1, 0, 94.6411, 0)
use_collision = true
collision_layer = 2147483648
collision_mask = 0
[node name="CSGBox3D" type="CSGBox3D" parent="Terrain3D/FlagPillar"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.9311, 0)
size = Vector3(0.5, 6, 0.5)
[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Terrain3D/FlagPillar"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.42967, 0)
height = 5.0
[node name="FlagStand" type="Marker3D" parent="Terrain3D/FlagPillar/CSGCylinder3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.42315, 0)
[node name="Sunlight" type="DirectionalLight3D" parent="."]
transform = Transform3D(-0.866024, -0.433016, 0.250001, 0, 0.499998, 0.866027, -0.500003, 0.75, -0.43301, 0, 100, 0)
transform = Transform3D(-0.866024, -0.433016, 0.25, 0, 0.499998, 0.866027, -0.500003, 0.75, -0.43301, 0, 100, 0)
shadow_enabled = true
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]

16
maps/map.gd Normal file
View file

@ -0,0 +1,16 @@
class_name Map extends Node
@export var _flagstand : Node3D
@export var _player_spawns_root : Node
var _rng : RandomNumberGenerator = RandomNumberGenerator.new()
func get_flagstand() -> Node3D:
return _flagstand
func get_player_spawn() -> Node3D:
var spawn_count : int = _player_spawns_root.get_child_count()
var spawn_index : int = _rng.randi_range(0, spawn_count - 1)
var spawn_selected : Node3D = _player_spawns_root.get_child(spawn_index)
return spawn_selected

View file

@ -13,31 +13,25 @@ script/source = "class_name Multiplayer extends Node
@export var FLAG : PackedScene
@export var MAX_CLIENTS : int = 24
@onready var map : Node = $Map
@onready var players : Node = $Players
@onready var objectives : Node = $Objectives
@onready var map : Node = $Map
var _map_manager : Map
signal connected_to_server
signal connection_failed
func load_map(scene : PackedScene) -> void:
map.add_child(scene.instantiate())
func start_server(port : int, nickname : String) -> void:
var peer : ENetMultiplayerPeer = ENetMultiplayerPeer.new()
peer.create_server(port, MAX_CLIENTS)
multiplayer.multiplayer_peer = peer
load_map.call_deferred(MAP)
_load_map.call_deferred(MAP, nickname)
multiplayer.peer_disconnected.connect(remove_player)
if DisplayServer.get_name() != \"headless\":
add_player(1, nickname)
add_flag()
func join_server(host : String, port : int, nickname : String) -> void:
var peer : ENetMultiplayerPeer= ENetMultiplayerPeer.new()
peer.create_client(host, port)
@ -60,7 +54,7 @@ func add_player(peer_id : int, nickname : String) -> void:
player.name = str(peer_id)
player.player_id = peer_id
player.nickname = nickname
player.position = Vector3(0.0, 150.0, 0.0)
player.global_position = _map_manager.get_player_spawn().position
players.add_child(player)
player.died.connect(respawn_player)
print(\"Peer `%s` connected\" % player.name)
@ -73,17 +67,24 @@ func remove_player(peer_id : int) -> void:
player.queue_free()
print(\"Peer `%s` disconnected\" % node_name)
func _load_map(scene : PackedScene, nickname : String) -> void:
var map_scene : Node = scene.instantiate()
_map_manager = map_scene
map_scene.ready.connect(_add_flag)
if DisplayServer.get_name() != \"headless\":
add_player(1, nickname)
map.add_child(map_scene)
func _add_flag() -> void:
var flag : Flag = FLAG.instantiate()
flag.global_position = _map_manager.get_flagstand().global_position
objectives.add_child(flag)
@rpc(\"any_peer\")
func _join_match(nickname : String) -> void:
if multiplayer.is_server():
add_player(multiplayer.get_remote_sender_id(), nickname)
func add_flag() -> void:
var flag : Flag = FLAG.instantiate()
flag.position = Vector3(5.0, 100.0, 0.0)
objectives.add_child(flag)
func _exit_tree() -> void:
if multiplayer.is_server():
#multiplayer.peer_connected.disconnect(add_player)