More work on multiplayer and first pass of the trap icons

This commit is contained in:
2025-12-11 11:40:26 -05:00
parent c6da8344a4
commit 0451361af8
37 changed files with 495 additions and 71 deletions

BIN
external/trap icons.clip vendored Normal file

Binary file not shown.

BIN
external/trap icons.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

4
models/floor.mtl Normal file
View File

@@ -0,0 +1,4 @@
# Made in Blockbench 5.0.4
newmtl m_1239a932-4b3f-9954-06c2-b2a7f82dfbff
map_Kd floor.png
newmtl none

15
models/floor.obj Normal file
View File

@@ -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

25
models/floor.obj.import Normal file
View File

@@ -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

View File

Before

Width:  |  Height:  |  Size: 606 B

After

Width:  |  Height:  |  Size: 606 B

View File

@@ -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]

4
models/half wall.mtl Normal file
View File

@@ -0,0 +1,4 @@
# Made in Blockbench 5.0.4
newmtl m_1239a932-4b3f-9954-06c2-b2a7f82dfbff
map_Kd tile.png
newmtl none

15
models/half wall.obj Normal file
View File

@@ -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

View File

@@ -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

BIN
models/half wall.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1004 B

View File

@@ -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

4
models/surface ramp.mtl Normal file
View File

@@ -0,0 +1,4 @@
# Made in Blockbench 5.0.4
newmtl m_1239a932-4b3f-9954-06c2-b2a7f82dfbff
map_Kd tile.png
newmtl none

15
models/surface ramp.obj Normal file
View File

@@ -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

View File

@@ -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

View File

@@ -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

4
models/wall ramp.mtl Normal file
View File

@@ -0,0 +1,4 @@
# Made in Blockbench 5.0.4
newmtl m_1239a932-4b3f-9954-06c2-b2a7f82dfbff
map_Kd tile.png
newmtl none

13
models/wall ramp.obj Normal file
View File

@@ -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

View File

@@ -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

4
models/wall.mtl Normal file
View File

@@ -0,0 +1,4 @@
# Made in Blockbench 5.0.4
newmtl m_1239a932-4b3f-9954-06c2-b2a7f82dfbff
map_Kd floor.png
newmtl none

15
models/wall.obj Normal file
View File

@@ -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

25
models/wall.obj.import Normal file
View File

@@ -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

BIN
models/wall.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 552 B

41
models/wall.png.import Normal file
View File

@@ -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

View File

@@ -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={

View File

@@ -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"]

View File

@@ -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="."]

View File

@@ -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"]

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

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

View File

@@ -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

View File

@@ -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

View File

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

9
templates/camera.tscn Normal file
View File

@@ -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")