diff --git a/levels/prototype_scene.tscn b/levels/prototype_scene.tscn index 0d1609d..d3f540e 100644 --- a/levels/prototype_scene.tscn +++ b/levels/prototype_scene.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=24 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/team_spawner.gd" id="4_pi0y7"] +[ext_resource type="Script" uid="uid://ypgm3aplt78m" path="res://scripts/multiplayer/spawn_system/team_spawner.gd" id="4_pi0y7"] [ext_resource type="Material" uid="uid://bx3f5vx71ynh5" path="res://materials/Graymat.tres" id="4_y6i55"] [ext_resource type="Material" uid="uid://dynpcduei1wfn" path="res://materials/Bluemat.tres" id="4_yx0ab"] [ext_resource type="Material" uid="uid://mlha6r17v2en" path="res://materials/DarkBluemat.tres" id="5_bno23"] diff --git a/scenes/molikman.tscn b/scenes/molikman.tscn index 3e52aa9..fc594e7 100644 --- a/scenes/molikman.tscn +++ b/scenes/molikman.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=80 format=4 uid="uid://dpsr6ug3pkb40"] +[gd_scene load_steps=83 format=4 uid="uid://dpsr6ug3pkb40"] [ext_resource type="Script" uid="uid://3dphlay25fih" path="res://scripts/player/player.gd" id="1_g2els"] [ext_resource type="Script" uid="uid://dalwlndejfdhm" path="res://scripts/player/crosshair.gd" id="3_dqkch"] @@ -36,6 +36,7 @@ [ext_resource type="Script" uid="uid://b2djbdh05pbcn" path="res://scripts/player/team_color_switcher.gd" id="25_1mtds"] [ext_resource type="Material" uid="uid://cjb0h3of85nc2" path="res://materials/players/molikman/mat_Molikman.tres" id="26_r2jxp"] [ext_resource type="Texture2D" uid="uid://15mf4452fse0" path="res://textures/players/molikman/molikman_ingame_Molikman_blue.png" id="27_j3w78"] +[ext_resource type="Script" uid="uid://dfvnx8f1v6m5g" path="res://scripts/multiplayer/player_input.gd" id="37_b2eak"] [sub_resource type="ArrayMesh" id="ArrayMesh_lot4n"] _surfaces = [{ @@ -7400,6 +7401,14 @@ _data = { &"baked_sp_shoot_empty": SubResource("Animation_do7kw") } +[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_b2eak"] +properties/0/path = NodePath(".:rotation") +properties/0/spawn = true +properties/0/replication_mode = 1 +properties/1/path = NodePath("..:rotation") +properties/1/spawn = true +properties/1/replication_mode = 1 + [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_g2els"] height = 1.2958984 @@ -7410,18 +7419,21 @@ font_size = 32 properties/0/path = NodePath(".:position") properties/0/spawn = true properties/0/replication_mode = 1 -properties/1/path = NodePath(".:rotation") +properties/1/path = NodePath(".:hp") properties/1/spawn = true properties/1/replication_mode = 1 -properties/2/path = NodePath("Camera3D:rotation") +properties/2/path = NodePath(".:team") properties/2/spawn = true -properties/2/replication_mode = 1 -properties/3/path = NodePath(".:hp") +properties/2/replication_mode = 2 +properties/3/path = NodePath(".:player_id") properties/3/spawn = true -properties/3/replication_mode = 1 -properties/4/path = NodePath(".:team") +properties/3/replication_mode = 0 +properties/4/path = NodePath(".:collision_layer") properties/4/spawn = true -properties/4/replication_mode = 2 +properties/4/replication_mode = 0 +properties/5/path = NodePath(".:collision_mask") +properties/5/spawn = true +properties/5/replication_mode = 0 [sub_resource type="Curve" id="Curve_fbysy"] _data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(1, 1), 2.5229826, 0.0, 0, 0] @@ -7604,6 +7616,11 @@ _data = { radius = 0.82177734 height = 3.7087402 +[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_5amik"] +properties/0/path = NodePath("PlayerInput:direction") +properties/0/spawn = true +properties/0/replication_mode = 1 + [node name="Player" type="CharacterBody3D" node_paths=PackedStringArray("weapon_models")] collision_layer = 2 collision_mask = 3 @@ -8579,6 +8596,9 @@ script = ExtResource("4_smehm") fov = 90.0 script = ExtResource("8_rwwcc") +[node name="CameraSync" type="MultiplayerSynchronizer" parent="Camera3D"] +replication_config = SubResource("SceneReplicationConfig_b2eak") + [node name="StandArea" type="Area3D" parent="."] collision_layer = 0 @@ -8701,7 +8721,7 @@ grow_vertical = 2 visible = false layout_mode = 2 -[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="."] +[node name="PlayerPropertiesSync" type="MultiplayerSynchronizer" parent="."] replication_config = SubResource("SceneReplicationConfig_qhqgy") [node name="StepAudio" type="AudioStreamPlayer3D" parent="."] @@ -8794,9 +8814,10 @@ land_sound = NodePath("../../LandAudio") script = ExtResource("19_rwwcc") animation_player = NodePath("../../AnimationPlayer") -[node name="PlayerMovement" type="Node" parent="." node_paths=PackedStringArray("player")] +[node name="PlayerMovement" type="Node" parent="." node_paths=PackedStringArray("player", "player_input")] script = ExtResource("19_70eug") player = NodePath("..") +player_input = NodePath("../PlayerInput") [node name="WeaponSystem" type="Node" parent="." node_paths=PackedStringArray("animation_player", "camera", "player")] script = ExtResource("4_qlg0r") @@ -8841,6 +8862,10 @@ material = ExtResource("26_r2jxp") player = NodePath("..") blue_team_texture = ExtResource("27_j3w78") +[node name="PlayerInput" type="MultiplayerSynchronizer" parent="."] +replication_config = SubResource("SceneReplicationConfig_5amik") +script = ExtResource("37_b2eak") + [connection signal="died" from="." to="molikman_ingame/VisibleEnabler" method="reverse"] [connection signal="died" from="." to="Camera3D" method="disable"] [connection signal="died" from="." to="Camera3D/DeadSpectator" method="set_active"] @@ -8848,5 +8873,4 @@ blue_team_texture = ExtResource("27_j3w78") [connection signal="died" from="." to="PlayerMovement" method="disable"] [connection signal="died" from="." to="WeaponSystem" method="disable"] [connection signal="health_changed" from="." to="HUD/Healthbar" method="on_hp_changed"] -[connection signal="spawned" from="." to="TeamUpdater" method="on_spawned"] [connection signal="ammo_updated" from="WeaponSystem" to="HUD/AmmoDisplay" method="on_ammo_updated"] diff --git a/scripts/multiplayer/player_input.gd b/scripts/multiplayer/player_input.gd index 67eef7c..0f664d0 100644 --- a/scripts/multiplayer/player_input.gd +++ b/scripts/multiplayer/player_input.gd @@ -1,7 +1,9 @@ extends MultiplayerSynchronizer +class_name PlayerInput + #region SYNC -var direction: Vector2 +@export var direction: Vector2 #endregion var crouching: bool = false @@ -24,13 +26,12 @@ signal walk_end signal interact_begin signal interact_end -func _ready() -> void: - set_multiplayer_authority(int(get_parent().name)) +func _process(_delta: float) -> void: + if not is_multiplayer_authority(): return + direction = Input.get_vector("plr_strafe_r","plr_strafe_l", "plr_back","plr_forward") func _input(event: InputEvent) -> void: if not is_multiplayer_authority(): return - direction = Input.get_vector("plr_strafe_r","plr_strafe_l", "plr_back","plr_forward") - if event.is_action_pressed("plr_ult"): switch_on_server.rpc_id(1,"ultimate") elif event.is_action_pressed("plr_bomb"): diff --git a/scripts/multiplayer/team_spawner.gd b/scripts/multiplayer/spawn_system/team_spawner.gd similarity index 98% rename from scripts/multiplayer/team_spawner.gd rename to scripts/multiplayer/spawn_system/team_spawner.gd index 23f7fde..752d7fc 100644 --- a/scripts/multiplayer/team_spawner.gd +++ b/scripts/multiplayer/spawn_system/team_spawner.gd @@ -41,6 +41,7 @@ func spawn_player(id: int) -> void: var distance = randf_range(0,spawn_radius) var angle = randf_range(0,TAU) var new_position = global_position + Vector3.RIGHT.rotated(Vector3.UP,angle) * distance + inst.player_id = id get_parent().add_child(inst) inst.global_position = new_position inst.team = team diff --git a/scripts/multiplayer/team_spawner.gd.uid b/scripts/multiplayer/spawn_system/team_spawner.gd.uid similarity index 100% rename from scripts/multiplayer/team_spawner.gd.uid rename to scripts/multiplayer/spawn_system/team_spawner.gd.uid diff --git a/scripts/player/collision_team_updater.gd b/scripts/player/collision_team_updater.gd index a4028bf..fa9c0c4 100644 --- a/scripts/player/collision_team_updater.gd +++ b/scripts/player/collision_team_updater.gd @@ -7,17 +7,10 @@ extends Node const ATTACK_LAYER: int = 0b10000 const DEFENCE_LAYER: int = 0b100000 -func on_spawned() -> void: +func _ready() -> void: + if is_multiplayer_authority() == false: return var mask = (ATTACK_LAYER if (player.team == Session.TEAMS.DEFENCE != inverse) else DEFENCE_LAYER) if layer: get_parent().collision_layer |= mask else: get_parent().collision_mask |= mask - global_update.rpc(layer,mask) - -@rpc -func global_update(new_layer,mask) -> void: - if new_layer: - get_parent().collision_layer |= mask - else: - get_parent().collision_mask |= mask diff --git a/scripts/player/dead_player_spectator.gd b/scripts/player/dead_player_spectator.gd index 1efc8fa..fa50239 100644 --- a/scripts/player/dead_player_spectator.gd +++ b/scripts/player/dead_player_spectator.gd @@ -4,9 +4,8 @@ extends Camera3D var active: bool -func _ready() -> void: - if not is_multiplayer_authority(): - return +func _enter_tree() -> void: + set_multiplayer_authority(int(get_parent().get_parent().name)) func set_active() -> void: if not is_multiplayer_authority(): diff --git a/scripts/player/player.gd b/scripts/player/player.gd index 649d11e..02b87fa 100644 --- a/scripts/player/player.gd +++ b/scripts/player/player.gd @@ -4,10 +4,14 @@ class_name Player @export var team: Session.TEAMS @export var weapon_models: Dictionary[StringName,Node3D] +@export var player_id: int = 1: + set(id): + player_id = id + $PlayerInput.set_multiplayer_authority(id) + $Camera3D.set_multiplayer_authority(id) var passived: bool = false -signal spawned signal health_changed(to: int) signal died diff --git a/scripts/player/player_movement.gd b/scripts/player/player_movement.gd index 84f1f42..7052bc1 100644 --- a/scripts/player/player_movement.gd +++ b/scripts/player/player_movement.gd @@ -3,6 +3,7 @@ extends Node class_name PlayerMovement @export var player: Player +@export var player_input: PlayerInput var disabled: bool func disable() -> void: @@ -15,7 +16,7 @@ func process_movement(max_speed: float,acceleration: float,deceleration: float,d player.velocity.x = 0 player.velocity.z = 0 return - var input_dir := Input.get_vector("plr_strafe_r","plr_strafe_l", "plr_back","plr_forward") + var input_dir := player_input.direction var direction := (player.transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized() if direction: player.velocity.x = clamp(player.velocity.x + direction.x * acceleration * delta,-max_speed*abs(direction.x),max_speed*abs(direction.x)) diff --git a/scripts/player/team_color_switcher.gd b/scripts/player/team_color_switcher.gd index 3410814..f855555 100644 --- a/scripts/player/team_color_switcher.gd +++ b/scripts/player/team_color_switcher.gd @@ -5,8 +5,5 @@ extends Node @export var blue_team_texture: Texture2D func _ready() -> void: - get_tree().create_timer(1).timeout.connect(on_player_spawned) - -func on_player_spawned() -> void: if player.team == Session.TEAMS.DEFENCE: material.albedo_texture = blue_team_texture diff --git a/scripts/weapon_system/gun/semi_auto_shoot_state.gd b/scripts/weapon_system/gun/semi_auto_shoot_state.gd index d60f8a8..4346795 100644 --- a/scripts/weapon_system/gun/semi_auto_shoot_state.gd +++ b/scripts/weapon_system/gun/semi_auto_shoot_state.gd @@ -39,7 +39,7 @@ func fire() -> void: machine.animation_player.play(with_morphems("shoot")) if is_multiplayer_authority(): - Session.shoot(damage,shoot_distance) + Session.shoot(int(machine.player.name),damage,shoot_distance) fire_timer.start() machine.player_camera.recoil(horizontal_curve.sample(bullets_shot),vertical_curve.sample(bullets_shot)) diff --git a/scripts/weapon_system/knife/knife_attack.gd b/scripts/weapon_system/knife/knife_attack.gd index 5b1ef7b..57285f6 100644 --- a/scripts/weapon_system/knife/knife_attack.gd +++ b/scripts/weapon_system/knife/knife_attack.gd @@ -14,7 +14,7 @@ func exit() -> void: func attack() -> void: if is_multiplayer_authority(): - Session.shoot(damage,1.5) + Session.shoot(int(machine.player.name),damage,1.5) func on_animation_finished(animation): if animation == machine.animation_prefix + "attack": diff --git a/scripts/weapon_system/knife/knife_attack_heavy.gd b/scripts/weapon_system/knife/knife_attack_heavy.gd index 68d1739..2b5a557 100644 --- a/scripts/weapon_system/knife/knife_attack_heavy.gd +++ b/scripts/weapon_system/knife/knife_attack_heavy.gd @@ -12,7 +12,7 @@ func exit() -> void: func attack() -> void: if is_multiplayer_authority(): - Session.shoot(damage,1.5) + Session.shoot(int(machine.player.name),damage,1.5) func on_animation_finished(animation): if animation == machine.animation_prefix + "heavy_attack": diff --git a/scripts/weapon_system/weapon_system.gd b/scripts/weapon_system/weapon_system.gd index 6c63a6d..e896000 100644 --- a/scripts/weapon_system/weapon_system.gd +++ b/scripts/weapon_system/weapon_system.gd @@ -78,8 +78,6 @@ func switch(to: StringName, exit: bool = true): ammo_updated.emit(current_state.ammo,current_state.remaining_ammo) switched_to.emit(current_state) - - update_remotes.rpc(to,exit) func return_to_previous(exit: bool = true): if last_slot != "": @@ -87,15 +85,6 @@ func return_to_previous(exit: bool = true): else: switch("knife", exit) -@rpc("authority","call_remote","reliable") -func update_remotes(to: StringName,exit: bool): - if current_state != null and exit: - current_state.exit() - current_state = slots[to] - current_state.enter() - - switched_to.emit(current_state) - func drop_current(): drop(current_state)