Add a world model and refactor the controller
This commit is contained in:
parent
51842836ce
commit
1f1f2918c9
@ -22,7 +22,7 @@ GameServerManager="*res://scripts/game_server_manager.gd"
|
||||
[display]
|
||||
|
||||
window/size/viewport_width=1920
|
||||
window/size/viewport_height=1080
|
||||
window/size/viewport_height=1964
|
||||
window/size/mode=4
|
||||
window/size/borderless=true
|
||||
|
||||
@ -86,3 +86,8 @@ crouch={
|
||||
[physics]
|
||||
|
||||
3d/default_gravity=15.0
|
||||
|
||||
[rendering]
|
||||
|
||||
anti_aliasing/quality/msaa_3d=1
|
||||
anti_aliasing/quality/screen_space_aa=1
|
||||
|
@ -1,8 +1,4 @@
|
||||
[gd_scene load_steps=10 format=4 uid="uid://1txob6jskn5s"]
|
||||
|
||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_e8avt"]
|
||||
radius = 0.252578
|
||||
height = 1.8094
|
||||
[gd_scene load_steps=9 format=4 uid="uid://1txob6jskn5s"]
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_gqjtb"]
|
||||
resource_name = "Alpha_Joints_MAT"
|
||||
@ -864,19 +860,14 @@ _data = {
|
||||
}
|
||||
|
||||
[node name="Dummy" type="Node3D"]
|
||||
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, 0)
|
||||
|
||||
[node name="CharacterBody3D" type="CharacterBody3D" parent="."]
|
||||
[node name="Body" type="Node3D" parent="."]
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="CharacterBody3D"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.897246, 0)
|
||||
shape = SubResource("CapsuleShape3D_e8avt")
|
||||
[node name="Armature" type="Node3D" parent="Body"]
|
||||
transform = Transform3D(0.01, 0, 0, 0, -4.37114e-10, -0.01, 0, 0.01, -4.37114e-10, 0, 0, 0)
|
||||
|
||||
[node name="Body" type="Node3D" parent="CharacterBody3D"]
|
||||
|
||||
[node name="Armature" type="Node3D" parent="CharacterBody3D/Body"]
|
||||
transform = Transform3D(0.01, 0, 0, 0, 0, -0.01, 0, 0.01, 0, 0, 0, 0)
|
||||
|
||||
[node name="Skeleton3D" type="Skeleton3D" parent="CharacterBody3D/Body/Armature"]
|
||||
[node name="Skeleton3D" type="Skeleton3D" parent="Body/Armature"]
|
||||
bones/0/name = "mixamorig_Hips"
|
||||
bones/0/parent = -1
|
||||
bones/0/rest = Transform3D(1, -8.78096e-05, -2.78699e-06, 2.78699e-06, 0, 1, -8.78096e-05, -1, 0, -6.75701e-06, 4.84474e-05, -99.7919)
|
||||
@ -1333,16 +1324,16 @@ bones/64/position = Vector3(-8.19564e-08, 10, 5.51343e-07)
|
||||
bones/64/rotation = Quaternion(-8.44739e-09, 1.30531e-08, -2.55386e-09, 1)
|
||||
bones/64/scale = Vector3(1, 1, 1)
|
||||
|
||||
[node name="Alpha_Joints" type="MeshInstance3D" parent="CharacterBody3D/Body/Armature/Skeleton3D"]
|
||||
[node name="Alpha_Joints" type="MeshInstance3D" parent="Body/Armature/Skeleton3D"]
|
||||
mesh = SubResource("ArrayMesh_kiui0")
|
||||
skin = SubResource("Skin_hwx5g")
|
||||
|
||||
[node name="Alpha_Surface" type="MeshInstance3D" parent="CharacterBody3D/Body/Armature/Skeleton3D"]
|
||||
[node name="Alpha_Surface" type="MeshInstance3D" parent="Body/Armature/Skeleton3D"]
|
||||
mesh = SubResource("ArrayMesh_8h4ki")
|
||||
skin = SubResource("Skin_hwx5g")
|
||||
surface_material_override/0 = SubResource("StandardMaterial3D_j3emx")
|
||||
|
||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="CharacterBody3D/Body"]
|
||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="Body"]
|
||||
libraries = {
|
||||
"": SubResource("AnimationLibrary_dbxeu")
|
||||
}
|
||||
|
1187
scenes/characters/first_person_view.tscn
Normal file
1187
scenes/characters/first_person_view.tscn
Normal file
File diff suppressed because one or more lines are too long
39
scenes/characters/placeholder.tscn
Normal file
39
scenes/characters/placeholder.tscn
Normal file
@ -0,0 +1,39 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://b10lpwfjgxds4"]
|
||||
|
||||
[ext_resource type="Script" path="res://scripts/player/player_input_contrller.gd" id="1_q75ai"]
|
||||
|
||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_jc50w"]
|
||||
radius = 0.3
|
||||
height = 1.6
|
||||
|
||||
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_tl74a"]
|
||||
properties/0/path = NodePath(".:position")
|
||||
properties/0/spawn = true
|
||||
properties/0/replication_mode = 1
|
||||
properties/1/path = NodePath(".:rotation")
|
||||
properties/1/spawn = true
|
||||
properties/1/replication_mode = 1
|
||||
|
||||
[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")
|
||||
|
||||
[node name="Collision" type="CollisionShape3D" parent="."]
|
||||
shape = SubResource("CapsuleShape3D_jc50w")
|
||||
|
||||
[node name="PlayerSynchronizer" type="MultiplayerSynchronizer" parent="."]
|
||||
replication_config = SubResource("SceneReplicationConfig_tl74a")
|
||||
|
||||
[node name="FirstPersonCameraMount" type="Node3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.609154, 0)
|
||||
|
||||
[node name="Camera" type="Camera3D" parent="FirstPersonCameraMount"]
|
||||
fov = 40.0
|
||||
|
||||
[node name="BulletStartingPoint" type="Node3D" parent="FirstPersonCameraMount"]
|
||||
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, -0.343115)
|
||||
|
||||
[node name="ModelMount" type="Node3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.790262, 0)
|
@ -1049,7 +1049,7 @@ bones/24/name = "mixamorig_LeftHandRing2"
|
||||
bones/24/parent = 23
|
||||
bones/24/rest = Transform3D(1, 1.61871e-05, -9.45085e-08, -1.61871e-05, 1, 3.29224e-06, 9.45618e-08, -3.29224e-06, 1, 6.3543e-07, 3.60118, -1.47875e-05)
|
||||
bones/24/enabled = true
|
||||
bones/24/position = Vector3(-3.30613e-06, 3.60119, 1.50863e-07)
|
||||
bones/24/position = Vector3(-3.30613e-06, 3.60119, 1.50864e-07)
|
||||
bones/24/rotation = Quaternion(0.563924, -3.30111e-07, -0.0577891, 0.823803)
|
||||
bones/24/scale = Vector3(1, 1, 1)
|
||||
bones/25/name = "mixamorig_LeftHandRing3"
|
||||
@ -1078,7 +1078,7 @@ bones/28/parent = 27
|
||||
bones/28/rest = Transform3D(1, 0.000736602, -7.57697e-07, -0.000736602, 1, 9.24707e-06, 7.64508e-07, -9.24651e-06, 1, 1.0844e-06, 4.13666, 1.41886e-05)
|
||||
bones/28/enabled = true
|
||||
bones/28/position = Vector3(-9.08385e-06, 4.13665, 5.47372e-06)
|
||||
bones/28/rotation = Quaternion(0.433129, -6.53828e-07, -0.0443853, 0.900239)
|
||||
bones/28/rotation = Quaternion(0.433129, -6.53827e-07, -0.0443853, 0.900239)
|
||||
bones/28/scale = Vector3(1, 1, 1)
|
||||
bones/29/name = "mixamorig_LeftHandPinky3"
|
||||
bones/29/parent = 28
|
||||
@ -1127,7 +1127,7 @@ bones/35/parent = 34
|
||||
bones/35/rest = Transform3D(0.894428, 0.447212, -8.12113e-07, -0.387297, 0.774597, -0.500001, -0.223606, 0.447215, 0.866025, 3.00297, 3.7888, 2.16716)
|
||||
bones/35/enabled = true
|
||||
bones/35/position = Vector3(3.00297, 3.7888, 2.16716)
|
||||
bones/35/rotation = Quaternion(0.227577, -0.0598799, -0.162411, 0.958252)
|
||||
bones/35/rotation = Quaternion(0.227577, -0.0598799, -0.162411, 0.958251)
|
||||
bones/35/scale = Vector3(1, 1, 1)
|
||||
bones/36/name = "mixamorig_RightHandThumb2"
|
||||
bones/36/parent = 35
|
||||
@ -1211,14 +1211,14 @@ bones/47/parent = 34
|
||||
bones/47/rest = Transform3D(1, 9.66599e-06, -1.40744e-07, -9.66599e-06, 1, -2.81994e-06, 1.40717e-07, 2.81994e-06, 1, -2.21663, 12.147, -0.00999829)
|
||||
bones/47/enabled = true
|
||||
bones/47/position = Vector3(-2.21664, 12.147, -0.00998812)
|
||||
bones/47/rotation = Quaternion(0.0911117, 0.11369, 0.100504, 0.984211)
|
||||
bones/47/rotation = Quaternion(0.0911117, 0.11369, 0.100504, 0.984212)
|
||||
bones/47/scale = Vector3(1, 1, 1)
|
||||
bones/48/name = "mixamorig_RightHandRing2"
|
||||
bones/48/parent = 47
|
||||
bones/48/rest = Transform3D(1, -1.60845e-05, 3.26056e-09, 1.60845e-05, 1, 1.32059e-06, -3.2818e-09, -1.32059e-06, 1, -2.50026e-07, 3.6012, -7.75122e-07)
|
||||
bones/48/enabled = true
|
||||
bones/48/position = Vector3(-2.50026e-07, 3.6012, -7.75122e-07)
|
||||
bones/48/rotation = Quaternion(0.836665, 8.70473e-07, 0.068157, 0.543457)
|
||||
bones/48/rotation = Quaternion(0.836665, 8.70474e-07, 0.068157, 0.543457)
|
||||
bones/48/scale = Vector3(1, 1, 1)
|
||||
bones/49/name = "mixamorig_RightHandRing3"
|
||||
bones/49/parent = 48
|
||||
@ -1302,14 +1302,14 @@ bones/60/parent = 0
|
||||
bones/60/rest = Transform3D(-0.999981, -0.00611455, -7.52684e-05, 0.00611501, -0.999901, -0.0126672, 2.1931e-06, -0.0126674, 0.99992, -9.12503, -6.6556, -0.0553527)
|
||||
bones/60/enabled = true
|
||||
bones/60/position = Vector3(-9.12503, -6.6556, -0.0553527)
|
||||
bones/60/rotation = Quaternion(-0.0339456, 0.334676, 0.92684, -0.166754)
|
||||
bones/60/rotation = Quaternion(-0.0339455, 0.334676, 0.92684, -0.166754)
|
||||
bones/60/scale = Vector3(1, 1, 1)
|
||||
bones/61/name = "mixamorig_RightLeg"
|
||||
bones/61/parent = 60
|
||||
bones/61/rest = Transform3D(0.99993, -0.0118315, -0.000580536, 0.0118448, 0.999271, 0.0362854, 0.000150802, -0.0362897, 0.999341, 3.28565e-07, 40.5995, 1.49012e-08)
|
||||
bones/61/enabled = true
|
||||
bones/61/position = Vector3(3.28565e-07, 40.5995, 1.49012e-08)
|
||||
bones/61/rotation = Quaternion(-0.581827, -0.0846291, -0.0166473, 0.808727)
|
||||
bones/61/rotation = Quaternion(-0.581827, -0.0846291, -0.0166473, 0.808726)
|
||||
bones/61/scale = Vector3(1, 1, 1)
|
||||
bones/62/name = "mixamorig_RightFoot"
|
||||
bones/62/parent = 61
|
||||
|
@ -7,6 +7,7 @@ var player_side: String
|
||||
@onready var spawns = $Spawns
|
||||
@onready var root = $'.'
|
||||
@onready var players = $Players
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
var char : Node3D = null
|
||||
@ -14,25 +15,17 @@ func _ready() -> void:
|
||||
var position := red_spawn.global_position
|
||||
if multiplayer.is_server():
|
||||
for i in GameServerManager.players:
|
||||
char = ResourceLoader.load("res://scenes/utils/character.tscn").instantiate()
|
||||
char = ResourceLoader.load("res://scenes/characters/placeholder.tscn").instantiate()
|
||||
char.name = str(GameServerManager.players[i].name)
|
||||
char.global_position = position
|
||||
var my_random_number = RandomNumberGenerator.new().randf_range(-2.0, 2.0)
|
||||
var my_random_number = RandomNumberGenerator.new().randf_range(0.0, 5.0)
|
||||
char.global_position = position
|
||||
char.global_position.x += my_random_number
|
||||
char.global_position.y += 300 + my_random_number
|
||||
char.global_position.z += my_random_number
|
||||
$MultiplayerSpawner.spawn(char)
|
||||
players.add_child(char)
|
||||
|
||||
func spawn_player(id: int):
|
||||
var red_spawn: Node3D = $Spawns/Blue/SpawnArea
|
||||
var position := red_spawn.global_position
|
||||
var char = ResourceLoader.load("res://scenes/utils/character.tscn").instantiate()
|
||||
char.name = str(GameServerManager.players[id].name)
|
||||
char.global_position = position
|
||||
var my_random_number = RandomNumberGenerator.new().randf_range(-2.0, 2.0)
|
||||
char.global_position = position
|
||||
char.global_position.x += my_random_number
|
||||
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(delta: float) -> void:
|
||||
|
@ -26,8 +26,9 @@ transform = Transform3D(5.70162, 0, 0, 0, 1, 0, 0, 0, 7.97817, 21.2099, 1.78438,
|
||||
size = Vector3(0.484497, 1, 5.99213)
|
||||
|
||||
[node name="MultiplayerSpawner" type="MultiplayerSpawner" parent="."]
|
||||
_spawnable_scenes = PackedStringArray("res://scenes/utils/character.tscn")
|
||||
_spawnable_scenes = PackedStringArray("res://scenes/characters/placeholder.tscn")
|
||||
spawn_path = NodePath("../Players")
|
||||
spawn_limit = 4
|
||||
|
||||
[node name="Players" type="Node3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.72051, 0)
|
||||
|
14
scenes/test/first_person_camera.tscn
Normal file
14
scenes/test/first_person_camera.tscn
Normal file
@ -0,0 +1,14 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://7ypb23b3pugx"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://drkp6lgdexdwd" path="res://scenes/characters/first_person_view.tscn" id="1_pw4gm"]
|
||||
|
||||
[node name="FirstPersonCamera" type="Node3D"]
|
||||
|
||||
[node name="ViewModelCamera" type="Camera3D" parent="."]
|
||||
transform = Transform3D(0.787899, 0, 0, 0, 0.787899, 0, 0, 0, 0.787899, -0.00122696, 5.96046e-08, -0.00121003)
|
||||
fov = 40.0
|
||||
|
||||
[node name="FirstPersonView" parent="ViewModelCamera" instance=ExtResource("1_pw4gm")]
|
||||
|
||||
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, -0.0288114, 0.999585, 0, -0.999585, -0.0288114, 0, 2.05115, 0)
|
@ -11,11 +11,14 @@ height = 1.8
|
||||
|
||||
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_csl3n"]
|
||||
properties/0/path = NodePath(".:position")
|
||||
properties/0/spawn = true
|
||||
properties/0/spawn = false
|
||||
properties/0/replication_mode = 1
|
||||
properties/1/path = NodePath("CharacterBody3D:position")
|
||||
properties/1/spawn = true
|
||||
properties/1/replication_mode = 1
|
||||
properties/2/path = NodePath("CharacterBody3D:rotation")
|
||||
properties/2/spawn = true
|
||||
properties/2/replication_mode = 1
|
||||
|
||||
[node name="Character" type="Node3D"]
|
||||
|
||||
@ -31,11 +34,12 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.71312, 0)
|
||||
radius = 0.001
|
||||
|
||||
[node name="ViewModelCamera" parent="CharacterBody3D/UpperTorso" instance=ExtResource("4_al83x")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.00122696, 0.093623, -0.463804)
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.00122696, 0.093623, -0.213943)
|
||||
script = ExtResource("4_uwcjh")
|
||||
|
||||
[node name="Pistol" parent="CharacterBody3D/UpperTorso/ViewModelCamera" instance=ExtResource("5_6k7rq")]
|
||||
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, -0.0287516, -0.136104, -0.276055)
|
||||
visible = false
|
||||
script = null
|
||||
|
||||
[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="."]
|
||||
|
@ -1,19 +0,0 @@
|
||||
[gd_scene format=3 uid="uid://cf4pgjll6xhoh"]
|
||||
|
||||
[node name="ChooseSide" type="Control"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="Blue" type="Button" parent="."]
|
||||
layout_mode = 0
|
||||
offset_right = 8.0
|
||||
offset_bottom = 8.0
|
||||
|
||||
[node name="Red" type="Button" parent="Blue"]
|
||||
layout_mode = 0
|
||||
offset_right = 8.0
|
||||
offset_bottom = 8.0
|
@ -13,7 +13,8 @@ func _ready() -> void:
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(delta):
|
||||
position += transform.basis * Vector3(0, 0, SPEED) * delta
|
||||
print("bullet:")
|
||||
position += transform.basis * Vector3(0, 0, SPEED) * delta
|
||||
ray.collision_mask = 1
|
||||
ray.enabled = 1
|
||||
if ray.is_colliding():
|
||||
|
@ -14,6 +14,7 @@ class_name Player extends CharacterBody3D
|
||||
@onready var upper_torso_default_position: Vector3 = upper_torso.position
|
||||
@export var ANIMATION_PLAYER : AnimationPlayer
|
||||
@onready var body: Node3D = $RealBody
|
||||
|
||||
var jumping: bool = false
|
||||
var mouse_captured: bool = false
|
||||
var gravity: float = ProjectSettings.get_setting("physics/3d/default_gravity")
|
||||
@ -32,6 +33,10 @@ var is_crouch: bool = false
|
||||
|
||||
func _ready() -> void:
|
||||
$"../MultiplayerSynchronizer".set_multiplayer_authority(str($"..".name).to_int())
|
||||
# If player is not the current player, we need to add a model
|
||||
if str($"..".name).to_int() != multiplayer.get_unique_id():
|
||||
var dummy = ResourceLoader.load("res://scenes/characters/blue/dummy.tscn").instantiate()
|
||||
add_child(dummy)
|
||||
enable_camera()
|
||||
capture_mouse()
|
||||
#print("I am " + str(multiplayer.get_unique_id()) + "I'm controling " + str($"../MultiplayerSynchronizer".get_multiplayer_authority()))
|
||||
@ -42,7 +47,8 @@ func _unhandled_input(event: InputEvent) -> void:
|
||||
if mouse_captured: _rotate_camera()
|
||||
if Input.is_action_just_pressed("jump"): jumping = true
|
||||
if Input.is_action_just_pressed("exit"): get_tree().quit()
|
||||
if Input.is_action_just_pressed("shot"): $UpperTorso/ViewModelCamera.shot()
|
||||
if str($"..".name).to_int() == multiplayer.get_unique_id():
|
||||
if Input.is_action_just_pressed("shot"): $UpperTorso/ViewModelCamera.shot()
|
||||
if Input.is_action_just_pressed("reload"): $Body/UpperTorso/CameraMount/Camera.reload()
|
||||
if Input.is_action_just_pressed("crouch"): crouch()
|
||||
if Input.is_action_just_released("crouch"): uncrouch()
|
||||
@ -66,8 +72,9 @@ func release_mouse() -> void:
|
||||
mouse_captured = false
|
||||
|
||||
func _rotate_camera(sens_mod: float = 1.0) -> void:
|
||||
character.rotation.y -= look_dir.x * camera_sens * sens_mod
|
||||
camera.rotation.x = clamp(camera.rotation.x - look_dir.y * camera_sens * sens_mod, -1.5, 1.5)
|
||||
if str($"..".name).to_int() == multiplayer.get_unique_id():
|
||||
character.rotation.y -= look_dir.x * camera_sens * sens_mod
|
||||
camera.rotation.x = clamp(camera.rotation.x - look_dir.y * camera_sens * sens_mod, -1.5, 1.5)
|
||||
|
||||
func _handle_joypad_camera_rotation(delta: float, sens_mod: float = 1.0) -> void:
|
||||
var joypad_dir: Vector2 = Input.get_vector("look_left","look_right","look_up","look_down")
|
||||
@ -84,7 +91,7 @@ func _walk(delta: float) -> Vector3:
|
||||
var cur_speed: float
|
||||
if is_crouch:
|
||||
cur_speed = speed / 3
|
||||
#upper_torso.position.y -= 10
|
||||
#upper_torso.position.y -= 10
|
||||
else:
|
||||
cur_speed = speed
|
||||
if Input.is_action_pressed("silent_walk"):
|
||||
|
159
scripts/player/player_input_contrller.gd
Normal file
159
scripts/player/player_input_contrller.gd
Normal file
@ -0,0 +1,159 @@
|
||||
# ---------------------------------------------------------------------
|
||||
# This script is supposed to handle character movement logic
|
||||
# ---------------------------------------------------------------------
|
||||
class_name PlayerInput extends CharacterBody3D
|
||||
|
||||
@export_category("PlayerInput")
|
||||
|
||||
const SPEED = 5.0
|
||||
const JUMP_VELOCITY = 4.5
|
||||
|
||||
var mouse_captured: bool = false
|
||||
|
||||
@onready var player_synchronizer: MultiplayerSynchronizer = $PlayerSynchronizer
|
||||
@onready var first_view_camera_mount: Node3D = $FirstPersonCameraMount
|
||||
@onready var first_view_camera: Camera3D = $FirstPersonCameraMount/Camera
|
||||
@onready var model_mount: Node3D = $ModelMount
|
||||
|
||||
# -- This node is supposed to be spawned per player, and since each
|
||||
# -- player has an id, it is used for giving a node a name. So we can
|
||||
# -- use it here to tell a controlled node from the rest models
|
||||
@onready var owner_id: int = str($".".name).to_int()
|
||||
var multiplayer_id: int = 0
|
||||
|
||||
# -- Character state
|
||||
var alive: bool = true
|
||||
|
||||
func _ready() -> void:
|
||||
player_synchronizer.set_multiplayer_authority(owner_id)
|
||||
multiplayer_id = multiplayer.get_unique_id()
|
||||
# -- Separate logic for player and other models that are controlled
|
||||
# -- by other players on the server
|
||||
# -- TODO: If player is alive, it must not be able to see other
|
||||
# -- cameras, but if player is dead, it must be able to
|
||||
# -- switch between other players
|
||||
if _is_current_player():
|
||||
var err := _add_first_view_model()
|
||||
if err != OK:
|
||||
print("Error occured: " + str(err))
|
||||
_enable_camera()
|
||||
else:
|
||||
var err := _add_world_model()
|
||||
if err != OK:
|
||||
print("Error occured: " + str(err))
|
||||
|
||||
_capture_mouse()
|
||||
|
||||
# -- Add a world model to the player, that should be seen by other players
|
||||
# -- on the server
|
||||
func _add_world_model() -> 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()
|
||||
model_mount.add_child(node)
|
||||
return OK
|
||||
|
||||
# -- Add the first person view to pthe player
|
||||
func _add_first_view_model() -> Error :
|
||||
# -- TODO: It should not be hardcoded
|
||||
var path := "res://scenes/characters/first_person_view.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()
|
||||
first_view_camera.add_child(node)
|
||||
return OK
|
||||
|
||||
func _enable_camera():
|
||||
first_view_camera.make_current()
|
||||
|
||||
func _capture_mouse() -> void:
|
||||
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
|
||||
mouse_captured = true
|
||||
|
||||
func _release_mouse() -> void:
|
||||
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
|
||||
mouse_captured = false
|
||||
|
||||
# -- Does the peer own the node
|
||||
func _is_current_player() -> bool:
|
||||
if owner_id == multiplayer_id:
|
||||
return true
|
||||
return false
|
||||
|
||||
# ---------------------------------------------------------------------
|
||||
# -- Input controller
|
||||
# ---------------------------------------------------------------------
|
||||
var move_dir: Vector2 # Input direction for movement
|
||||
var look_dir: Vector2 # Input direction for look/aim
|
||||
|
||||
var walk_vel: Vector3 # Walking velocity
|
||||
var grav_vel: Vector3 # Gravity velocity
|
||||
var jump_vel: Vector3 # Jumping velocity
|
||||
|
||||
@export_range(0.1, 3.0, 0.1) var jump_height: float = 1 # m
|
||||
@export_range(0.1, 3.0, 0.1, "or_greater") var camera_sens: float = 1
|
||||
|
||||
func _unhandled_input(event: InputEvent) -> void:
|
||||
if _is_current_player():
|
||||
if event is InputEventMouseMotion:
|
||||
look_dir = event.relative * 0.001
|
||||
if mouse_captured: _rotate_camera()
|
||||
#if Input.is_action_just_pressed("jump"): jumping = true
|
||||
if Input.is_action_just_pressed("exit"): get_tree().quit()
|
||||
if Input.is_action_pressed("shot"): _shoot()
|
||||
#if str($"..".name).to_int() == multiplayer.get_unique_id():
|
||||
#if Input.is_action_just_pressed("shot"): $UpperTorso/ViewModelCamera.shot()
|
||||
#if Input.is_action_just_pressed("reload"): $Body/UpperTorso/CameraMount/Camera.reload()
|
||||
|
||||
func _rotate_camera(sens_mod: float = 1.0) -> void:
|
||||
#if str($"..".name).to_int() == multiplayer.get_unique_id():
|
||||
rotation.y -= look_dir.x * camera_sens * sens_mod
|
||||
first_view_camera_mount.rotation.x = clamp(first_view_camera_mount.rotation.x - look_dir.y * camera_sens * sens_mod, -1.5, 1.5)
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
# Add the gravity.
|
||||
if not is_on_floor():
|
||||
velocity += get_gravity() * delta
|
||||
|
||||
# Handle jump.
|
||||
if Input.is_action_just_pressed("jump") and is_on_floor():
|
||||
velocity.y = JUMP_VELOCITY
|
||||
|
||||
# Get the input direction and handle the movement/deceleration.
|
||||
# As good practice, you should replace UI actions with custom gameplay actions.
|
||||
#var input_dir := Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
|
||||
# -- It shouldn't be possible to change direction during the jumps
|
||||
if is_on_floor():
|
||||
var input_dir := Input.get_vector("move_left", "move_right", "move_forward", "move_backwards")
|
||||
var direction := (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
|
||||
if direction:
|
||||
velocity.x = direction.x * SPEED
|
||||
velocity.z = direction.z * SPEED
|
||||
else:
|
||||
velocity.x = move_toward(velocity.x, 0, SPEED)
|
||||
velocity.z = move_toward(velocity.z, 0, SPEED)
|
||||
|
||||
move_and_slide()
|
||||
# -- TODO: It shouldn't be hardcoded
|
||||
var bullet = load("res://scenes/weapon/bullet.tscn")
|
||||
|
||||
@onready var shooting_raycast: RayCast3D = $FirstPersonCameraMount/RayCast3D
|
||||
@onready var bullet_starting_point: Node3D = $FirstPersonCameraMount/BulletStartingPoint
|
||||
|
||||
func _shoot():
|
||||
print("shooting")
|
||||
var root := get_tree().get_root()
|
||||
#if !gun_anim.is_playing():
|
||||
#gun_anim.play("Shoot")
|
||||
var node: Node3D = bullet.instantiate()
|
||||
node.position = bullet_starting_point.global_position
|
||||
node.transform.basis = bullet_starting_point.global_transform.basis
|
||||
root.add_child(node)
|
Loading…
Reference in New Issue
Block a user