diff --git a/gcgd-social-client/NetworkingClient.tscn b/gcgd-social-client/NetworkingClient.tscn index dc64fd1..ce3ac29 100644 --- a/gcgd-social-client/NetworkingClient.tscn +++ b/gcgd-social-client/NetworkingClient.tscn @@ -23,5 +23,10 @@ offset_bottom = 55.0 size_flags_horizontal = 4 text = "Disconnect" +[node name="Main" type="Node2D" parent="."] + +[node name="StartingPoint" type="Marker2D" parent="Main"] +position = Vector2(143, 99) + [connection signal="pressed" from="Lobby/ConnectBtn" to="." method="_on_connect_btn_pressed"] [connection signal="pressed" from="Lobby/DisconnectBtn" to="." method="_on_disconnect_btn_pressed"] diff --git a/gcgd-social-client/Player.tscn b/gcgd-social-client/Player.tscn new file mode 100644 index 0000000..1263d55 --- /dev/null +++ b/gcgd-social-client/Player.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=3 format=3 uid="uid://dbodpfxyefg37"] + +[ext_resource type="Script" path="res://player.gd" id="1_jtuqy"] +[ext_resource type="Texture2D" uid="uid://crb5lx2kqp0xl" path="res://icon.svg" id="1_t3xwi"] + +[node name="Player" type="CharacterBody2D"] +motion_mode = 1 +script = ExtResource("1_jtuqy") + +[node name="Sprite2D" type="Sprite2D" parent="."] +position = Vector2(550, 334) +scale = Vector2(0.671875, 0.65625) +texture = ExtResource("1_t3xwi") diff --git a/gcgd-social-client/networking_client.gd b/gcgd-social-client/networking_client.gd index 285acc4..a15d248 100644 --- a/gcgd-social-client/networking_client.gd +++ b/gcgd-social-client/networking_client.gd @@ -1,30 +1,36 @@ extends Node +class_name NetworkingClient const DEV = true @onready var connect_btn = $Lobby/ConnectBtn @onready var disconnect_btn = $Lobby/DisconnectBtn +@onready var main_node = $Main +@onready var starting_point = $Main/StartingPoint -var multiplayer_peer = ENetMultiplayerPeer.new() +var multiplayer_peer : ENetMultiplayerPeer = ENetMultiplayerPeer.new() var url : String = "ec2-18-117-120-174.us-east-2.compute.amazonaws.com" const PORT = 9009 -var connected_peer_ids = [] +var connected_peers : Dictionary = {} +var my_player : Player; +const player_factory = preload("res://Player.tscn") func _ready(): if DEV == true: url = "127.0.0.1" update_connection_buttons() + multiplayer.connected_to_server.connect(_on_connected_to_server) multiplayer.server_disconnected.connect(_on_server_disconnected) -@rpc -func sync_player_list(updated_connected_peer_ids): - connected_peer_ids = updated_connected_peer_ids - multiplayer_peer.get_unique_id() - update_connection_buttons() - print("Currently connected Players: " + str(connected_peer_ids)) - +func add_player_to_scene(peer_id: int, position: Vector2): + var player: Player = player_factory.instantiate() + player.set_name(str(peer_id)) + player.set_peer_id(peer_id) + player.position = position + main_node.add_child(player) + connected_peers[peer_id] = player func _on_connect_btn_pressed() -> void: print("Connecting ...") @@ -34,17 +40,22 @@ func _on_connect_btn_pressed() -> void: func _on_disconnect_btn_pressed(): + var peer_id = multiplayer_peer.get_unique_id() + var player = connected_peers[peer_id] + player.queue_free() + connected_peers.erase(peer_id) multiplayer_peer.close() update_connection_buttons() print("Disconnected.") +func _on_connected_to_server(): + print("I'm connected!") func _on_server_disconnected(): multiplayer_peer.close() update_connection_buttons() print("Connection to server lost.") - func update_connection_buttons() -> void: if multiplayer_peer.get_connection_status() == multiplayer_peer.CONNECTION_DISCONNECTED: connect_btn.disabled = false @@ -55,3 +66,43 @@ func update_connection_buttons() -> void: if multiplayer_peer.get_connection_status() == multiplayer_peer.CONNECTION_CONNECTED: connect_btn.disabled = true disconnect_btn.disabled = false + +func set_position(peer_id, position): + rpc('_set_position', peer_id, position) + +func move_player(peer_id, direction): + rpc('_move_player', peer_id, direction) + +@rpc("authority") +func sync_player_list(updated_connected_peers: Dictionary): + var my_peer_id = multiplayer_peer.get_unique_id() + for peer_id in updated_connected_peers.keys(): + if !connected_peers.has(peer_id): + add_player_to_scene(peer_id, updated_connected_peers[peer_id]) + + for peer_id in connected_peers: + if !updated_connected_peers.has(peer_id): + var player = connected_peers[peer_id] + player.queue_free() + connected_peers.erase(peer_id) + + update_connection_buttons() + print("Currently connected Players: " + str(connected_peers.keys())) + +@rpc("any_peer") +func _set_position(peer_id, position): + pass + +@rpc +func _set_initial_position(peer_id: int, position: Vector2): + pass + +@rpc("any_peer") +func _move_player(peer_id, direction): + pass + +@rpc("authority") +func set_new_velocity(peer_id, new_velocity): + if connected_peers.has(peer_id): + var player: Player = connected_peers.get(peer_id) + player.velocity = new_velocity diff --git a/gcgd-social-client/player.gd b/gcgd-social-client/player.gd new file mode 100644 index 0000000..4c87dec --- /dev/null +++ b/gcgd-social-client/player.gd @@ -0,0 +1,26 @@ +extends CharacterBody2D +class_name Player +var this_players_peer_id: int +var multiplayer_peer: ENetMultiplayerPeer +var networking_client: NetworkingClient + +func _ready() -> void: + networking_client = get_tree().root.get_node('Networking') + multiplayer_peer = networking_client.multiplayer_peer + +func get_input(): + var input_direction = Input.get_vector("left", "right", "up", "down") + networking_client.move_player(this_players_peer_id, input_direction) + +func set_peer_id(peer_id: int): + this_players_peer_id = peer_id + +func sync_current_position(): + networking_client.set_position(this_players_peer_id, position) + +func _physics_process(delta): + var my_peer_id = multiplayer_peer.get_unique_id() + if this_players_peer_id == my_peer_id: + sync_current_position() + get_input() + move_and_slide() diff --git a/gcgd-social-client/project.godot b/gcgd-social-client/project.godot index c4f8b5d..4a8a43f 100644 --- a/gcgd-social-client/project.godot +++ b/gcgd-social-client/project.godot @@ -15,6 +15,29 @@ run/main_scene="res://NetworkingClient.tscn" config/features=PackedStringArray("4.3", "GL Compatibility") config/icon="res://icon.svg" +[input] + +left={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null) +] +} +down={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null) +] +} +right={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null) +] +} +up={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null) +] +} + [rendering] renderer/rendering_method="gl_compatibility" diff --git a/gcgd-social-server/networking.gd b/gcgd-social-server/networking.gd index a6647cf..9aef61d 100644 --- a/gcgd-social-server/networking.gd +++ b/gcgd-social-server/networking.gd @@ -6,7 +6,7 @@ var multiplayer_peer = ENetMultiplayerPeer.new() var url : String = "your-prod.url" const PORT = 9009 -var connected_peer_ids = [] +var connected_peers : Dictionary = {} func _ready(): if DEV == true: @@ -27,11 +27,11 @@ func _on_peer_connected(new_peer_id : int) -> void: func add_player(new_peer_id : int) -> void: - connected_peer_ids.append(new_peer_id) + var position: Vector2 = Vector2(0, 0) + connected_peers[new_peer_id] = position print("Player " + str(new_peer_id) + " joined.") - print("Currently connected Players: " + str(connected_peer_ids)) - rpc("sync_player_list", connected_peer_ids) - + print("Currently connected Players: " + str(connected_peers.keys())) + rpc("sync_player_list", connected_peers) func _on_peer_disconnected(leaving_peer_id : int) -> void: # The disconnect signal fires before the client is removed from the connected @@ -39,15 +39,31 @@ func _on_peer_disconnected(leaving_peer_id : int) -> void: await get_tree().create_timer(1).timeout remove_player(leaving_peer_id) - func remove_player(leaving_peer_id : int) -> void: - var peer_idx_in_peer_list : int = connected_peer_ids.find(leaving_peer_id) - if peer_idx_in_peer_list != -1: - connected_peer_ids.remove_at(peer_idx_in_peer_list) + if connected_peers.has(leaving_peer_id): + connected_peers.erase(leaving_peer_id) print("Player " + str(leaving_peer_id) + " disconnected.") - rpc("sync_player_list", connected_peer_ids) - + rpc("sync_player_list", connected_peers) @rpc func sync_player_list(_updated_connected_peer_ids): pass # only implemented in client (but still has to exist here) + +@rpc("any_peer") +func _move_player(peer_id: int, direction: Vector2): + rpc('set_new_velocity', peer_id, direction * 400) + +@rpc +func set_new_velocity(peer_id, velocity): + pass + +@rpc("any_peer") +func _set_position(peer_id: int, position: Vector2): + connected_peers[peer_id] = position + +@rpc("any_peer") +func _set_initial_position(peer_id: int, position: Vector2): + print("Set Initial Position") + print(peer_id) + connected_peers[peer_id] = position + rpc("sync_player_list", connected_peers)