diff --git a/GameManager.gd b/GameManager.gd new file mode 100644 index 0000000..ac6a62e --- /dev/null +++ b/GameManager.gd @@ -0,0 +1,11 @@ +extends Node +var players = {} + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + pass diff --git a/Multiplayer.tscn b/Multiplayer.tscn new file mode 100644 index 0000000..1f9682e --- /dev/null +++ b/Multiplayer.tscn @@ -0,0 +1,55 @@ +[gd_scene load_steps=2 format=3 uid="uid://c0tixmwdmp28k"] + +[ext_resource type="Script" path="res://MultiplayerController.gd" id="1_i2fn6"] + +[node name="Control" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_i2fn6") + +[node name="Host" type="Button" parent="."] +layout_mode = 0 +offset_right = 8.0 +offset_bottom = 8.0 +text = "Host +" + +[node name="Join" type="Button" parent="."] +offset_left = 5.0 +offset_top = 33.0 +offset_right = 43.0 +offset_bottom = 64.0 +text = "Join" + +[node name="Start" type="Button" parent="."] +offset_left = 5.0 +offset_top = 95.0 +offset_right = 51.0 +offset_bottom = 126.0 +text = "Start" + +[node name="Nickname" type="TextEdit" parent="."] +layout_mode = 0 +offset_left = 26.0 +offset_top = 138.0 +offset_right = 378.0 +offset_bottom = 170.0 +placeholder_text = "nickname" + +[node name="Apply" type="Button" parent="."] +layout_mode = 0 +offset_left = 390.0 +offset_top = 139.0 +offset_right = 456.0 +offset_bottom = 170.0 +text = "Apply" + +[connection signal="button_down" from="Host" to="." method="_on_host_button_down"] +[connection signal="button_down" from="Join" to="." method="_on_join_button_down"] +[connection signal="button_down" from="Start" to="." method="_on_start_button_down"] +[connection signal="text_changed" from="Nickname" to="." method="_on_nickname_text_changed"] +[connection signal="button_down" from="Apply" to="." method="_on_apply_button_down"] diff --git a/MultiplayerController.gd b/MultiplayerController.gd new file mode 100644 index 0000000..2b37a4c --- /dev/null +++ b/MultiplayerController.gd @@ -0,0 +1,82 @@ +extends Control +@export var address = "127.0.0.1" +@export var port = 8910 +var peer +var nick = "NO_NICKNAME" + +# Called when the node enters the scene tree for the first time. +func _ready(): + multiplayer.peer_connected.connect(peer_connected) + multiplayer.peer_disconnected.connect(peer_disconnected) + multiplayer.connected_to_server.connect(connected_to_server) + multiplayer.connection_failed.connect(connection_failed) + pass # Replace with function body. + +func peer_connected(id): + print("Peer connected: " + str(id)) + if multiplayer.is_server(): + for p in GameManager.players: + SendPlayerInformation(p["name"], p["id"]).rpc_id(id) +func peer_disconnected(id): + print("Peer disconnected: " + str(id)) +func connected_to_server(): + print("Connected to server :)") + SendPlayerInformation(nick, multiplayer.get_unique_id()) +func connection_failed(): + print("Disconnected from server :(") +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + pass + +@rpc("any_peer") +func SendPlayerInformation(name, id): + print("got info on " + str(id)) + var sender_id = multiplayer.get_remote_sender_id() + #TODO: clients to only accept data from server + print(" from " + str(sender_id)) + if !GameManager.players.has(id): + GameManager.players[id] ={ + "name" : name, + "id" : id, + "score": 0 + } + if multiplayer.is_server(): + for i in GameManager.Players: + SendPlayerInformation.rpc(GameManager.Players[i].name, i) + +@rpc("any_peer","call_local") +func StartGame(): + var scene = load("res://test_map.tscn").instantiate() + get_tree().root.add_child(scene) + self.hide() + +func _on_host_button_down(): + peer = ENetMultiplayerPeer.new() + var err = peer.create_server(port, 32) + if err != OK: + print("Error Starting Server :(") + return + multiplayer.set_multiplayer_peer(peer) + print("Waiting for players...") + +func _on_join_button_down(): + peer = ENetMultiplayerPeer.new() + peer.create_client(address, port) + multiplayer.set_multiplayer_peer(peer) + + +func _on_start_button_down(): + StartGame.rpc() + + +func _on_apply_button_down(): + get_node("Apply").disabled = true + nick = $Nickname.text + if peer.is_connected(): + SendPlayerInformation(nick, multiplayer.get_unique_id()) + pass # Replace with function body. + + +func _on_nickname_text_changed(): + if $Apply.disabled && $Nickname.text != nick: + $Apply.disabled = false diff --git a/player.tscn b/player.tscn old mode 100755 new mode 100644 diff --git a/project.godot b/project.godot old mode 100755 new mode 100644 index 372a16c..4a1a068 --- a/project.godot +++ b/project.godot @@ -1,12 +1,24 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + config_version=5 [application] config/name="game" -run/main_scene="res://test_map.tscn" +run/main_scene="res://Multiplayer.tscn" config/features=PackedStringArray("4.2", "Forward Plus") config/icon="res://icon.svg" +[autoload] + +GameManager="*res://GameManager.gd" + [input] move_forward={ diff --git a/test_map.tscn b/test_map.tscn old mode 100755 new mode 100644