Compare commits
19 Commits
lobby-map
...
player-cha
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cbbf9d538d | ||
|
|
0d651493e3 | ||
|
|
690a2c0205 | ||
|
|
9be3a0b61c | ||
|
|
6798db74d9 | ||
|
|
c759004028 | ||
|
|
7eaae582b2 | ||
|
|
6ce47a21ce | ||
|
|
732cd2c976 | ||
|
|
3700789497 | ||
| 0db8edef2a | |||
| 88b399f453 | |||
|
|
d61b045688 | ||
| eaaa3075d5 | |||
|
|
90ecb18414 | ||
|
|
098e906dc7 | ||
|
|
04440c0319 | ||
| 98cf12f533 | |||
| 52a34c8415 |
@@ -1,8 +1,8 @@
|
|||||||
extends Node
|
extends Node
|
||||||
|
|
||||||
var players: Array[int] = []
|
var players: Dictionary[int, Player] = {}
|
||||||
|
|
||||||
var player_spawner: MultiplayerSpawner
|
var player_spawner: LobbyPlayerSpawner
|
||||||
|
|
||||||
@onready var debug_ui: PackedScene = preload("res://ui/multiplayer-debug-ui/multiplayer-debug-ui.tscn")
|
@onready var debug_ui: PackedScene = preload("res://ui/multiplayer-debug-ui/multiplayer-debug-ui.tscn")
|
||||||
var debug_ui_instance
|
var debug_ui_instance
|
||||||
@@ -29,3 +29,8 @@ func request_server_to_spawn_player(peer_id: int, player_name: String) -> void:
|
|||||||
data["player_name"] = player_name
|
data["player_name"] = player_name
|
||||||
|
|
||||||
player_spawner.spawn(data)
|
player_spawner.spawn(data)
|
||||||
|
|
||||||
|
|
||||||
|
@rpc("any_peer", "call_local", "reliable")
|
||||||
|
func request_server_to_delete_player(peer_id: int) -> void:
|
||||||
|
player_spawner.delete_player(peer_id)
|
||||||
|
|||||||
@@ -142,3 +142,10 @@ draw_pass_1 = SubResource("QuadMesh_8eekk")
|
|||||||
stream = ExtResource("4_u2sse")
|
stream = ExtResource("4_u2sse")
|
||||||
volume_db = -15.0
|
volume_db = -15.0
|
||||||
unit_size = 5.0
|
unit_size = 5.0
|
||||||
|
|
||||||
|
[node name="OmniLight3D" type="OmniLight3D" parent="."]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.733088, 0)
|
||||||
|
light_color = Color(1, 0.823529, 0, 1)
|
||||||
|
shadow_enabled = true
|
||||||
|
distance_fade_enabled = true
|
||||||
|
omni_range = 9.93165
|
||||||
|
|||||||
@@ -379,7 +379,7 @@ transform = Transform3D(0.689594, 0, -0.724196, 0, 1, 0, 0.724196, 0, 0.689594,
|
|||||||
[node name="Tent" parent="Campsite/TentPlot3" instance=ExtResource("4_qjimh")]
|
[node name="Tent" parent="Campsite/TentPlot3" instance=ExtResource("4_qjimh")]
|
||||||
|
|
||||||
[node name="TentPlot4" type="Marker3D" parent="Campsite"]
|
[node name="TentPlot4" type="Marker3D" parent="Campsite"]
|
||||||
transform = Transform3D(-0.0217975, 0, 0.999762, 0, 1, 0, -0.999762, 0, -0.0217975, 6.53113, 0.334599, -2.31805)
|
transform = Transform3D(-0.518758, 0, 0.854921, 0, 1, 0, -0.854921, 0, -0.518758, 6.53113, 0.334599, -2.31805)
|
||||||
|
|
||||||
[node name="Tent" parent="Campsite/TentPlot4" instance=ExtResource("4_qjimh")]
|
[node name="Tent" parent="Campsite/TentPlot4" instance=ExtResource("4_qjimh")]
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
|
class_name LobbyPlayerSpawner
|
||||||
extends MultiplayerSpawner
|
extends MultiplayerSpawner
|
||||||
|
|
||||||
@onready var player_scene: PackedScene = load("res://player/Player.tscn")
|
@onready var player_scene: PackedScene = load("res://player/Player.tscn")
|
||||||
|
|
||||||
|
var players_dict: Dictionary[int, Player] = {}
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
spawn_function = spawn_player
|
spawn_function = spawn_player
|
||||||
@@ -17,6 +20,12 @@ func spawn_player(data: Dictionary) -> Player:
|
|||||||
new_player.set_player_name(peer_id, player_name)
|
new_player.set_player_name(peer_id, player_name)
|
||||||
new_player.position = Vector3.UP
|
new_player.position = Vector3.UP
|
||||||
|
|
||||||
GameManager.players.append(int(peer_id))
|
GameManager.players[int(peer_id)] = new_player
|
||||||
|
|
||||||
return new_player
|
return new_player
|
||||||
|
|
||||||
|
|
||||||
|
func delete_player(id: int) -> void:
|
||||||
|
var player_to_delete = GameManager.players[id]
|
||||||
|
GameManager.players.erase(id)
|
||||||
|
player_to_delete.queue_free()
|
||||||
|
|||||||
@@ -26,16 +26,17 @@ func _ready() -> void:
|
|||||||
Steam.lobby_joined.connect(_on_lobby_joined)
|
Steam.lobby_joined.connect(_on_lobby_joined)
|
||||||
Steam.lobby_chat_update.connect(_on_lobby_chat_update)
|
Steam.lobby_chat_update.connect(_on_lobby_chat_update)
|
||||||
Steam.p2p_session_request.connect(_on_p2p_session_request)
|
Steam.p2p_session_request.connect(_on_p2p_session_request)
|
||||||
|
Steam.join_requested.connect(_on_lobby_join_requested)
|
||||||
|
|
||||||
multiplayer.peer_connected.connect(_on_peer_connected)
|
multiplayer.peer_connected.connect(_on_peer_connected)
|
||||||
multiplayer.peer_disconnected.connect(_on_peer_disconnected)
|
multiplayer.peer_disconnected.connect(_on_peer_disconnected)
|
||||||
multiplayer.connected_to_server.connect(_on_connected_to_server)
|
multiplayer.connected_to_server.connect(_on_connected_to_server)
|
||||||
|
multiplayer.server_disconnected.connect(_on_disconnected_from_server)
|
||||||
multiplayer.connection_failed.connect(_on_connection_failed)
|
multiplayer.connection_failed.connect(_on_connection_failed)
|
||||||
|
|
||||||
check_command_line()
|
check_command_line()
|
||||||
|
|
||||||
multiplayer.server_relay = true
|
multiplayer.server_relay = true
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
func _process(delta):
|
func _process(delta):
|
||||||
@@ -72,6 +73,11 @@ func join_lobby(this_lobby_id: int):
|
|||||||
Steam.joinLobby(this_lobby_id)
|
Steam.joinLobby(this_lobby_id)
|
||||||
|
|
||||||
|
|
||||||
|
func _on_lobby_join_requested(this_lobby_id: int, friend_id: int) -> void:
|
||||||
|
print("[CLIENT] 1. Attempting to join lobby (ID: %s)..." % this_lobby_id)
|
||||||
|
join_lobby(this_lobby_id)
|
||||||
|
|
||||||
|
|
||||||
func _on_lobby_joined(this_lobby_id: int, _p, _l, response: int):
|
func _on_lobby_joined(this_lobby_id: int, _p, _l, response: int):
|
||||||
if response != Steam.CHAT_ROOM_ENTER_RESPONSE_SUCCESS:
|
if response != Steam.CHAT_ROOM_ENTER_RESPONSE_SUCCESS:
|
||||||
print("[CLIENT] !!! Failed to join lobby: %s" % get_join_fail_reason(response))
|
print("[CLIENT] !!! Failed to join lobby: %s" % get_join_fail_reason(response))
|
||||||
@@ -91,6 +97,10 @@ func _on_connected_to_server():
|
|||||||
GameManager.request_server_to_spawn_player.rpc_id(1, multiplayer.get_unique_id(), steam_username)
|
GameManager.request_server_to_spawn_player.rpc_id(1, multiplayer.get_unique_id(), steam_username)
|
||||||
|
|
||||||
|
|
||||||
|
func _on_disconnected_from_server():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
func _on_p2p_session_request(steam_id_remote: int) -> void:
|
func _on_p2p_session_request(steam_id_remote: int) -> void:
|
||||||
print("[P2P] ==> Session request from: %s. Accepting." % steam_id_remote)
|
print("[P2P] ==> Session request from: %s. Accepting." % steam_id_remote)
|
||||||
Steam.acceptP2PSessionWithUser(steam_id_remote)
|
Steam.acceptP2PSessionWithUser(steam_id_remote)
|
||||||
@@ -129,9 +139,10 @@ func _on_peer_connected(id: int):
|
|||||||
|
|
||||||
func _on_peer_disconnected(id: int):
|
func _on_peer_disconnected(id: int):
|
||||||
print("[INFO] Peer %s has disconnected." % id)
|
print("[INFO] Peer %s has disconnected." % id)
|
||||||
|
GameManager.request_server_to_delete_player.rpc_id(1, id)
|
||||||
if players.has(id):
|
if players.has(id):
|
||||||
#players[id].queue_free()
|
|
||||||
players.erase(id)
|
players.erase(id)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
func _on_connection_failed() -> void:
|
func _on_connection_failed() -> void:
|
||||||
@@ -142,7 +153,9 @@ func _on_lobby_chat_update(_l_id, user_changed_id: int, _u_m_c_id, chat_state: i
|
|||||||
var state_string = "UNKNOWN"
|
var state_string = "UNKNOWN"
|
||||||
match chat_state:
|
match chat_state:
|
||||||
Steam.CHAT_MEMBER_STATE_CHANGE_ENTERED: state_string = "ENTERED"
|
Steam.CHAT_MEMBER_STATE_CHANGE_ENTERED: state_string = "ENTERED"
|
||||||
Steam.CHAT_MEMBER_STATE_CHANGE_LEFT: state_string = "LEFT"
|
Steam.CHAT_MEMBER_STATE_CHANGE_LEFT:
|
||||||
|
state_string = "LEFT"
|
||||||
|
|
||||||
Steam.CHAT_MEMBER_STATE_CHANGE_DISCONNECTED: state_string = "DISCONNECTED"
|
Steam.CHAT_MEMBER_STATE_CHANGE_DISCONNECTED: state_string = "DISCONNECTED"
|
||||||
print("[LOBBY INFO] User %s has %s the lobby." % [user_changed_id, state_string])
|
print("[LOBBY INFO] User %s has %s the lobby." % [user_changed_id, state_string])
|
||||||
|
|
||||||
|
|||||||
@@ -1,22 +1,14 @@
|
|||||||
[gd_scene load_steps=9 format=3 uid="uid://csmfxg011xisf"]
|
[gd_scene load_steps=7 format=3 uid="uid://csmfxg011xisf"]
|
||||||
|
|
||||||
[ext_resource type="Script" uid="uid://dopyfulbw2mx5" path="res://player/player.gd" id="1_ulp21"]
|
[ext_resource type="Script" uid="uid://dopyfulbw2mx5" path="res://player/player.gd" id="1_ulp21"]
|
||||||
[ext_resource type="PackedScene" uid="uid://caons6q8u2qt2" path="res://player/player.blend" id="2_3c3w1"]
|
[ext_resource type="PackedScene" uid="uid://caons6q8u2qt2" path="res://player/player.blend" id="2_3c3w1"]
|
||||||
[ext_resource type="PackedScene" uid="uid://k6jhk4snc3je" path="res://player/head.blend" id="3_wnvi2"]
|
[ext_resource type="PackedScene" uid="uid://k6jhk4snc3je" path="res://player/head.blend" id="3_wnvi2"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://xnd2p4kstsfw" path="res://player/watch/watch.tscn" id="4_83hs8"]
|
||||||
|
|
||||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_ehsmr"]
|
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_ehsmr"]
|
||||||
radius = 0.153372
|
radius = 0.153372
|
||||||
height = 1.37733
|
height = 1.37733
|
||||||
|
|
||||||
[sub_resource type="CapsuleMesh" id="CapsuleMesh_ulp21"]
|
|
||||||
radius = 0.3
|
|
||||||
height = 1.5
|
|
||||||
|
|
||||||
[sub_resource type="PrismMesh" id="PrismMesh_3c3w1"]
|
|
||||||
size = Vector3(0.5, 0.5, 0.5)
|
|
||||||
|
|
||||||
[sub_resource type="SphereMesh" id="SphereMesh_wnvi2"]
|
|
||||||
|
|
||||||
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_ulp21"]
|
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_ulp21"]
|
||||||
properties/0/path = NodePath(".:position")
|
properties/0/path = NodePath(".:position")
|
||||||
properties/0/spawn = true
|
properties/0/spawn = true
|
||||||
@@ -30,15 +22,19 @@ properties/2/replication_mode = 2
|
|||||||
properties/3/path = NodePath(".:scale")
|
properties/3/path = NodePath(".:scale")
|
||||||
properties/3/spawn = true
|
properties/3/spawn = true
|
||||||
properties/3/replication_mode = 2
|
properties/3/replication_mode = 2
|
||||||
|
properties/4/path = NodePath("Mesh/AnimationPlayer:current_animation")
|
||||||
|
properties/4/spawn = true
|
||||||
|
properties/4/replication_mode = 2
|
||||||
|
|
||||||
[node name="Player" type="CharacterBody3D" node_paths=PackedStringArray("camera", "neck", "body", "head")]
|
[node name="Player" type="CharacterBody3D" node_paths=PackedStringArray("camera", "neck", "body", "head", "animation_player")]
|
||||||
collision_layer = 2
|
collision_layer = 2
|
||||||
collision_mask = 3
|
collision_mask = 3
|
||||||
script = ExtResource("1_ulp21")
|
script = ExtResource("1_ulp21")
|
||||||
camera = NodePath("Neck/Camera3D")
|
camera = NodePath("Neck/Camera3D")
|
||||||
neck = NodePath("Neck")
|
neck = NodePath("Neck")
|
||||||
body = NodePath("Mesh")
|
body = NodePath("Mesh")
|
||||||
head = NodePath("Neck/head")
|
head = NodePath("Neck/HeadBoneAttachment3D/head")
|
||||||
|
animation_player = NodePath("Mesh/AnimationPlayer")
|
||||||
|
|
||||||
[node name="Neck" type="Node3D" parent="."]
|
[node name="Neck" type="Node3D" parent="."]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.297908, 0)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.297908, 0)
|
||||||
@@ -46,40 +42,19 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.297908, 0)
|
|||||||
[node name="Camera3D" type="Camera3D" parent="Neck"]
|
[node name="Camera3D" type="Camera3D" parent="Neck"]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.144889, 0)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.144889, 0)
|
||||||
|
|
||||||
[node name="head" parent="Neck" instance=ExtResource("3_wnvi2")]
|
[node name="HeadBoneAttachment3D" type="BoneAttachment3D" parent="Neck"]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.222076, 0)
|
transform = Transform3D(0.999974, -0.00719406, 8.09973e-08, 0.00719406, 0.999974, -1.33776e-07, -8.00328e-08, 1.34355e-07, 1, 0.00301405, -0.0458933, 0.00284567)
|
||||||
|
bone_name = "HeadBone.002"
|
||||||
|
bone_idx = 8
|
||||||
|
use_external_skeleton = true
|
||||||
|
external_skeleton = NodePath("../../Mesh/Armature/Skeleton3D")
|
||||||
|
|
||||||
|
[node name="head" parent="Neck/HeadBoneAttachment3D" instance=ExtResource("3_wnvi2")]
|
||||||
|
transform = Transform3D(0.999899, 0.014218, -6.68899e-05, -0.0142179, 0.999899, 0.000213697, 6.99214e-05, -0.000212723, 1, 0.00483739, 0.27284, -0.0187194)
|
||||||
|
|
||||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
|
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
|
||||||
shape = SubResource("CapsuleShape3D_ehsmr")
|
shape = SubResource("CapsuleShape3D_ehsmr")
|
||||||
|
|
||||||
[node name="Bean" type="Node3D" parent="."]
|
|
||||||
transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, 0, 0, 0)
|
|
||||||
visible = false
|
|
||||||
|
|
||||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="Bean"]
|
|
||||||
transform = Transform3D(1, 0, 0, 0, 0.89961, 0, 0, 0, 1, 0, -0.318288, 0)
|
|
||||||
layers = 2
|
|
||||||
mesh = SubResource("CapsuleMesh_ulp21")
|
|
||||||
skeleton = NodePath("../..")
|
|
||||||
|
|
||||||
[node name="MeshInstance3D2" type="MeshInstance3D" parent="Bean"]
|
|
||||||
transform = Transform3D(1.41676, 0, 0, 0, 1.31718, 0, 0, 0, 1.22029, 0, 0.415995, 0)
|
|
||||||
layers = 2
|
|
||||||
mesh = SubResource("PrismMesh_3c3w1")
|
|
||||||
skeleton = NodePath("../..")
|
|
||||||
|
|
||||||
[node name="MeshInstance3D3" type="MeshInstance3D" parent="Bean"]
|
|
||||||
transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.0855882, 0.409407, 0.293333)
|
|
||||||
layers = 2
|
|
||||||
mesh = SubResource("SphereMesh_wnvi2")
|
|
||||||
skeleton = NodePath("../..")
|
|
||||||
|
|
||||||
[node name="MeshInstance3D4" type="MeshInstance3D" parent="Bean"]
|
|
||||||
transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.0770122, 0.409407, 0.293333)
|
|
||||||
layers = 2
|
|
||||||
mesh = SubResource("SphereMesh_wnvi2")
|
|
||||||
skeleton = NodePath("../..")
|
|
||||||
|
|
||||||
[node name="Label3D" type="Label3D" parent="."]
|
[node name="Label3D" type="Label3D" parent="."]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.887858, 0)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.887858, 0)
|
||||||
billboard = 1
|
billboard = 1
|
||||||
@@ -89,3 +64,13 @@ text = "Username"
|
|||||||
replication_config = SubResource("SceneReplicationConfig_ulp21")
|
replication_config = SubResource("SceneReplicationConfig_ulp21")
|
||||||
|
|
||||||
[node name="Mesh" parent="." instance=ExtResource("2_3c3w1")]
|
[node name="Mesh" parent="." instance=ExtResource("2_3c3w1")]
|
||||||
|
|
||||||
|
[node name="AnimationPlayer" parent="Mesh" index="1"]
|
||||||
|
autoplay = "Idle"
|
||||||
|
|
||||||
|
[node name="Watch" parent="." instance=ExtResource("4_83hs8")]
|
||||||
|
transform = Transform3D(0.707107, 0.707107, -2.03718e-08, -0.183013, 0.183013, -0.965926, -0.683013, 0.683013, 0.258819, -0.228015, 0.33104, -0.235279)
|
||||||
|
visible = false
|
||||||
|
|
||||||
|
[editable path="Neck/HeadBoneAttachment3D/head"]
|
||||||
|
[editable path="Mesh"]
|
||||||
|
|||||||
Binary file not shown.
@@ -32,7 +32,17 @@ animation/trimming=false
|
|||||||
animation/remove_immutable_tracks=true
|
animation/remove_immutable_tracks=true
|
||||||
animation/import_rest_as_RESET=false
|
animation/import_rest_as_RESET=false
|
||||||
import_script/path=""
|
import_script/path=""
|
||||||
_subresources={}
|
_subresources={
|
||||||
|
"nodes": {
|
||||||
|
"PATH:Head": {
|
||||||
|
"mesh_instance/cast_shadow": 0
|
||||||
|
},
|
||||||
|
"PATH:Head-shadows": {
|
||||||
|
"mesh_instance/cast_shadow": 3,
|
||||||
|
"mesh_instance/layers": 4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
blender/nodes/visible=0
|
blender/nodes/visible=0
|
||||||
blender/nodes/active_collection_only=false
|
blender/nodes/active_collection_only=false
|
||||||
blender/nodes/punctual_lights=true
|
blender/nodes/punctual_lights=true
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -1,27 +1,41 @@
|
|||||||
class_name Player extends CharacterBody3D
|
class_name Player extends CharacterBody3D
|
||||||
|
|
||||||
@export_category("Player")
|
@export_category("Player Ailments")
|
||||||
|
@export_range(0, 100, 1.0) var health: int = 100
|
||||||
|
@export_range(0, 100, 1.0) var toxicity: int = 0
|
||||||
|
@export_range(0, 100, 1.0) var burns: int = 0
|
||||||
|
@export_range(0, 100, 1.0) var physical_trauma: int = 0
|
||||||
|
@export_range(0, 100, 1.0) var hunger: int = 0
|
||||||
|
@export_range(0, 100, 1.0) var thirst: int = 0
|
||||||
|
@export_range(0, 100, 1.0) var insanity: int = 0
|
||||||
|
@export_range(0, 100, 1.0) var drowning: int = 0
|
||||||
|
|
||||||
|
@export_category("Player Physics/Attributes")
|
||||||
@export_range(1, 35, 1) var speed: float = 5.0
|
@export_range(1, 35, 1) var speed: float = 5.0
|
||||||
@export_range(10, 400, 1) var acceleration: float = 100.0
|
@export_range(10, 400, 1) var acceleration: float = 100.0
|
||||||
|
|
||||||
@export_range(0.1, 3.0, 0.1) var jump_height: float = 1.0
|
@export_range(0.1, 3.0, 0.1) var jump_height: float = 1.0
|
||||||
@export_range(0.1, 3.0, 0.1, "or_greater") var camera_sens: float = 1.0
|
@export_range(0.1, 3.0, 0.1, "or_greater") var camera_sens: float = 1.0
|
||||||
@export_range(0.1, 3.0, 0.1, "or_greater") var joystick_camera_sens_multiplier: float = 5.0
|
@export_range(0.1, 3.0, 0.1, "or_greater") var joystick_camera_sens_multiplier: float = 5.0
|
||||||
|
|
||||||
|
@export_category("Node References")
|
||||||
@export var camera: Camera3D
|
@export var camera: Camera3D
|
||||||
@export var neck: Node3D
|
@export var neck: Node3D
|
||||||
@export var body: Node3D
|
@export var body: Node3D
|
||||||
@export var head: Node3D
|
@export var head: Node3D
|
||||||
|
@export var watch_face: MeshInstance3D
|
||||||
|
@export var animation_player: AnimationPlayer
|
||||||
|
|
||||||
|
|
||||||
var jumping: bool = false
|
var jumping: bool = false
|
||||||
var is_using_joystick: bool = false
|
var is_using_joystick: bool = false
|
||||||
var gravity: float = ProjectSettings.get_setting("physics/3d/default_gravity")
|
|
||||||
|
|
||||||
var move_dir: Vector2 # Input direction for movement
|
var move_dir: Vector2 # Input direction for movement
|
||||||
var look_dir: Vector2 # Input direction for look/aim
|
var look_dir: Vector2 # Input direction for look/aim
|
||||||
var walk_vel: Vector3 # Walking velocity
|
var walk_vel: Vector3 # Walking velocity
|
||||||
var grav_vel: Vector3 # Gravity velocity
|
var grav_vel: Vector3 # Gravity velocity
|
||||||
var jump_vel: Vector3 # Jumping velocity
|
var jump_vel: Vector3 # Jumping velocity
|
||||||
|
var gravity: float = 9.8 # Gravity
|
||||||
|
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
@@ -29,9 +43,9 @@ func _ready():
|
|||||||
print("-> [%s] Authority granted. Setting up camera and input." % name)
|
print("-> [%s] Authority granted. Setting up camera and input." % name)
|
||||||
camera.make_current()
|
camera.make_current()
|
||||||
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
|
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
|
||||||
$Mesh.hide()
|
#$Mesh.hide() # commented out; we want self-body view
|
||||||
$Label3D.hide()
|
$Label3D.hide()
|
||||||
head.hide()
|
head.find_child("Head").hide()
|
||||||
|
|
||||||
|
|
||||||
func set_player_name(peer_id: String, player_name: String):
|
func set_player_name(peer_id: String, player_name: String):
|
||||||
@@ -51,6 +65,7 @@ func _input(event):
|
|||||||
|
|
||||||
if Input.is_action_just_pressed("jump"):
|
if Input.is_action_just_pressed("jump"):
|
||||||
jumping = true
|
jumping = true
|
||||||
|
animation_player.play("Jump")
|
||||||
|
|
||||||
if event.is_action_pressed("esc") and Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
|
if event.is_action_pressed("esc") and Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
|
||||||
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
|
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
|
||||||
@@ -94,11 +109,18 @@ func walk(delta: float) -> Vector3:
|
|||||||
var _forward: Vector3 = neck.global_transform.basis * Vector3(move_dir.x, 0, move_dir.y)
|
var _forward: Vector3 = neck.global_transform.basis * Vector3(move_dir.x, 0, move_dir.y)
|
||||||
var walk_dir: Vector3 = Vector3(_forward.x, 0, _forward.z).normalized()
|
var walk_dir: Vector3 = Vector3(_forward.x, 0, _forward.z).normalized()
|
||||||
walk_vel = walk_vel.move_toward(walk_dir * speed * move_dir.length(), acceleration * delta)
|
walk_vel = walk_vel.move_toward(walk_dir * speed * move_dir.length(), acceleration * delta)
|
||||||
|
|
||||||
|
if walk_vel:
|
||||||
|
animation_player.play("Walk")
|
||||||
|
else:
|
||||||
|
animation_player.play("Idle")
|
||||||
return walk_vel
|
return walk_vel
|
||||||
|
|
||||||
|
|
||||||
func _gravity(delta: float) -> Vector3:
|
func _gravity(delta: float) -> Vector3:
|
||||||
grav_vel = Vector3.ZERO if is_on_floor() else grav_vel.move_toward(Vector3(0, velocity.y - gravity, 0), gravity * delta)
|
grav_vel = Vector3.ZERO if is_on_floor() else grav_vel.move_toward(Vector3(0, velocity.y - gravity, 0), gravity * delta)
|
||||||
|
if not is_on_floor() and animation_player.current_animation.begins_with("Idle"):
|
||||||
|
animation_player.play("Fall")
|
||||||
return grav_vel
|
return grav_vel
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
BIN
splunk/player/watch/textures/circular_progress_bar.png
Normal file
BIN
splunk/player/watch/textures/circular_progress_bar.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 19 KiB |
@@ -0,0 +1,34 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://d04873hiusc6i"
|
||||||
|
path="res://.godot/imported/circular_progress_bar.png-f4eb6f895796c7c677474f1ff35715a5.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://player/watch/textures/circular_progress_bar.png"
|
||||||
|
dest_files=["res://.godot/imported/circular_progress_bar.png-f4eb6f895796c7c677474f1ff35715a5.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
BIN
splunk/player/watch/textures/circular_progress_bar_outline.png
Normal file
BIN
splunk/player/watch/textures/circular_progress_bar_outline.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 16 KiB |
@@ -0,0 +1,34 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://bc8il5eibx7u1"
|
||||||
|
path="res://.godot/imported/circular_progress_bar_outline.png-f21aab2517811e4994f100e74ba10c8f.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://player/watch/textures/circular_progress_bar_outline.png"
|
||||||
|
dest_files=["res://.godot/imported/circular_progress_bar_outline.png-f21aab2517811e4994f100e74ba10c8f.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
BIN
splunk/player/watch/watch.blend
Normal file
BIN
splunk/player/watch/watch.blend
Normal file
Binary file not shown.
53
splunk/player/watch/watch.blend.import
Normal file
53
splunk/player/watch/watch.blend.import
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="scene"
|
||||||
|
importer_version=1
|
||||||
|
type="PackedScene"
|
||||||
|
uid="uid://cwjrbynrbn6fh"
|
||||||
|
path="res://.godot/imported/watch.blend-326c3df72c7fa85f5cf7e4436b5992fc.scn"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://player/watch/watch.blend"
|
||||||
|
dest_files=["res://.godot/imported/watch.blend-326c3df72c7fa85f5cf7e4436b5992fc.scn"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
nodes/root_type=""
|
||||||
|
nodes/root_name=""
|
||||||
|
nodes/apply_root_scale=true
|
||||||
|
nodes/root_scale=1.0
|
||||||
|
nodes/import_as_skeleton_bones=false
|
||||||
|
nodes/use_node_type_suffixes=true
|
||||||
|
meshes/ensure_tangents=true
|
||||||
|
meshes/generate_lods=true
|
||||||
|
meshes/create_shadow_meshes=true
|
||||||
|
meshes/light_baking=1
|
||||||
|
meshes/lightmap_texel_size=0.2
|
||||||
|
meshes/force_disable_compression=false
|
||||||
|
skins/use_named_skins=true
|
||||||
|
animation/import=true
|
||||||
|
animation/fps=30
|
||||||
|
animation/trimming=false
|
||||||
|
animation/remove_immutable_tracks=true
|
||||||
|
animation/import_rest_as_RESET=false
|
||||||
|
import_script/path=""
|
||||||
|
_subresources={}
|
||||||
|
blender/nodes/visible=0
|
||||||
|
blender/nodes/active_collection_only=false
|
||||||
|
blender/nodes/punctual_lights=true
|
||||||
|
blender/nodes/cameras=true
|
||||||
|
blender/nodes/custom_properties=true
|
||||||
|
blender/nodes/modifiers=1
|
||||||
|
blender/meshes/colors=false
|
||||||
|
blender/meshes/uvs=true
|
||||||
|
blender/meshes/normals=true
|
||||||
|
blender/meshes/export_geometry_nodes_instances=false
|
||||||
|
blender/meshes/tangents=true
|
||||||
|
blender/meshes/skins=2
|
||||||
|
blender/meshes/export_bones_deforming_mesh_only=false
|
||||||
|
blender/materials/unpack_enabled=true
|
||||||
|
blender/materials/export_materials=1
|
||||||
|
blender/animation/limit_playback=true
|
||||||
|
blender/animation/always_sample=true
|
||||||
|
blender/animation/group_tracks=true
|
||||||
BIN
splunk/player/watch/watch.blend1
Normal file
BIN
splunk/player/watch/watch.blend1
Normal file
Binary file not shown.
11
splunk/player/watch/watch.gd
Normal file
11
splunk/player/watch/watch.gd
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
extends Node3D
|
||||||
|
|
||||||
|
@export_category("Watch Properties")
|
||||||
|
@export_range(0, 100, 1.0) var health: int = 100
|
||||||
|
@export_range(0, 100, 1.0) var toxicity: int = 0
|
||||||
|
@export_range(0, 100, 1.0) var burns: int = 0
|
||||||
|
@export_range(0, 100, 1.0) var physical_trauma: int = 0
|
||||||
|
@export_range(0, 100, 1.0) var hunger: int = 0
|
||||||
|
@export_range(0, 100, 1.0) var thirst: int = 0
|
||||||
|
@export_range(0, 100, 1.0) var insanity: int = 0
|
||||||
|
@export_range(0, 100, 1.0) var drowning: int = 0
|
||||||
1
splunk/player/watch/watch.gd.uid
Normal file
1
splunk/player/watch/watch.gd.uid
Normal file
@@ -0,0 +1 @@
|
|||||||
|
uid://pte5bmcl0pup
|
||||||
28
splunk/player/watch/watch.tscn
Normal file
28
splunk/player/watch/watch.tscn
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
[gd_scene load_steps=6 format=3 uid="uid://xnd2p4kstsfw"]
|
||||||
|
|
||||||
|
[ext_resource type="PackedScene" uid="uid://cwjrbynrbn6fh" path="res://player/watch/watch.blend" id="1_aow76"]
|
||||||
|
[ext_resource type="Script" uid="uid://pte5bmcl0pup" path="res://player/watch/watch.gd" id="1_kkuxj"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://ifoxqwmyx5pj" path="res://player/watch/watch_interface.tscn" id="3_5wyi7"]
|
||||||
|
|
||||||
|
[sub_resource type="ViewportTexture" id="ViewportTexture_tq7ns"]
|
||||||
|
viewport_path = NodePath("SubViewport")
|
||||||
|
|
||||||
|
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_vnrqh"]
|
||||||
|
resource_local_to_scene = true
|
||||||
|
shading_mode = 0
|
||||||
|
albedo_texture = SubResource("ViewportTexture_tq7ns")
|
||||||
|
uv1_scale = Vector3(20.675, 20.675, 20.675)
|
||||||
|
|
||||||
|
[node name="Watch" type="Node3D"]
|
||||||
|
script = ExtResource("1_kkuxj")
|
||||||
|
|
||||||
|
[node name="watch" parent="." instance=ExtResource("1_aow76")]
|
||||||
|
|
||||||
|
[node name="WatchFace" parent="watch" index="1"]
|
||||||
|
surface_material_override/0 = SubResource("StandardMaterial3D_vnrqh")
|
||||||
|
|
||||||
|
[node name="SubViewport" type="SubViewport" parent="."]
|
||||||
|
|
||||||
|
[node name="WatchInterface" parent="SubViewport" instance=ExtResource("3_5wyi7")]
|
||||||
|
|
||||||
|
[editable path="watch"]
|
||||||
32
splunk/player/watch/watch_interface.tscn
Normal file
32
splunk/player/watch/watch_interface.tscn
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
[gd_scene load_steps=4 format=3 uid="uid://ifoxqwmyx5pj"]
|
||||||
|
|
||||||
|
[ext_resource type="Theme" uid="uid://oe0bmfcnckx8" path="res://player/watch/watch_interface_theme.tres" id="1_b0s04"]
|
||||||
|
[ext_resource type="Texture2D" uid="uid://d04873hiusc6i" path="res://player/watch/textures/circular_progress_bar.png" id="2_rvv3g"]
|
||||||
|
[ext_resource type="Texture2D" uid="uid://bc8il5eibx7u1" path="res://player/watch/textures/circular_progress_bar_outline.png" id="3_rvv3g"]
|
||||||
|
|
||||||
|
[node name="WatchInterface" type="Control"]
|
||||||
|
layout_mode = 3
|
||||||
|
anchors_preset = 15
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 2
|
||||||
|
|
||||||
|
[node name="CenterContainer" type="CenterContainer" parent="."]
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = 15
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 2
|
||||||
|
|
||||||
|
[node name="TextureProgressBar" type="TextureProgressBar" parent="CenterContainer"]
|
||||||
|
layout_mode = 2
|
||||||
|
theme = ExtResource("1_b0s04")
|
||||||
|
value = 78.0
|
||||||
|
fill_mode = 4
|
||||||
|
texture_under = ExtResource("2_rvv3g")
|
||||||
|
texture_over = ExtResource("3_rvv3g")
|
||||||
|
texture_progress = ExtResource("2_rvv3g")
|
||||||
|
tint_under = Color(0.444843, 0.444843, 0.444843, 1)
|
||||||
|
tint_progress = Color(1, 0.35, 0.35, 1)
|
||||||
3
splunk/player/watch/watch_interface_theme.tres
Normal file
3
splunk/player/watch/watch_interface_theme.tres
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
[gd_resource type="Theme" format=3 uid="uid://oe0bmfcnckx8"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
@@ -20,6 +20,10 @@ config/icon="res://icon.svg"
|
|||||||
SteamManager="*res://networking/steam-manager.gd"
|
SteamManager="*res://networking/steam-manager.gd"
|
||||||
GameManager="*res://game-logic/game_manager.gd"
|
GameManager="*res://game-logic/game_manager.gd"
|
||||||
|
|
||||||
|
[display]
|
||||||
|
|
||||||
|
window/vsync/vsync_mode=0
|
||||||
|
|
||||||
[editor_plugins]
|
[editor_plugins]
|
||||||
|
|
||||||
enabled=PackedStringArray("res://addons/freecam_3D/plugin.cfg")
|
enabled=PackedStringArray("res://addons/freecam_3D/plugin.cfg")
|
||||||
@@ -126,6 +130,7 @@ esc={
|
|||||||
[layer_names]
|
[layer_names]
|
||||||
|
|
||||||
3d_render/layer_2="player"
|
3d_render/layer_2="player"
|
||||||
|
3d_render/layer_3="multiplayer_player_view_shadows_only"
|
||||||
3d_physics/layer_2="player"
|
3d_physics/layer_2="player"
|
||||||
|
|
||||||
[physics]
|
[physics]
|
||||||
|
|||||||
Reference in New Issue
Block a user