diff --git a/project.godot b/project.godot index b3f560a..bc8bc9b 100644 --- a/project.godot +++ b/project.godot @@ -17,6 +17,7 @@ config/icon="res://visuals/images/icon.svg" [autoload] Game="*res://scripts/autos/game.gd" +Multiplayer="*res://scripts/autos/multiplayer.gd" [display] diff --git a/scenes/multiplayer_setup.tscn b/scenes/multiplayer_setup.tscn index 4c8e233..8ba550c 100644 --- a/scenes/multiplayer_setup.tscn +++ b/scenes/multiplayer_setup.tscn @@ -12,7 +12,6 @@ grow_vertical = 2 script = ExtResource("1_lckj3") [node name="Panel" type="PanelContainer" parent="."] -visible = false custom_minimum_size = Vector2(400, 400) layout_mode = 1 anchors_preset = 8 @@ -45,6 +44,7 @@ text = "Back" [node name="Hosting" type="VBoxContainer" parent="Panel"] unique_name_in_owner = true +visible = false layout_mode = 2 alignment = 1 @@ -60,7 +60,7 @@ layout_mode = 2 layout_mode = 2 text = "Handle" -[node name="HandleEdit" type="TextEdit" parent="Panel/Hosting/HBoxContainer"] +[node name="HostHandle" type="TextEdit" parent="Panel/Hosting/HBoxContainer"] unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 3 @@ -87,7 +87,8 @@ horizontal_alignment = 1 [node name="PanelContainer" type="PanelContainer" parent="Panel/Host Waiting"] layout_mode = 2 -[node name="TextEdit" type="RichTextLabel" parent="Panel/Host Waiting/PanelContainer"] +[node name="ParticipantsText" type="RichTextLabel" parent="Panel/Host Waiting/PanelContainer"] +unique_name_in_owner = true custom_minimum_size = Vector2(0, 70) layout_mode = 2 size_flags_horizontal = 3 @@ -121,7 +122,8 @@ layout_mode = 2 layout_mode = 2 text = "HANDLE" -[node name="TextEdit" type="TextEdit" parent="Panel/Joining/HBoxContainer"] +[node name="JoinHandle" type="TextEdit" parent="Panel/Joining/HBoxContainer"] +unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 3 diff --git a/scenes/multiplayer_test.tscn b/scenes/multiplayer_test.tscn index 1a9837d..abd711e 100644 --- a/scenes/multiplayer_test.tscn +++ b/scenes/multiplayer_test.tscn @@ -1,30 +1,21 @@ -[gd_scene load_steps=9 format=3 uid="uid://ti65jukt8gvs"] +[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="Script" uid="uid://wpjuowslx60b" path="res://scripts/multiplayer_controller.gd" id="4_q2h5d"] +[ext_resource type="PackedScene" uid="uid://cqe6hkn2oncpc" path="res://templates/multiplayer_pc.tscn" id="4_q2h5d"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_gbhdq"] albedo_texture = ExtResource("2_02mmr") uv1_scale = Vector3(100, 100, 100) texture_filter = 0 -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_y646j"] -albedo_color = Color(0.08468992, 0.08468992, 0.08468992, 1) - -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_lnbra"] -albedo_color = Color(0, 1, 1, 1) - -[sub_resource type="BoxShape3D" id="BoxShape3D_6emce"] -size = Vector3(0.75, 2, 0.75) - [node name="Node3D" type="Node3D"] [node name="CanvasLayer" type="CanvasLayer" parent="."] layer = 1000 -[node name="Control" parent="CanvasLayer" instance=ExtResource("1_q2h5d")] +[node name="HUD" parent="CanvasLayer" instance=ExtResource("1_q2h5d")] [node name="CSGBox3D" type="CSGBox3D" parent="."] size = Vector3(100, 1, 100) @@ -36,25 +27,8 @@ projection = 1 size = 5.0 script = ExtResource("3_qfwdi") -[node name="Node3D" type="CharacterBody3D" parent="."] +[node name="MultiplayerPC" parent="." instance=ExtResource("4_q2h5d")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0) -script = ExtResource("4_q2h5d") -speed = 5.0 - -[node name="Body" type="CSGBox3D" parent="Node3D"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) -size = Vector3(0.75, 2, 0.75) -material = SubResource("StandardMaterial3D_y646j") - -[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Node3D/Body"] -transform = Transform3D(1, 0, 0, 0, -4.371139e-08, -1, 0, 1, -4.371139e-08, 0, 0.5, 0.556) -radius = 0.3 -height = 0.1 -material = SubResource("StandardMaterial3D_lnbra") - -[node name="CollisionShape3D" type="CollisionShape3D" parent="Node3D"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) -shape = SubResource("BoxShape3D_6emce") [node name="OmniLight3D" type="OmniLight3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 18.508709, 0) diff --git a/scripts/autos/multiplayer.gd b/scripts/autos/multiplayer.gd index 4a0d07e..35e808f 100644 --- a/scripts/autos/multiplayer.gd +++ b/scripts/autos/multiplayer.gd @@ -3,28 +3,48 @@ extends Node const SERVER_PORT = 8080 const SERVER_IP = "127.0.0.1" +var handle : String +var id : int +var players : Dictionary = {} func become_host() -> void: print("Starting host!") var server_peer = ENetMultiplayerPeer.new() server_peer.create_server(SERVER_PORT) - + players[handle] = 1 multiplayer.multiplayer_peer = server_peer - + 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() -> void: +func join_game(handle : String) -> Error: print("Player 2 joining.") var client_peer = ENetMultiplayerPeer.new() - client_peer.create_client(SERVER_IP, SERVER_PORT) - + 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() + 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 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("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 diff --git a/scripts/multiplayer_controller.gd b/scripts/multiplayer_controller.gd index f0b7dbd..7fbfd90 100644 --- a/scripts/multiplayer_controller.gd +++ b/scripts/multiplayer_controller.gd @@ -1,4 +1,4 @@ -class_name MultiplayerPlayer extends Player +class_name MultiplayerPC extends Player @export var player_id := 1 : set(id): diff --git a/scripts/multiplayer_setup.gd b/scripts/multiplayer_setup.gd index 05db7df..3c56731 100644 --- a/scripts/multiplayer_setup.gd +++ b/scripts/multiplayer_setup.gd @@ -1,7 +1,7 @@ extends Control var host : bool - +var handle : String func _on_host_game_button_pressed() -> void: %Menu.visible = false %Hosting.visible = true @@ -19,10 +19,17 @@ func _on_menu_back_button_pressed() -> void: func _on_start_hosting_button_pressed() -> void: + var host_name = %HostHandle.text + if len(host_name) < 3: + return + handle = host_name + Multiplayer.handle = handle #Validate entries %Hosting.visible = false #Set fields + %ParticipantsText.text = "[color=FFFF00]*%s (HOST)[/color]\n" % handle %"Host Waiting".visible = true + Multiplayer.become_host() func _on_hosting_back_button_pressed() -> void: @@ -43,10 +50,15 @@ func _on_waiting_back_button_pressed() -> void: func _on_join_button_pressed() -> void: + var host_name = %JoinHandle.text + if len(host_name) < 3: + return + handle = host_name #Check for valid game #If found %Joining.visible = false - %"Host Waiting".visible = true + if Multiplayer.join_game(handle): + %"Host Waiting".visible = true func _on_joining_back_button_pressed() -> void: diff --git a/templates/multiplayer_pc.tscn b/templates/multiplayer_pc.tscn new file mode 100644 index 0000000..03270cc --- /dev/null +++ b/templates/multiplayer_pc.tscn @@ -0,0 +1,31 @@ +[gd_scene load_steps=5 format=3 uid="uid://cqe6hkn2oncpc"] + +[ext_resource type="Script" uid="uid://wpjuowslx60b" path="res://scripts/multiplayer_controller.gd" id="1_avlqc"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_y646j"] +albedo_color = Color(0.08468992, 0.08468992, 0.08468992, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_lnbra"] +albedo_color = Color(0, 1, 1, 1) + +[sub_resource type="BoxShape3D" id="BoxShape3D_6emce"] +size = Vector3(0.75, 2, 0.75) + +[node name="MultiplayerPC" type="CharacterBody3D"] +script = ExtResource("1_avlqc") +speed = 5.0 + +[node name="Body" type="CSGBox3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +size = Vector3(0.75, 2, 0.75) +material = SubResource("StandardMaterial3D_y646j") + +[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Body"] +transform = Transform3D(1, 0, 0, 0, -4.371139e-08, -1, 0, 1, -4.371139e-08, 0, 0.5, 0.556) +radius = 0.3 +height = 0.1 +material = SubResource("StandardMaterial3D_lnbra") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("BoxShape3D_6emce")