From 2bfbfa50899a6056e92c47391cebe2ef12242cfa Mon Sep 17 00:00:00 2001 From: Rendo Date: Thu, 27 Nov 2025 11:02:42 +0500 Subject: [PATCH] Tewam spawner --- levels/prototype_scene.tscn | 25 ++++-- scenes/molikman.tscn | 78 +++++++++---------- scripts/multiplayer/player_spawner.gd | 15 ---- scripts/multiplayer/team_spawner.gd | 46 +++++++++++ ...yer_spawner.gd.uid => team_spawner.gd.uid} | 0 scripts/player/player.gd | 7 +- scripts/player/player_camera.gd | 8 +- scripts/player/spectator.gd | 14 ++++ 8 files changed, 126 insertions(+), 67 deletions(-) delete mode 100644 scripts/multiplayer/player_spawner.gd create mode 100644 scripts/multiplayer/team_spawner.gd rename scripts/multiplayer/{player_spawner.gd.uid => team_spawner.gd.uid} (100%) diff --git a/levels/prototype_scene.tscn b/levels/prototype_scene.tscn index 6d2477e..48b73b2 100644 --- a/levels/prototype_scene.tscn +++ b/levels/prototype_scene.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=8 format=3 uid="uid://cqrh2cc7m2i7f"] [ext_resource type="Environment" uid="uid://d0cfgtx2yxw13" path="res://environments/prototype_environment.tres" id="1_i6jab"] -[ext_resource type="Script" uid="uid://ypgm3aplt78m" path="res://scripts/multiplayer/player_spawner.gd" id="4_pi0y7"] +[ext_resource type="Script" uid="uid://ypgm3aplt78m" path="res://scripts/multiplayer/team_spawner.gd" id="4_pi0y7"] [ext_resource type="Material" uid="uid://bx3f5vx71ynh5" path="res://materials/OrangeMat.tres" id="4_y6i55"] [ext_resource type="Material" uid="uid://mlha6r17v2en" path="res://materials/Bluemat.tres" id="5_bno23"] @@ -98,12 +98,8 @@ polygon = PackedVector2Array(1.1265539, -0.16863012, -3.9689837, 4.1396155, -6.2 depth = 2.64 material = ExtResource("5_bno23") -[node name="Spawner" type="Node3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5862943, 0) -script = ExtResource("4_pi0y7") - [node name="MultiplayerSpawner" type="MultiplayerSpawner" parent="."] -_spawnable_scenes = PackedStringArray("uid://dpsr6ug3pkb40", "uid://cheu6vds21er7") +_spawnable_scenes = PackedStringArray("uid://dpsr6ug3pkb40", "uid://ckjabjcvgki6n") spawn_path = NodePath("..") [node name="AnimationPlayer" type="AnimationPlayer" parent="."] @@ -111,3 +107,20 @@ libraries = { &"": SubResource("AnimationLibrary_bno23") } autoplay = "main" + +[node name="DefenceSpawn" type="Marker3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.2367034, 0.5180037, -10.260834) +script = ExtResource("4_pi0y7") +spawn_radius = 10.0 + +[node name="AttackSpawn" type="Marker3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -32.38732, 0.5180037, 8.271217) +script = ExtResource("4_pi0y7") +team = 1 +spawn_radius = 10.0 + +[node name="SpectatorSpawn" type="Marker3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.0165482, 17.832424, 2.9756432) +script = ExtResource("4_pi0y7") +team = 2 +spawn_radius = 10.0 diff --git a/scenes/molikman.tscn b/scenes/molikman.tscn index 25eb6e9..b83759c 100644 --- a/scenes/molikman.tscn +++ b/scenes/molikman.tscn @@ -37,45 +37,6 @@ properties/3/path = NodePath(".:hp") properties/3/spawn = true properties/3/replication_mode = 1 -[sub_resource type="Animation" id="Animation_oprun"] -resource_name = "crouch" -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("CollisionShape3D:position") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0, 1), -"transitions": PackedFloat32Array(1, 1), -"update": 0, -"values": [Vector3(0, 1, 0), Vector3(0, 0.75, 0)] -} -tracks/1/type = "value" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath("CollisionShape3D:shape:height") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(0, 1), -"transitions": PackedFloat32Array(1, 1), -"update": 0, -"values": [2.0, 1.5] -} -tracks/2/type = "value" -tracks/2/imported = false -tracks/2/enabled = true -tracks/2/path = NodePath("Camera3D:position") -tracks/2/interp = 1 -tracks/2/loop_wrap = true -tracks/2/keys = { -"times": PackedFloat32Array(0, 1), -"transitions": PackedFloat32Array(1, 1), -"update": 0, -"values": [Vector3(0, 2, 0), Vector3(0, 1.5, 0)] -} - [sub_resource type="Animation" id="Animation_a8ls1"] length = 0.001 tracks/0/type = "value" @@ -115,6 +76,45 @@ tracks/2/keys = { "values": [Vector3(0, 2, 0)] } +[sub_resource type="Animation" id="Animation_oprun"] +resource_name = "crouch" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("CollisionShape3D:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector3(0, 1, 0), Vector3(0, 0.75, 0)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("CollisionShape3D:shape:height") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [2.0, 1.5] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Camera3D:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector3(0, 2, 0), Vector3(0, 1.5, 0)] +} + [sub_resource type="AnimationLibrary" id="AnimationLibrary_a8ls1"] _data = { &"RESET": SubResource("Animation_a8ls1"), diff --git a/scripts/multiplayer/player_spawner.gd b/scripts/multiplayer/player_spawner.gd deleted file mode 100644 index 881cf19..0000000 --- a/scripts/multiplayer/player_spawner.gd +++ /dev/null @@ -1,15 +0,0 @@ -extends Node3D - - -func _ready() -> void: - if not multiplayer.is_server(): - return - spawn_player(multiplayer.get_unique_id()) - for i in multiplayer.get_peers(): - spawn_player(i) - -func spawn_player(id) -> void: - var player: PackedScene = load("res://scenes/player.tscn") - var inst = player.instantiate() - inst.name = str(id) - get_tree().current_scene.add_child.call_deferred(inst,true) diff --git a/scripts/multiplayer/team_spawner.gd b/scripts/multiplayer/team_spawner.gd new file mode 100644 index 0000000..a0bbc80 --- /dev/null +++ b/scripts/multiplayer/team_spawner.gd @@ -0,0 +1,46 @@ +extends Node3D + +@export var team: Session.TEAMS +@export var spawn_radius: float + +func _ready() -> void: + if not multiplayer.is_server(): + return + match team: + Session.TEAMS.ATTACK: + for attacker in Lobby.attack_team: + spawn_attacker(attacker) + Session.TEAMS.DEFENCE: + for defender in Lobby.defence_team: + spawn_defender(defender) + Session.TEAMS.SPECTATE: + for specator in Lobby.specators_team: + spawn_spectator(specator) + +func spawn_defender(id: int) -> void: + var player: PackedScene = load("res://scenes/molikman.tscn") + var inst: Player = player.instantiate() + inst.name = str(id) + inst.team = Session.TEAMS.DEFENCE + + deferred_setup.bind(inst).call_deferred() + +func spawn_attacker(id: int) -> void: + var player: PackedScene = load("res://scenes/molikman.tscn") + var inst: Player = player.instantiate() + inst.name = str(id) + inst.team = Session.TEAMS.ATTACK + + deferred_setup.bind(inst).call_deferred() + +func spawn_spectator(id: int) -> void: + var spectator: PackedScene = load("res://scenes/spectator.tscn") + var inst = spectator.instantiate() + inst.name = str(id) + deferred_setup.bind(inst).call_deferred() + +func deferred_setup(what: Node3D): + get_tree().current_scene.add_child(what) + var distance = randf_range(0,spawn_radius) + var angle = randf_range(0,TAU) + what.set_start_position.rpc_id(int(what.name),global_position + Vector3.RIGHT.rotated(Vector3.UP,angle) * distance) diff --git a/scripts/multiplayer/player_spawner.gd.uid b/scripts/multiplayer/team_spawner.gd.uid similarity index 100% rename from scripts/multiplayer/player_spawner.gd.uid rename to scripts/multiplayer/team_spawner.gd.uid diff --git a/scripts/player/player.gd b/scripts/player/player.gd index bb553f6..bc55dac 100644 --- a/scripts/player/player.gd +++ b/scripts/player/player.gd @@ -18,7 +18,7 @@ const MAX_HP = 100 get: return hp -@onready var TEMP_start_pos = global_position +var TEMP_start_pos func _enter_tree() -> void: set_multiplayer_authority(str(name).to_int()) @@ -32,3 +32,8 @@ func _physics_process(_delta: float) -> void: func die() -> void: global_position = TEMP_start_pos hp = MAX_HP + +@rpc("any_peer","call_local","reliable") +func set_start_position(start_position: Vector3): + global_position = start_position + TEMP_start_pos = global_position diff --git a/scripts/player/player_camera.gd b/scripts/player/player_camera.gd index ed06b28..0544fbd 100644 --- a/scripts/player/player_camera.gd +++ b/scripts/player/player_camera.gd @@ -12,15 +12,11 @@ var compensation_speed: float @export var compensation_time: float = 1.0 @export var compensation_delay: float = 0.5 -func _enter_tree() -> void: - set_multiplayer_authority(get_parent().name.to_int()) - func _ready() -> void: - Input.mouse_mode = Input.MOUSE_MODE_CAPTURED - # Move to level controller when possible - #Input.mouse_mode = Input.MOUSE_MODE_CAPTURED if not is_multiplayer_authority(): return + # Move to level controller when possible + Input.mouse_mode = Input.MOUSE_MODE_CAPTURED current = true func _process(delta: float) -> void: diff --git a/scripts/player/spectator.gd b/scripts/player/spectator.gd index 7b77056..c6ba1d4 100644 --- a/scripts/player/spectator.gd +++ b/scripts/player/spectator.gd @@ -3,6 +3,16 @@ extends Camera3D @export var SENSITIVITY = 0.02 @export var SPEED = 10.0 +func _enter_tree() -> void: + set_multiplayer_authority(int(name)) + +func _ready() -> void: + if not is_multiplayer_authority(): + return + # Move to level controller when possible + Input.mouse_mode = Input.MOUSE_MODE_CAPTURED + current = true + func _process(delta: float) -> void: var xz_plane = Input.get_vector("plr_strafe_l","plr_strafe_r","plr_forward","plr_back") var y = Input.get_axis("spc_down","spc_up") @@ -18,3 +28,7 @@ func rotate_camera(x,y) -> void: func _input(event: InputEvent) -> void: if event is InputEventMouseMotion: rotate_camera(-event.relative.x * SENSITIVITY,-event.relative.y * SENSITIVITY) + +@rpc("any_peer","call_local","reliable") +func set_start_position(start_position: Vector3): + global_position = start_position