39 Commits

Author SHA1 Message Date
8445f5a944 fixed bug where you can host twice 2025-08-21 20:51:11 -05:00
0db8edef2a reeeeeeeeeeeeeee 2025-08-12 20:59:05 -05:00
88b399f453 Try again to remove player when disconnecting 2025-08-12 20:57:26 -05:00
eaaa3075d5 Attempt removing player upon disconnect 2025-08-12 20:52:10 -05:00
98cf12f533 steam ui join 2 2025-08-12 18:42:09 -05:00
52a34c8415 steam ui join 2025-08-12 18:16:08 -05:00
WiseNoodle
ec0bef4d92 \/ 2025-08-10 23:34:56 -04:00
WiseNoodle
def4324902 fix player camera offset and tweak fog 2025-08-10 23:34:42 -04:00
WiseNoodle
59cbbc0880 tent fix col attempt 2025-08-10 23:24:31 -04:00
WiseNoodle
898a382a71 test sync without auth on light in lobby 2025-08-10 23:13:53 -04:00
WiseNoodle
912e6b9d31 Add spooky fog 2025-08-10 23:09:57 -04:00
WiseNoodle
95d384b0ee fix tree col 2025-08-10 23:06:20 -04:00
WiseNoodle
70f0a65a3a Lots O treez 2025-08-10 23:04:25 -04:00
WiseNoodle
724d78973b Add player scale for syncing 2025-08-10 22:58:40 -04:00
WiseNoodle
69596dac01 let mouse be FREEEEE 2025-08-10 22:42:11 -04:00
WiseNoodle
eb783c37da IT WORKS 2025-08-10 22:36:01 -04:00
WiseNoodle
14464d703c New player controller 2025-08-10 22:22:25 -04:00
WiseNoodle
5807549863 fixy 2 2025-08-10 22:05:50 -04:00
WiseNoodle
3d44cc7761 Fix player head rotation 2025-08-10 22:04:42 -04:00
WiseNoodle
bbbfd424ec Seperate head rotation 2025-08-10 00:33:17 -04:00
WiseNoodle
39e944806c Add new character model 2025-08-10 00:26:34 -04:00
80b4d213e5 small fix to lobby map 2025-08-09 21:31:22 -05:00
9706bc561f Merge pull request 'Merge multiplayer_spawner and lobby-map into develop' (#3) from multiplayer_spawner into develop
Reviewed-on: #3
2025-08-10 01:33:57 +00:00
d31c4cfe5c Merge remote-tracking branch 'origin/lobby-map' into multiplayer_spawner 2025-08-09 20:32:18 -05:00
0b3b6a5f0a i hate it here again 2025-08-08 22:38:03 -05:00
34dc8e7c85 i hate it here again 2025-08-08 22:28:47 -05:00
893e7c920c i hate it here 2025-08-08 22:26:26 -05:00
5f65fde280 derp 2025-08-08 22:25:02 -05:00
809886ade6 Fix spawner again 2025-08-08 22:22:46 -05:00
4a42e16da2 Fix spawner 2025-08-08 22:22:18 -05:00
c128223b42 Full lobby rework 2025-08-08 22:19:02 -05:00
8cc9d94832 Player will hide its own mesh 2025-08-07 23:03:50 -05:00
23e55d36c2 It works! (mostly) 2025-08-07 22:58:18 -05:00
1ce22e44d9 removing sync node 2025-08-07 22:52:49 -05:00
83adac8b43 moving auth stuff outside of ready in player 2025-08-07 22:13:25 -05:00
56be2f7bef possible ai slop fix 2 2025-08-07 22:03:29 -05:00
df031b8784 possible ai slop fix 2025-08-07 21:17:56 -05:00
492659bcb8 Player spawn test number 2 2025-08-07 21:09:12 -05:00
33fee89633 Player spawn test 2025-08-07 19:25:02 -05:00
28 changed files with 959 additions and 308 deletions

View File

@@ -0,0 +1,36 @@
extends Node
var players: Dictionary[int, Player] = {}
var player_spawner: LobbyPlayerSpawner
@onready var debug_ui: PackedScene = preload("res://ui/multiplayer-debug-ui/multiplayer-debug-ui.tscn")
var debug_ui_instance
func _ready() -> void:
player_spawner = get_tree().root.get_node("Lobby/PlayerSpawner") as MultiplayerSpawner
debug_ui_instance = debug_ui.instantiate()
get_tree().root.add_child.call_deferred(debug_ui_instance)
debug_ui_instance.hide()
func _input(event: InputEvent) -> void:
if event.is_action_pressed("toggle_watch"):
debug_ui_instance.visible = !debug_ui_instance.visible
@rpc("any_peer", "call_local", "reliable")
func request_server_to_spawn_player(peer_id: int, player_name: String) -> void:
var data: Dictionary = {}
data["peer_id"] = peer_id
data["player_name"] = player_name
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)

View File

@@ -0,0 +1 @@
uid://dsl58fvqxa6ul

View File

