diff --git a/external/trap icons.clip b/external/trap icons.clip new file mode 100644 index 0000000..d26f51e Binary files /dev/null and b/external/trap icons.clip differ diff --git a/external/trap icons.png b/external/trap icons.png new file mode 100644 index 0000000..2b74979 Binary files /dev/null and b/external/trap icons.png differ diff --git a/models/floor.mtl b/models/floor.mtl new file mode 100644 index 0000000..6c817c2 --- /dev/null +++ b/models/floor.mtl @@ -0,0 +1,4 @@ +# Made in Blockbench 5.0.4 +newmtl m_1239a932-4b3f-9954-06c2-b2a7f82dfbff +map_Kd floor.png +newmtl none \ No newline at end of file diff --git a/models/floor.obj b/models/floor.obj new file mode 100644 index 0000000..73a4c9c --- /dev/null +++ b/models/floor.obj @@ -0,0 +1,15 @@ +# Made in Blockbench 5.0.4 +mtllib floor.mtl + +o plane +v -0.5 0 0.5 +v -0.5 0 -0.5 +v 0.5 0 0.5 +v 0.5 0 -0.5 +vt 1 0 +vt 1 1 +vt 0 1 +vt 0 0 +vn 0 1 0 +usemtl m_1239a932-4b3f-9954-06c2-b2a7f82dfbff +f 3/1/1 4/2/1 2/3/1 1/4/1 \ No newline at end of file diff --git a/models/floor.obj.import b/models/floor.obj.import new file mode 100644 index 0000000..b2343db --- /dev/null +++ b/models/floor.obj.import @@ -0,0 +1,25 @@ +[remap] + +importer="wavefront_obj" +importer_version=1 +type="Mesh" +uid="uid://bgcoelpongpsi" +path="res://.godot/imported/floor.obj-a982712ee394f542e990a04cd0fb8372.mesh" + +[deps] + +files=["res://.godot/imported/floor.obj-a982712ee394f542e990a04cd0fb8372.mesh"] + +source_file="res://models/floor.obj" +dest_files=["res://.godot/imported/floor.obj-a982712ee394f542e990a04cd0fb8372.mesh", "res://.godot/imported/floor.obj-a982712ee394f542e990a04cd0fb8372.mesh"] + +[params] + +generate_tangents=true +generate_lods=true +generate_shadow_mesh=true +generate_lightmap_uv2=false +generate_lightmap_uv2_texel_size=0.2 +scale_mesh=Vector3(1, 1, 1) +offset_mesh=Vector3(0, 0, 0) +force_disable_mesh_compression=false diff --git a/visuals/textures/tile.png b/models/floor.png similarity index 100% rename from visuals/textures/tile.png rename to models/floor.png diff --git a/visuals/textures/tile.png.import b/models/floor.png.import similarity index 77% rename from visuals/textures/tile.png.import rename to models/floor.png.import index c77f305..d5fc81f 100644 --- a/visuals/textures/tile.png.import +++ b/models/floor.png.import @@ -3,7 +3,7 @@ importer="texture" type="CompressedTexture2D" uid="uid://bj07x13pkoevk" -path.s3tc="res://.godot/imported/tile.png-82ac121192f8645b1b55058345db6f74.s3tc.ctex" +path.s3tc="res://.godot/imported/floor.png-fce038e62681eaa93c5bed78391af64f.s3tc.ctex" metadata={ "imported_formats": ["s3tc_bptc"], "vram_texture": true @@ -11,8 +11,8 @@ metadata={ [deps] -source_file="res://visuals/textures/tile.png" -dest_files=["res://.godot/imported/tile.png-82ac121192f8645b1b55058345db6f74.s3tc.ctex"] +source_file="res://models/floor.png" +dest_files=["res://.godot/imported/floor.png-fce038e62681eaa93c5bed78391af64f.s3tc.ctex"] [params] diff --git a/models/half wall.mtl b/models/half wall.mtl new file mode 100644 index 0000000..fe7c41e --- /dev/null +++ b/models/half wall.mtl @@ -0,0 +1,4 @@ +# Made in Blockbench 5.0.4 +newmtl m_1239a932-4b3f-9954-06c2-b2a7f82dfbff +map_Kd tile.png +newmtl none \ No newline at end of file diff --git a/models/half wall.obj b/models/half wall.obj new file mode 100644 index 0000000..d18ced1 --- /dev/null +++ b/models/half wall.obj @@ -0,0 +1,15 @@ +# Made in Blockbench 5.0.4 +mtllib half wall.mtl + +o plane +v -0.5 0 0.5 +v -0.5 0 -0.5 +v -0.5 0.5 -0.5 +v -0.5 0.5 0.5 +vt 1 2.220446049250313e-16 +vt 0.9999999999999999 0.5000000000000001 +vt 2.7755575615628914e-17 0.5 +vt 5.551115123125783e-17 0 +vn -1 0 0 +usemtl m_1239a932-4b3f-9954-06c2-b2a7f82dfbff +f 1/1/1 4/2/1 3/3/1 2/4/1 \ No newline at end of file diff --git a/models/half wall.obj.import b/models/half wall.obj.import new file mode 100644 index 0000000..ef9bcac --- /dev/null +++ b/models/half wall.obj.import @@ -0,0 +1,25 @@ +[remap] + +importer="wavefront_obj" +importer_version=1 +type="Mesh" +uid="uid://bdlh65yngwppe" +path="res://.godot/imported/half wall.obj-41a26390d6a35c1525227e7c6ed0d125.mesh" + +[deps] + +files=["res://.godot/imported/half wall.obj-41a26390d6a35c1525227e7c6ed0d125.mesh"] + +source_file="res://models/half wall.obj" +dest_files=["res://.godot/imported/half wall.obj-41a26390d6a35c1525227e7c6ed0d125.mesh", "res://.godot/imported/half wall.obj-41a26390d6a35c1525227e7c6ed0d125.mesh"] + +[params] + +generate_tangents=true +generate_lods=true +generate_shadow_mesh=true +generate_lightmap_uv2=false +generate_lightmap_uv2_texel_size=0.2 +scale_mesh=Vector3(1, 1, 1) +offset_mesh=Vector3(0, 0, 0) +force_disable_mesh_compression=false diff --git a/models/half wall.png b/models/half wall.png new file mode 100644 index 0000000..72754b3 Binary files /dev/null and b/models/half wall.png differ diff --git a/models/half wall.png.import b/models/half wall.png.import new file mode 100644 index 0000000..de3c0f0 --- /dev/null +++ b/models/half wall.png.import @@ -0,0 +1,41 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cp7arlwfx8j2m" +path.s3tc="res://.godot/imported/half wall.png-f0428df792f60cce8be234049c673993.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://models/half wall.png" +dest_files=["res://.godot/imported/half wall.png-f0428df792f60cce8be234049c673993.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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 diff --git a/models/surface ramp.mtl b/models/surface ramp.mtl new file mode 100644 index 0000000..fe7c41e --- /dev/null +++ b/models/surface ramp.mtl @@ -0,0 +1,4 @@ +# Made in Blockbench 5.0.4 +newmtl m_1239a932-4b3f-9954-06c2-b2a7f82dfbff +map_Kd tile.png +newmtl none \ No newline at end of file diff --git a/models/surface ramp.obj b/models/surface ramp.obj new file mode 100644 index 0000000..5164e75 --- /dev/null +++ b/models/surface ramp.obj @@ -0,0 +1,15 @@ +# Made in Blockbench 5.0.4 +mtllib surface ramp.mtl + +o plane +v 0.5 1 0.5 +v 0.5 0 -0.5 +v -0.5 1 0.5 +v -0.5 0 -0.5 +vt 1 0 +vt 1 1 +vt 0 1 +vt 0 0 +vn 0 0.7071067811865476 -0.7071067811865476 +usemtl m_1239a932-4b3f-9954-06c2-b2a7f82dfbff +f 1/1/1 2/2/1 4/3/1 3/4/1 \ No newline at end of file diff --git a/models/surface ramp.obj.import b/models/surface ramp.obj.import new file mode 100644 index 0000000..de733e2 --- /dev/null +++ b/models/surface ramp.obj.import @@ -0,0 +1,25 @@ +[remap] + +importer="wavefront_obj" +importer_version=1 +type="Mesh" +uid="uid://b0ncck5nm0k2j" +path="res://.godot/imported/surface ramp.obj-fadb0e0ae0ce6d2d2d467486b6f6d1f2.mesh" + +[deps] + +files=["res://.godot/imported/surface ramp.obj-fadb0e0ae0ce6d2d2d467486b6f6d1f2.mesh"] + +source_file="res://models/surface ramp.obj" +dest_files=["res://.godot/imported/surface ramp.obj-fadb0e0ae0ce6d2d2d467486b6f6d1f2.mesh", "res://.godot/imported/surface ramp.obj-fadb0e0ae0ce6d2d2d467486b6f6d1f2.mesh"] + +[params] + +generate_tangents=true +generate_lods=true +generate_shadow_mesh=true +generate_lightmap_uv2=false +generate_lightmap_uv2_texel_size=0.2 +scale_mesh=Vector3(1, 1, 1) +offset_mesh=Vector3(0, 0, 0) +force_disable_mesh_compression=false diff --git a/models/test level library.tres b/models/test level library.tres new file mode 100644 index 0000000..db37239 --- /dev/null +++ b/models/test level library.tres @@ -0,0 +1,36 @@ +[gd_resource type="MeshLibrary" load_steps=5 format=3 uid="uid://ckbu303p2nxn5"] + +[ext_resource type="ArrayMesh" uid="uid://bgcoelpongpsi" path="res://models/floor.obj" id="1_7lhuo"] +[ext_resource type="ArrayMesh" uid="uid://b0ncck5nm0k2j" path="res://models/surface ramp.obj" id="1_mwwlt"] +[ext_resource type="ArrayMesh" uid="uid://c8lfqeb71okli" path="res://models/wall ramp.obj" id="3_hmdv5"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_de6bv"] + +[resource] +item/0/name = "floor" +item/0/mesh = ExtResource("1_7lhuo") +item/0/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/0/mesh_cast_shadow = 1 +item/0/shapes = [SubResource("BoxShape3D_de6bv"), Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)] +item/0/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/0/navigation_layers = 1 +item/1/name = "wall" +item/1/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/1/mesh_cast_shadow = 1 +item/1/shapes = [] +item/1/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/1/navigation_layers = 1 +item/2/name = "surface ramp" +item/2/mesh = ExtResource("1_mwwlt") +item/2/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/2/mesh_cast_shadow = 1 +item/2/shapes = [] +item/2/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/2/navigation_layers = 1 +item/3/name = "wall ramp" +item/3/mesh = ExtResource("3_hmdv5") +item/3/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/3/mesh_cast_shadow = 1 +item/3/shapes = [] +item/3/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/3/navigation_layers = 1 diff --git a/models/wall ramp.mtl b/models/wall ramp.mtl new file mode 100644 index 0000000..fe7c41e --- /dev/null +++ b/models/wall ramp.mtl @@ -0,0 +1,4 @@ +# Made in Blockbench 5.0.4 +newmtl m_1239a932-4b3f-9954-06c2-b2a7f82dfbff +map_Kd tile.png +newmtl none \ No newline at end of file diff --git a/models/wall ramp.obj b/models/wall ramp.obj new file mode 100644 index 0000000..01105ca --- /dev/null +++ b/models/wall ramp.obj @@ -0,0 +1,13 @@ +# Made in Blockbench 5.0.4 +mtllib wall ramp.mtl + +o plane +v -0.5 1 0.5 +v -0.5 0 0.5 +v -0.5 0 -0.5 +vt 0.9999999999999998 1 +vt 5.551115123125783e-17 0 +vt 1 2.220446049250313e-16 +vn -1 0 0 +usemtl m_1239a932-4b3f-9954-06c2-b2a7f82dfbff +f 1/1/1 3/2/1 2/3/1 \ No newline at end of file diff --git a/models/wall ramp.obj.import b/models/wall ramp.obj.import new file mode 100644 index 0000000..87f9c1d --- /dev/null +++ b/models/wall ramp.obj.import @@ -0,0 +1,25 @@ +[remap] + +importer="wavefront_obj" +importer_version=1 +type="Mesh" +uid="uid://c8lfqeb71okli" +path="res://.godot/imported/wall ramp.obj-3a1cb40ca13f447b9b1491344be122bb.mesh" + +[deps] + +files=["res://.godot/imported/wall ramp.obj-3a1cb40ca13f447b9b1491344be122bb.mesh"] + +source_file="res://models/wall ramp.obj" +dest_files=["res://.godot/imported/wall ramp.obj-3a1cb40ca13f447b9b1491344be122bb.mesh", "res://.godot/imported/wall ramp.obj-3a1cb40ca13f447b9b1491344be122bb.mesh"] + +[params] + +generate_tangents=true +generate_lods=true +generate_shadow_mesh=true +generate_lightmap_uv2=false +generate_lightmap_uv2_texel_size=0.2 +scale_mesh=Vector3(1, 1, 1) +offset_mesh=Vector3(0, 0, 0) +force_disable_mesh_compression=false diff --git a/models/wall.mtl b/models/wall.mtl new file mode 100644 index 0000000..6c817c2 --- /dev/null +++ b/models/wall.mtl @@ -0,0 +1,4 @@ +# Made in Blockbench 5.0.4 +newmtl m_1239a932-4b3f-9954-06c2-b2a7f82dfbff +map_Kd floor.png +newmtl none \ No newline at end of file diff --git a/models/wall.obj b/models/wall.obj new file mode 100644 index 0000000..46883af --- /dev/null +++ b/models/wall.obj @@ -0,0 +1,15 @@ +# Made in Blockbench 5.0.4 +mtllib wall.mtl + +o plane +v -0.5 0 0.5 +v -0.5 0 -0.5 +v 0.5 0 0.5 +v 0.5 0 -0.5 +vt 1 0 +vt 1 1 +vt 0 1 +vt 0 0 +vn 0 1 0 +usemtl m_1239a932-4b3f-9954-06c2-b2a7f82dfbff +f 3/1/1 4/2/1 2/3/1 1/4/1 \ No newline at end of file diff --git a/models/wall.obj.import b/models/wall.obj.import new file mode 100644 index 0000000..45deee0 --- /dev/null +++ b/models/wall.obj.import @@ -0,0 +1,25 @@ +[remap] + +importer="wavefront_obj" +importer_version=1 +type="Mesh" +uid="uid://c0v6cd31gcxlx" +path="res://.godot/imported/wall.obj-cefac5221396f2fb0e7167019735085e.mesh" + +[deps] + +files=["res://.godot/imported/wall.obj-cefac5221396f2fb0e7167019735085e.mesh"] + +source_file="res://models/wall.obj" +dest_files=["res://.godot/imported/wall.obj-cefac5221396f2fb0e7167019735085e.mesh", "res://.godot/imported/wall.obj-cefac5221396f2fb0e7167019735085e.mesh"] + +[params] + +generate_tangents=true +generate_lods=true +generate_shadow_mesh=true +generate_lightmap_uv2=false +generate_lightmap_uv2_texel_size=0.2 +scale_mesh=Vector3(1, 1, 1) +offset_mesh=Vector3(0, 0, 0) +force_disable_mesh_compression=false diff --git a/models/wall.png b/models/wall.png new file mode 100644 index 0000000..ba6ba7b Binary files /dev/null and b/models/wall.png differ diff --git a/models/wall.png.import b/models/wall.png.import new file mode 100644 index 0000000..47b631d --- /dev/null +++ b/models/wall.png.import @@ -0,0 +1,41 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d4jdkdo5abpa6" +path.s3tc="res://.godot/imported/wall.png-25654285618308238afdf997a0e87649.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://models/wall.png" +dest_files=["res://.godot/imported/wall.png-25654285618308238afdf997a0e87649.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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 diff --git a/project.godot b/project.godot index bc8bc9b..31d233e 100644 --- a/project.godot +++ b/project.godot @@ -23,11 +23,17 @@ Multiplayer="*res://scripts/autos/multiplayer.gd" window/size/viewport_width=1920 window/size/viewport_height=1080 +window/size/initial_position_type=0 [dotnet] project/assembly_name="Trap Gunner" +[global_group] + +level_spawner="" +scenes="" + [input] ui_menu={ diff --git a/scenes/multiplayer_setup.tscn b/scenes/multiplayer_setup.tscn index 8ba550c..48556a6 100644 --- a/scenes/multiplayer_setup.tscn +++ b/scenes/multiplayer_setup.tscn @@ -2,16 +2,21 @@ [ext_resource type="Script" uid="uid://dep7nr2nkdmga" path="res://scripts/multiplayer_setup.gd" id="1_lckj3"] -[node name="Multiplayer Setup" type="Control"] +[node name="MultiplayerSetup" type="MultiplayerSpawner" groups=["level_spawner"]] +_spawnable_scenes = PackedStringArray("uid://ti65jukt8gvs") +spawn_path = NodePath(".") +script = ExtResource("1_lckj3") + +[node name="Setup" type="Control" parent="." groups=["scenes"]] +unique_name_in_owner = true layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -script = ExtResource("1_lckj3") -[node name="Panel" type="PanelContainer" parent="."] +[node name="Panel" type="PanelContainer" parent="Setup"] custom_minimum_size = Vector2(400, 400) layout_mode = 1 anchors_preset = 8 @@ -26,68 +31,68 @@ offset_bottom = 200.0 grow_horizontal = 2 grow_vertical = 2 -[node name="Menu" type="VBoxContainer" parent="Panel"] +[node name="Menu" type="VBoxContainer" parent="Setup/Panel"] unique_name_in_owner = true layout_mode = 2 -[node name="HostButton" type="Button" parent="Panel/Menu"] +[node name="HostButton" type="Button" parent="Setup/Panel/Menu"] layout_mode = 2 text = "Host Match" -[node name="JoinButton" type="Button" parent="Panel/Menu"] +[node name="JoinButton" type="Button" parent="Setup/Panel/Menu"] layout_mode = 2 text = "Join Match" -[node name="BackButton" type="Button" parent="Panel/Menu"] +[node name="BackButton" type="Button" parent="Setup/Panel/Menu"] layout_mode = 2 text = "Back" -[node name="Hosting" type="VBoxContainer" parent="Panel"] +[node name="Hosting" type="VBoxContainer" parent="Setup/Panel"] unique_name_in_owner = true visible = false layout_mode = 2 alignment = 1 -[node name="Label" type="Label" parent="Panel/Hosting"] +[node name="Label" type="Label" parent="Setup/Panel/Hosting"] layout_mode = 2 text = "HOSTING MATCH" horizontal_alignment = 1 -[node name="HBoxContainer" type="HBoxContainer" parent="Panel/Hosting"] +[node name="HBoxContainer" type="HBoxContainer" parent="Setup/Panel/Hosting"] layout_mode = 2 -[node name="Label" type="Label" parent="Panel/Hosting/HBoxContainer"] +[node name="Label" type="Label" parent="Setup/Panel/Hosting/HBoxContainer"] layout_mode = 2 text = "Handle" -[node name="HostHandle" type="TextEdit" parent="Panel/Hosting/HBoxContainer"] +[node name="HostHandle" type="TextEdit" parent="Setup/Panel/Hosting/HBoxContainer"] unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 3 -[node name="HostButton" type="Button" parent="Panel/Hosting"] +[node name="HostButton" type="Button" parent="Setup/Panel/Hosting"] layout_mode = 2 text = "HOST" -[node name="BackButton" type="Button" parent="Panel/Hosting"] +[node name="BackButton" type="Button" parent="Setup/Panel/Hosting"] layout_mode = 2 text = "Back" -[node name="Host Waiting" type="VBoxContainer" parent="Panel"] +[node name="Host Waiting" type="VBoxContainer" parent="Setup/Panel"] unique_name_in_owner = true visible = false layout_mode = 2 alignment = 1 -[node name="Label" type="Label" parent="Panel/Host Waiting"] +[node name="Label" type="Label" parent="Setup/Panel/Host Waiting"] layout_mode = 2 text = "WAITING FOR OPPONENT" horizontal_alignment = 1 -[node name="PanelContainer" type="PanelContainer" parent="Panel/Host Waiting"] +[node name="PanelContainer" type="PanelContainer" parent="Setup/Panel/Host Waiting"] layout_mode = 2 -[node name="ParticipantsText" type="RichTextLabel" parent="Panel/Host Waiting/PanelContainer"] +[node name="ParticipantsText" type="RichTextLabel" parent="Setup/Panel/Host Waiting/PanelContainer"] unique_name_in_owner = true custom_minimum_size = Vector2(0, 70) layout_mode = 2 @@ -96,62 +101,64 @@ bbcode_enabled = true text = "[b]*YOU (Host)[/b] [color=\"FFFF00\"]*THEM (Opponent)[/color]" -[node name="StartButton" type="Button" parent="Panel/Host Waiting"] +[node name="StartButton" type="Button" parent="Setup/Panel/Host Waiting"] +unique_name_in_owner = true layout_mode = 2 +disabled = true text = "START" -[node name="BackButton" type="Button" parent="Panel/Host Waiting"] +[node name="ExitButton" type="Button" parent="Setup/Panel/Host Waiting"] layout_mode = 2 -text = "Back" +text = "EXIT" -[node name="Joining" type="VBoxContainer" parent="Panel"] +[node name="Joining" type="VBoxContainer" parent="Setup/Panel"] unique_name_in_owner = true visible = false layout_mode = 2 alignment = 1 -[node name="Label" type="Label" parent="Panel/Joining"] +[node name="Label" type="Label" parent="Setup/Panel/Joining"] layout_mode = 2 text = "JOINING MATCH" horizontal_alignment = 1 -[node name="HBoxContainer" type="HBoxContainer" parent="Panel/Joining"] +[node name="HBoxContainer" type="HBoxContainer" parent="Setup/Panel/Joining"] layout_mode = 2 -[node name="Label" type="Label" parent="Panel/Joining/HBoxContainer"] +[node name="Label" type="Label" parent="Setup/Panel/Joining/HBoxContainer"] layout_mode = 2 text = "HANDLE" -[node name="JoinHandle" type="TextEdit" parent="Panel/Joining/HBoxContainer"] +[node name="JoinHandle" type="TextEdit" parent="Setup/Panel/Joining/HBoxContainer"] unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 3 -[node name="HBoxContainer2" type="HBoxContainer" parent="Panel/Joining"] +[node name="HBoxContainer2" type="HBoxContainer" parent="Setup/Panel/Joining"] layout_mode = 2 -[node name="Label" type="Label" parent="Panel/Joining/HBoxContainer2"] +[node name="Label" type="Label" parent="Setup/Panel/Joining/HBoxContainer2"] layout_mode = 2 text = "MATCH CODE" -[node name="TextEdit" type="TextEdit" parent="Panel/Joining/HBoxContainer2"] +[node name="TextEdit" type="TextEdit" parent="Setup/Panel/Joining/HBoxContainer2"] layout_mode = 2 size_flags_horizontal = 3 -[node name="JoinButton" type="Button" parent="Panel/Joining"] +[node name="JoinButton" type="Button" parent="Setup/Panel/Joining"] layout_mode = 2 -text = "HOST" +text = "JOIN" -[node name="BackButton" type="Button" parent="Panel/Joining"] +[node name="BackButton" type="Button" parent="Setup/Panel/Joining"] layout_mode = 2 text = "Back" -[connection signal="pressed" from="Panel/Menu/HostButton" to="." method="_on_host_game_button_pressed"] -[connection signal="pressed" from="Panel/Menu/JoinButton" to="." method="_on_join_game_button_pressed"] -[connection signal="pressed" from="Panel/Menu/BackButton" to="." method="_on_menu_back_button_pressed"] -[connection signal="pressed" from="Panel/Hosting/HostButton" to="." method="_on_start_hosting_button_pressed"] -[connection signal="pressed" from="Panel/Hosting/BackButton" to="." method="_on_hosting_back_button_pressed"] -[connection signal="pressed" from="Panel/Host Waiting/StartButton" to="." method="_on_start_game_button_pressed"] -[connection signal="pressed" from="Panel/Host Waiting/BackButton" to="." method="_on_waiting_back_button_pressed"] -[connection signal="pressed" from="Panel/Joining/JoinButton" to="." method="_on_join_button_pressed"] -[connection signal="pressed" from="Panel/Joining/BackButton" to="." method="_on_joining_back_button_pressed"] +[connection signal="pressed" from="Setup/Panel/Menu/HostButton" to="." method="_on_host_game_button_pressed"] +[connection signal="pressed" from="Setup/Panel/Menu/JoinButton" to="." method="_on_join_game_button_pressed"] +[connection signal="pressed" from="Setup/Panel/Menu/BackButton" to="." method="_on_menu_back_button_pressed"] +[connection signal="pressed" from="Setup/Panel/Hosting/HostButton" to="." method="_on_start_hosting_button_pressed"] +[connection signal="pressed" from="Setup/Panel/Hosting/BackButton" to="." method="_on_hosting_back_button_pressed"] +[connection signal="pressed" from="Setup/Panel/Host Waiting/StartButton" to="." method="_on_start_game_button_pressed"] +[connection signal="pressed" from="Setup/Panel/Host Waiting/ExitButton" to="." method="_on_waiting_back_button_pressed"] +[connection signal="pressed" from="Setup/Panel/Joining/JoinButton" to="." method="_on_join_button_pressed"] +[connection signal="pressed" from="Setup/Panel/Joining/BackButton" to="." method="_on_joining_back_button_pressed"] diff --git a/scenes/multiplayer_test.tscn b/scenes/multiplayer_test.tscn index abd711e..4431949 100644 --- a/scenes/multiplayer_test.tscn +++ b/scenes/multiplayer_test.tscn @@ -1,16 +1,17 @@ [gd_scene load_steps=6 format=3 uid="uid://ti65jukt8gvs"] [ext_resource type="PackedScene" uid="uid://bgocskbofewsr" path="res://templates/HUD.tscn" id="1_q2h5d"] -[ext_resource type="Texture2D" uid="uid://bj07x13pkoevk" path="res://visuals/textures/tile.png" id="2_02mmr"] -[ext_resource type="Script" uid="uid://cymi1n4gavixy" path="res://scripts/level_camera.gd" id="3_qfwdi"] -[ext_resource type="PackedScene" uid="uid://cqe6hkn2oncpc" path="res://templates/multiplayer_pc.tscn" id="4_q2h5d"] +[ext_resource type="Script" uid="uid://ccj72thiebvx8" path="res://scripts/multiplayer_level.gd" id="1_qfwdi"] +[ext_resource type="Texture2D" uid="uid://bj07x13pkoevk" path="res://models/floor.png" id="2_02mmr"] +[ext_resource type="Script" uid="uid://nn76jlxer5qb" path="res://scripts/multiplayer_spawner.gd" id="5_02mmr"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_gbhdq"] albedo_texture = ExtResource("2_02mmr") uv1_scale = Vector3(100, 100, 100) texture_filter = 0 -[node name="Node3D" type="Node3D"] +[node name="MultiplayerTest" type="Node3D"] +script = ExtResource("1_qfwdi") [node name="CanvasLayer" type="CanvasLayer" parent="."] layer = 1000 @@ -21,22 +22,25 @@ layer = 1000 size = Vector3(100, 1, 100) material = SubResource("StandardMaterial3D_gbhdq") -[node name="Camera3D" type="Camera3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 0.49999997, 0.86602545, 0, -0.86602545, 0.49999997, 0, 18.855, 9.603047) -projection = 1 -size = 5.0 -script = ExtResource("3_qfwdi") - -[node name="MultiplayerPC" parent="." instance=ExtResource("4_q2h5d")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0) - [node name="OmniLight3D" type="OmniLight3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 18.508709, 0) omni_range = 25.142 omni_attenuation = -0.165 -[node name="MultiplayerSpawner" type="MultiplayerSpawner" parent="."] +[node name="Spawner" type="MultiplayerSpawner" parent="." groups=["spawner"]] +unique_name_in_owner = true spawn_path = NodePath("../Players") spawn_limit = 2 +script = ExtResource("5_02mmr") + +[node name="SpawnPoints" type="Node" parent="Spawner"] + +[node name="Node3D" type="Node3D" parent="Spawner/SpawnPoints"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 19.415695, 0, 0) + +[node name="Node3D2" type="Node3D" parent="Spawner/SpawnPoints"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.23061, 0, 0) [node name="Players" type="Node3D" parent="."] + +[node name="GridMap" type="GridMap" parent="."] diff --git a/scenes/test_level.tscn b/scenes/test_level.tscn index 7aca6a8..d219c1c 100644 --- a/scenes/test_level.tscn +++ b/scenes/test_level.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=9 format=3 uid="uid://by6suwmds7xq2"] [ext_resource type="PackedScene" uid="uid://bgocskbofewsr" path="res://templates/HUD.tscn" id="1_x4b8f"] -[ext_resource type="Texture2D" uid="uid://bj07x13pkoevk" path="res://visuals/textures/tile.png" id="2_tmr53"] +[ext_resource type="Texture2D" uid="uid://bj07x13pkoevk" path="res://models/floor.png" id="2_tmr53"] [ext_resource type="Script" uid="uid://cymi1n4gavixy" path="res://scripts/level_camera.gd" id="3_qcd3b"] [ext_resource type="Script" uid="uid://bcs7ygh6s3l35" path="res://scripts/player.gd" id="4_88ety"] diff --git a/scripts/autos/game.gd b/scripts/autos/game.gd index a839353..9589bcc 100644 --- a/scripts/autos/game.gd +++ b/scripts/autos/game.gd @@ -1,4 +1,14 @@ extends Node +const vs_man_level = preload("res://scenes/multiplayer_test.tscn") + var player : Player + + +func start_vs_man() -> void: + var setup = get_tree().get_first_node_in_group("scenes") + setup.queue_free() + var level = vs_man_level.instantiate() + var spawner = get_tree().get_first_node_in_group("level_spawner") as MultiplayerSpawner + spawner.add_child(level) diff --git a/scripts/autos/multiplayer.gd b/scripts/autos/multiplayer.gd index 35e808f..fd0b187 100644 --- a/scripts/autos/multiplayer.gd +++ b/scripts/autos/multiplayer.gd @@ -6,6 +6,7 @@ const SERVER_IP = "127.0.0.1" var handle : String var id : int var players : Dictionary = {} +signal client_added(handle : String, id : int) func become_host() -> void: print("Starting host!") @@ -14,37 +15,43 @@ func become_host() -> void: server_peer.create_server(SERVER_PORT) players[handle] = 1 multiplayer.multiplayer_peer = server_peer + id = multiplayer.get_unique_id() print("%s %d t" % [handle, multiplayer.get_unique_id()]) multiplayer.peer_connected.connect(_add_player_to_game) multiplayer.peer_disconnected.connect(_remove_player_from_game) -func join_game(handle : String) -> Error: +func join_game(new_handle : String) -> Error: print("Player 2 joining.") var client_peer = ENetMultiplayerPeer.new() var error = client_peer.create_client(SERVER_IP, SERVER_PORT) multiplayer.multiplayer_peer = client_peer - - var p = multiplayer.get_unique_id() - var is_host = multiplayer.is_server() + handle = new_handle + id = multiplayer.get_unique_id() if !error: print("%s %d" % [handle, multiplayer.get_unique_id()]) - rpc_id(1, "receive_peer_handle",multiplayer.get_unique_id(), handle ) return !error + + func _add_player_to_game(id : int) -> void: print("Player %s joined the game!" % id) - players[handle] = id + await get_tree().create_timer(0.5).timeout + get_handle_from_peer(id) func _remove_player_from_game(id : int) -> void: print("Player %s left the game!" % id) -@rpc("any_peer") func get_handle_from_peer(peer_id) -> void: - rpc_id(peer_id, "receive_peer_handle", id, handle) + rpc_id(peer_id, "report_handle_to_peer", id) @rpc("any_peer", "call_remote") func receive_peer_handle(peer_id, peer_handle) -> void: print("Player %s identified as %s!" % [peer_id, peer_handle]) players[peer_handle] = peer_id + client_added.emit(peer_handle, peer_id) + +@rpc("any_peer", "call_remote") +func report_handle_to_peer(peer_id : int) -> void: + rpc_id(peer_id, "receive_peer_handle", multiplayer.get_unique_id(), handle) diff --git a/scripts/multiplayer_controller.gd b/scripts/multiplayer_controller.gd index 7fbfd90..ae2715f 100644 --- a/scripts/multiplayer_controller.gd +++ b/scripts/multiplayer_controller.gd @@ -5,8 +5,12 @@ class_name MultiplayerPC extends Player player_id = id func _enter_tree() -> void: - Game.player = self + #Game.player = self + pass +func setup(id) -> void: + player_id = id + func _physics_process(delta: float) -> void: var dir = Input.get_vector("west", "east", "north", "south") dir = Vector3(dir.x, 0, dir.y) diff --git a/scripts/multiplayer_level.gd b/scripts/multiplayer_level.gd new file mode 100644 index 0000000..1790384 --- /dev/null +++ b/scripts/multiplayer_level.gd @@ -0,0 +1,13 @@ +extends Node3D + +const multiplayer_pc_template = preload("res://templates/multiplayer_pc.tscn") +const camera_template = preload("res://templates/camera.tscn") +@onready var spawner = %Spawner +func _ready() -> void: + print("LEVEL LOADING, ID: " + str(Multiplayer.id)) + for key in Multiplayer.players.values(): + var pc = multiplayer_pc_template.instantiate() + pc.setup(key) + spawner.add_player(pc) + var camera = camera_template.instantiate() + add_child(camera) diff --git a/scripts/multiplayer_level.gd.uid b/scripts/multiplayer_level.gd.uid new file mode 100644 index 0000000..ebd2780 --- /dev/null +++ b/scripts/multiplayer_level.gd.uid @@ -0,0 +1 @@ +uid://ccj72thiebvx8 diff --git a/scripts/multiplayer_setup.gd b/scripts/multiplayer_setup.gd index 3c56731..85cc7ad 100644 --- a/scripts/multiplayer_setup.gd +++ b/scripts/multiplayer_setup.gd @@ -1,7 +1,11 @@ -extends Control +extends MultiplayerSpawner var host : bool var handle : String + +func _ready() -> void: + Multiplayer.client_added.connect(_on_client_added) + func _on_host_game_button_pressed() -> void: %Menu.visible = false %Hosting.visible = true @@ -38,7 +42,7 @@ func _on_hosting_back_button_pressed() -> void: func _on_start_game_button_pressed() -> void: - Game.start_vs_com() + Game.start_vs_man() func _on_waiting_back_button_pressed() -> void: @@ -59,8 +63,12 @@ func _on_join_button_pressed() -> void: %Joining.visible = false if Multiplayer.join_game(handle): %"Host Waiting".visible = true - + %StartButton.visible = false func _on_joining_back_button_pressed() -> void: %Joining.visible = false %Menu.visible = true + +func _on_client_added(peer_handle : String, peer_id : int) -> void: + %ParticipantsText.text = "[color=FFFF00][b]*%s[/b][/color]\n[color=FFFFFF]*%s[/color]" % [handle, peer_handle] + %StartButton.disabled = false diff --git a/scripts/multiplayer_spawner.gd b/scripts/multiplayer_spawner.gd new file mode 100644 index 0000000..6962f77 --- /dev/null +++ b/scripts/multiplayer_spawner.gd @@ -0,0 +1,18 @@ +extends MultiplayerSpawner + + +var spawn_points : Array = [] + +func _enter_tree() -> void: + spawn_points = $SpawnPoints.get_children() + +func add_player(player : MultiplayerPC) -> void: + add_child(player) + if player.player_id == 1: + player.global_position = spawn_points[0].global_position + if Multiplayer.multiplayer.is_server(): + Game.player = player + else: + player.global_position = spawn_points[1].global_position + if !Multiplayer.multiplayer.is_server(): + Game.player = player diff --git a/scripts/multiplayer_spawner.gd.uid b/scripts/multiplayer_spawner.gd.uid new file mode 100644 index 0000000..34972be --- /dev/null +++ b/scripts/multiplayer_spawner.gd.uid @@ -0,0 +1 @@ +uid://nn76jlxer5qb diff --git a/templates/camera.tscn b/templates/camera.tscn new file mode 100644 index 0000000..afcc272 --- /dev/null +++ b/templates/camera.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=2 format=3 uid="uid://cqa0p34mbk6so"] + +[ext_resource type="Script" uid="uid://cymi1n4gavixy" path="res://scripts/level_camera.gd" id="1_ysaec"] + +[node name="Camera" type="Camera3D"] +transform = Transform3D(1, 0, 0, 0, 0.49999997, 0.86602545, 0, -0.86602545, 0.49999997, 0, 0, 0) +projection = 1 +size = 5.0 +script = ExtResource("1_ysaec")