Compare commits

...

2 commits

Author SHA1 Message Date
fb480e0a8b camera rotation sync 2025-12-03 16:12:57 +05:00
bb3a14ece7 movement sync 2025-12-03 16:05:52 +05:00
14 changed files with 57 additions and 48 deletions

View file

@ -1,7 +1,7 @@
[gd_scene load_steps=24 format=3 uid="uid://cqrh2cc7m2i7f"] [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="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://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://dynpcduei1wfn" path="res://materials/Bluemat.tres" id="4_yx0ab"]
[ext_resource type="Material" uid="uid://mlha6r17v2en" path="res://materials/DarkBluemat.tres" id="5_bno23"] [ext_resource type="Material" uid="uid://mlha6r17v2en" path="res://materials/DarkBluemat.tres" id="5_bno23"]

View file

@ -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://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"] [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="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="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="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"] [sub_resource type="ArrayMesh" id="ArrayMesh_lot4n"]
_surfaces = [{ _surfaces = [{
@ -7400,6 +7401,14 @@ _data = {
&"baked_sp_shoot_empty": SubResource("Animation_do7kw") &"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"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_g2els"]
height = 1.2958984 height = 1.2958984
@ -7410,18 +7419,21 @@ font_size = 32
properties/0/path = NodePath(".:position") properties/0/path = NodePath(".:position")
properties/0/spawn = true properties/0/spawn = true
properties/0/replication_mode = 1 properties/0/replication_mode = 1
properties/1/path = NodePath(".:rotation") properties/1/path = NodePath(".:hp")
properties/1/spawn = true properties/1/spawn = true
properties/1/replication_mode = 1 properties/1/replication_mode = 1
properties/2/path = NodePath("Camera3D:rotation") properties/2/path = NodePath(".:team")
properties/2/spawn = true properties/2/spawn = true
properties/2/replication_mode = 1 properties/2/replication_mode = 2
properties/3/path = NodePath(".:hp") properties/3/path = NodePath(".:player_id")
properties/3/spawn = true properties/3/spawn = true
properties/3/replication_mode = 1 properties/3/replication_mode = 0
properties/4/path = NodePath(".:team") properties/4/path = NodePath(".:collision_layer")
properties/4/spawn = true 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"] [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] _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 radius = 0.82177734
height = 3.7087402 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")] [node name="Player" type="CharacterBody3D" node_paths=PackedStringArray("weapon_models")]
collision_layer = 2 collision_layer = 2
collision_mask = 3 collision_mask = 3
@ -8579,6 +8596,9 @@ script = ExtResource("4_smehm")
fov = 90.0 fov = 90.0
script = ExtResource("8_rwwcc") script = ExtResource("8_rwwcc")
[node name="CameraSync" type="MultiplayerSynchronizer" parent="Camera3D"]
replication_config = SubResource("SceneReplicationConfig_b2eak")
[node name="StandArea" type="Area3D" parent="."] [node name="StandArea" type="Area3D" parent="."]
collision_layer = 0 collision_layer = 0
@ -8701,7 +8721,7 @@ grow_vertical = 2
visible = false visible = false
layout_mode = 2 layout_mode = 2
[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="."] [node name="PlayerPropertiesSync" type="MultiplayerSynchronizer" parent="."]
replication_config = SubResource("SceneReplicationConfig_qhqgy") replication_config = SubResource("SceneReplicationConfig_qhqgy")
[node name="StepAudio" type="AudioStreamPlayer3D" parent="."] [node name="StepAudio" type="AudioStreamPlayer3D" parent="."]
@ -8794,9 +8814,10 @@ land_sound = NodePath("../../LandAudio")
script = ExtResource("19_rwwcc") script = ExtResource("19_rwwcc")
animation_player = NodePath("../../AnimationPlayer") 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") script = ExtResource("19_70eug")
player = NodePath("..") player = NodePath("..")
player_input = NodePath("../PlayerInput")
[node name="WeaponSystem" type="Node" parent="." node_paths=PackedStringArray("animation_player", "camera", "player")] [node name="WeaponSystem" type="Node" parent="." node_paths=PackedStringArray("animation_player", "camera", "player")]
script = ExtResource("4_qlg0r") script = ExtResource("4_qlg0r")
@ -8841,6 +8862,10 @@ material = ExtResource("26_r2jxp")
player = NodePath("..") player = NodePath("..")
blue_team_texture = ExtResource("27_j3w78") 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="molikman_ingame/VisibleEnabler" method="reverse"]
[connection signal="died" from="." to="Camera3D" method="disable"] [connection signal="died" from="." to="Camera3D" method="disable"]
[connection signal="died" from="." to="Camera3D/DeadSpectator" method="set_active"] [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="PlayerMovement" method="disable"]
[connection signal="died" from="." to="WeaponSystem" method="disable"] [connection signal="died" from="." to="WeaponSystem" method="disable"]
[connection signal="health_changed" from="." to="HUD/Healthbar" method="on_hp_changed"] [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"] [connection signal="ammo_updated" from="WeaponSystem" to="HUD/AmmoDisplay" method="on_ammo_updated"]

View file

@ -1,7 +1,9 @@
extends MultiplayerSynchronizer extends MultiplayerSynchronizer
class_name PlayerInput
#region SYNC #region SYNC
var direction: Vector2 @export var direction: Vector2
#endregion #endregion
var crouching: bool = false var crouching: bool = false
@ -24,13 +26,12 @@ signal walk_end
signal interact_begin signal interact_begin
signal interact_end signal interact_end
func _ready() -> void: func _process(_delta: float) -> void:
set_multiplayer_authority(int(get_parent().name))
func _input(event: InputEvent) -> void:
if not is_multiplayer_authority(): return if not is_multiplayer_authority(): return
direction = Input.get_vector("plr_strafe_r","plr_strafe_l", "plr_back","plr_forward") 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
if event.is_action_pressed("plr_ult"): if event.is_action_pressed("plr_ult"):
switch_on_server.rpc_id(1,"ultimate") switch_on_server.rpc_id(1,"ultimate")
elif event.is_action_pressed("plr_bomb"): elif event.is_action_pressed("plr_bomb"):

View file

@ -41,6 +41,7 @@ func spawn_player(id: int) -> void:
var distance = randf_range(0,spawn_radius) var distance = randf_range(0,spawn_radius)
var angle = randf_range(0,TAU) var angle = randf_range(0,TAU)
var new_position = global_position + Vector3.RIGHT.rotated(Vector3.UP,angle) * distance var new_position = global_position + Vector3.RIGHT.rotated(Vector3.UP,angle) * distance
inst.player_id = id
get_parent().add_child(inst) get_parent().add_child(inst)
inst.global_position = new_position inst.global_position = new_position
inst.team = team inst.team = team

View file

@ -7,17 +7,10 @@ extends Node
const ATTACK_LAYER: int = 0b10000 const ATTACK_LAYER: int = 0b10000
const DEFENCE_LAYER: int = 0b100000 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) var mask = (ATTACK_LAYER if (player.team == Session.TEAMS.DEFENCE != inverse) else DEFENCE_LAYER)
if layer: if layer:
get_parent().collision_layer |= mask get_parent().collision_layer |= mask
else: else:
get_parent().collision_mask |= mask 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

View file

@ -4,9 +4,8 @@ extends Camera3D
var active: bool var active: bool
func _ready() -> void: func _enter_tree() -> void:
if not is_multiplayer_authority(): set_multiplayer_authority(int(get_parent().get_parent().name))
return
func set_active() -> void: func set_active() -> void:
if not is_multiplayer_authority(): if not is_multiplayer_authority():

View file

@ -4,10 +4,14 @@ class_name Player
@export var team: Session.TEAMS @export var team: Session.TEAMS
@export var weapon_models: Dictionary[StringName,Node3D] @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 var passived: bool = false
signal spawned
signal health_changed(to: int) signal health_changed(to: int)
signal died signal died

View file

@ -3,6 +3,7 @@ extends Node
class_name PlayerMovement class_name PlayerMovement
@export var player: Player @export var player: Player
@export var player_input: PlayerInput
var disabled: bool var disabled: bool
func disable() -> void: func disable() -> void:
@ -15,7 +16,7 @@ func process_movement(max_speed: float,acceleration: float,deceleration: float,d
player.velocity.x = 0 player.velocity.x = 0
player.velocity.z = 0 player.velocity.z = 0
return 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() var direction := (player.transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
if direction: if direction:
player.velocity.x = clamp(player.velocity.x + direction.x * acceleration * delta,-max_speed*abs(direction.x),max_speed*abs(direction.x)) player.velocity.x = clamp(player.velocity.x + direction.x * acceleration * delta,-max_speed*abs(direction.x),max_speed*abs(direction.x))

View file

@ -5,8 +5,5 @@ extends Node
@export var blue_team_texture: Texture2D @export var blue_team_texture: Texture2D
func _ready() -> void: func _ready() -> void:
get_tree().create_timer(1).timeout.connect(on_player_spawned)
func on_player_spawned() -> void:
if player.team == Session.TEAMS.DEFENCE: if player.team == Session.TEAMS.DEFENCE:
material.albedo_texture = blue_team_texture material.albedo_texture = blue_team_texture

View file

@ -39,7 +39,7 @@ func fire() -> void:
machine.animation_player.play(with_morphems("shoot")) machine.animation_player.play(with_morphems("shoot"))
if is_multiplayer_authority(): if is_multiplayer_authority():
Session.shoot(damage,shoot_distance) Session.shoot(int(machine.player.name),damage,shoot_distance)
fire_timer.start() fire_timer.start()
machine.player_camera.recoil(horizontal_curve.sample(bullets_shot),vertical_curve.sample(bullets_shot)) machine.player_camera.recoil(horizontal_curve.sample(bullets_shot),vertical_curve.sample(bullets_shot))

View file

@ -14,7 +14,7 @@ func exit() -> void:
func attack() -> void: func attack() -> void:
if is_multiplayer_authority(): if is_multiplayer_authority():
Session.shoot(damage,1.5) Session.shoot(int(machine.player.name),damage,1.5)
func on_animation_finished(animation): func on_animation_finished(animation):
if animation == machine.animation_prefix + "attack": if animation == machine.animation_prefix + "attack":

View file

@ -12,7 +12,7 @@ func exit() -> void:
func attack() -> void: func attack() -> void:
if is_multiplayer_authority(): if is_multiplayer_authority():
Session.shoot(damage,1.5) Session.shoot(int(machine.player.name),damage,1.5)
func on_animation_finished(animation): func on_animation_finished(animation):
if animation == machine.animation_prefix + "heavy_attack": if animation == machine.animation_prefix + "heavy_attack":

View file

@ -79,23 +79,12 @@ func switch(to: StringName, exit: bool = true):
ammo_updated.emit(current_state.ammo,current_state.remaining_ammo) ammo_updated.emit(current_state.ammo,current_state.remaining_ammo)
switched_to.emit(current_state) switched_to.emit(current_state)
update_remotes.rpc(to,exit)
func return_to_previous(exit: bool = true): func return_to_previous(exit: bool = true):
if last_slot != "": if last_slot != "":
switch(last_slot, exit) switch(last_slot, exit)
else: else:
switch("knife", exit) 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(): func drop_current():
drop(current_state) drop(current_state)