@@ -1,12 +1,22 @@
[gd_scene load_steps=10 format=3 uid="uid://bj52j4ew2lfr6"] [gd_scene load_steps=11 format=3 uid="uid://bj52j4ew2lfr6"]
[ext_resource type="PackedScene" uid="uid://5vggmy1srgxb" path="res://tools/human-height-reference.tscn" id="1_yyu2g"] [ext_resource type="PackedScene" uid="uid://baxlyc1rqnkh5" path="res://levels/lobby-scene/tree/tree.tscn" id="2_qjimh"]
[ext_resource type="PackedScene" uid="uid://bhgahenvxqhec" path="res://levels/lobby-scene/tree/tree.blend" id="3_0u2wx"]
[ext_resource type="PackedScene" uid="uid://b5xb0fsfpn7r3" path="res://levels/lobby-scene/lobby-terrain/lobby-terrain.blend" id="3_f73ky"] [ext_resource type="PackedScene" uid="uid://b5xb0fsfpn7r3" path="res://levels/lobby-scene/lobby-terrain/lobby-terrain.blend" id="3_f73ky"]
[ext_resource type="PackedScene" uid="uid://csmfxg011xisf" path="res://player/Player.tscn" id="4_0aw1h"] [ext_resource type="Script" uid="uid://bbhx0fwgcgjr4" path="res://networking/player_spawner.gd" id="3_qjimh"]
[ext_resource type="PackedScene" uid="uid://c4cew4af3h306" path="res://levels/lobby-scene/tent/tent.blend" id="4_qjimh"] [ext_resource type="PackedScene" uid="uid://c5ww6wbm2axro" path="res://levels/lobby-scene/tent/tent.tscn" id="4_qjimh"]
[ext_resource type="PackedScene" uid="uid://wcsd1tb0quj3" path="res://levels/lobby-scene/campfire/campfire.tscn" id="5_qjimh"] [ext_resource type="PackedScene" uid="uid://wcsd1tb0quj3" path="res://levels/lobby-scene/campfire/campfire.tscn" id="5_qjimh"]
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_qjimh"]
properties/0/path = NodePath("WorldEnvironment/DirectionalLight3D:rotation")
properties/0/spawn = true
properties/0/replication_mode = 2
properties/1/path = NodePath("WorldEnvironment/DirectionalLight3D:light_color")
properties/1/spawn = true
properties/1/replication_mode = 2
properties/2/path = NodePath("WorldEnvironment/DirectionalLight3D:light_energy")
properties/2/spawn = true
properties/2/replication_mode = 2
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_f73ky"] [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_f73ky"]
[sub_resource type="Sky" id="Sky_0aw1h"] [sub_resource type="Sky" id="Sky_0aw1h"]
@@ -22,36 +32,333 @@ glow_enabled = true
volumetric_fog_enabled = true volumetric_fog_enabled = true
volumetric_fog_density = 0.0 volumetric_fog_density = 0.0
[sub_resource type="FogMaterial" id="FogMaterial_qjimh"]
density = 0.05
albedo = Color(0.71539, 0.628132, 0.473352, 1)
height_falloff = 1e-05
[node name="Lobby" type="Node3D"] [node name="Lobby" type="Node3D"]
[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="."]
replication_config = SubResource("SceneReplicationConfig_qjimh")
[node name="WorldEnvironment" type="WorldEnvironment" parent="."] [node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_72fkp") environment = SubResource("Environment_72fkp")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="WorldEnvironment"] [node name="DirectionalLight3D" type="DirectionalLight3D" parent="WorldEnvironment"]
transform = Transform3D(0.915754, 0.29917, -0.268128, 0.115653, 0.442845, 0.889108, 0.384733, -0.845214, 0.370937, 0, 0, 0) transform = Transform3D(0.917663, -0.182505, -0.352967, 0.227411, 0.969643, 0.0898726, 0.32585, -0.162741, 0.931309, 0, 0, 0)
light_color = Color(0.71539, 0.628132, 0.473352, 1)
light_energy = 3.435
light_volumetric_fog_energy = 2.0
shadow_enabled = true shadow_enabled = true
shadow_transmittance_bias = 5.628 shadow_transmittance_bias = 5.628
[node name="Human-height-reference" parent="." instance=ExtResource("1_yyu2g")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.33741, 0.953, -5.00694)
[node name="lobby-terrain" parent="." instance=ExtResource("3_f73ky")] [node name="lobby-terrain" parent="." instance=ExtResource("3_f73ky")]
[node name="Node3D" type="Node3D" parent="lobby-terrain"] [node name="Tree" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 11.1286, 0, 0.918179)
[node name="tree" parent="lobby-terrain/Node3D" instance=ExtResource("3_0u2wx")] [node name="Tree2" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.47232, 0, -12.0981) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.48594, 0, -21.9149)
[node name="MultiplayerSpawner" type="MultiplayerSpawner" parent="."] [node name="Tree3" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 34.9316, 0, -26.9708)
[node name="Tree4" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 39.9316, 0, 6.02919)
[node name="Tree5" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 21.9316, 0, -12.9708)
[node name="Tree6" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.06842, 0, 11.0292)
[node name="Tree7" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.611513, 0, 0.791234, 0, 1, 0, -0.791234, 0, 0.611513, -52.7514, 0, -25.6344)
[node name="Tree8" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.611513, 0, 0.791234, 0, 1, 0, -0.791234, 0, 0.611513, -84.2187, 0, -37.0667)
[node name="Tree9" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.611513, 0, 0.791234, 0, 1, 0, -0.791234, 0, 0.611513, -60.2623, 0, -61.5226)
[node name="Tree10" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.611513, 0, 0.791234, 0, 1, 0, -0.791234, 0, 0.611513, -31.094, 0, -45.2988)
[node name="Tree11" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.611513, 0, 0.791234, 0, 1, 0, -0.791234, 0, 0.611513, -57.1347, 0, -42.6753)
[node name="Tree12" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.611513, 0, 0.791234, 0, 1, 0, -0.791234, 0, 0.611513, -56.4904, 0, -4.26199)
[node name="Tree13" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.122129, 0, 0.992514, 0, 1, 0, -0.992514, 0, -0.122129, 12.3259, 0, -50.3651)
[node name="Tree14" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.122129, 0, 0.992514, 0, 1, 0, -0.992514, 0, -0.122129, -12.7043, 0, -30.1653)
[node name="Tree15" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.122129, 0, 0.992514, 0, 1, 0, -0.992514, 0, -0.122129, -18.2613, 0, -70.5838)
[node name="Tree16" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.122129, 0, 0.992514, 0, 1, 0, -0.992514, 0, -0.122129, 13.881, 0, -79.5766)
[node name="Tree17" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.122129, 0, 0.992514, 0, 1, 0, -0.992514, 0, -0.122129, -2.77846, 0, -59.3909)
[node name="Tree18" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.122129, 0, 0.992514, 0, 1, 0, -0.992514, 0, -0.122129, 24.7058, 0, -32.5466)
[node name="Tree19" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.424468, 0, -0.905443, 0, 1, 0, 0.905443, 0, -0.424468, -73.4507, 0, 61.208)
[node name="Tree20" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.424468, 0, -0.905443, 0, 1, 0, 0.905443, 0, -0.424468, -40.2487, 0, 65.511)
[node name="Tree21" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.424468, 0, -0.905443, 0, 1, 0, 0.905443, 0, -0.424468, -58.3024, 0, 94.5982)
[node name="Tree22" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.424468, 0, -0.905443, 0, 1, 0, 0.905443, 0, -0.424468, -90.3043, 0, 85.1179)
[node name="Tree23" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.424468, 0, -0.905443, 0, 1, 0, 0.905443, 0, -0.424468, -65.4605, 0, 76.8849)
[node name="Tree24" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.424468, 0, -0.905443, 0, 1, 0, 0.905443, 0, -0.424468, -74.4571, 0, 39.5343)
[node name="Tree25" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.456849, 0, -0.889544, 0, 1, 0, 0.889544, 0, 0.456849, -22.2938, 0, 14.639)
[node name="Tree26" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.456849, 0, -0.889544, 0, 1, 0, 0.889544, 0, 0.456849, 5.24282, 0.333068, -22.3762)
[node name="Tree27" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.456849, 0, -0.889544, 0, 1, 0, 0.889544, 0, 0.456849, 13.389, 0, 23.0717)
[node name="Tree28" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.456849, 0, -0.889544, 0, 1, 0, 0.889544, 0, 0.456849, -13.6817, 12.3126, 37.5975)
[node name="Tree29" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.456849, 0, -0.889544, 0, 1, 0, 0.889544, 0, 0.456849, -5.00365, 0, 17.9035)
[node name="Tree30" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.456849, 0, -0.889544, 0, 1, 0, 0.889544, 0, 0.456849, -40.0582, 0, 2.18158)
[node name="Tree31" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.950505, 0, -0.31071, 0, 1, 0, 0.31071, 0, 0.950505, -27.5248, 0, 84.0602)
[node name="Tree32" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.950505, 0, -0.31071, 0, 1, 0, 0.31071, 0, 0.950505, -27.309, 0, 50.5812)
[node name="Tree33" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.950505, 0, -0.31071, 0, 1, 0, 0.31071, 0, 0.950505, 3.76537, 0, 64.9473)
[node name="Tree34" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.950505, 0, -0.31071, 0, 1, 0, 0.31071, 0, 0.950505, -1.73554, 0, 97.8675)
[node name="Tree35" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.950505, 0, -0.31071, 0, 1, 0, 0.31071, 0, 0.950505, -12.9411, 0, 74.2152)
[node name="Tree36" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.950505, 0, -0.31071, 0, 1, 0, 0.31071, 0, 0.950505, -48.9133, 0, 87.706)
[node name="Tree37" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.958462, 0, 0.28522, 0, 1, 0, -0.28522, 0, -0.958462, -68.895, 0, -38.1058)
[node name="Tree38" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.958462, 0, 0.28522, 0, 1, 0, -0.28522, 0, -0.958462, -68.2169, 0, -4.63298)
[node name="Tree39" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.958462, 0, 0.28522, 0, 1, 0, -0.28522, 0, -0.958462, -99.6637, 0, -18.1643)
[node name="Tree40" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.958462, 0, 0.28522, 0, 1, 0, -0.28522, 0, -0.958462, -95.0437, 0, -51.2197)
[node name="Tree41" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.958462, 0, 0.28522, 0, 1, 0, -0.28522, 0, -0.958462, -83.2106, 0, -27.8749)
[node name="Tree42" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.958462, 0, 0.28522, 0, 1, 0, -0.28522, 0, -0.958462, -47.6115, 0, -42.3214)
[node name="Tree43" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.811788, 0, -0.583952, 0, 1, 0, 0.583952, 0, -0.811788, -15.2417, 0, 5.56369)
[node name="Tree44" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.811788, 0, -0.583952, 0, 1, 0, 0.583952, 0, -0.811788, 2.89171, 5.28237, 42.2972)
[node name="Tree45" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.811788, 0, -0.583952, 0, 1, 0, 0.583952, 0, -0.811788, -18.2788, 0, 42.1034)
[node name="Tree46" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.811788, 0, -0.583952, 0, 1, 0, 0.583952, 0, -0.811788, -41.6082, 0, 18.2342)
[node name="Tree47" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.811788, 0, -0.583952, 0, 1, 0, 0.583952, 0, -0.811788, -15.9009, 0, 23.147)
[node name="Tree48" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.811788, 0, -0.583952, 0, 1, 0, 0.583952, 0, -0.811788, -5.56213, 0, -13.8545)
[node name="Tree49" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.166029, 0, -0.986121, 0, 1, 0, 0.986121, 0, -0.166029, -84.6695, 0, 10.7058)
[node name="Tree50" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.166029, 0, -0.986121, 0, 1, 0, 0.986121, 0, -0.166029, -51.5301, 0, 5.94477)
[node name="Tree51" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.166029, 0, -0.986121, 0, 1, 0, 0.986121, 0, -0.166029, -61.1196, 0, 38.8088)
[node name="Tree52" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.166029, 0, -0.986121, 0, 1, 0, 0.986121, 0, -0.166029, -94.4917, 0, 38.2604)
[node name="Tree53" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.166029, 0, -0.986121, 0, 1, 0, 0.986121, 0, -0.166029, -72.7669, 0, 23.6648)
[node name="Tree54" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.166029, 0, -0.986121, 0, 1, 0, 0.986121, 0, -0.166029, -91.4529, 0, -9.90353)
[node name="Tree55" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.451345, 0, 0.89235, 0, 1, 0, -0.89235, 0, 0.451345, 79.8631, 0, 23.359)
[node name="Tree56" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.451345, 0, 0.89235, 0, 1, 0, -0.89235, 0, 0.451345, 46.8045, 0, 18.0654)
[node name="Tree57" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.451345, 0, 0.89235, 0, 1, 0, -0.89235, 0, 0.451345, 65.7197, 0, -10.4691)
[node name="Tree58" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.451345, 0, 0.89235, 0, 1, 0, -0.89235, 0, 0.451345, 84.7693, 0, -0.0364418)
[node name="Tree59" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.451345, 0, 0.89235, 0, 1, 0, -0.89235, 0, 0.451345, 72.3451, 0, 7.45029)
[node name="Tree60" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.451345, 0, 0.89235, 0, 1, 0, -0.89235, 0, 0.451345, 80.2211, 0, 45.0531)
[node name="Tree61" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.430054, 0, 0.902803, 0, 1, 0, -0.902803, 0, -0.430054, 27.337, 0, 68.378)
[node name="Tree62" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.430054, 0, 0.902803, 0, 1, 0, -0.902803, 0, -0.430054, 2.93279, 0, 91.2979)
[node name="Tree63" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.430054, 0, 0.902803, 0, 1, 0, -0.902803, 0, -0.430054, -8.07783, 0, 58.8824)
[node name="Tree64" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.430054, 0, 0.902803, 0, 1, 0, -0.902803, 0, -0.430054, 19.5644, 0, 40.1766)
[node name="Tree65" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.430054, 0, 0.902803, 0, 1, 0, -0.902803, 0, -0.430054, 10.1521, 0, 64.598)
[node name="Tree66" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.430054, 0, 0.902803, 0, 1, 0, -0.902803, 0, -0.430054, 44.721, 0, 81.3608)
[node name="Tree67" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.940792, 0, 0.338984, 0, 1, 0, -0.338984, 0, -0.940792, 34.6408, 0, -0.855806)
[node name="Tree68" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.940792, 0, 0.338984, 0, 1, 0, -0.338984, 0, -0.940792, 33.4243, 0, 32.6017)
[node name="Tree69" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.940792, 0, 0.338984, 0, 1, 0, -0.338984, 0, -0.940792, 2.79329, 0, 17.3131)
[node name="Tree70" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.940792, 0, 0.338984, 0, 1, 0, -0.338984, 0, -0.940792, 9.27582, 0, -15.4279)
[node name="Tree71" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.940792, 0, 0.338984, 0, 1, 0, -0.338984, 0, -0.940792, 19.7694, 0, 8.54882)
[node name="Tree72" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(-0.940792, 0, 0.338984, 0, 1, 0, -0.338984, 0, -0.940792, 56.1288, 0, -3.86066)
[node name="Tree73" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.971063, 0, -0.238822, 0, 1, 0, 0.238822, 0, 0.971063, 6.73125, 0, 27.1375)
[node name="Tree74" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.971063, 0, -0.238822, 0, 1, 0, 0.238822, 0, 0.971063, 4.44506, 0, -6.264)
[node name="Tree75" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.971063, 0, -0.238822, 0, 1, 0, 0.238822, 0, 0.971063, 36.5059, 0, 5.74019)
[node name="Tree76" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.971063, 0, -0.238822, 0, 1, 0, 0.238822, 0, 0.971063, 33.4801, 0, 38.9794)
[node name="Tree77" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.971063, 0, -0.238822, 0, 1, 0, 0.238822, 0, 0.971063, 20.5386, 0, 16.2304)
[node name="Tree78" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.971063, 0, -0.238822, 0, 1, 0, 0.238822, 0, 0.971063, -14.325, 0, 32.3713)
[node name="Tree79" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.782782, 0, 0.622296, 0, 1, 0, -0.622296, 0, 0.782782, -48.959, 0, -13.9026)
[node name="Tree80" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.782782, 0, 0.622296, 0, 1, 0, -0.622296, 0, 0.782782, -76.7854, 0, -32.5192)
[node name="Tree81" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.782782, 0, 0.622296, 0, 1, 0, -0.622296, 0, 0.782782, -47.6816, 0, -50.5461)
[node name="Tree82" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.782782, 0, 0.622296, 0, 1, 0, -0.622296, 0, 0.782782, -25.5144, 0, -27.6785)
[node name="Tree91" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.782782, 0, 0.622296, 0, 1, 0, -0.622296, 0, 0.782782, -6.96076, 0, -27.3104)
[node name="Tree92" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.782782, 0, 0.622296, 0, 1, 0, -0.622296, 0, 0.782782, -19.3298, 0, -30.7708)
[node name="Tree93" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.782782, 0, 0.622296, 0, 1, 0, -0.622296, 0, 0.782782, -31.2627, 0, -22.9674)
[node name="Tree94" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.782782, 0, 0.622296, 0, 1, 0, -0.622296, 0, 0.782782, -31.3363, 0, -16.1939)
[node name="Tree95" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.782782, 0, 0.622296, 0, 1, 0, -0.622296, 0, 0.782782, -29.4957, 0, -9.42036)
[node name="Tree96" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.782782, 0, 0.622296, 0, 1, 0, -0.622296, 0, 0.782782, -17.5693, 0, -4.45112)
[node name="Tree97" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.782782, 0, 0.622296, 0, 1, 0, -0.622296, 0, 0.782782, -6.45191, 0, -8.94227)
[node name="Tree98" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.782782, 0, 0.622296, 0, 1, 0, -0.622296, 0, 0.782782, -2.01016, 0, -37.6058)
[node name="Tree99" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.782782, 0, 0.622296, 0, 1, 0, -0.622296, 0, 0.782782, -14.8881, 0, -42.9982)
[node name="Tree83" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.782782, 0, 0.622296, 0, 1, 0, -0.622296, 0, 0.782782, -49.1457, 0, -31.4973)
[node name="Tree84" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.782782, 0, 0.622296, 0, 1, 0, -0.622296, 0, 0.782782, -57.694, 0, 5.95833)
[node name="Tree85" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.118439, 0, 0.992961, 0, 1, 0, -0.992961, 0, 0.118439, 20.1415, 0, -22.3759)
[node name="Tree86" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.118439, 0, 0.992961, 0, 1, 0, -0.992961, 0, 0.118439, -24.3894, 0, -5.41777)
[node name="Tree87" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.118439, 0, 0.992961, 0, 1, 0, -0.992961, 0, 0.118439, -4.73205, 0, -49.3144)
[node name="Tree88" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.118439, 0, 0.992961, 0, 1, 0, -0.992961, 0, 0.118439, 28.6279, 0, -50.3707)
[node name="Tree89" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.118439, 0, 0.992961, 0, 1, 0, -0.992961, 0, 0.118439, 7.6297, 0, -34.7478)
[node name="Tree90" parent="lobby-terrain" instance=ExtResource("2_qjimh")]
transform = Transform3D(0.118439, 0, 0.992961, 0, 1, 0, -0.992961, 0, 0.118439, 27.9076, 0, -2.11639)
[node name="PlayerSpawner" type="MultiplayerSpawner" parent="."]
_spawnable_scenes = PackedStringArray("uid://csmfxg011xisf") _spawnable_scenes = PackedStringArray("uid://csmfxg011xisf")
spawn_path = NodePath("../Marker3D") spawn_path = NodePath("../Marker3D")
spawn_limit = 1 script = ExtResource("3_qjimh")
[node name="Marker3D" type="Marker3D" parent="."] [node name="Marker3D" type="Marker3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.269072, -8.35164) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -13.1053, 1.29751, -14.168)
[node name="Player" parent="." instance=ExtResource("4_0aw1h")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.444747, 0.992996, -4.71496)
[node name="Campsite" type="Node3D" parent="."] [node name="Campsite" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15.724, 0, -17.6721) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15.724, 0, -17.6721)
@@ -59,22 +366,27 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15.724, 0, -17.6721)
[node name="TentPlot1" type="Marker3D" parent="Campsite"] [node name="TentPlot1" type="Marker3D" parent="Campsite"]
transform = Transform3D(-0.998887, 0, -0.0471587, 0, 1, 0, 0.0471587, 0, -0.998887, -0.468871, 0.334599, -6.31805) transform = Transform3D(-0.998887, 0, -0.0471587, 0, 1, 0, 0.0471587, 0, -0.998887, -0.468871, 0.334599, -6.31805)
[node name="tent" parent="Campsite/TentPlot1" instance=ExtResource("4_qjimh")] [node name="Tent" parent="Campsite/TentPlot1" instance=ExtResource("4_qjimh")]
[node name="TentPlot2" type="Marker3D" parent="Campsite"] [node name="TentPlot2" type="Marker3D" parent="Campsite"]
transform = Transform3D(-0.240973, 0, -0.970532, 0, 1, 0, 0.970532, 0, -0.240973, -6.46887, 0.334599, -2.31805) transform = Transform3D(-0.240973, 0, -0.970532, 0, 1, 0, 0.970532, 0, -0.240973, -6.46887, 0.334599, -2.31805)
[node name="tent" parent="Campsite/TentPlot2" instance=ExtResource("4_qjimh")] [node name="Tent" parent="Campsite/TentPlot2" instance=ExtResource("4_qjimh")]
[node name="TentPlot3" type="Marker3D" parent="Campsite"] [node name="TentPlot3" type="Marker3D" parent="Campsite"]
transform = Transform3D(0.689594, 0, -0.724196, 0, 1, 0, 0.724196, 0, 0.689594, -4.46887, 0.334599, 4.68195) transform = Transform3D(0.689594, 0, -0.724196, 0, 1, 0, 0.724196, 0, 0.689594, -4.46887, 0.334599, 4.68195)
[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.0217975, 0, 0.999762, 0, 1, 0, -0.999762, 0, -0.0217975, 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")]
[node name="Campfire" parent="Campsite" instance=ExtResource("5_qjimh")] [node name="Campfire" parent="Campsite" instance=ExtResource("5_qjimh")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.392361, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.392361, 0)
[node name="FogVolume" type="FogVolume" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.07413, 6.02039, -11.3029)
size = Vector3(393.422, 76.9358, 405.889)
material = SubResource("FogMaterial_qjimh")

View File

@@ -0,0 +1,23 @@
[gd_scene load_steps=4 format=3 uid="uid://c5ww6wbm2axro"]
[ext_resource type="PackedScene" uid="uid://c4cew4af3h306" path="res://levels/lobby-scene/tent/tent.blend" id="1_bey51"]
[sub_resource type="BoxShape3D" id="BoxShape3D_6ocyw"]
size = Vector3(3.39648, 0.105957, 4.00098)
[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_bey51"]
data = PackedVector3Array(1, -1, -1.4167, 1.0131, -0.75, -0.9922, 1.0131, -0.75, -1.3052, 1, -1, -1.4167, 1, -1, -0.9924, 1.0131, -0.75, -0.9922, 1.0131, -0.75, -1.3052, 1.0523, 0, -0.9917, 1.0262, -0.5, -1.4875, 1.0131, -0.75, -1.3052, 1.0131, -0.75, -0.9922, 1.0523, 0, -0.9917, 1.0131, -0.75, -0.9922, 1.1047, 1, 0, 1.0523, 0, -0.9917, 1, -1, -0.9924, 1.0131, -0.75, -0.8156, 1.0131, -0.75, -0.9922, 1.0915, 0.749, 0.0034, 1.0131, -0.75, -0.9922, 1.0131, -0.75, -0.8156, 1.1047, 1, 0, 1.0131, -0.75, -0.9922, 1.0915, 0.749, 0.0034, 1, -1, -0.9924, 1.0131, -0.75, 0.8012, 1.0131, -0.75, -0.8156, 1.0131, -0.75, 0.8012, 1, -1, -0.9924, 1, -1, 0, 1.0131, -0.75, 0.8012, 1, -1, 0, 1, -1, 0.9909, 1.0131, -0.75, 0.9911, 1.0915, 0.749, 0.0034, 1.0131, -0.75, 0.8012, 1.1047, 1, 0, 1.0915, 0.749, 0.0034, 1.0131, -0.75, 0.9911, 1.0131, -0.75, 0.8012, 1, -1, 0.9909, 1.0131, -0.75, 0.9911, 1.0131, -0.75, 0.9911, 1, -1, 0.9909, 1, -1, 1.4166, 1.1047, 1, 0, 1.0131, -0.75, 0.9911, 1.0523, 0, 0.9916, 1.0131, -0.75, 0.9911, 1, -1, 1.4166, 1.0131, -0.75, 1.3051, 1.0523, 0, 0.9916, 1.0131, -0.75, 0.9911, 1.0131, -0.75, 1.3051, 1.0523, 0, 0.9916, 1.0131, -0.75, 1.3051, 1.0262, -0.5, 1.4875, -1.0131, -0.75, -1.3052, -1, -1, 0, -1, -1, -1.4167, -1.0131, -0.75, -1.3052, -1.0131, -0.75, 1.3051, -1, -1, 0, -1, -1, 0, -1.0131, -0.75, 1.3051, -1, -1, 1.4166, -1.0131, -0.75, 1.3051, -1.0131, -0.75, -1.3052, -1.0524, 0, -0.9917, -1.0524, 0, -0.9917, -1.0131, -0.75, -1.3052, -1.0262, -0.5, -1.4875, -1.0131, -0.75, 1.3051, -1.0524, 0, -0.9917, -1.0524, 0, 0.9916, -1.0524, 0, 0.9916, -1.0524, 0, -0.9917, -1.1047, 1, 0, -1.0131, -0.75, 1.3051, -1.0524, 0, 0.9916, -1.0262, -0.5, 1.4875, 1.0523, 0, 0.9916, 0, 0.9167, 0, 1.1047, 1, 0, 1.0523, 0, 0.9916, 0, -0.0417, 0.9916, 0, 0.9167, 0, -1.0524, 0, 0.9916, 0, 0.9167, 0, 0, -0.0417, 0.9916, -1.0524, 0, 0.9916, -1.1047, 1, 0, 0, 0.9167, 0, 0, -0.5208, 1.4875, -1.0524, 0, 0.9916, 0, -0.0417, 0.9916, 0, -0.5208, 1.4875, -1.0262, -0.5, 1.4875, -1.0524, 0, 0.9916, 1.0262, -0.5, 1.4875, 0, -0.0417, 0.9916, 1.0523, 0, 0.9916, 1.0262, -0.5, 1.4875, 0, -0.5208, 1.4875, 0, -0.0417, 0.9916, 1.0131, -0.75, 1.3051, 0, -0.5208, 1.4875, 1.0262, -0.5, 1.4875, 1.0131, -0.75, 1.3051, 0, -0.7604, 1.3051, 0, -0.5208, 1.4875, 0, -0.7604, -1.3052, -1, -1, -1.4167, 0, -1, -1.4167, 0, -0.7604, -1.3052, -1.0131, -0.75, -1.3052, -1, -1, -1.4167, 1.0131, -0.75, -1.3052, 0, -1, -1.4167, 1, -1, -1.4167, 1.0131, -0.75, -1.3052, 0, -0.7604, -1.3052, 0, -1, -1.4167, 0, -0.7604, -1.3052, 1.0262, -0.5, -1.4875, 0, -0.5208, -1.4875, 0, -0.7604, -1.3052, 1.0131, -0.75, -1.3052, 1.0262, -0.5, -1.4875, 0, -0.7604, -1.3052, -1.0262, -0.5, -1.4875, -1.0131, -0.75, -1.3052, 0, -0.7604, -1.3052, 0, -0.5208, -1.4875, -1.0262, -0.5, -1.4875, -1.0524, 0, -0.9917, 0, -0.5208, -1.4875, 0, -0.0417, -0.9917, -1.0524, 0, -0.9917, -1.0262, -0.5, -1.4875, 0, -0.5208, -1.4875, 1.0262, -0.5, -1.4875, 0, -0.0417, -0.9917, 0, -0.5208, -1.4875, 1.0262, -0.5, -1.4875, 1.0523, 0, -0.9917, 0, -0.0417, -0.9917, 0, -0.0417, -0.9917, 1.1047, 1, 0, 0, 0.9167, 0, 0, -0.0417, -0.9917, 1.0523, 0, -0.9917, 1.1047, 1, 0, 0, -0.0417, -0.9917, -1.1047, 1, 0, -1.0524, 0, -0.9917, 0, -0.0417, -0.9917, 0, 0.9167, 0, -1.1047, 1, 0, 0, -0.5208, 1.4875, -1.0131, -0.75, 1.3051, -1.0262, -0.5, 1.4875, 0, -0.5208, 1.4875, 0, -0.7604, 1.3051, -1.0131, -0.75, 1.3051, -1, -1, 1.4166, 0, -0.7604, 1.3051, 0, -1, 1.4166, -1, -1, 1.4166, -1.0131, -0.75, 1.3051, 0, -0.7604, 1.3051, 0, -0.7604, 1.3051, 1, -1, 1.4166, 0, -1, 1.4166, 0, -0.7604, 1.3051, 1.0131, -0.75, 1.3051, 1, -1, 1.4166, 1, -1, -0.9924, 1, -0.9917, -1.4167, 1, -1, -1.4167, 1, -1, -0.9924, 1, -0.9917, -0.9924, 1, -0.9917, -1.4167, 1, -1, 0, 1, -0.9917, -0.9924, 1, -1, -0.9924, 1, -1, 0, 1, -0.9917, 0, 1, -0.9917, -0.9924, -1, -1, -1.4167, -1, -0.9917, 0, -1, -1, 0, -1, -1, -1.4167, -1, -0.9917, -1.4167, -1, -0.9917, 0, -1, -1, 0, -1, -0.9917, 0, -1, -0.9917, 1.4166, -1, -1, 0, -1, -0.9917, 1.4166, -1, -1, 1.4166, 1, -1, -1.4167, 0, -0.9917, -1.4167, 1, -0.9917, -1.4167, 1, -1, -1.4167, 0, -1, -1.4167, 0, -0.9917, -1.4167, 0, -1, -1.4167, -1, -0.9917, -1.4167, 0, -0.9917, -1.4167, 0, -1, -1.4167, -1, -1, -1.4167, -1, -0.9917, -1.4167, 1, -1, 1.4166, 1, -0.9917, 0.9909, 1, -1, 0.9909, 1, -1, 1.4166, 1, -0.9917, 1.4166, 1, -0.9917, 0.9909, 0, -1, 1.4166, 1, -0.9917, 1.4166, 1, -1, 1.4166, 0, -1, 1.4166, 0, -0.9917, 1.4166, 1, -0.9917, 1.4166, -1, -1, 1.4166, 0, -0.9917, 1.4166, 0, -1, 1.4166, -1, -1, 1.4166, -1, -0.9917, 1.4166, 0, -0.9917, 1.4166, 1, -1, 0.9909, 1, -0.9917, 0, 1, -0.9917, 0.9909, 1, -1, 0.9909, 1, -1, 0, 1, -0.9917, 0)
[node name="Tent" type="Node3D"]
[node name="tent" parent="." instance=ExtResource("1_bey51")]
[node name="StaticBody3D" type="StaticBody3D" parent="."]
[node name="CollisionShape3D" type="CollisionShape3D" parent="StaticBody3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.0397949, 0)
shape = SubResource("BoxShape3D_6ocyw")
[node name="CollisionShape3D2" type="CollisionShape3D" parent="StaticBody3D"]
transform = Transform3D(3.57628e-07, 0, 1.2, 0, 1.2, 0, -2, 0, 2.14577e-07, 0, 1.2, 0)
shape = SubResource("ConcavePolygonShape3D_bey51")

View File

@@ -0,0 +1,17 @@
[gd_scene load_steps=3 format=3 uid="uid://baxlyc1rqnkh5"]
[ext_resource type="PackedScene" uid="uid://bhgahenvxqhec" path="res://levels/lobby-scene/tree/tree.blend" id="1_lbkut"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_0o2vh"]
radius = 0.3
height = 13.6187
[node name="Tree" type="Node3D"]
[node name="tree2" parent="." instance=ExtResource("1_lbkut")]
[node name="StaticBody3D" type="StaticBody3D" parent="."]
[node name="CollisionShape3D" type="CollisionShape3D" parent="StaticBody3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 6.8, 0)
shape = SubResource("CapsuleShape3D_0o2vh")

View File

@@ -0,0 +1,31 @@
class_name LobbyPlayerSpawner
extends MultiplayerSpawner
@onready var player_scene: PackedScene = load("res://player/Player.tscn")
var players_dict: Dictionary[int, Player] = {}
func _ready() -> void:
spawn_function = spawn_player
func spawn_player(data: Dictionary) -> Player:
var new_player = player_scene.instantiate() as Player
var peer_id = str(data["peer_id"])
var player_name = str(data["player_name"])
new_player.set_multiplayer_authority(int(peer_id), true)
new_player.set_player_name(peer_id, player_name)
new_player.position = Vector3.UP
GameManager.players[int(peer_id)] = 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()

View File

@@ -0,0 +1 @@
uid://bbhx0fwgcgjr4

View File

@@ -1,15 +1,14 @@
extends Node extends Node
var is_owned: bool = false @onready var player_scene: PackedScene = preload("res://player/Player.tscn")
var steam_app_id: int = 480
var players: Array[int] = []
var steam_id: int = 0 var steam_id: int = 0
var steam_username: String = "" var steam_username: String = ""
var lobby_id: int = 0
var lobby_id = 0
var lobby_max_members = 4
var lobby_members: Array = []
var steam_initialized: bool = false var steam_initialized: bool = false
var steam_app_id: int = 480
var peer: SteamMultiplayerPeer var peer: SteamMultiplayerPeer
@@ -23,274 +22,165 @@ func _ready() -> void:
print("!!! Steam did not initialize. Multiplayer will be disabled.") print("!!! Steam did not initialize. Multiplayer will be disabled.")
return return
# Connect Steam lobby signals
Steam.lobby_created.connect(_on_lobby_created) Steam.lobby_created.connect(_on_lobby_created)
Steam.lobby_joined.connect(_on_lobby_joined) Steam.lobby_joined.connect(_on_lobby_joined)
#Steam.lobby_match_list.connect(_on_lobby_match_list)
Steam.lobby_chat_update.connect(_on_lobby_chat_update) Steam.lobby_chat_update.connect(_on_lobby_chat_update)
Steam.lobby_data_update.connect(_on_lobby_data_update) Steam.p2p_session_request.connect(_on_p2p_session_request)
#Steam.join_requested.connect(_on_lobby_join_requested) Steam.join_requested.connect(_on_lobby_join_requested)
Steam.persona_state_change.connect(_on_persona_change)
# Setup multiplayer signals
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)
multiplayer.server_disconnected.connect(_on_server_disconnected)
Steam.p2p_session_request.connect(_on_p2p_session_request)
check_command_line() check_command_line()
multiplayer.server_relay = true
func _on_p2p_session_request(steam_id_remote: int) -> void:
## ADDED: More detailed logging to confirm P2P acceptance.
print("[P2P] ==> Session request from: %s. Accepting." % steam_id_remote)
var accepted = Steam.acceptP2PSessionWithUser(steam_id_remote)
if not accepted:
print("[P2P] !!! Failed to accept P2P session with %s." % steam_id_remote)
func _process(delta): func _process(delta):
## ADDED: Guard clause in case Steam fails to initialize.
if not steam_initialized: if not steam_initialized:
return return
Steam.run_callbacks() Steam.run_callbacks()
if Input.is_action_just_pressed("interact"):
## ADDED: Replaced simple print with a detailed diagnostic function. func create_lobby():
log_multiplayer_info() print("[HOST] 1. Attempting to create lobby...")
if lobby_id == 0:
Steam.createLobby(Steam.LOBBY_TYPE_FRIENDS_ONLY, 4)
else:
print("Cant host, already in a lobby")
func _on_lobby_created(connect: int, this_lobby_id: int):
if connect != 1:
print("[HOST] !!! Lobby creation failed.")
return
lobby_id = this_lobby_id
print("[HOST] 2. Lobby created successfully (ID: %s)." % lobby_id)
Steam.setLobbyJoinable(lobby_id, true)
Steam.setLobbyData(lobby_id, "name", steam_username + "'s Lobby")
setup_multiplayer_peer(true)
print("[HOST] 3. Multiplayer host started (My Peer ID is always 1).")
#players.append(peer.get)
GameManager.request_server_to_spawn_player.rpc_id(1, 1, steam_username)
func check_command_line() -> void: func join_lobby(this_lobby_id: int):
var args: Array = OS.get_cmdline_args() print("[CLIENT] 1. Attempting to join lobby (ID: %s)..." % this_lobby_id)
if args.size() > 0: Steam.joinLobby(this_lobby_id)
if args[0] == "+connect_lobby":
if args.size() > 1 and int(args[1]) > 0:
print("Command line lobby ID: %s" % args[1]) func _on_lobby_join_requested(this_lobby_id: int, friend_id: int) -> void:
join_lobby(int(args[1])) 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):
if response != Steam.CHAT_ROOM_ENTER_RESPONSE_SUCCESS:
print("[CLIENT] !!! Failed to join lobby: %s" % get_join_fail_reason(response))
return
lobby_id = this_lobby_id
print("[CLIENT] 2. Successfully joined Steam lobby.")
if Steam.getLobbyOwner(lobby_id) != steam_id:
print("[CLIENT] 3. I am a client, creating multiplayer peer to connect to host.")
setup_multiplayer_peer(false)
func _on_connected_to_server():
print("[CLIENT] 4. Successfully connected to host's multiplayer peer.")
print("[CLIENT] 5. Sending my info to the server for registration...")
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:
print("[P2P] ==> Session request from: %s. Accepting." % steam_id_remote)
Steam.acceptP2PSessionWithUser(steam_id_remote)
func init_steam() -> bool: func init_steam() -> bool:
var response: Dictionary = Steam.steamInitEx() var response: Dictionary = Steam.steamInitEx()
print("Steam init response: %s " % response)
if response['status'] > 0: if response['status'] > 0:
print("!!! Failed to init steam! Code: %s " % response) print("!!! Failed to init steam! Code: %s " % response)
return false return false
is_owned = Steam.isSubscribed()
steam_id = Steam.getSteamID() steam_id = Steam.getSteamID()
steam_username = Steam.getPersonaName() steam_username = Steam.getPersonaName()
print("Steam initialized successfully for %s (ID: %s)." % [steam_username, steam_id]) print("Steam initialized successfully for %s (ID: %s)." % [steam_username, steam_id])
if !is_owned:
print("!!! WARNING: Steam reports you do not own App ID %s." % steam_app_id)
# You might want to return false here in a real game
# return false
return true return true
func setup_multiplayer_peer(is_host: bool = false) -> void: func setup_multiplayer_peer(is_host: bool = false) -> void:
## ADDED: Check if a peer is already active before creating a new one.
if multiplayer.multiplayer_peer and multiplayer.multiplayer_peer.get_connection_status() != MultiplayerPeer.CONNECTION_DISCONNECTED: if multiplayer.multiplayer_peer and multiplayer.multiplayer_peer.get_connection_status() != MultiplayerPeer.CONNECTION_DISCONNECTED:
print("[Multiplayer] Peer already exists. Disconnecting old one.")
multiplayer.multiplayer_peer.close() multiplayer.multiplayer_peer.close()
peer = SteamMultiplayerPeer.new() peer = SteamMultiplayerPeer.new()
if is_host: if is_host:
print("[Multiplayer] Creating Host...") peer.create_host(0)
var err = peer.create_host(0) ## REMOVED: Channel is handled by the peer automatically now.
if err != OK:
print("[Multiplayer] !!! Failed to create host. Error: %s" % err)
return
multiplayer.multiplayer_peer = peer
print("[Multiplayer] Host created successfully. My Peer ID: %s" % multiplayer.get_unique_id())
else: else:
if lobby_id == 0:
print("[Multiplayer] !!! Cannot create client, not in a lobby.")
return
var host_id = Steam.getLobbyOwner(lobby_id) var host_id = Steam.getLobbyOwner(lobby_id)
print("[Multiplayer] Creating Client, attempting to connect to host: %s" % host_id) peer.create_client(host_id, 0)
var err = peer.create_client(host_id, 0) ## REMOVED: Channel is handled by the peer automatically.
if err != OK:
print("[Multiplayer] !!! Failed to create client. Error: %s" % err)
return
multiplayer.multiplayer_peer = peer multiplayer.multiplayer_peer = peer
print("[Multiplayer] Client peer created. Waiting for connection...")
func create_lobby(): func _on_peer_connected(id: int):
if lobby_id == 0: print("[INFO] Peer %s has established a multiplayer session." % id)
print("Creating lobby...") #players.append()
Steam.createLobby(Steam.LOBBY_TYPE_FRIENDS_ONLY, lobby_max_members)
func _on_lobby_created(connect: int, this_lobby_id: int): func _on_peer_disconnected(id: int):
if connect == 1: print("[INFO] Peer %s has disconnected." % id)
lobby_id = this_lobby_id GameManager.request_server_to_delete_player.rpc_id(1, id)
print("Lobby created with id `%s`" % lobby_id) if players.has(id):
players.erase(id)
Steam.setLobbyJoinable(lobby_id, true)
Steam.setLobbyData(lobby_id, "name", steam_username + "'s Lobby")
Steam.setLobbyData(lobby_id, "mode", "Splunk")
Steam.allowP2PPacketRelay(true)
setup_multiplayer_peer(true) # Setup as host
else :
print("!!! Failed to create lobby.")
func join_lobby(this_lobby_id: int):
print("Attempting to join lobby: %s" % this_lobby_id) func _on_connection_failed() -> void:
lobby_members.clear() print("[CLIENT] !!! Connection to the host failed.")
Steam.joinLobby(this_lobby_id)
func _on_lobby_joined(this_lobby_id: int, permissions: int, locked: bool, response: int): func _on_lobby_chat_update(_l_id, user_changed_id: int, _u_m_c_id, chat_state: int):
if response == Steam.CHAT_ROOM_ENTER_RESPONSE_SUCCESS:
lobby_id = this_lobby_id
print("Successfully joined lobby: %s" % lobby_id)
get_lobby_members()
# FIXED: Use Steam.getLobbyOwner() to determine if we should be host or client
var lobby_owner_id = Steam.getLobbyOwner(lobby_id)
var am_i_owner = (lobby_owner_id == steam_id)
print("[Multiplayer] Lobby Owner: %s, My Steam ID: %s, Am I Owner?: %s" % [lobby_owner_id, steam_id, am_i_owner])
if not am_i_owner:
print("[Multiplayer] I am not the lobby owner, setting up as client...")
setup_multiplayer_peer(false) # Setup as client
else:
print("[Multiplayer] I am the lobby owner, but multiplayer peer should already be set up as host.")
else:
## ADDED: Log the specific reason for the join failure.
print("!!! Failed to join lobby. Reason: %s" % get_join_fail_reason(response))
func get_lobby_members() -> void:
lobby_members.clear()
if lobby_id == 0: return
var num_members = Steam.getNumLobbyMembers(lobby_id)
print("--- Refreshing Lobby Members (%s) ---" % num_members)
for i in range(num_members):
var member_id = Steam.getLobbyMemberByIndex(lobby_id, i)
var member_name = Steam.getFriendPersonaName(member_id)
lobby_members.append({
"steam_id": member_id,
"steam_name": member_name
})
print(" - %s (%s)" % [member_name, member_id])
print("---------------------------------")
func _on_lobby_data_update(lobby: int, user: int, success: int) -> void:
if success:
if lobby == user:
print("Lobby data for lobby %s has been updated." % lobby)
var lobby_name = Steam.getLobbyData(lobby, "name")
print(" > New lobby name: %s" % lobby_name)
else:
print("Data for member %s in lobby %s has been updated." % [user, lobby])
func _on_persona_change(steam_id_changed: int, flag: int) -> void:
# This can be spammy, but useful for debugging name changes.
# print("Persona state changed for %s. Refreshing lobby members." % steam_id_changed)
get_lobby_members()
func leave_lobby() -> void:
pass
func _on_lobby_chat_update(lobby_id_update: int, user_changed_id: int, user_making_change_id: int, chat_state: int):
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"
Steam.CHAT_MEMBER_STATE_CHANGE_KICKED: state_string = "KICKED" print("[LOBBY INFO] User %s has %s the lobby." % [user_changed_id, state_string])
Steam.CHAT_MEMBER_STATE_CHANGE_BANNED: state_string = "BANNED"
print("[Lobby] Chat Update: User %s has %s." % [user_changed_id, state_string])
# Any change in lobby membership should trigger a refresh.
get_lobby_members()
func _on_peer_connected(id: int) -> void: func check_command_line() -> void:
print("[Multiplayer] ✅ Peer connected: %s" % id) var args: Array = OS.get_cmdline_args()
# It's good practice to re-check lobby members when a peer connects successfully. if args.size() > 1 and args[0] == "+connect_lobby":
get_lobby_members() if int(args[1]) > 0:
print("[CMD] Command line join request for lobby ID: %s" % args[1])
func _on_peer_disconnected(id: int) -> void: join_lobby(int(args[1]))
print("[Multiplayer] ❌ Peer disconnected: %s" % id)
func _on_connected_to_server() -> void:
print("[Multiplayer] ✅ Successfully connected to the host.")
print("[Multiplayer] - My Peer ID is now: %s" % multiplayer.get_unique_id())
func _on_connection_failed() -> void:
print("[Multiplayer] ❌ Connection to the host failed.")
func _on_server_disconnected() -> void:
print("[Multiplayer] ❌ Disconnected from the host.")
## ADDED: New function to log all relevant multiplayer and lobby information.
func log_multiplayer_info():
print("\n--- DIAGNOSTIC INFO ---")
print("## Multiplayer Status:")
if multiplayer.multiplayer_peer:
print(" - Peer State: Active")
print(" - Connection Status: %s" % get_connection_status_string(multiplayer.multiplayer_peer.get_connection_status()))
print(" - Is Server?: %s" % multiplayer.is_server())
print(" - My Peer ID: %s" % multiplayer.get_unique_id())
print(" - Connected Peer IDs: %s" % multiplayer.get_peers())
else:
print(" - Peer State: Inactive (null)")
print("\n## Steam Lobby Info:")
print(" - In Lobby?: %s" % (lobby_id != 0))
print(" - Lobby ID: %s" % lobby_id)
if lobby_id != 0:
print(" - Lobby Owner Steam ID: %s" % Steam.getLobbyOwner(lobby_id))
print(" - My Steam ID: %s" % steam_id)
print(" - Lobby Members Array (%s):" % lobby_members.size())
for member in lobby_members:
print(" - %s (%s)" % [member.steam_name, member.steam_id])
print("-------------------------\n")
## ADDED: Helper function to get a human-readable string for connection status.
func get_connection_status_string(status: int) -> String:
match status:
MultiplayerPeer.CONNECTION_DISCONNECTED: return "Disconnected"
MultiplayerPeer.CONNECTION_CONNECTING: return "Connecting"
MultiplayerPeer.CONNECTION_CONNECTED: return "Connected"
_: return "Unknown Status"
func get_join_fail_reason(response: int) -> String: func get_join_fail_reason(response: int) -> String:
match response: match response:
Steam.CHAT_ROOM_ENTER_RESPONSE_DOESNT_EXIST: return "Lobby no longer exists" 1: return "Doesnt Exist"
Steam.CHAT_ROOM_ENTER_RESPONSE_NOT_ALLOWED: return "Not allowed to join" 2: return "Not Allowed"
Steam.CHAT_ROOM_ENTER_RESPONSE_FULL: return "Lobby is full" 3: return "Full"
Steam.CHAT_ROOM_ENTER_RESPONSE_ERROR: return "Unknown error" 4: return "Error"
Steam.CHAT_ROOM_ENTER_RESPONSE_BANNED: return "You are banned" 5: return "Banned"
Steam.CHAT_ROOM_ENTER_RESPONSE_LIMITED: return "Limited account" 6: return "Limited"
Steam.CHAT_ROOM_ENTER_RESPONSE_CLAN_DISABLED: return "Lobby is locked" 7: return "Clan Disabled"
Steam.CHAT_ROOM_ENTER_RESPONSE_COMMUNITY_BAN: return "Community locked" 8: return "Community Ban"
Steam.CHAT_ROOM_ENTER_RESPONSE_MEMBER_BLOCKED_YOU: return "A member blocked you" 9: return "Member Blocked You"
Steam.CHAT_ROOM_ENTER_RESPONSE_YOU_BLOCKED_MEMBER: return "You blocked a member" 10: return "You Blocked Member"
_: return "Unknown reason" _: return "Unknown Reason"

View File

@@ -1,9 +1,12 @@
[gd_scene load_steps=8 format=3 uid="uid://csmfxg011xisf"] [gd_scene load_steps=9 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://8phs2e161db1" path="res://ui/multiplayer-debug-ui/multiplayer-debug-ui.tscn" 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"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_ehsmr"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_ehsmr"]
radius = 0.153372
height = 1.37733
[sub_resource type="CapsuleMesh" id="CapsuleMesh_ulp21"] [sub_resource type="CapsuleMesh" id="CapsuleMesh_ulp21"]
radius = 0.3 radius = 0.3
@@ -18,61 +21,71 @@ size = Vector3(0.5, 0.5, 0.5)
properties/0/path = NodePath(".:position") properties/0/path = NodePath(".:position")
properties/0/spawn = true properties/0/spawn = true
properties/0/replication_mode = 2 properties/0/replication_mode = 2
properties/1/path = NodePath(".:rotation") properties/1/path = NodePath("Neck:rotation")
properties/1/spawn = true properties/1/spawn = true
properties/1/replication_mode = 2 properties/1/replication_mode = 2
properties/2/path = NodePath("Label3D:text") properties/2/path = NodePath(".:rotation")
properties/2/spawn = true properties/2/spawn = true
properties/2/replication_mode = 1 properties/2/replication_mode = 2
properties/3/path = NodePath(".:scale")
properties/3/spawn = true
properties/3/replication_mode = 2
[node name="Player" type="CharacterBody3D"] [node name="Player" type="CharacterBody3D" node_paths=PackedStringArray("camera", "neck", "body", "head")]
collision_layer = 2 collision_layer = 2
collision_mask = 3 collision_mask = 3
script = ExtResource("1_ulp21") script = ExtResource("1_ulp21")
camera = NodePath("Neck/Camera3D")
neck = NodePath("Neck")
body = NodePath("Mesh")
head = NodePath("Neck/head")
[node name="Camera3D" type="Camera3D" parent="."] [node name="Neck" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.399442, 0.0644827) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.297908, 0)
cull_mask = 1048573
current = true [node name="Camera3D" type="Camera3D" parent="Neck"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.144889, 0)
[node name="head" parent="Neck" instance=ExtResource("3_wnvi2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.222076, 0)
[node name="CollisionShape3D" type="CollisionShape3D" parent="."] [node name="CollisionShape3D" type="CollisionShape3D" parent="."]
shape = SubResource("CapsuleShape3D_ehsmr") shape = SubResource("CapsuleShape3D_ehsmr")
[node name="Mesh" type="Node3D" parent="."] [node name="Bean" type="Node3D" parent="."]
transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, 0, 0, 0) 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="Mesh"] [node name="MeshInstance3D" type="MeshInstance3D" parent="Bean"]
transform = Transform3D(1, 0, 0, 0, 0.89961, 0, 0, 0, 1, 0, -0.318288, 0) transform = Transform3D(1, 0, 0, 0, 0.89961, 0, 0, 0, 1, 0, -0.318288, 0)
layers = 2 layers = 2
mesh = SubResource("CapsuleMesh_ulp21") mesh = SubResource("CapsuleMesh_ulp21")
skeleton = NodePath("../..") skeleton = NodePath("../..")
[node name="MeshInstance3D2" type="MeshInstance3D" parent="Mesh"] [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) transform = Transform3D(1.41676, 0, 0, 0, 1.31718, 0, 0, 0, 1.22029, 0, 0.415995, 0)
layers = 2 layers = 2
mesh = SubResource("PrismMesh_3c3w1") mesh = SubResource("PrismMesh_3c3w1")
skeleton = NodePath("../..") skeleton = NodePath("../..")
[node name="MeshInstance3D3" type="MeshInstance3D" parent="Mesh"] [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) transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -0.0855882, 0.409407, 0.293333)
layers = 2 layers = 2
mesh = SubResource("SphereMesh_wnvi2") mesh = SubResource("SphereMesh_wnvi2")
skeleton = NodePath("../..") skeleton = NodePath("../..")
[node name="MeshInstance3D4" type="MeshInstance3D" parent="Mesh"] [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) transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.0770122, 0.409407, 0.293333)
layers = 2 layers = 2
mesh = SubResource("SphereMesh_wnvi2") mesh = SubResource("SphereMesh_wnvi2")
skeleton = NodePath("../..") skeleton = NodePath("../..")
[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="."]
replication_config = SubResource("SceneReplicationConfig_ulp21")
[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
text = "Username" text = "Username"
[node name="CanvasLayer" type="CanvasLayer" parent="."] [node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="."]
replication_config = SubResource("SceneReplicationConfig_ulp21")
[node name="Multiplayer-debug-ui" parent="CanvasLayer" instance=ExtResource("2_3c3w1")] [node name="Mesh" parent="." instance=ExtResource("2_3c3w1")]

BIN
splunk/player/head.blend Normal file

Binary file not shown.

View File

@@ -0,0 +1,53 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://k6jhk4snc3je"
path="res://.godot/imported/head.blend-dcafcd72c4b2f826b0eba225740d3f47.scn"
[deps]
source_file="res://player/head.blend"
dest_files=["res://.godot/imported/head.blend-dcafcd72c4b2f826b0eba225740d3f47.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/head.blend1 Normal file

Binary file not shown.

BIN
splunk/player/player.blend Normal file

Binary file not shown.

View File

@@ -0,0 +1,53 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://caons6q8u2qt2"
path="res://.godot/imported/player.blend-216ce6e732c258e973626ec2ccac6d19.scn"
[deps]
source_file="res://player/player.blend"
dest_files=["res://.godot/imported/player.blend-216ce6e732c258e973626ec2ccac6d19.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/player.blend1 Normal file

Binary file not shown.

View File

@@ -1,60 +1,111 @@
extends CharacterBody3D class_name Player extends CharacterBody3D
@export var speed = 5.0 @export_category("Player")
@export var jump_velocity = 4.5 @export_range(1, 35, 1) var speed: float = 5.0
@export var mouse_sensitivity = 0.002 @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, "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 var camera: Camera3D
@export var neck: Node3D
@export var body: Node3D
@export var head: Node3D
var jumping: 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 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
var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
var camera_node: Camera3D
func _ready(): func _ready():
if is_multiplayer_authority():
print("-> [%s] Authority granted. Setting up camera and input." % name)
camera.make_current()
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
camera_node = $Camera3D # Assuming Camera3D is a direct child $Mesh.hide()
$Label3D.hide()
head.hide()
$Label3D.text = SteamManager.steam_username
func _physics_process(delta): func set_player_name(peer_id: String, player_name: String):
# Apply gravity name = peer_id
if not is_on_floor(): $Label3D.text = player_name
velocity.y -= gravity * delta
# Handle Jump
if Input.is_action_just_pressed("jump") and is_on_floor():
velocity.y = jump_velocity
# Get the input direction and apply movement
var input_dir = Input.get_vector("move_left", "move_right", "move_forward", "move_backward")
var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
if is_on_floor():
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)
else:
# Air control
velocity.x = lerp(velocity.x, direction.x * speed, delta * 5.0)
velocity.z = lerp(velocity.z, direction.z * speed, delta * 5.0)
move_and_slide()
func _input(event): func _input(event):
if is_multiplayer_authority():
if Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
if event is InputEventMouseMotion: if event is InputEventMouseMotion:
# Rotate the CharacterBody3D around the Y-axis for horizontal look is_using_joystick = false
rotate_y(-event.relative.x * mouse_sensitivity) look_dir = event.relative * 0.001
_rotate_camera()
elif event is InputEventJoypadMotion:
is_using_joystick = true
# Rotate the Camera3D around its local X-axis for vertical look if Input.is_action_just_pressed("jump"):
var change = -event.relative.y * mouse_sensitivity jumping = true
var new_x_rotation = camera_node.rotation.x + change
camera_node.rotation.x = clamp(new_x_rotation, deg_to_rad(-90), deg_to_rad(90))
if event.is_action_pressed("ui_cancel"): # Typically Escape key if event.is_action_pressed("esc") and Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
else: elif event.is_action_pressed("esc") and not Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
if event.is_action_pressed("toggle_watch"):
$"CanvasLayer/Multiplayer-debug-ui".visible = !$"CanvasLayer/Multiplayer-debug-ui".visible func _physics_process(delta: float) -> void:
if is_multiplayer_authority():
velocity = walk(delta) + _gravity(delta) + _jump(delta)
global_rotation.x = 0.0
global_rotation.z = 0.0
if Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
_handle_joypad_camera_rotation(delta)
move_and_slide()
func _rotate_camera(sens_mod: float = 1.0) -> void:
if is_multiplayer_authority():
var camera_sens_final = camera_sens
if is_using_joystick:
camera_sens_final = camera_sens * joystick_camera_sens_multiplier
rotation.y -= look_dir.x * camera_sens_final * sens_mod
neck.rotation.x = clamp(neck.rotation.x - look_dir.y * camera_sens_final * 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")
if joypad_dir.length() > 0:
look_dir += joypad_dir * delta
_rotate_camera(sens_mod)
look_dir = Vector2.ZERO
func walk(delta: float) -> Vector3:
if Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
move_dir = Input.get_vector("move_left", "move_right", "move_forward", "move_backward")
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()
walk_vel = walk_vel.move_toward(walk_dir * speed * move_dir.length(), acceleration * delta)
return walk_vel
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)
return grav_vel
func _jump(delta: float) -> Vector3:
if jumping:
if is_on_floor(): jump_vel = Vector3(0, sqrt(4 * jump_height * gravity), 0)
jumping = false
return jump_vel
jump_vel = Vector3.ZERO if is_on_floor() else jump_vel.move_toward(Vector3.ZERO, gravity * delta)
return jump_vel

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

View File

@@ -0,0 +1,35 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://duqmryk4caogn"
path.s3tc="res://.godot/imported/arms.png-c03c798cb61a16c352c998058bb5ba07.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://player/textures/arms.png"
dest_files=["res://.godot/imported/arms.png-c03c798cb61a16c352c998058bb5ba07.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

View File

@@ -0,0 +1,35 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://soon8fejkbpi"
path.s3tc="res://.godot/imported/body.png-8538a92e4d8adfcb74ea6ee2f8ff59b0.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://player/textures/body.png"
dest_files=["res://.godot/imported/body.png-8538a92e4d8adfcb74ea6ee2f8ff59b0.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

View File

@@ -0,0 +1,35 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d1opx7wmrdxie"
path.s3tc="res://.godot/imported/feet.png-5fda5a3596df7f6058e8acac591e0ee2.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://player/textures/feet.png"
dest_files=["res://.godot/imported/feet.png-5fda5a3596df7f6058e8acac591e0ee2.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

View File

@@ -0,0 +1,35 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://8wxeis3pudx7"
path.s3tc="res://.godot/imported/head.png-d658783ec5627f70f3e95905a0beaf97.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://player/textures/head.png"
dest_files=["res://.godot/imported/head.png-d658783ec5627f70f3e95905a0beaf97.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
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=0

View File

@@ -18,6 +18,11 @@ config/icon="res://icon.svg"
[autoload] [autoload]
SteamManager="*res://networking/steam-manager.gd" SteamManager="*res://networking/steam-manager.gd"
GameManager="*res://game-logic/game_manager.gd"
[display]
window/vsync/vsync_mode=0
[editor_plugins] [editor_plugins]
@@ -96,6 +101,31 @@ inv_slot_4={
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":52,"key_label":0,"unicode":52,"location":0,"echo":false,"script":null) "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":52,"key_label":0,"unicode":52,"location":0,"echo":false,"script":null)
] ]
} }
look_left={
"deadzone": 0.2,
"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":-1.0,"script":null)
]
}
look_right={
"deadzone": 0.2,
"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":1.0,"script":null)
]
}
look_down={
"deadzone": 0.2,
"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":1.0,"script":null)
]
}
look_up={
"deadzone": 0.2,
"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":-1.0,"script":null)
]
}
esc={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
[layer_names] [layer_names]