diff --git a/project.godot b/project.godot index 1731d76..12b313f 100644 --- a/project.godot +++ b/project.godot @@ -11,7 +11,7 @@ config_version=5 [application] config/name="3D-RPG" -run/main_scene="uid://dw0lbkh31rofd" +run/main_scene="uid://cd3upe4xetlgl" config/features=PackedStringArray("4.4", "Forward Plus") config/icon="res://icon.svg" @@ -21,8 +21,8 @@ VFXManager="*res://src/scenes/autoload/vfx_manager.tscn" [display] -window/size/viewport_width=1920 -window/size/viewport_height=1080 +window/size/viewport_width=2560 +window/size/viewport_height=1440 window/size/mode=3 window/stretch/mode="canvas_items" diff --git a/src/resources/level_navigation_mesh.res b/src/resources/level_navigation_mesh.res index 4a0b52e..970aa68 100644 --- a/src/resources/level_navigation_mesh.res +++ b/src/resources/level_navigation_mesh.res @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ba553a12318e47f3f01c07dbad569e76d9d1b9696f5fb44eb9eb556aa0001187 -size 2539 +oid sha256:03a141ab4635df33b3090df99193836982b1bfc960f3e25d2a88f8aa5e0f75b6 +size 2544 diff --git a/src/resources/terrain_data/grassy_hills/terrain3d_00-01.res b/src/resources/terrain_data/grassy_hills/terrain3d_00-01.res index 7a4e7e9..d1c1145 100644 --- a/src/resources/terrain_data/grassy_hills/terrain3d_00-01.res +++ b/src/resources/terrain_data/grassy_hills/terrain3d_00-01.res @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5f0cb09b3cff156d5cc51806ba91d13f84aa54dcfe7367f0388bb045f75e2479 -size 213100 +oid sha256:7aba1b4947824751b94d306bbda788e0902cd00e111d05fed071fdf5d879fb68 +size 213113 diff --git a/src/scenes/characters/enemy.tscn b/src/scenes/characters/enemy.tscn index a3a9fe2..191a475 100644 --- a/src/scenes/characters/enemy.tscn +++ b/src/scenes/characters/enemy.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=9 format=3 uid="uid://cwvrti8hmxj0k"] +[gd_scene load_steps=10 format=3 uid="uid://cwvrti8hmxj0k"] [ext_resource type="Script" uid="uid://p38hhb8jwgor" path="res://src/scripts/characters/enemy.gd" id="1_jr6vw"] [ext_resource type="PackedScene" uid="uid://c7ahf78h5s3kx" path="res://assets/models/character/gear/tall_shield.glb" id="2_fwei0"] @@ -11,6 +11,9 @@ [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_ljmr7"] +[sub_resource type="CylinderShape3D" id="CylinderShape3D_fwei0"] +radius = 10.0 + [node name="Enemy" type="CharacterBody3D"] collision_layer = 9 script = ExtResource("1_jr6vw") @@ -19,6 +22,9 @@ off_hand_items = Array[PackedScene]([ExtResource("2_fwei0"), ExtResource("3_aygw [node name="NavigationAgent3D" type="NavigationAgent3D" parent="."] avoidance_enabled = true +[node name="Timer" type="Timer" parent="."] +one_shot = true + [node name="HealthComponent" parent="." node_paths=PackedStringArray("body") instance=ExtResource("3_r8u7w")] body = NodePath("..") @@ -29,37 +35,114 @@ shape = SubResource("CapsuleShape3D_r8u7w") transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0) [node name="Skeleton3D" parent="Rig/CharacterRig/GameRig" index="0"] -bones/0/position = Vector3(1.41799e-14, 0.903864, -0.0481735) -bones/2/rotation = Quaternion(0.00254114, -0.000345045, 0.00321307, 0.999992) -bones/3/rotation = Quaternion(-0.0925045, -0.000328237, 0.00852257, 0.995676) -bones/4/rotation = Quaternion(0.273484, 1.50227e-08, 9.09987e-08, 0.961876) -bones/6/rotation = Quaternion(-0.16068, -1.17104e-07, -2.25642e-08, 0.987007) -bones/7/position = Vector3(-5.39946e-08, 0.903864, -0.0481735) -bones/8/position = Vector3(-5.91031e-08, 0.903864, -0.0481735) -bones/9/position = Vector3(0.131144, 0.970068, -0.0351291) -bones/9/rotation = Quaternion(0.993638, 0.0205636, -0.0310958, 0.106269) -bones/11/rotation = Quaternion(0.408196, -0.000698645, 0.000312532, 0.912894) -bones/13/rotation = Quaternion(-0.746414, 0.0118664, 0.0243817, 0.664929) -bones/15/position = Vector3(-0.131144, 0.970068, -0.0351291) -bones/15/rotation = Quaternion(0.974478, -0.00553855, 0.0274913, 0.222725) -bones/17/rotation = Quaternion(0.433159, 0.003226, -0.00155051, 0.901311) -bones/19/rotation = Quaternion(-0.683342, -0.0281668, -0.00108009, 0.729554) -bones/21/position = Vector3(0.0251286, 1.43374, 0.0448904) -bones/21/rotation = Quaternion(-0.481322, -0.262926, -0.408801, 0.729439) -bones/22/position = Vector3(0.19009, 1.47171, -0.0166302) -bones/22/rotation = Quaternion(0.035007, -0.161958, 0.975088, -0.14747) -bones/23/rotation = Quaternion(1.24303e-07, -0.0280484, 3.1793e-08, 0.999607) -bones/24/rotation = Quaternion(0.326585, -0.0280544, -0.0203048, 0.944533) -bones/46/position = Vector3(-0.0113635, 1.43374, 0.0448904) -bones/46/rotation = Quaternion(-0.490609, 0.243241, 0.395651, 0.73729) -bones/47/position = Vector3(-0.172762, 1.47222, -0.0251737) -bones/47/rotation = Quaternion(-0.0422729, -0.142474, 0.975197, 0.164026) -bones/48/rotation = Quaternion(-7.05598e-09, 0.0359437, -8.97213e-08, 0.999354) -bones/49/rotation = Quaternion(0.363577, 0.0359443, 0.0288099, 0.930425) -bones/71/position = Vector3(0.127191, 1.35349, -0.0253768) -bones/71/rotation = Quaternion(1.98289e-08, 0.605451, 0.795883, -4.61308e-08) -bones/72/position = Vector3(-0.113426, 1.35349, -0.0253769) -bones/72/rotation = Quaternion(1.98278e-08, 0.605468, 0.79587, -4.61313e-08) +bones/0/position = Vector3(1.39692e-14, 0.90108, -0.0481735) +bones/0/rotation = Quaternion(0.12582, 1.18262e-07, 1.49989e-08, 0.992053) +bones/1/rotation = Quaternion(-0.0566577, -0.00072973, -0.0117082, 0.998325) +bones/2/position = Vector3(3.20474e-09, 0.146689, -1.95578e-08) +bones/2/rotation = Quaternion(0.000743196, -0.000374187, 0.00321377, 0.999995) +bones/3/position = Vector3(-2.01263e-09, 0.202058, -2.51457e-08) +bones/3/rotation = Quaternion(-0.0941376, -0.000349476, 0.00852159, 0.995523) +bones/4/position = Vector3(3.02934e-10, 0.0925562, 3.91155e-08) +bones/4/rotation = Quaternion(0.274972, 1.48472e-08, 9.2249e-08, 0.961452) +bones/5/rotation = Quaternion(-0.0948564, -2.80691e-14, -2.26155e-08, 0.995491) +bones/6/rotation = Quaternion(-0.158807, -1.17424e-07, -2.06018e-08, 0.98731) +bones/7/position = Vector3(-3.32233e-08, 0.90108, -0.0481735) +bones/7/rotation = Quaternion(-0.0863677, -0.751104, -0.383052, 0.530711) +bones/8/position = Vector3(-7.31348e-08, 0.90108, -0.0481735) +bones/8/rotation = Quaternion(-0.0863677, 0.751104, 0.383052, 0.530711) +bones/9/position = Vector3(0.131144, 0.967284, -0.0351291) +bones/9/rotation = Quaternion(0.993362, 0.0207026, -0.0310291, 0.108811) +bones/10/position = Vector3(-2.36129e-08, 0.26601, -2.14789e-08) +bones/10/rotation = Quaternion(-3.13921e-08, -0.000695086, 1.20449e-08, 1) +bones/11/position = Vector3(-4.6306e-08, 0.26601, 2.42145e-08) +bones/11/rotation = Quaternion(0.413914, -0.000699774, 0.000318327, 0.910316) +bones/12/position = Vector3(3.05151e-08, 0.22603, 5.03768e-08) +bones/12/rotation = Quaternion(-8.19226e-09, -0.00710644, 4.16102e-08, 0.999975) +bones/13/position = Vector3(-2.95495e-08, 0.22603, 2.68392e-09) +bones/13/rotation = Quaternion(-0.748869, 0.0118755, 0.0243915, 0.662162) +bones/14/position = Vector3(-3.05481e-08, 0.139877, 1.64787e-08) +bones/14/rotation = Quaternion(-9.66743e-05, 0.967474, -0.252972, -0.000383447) +bones/15/position = Vector3(-0.131144, 0.967284, -0.0351291) +bones/15/rotation = Quaternion(0.973891, -0.00565072, 0.0274135, 0.225282) +bones/16/position = Vector3(-1.10042e-08, 0.265705, -3.31989e-08) +bones/16/rotation = Quaternion(-3.43227e-08, 0.00314323, 8.33075e-10, 0.999995) +bones/17/position = Vector3(1.83545e-08, 0.265705, 6.98543e-10) +bones/17/rotation = Quaternion(0.43836, 0.00325679, -0.00158855, 0.898792) +bones/18/position = Vector3(1.2807e-08, 0.225719, -8.28774e-09) +bones/18/rotation = Quaternion(-2.29017e-08, -0.00785732, 3.30149e-08, 0.999969) +bones/19/position = Vector3(-1.27748e-08, 0.225719, 1.12004e-08) +bones/19/rotation = Quaternion(-0.685613, -0.0281789, -0.000918696, 0.72742) +bones/20/position = Vector3(-1.30142e-08, 0.139877, -2.77457e-09) +bones/20/rotation = Quaternion(-9.96472e-05, 0.967461, -0.253021, -0.000383039) +bones/21/position = Vector3(0.0251286, 1.43109, 0.0438848) +bones/21/rotation = Quaternion(-0.486018, -0.261012, -0.405363, 0.728931) +bones/22/position = Vector3(0.189469, 1.46863, -0.0195107) +bones/22/rotation = Quaternion(0.0409265, -0.16106, 0.974858, -0.14845) +bones/23/position = Vector3(-5.41331e-09, 0.143946, -2.98023e-08) +bones/23/rotation = Quaternion(9.47234e-08, -0.0232248, 7.62074e-08, 0.99973) +bones/24/position = Vector3(-6.33301e-08, 0.143946, 4.3873e-08) +bones/24/rotation = Quaternion(0.315619, -0.023228, -0.0195211, 0.948401) +bones/25/position = Vector3(1.30385e-08, 0.127601, 6.51926e-09) +bones/25/rotation = Quaternion(1.49943e-07, -1.20606e-07, 9.91859e-08, 1) +bones/26/position = Vector3(2.06034e-08, 0.127601, 2.42761e-08) +bones/26/rotation = Quaternion(-0.00824883, -0.00027077, -0.0328667, 0.999426) +bones/28/rotation = Quaternion(0.702583, -0.000939743, -0.00133552, 0.7116) +bones/29/rotation = Quaternion(0.741121, 0.00218291, 0.00265381, 0.671363) +bones/30/rotation = Quaternion(0.32527, 0.890055, 0.295977, -0.119997) +bones/31/rotation = Quaternion(0.514882, -0.114149, 0.114482, 0.841879) +bones/32/rotation = Quaternion(0.592003, -0.0381348, -0.090699, 0.799907) +bones/34/position = Vector3(-0.00316938, 0.0987206, 0.0147918) +bones/34/rotation = Quaternion(-0.0674699, 0.718446, 0.0663966, 0.689112) +bones/35/rotation = Quaternion(0.580803, -0.000892135, -0.0014975, 0.814042) +bones/36/rotation = Quaternion(0.682777, 0.00174509, 0.00256596, 0.73062) +bones/37/rotation = Quaternion(-0.00426514, 0.736714, 0.0394785, 0.675038) +bones/38/position = Vector3(-0.00622951, 0.0926415, -0.0236344) +bones/38/rotation = Quaternion(-0.109873, 0.743351, 0.0333507, 0.658973) +bones/39/rotation = Quaternion(0.630039, 0.00151959, 0.00237944, 0.776559) +bones/40/rotation = Quaternion(0.652643, -0.00308142, -0.00421108, 0.757648) +bones/41/rotation = Quaternion(-0.0684174, 0.72411, 0.0332337, 0.685478) +bones/42/position = Vector3(-0.00715362, 0.0679857, -0.0481983) +bones/42/rotation = Quaternion(-0.120913, 0.799109, 0.0358921, 0.587807) +bones/43/rotation = Quaternion(0.498693, -0.0202705, -0.0256953, 0.866161) +bones/44/rotation = Quaternion(0.715385, 0.035306, 0.0573145, 0.695481) +bones/45/rotation = Quaternion(-0.129059, 0.728936, -0.0250259, 0.67184) +bones/46/position = Vector3(-0.0113635, 1.43109, 0.0438848) +bones/46/rotation = Quaternion(-0.499115, 0.23396, 0.387072, 0.739136) +bones/47/position = Vector3(-0.170541, 1.46915, -0.0312238) +bones/47/rotation = Quaternion(-0.0558126, -0.140182, 0.974516, 0.165989) +bones/48/position = Vector3(1.88476e-07, 0.143946, 1.02445e-08) +bones/48/rotation = Quaternion(-2.11681e-08, 0.0267761, -6.38373e-08, 0.999642) +bones/49/position = Vector3(6.5191e-09, 0.143946, -1.95094e-08) +bones/49/rotation = Quaternion(0.350981, 0.0267776, 0.0289447, 0.935552) +bones/50/position = Vector3(-1.48779e-07, 0.1276, 5.9139e-08) +bones/50/rotation = Quaternion(-8.73115e-08, 2.7474e-08, -1.28057e-07, 1) +bones/51/position = Vector3(1.9461e-07, 0.127601, 6.06248e-08) +bones/51/rotation = Quaternion(-0.00824876, 0.000270832, 0.032867, 0.999426) +bones/52/rotation = Quaternion(-0.2563, 0.855859, 0.0299184, -0.448241) +bones/53/rotation = Quaternion(0.694912, 0.107145, -0.103549, 0.703488) +bones/54/rotation = Quaternion(0.74112, -0.00218237, -0.00265409, 0.671363) +bones/55/rotation = Quaternion(-0.325269, 0.890055, 0.295977, 0.119998) +bones/56/rotation = Quaternion(0.514882, 0.11415, -0.114483, 0.841879) +bones/57/rotation = Quaternion(0.592004, 0.0381346, 0.0906992, 0.799907) +bones/59/position = Vector3(0.00316943, 0.0987207, 0.0147917) +bones/59/rotation = Quaternion(0.138771, -0.704916, 0.15571, 0.677932) +bones/60/rotation = Quaternion(0.579984, 0.0462615, -0.0308755, 0.812727) +bones/61/rotation = Quaternion(0.682777, -0.00174718, -0.00256448, 0.73062) +bones/62/rotation = Quaternion(-0.00426532, -0.736714, -0.0394788, 0.675038) +bones/63/position = Vector3(0.00622955, 0.0926417, -0.0236344) +bones/63/rotation = Quaternion(0.104095, -0.719607, 0.186262, 0.660784) +bones/64/rotation = Quaternion(0.670693, 0.0163391, -0.0185663, 0.741323) +bones/65/rotation = Quaternion(0.692499, 0.00330364, 0.00403917, 0.7214) +bones/66/rotation = Quaternion(-0.0684178, -0.72411, -0.0332339, 0.685477) +bones/67/position = Vector3(0.00715371, 0.0679859, -0.0481984) +bones/67/rotation = Quaternion(0.108364, -0.768224, 0.166291, 0.608635) +bones/68/rotation = Quaternion(0.629954, 0.0295149, 0.0177509, 0.775869) +bones/69/rotation = Quaternion(0.816678, -0.0439534, -0.0509861, 0.573155) +bones/70/rotation = Quaternion(-0.12906, -0.728937, 0.0250258, 0.67184) +bones/71/position = Vector3(0.127191, 1.35032, -0.02577) +bones/71/rotation = Quaternion(1.9622e-08, 0.608474, 0.793573, -4.62466e-08) +bones/72/position = Vector3(-0.113426, 1.35032, -0.02577) +bones/72/rotation = Quaternion(1.9623e-08, 0.608463, 0.793582, -4.62457e-08) [node name="Knight_02" parent="Rig/CharacterRig/GameRig/Skeleton3D" index="1"] visible = false @@ -68,17 +151,23 @@ visible = false visible = true [node name="RightHandBone" parent="Rig" index="2"] -transform = Transform3D(-0.962343, -0.270803, -0.0237131, 0.231269, -0.861444, 0.452138, -0.142868, 0.429628, 0.891632, -0.346578, 0.997949, 0.00158512) +transform = Transform3D(-0.962334, -0.270838, -0.0236795, 0.235311, -0.873384, 0.426415, -0.136171, 0.404782, 0.904217, -0.344367, 0.991801, -0.0106259) [node name="LeftHandBone" parent="Rig" index="3"] -transform = Transform3D(-0.970513, 0.239109, 0.0305225, -0.215283, -0.916755, 0.336472, 0.108435, 0.31998, 0.941198, 0.346901, 0.98305, -0.026914) +transform = Transform3D(-0.970516, 0.2391, 0.0304918, -0.217867, -0.924295, 0.313388, 0.103115, 0.297505, 0.949135, 0.346278, 0.977994, -0.0353943) -[node name="PlayerDetector" type="ShapeCast3D" parent="Rig"] +[node name="PlayerDetectorAttack" type="ShapeCast3D" parent="Rig"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1) shape = SubResource("CapsuleShape3D_ljmr7") target_position = Vector3(0, 0, 0) collision_mask = 4 +[node name="PlayerDetectorPursue" type="ShapeCast3D" parent="Rig"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1) +shape = SubResource("CylinderShape3D_fwei0") +target_position = Vector3(0, 0, 0) +collision_mask = 4 + [node name="AreaAttack" parent="Rig" instance=ExtResource("3_ljmr7")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1) collision_mask = 4 diff --git a/src/scenes/characters/player.tscn b/src/scenes/characters/player.tscn index 80cba33..83480fb 100644 --- a/src/scenes/characters/player.tscn +++ b/src/scenes/characters/player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=15 format=3 uid="uid://nsv4lbw7j8mi"] +[gd_scene load_steps=17 format=3 uid="uid://nsv4lbw7j8mi"] [ext_resource type="Script" uid="uid://csgybabwb8cbg" path="res://src/scripts/characters/player.gd" id="1_swhsd"] [ext_resource type="PackedScene" uid="uid://dw8f5oy13cdtx" path="res://src/scenes/characters/health_component.tscn" id="2_0xash"] @@ -15,6 +15,19 @@ script = ExtResource("2_ulq46") metadata/_custom_type_script = "uid://dwysfismpgq07" +[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_n7yyv"] +properties/0/path = NodePath(".:position") +properties/0/spawn = true +properties/0/replication_mode = 1 +properties/1/path = NodePath("RigPivot:rotation") +properties/1/spawn = true +properties/1/replication_mode = 1 +properties/2/path = NodePath("RigPivot/Rig/AnimationTree:parameters/MoveSpace/blend_position") +properties/2/spawn = true +properties/2/replication_mode = 1 + +[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_yal87"] + [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_yx56f"] [sub_resource type="SeparationRayShape3D" id="SeparationRayShape3D_swhsd"] @@ -26,6 +39,12 @@ collision_layer = 5 script = ExtResource("1_swhsd") stats = SubResource("Resource_wdvff") +[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="."] +replication_config = SubResource("SceneReplicationConfig_n7yyv") + +[node name="PlayerInput" type="MultiplayerSynchronizer" parent="."] +replication_config = SubResource("SceneReplicationConfig_yal87") + [node name="HealthComponent" parent="." node_paths=PackedStringArray("body") instance=ExtResource("2_0xash")] body = NodePath("..") @@ -51,53 +70,53 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0) [node name="Rig" parent="RigPivot" instance=ExtResource("3_n52bt")] [node name="Skeleton3D" parent="RigPivot/Rig/CharacterRig/GameRig" index="0"] -bones/0/position = Vector3(3.37508e-15, 0.891862, -0.0481736) +bones/0/position = Vector3(6.51628e-15, 0.905322, -0.0481736) bones/0/rotation = Quaternion(0.12582, 1.18262e-07, 1.49989e-08, 0.992053) bones/1/rotation = Quaternion(-0.0566577, -0.00072973, -0.0117082, 0.998325) bones/2/position = Vector3(3.20474e-09, 0.146689, -1.95578e-08) -bones/2/rotation = Quaternion(-0.00449009, -0.000459002, 0.00321567, 0.999985) +bones/2/rotation = Quaternion(0.00349197, -0.00032964, 0.00321261, 0.999989) bones/3/position = Vector3(-2.01263e-09, 0.202058, -2.51457e-08) -bones/3/rotation = Quaternion(-0.0995123, -0.000419335, 0.00851796, 0.995) +bones/3/rotation = Quaternion(-0.0916421, -0.000317015, 0.00852314, 0.995756) bones/4/position = Vector3(3.02934e-10, 0.0925562, 3.91155e-08) -bones/4/rotation = Quaternion(0.278904, 1.42911e-08, 9.58138e-08, 0.960319) +bones/4/rotation = Quaternion(0.272711, 1.5502e-08, 8.89817e-08, 0.962096) bones/5/rotation = Quaternion(-0.0948564, -2.80691e-14, -2.26155e-08, 0.995491) -bones/6/rotation = Quaternion(-0.153673, -1.17858e-07, -1.78885e-08, 0.988122) -bones/7/position = Vector3(-3.23587e-08, 0.891862, -0.0481735) +bones/6/rotation = Quaternion(-0.161659, -1.17055e-07, -2.28501e-08, 0.986847) +bones/7/position = Vector3(-2.49455e-08, 0.905321, -0.0481734) bones/7/rotation = Quaternion(-0.0863677, -0.751104, -0.383052, 0.530711) -bones/8/position = Vector3(-4.86593e-08, 0.891862, -0.0481735) +bones/8/position = Vector3(-2.74011e-08, 0.905321, -0.0481735) bones/8/rotation = Quaternion(-0.0863677, 0.751104, 0.383052, 0.530711) -bones/9/position = Vector3(0.131144, 0.958067, -0.0351291) -bones/9/rotation = Quaternion(0.992474, 0.021142, -0.0308232, 0.116611) +bones/9/position = Vector3(0.131144, 0.971526, -0.0351291) +bones/9/rotation = Quaternion(0.993781, 0.0204907, -0.0311309, 0.104929) bones/10/position = Vector3(-2.36129e-08, 0.26601, -2.14789e-08) bones/10/rotation = Quaternion(-3.13921e-08, -0.000695086, 1.20449e-08, 1) bones/11/position = Vector3(-4.6306e-08, 0.26601, 2.42145e-08) -bones/11/rotation = Quaternion(0.431734, -0.000700548, 0.000335439, 0.902) +bones/11/rotation = Quaternion(0.405182, -0.000697965, 0.000309493, 0.914236) bones/12/position = Vector3(3.05151e-08, 0.22603, 5.03768e-08) bones/12/rotation = Quaternion(-8.19226e-09, -0.00710644, 4.16102e-08, 0.999975) bones/13/position = Vector3(-2.95495e-08, 0.22603, 2.68392e-09) -bones/13/rotation = Quaternion(-0.756783, 0.0119047, 0.0244327, 0.653101) +bones/13/rotation = Quaternion(-0.745117, 0.0118616, 0.0243766, 0.666383) bones/14/position = Vector3(-3.05481e-08, 0.139877, 1.64787e-08) bones/14/rotation = Quaternion(-9.66743e-05, 0.967474, -0.252972, -0.000383447) -bones/15/position = Vector3(-0.131144, 0.958067, -0.0351291) -bones/15/rotation = Quaternion(0.972138, -0.00597952, 0.0271847, 0.232749) +bones/15/position = Vector3(-0.131144, 0.971526, -0.0351291) +bones/15/rotation = Quaternion(0.974794, -0.00547746, 0.0275337, 0.221332) bones/16/position = Vector3(-1.10042e-08, 0.265705, -3.31989e-08) bones/16/rotation = Quaternion(-3.43227e-08, 0.00314323, 8.33075e-10, 0.999995) bones/17/position = Vector3(1.83545e-08, 0.265705, 6.98543e-10) -bones/17/rotation = Quaternion(0.455056, 0.00335542, -0.00171483, 0.890455) +bones/17/rotation = Quaternion(0.430415, 0.00320978, -0.00153069, 0.902624) bones/18/position = Vector3(1.2807e-08, 0.225719, -8.28774e-09) bones/18/rotation = Quaternion(-2.29017e-08, -0.00785732, 3.30149e-08, 0.999969) bones/19/position = Vector3(-1.27748e-08, 0.225719, 1.12004e-08) -bones/19/rotation = Quaternion(-0.692156, -0.0282135, -0.000449152, 0.721196) +bones/19/rotation = Quaternion(-0.682144, -0.0281602, -0.00116479, 0.730674) bones/20/position = Vector3(-1.30142e-08, 0.139877, -2.77457e-09) bones/20/rotation = Quaternion(-9.96472e-05, 0.967461, -0.253021, -0.000383039) -bones/21/position = Vector3(0.0251286, 1.42316, 0.040874) -bones/21/rotation = Quaternion(-0.501707, -0.254446, -0.393926, 0.726891) -bones/22/position = Vector3(0.187412, 1.45863, -0.0286662) -bones/22/rotation = Quaternion(0.0606331, -0.158025, 0.973831, -0.151677) +bones/21/position = Vector3(0.0251286, 1.43512, 0.0454166) +bones/21/rotation = Quaternion(-0.478865, -0.263918, -0.410602, 0.729686) +bones/22/position = Vector3(0.190408, 1.47331, -0.0151183) +bones/22/rotation = Quaternion(0.0318981, -0.162427, 0.975195, -0.146953) bones/23/position = Vector3(-5.41331e-09, 0.143946, -2.98023e-08) -bones/23/rotation = Quaternion(7.97521e-08, -0.00786971, -1.50795e-08, 0.999969) +bones/23/rotation = Quaternion(7.42555e-09, -0.030569, 6.41867e-08, 0.999533) bones/24/position = Vector3(-6.33301e-08, 0.143946, 4.3873e-08) -bones/24/rotation = Quaternion(0.277839, -0.00675305, -0.016611, 0.96046) +bones/24/rotation = Quaternion(0.332279, -0.0305696, -0.0206956, 0.942458) bones/25/position = Vector3(1.30385e-08, 0.127601, 6.51926e-09) bones/25/rotation = Quaternion(1.49943e-07, -1.20606e-07, 9.91859e-08, 1) bones/26/position = Vector3(2.06034e-08, 0.127601, 2.42761e-08) @@ -122,14 +141,14 @@ bones/42/rotation = Quaternion(-0.120913, 0.799109, 0.0358921, 0.587807) bones/43/rotation = Quaternion(0.498693, -0.0202705, -0.0256953, 0.866161) bones/44/rotation = Quaternion(0.715385, 0.035306, 0.0573145, 0.695481) bones/45/rotation = Quaternion(-0.129059, 0.728936, -0.0250259, 0.67184) -bones/46/position = Vector3(-0.0113635, 1.42316, 0.040874) -bones/46/rotation = Quaternion(-0.527917, 0.201753, 0.357521, 0.743491) -bones/47/position = Vector3(-0.161977, 1.45794, -0.0515628) -bones/47/rotation = Quaternion(-0.101804, -0.132181, 0.97079, 0.172428) +bones/46/position = Vector3(-0.0113635, 1.43512, 0.0454166) +bones/46/rotation = Quaternion(-0.486181, 0.248047, 0.400116, 0.736212) +bones/47/position = Vector3(-0.173849, 1.47377, -0.0219916) +bones/47/rotation = Quaternion(-0.0352038, -0.143659, 0.975478, 0.162989) bones/48/position = Vector3(1.88476e-07, 0.143946, 1.02445e-08) -bones/48/rotation = Quaternion(-6.49339e-08, -0.0048348, -1.07477e-07, 0.999988) +bones/48/rotation = Quaternion(-1.29417e-07, 0.0407109, -6.52581e-08, 0.999171) bones/49/position = Vector3(6.5191e-09, 0.143946, -1.95094e-08) -bones/49/rotation = Quaternion(0.307483, -0.00462725, 0.0284921, 0.951116) +bones/49/rotation = Quaternion(0.370114, 0.0407114, 0.0286717, 0.927651) bones/50/position = Vector3(-1.48779e-07, 0.1276, 5.9139e-08) bones/50/rotation = Quaternion(-8.73115e-08, 2.7474e-08, -1.28057e-07, 1) bones/51/position = Vector3(1.9461e-07, 0.127601, 6.06248e-08) @@ -155,19 +174,19 @@ bones/67/rotation = Quaternion(0.108364, -0.768224, 0.166291, 0.608635) bones/68/rotation = Quaternion(0.629954, 0.0295149, 0.0177509, 0.775869) bones/69/rotation = Quaternion(0.816678, -0.0439534, -0.0509861, 0.573155) bones/70/rotation = Quaternion(-0.12906, -0.728937, 0.0250258, 0.67184) -bones/71/position = Vector3(0.127191, 1.34018, -0.0270091) -bones/71/rotation = Quaternion(1.89147e-08, 0.618777, 0.785567, -4.66285e-08) -bones/72/position = Vector3(-0.113426, 1.34018, -0.0270091) -bones/72/rotation = Quaternion(1.89148e-08, 0.618777, 0.785567, -4.66284e-08) +bones/71/position = Vector3(0.127191, 1.35516, -0.0251694) +bones/71/rotation = Quaternion(1.99367e-08, 0.603874, 0.79708, -4.60697e-08) +bones/72/position = Vector3(-0.113426, 1.35516, -0.0251694) +bones/72/rotation = Quaternion(1.99367e-08, 0.603874, 0.79708, -4.60696e-08) [node name="RightHandBone" parent="RigPivot/Rig" index="2"] -transform = Transform3D(-0.962416, -0.270569, -0.0234052, 0.247334, -0.908828, 0.335944, -0.112168, 0.317529, 0.941591, -0.335735, 0.971392, -0.0526208) +transform = Transform3D(-0.962343, -0.270802, -0.0237138, 0.22911, -0.854939, 0.46539, -0.146302, 0.442432, 0.884788, -0.347666, 1.00118, 0.00794098) [node name="LeftHandBone" parent="RigPivot/Rig" index="3"] -transform = Transform3D(-0.970321, 0.239754, 0.0315476, -0.226072, -0.945683, 0.233613, 0.0858439, 0.219548, 0.971817, 0.344388, 0.96235, -0.0640138) +transform = Transform3D(-0.970513, 0.239108, 0.0305211, -0.213886, -0.912613, 0.348413, 0.111162, 0.331611, 0.936844, 0.347219, 0.985729, -0.0225046) [node name="RayAttachment" type="BoneAttachment3D" parent="RigPivot/Rig"] -transform = Transform3D(-0.962416, -0.270569, -0.0234052, 0.247334, -0.908828, 0.335944, -0.112168, 0.317529, 0.941591, -0.335735, 0.971392, -0.0526208) +transform = Transform3D(-0.962343, -0.270802, -0.0237138, 0.22911, -0.854939, 0.46539, -0.146302, 0.442432, 0.884788, -0.347666, 1.00118, 0.00794098) bone_name = "DEF-hand.R" bone_idx = 51 use_external_skeleton = true @@ -199,10 +218,6 @@ player = NodePath("../..") [node name="UserInterface" parent="." node_paths=PackedStringArray("player") instance=ExtResource("9_wdvff")] player = NodePath("..") -[node name="InteractContainer" parent="UserInterface/HUD" index="1"] -visible = false -modulate = Color(1, 1, 1, 0) - [node name="Inventory" parent="UserInterface" index="1" node_paths=PackedStringArray("player")] player = NodePath("../..") diff --git a/src/scenes/levels/level.tscn b/src/scenes/levels/level.tscn index 0011286..1c120f1 100644 --- a/src/scenes/levels/level.tscn +++ b/src/scenes/levels/level.tscn @@ -2,8 +2,8 @@ [ext_resource type="Script" uid="uid://bmywk4wvcp0lr" path="res://addons/sky_3d/src/Sky3D.gd" id="1_1jhfv"] [ext_resource type="Texture2D" uid="uid://bpamrp14tk2cp" path="res://assets/textures/terrain/sand_albedo_height.png" id="1_7iny7"] -[ext_resource type="PackedScene" uid="uid://nsv4lbw7j8mi" path="res://src/scenes/characters/player.tscn" id="1_crbv0"] [ext_resource type="NavigationMesh" uid="uid://b6foidbd4r8qv" path="res://src/resources/level_navigation_mesh.res" id="1_juj6f"] +[ext_resource type="Script" uid="uid://dj5vsww5nehm7" path="res://src/scripts/levels/level.gd" id="1_m8n0u"] [ext_resource type="Texture2D" uid="uid://dpq5k4rlimus8" path="res://assets/textures/terrain/sand_normal_roughness.png" id="2_cxs0p"] [ext_resource type="PackedScene" uid="uid://b1fe4n68iivfm" path="res://assets/models/environment/rock_cliff_env_03.glb" id="2_d2tjv"] [ext_resource type="Script" uid="uid://27fj74ofndim" path="res://addons/sky_3d/src/Skydome.gd" id="2_juj6f"] @@ -131,6 +131,60 @@ sdfgi_enabled = true auto_exposure_scale = 0.2 [node name="Level" type="Node3D"] +script = ExtResource("1_m8n0u") + +[node name="FirePit" parent="." instance=ExtResource("10_juj6f")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 41.2201, 94.5773, -58.0352) + +[node name="Castle" type="Node3D" parent="."] + +[node name="wall_stone_gate_bldg_01" parent="Castle" instance=ExtResource("5_0eo66")] +transform = Transform3D(0.749869, 0, -0.661587, 0, 1, 0, 0.661587, 0, 0.749869, 27.1497, 94.5546, -36.3422) + +[node name="stone_wall_bldg_04" parent="Castle/wall_stone_gate_bldg_01" instance=ExtResource("6_dn2un")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.26476, 0, -0.0166817) + +[node name="stone_wall_bldg_05" parent="Castle/wall_stone_gate_bldg_01" instance=ExtResource("6_dn2un")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.7805, 0.0131226, -0.040226) + +[node name="stone_wall_bldg_06" parent="Castle/wall_stone_gate_bldg_01" instance=ExtResource("6_dn2un")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -11.8046, 0.0131226, -0.122562) + +[node name="stone_wall_bldg_07" parent="Castle/wall_stone_gate_bldg_01" instance=ExtResource("6_dn2un")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -19.7101, 0.0131226, -0.132374) + +[node name="stone_wall_bldg_08" parent="Castle/wall_stone_gate_bldg_01" instance=ExtResource("6_dn2un")] +transform = Transform3D(0.958048, 0, 0.286608, 0, 1, 0, -0.286608, 0, 0.958048, -26.8721, 0.0131226, 2.09649) + +[node name="turret_square_bldg_02" parent="Castle/wall_stone_gate_bldg_01" instance=ExtResource("7_7iny7")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -12.0896, -1, 0.0723419) + +[node name="turret_square_bldg_03" parent="Castle/wall_stone_gate_bldg_01" instance=ExtResource("7_7iny7")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.0602, -1, 0.465519) + +[node name="house_modular_01" parent="Castle" instance=ExtResource("8_cxs0p")] +transform = Transform3D(0.93598, 0, -0.352054, 0, 1, 0, 0.352054, 0, 0.93598, 45.6923, 94.5589, -70.1131) + +[node name="house_modular_02" parent="Castle" instance=ExtResource("8_cxs0p")] +transform = Transform3D(0.611071, 0, -0.791576, 0, 1, 0, 0.791576, 0, 0.611071, 55.9864, 94.5589, -60.0366) + +[node name="Interactible" type="Node3D" parent="."] + +[node name="Chest" parent="Interactible" instance=ExtResource("9_856t6")] +transform = Transform3D(0.478554, 0, 0.878058, 0, 1, 0, -0.878058, 0, 0.478554, 47.9001, 94.6013, -69.1724) + +[node name="CurrencyIcon" parent="Interactible/Chest" instance=ExtResource("10_vltgv")] +visible = false +value = 600 + +[node name="ArmorIcon" parent="Interactible/Chest" instance=ExtResource("11_b2fxt")] +visible = false +power = 10 +armor = 1 + +[node name="WeaponIcon" parent="Interactible/Chest" instance=ExtResource("12_htor1")] +visible = false +power = 12 [node name="NavigationRegion3D" type="NavigationRegion3D" parent="."] navigation_mesh = ExtResource("1_juj6f") @@ -142,59 +196,6 @@ assets = SubResource("Terrain3DAssets_vltgv") top_level = true metadata/_edit_lock_ = true -[node name="FirePit" parent="NavigationRegion3D" instance=ExtResource("10_juj6f")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 41.2201, 94.5773, -58.0352) - -[node name="Castle" type="Node3D" parent="NavigationRegion3D"] - -[node name="wall_stone_gate_bldg_01" parent="NavigationRegion3D/Castle" instance=ExtResource("5_0eo66")] -transform = Transform3D(0.749869, 0, -0.661587, 0, 1, 0, 0.661587, 0, 0.749869, 27.1497, 94.5546, -36.3422) - -[node name="stone_wall_bldg_04" parent="NavigationRegion3D/Castle/wall_stone_gate_bldg_01" instance=ExtResource("6_dn2un")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.26476, 0, -0.0166817) - -[node name="stone_wall_bldg_05" parent="NavigationRegion3D/Castle/wall_stone_gate_bldg_01" instance=ExtResource("6_dn2un")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.7805, 0.0131226, -0.040226) - -[node name="stone_wall_bldg_06" parent="NavigationRegion3D/Castle/wall_stone_gate_bldg_01" instance=ExtResource("6_dn2un")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -11.8046, 0.0131226, -0.122562) - -[node name="stone_wall_bldg_07" parent="NavigationRegion3D/Castle/wall_stone_gate_bldg_01" instance=ExtResource("6_dn2un")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -19.7101, 0.0131226, -0.132374) - -[node name="stone_wall_bldg_08" parent="NavigationRegion3D/Castle/wall_stone_gate_bldg_01" instance=ExtResource("6_dn2un")] -transform = Transform3D(0.958048, 0, 0.286608, 0, 1, 0, -0.286608, 0, 0.958048, -26.8721, 0.0131226, 2.09649) - -[node name="turret_square_bldg_02" parent="NavigationRegion3D/Castle/wall_stone_gate_bldg_01" instance=ExtResource("7_7iny7")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -12.0896, -1, 0.0723419) - -[node name="turret_square_bldg_03" parent="NavigationRegion3D/Castle/wall_stone_gate_bldg_01" instance=ExtResource("7_7iny7")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.0602, -1, 0.465519) - -[node name="house_modular_01" parent="NavigationRegion3D/Castle" instance=ExtResource("8_cxs0p")] -transform = Transform3D(0.93598, 0, -0.352054, 0, 1, 0, 0.352054, 0, 0.93598, 45.6923, 94.5589, -70.1131) - -[node name="house_modular_02" parent="NavigationRegion3D/Castle" instance=ExtResource("8_cxs0p")] -transform = Transform3D(0.611071, 0, -0.791576, 0, 1, 0, 0.791576, 0, 0.611071, 55.9864, 94.5589, -60.0366) - -[node name="Interactible" type="Node3D" parent="NavigationRegion3D"] - -[node name="Chest" parent="NavigationRegion3D/Interactible" instance=ExtResource("9_856t6")] -transform = Transform3D(0.478554, 0, 0.878058, 0, 1, 0, -0.878058, 0, 0.478554, 47.9001, 94.6013, -69.1724) - -[node name="CurrencyIcon" parent="NavigationRegion3D/Interactible/Chest" instance=ExtResource("10_vltgv")] -visible = false -value = 600 - -[node name="ArmorIcon" parent="NavigationRegion3D/Interactible/Chest" instance=ExtResource("11_b2fxt")] -visible = false -power = 10 -armor = 1 - -[node name="WeaponIcon" parent="NavigationRegion3D/Interactible/Chest" instance=ExtResource("12_htor1")] -visible = false -power = 12 - [node name="Sky3D" type="WorldEnvironment" parent="."] environment = SubResource("Environment_cxs0p") camera_attributes = SubResource("CameraAttributesPractical_0slur") @@ -323,9 +324,6 @@ latitude = 16.0 longitude = 108.0 utc = 7.0 -[node name="Player" parent="." instance=ExtResource("1_crbv0")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 40.8443, 95.6024, -61.289) - [node name="MapBoundary" type="Node3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 106.891, 0) @@ -395,3 +393,11 @@ transform = Transform3D(0.971759, 0, 0.235973, 0, 1, 0, -0.235973, 0, 0.971759, [node name="Water" parent="." instance=ExtResource("15_0slur")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 87.9142, 0) visible = false + +[node name="Players" type="Node3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 35.3396, 95.7805, -63.3113) + +[node name="MultiplayerSpawner" type="MultiplayerSpawner" parent="."] +_spawnable_scenes = PackedStringArray("uid://nsv4lbw7j8mi") +spawn_path = NodePath("../Players") +spawn_limit = 10 diff --git a/src/scenes/main.tscn b/src/scenes/main.tscn new file mode 100644 index 0000000..3d79b9f --- /dev/null +++ b/src/scenes/main.tscn @@ -0,0 +1,41 @@ +[gd_scene load_steps=2 format=3 uid="uid://cd3upe4xetlgl"] + +[ext_resource type="Script" uid="uid://b2ec1cajpfusg" path="res://src/scripts/network/multiplayer.gd" id="1_rr2wm"] + +[node name="Main" type="Node"] +script = ExtResource("1_rr2wm") + +[node name="Level" type="Node" parent="."] + +[node name="LevelSpawner" type="MultiplayerSpawner" parent="."] +_spawnable_scenes = PackedStringArray("uid://dw0lbkh31rofd") +spawn_path = NodePath("../Level") +spawn_limit = 1 + +[node name="UI" type="MarginContainer" parent="."] +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -22.0 +offset_top = -15.5 +offset_right = 22.0 +offset_bottom = 15.5 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="UI"] +layout_mode = 2 +theme_override_constants/separation = 16 + +[node name="Host" type="Button" parent="UI/VBoxContainer"] +layout_mode = 2 +text = "Host" + +[node name="Join" type="Button" parent="UI/VBoxContainer"] +layout_mode = 2 +text = "Join" + +[connection signal="pressed" from="UI/VBoxContainer/Host" to="." method="_on_host_pressed"] +[connection signal="pressed" from="UI/VBoxContainer/Join" to="." method="_on_join_pressed"] diff --git a/src/scenes/ui/inventory.tscn b/src/scenes/ui/inventory.tscn index 4e0d9de..864fcb6 100644 --- a/src/scenes/ui/inventory.tscn +++ b/src/scenes/ui/inventory.tscn @@ -110,7 +110,7 @@ stretch = true world_3d = SubResource("World3D_tfrle") transparent_bg = true handle_input_locally = false -size = Vector2i(512, 868) +size = Vector2i(512, 1228) render_target_update_mode = 4 [node name="Rig" parent="MarginContainer/VBoxContainer/HBoxContainer/SubViewportContainer/SubViewport" instance=ExtResource("5_dryat")] diff --git a/src/scenes/ui/loot_container.tscn b/src/scenes/ui/loot_container.tscn new file mode 100644 index 0000000..d90610f --- /dev/null +++ b/src/scenes/ui/loot_container.tscn @@ -0,0 +1,107 @@ +[gd_scene load_steps=10 format=3 uid="uid://b8r1w3tush5ue"] + +[ext_resource type="Script" uid="uid://depcr1bjlbfo4" path="res://src/scripts/ui/loot_container.gd" id="1_58h8c"] +[ext_resource type="StyleBox" uid="uid://copt367rq3lyr" path="res://src/resources/ui/ui_panel.tres" id="1_l6r4p"] +[ext_resource type="Texture2D" uid="uid://dhvatbbng4411" path="res://assets/ui/window/window_header.png" id="2_58h8c"] +[ext_resource type="FontFile" uid="uid://sua821wsaeli" path="res://assets/fonts/Candara_Bold.ttf" id="3_4ccu8"] +[ext_resource type="PackedScene" uid="uid://b35w0afp1fdpg" path="res://src/scenes/ui/item_icon.tscn" id="4_x354n"] +[ext_resource type="Texture2D" uid="uid://bhwo6wc0xooyv" path="res://assets/ui/button/button.png" id="5_8p2he"] +[ext_resource type="Texture2D" uid="uid://sy6pbgn2gaqq" path="res://assets/ui/button/button_press.png" id="6_us65b"] +[ext_resource type="Texture2D" uid="uid://xl4dmewy7fpf" path="res://assets/ui/button/button_hover.png" id="7_v4al2"] + +[sub_resource type="LabelSettings" id="LabelSettings_g5kcc"] +font = ExtResource("3_4ccu8") +font_size = 22 +shadow_color = Color(0, 0, 0, 1) + +[node name="LootContainer" type="CenterContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_58h8c") + +[node name="PanelContainer" type="PanelContainer" parent="."] +layout_mode = 2 +theme_override_styles/panel = ExtResource("1_l6r4p") + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer"] +layout_mode = 2 + +[node name="TitleTexture" type="TextureRect" parent="PanelContainer/VBoxContainer"] +layout_mode = 2 +texture = ExtResource("2_58h8c") +expand_mode = 5 + +[node name="Title" type="Label" parent="PanelContainer/VBoxContainer/TitleTexture"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +text = "Chest" +label_settings = SubResource("LabelSettings_g5kcc") +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="GridContainer" type="GridContainer" parent="PanelContainer/VBoxContainer"] +custom_minimum_size = Vector2(512, 256) +layout_mode = 2 +columns = 4 + +[node name="ItemIcon" parent="PanelContainer/VBoxContainer/GridContainer" instance=ExtResource("4_x354n")] +layout_mode = 2 + +[node name="ItemIcon2" parent="PanelContainer/VBoxContainer/GridContainer" instance=ExtResource("4_x354n")] +layout_mode = 2 + +[node name="ItemIcon3" parent="PanelContainer/VBoxContainer/GridContainer" instance=ExtResource("4_x354n")] +layout_mode = 2 + +[node name="ItemIcon4" parent="PanelContainer/VBoxContainer/GridContainer" instance=ExtResource("4_x354n")] +layout_mode = 2 + +[node name="ItemIcon5" parent="PanelContainer/VBoxContainer/GridContainer" instance=ExtResource("4_x354n")] +layout_mode = 2 + +[node name="ItemIcon6" parent="PanelContainer/VBoxContainer/GridContainer" instance=ExtResource("4_x354n")] +layout_mode = 2 + +[node name="ItemIcon7" parent="PanelContainer/VBoxContainer/GridContainer" instance=ExtResource("4_x354n")] +layout_mode = 2 + +[node name="ItemIcon8" parent="PanelContainer/VBoxContainer/GridContainer" instance=ExtResource("4_x354n")] +layout_mode = 2 + +[node name="CloseButton" type="TextureButton" parent="PanelContainer/VBoxContainer"] +custom_minimum_size = Vector2(200, 80) +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 4 +texture_normal = ExtResource("5_8p2he") +texture_pressed = ExtResource("6_us65b") +texture_hover = ExtResource("7_v4al2") +ignore_texture_size = true +stretch_mode = 4 + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/CloseButton"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -16.5 +offset_top = -8.5 +offset_right = 16.5 +offset_bottom = 8.5 +grow_horizontal = 2 +grow_vertical = 2 +text = "Close" +label_settings = SubResource("LabelSettings_g5kcc") +horizontal_alignment = 1 +vertical_alignment = 1 + +[connection signal="pressed" from="PanelContainer/VBoxContainer/CloseButton" to="." method="toggle_open"] diff --git a/src/scenes/ui/user_interface.tscn b/src/scenes/ui/user_interface.tscn index 777318e..a8d953c 100644 --- a/src/scenes/ui/user_interface.tscn +++ b/src/scenes/ui/user_interface.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=14 format=3 uid="uid://blex30jj7g55d"] +[gd_scene load_steps=15 format=3 uid="uid://blex30jj7g55d"] [ext_resource type="Texture2D" uid="uid://b7gexelwfg2wp" path="res://assets/ui/unitframe/health_bar_under.png" id="1_qhv2u"] [ext_resource type="Script" uid="uid://5d05pjburasd" path="res://src/scripts/ui/user_interface.gd" id="1_xba4v"] @@ -8,6 +8,7 @@ [ext_resource type="Texture2D" uid="uid://dn2npqh8ue3vy" path="res://assets/ui/unitframe/blue_bar.png" id="4_ma5hf"] [ext_resource type="FontFile" uid="uid://sua821wsaeli" path="res://assets/fonts/Candara_Bold.ttf" id="7_1j7ss"] [ext_resource type="PackedScene" uid="uid://csadps2at3npv" path="res://src/scenes/ui/inventory.tscn" id="7_70hpn"] +[ext_resource type="PackedScene" uid="uid://b8r1w3tush5ue" path="res://src/scenes/ui/loot_container.tscn" id="9_g5kcc"] [sub_resource type="LabelSettings" id="LabelSettings_xba4v"] font = ExtResource("3_nxqqf") @@ -16,9 +17,36 @@ font_color = Color(0.960784, 0.717647, 0.423529, 1) [sub_resource type="LabelSettings" id="LabelSettings_g5kcc"] font = ExtResource("7_1j7ss") -font_size = 36 +font_size = 22 shadow_color = Color(0, 0, 0, 1) +[sub_resource type="Animation" id="Animation_g5kcc"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("HUD/InteractContainer:visible") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("HUD/InteractContainer:modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(1, 1, 1, 0)] +} + [sub_resource type="Animation" id="Animation_1j7ss"] resource_name = "fade_out_text" length = 0.3 @@ -47,33 +75,6 @@ tracks/1/keys = { "values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0)] } -[sub_resource type="Animation" id="Animation_g5kcc"] -length = 0.001 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("HUD/InteractContainer:visible") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [false] -} -tracks/1/type = "value" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath("HUD/InteractContainer:modulate") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [Color(1, 1, 1, 0)] -} - [sub_resource type="AnimationLibrary" id="AnimationLibrary_71tnq"] _data = { &"RESET": SubResource("Animation_g5kcc"), @@ -176,12 +177,13 @@ modulate = Color(1, 1, 1, 0) custom_minimum_size = Vector2(512, 0) layout_mode = 2 size_flags_horizontal = 4 -size_flags_vertical = 8 +size_flags_vertical = 4 mouse_filter = 2 [node name="InteractLabel" type="Label" parent="HUD/InteractContainer"] unique_name_in_owner = true layout_mode = 2 +size_flags_horizontal = 8 text = "Open [E]" label_settings = SubResource("LabelSettings_g5kcc") horizontal_alignment = 1 @@ -195,3 +197,6 @@ libraries = { &"": SubResource("AnimationLibrary_71tnq") } autoplay = "RESET" + +[node name="LootContainer" parent="." instance=ExtResource("9_g5kcc")] +layout_mode = 1 diff --git a/src/scripts/characters/enemy.gd b/src/scripts/characters/enemy.gd index d9733be..81bf65d 100644 --- a/src/scripts/characters/enemy.gd +++ b/src/scripts/characters/enemy.gd @@ -1,6 +1,13 @@ class_name Enemy extends CharacterBody3D const RUN_VELOCITY_THRESHOLD: float = 2.0 +enum State { + IDLE, + PURSUE +} + +var player: Player +var current_state = State.IDLE @export var max_health: float = 20.0 @export var xp_value: int = 30 @@ -12,11 +19,13 @@ const RUN_VELOCITY_THRESHOLD: float = 2.0 @onready var rig: Node3D = $Rig @onready var health_component: HealthComponent = $HealthComponent @onready var collision_shape: CollisionShape3D = $CollisionShape3D -@onready var player_detector: ShapeCast3D = $Rig/PlayerDetector +@onready var player_detector_pursue: ShapeCast3D = $Rig/PlayerDetectorPursue +@onready var player_detector_attack: ShapeCast3D = $Rig/PlayerDetectorAttack +@onready var timer: Timer = $Timer @onready var area_attack: ShapeCast3D = $Rig/AreaAttack -@onready var player: Player = get_tree().get_first_node_in_group("Player") @onready var navigation_agent: NavigationAgent3D = $NavigationAgent3D + func _ready() -> void: var mesh = rig.villager_meshes.pick_random() rig.set_active_mesh(mesh) @@ -24,8 +33,18 @@ func _ready() -> void: health_component.update_max_health(max_health) func _physics_process(delta: float) -> void: + match current_state: + State.IDLE: + if check_for_player(): + current_state = State.PURSUE + State.PURSUE: + if !check_for_player(): + current_state = State.IDLE + var velocity_target: Vector3 = Vector3.ZERO - navigation_agent.target_position = player.global_position + + if player: + navigation_agent.target_position = player.global_position if rig.is_idle(): check_for_attacks() @@ -38,9 +57,19 @@ func _physics_process(delta: float) -> void: navigation_agent.velocity = velocity_target +func check_for_player() -> bool: + for collision_id in player_detector_pursue.get_collision_count(): + var collider = player_detector_pursue.get_collider(collision_id) + if collider is Player: + timer.start(5) + player = collider + return true + player = null + return false + func check_for_attacks() -> void: - for collision_id in player_detector.get_collision_count(): - var collider = player_detector.get_collider(collision_id) + for collision_id in player_detector_attack.get_collision_count(): + var collider = player_detector_attack.get_collider(collision_id) if collider is Player: rig.playback.travel("Overhead") navigation_agent.avoidance_mask = 0 diff --git a/src/scripts/characters/interaction_cast.gd b/src/scripts/characters/interaction_cast.gd index dfae05e..4f8bd47 100644 --- a/src/scripts/characters/interaction_cast.gd +++ b/src/scripts/characters/interaction_cast.gd @@ -9,3 +9,4 @@ func check_interactions() -> void: ui.update_interact_text("Open [E]") if Input.is_action_just_pressed("interact"): print(collider.get_items()) + ui.loot_container.toggle_open() diff --git a/src/scripts/characters/player.gd b/src/scripts/characters/player.gd index 92ece43..685dd32 100644 --- a/src/scripts/characters/player.gd +++ b/src/scripts/characters/player.gd @@ -16,6 +16,7 @@ var _attack_direction: Vector3 = Vector3.ZERO @export_category("RPG Stats") @export var stats: CharacterStats +@onready var camera: Camera3D = $Boom/Camera @onready var horizontal_pivot: Node3D = $HorizontalPivot @onready var vertical_pivot: Node3D = $HorizontalPivot/VerticalPivot @onready var rig_pivot: Node3D = $RigPivot @@ -27,7 +28,12 @@ var _attack_direction: Vector3 = Vector3.ZERO @onready var ui: Control = $UserInterface @onready var interaction_cast: ShapeCast3D = $RigPivot/InteractionCast +func _enter_tree() -> void: + set_multiplayer_authority(name.to_int()) + func _ready() -> void: + camera.current = is_multiplayer_authority() + Input.mouse_mode = Input.MOUSE_MODE_CAPTURED health_component.update_max_health(stats.get_max_hp()) stats.level_up_notification.connect( @@ -37,6 +43,9 @@ func _ready() -> void: ui.update_stats_display() func _physics_process(delta: float) -> void: + if not is_multiplayer_authority(): + return + frame_camera_rotation() var direction := get_movement_direction() rig.update_animation_tree(direction) @@ -56,6 +65,9 @@ func _physics_process(delta: float) -> void: move_and_slide() func _unhandled_input(event: InputEvent) -> void: + if not is_multiplayer_authority(): + return + if event.is_action_pressed("ui_cancel"): Input.mouse_mode = Input.MOUSE_MODE_VISIBLE diff --git a/src/scripts/levels/level.gd b/src/scripts/levels/level.gd new file mode 100644 index 0000000..f23925e --- /dev/null +++ b/src/scripts/levels/level.gd @@ -0,0 +1,34 @@ +extends Node3D + +func _ready() -> void: + if not multiplayer.is_server(): + return + + multiplayer.peer_connected.connect(add_player) + multiplayer.peer_disconnected.connect(del_player) + + # Spawn already connected players. + for id in multiplayer.get_peers(): + add_player(id) + + # Spawn the local player unless this is a dedicated server export. + if not OS.has_feature("dedicated_server"): + add_player(1) + +func _exit_tree(): + if not multiplayer.is_server(): + return + multiplayer.peer_connected.disconnect(add_player) + multiplayer.peer_disconnected.disconnect(del_player) + + +func add_player(id: int): + var character = preload("res://src/scenes/characters/player.tscn").instantiate() + character.name = str(id) + $Players.add_child(character, true) + + +func del_player(id: int): + if not $Players.has_node(str(id)): + return + $Players.get_node(str(id)).queue_free() diff --git a/src/scripts/levels/level.gd.uid b/src/scripts/levels/level.gd.uid new file mode 100644 index 0000000..a6c646a --- /dev/null +++ b/src/scripts/levels/level.gd.uid @@ -0,0 +1 @@ +uid://dj5vsww5nehm7 diff --git a/src/scripts/network/lobby.gd b/src/scripts/network/lobby.gd new file mode 100644 index 0000000..c049549 --- /dev/null +++ b/src/scripts/network/lobby.gd @@ -0,0 +1,110 @@ +extends Node + +# Autoload named Lobby + +# These signals can be connected to by a UI lobby scene or the game scene. +signal player_connected(peer_id, player_info) +signal player_disconnected(peer_id) +signal server_disconnected + +const PORT = 7000 +const DEFAULT_SERVER_IP = "127.0.0.1" # IPv4 localhost +const MAX_CONNECTIONS = 20 + +# This will contain player info for every player, +# with the keys being each player's unique IDs. +var players = {} + +# This is the local player info. This should be modified locally +# before the connection is made. It will be passed to every other peer. +# For example, the value of "name" can be set to something the player +# entered in a UI scene. +var player_info = {"name": "Name"} + +var players_loaded = 0 + + + +func _ready(): + multiplayer.peer_connected.connect(_on_player_connected) + multiplayer.peer_disconnected.connect(_on_player_disconnected) + multiplayer.connected_to_server.connect(_on_connected_ok) + multiplayer.connection_failed.connect(_on_connected_fail) + multiplayer.server_disconnected.connect(_on_server_disconnected) + + +func join_game(address = ""): + if address.is_empty(): + address = DEFAULT_SERVER_IP + var peer = ENetMultiplayerPeer.new() + var error = peer.create_client(address, PORT) + if error: + return error + multiplayer.multiplayer_peer = peer + + +func create_game(): + var peer = ENetMultiplayerPeer.new() + var error = peer.create_server(PORT, MAX_CONNECTIONS) + if error: + return error + multiplayer.multiplayer_peer = peer + + players[1] = player_info + player_connected.emit(1, player_info) + + +func remove_multiplayer_peer(): + multiplayer.multiplayer_peer = null + players.clear() + + +# When the server decides to start the game from a UI scene, +# do Lobby.load_game.rpc(filepath) +@rpc("call_local", "reliable") +func load_game(game_scene_path): + get_tree().change_scene_to_file(game_scene_path) + + +# Every peer will call this when they have loaded the game scene. +@rpc("any_peer", "call_local", "reliable") +func player_loaded(): + if multiplayer.is_server(): + players_loaded += 1 + if players_loaded == players.size(): + $/root/Game.start_game() + players_loaded = 0 + + +# When a peer connects, send them my player info. +# This allows transfer of all desired data for each player, not only the unique ID. +func _on_player_connected(id): + _register_player.rpc_id(id, player_info) + + +@rpc("any_peer", "reliable") +func _register_player(new_player_info): + var new_player_id = multiplayer.get_remote_sender_id() + players[new_player_id] = new_player_info + player_connected.emit(new_player_id, new_player_info) + + +func _on_player_disconnected(id): + players.erase(id) + player_disconnected.emit(id) + + +func _on_connected_ok(): + var peer_id = multiplayer.get_unique_id() + players[peer_id] = player_info + player_connected.emit(peer_id, player_info) + + +func _on_connected_fail(): + multiplayer.multiplayer_peer = null + + +func _on_server_disconnected(): + multiplayer.multiplayer_peer = null + players.clear() + server_disconnected.emit() \ No newline at end of file diff --git a/src/scripts/network/lobby.gd.uid b/src/scripts/network/lobby.gd.uid new file mode 100644 index 0000000..738fd15 --- /dev/null +++ b/src/scripts/network/lobby.gd.uid @@ -0,0 +1 @@ +uid://dasxx01bb21uk diff --git a/src/scripts/network/multiplayer.gd b/src/scripts/network/multiplayer.gd new file mode 100644 index 0000000..484fe1f --- /dev/null +++ b/src/scripts/network/multiplayer.gd @@ -0,0 +1,32 @@ +extends Node + +func _on_host_pressed() -> void: + var peer = ENetMultiplayerPeer.new() + var error = peer.create_server(1027) + if error: + print(error) + multiplayer.multiplayer_peer = peer + start_game() + +func _on_join_pressed() -> void: + var peer = ENetMultiplayerPeer.new() + var error = peer.create_client("127.0.0.1", 1027) + if error: + print(error) + multiplayer.multiplayer_peer = peer + start_game() + +func start_game() -> void: + $UI.hide() + get_tree().paused = false + + if multiplayer.is_server(): + change_level.call_deferred(load("res://src/scenes/levels/level.tscn")) + +func change_level(scene: PackedScene) -> void: + var level = $Level + for c in level.get_children(): + level.remove_child(c) + c.queue_free() + + level.add_child(scene.instantiate()) diff --git a/src/scripts/network/multiplayer.gd.uid b/src/scripts/network/multiplayer.gd.uid new file mode 100644 index 0000000..dbe2ebe --- /dev/null +++ b/src/scripts/network/multiplayer.gd.uid @@ -0,0 +1 @@ +uid://b2ec1cajpfusg diff --git a/src/scripts/ui/loot_container.gd b/src/scripts/ui/loot_container.gd new file mode 100644 index 0000000..26f1fc8 --- /dev/null +++ b/src/scripts/ui/loot_container.gd @@ -0,0 +1,11 @@ +extends CenterContainer + +func _ready() -> void: + visible = false + +func toggle_open() -> void: + visible = !visible + if visible: + Input.mouse_mode = Input.MOUSE_MODE_VISIBLE + else: + Input.mouse_mode = Input.MOUSE_MODE_CAPTURED diff --git a/src/scripts/ui/loot_container.gd.uid b/src/scripts/ui/loot_container.gd.uid new file mode 100644 index 0000000..752a5e4 --- /dev/null +++ b/src/scripts/ui/loot_container.gd.uid @@ -0,0 +1 @@ +uid://depcr1bjlbfo4 diff --git a/src/scripts/ui/user_interface.gd b/src/scripts/ui/user_interface.gd index caf445a..0fbc2b4 100644 --- a/src/scripts/ui/user_interface.gd +++ b/src/scripts/ui/user_interface.gd @@ -7,6 +7,7 @@ extends Control @onready var inventory: Control = $Inventory @onready var animation_player: AnimationPlayer = $AnimationPlayer @onready var interact_label: Label = %InteractLabel +@onready var loot_container: CenterContainer = $LootContainer @export var player: Player