Move the real player authority to server
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
- Add rust bindings for the server player controller - Implement reconciliation loop for checking the player state - Place spawners on the test map - Add Containerfile and helm chart
This commit is contained in:
@ -15,8 +15,6 @@ func _process(delta: float) -> void:
|
||||
|
||||
|
||||
func _on_head_collision_body_part_hit(dam: Variant) -> void:
|
||||
#print("head is hit" + str(dam))
|
||||
#print(owner_placeholder)
|
||||
#if owner_placeholder.has_method("take_damage"):
|
||||
if owner_placeholder:
|
||||
owner_placeholder.take_damage(dam)
|
||||
|
@ -1419,12 +1419,12 @@ shape = SubResource("SphereShape3D_axep3")
|
||||
[node name="PhysicalBoneSimulator3D" type="PhysicalBoneSimulator3D" parent="Body/Armature/Skeleton3D"]
|
||||
|
||||
[node name="Physical Bone mixamorig_Hips" type="PhysicalBone3D" parent="Body/Armature/Skeleton3D/PhysicalBoneSimulator3D"]
|
||||
transform = Transform3D(82.5044, -54.0559, -16.4615, 55.0482, 83.4649, 1.8195, 12.756, -10.5629, 98.619, 1.31498, 0.290624, -87.4646)
|
||||
transform = Transform3D(82.5044, -54.0559, -16.4615, 55.0482, 83.4649, 1.8195, 12.756, -10.5629, 98.619, 1.31498, 0.290625, -87.4646)
|
||||
collision_layer = 4
|
||||
collision_mask = 4
|
||||
joint_type = 1
|
||||
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.35312e-08, -5.58794e-09, 0.0499956)
|
||||
body_offset = Transform3D(100, -0.0695305, -0.00860751, -1.19209e-05, 12.2744, -99.2438, 0.0700493, 99.2438, 12.2744, 0.00043869, 4.96175, -0.613665)
|
||||
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.11306e-07, -5.58794e-09, 0.0499956)
|
||||
body_offset = Transform3D(100, -0.0695305, -0.00860918, -1.4782e-05, 12.2744, -99.2438, 0.0700493, 99.2438, 12.2744, 0.000441551, 4.96175, -0.613665)
|
||||
mass = 20.0
|
||||
bone_name = "mixamorig_Hips"
|
||||
joint_constraints/bias = 0.3
|
||||
@ -1436,12 +1436,12 @@ transform = Transform3D(0.01, 0, 0, 0, -4.37114e-10, 0.01, 0, -0.01, -4.37114e-1
|
||||
shape = SubResource("CapsuleShape3D_0ptuo")
|
||||
|
||||
[node name="Physical Bone mixamorig_Spine" type="PhysicalBone3D" parent="Body/Armature/Skeleton3D/PhysicalBoneSimulator3D"]
|
||||
transform = Transform3D(80.9412, -58.546, -4.56913, 57.6046, 80.6695, -13.1964, 11.4119, 8.0493, 99.0201, 2.40599, 0.973749, -98.2036)
|
||||
transform = Transform3D(80.9412, -58.546, -4.56913, 57.6046, 80.6695, -13.1964, 11.4119, 8.04929, 99.0201, 2.40599, 0.973749, -98.2036)
|
||||
collision_layer = 4
|
||||
collision_mask = 4
|
||||
joint_type = 1
|
||||
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.2222e-09, 2.2377e-09, 0.05866)
|
||||
body_offset = Transform3D(100, 7.62939e-06, 9.05991e-06, 4.76837e-06, -1.90735e-06, -100, -1.52588e-05, 100, -3.8147e-06, -9.53674e-07, 5.866, 0)
|
||||
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.10332e-09, 5.59426e-10, 0.05866)
|
||||
body_offset = Transform3D(100, 7.62939e-06, 1.09673e-05, 4.76837e-06, 0, -100, -1.52588e-05, 100, -9.53674e-07, -9.53674e-07, 5.866, 0)
|
||||
mass = 20.0
|
||||
bone_name = "mixamorig_Spine"
|
||||
joint_constraints/bias = 0.3
|
||||
@ -1457,8 +1457,8 @@ transform = Transform3D(-97.8019, 4.47329, 20.366, -15.8369, -79.4709, -58.5966,
|
||||
collision_layer = 4
|
||||
collision_mask = 4
|
||||
joint_type = 1
|
||||
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.90306e-08, -1.39698e-07, 0.0981531)
|
||||
body_offset = Transform3D(-100, -0.00220013, -0.000778198, -5.24521e-06, 33.8066, -94.1122, 0.00232792, -94.1122, -33.8066, 7.24792e-05, 9.23741, 3.31821)
|
||||
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.71765e-08, -1.39698e-07, 0.0981531)
|
||||
body_offset = Transform3D(-100, -0.00220013, -0.000778198, -5.24521e-06, 33.8066, -94.1122, 0.00232792, -94.1122, -33.8066, 6.86646e-05, 9.23741, 3.31821)
|
||||
mass = 7.0
|
||||
bone_name = "mixamorig_Head"
|
||||
joint_constraints/bias = 0.3
|
||||
@ -1470,12 +1470,12 @@ transform = Transform3D(0.01, 0, 0, 0, -4.37114e-10, 0.01, 0, -0.01, -4.37114e-1
|
||||
shape = SubResource("CapsuleShape3D_1gw5y")
|
||||
|
||||
[node name="Physical Bone mixamorig_LeftArm" type="PhysicalBone3D" parent="Body/Armature/Skeleton3D/PhysicalBoneSimulator3D"]
|
||||
transform = Transform3D(86.1165, 14.0252, -48.8594, -45.4995, 64.1262, -61.787, 22.6659, 75.4396, 61.6046, 16.1942, 31.0309, -132.592)
|
||||
transform = Transform3D(86.1165, 14.0252, -48.8594, -45.4995, 64.1262, -61.787, 22.6659, 75.4395, 61.6046, 16.1942, 31.0309, -132.592)
|
||||
collision_layer = 4
|
||||
collision_mask = 4
|
||||
joint_type = 1
|
||||
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.65892e-08, 2.39336e-07, 0.137023)
|
||||
body_offset = Transform3D(100, -3.05176e-05, -2.67029e-05, 2.09808e-05, 100, -7.62939e-06, 1.71661e-05, -3.8147e-06, 100, 0, -2.28882e-05, -13.7023)
|
||||
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.17137e-09, 2.34109e-07, 0.137023)
|
||||
body_offset = Transform3D(100, -4.19617e-05, -2.47955e-05, 2.86102e-05, 100, -3.8147e-06, 1.71661e-05, -3.8147e-06, 100, 3.8147e-06, -2.28882e-05, -13.7023)
|
||||
mass = 3.0
|
||||
bone_name = "mixamorig_LeftArm"
|
||||
joint_constraints/bias = 0.3
|
||||
@ -1487,12 +1487,12 @@ transform = Transform3D(0.01, 0, 0, 0, 0.00997432, -0.000716193, 0, 0.000716193,
|
||||
shape = SubResource("CapsuleShape3D_krlof")
|
||||
|
||||
[node name="Physical Bone mixamorig_LeftForeArm" type="PhysicalBone3D" parent="Body/Armature/Skeleton3D/PhysicalBoneSimulator3D"]
|
||||
transform = Transform3D(-48.2566, -12.058, 86.752, -78.7312, -37.4258, -48.997, 38.3757, -91.9452, 8.56699, 1.36485, 46.9033, -104.66)
|
||||
transform = Transform3D(-48.2566, -12.058, 86.752, -78.7312, -37.4258, -48.997, 38.3757, -91.9452, 8.56699, 1.36484, 46.9033, -104.66)
|
||||
collision_layer = 4
|
||||
collision_mask = 4
|
||||
joint_type = 1
|
||||
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.47239e-07, 6.31263e-08, 0.138072)
|
||||
body_offset = Transform3D(100, 3.05176e-05, -4.19617e-05, -3.8147e-05, 0, -100, -3.8147e-06, 100, 9.53674e-06, 3.05176e-05, 13.8072, -7.62939e-06)
|
||||
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.99827e-07, 6.04928e-08, 0.138072)
|
||||
body_offset = Transform3D(100, 3.05176e-05, -4.19617e-05, -3.8147e-05, 0, -100, -3.8147e-06, 100, 1.14441e-05, 4.57764e-05, 13.8072, -7.62939e-06)
|
||||
mass = 3.0
|
||||
bone_name = "mixamorig_LeftForeArm"
|
||||
joint_constraints/bias = 0.3
|
||||
@ -1541,8 +1541,8 @@ transform = Transform3D(24.3552, 37.4063, 89.4852, -25.0101, 91.5653, -31.4688,
|
||||
collision_layer = 4
|
||||
collision_mask = 4
|
||||
joint_type = 1
|
||||
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.40737e-07, -2.80688e-08, 0.138072)
|
||||
body_offset = Transform3D(100, -1.14441e-05, 8.58307e-06, -3.8147e-06, 100, 9.53674e-06, 5.72205e-06, -5.72205e-06, 100, -1.52588e-05, 1.49012e-06, -13.8072)
|
||||
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.40737e-07, -5.19106e-08, 0.138072)
|
||||
body_offset = Transform3D(100, -1.14441e-05, 8.58307e-06, -3.8147e-06, 100, 9.53674e-06, 5.72205e-06, -5.72205e-06, 100, -1.52588e-05, 3.8743e-06, -13.8072)
|
||||
mass = 3.0
|
||||
bone_name = "mixamorig_RightForeArm"
|
||||
joint_constraints/bias = 0.3
|
||||
@ -1558,8 +1558,8 @@ transform = Transform3D(89.0767, -24.8074, -38.0781, 5.05123, 88.6726, -45.9527,
|
||||
collision_layer = 4
|
||||
collision_mask = 4
|
||||
joint_type = 1
|
||||
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.86265e-08, 2.31434e-07, 0.0264903)
|
||||
body_offset = Transform3D(-58.5197, -57.9893, -56.6805, -1.19209e-05, 69.8991, -71.5131, 81.0891, -41.8492, -40.9048, 1.5015, 1.89439, 1.08359)
|
||||
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.86265e-08, 2.30502e-07, 0.0264903)
|
||||
body_offset = Transform3D(-58.5197, -57.9893, -56.6805, -1.33514e-05, 69.8991, -71.5131, 81.0891, -41.8492, -40.9048, 1.5015, 1.89439, 1.08359)
|
||||
bone_name = "mixamorig_RightHand"
|
||||
joint_constraints/bias = 0.3
|
||||
joint_constraints/damping = 1.0
|
||||
@ -1575,7 +1575,7 @@ collision_layer = 4
|
||||
collision_mask = 4
|
||||
joint_type = 1
|
||||
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.78612e-08, -7.74374e-09, 0.202997)
|
||||
body_offset = Transform3D(100, -2.86102e-05, 9.53674e-06, 7.62939e-06, 7.62939e-06, -100, 3.71933e-05, 100, 3.8147e-06, -5.72205e-06, 20.2997, 0)
|
||||
body_offset = Transform3D(100, -4.3869e-05, 9.53674e-06, 9.53674e-06, 7.62939e-06, -100, 4.673e-05, 100, 3.8147e-06, -5.72205e-06, 20.2997, 0)
|
||||
mass = 5.0
|
||||
bone_name = "mixamorig_LeftUpLeg"
|
||||
joint_constraints/bias = 0.3
|
||||
@ -1604,12 +1604,12 @@ transform = Transform3D(0.01, 0, 0, 0, -4.37114e-10, 0.01, 0, -0.01, -4.37114e-1
|
||||
shape = SubResource("CapsuleShape3D_vwdij")
|
||||
|
||||
[node name="Physical Bone mixamorig_LeftFoot" type="PhysicalBone3D" parent="Body/Armature/Skeleton3D/PhysicalBoneSimulator3D"]
|
||||
transform = Transform3D(-93.6712, -34.5296, 5.78095, -34.9451, 91.207, -21.4506, 2.13418, -22.1132, -97.501, 11.7385, 3.12728, -14.5678)
|
||||
transform = Transform3D(-93.6712, -34.5296, 5.78095, -34.9451, 91.207, -21.4506, 2.13419, -22.1132, -97.501, 11.7385, 3.12728, -14.5678)
|
||||
collision_layer = 4
|
||||
collision_mask = 4
|
||||
joint_type = 1
|
||||
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.66258e-09, 5.6483e-08, 0.078608)
|
||||
body_offset = Transform3D(100, 5.72205e-06, -2.38419e-06, -2.86102e-06, -1.52588e-05, -100, -5.72205e-06, 100, -3.24249e-05, 9.53674e-07, 7.8608, -3.09944e-06)
|
||||
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.41225e-09, 7.07881e-08, 0.078608)
|
||||
body_offset = Transform3D(100, 5.72205e-06, -1.43051e-06, -9.53674e-07, -1.52588e-05, -100, -5.72205e-06, 100, -3.24249e-05, 9.53674e-07, 7.8608, -4.52995e-06)
|
||||
bone_name = "mixamorig_LeftFoot"
|
||||
joint_constraints/bias = 0.3
|
||||
joint_constraints/damping = 1.0
|
||||
@ -1641,8 +1641,8 @@ transform = Transform3D(-91.8175, -23.5086, -31.8888, -36.0103, 83.0805, 42.437,
|
||||
collision_layer = 4
|
||||
collision_mask = 4
|
||||
joint_type = 1
|
||||
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.27453e-09, -2.4944e-07, 0.210495)
|
||||
body_offset = Transform3D(100, -1.71661e-05, 1.33514e-05, -9.53674e-07, 4.19617e-05, -100, 1.90735e-05, 100, 6.86646e-05, -3.33786e-06, 21.0495, 1.04904e-05)
|
||||
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.48112e-08, -2.68514e-07, 0.210495)
|
||||
body_offset = Transform3D(100, -1.71661e-05, 1.33514e-05, -9.53674e-07, 4.19617e-05, -100, 1.90735e-05, 100, 6.86646e-05, -4.29153e-06, 21.0495, 1.23978e-05)
|
||||
mass = 5.0
|
||||
bone_name = "mixamorig_RightLeg"
|
||||
joint_constraints/bias = 0.3
|
||||
|
@ -1,7 +1,8 @@
|
||||
[gd_scene load_steps=11 format=3 uid="uid://b10lpwfjgxds4"]
|
||||
[gd_scene load_steps=13 format=3 uid="uid://b10lpwfjgxds4"]
|
||||
|
||||
[ext_resource type="Script" path="res://scripts/player/player_input_controller.gd" id="1_q75ai"]
|
||||
[ext_resource type="Texture2D" uid="uid://oopj5mj1vdp0" path="res://assets/crosshairs/crosshair_default.png" id="2_lsd7c"]
|
||||
[ext_resource type="Script" path="res://scenes/characters/player_input_controller.gd" id="3_n3epd"]
|
||||
|
||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_jc50w"]
|
||||
margin = 0.5
|
||||
@ -10,14 +11,20 @@ height = 1.6
|
||||
|
||||
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_tl74a"]
|
||||
properties/0/path = NodePath(".:position")
|
||||
properties/0/spawn = false
|
||||
properties/0/spawn = true
|
||||
properties/0/replication_mode = 1
|
||||
properties/1/path = NodePath(".:rotation")
|
||||
properties/1/spawn = false
|
||||
properties/1/spawn = true
|
||||
properties/1/replication_mode = 1
|
||||
properties/2/path = NodePath(".:health")
|
||||
properties/2/spawn = false
|
||||
properties/2/spawn = true
|
||||
properties/2/replication_mode = 2
|
||||
properties/3/path = NodePath(".:velocity")
|
||||
properties/3/spawn = true
|
||||
properties/3/replication_mode = 1
|
||||
properties/4/path = NodePath(".:owner_id")
|
||||
properties/4/spawn = true
|
||||
properties/4/replication_mode = 1
|
||||
|
||||
[sub_resource type="Animation" id="Animation_falg4"]
|
||||
length = 0.001
|
||||
@ -83,11 +90,23 @@ font_size = 70
|
||||
font_size = 100
|
||||
font_color = Color(0.756874, 0, 0.223924, 1)
|
||||
|
||||
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_eour5"]
|
||||
properties/0/path = NodePath(".:input_direction")
|
||||
properties/0/spawn = false
|
||||
properties/0/replication_mode = 2
|
||||
properties/1/path = NodePath(".:jumping")
|
||||
properties/1/spawn = false
|
||||
properties/1/replication_mode = 2
|
||||
|
||||
[node name="CharacterPlaceholder" type="CharacterBody3D"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.799455, 0)
|
||||
collision_layer = 9
|
||||
collision_mask = 9
|
||||
script = ExtResource("1_q75ai")
|
||||
health = null
|
||||
owner_id = null
|
||||
jump_height = null
|
||||
camera_sens = null
|
||||
|
||||
[node name="Collision" type="CollisionShape3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0150437, 0)
|
||||
@ -118,6 +137,7 @@ libraries = {
|
||||
}
|
||||
|
||||
[node name="HUD" type="Control" parent="FirstPersonCameraMount"]
|
||||
visible = false
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
@ -163,3 +183,8 @@ label_settings = SubResource("LabelSettings_1j1uq")
|
||||
|
||||
[node name="ModelMount" type="Node3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.790262, 0)
|
||||
|
||||
[node name="PlayerInput" type="MultiplayerSynchronizer" parent="."]
|
||||
root_path = NodePath(".")
|
||||
replication_config = SubResource("SceneReplicationConfig_eour5")
|
||||
script = ExtResource("3_n3epd")
|
||||
|
35
scenes/characters/player_input_controller.gd
Normal file
35
scenes/characters/player_input_controller.gd
Normal file
@ -0,0 +1,35 @@
|
||||
extends MultiplayerSynchronizer
|
||||
|
||||
@export var jumping := false
|
||||
@export var input_direction := Vector2()
|
||||
|
||||
@onready var camera_mount = $"../FirstPersonCameraMount"
|
||||
@onready var placeholder = $".."
|
||||
|
||||
func _ready() -> void:
|
||||
pass
|
||||
#set_process(get_multiplayer_authority() == multiplayer.get_unique_id())
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(delta: float) -> void:
|
||||
# Add the gravity.
|
||||
if multiplayer.get_unique_id() == get_multiplayer_authority():
|
||||
input_direction = Input.get_vector("move_left", "move_right", "move_forward", "move_backwards")
|
||||
set_input_direction.rpc(input_direction)
|
||||
if Input.is_action_just_pressed("jump"):
|
||||
jump.rpc_id(1)
|
||||
|
||||
var camera_sens: float = 0.002
|
||||
func _input(event):
|
||||
if multiplayer.get_unique_id() == get_multiplayer_authority():
|
||||
if event is InputEventMouseMotion and Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
|
||||
placeholder.rotate_y(-event.relative.x * camera_sens)
|
||||
|
||||
|
||||
@rpc("any_peer", "call_local", "reliable")
|
||||
func set_input_direction(direction: Vector2):
|
||||
input_direction = direction
|
||||
|
||||
@rpc("any_peer", "call_local", "reliable")
|
||||
func jump():
|
||||
jumping = true
|
@ -20,30 +20,34 @@ func _ready() -> void:
|
||||
|
||||
err = _add_player_spawner()
|
||||
if err != OK:
|
||||
print("Couldn't load player spawner")
|
||||
push_error("Couldn't load player spawner")
|
||||
|
||||
err = _add_object_spawner()
|
||||
if err != OK:
|
||||
print("Couldn't load object spawner")
|
||||
push_error("Couldn't load object spawner")
|
||||
# add objects spawner
|
||||
if multiplayer.is_server():
|
||||
_spawn_player(1)
|
||||
else:
|
||||
if not OS.has_feature("dedicated_server"):
|
||||
_request_spawn.rpc_id(1, multiplayer.get_unique_id())
|
||||
pass # Replace with function body.
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(delta: float) -> void:
|
||||
pass
|
||||
if multiplayer.is_server():
|
||||
var active_players = player_spawner._get_root().get_children()
|
||||
for n in active_players:
|
||||
if not GameServerManager.players.has(n.owner_id):
|
||||
_remove_player(n.owner_id)
|
||||
|
||||
@rpc("call_local", "reliable", "any_peer")
|
||||
func _request_spawn(id: int):
|
||||
_spawn_player(id)
|
||||
|
||||
func _spawn_player(id: int):
|
||||
var char : Node3D = null
|
||||
player_spawner.spawn_players(spawn_locations, id)
|
||||
|
||||
func _remove_player(id: int):
|
||||
player_spawner.remove_player(id)
|
||||
|
||||
func _add_player_spawner() -> Error :
|
||||
if not ResourceLoader.exists(PLAYER_SPAWNER):
|
||||
return ERR_DOES_NOT_EXIST
|
||||
|
@ -21,13 +21,21 @@ func spawn_players(spawn_location: SpawnController, id: int) -> Error:
|
||||
if multiplayer.is_server():
|
||||
var char : Node3D = null
|
||||
var player_data: PlayerState = GameServerManager.players[id]
|
||||
char = ResourceLoader.load("res://scenes/characters/placeholder.tscn").instantiate()
|
||||
char = ResourceLoader.load("res://scenes/player/placeholder.tscn").instantiate()
|
||||
char.name = "PlayerPlaceholder_" + str(player_data.id)
|
||||
print(player_data)
|
||||
var position = spawn_location.get_spawner(SpawnController.Sides.BLUE)
|
||||
char.global_position = position
|
||||
char.global_position = position
|
||||
#_get_spawner().spawn(char)
|
||||
char.owner_id = id
|
||||
var position: Vector3 = spawn_location.get_spawner(SpawnController.Sides.BLUE)
|
||||
char.set_server_position(position)
|
||||
_get_root().add_child(char)
|
||||
return OK
|
||||
return ERR_UNAUTHORIZED
|
||||
|
||||
func remove_player(id: int) -> Error:
|
||||
if multiplayer.is_server():
|
||||
var found_childen: Array[Node] =_get_root().get_children()
|
||||
for found_child in found_childen:
|
||||
if found_child.owner_id:
|
||||
if found_child.owner_id == id:
|
||||
found_child.queue_free()
|
||||
return OK
|
||||
return ERR_UNAUTHORIZED
|
||||
|
@ -6,7 +6,7 @@
|
||||
script = ExtResource("1_2hsyd")
|
||||
|
||||
[node name="MultiplayerSpawner" type="MultiplayerSpawner" parent="."]
|
||||
_spawnable_scenes = PackedStringArray("res://scenes/characters/placeholder.tscn")
|
||||
_spawnable_scenes = PackedStringArray("res://scenes/characters/placeholder.tscn", "res://scenes/player/placeholder.tscn")
|
||||
spawn_path = NodePath("../Players")
|
||||
spawn_limit = 10
|
||||
|
||||
|
@ -31,9 +31,7 @@ func _get_available_spawn(spawn_set: Node3D) -> 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
|
||||
|
||||
@ -47,6 +45,5 @@ func get_spawner(team: Sides) -> Vector3:
|
||||
print("red")
|
||||
return Vector3(0,0,0)
|
||||
_:
|
||||
print("хз")
|
||||
return Vector3(0,0,0)
|
||||
# Get all spawners for each team
|
||||
|
@ -961,13 +961,37 @@ script = ExtResource("2_1ss1b")
|
||||
|
||||
[node name="Blue" type="Node3D" parent="SpawnLocations"]
|
||||
|
||||
[node name="Spawn4" type="Node3D" parent="SpawnLocations/Blue"]
|
||||
transform = Transform3D(-0.332276, 0, 0.943182, 0, 1, 0, -0.943182, 0, -0.332276, 53.1487, -0.0093751, -8.68195)
|
||||
|
||||
[node name="Spawn1" type="Node3D" parent="SpawnLocations/Blue"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.234959, 25.2818, 2.12756)
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 52.9098, -0.00937462, 10.3532)
|
||||
|
||||
[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)
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 52.8486, -0.00937653, 4.25512)
|
||||
|
||||
[node name="Spawn3" type="Node3D" parent="SpawnLocations/Blue"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 53.6493, -0.00937504, -4.34097)
|
||||
|
||||
[node name="Spawn5" type="Node3D" parent="SpawnLocations/Blue"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 51.5453, -0.0187502, -17.3639)
|
||||
|
||||
[node name="Red" type="Node3D" parent="SpawnLocations"]
|
||||
|
||||
[node name="Spawn4" type="Node3D" parent="SpawnLocations/Red"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -40.9916, -0.0093751, -8.68195)
|
||||
|
||||
[node name="Spawn1" type="Node3D" parent="SpawnLocations/Red"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -41.2305, -0.00937462, 10.3532)
|
||||
|
||||
[node name="Spawn2" type="Node3D" parent="SpawnLocations/Red"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -41.2917, -0.00937653, 4.25512)
|
||||
|
||||
[node name="Spawn3" type="Node3D" parent="SpawnLocations/Red"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -40.491, -0.00937504, -4.34097)
|
||||
|
||||
[node name="Spawn5" type="Node3D" parent="SpawnLocations/Red"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -42.595, -0.0187502, -17.3639)
|
||||
|
||||
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
|
||||
environment = SubResource("Environment_3ha0j")
|
||||
|
115
scenes/player/placeholder.gd
Normal file
115
scenes/player/placeholder.gd
Normal file
@ -0,0 +1,115 @@
|
||||
extends Node3D
|
||||
class_name PlayerPlaceholder
|
||||
|
||||
@export var owner_id: int = 0
|
||||
@export var initial_position: Vector3 = Vector3(0, 0, 0)
|
||||
# -- Components
|
||||
@onready var client_node: CharacterBody3D = $PlayerControlledNode
|
||||
@onready var server_node: PlayerServerNode = $ServerControlledNode
|
||||
@export var character_speed: int = 5
|
||||
|
||||
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
set_multiplayer_authority(1)
|
||||
client_node.set_multiplayer_authority(owner_id)
|
||||
$PlayerControlledNode/CameraMount.set_multiplayer_authority(owner_id)
|
||||
switch_players_camera.rpc_id(owner_id)
|
||||
server_node.global_position = initial_position
|
||||
client_node.global_position = server_node.global_position
|
||||
client_node.rotation.y = server_node.rotation.y
|
||||
client_node.rotation.x = server_node.rotation.x
|
||||
|
||||
if multiplayer.is_server():
|
||||
$Timer.start()
|
||||
if owner_id != multiplayer.get_unique_id():
|
||||
client_node.queue_free()
|
||||
else:
|
||||
pass
|
||||
#client_node._add_legs_to_first_view()
|
||||
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(delta: float) -> void:
|
||||
#if desired_player_state.globa_position != real_player_state.globa_position:
|
||||
#desired_player_state.globa_position = real_player_state.globa_position
|
||||
|
||||
pass
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
pass
|
||||
|
||||
@rpc("authority", "call_local", "reliable")
|
||||
func switch_players_camera():
|
||||
$PlayerControlledNode/CameraMount/Camera3D.make_current()
|
||||
|
||||
func set_server_position(position: Vector3):
|
||||
initial_position = position
|
||||
|
||||
|
||||
func _on_Timer_timeout():
|
||||
$Timer.start()
|
||||
|
||||
|
||||
func _on_timer_timeout() -> void:
|
||||
if multiplayer.is_server():
|
||||
verify_position.rpc_id(owner_id)
|
||||
verify_rotation.rpc_id(owner_id)
|
||||
$Timer.start()
|
||||
|
||||
pass # Replace with function body.
|
||||
|
||||
@rpc("authority", "call_local")
|
||||
func verify_position():
|
||||
var desired_position: Vector3 = client_node.global_position
|
||||
send_position.rpc_id(1, desired_position.x, desired_position.y, desired_position.z)
|
||||
|
||||
@rpc("any_peer", "call_local")
|
||||
func send_position(x: float, y: float, z: float):
|
||||
var desired_position: Vector3 = Vector3(x, y, z)
|
||||
if multiplayer.is_server():
|
||||
var real_position: Vector3 = server_node.global_position
|
||||
var difference: Vector3 = desired_position - real_position
|
||||
if is_vector_a_lower_than_b(difference, Vector3(0.3, 0.3, 0.3)):
|
||||
server_node.global_position = desired_position
|
||||
else:
|
||||
var new_position: Vector3 = desired_position.lerp(real_position, 0.5)
|
||||
adjust_position.rpc_id(owner_id, new_position.x, new_position.y, new_position.z)
|
||||
|
||||
@rpc("authority", "call_local")
|
||||
func adjust_position(x: float, y: float, z: float):
|
||||
var desired_position: Vector3 = Vector3(x, y, z)
|
||||
if owner_id == multiplayer.get_unique_id():
|
||||
push_warning("player position is not valid, adjusting")
|
||||
client_node.global_position = desired_position
|
||||
|
||||
|
||||
@rpc("authority", "call_local")
|
||||
func verify_rotation():
|
||||
var desired_rotation: Vector3 = client_node.rotation
|
||||
send_rotation.rpc_id(1, desired_rotation.x, desired_rotation.y, desired_rotation.z)
|
||||
|
||||
@rpc("any_peer", "call_local")
|
||||
func send_rotation(x: float, y: float, z: float):
|
||||
var desired_rotation: Vector3 = Vector3(x, y, z)
|
||||
if multiplayer.is_server():
|
||||
var real_rotation: Vector3 = server_node.rotation
|
||||
var difference: Vector3 = desired_rotation - real_rotation
|
||||
if is_vector_a_lower_than_b(difference, Vector3(0.3, 0.3, 0.3)):
|
||||
server_node.rotation = desired_rotation
|
||||
else:
|
||||
var new_rotation: Vector3 = desired_rotation.lerp(real_rotation, 0.5)
|
||||
adjust_rotation.rpc_id(owner_id, new_rotation.x, new_rotation.y, new_rotation.z)
|
||||
|
||||
@rpc("any_peer", "call_local")
|
||||
func adjust_rotation(x: float, y: float, z: float):
|
||||
var desired_rotation: Vector3 = Vector3(x, y, z)
|
||||
if owner_id == multiplayer.get_unique_id():
|
||||
push_warning("player rotation is not valid, adjusting")
|
||||
client_node.rotation = desired_rotation
|
||||
|
||||
|
||||
|
||||
func is_vector_a_lower_than_b(vec_a: Vector3, vec_b: Vector3) -> bool:
|
||||
return vec_a.x < vec_b.x and vec_a.y < vec_b.y and vec_a.z < vec_b.z
|
224
scenes/player/placeholder.tscn
Normal file
224
scenes/player/placeholder.tscn
Normal file
@ -0,0 +1,224 @@
|
||||
[gd_scene load_steps=15 format=3 uid="uid://bmm3brgvr4d86"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/player/player_input_controller.gd" id="1_m6tul"]
|
||||
[ext_resource type="Script" path="res://scenes/player/placeholder.gd" id="1_ts455"]
|
||||
[ext_resource type="Texture2D" uid="uid://oopj5mj1vdp0" path="res://assets/crosshairs/crosshair_default.png" id="3_8ulsx"]
|
||||
[ext_resource type="Script" path="res://scenes/player/server_player_controller.gd" id="3_f1bhn"]
|
||||
[ext_resource type="PackedScene" uid="uid://dtvo21mk1webd" path="res://scenes/weapon/guns/ak/with_hands.tscn" id="3_xxv4y"]
|
||||
[ext_resource type="PackedScene" uid="uid://1txob6jskn5s" path="res://scenes/characters/blue/dummy.tscn" id="6_e3cnh"]
|
||||
|
||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_taqso"]
|
||||
radius = 0.4
|
||||
height = 1.6
|
||||
|
||||
[sub_resource type="LabelSettings" id="LabelSettings_3bk8i"]
|
||||
font_size = 70
|
||||
|
||||
[sub_resource type="LabelSettings" id="LabelSettings_adbcb"]
|
||||
font_size = 100
|
||||
font_color = Color(0.756874, 0, 0.223924, 1)
|
||||
|
||||
[sub_resource type="Animation" id="Animation_falg4"]
|
||||
length = 0.001
|
||||
tracks/0/type = "value"
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/path = NodePath(".:position")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/keys = {
|
||||
"times": PackedFloat32Array(0.125),
|
||||
"transitions": PackedFloat32Array(1),
|
||||
"update": 0,
|
||||
"values": [Vector3(0, 0, 0)]
|
||||
}
|
||||
|
||||
[sub_resource type="Animation" id="Animation_mkk0p"]
|
||||
resource_name = "move"
|
||||
length = 0.5
|
||||
loop_mode = 2
|
||||
tracks/0/type = "value"
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/path = NodePath(".:position")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/keys = {
|
||||
"times": PackedFloat32Array(0, 0.125, 0.25, 0.375, 0.5),
|
||||
"transitions": PackedFloat32Array(1, 2, 1, 2, 1),
|
||||
"update": 0,
|
||||
"values": [Vector3(0, 0, 0), Vector3(-0.1, 0.1, -0.1), Vector3(0, 0, 0), Vector3(-0.1, 0.1, -0.1), Vector3(0, 0, 0)]
|
||||
}
|
||||
|
||||
[sub_resource type="Animation" id="Animation_ah507"]
|
||||
resource_name = "shooting"
|
||||
length = 0.2
|
||||
loop_mode = 1
|
||||
step = 0.1
|
||||
tracks/0/type = "value"
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/path = NodePath(".:position")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/keys = {
|
||||
"times": PackedFloat32Array(0, 0.1, 0.2),
|
||||
"transitions": PackedFloat32Array(1, 0.233258, 8.57419),
|
||||
"update": 0,
|
||||
"values": [Vector3(0, 0, 0), Vector3(0, -0.01, -0.01), Vector3(0, 0, 0)]
|
||||
}
|
||||
|
||||
[sub_resource type="AnimationLibrary" id="AnimationLibrary_u1b6p"]
|
||||
_data = {
|
||||
"RESET": SubResource("Animation_falg4"),
|
||||
"move": SubResource("Animation_mkk0p"),
|
||||
"shooting": SubResource("Animation_ah507")
|
||||
}
|
||||
|
||||
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_7vlrn"]
|
||||
properties/0/path = NodePath("ServerControlledNode:position")
|
||||
properties/0/spawn = true
|
||||
properties/0/replication_mode = 1
|
||||
properties/1/path = NodePath(".:owner_id")
|
||||
properties/1/spawn = true
|
||||
properties/1/replication_mode = 2
|
||||
properties/2/path = NodePath("ServerControlledNode:rotation")
|
||||
properties/2/spawn = true
|
||||
properties/2/replication_mode = 1
|
||||
properties/3/path = NodePath(".:initial_position")
|
||||
properties/3/spawn = true
|
||||
properties/3/replication_mode = 2
|
||||
|
||||
[node name="Placeholder" type="Node3D"]
|
||||
script = ExtResource("1_ts455")
|
||||
|
||||
[node name="PlayerControlledNode" type="CharacterBody3D" parent="."]
|
||||
collision_layer = 2
|
||||
script = ExtResource("1_m6tul")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="PlayerControlledNode"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.786919, 0)
|
||||
shape = SubResource("CapsuleShape3D_taqso")
|
||||
|
||||
[node name="CameraMount" type="Node3D" parent="PlayerControlledNode"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.29568, -0.412934)
|
||||
|
||||
[node name="Camera3D" type="Camera3D" parent="PlayerControlledNode/CameraMount"]
|
||||
cull_mask = 524287
|
||||
|
||||
[node name="HUD" type="Control" parent="PlayerControlledNode/CameraMount/Camera3D"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
offset_left = 8.0
|
||||
offset_right = 8.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
mouse_filter = 2
|
||||
|
||||
[node name="TextureRect" type="TextureRect" parent="PlayerControlledNode/CameraMount/Camera3D/HUD"]
|
||||
layout_mode = 1
|
||||
anchors_preset = 8
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
offset_left = -36.0
|
||||
offset_top = -36.0
|
||||
offset_right = 36.0
|
||||
offset_bottom = 36.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
texture = ExtResource("3_8ulsx")
|
||||
|
||||
[node name="HealthIndicator" type="Label" parent="PlayerControlledNode/CameraMount/Camera3D/HUD"]
|
||||
layout_mode = 1
|
||||
anchors_preset = 2
|
||||
anchor_top = 1.0
|
||||
anchor_bottom = 1.0
|
||||
offset_top = -23.0
|
||||
offset_right = 40.0
|
||||
grow_vertical = 0
|
||||
text = "100"
|
||||
label_settings = SubResource("LabelSettings_3bk8i")
|
||||
|
||||
[node name="FPS" type="Label" parent="PlayerControlledNode/CameraMount/Camera3D/HUD" groups=["player_placeholder"]]
|
||||
layout_mode = 1
|
||||
offset_right = 40.0
|
||||
offset_bottom = 23.0
|
||||
text = "0"
|
||||
label_settings = SubResource("LabelSettings_adbcb")
|
||||
|
||||
[node name="SubViewportContainer" type="SubViewportContainer" parent="PlayerControlledNode/CameraMount/Camera3D/HUD"]
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
stretch = true
|
||||
|
||||
[node name="SubViewport" type="SubViewport" parent="PlayerControlledNode/CameraMount/Camera3D/HUD/SubViewportContainer"]
|
||||
transparent_bg = true
|
||||
handle_input_locally = false
|
||||
msaa_2d = 1
|
||||
msaa_3d = 1
|
||||
canvas_cull_mask = 4294443008
|
||||
size = Vector2i(1920, 1964)
|
||||
render_target_update_mode = 4
|
||||
|
||||
[node name="Camera3D" type="Camera3D" parent="PlayerControlledNode/CameraMount/Camera3D/HUD/SubViewportContainer/SubViewport"]
|
||||
cull_mask = 524288
|
||||
fov = 40.0
|
||||
|
||||
[node name="GunMount" type="Node3D" parent="PlayerControlledNode/CameraMount/Camera3D/HUD/SubViewportContainer/SubViewport/Camera3D"]
|
||||
|
||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="PlayerControlledNode/CameraMount/Camera3D/HUD/SubViewportContainer/SubViewport/Camera3D/GunMount"]
|
||||
active = false
|
||||
libraries = {
|
||||
"": SubResource("AnimationLibrary_u1b6p")
|
||||
}
|
||||
|
||||
[node name="WithHands" parent="PlayerControlledNode/CameraMount/Camera3D/HUD/SubViewportContainer/SubViewport/Camera3D/GunMount" instance=ExtResource("3_xxv4y")]
|
||||
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0.51335, -0.655058, -1.67097)
|
||||
visible = false
|
||||
|
||||
[node name="BulletStartingPoint" type="Node3D" parent="PlayerControlledNode/CameraMount"]
|
||||
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, -0.42185)
|
||||
|
||||
[node name="AimRay" type="RayCast3D" parent="PlayerControlledNode/CameraMount/BulletStartingPoint"]
|
||||
target_position = Vector3(0, 0, 1000)
|
||||
hit_from_inside = true
|
||||
collide_with_areas = true
|
||||
|
||||
[node name="Node3D" type="Node3D" parent="PlayerControlledNode"]
|
||||
|
||||
[node name="ServerControlledNodeBak" type="CharacterBody3D" parent="."]
|
||||
collision_layer = 4
|
||||
script = ExtResource("3_f1bhn")
|
||||
|
||||
[node name="Dummy" parent="ServerControlledNodeBak" instance=ExtResource("6_e3cnh")]
|
||||
visible = false
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="ServerControlledNodeBak"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.57384, 0)
|
||||
shape = SubResource("CapsuleShape3D_taqso")
|
||||
|
||||
[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="."]
|
||||
replication_config = SubResource("SceneReplicationConfig_7vlrn")
|
||||
|
||||
[node name="Timer" type="Timer" parent="."]
|
||||
wait_time = 0.1
|
||||
|
||||
[node name="ServerControlledNode" type="PlayerServerNode" parent="."]
|
||||
collision_layer = 4
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="ServerControlledNode"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.786919, 0)
|
||||
shape = SubResource("CapsuleShape3D_taqso")
|
||||
|
||||
[node name="CSGBox3D" type="CSGBox3D" parent="ServerControlledNode"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.47058, 0)
|
||||
|
||||
[connection signal="timeout" from="Timer" to="." method="_on_timer_timeout"]
|
146
scenes/player/player_input_controller.gd
Normal file
146
scenes/player/player_input_controller.gd
Normal file
@ -0,0 +1,146 @@
|
||||
# ---------------------------------------------------------------------
|
||||
# ---------------------------------------------------------------------
|
||||
# This script is supposed to control the node that is rendered on the
|
||||
# client side, and send the changes to the server node
|
||||
# ---------------------------------------------------------------------
|
||||
|
||||
extends CharacterBody3D
|
||||
|
||||
@export var jumping := false
|
||||
@export var input_direction := Vector2()
|
||||
|
||||
@onready var camera_mount = $CameraMount
|
||||
@onready var camera = $CameraMount/Camera3D
|
||||
@onready var placeholder: Node3D = $'..'
|
||||
var paused := false
|
||||
const JUMP_VELOCITY = 4.5
|
||||
|
||||
|
||||
#func _ready() -> void:
|
||||
var current_gun: String = "ak"
|
||||
@onready var gun_mount: Node3D = $CameraMount/Camera3D/HUD/SubViewportContainer/SubViewport/Camera3D/GunMount
|
||||
@onready var gun_mount_anim: AnimationPlayer = $CameraMount/Camera3D/HUD/SubViewportContainer/SubViewport/Camera3D/GunMount/AnimationPlayer
|
||||
var gun_with_hands: Node3D = null
|
||||
@onready var bullet_starting_point: Node3D = $CameraMount/BulletStartingPoint
|
||||
@onready var aim_ray: RayCast3D = $CameraMount/BulletStartingPoint/AimRay
|
||||
@onready var gun_camera: Camera3D = $CameraMount/Camera3D/HUD/SubViewportContainer/SubViewport/Camera3D
|
||||
var current_weapon_damage: int
|
||||
var current_weapon_bullet_speed: int
|
||||
var current_weapon_cooldown_interwal: float
|
||||
var look_dir: Vector2
|
||||
func _ready() -> void:
|
||||
global_position = $"..".initial_position
|
||||
# -- TODO: It should not be hardcoded
|
||||
# Define a format string with placeholder '%s'
|
||||
var path_tmpl := "res://scenes/weapon/guns/%s/with_hands.tscn"
|
||||
var path := path_tmpl % current_gun
|
||||
var scene: PackedScene = ResourceLoader.load(path)
|
||||
var node: Node3D = scene.instantiate()
|
||||
node.scale = Vector3(0.5,0.5,0.5)
|
||||
node.position = Vector3(0.5, -0.5, -1.5)
|
||||
current_weapon_bullet_speed = node.bullet_speed
|
||||
current_weapon_cooldown_interwal = node.cooldown
|
||||
current_weapon_damage = node.damage
|
||||
gun_with_hands = node
|
||||
gun_mount.add_child(node)
|
||||
|
||||
func _input(event):
|
||||
if multiplayer.get_unique_id() == get_multiplayer_authority():
|
||||
if Input.is_action_just_pressed("jump"): jumping = true
|
||||
|
||||
if event is InputEventMouseMotion and Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
|
||||
look_dir = event.relative * 1
|
||||
rotation.y -= look_dir.x * camera_sens * 1.0
|
||||
camera_mount.rotation.x = clamp(camera_mount.rotation.x - look_dir.y * camera_sens * 1.0, -1.5, 1.5)
|
||||
server_node.set_rotation_y.rpc_id(1, rotation.y)
|
||||
server_node.set_rotation_x.rpc_id(1, rotation.x)
|
||||
#server_node.set_input_direction.rpc_id(1, rotation.x, rotation.y)
|
||||
|
||||
@onready var server_node: PlayerServerNode = $"../ServerControlledNode"
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _physics_process(delta: float) -> void:
|
||||
if multiplayer.get_unique_id() == get_multiplayer_authority():
|
||||
if !paused:
|
||||
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
|
||||
input_direction = Input.get_vector("move_left", "move_right", "move_forward", "move_backwards")
|
||||
server_node.set_input_direction.rpc_id(1, input_direction)
|
||||
if Input.is_action_just_pressed("jump"):
|
||||
server_node.jump.rpc_id(1)
|
||||
if Input.is_action_pressed("shot"): _shoot()
|
||||
if multiplayer.get_unique_id() == get_multiplayer_authority():
|
||||
if not is_on_floor():
|
||||
velocity += get_gravity() * delta
|
||||
if is_on_floor() && jumping:
|
||||
velocity.y = JUMP_VELOCITY
|
||||
jumping = false
|
||||
var direction := (transform.basis * Vector3(input_direction.x, 0, input_direction.y)).normalized()
|
||||
if is_on_floor():
|
||||
if direction:
|
||||
#first_view_legs_anim.play("Run Forward")
|
||||
gun_mount_anim.play("move")
|
||||
velocity.x = direction.x * placeholder.character_speed
|
||||
velocity.z = direction.z * placeholder.character_speed
|
||||
else:
|
||||
velocity.x = move_toward(velocity.x, 0, placeholder.character_speed)
|
||||
velocity.z = move_toward(velocity.z, 0, placeholder.character_speed)
|
||||
func _process(delta: float) -> void:
|
||||
move_and_slide()
|
||||
|
||||
|
||||
var cant_shoot: bool = false
|
||||
func _shoot():
|
||||
if not cant_shoot:
|
||||
gun_with_hands.shoot()
|
||||
cant_shoot = true
|
||||
await get_tree().create_timer(current_weapon_cooldown_interwal).timeout
|
||||
cant_shoot = false
|
||||
|
||||
#func _physics_process(delta: float) -> void:
|
||||
#if multiplayer.get_unique_id() == get_multiplayer_authority():
|
||||
#if not is_on_floor():
|
||||
#velocity += get_gravity() * delta
|
||||
#if is_on_floor() && jumping:
|
||||
#velocity.y = JUMP_VELOCITY
|
||||
#jumping = false
|
||||
#var direction := (transform.basis * Vector3(input_direction.x, 0, input_direction.y)).normalized()
|
||||
#if is_on_floor():
|
||||
#if direction:
|
||||
#velocity.x = direction.x * placeholder.character_speed
|
||||
#velocity.z = direction.z * placeholder.character_speed
|
||||
#else:
|
||||
#velocity.x = move_toward(velocity.x, 0, placeholder.character_speed)
|
||||
#velocity.z = move_toward(velocity.z, 0, placeholder.character_speed)
|
||||
#move_and_slide()
|
||||
var first_view_legs_anim: AnimationPlayer = null
|
||||
func _add_legs_to_first_view() -> Error :
|
||||
# -- TODO: It should not be hardcoded
|
||||
var path := "res://scenes/characters/blue/dummy.tscn"
|
||||
if not ResourceLoader.exists(path):
|
||||
return ERR_DOES_NOT_EXIST
|
||||
var scene: PackedScene = ResourceLoader.load(path)
|
||||
if not scene.can_instantiate():
|
||||
return ERR_CANT_OPEN
|
||||
var node: Node3D = scene.instantiate()
|
||||
var skeleton: Skeleton3D = node.find_child("Skeleton3D")
|
||||
var bone := skeleton.find_bone("mixamorig_Spine")
|
||||
if bone != -1:
|
||||
skeleton.set_bone_pose_scale(bone, Vector3(0, 0, 0))
|
||||
add_child(node)
|
||||
var animation_node: AnimationPlayer = node.find_child("AnimationPlayer")
|
||||
if animation_node != null:
|
||||
first_view_legs_anim = animation_node
|
||||
return OK
|
||||
|
||||
var camera_sens: float = 0.002
|
||||
|
||||
@rpc("authority", "reliable")
|
||||
func set_current_rotation(rotation: Vector3):
|
||||
rotation = rotation
|
||||
|
||||
@rpc("any_peer", "reliable")
|
||||
func set_current_position(x: float, y: float, z: float):
|
||||
global_position = Vector3(x, y ,z)
|
||||
|
||||
@rpc("any_peer", "call_local", "reliable")
|
||||
func jump():
|
||||
jumping = true
|
48
scenes/player/server_player_controller.gd
Normal file
48
scenes/player/server_player_controller.gd
Normal file
@ -0,0 +1,48 @@
|
||||
class_name ServerControlledPlayer
|
||||
extends CharacterBody3D
|
||||
const JUMP_VELOCITY = 4.5
|
||||
|
||||
func _ready() -> void:
|
||||
pass
|
||||
|
||||
@export_category("ServerControlledPlayer")
|
||||
@onready var placeholder: Node3D = $'..'
|
||||
|
||||
var input_direction := Vector2()
|
||||
var input_rotation_y
|
||||
|
||||
@rpc("call_local", "any_peer", "unreliable_ordered")
|
||||
func set_input_direction(new_input_direction: Vector2):
|
||||
input_direction = new_input_direction
|
||||
|
||||
@rpc("call_local", "any_peer", "unreliable_ordered")
|
||||
func set_rotation_y(new_rotation_y: float):
|
||||
rotation.y = new_rotation_y
|
||||
|
||||
@rpc("call_local", "any_peer", "unreliable_ordered")
|
||||
func set_rotation_x(new_rotation_x: float):
|
||||
rotation.x = new_rotation_x
|
||||
|
||||
@rpc("call_local", "any_peer", "unreliable_ordered")
|
||||
func jump():
|
||||
jumping = true
|
||||
|
||||
var jumping := false
|
||||
func _process(delta: float) -> void:
|
||||
if not is_on_floor():
|
||||
velocity += get_gravity() * delta
|
||||
if is_on_floor() && jumping:
|
||||
velocity.y = JUMP_VELOCITY
|
||||
jumping = false
|
||||
if is_on_floor():
|
||||
var direction := (transform.basis * Vector3(input_direction.x, 0, input_direction.y)).normalized()
|
||||
#if is_on_floor():
|
||||
if direction:
|
||||
velocity.x = direction.x * placeholder.character_speed
|
||||
velocity.z = direction.z * placeholder.character_speed
|
||||
else:
|
||||
velocity.x = move_toward(velocity.x, 0, placeholder.character_speed)
|
||||
velocity.z = move_toward(velocity.z, 0, placeholder.character_speed)
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
move_and_slide()
|
@ -60,7 +60,6 @@ func remove_multiplayer_peer():
|
||||
func load_game():
|
||||
var chosen_map_index = $Maps.get_selected_items()[0]
|
||||
var chosen_map = $Maps.get_item_text(chosen_map_index)
|
||||
print(chosen_map)
|
||||
var path_tmpl := "res://scenes/maps/maps/%s"
|
||||
var path := path_tmpl % chosen_map
|
||||
get_tree().change_scene_to_file(path)
|
||||
|
@ -4,14 +4,24 @@ var player_manager: PlayerManager = PlayerManager.new()
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
var map_dir := DirAccess.open("res://scenes/maps/maps/")
|
||||
|
||||
if map_dir:
|
||||
map_dir.list_dir_begin()
|
||||
var file_name = map_dir.get_next()
|
||||
while file_name != "":
|
||||
$UI/CreateServer/Maps.add_item(file_name)
|
||||
file_name = map_dir.get_next()
|
||||
if OS.has_feature("dedicated_server"):
|
||||
var chosen_map = "lowpoly_tdm_2.tscn"
|
||||
var path_tmpl := "res://scenes/maps/maps/%s"
|
||||
var path := path_tmpl % chosen_map
|
||||
GameServerManager.current_map = path
|
||||
var err := GameServerManager.create_server(player_manager)
|
||||
if err != OK:
|
||||
push_error("couldn't create a server")
|
||||
change_level.call_deferred(path)
|
||||
print(get_tree().get_root())
|
||||
else:
|
||||
var map_dir := DirAccess.open("res://scenes/maps/maps/")
|
||||
if map_dir:
|
||||
map_dir.list_dir_begin()
|
||||
var file_name = map_dir.get_next()
|
||||
while file_name != "":
|
||||
$UI/CreateServer/Maps.add_item(file_name)
|
||||
file_name = map_dir.get_next()
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(delta: float) -> void:
|
||||
@ -34,20 +44,28 @@ func _on_create_button_pressed() -> void:
|
||||
GameServerManager.current_map = path
|
||||
var err := GameServerManager.create_server(player_manager)
|
||||
if err != OK:
|
||||
print("couldn't create a server")
|
||||
push_error("couldn't create a server")
|
||||
$UI.hide()
|
||||
change_level.call_deferred(load(path))
|
||||
change_level.call_deferred(path)
|
||||
|
||||
# Call this function deferred and only on the main authority (server).
|
||||
func change_level(scene: PackedScene):
|
||||
|
||||
func change_level(path: String):
|
||||
# Remove old level if any.
|
||||
var level = $LevelLoader/CurrentLevel
|
||||
print("cleaning up the mount node")
|
||||
for c in level.get_children():
|
||||
level.remove_child(c)
|
||||
c.queue_free()
|
||||
# Add new level.
|
||||
level.add_child(scene.instantiate())
|
||||
if not ResourceLoader.exists(path):
|
||||
print(ERR_DOES_NOT_EXIST)
|
||||
var scene: PackedScene = ResourceLoader.load(path)
|
||||
if scene.can_instantiate():
|
||||
var node: Node3D = scene.instantiate()
|
||||
print("loading map: " + node.name)
|
||||
level.add_child(node)
|
||||
else:
|
||||
print("Can't initialize")
|
||||
|
||||
|
||||
func _on_text_edit_text_changed() -> void:
|
||||
|
@ -30,7 +30,6 @@ func _process(delta):
|
||||
rigid_body_3d.visible = false
|
||||
particles.emitting = true
|
||||
#if ray.get_collider().is_in_group("body"):
|
||||
#print("head")
|
||||
await get_tree().create_timer(1.0).timeout
|
||||
queue_free()
|
||||
|
||||
|
@ -11,6 +11,7 @@ emission_energy_multiplier = 16.0
|
||||
distance_fade_min_distance = 2.0
|
||||
|
||||
[node name="BulletTrailGeneric" type="MeshInstance3D"]
|
||||
layers = 524288
|
||||
material_override = SubResource("StandardMaterial3D_ybqvs")
|
||||
visibility_range_end = 1891.27
|
||||
script = ExtResource("1_k8eg1")
|
||||
|
Reference in New Issue
Block a user