summaryrefslogtreecommitdiff
path: root/Game/Network.gd
diff options
context:
space:
mode:
Diffstat (limited to 'Game/Network.gd')
-rw-r--r--Game/Network.gd80
1 files changed, 76 insertions, 4 deletions
diff --git a/Game/Network.gd b/Game/Network.gd
index 021de69..9349245 100644
--- a/Game/Network.gd
+++ b/Game/Network.gd
@@ -1,26 +1,29 @@
extends Node
+signal players_changed
+
var players = {}
func _ready():
multiplayer.connected_to_server.connect(_on_connected_to_server)
multiplayer.peer_connected.connect(_on_peer_connected)
+ multiplayer.peer_disconnected.connect(_on_peer_disconnected)
multiplayer.allow_object_decoding = true
-func host_game():
+func host_game(port):
var peer = ENetMultiplayerPeer.new()
- peer.create_server(1234, 2)
+ peer.create_server(int(port))
multiplayer.multiplayer_peer = peer
players[1] = Client.player
-func join_game():
+func join_game(ip, port):
var peer = ENetMultiplayerPeer.new()
- peer.create_client("127.0.0.1", 1234)
+ peer.create_client(ip, int(port))
multiplayer.multiplayer_peer = peer
@@ -31,6 +34,23 @@ func _on_connected_to_server():
func _on_peer_connected(id):
print("peer connected: ", id)
add_to_players.rpc(to_rpc_object(Client.player))
+ # TODO: add existing towers to new peers
+
+func _on_peer_disconnected(id):
+ print("peer disconnected: ", id)
+ # TODO: move towers owned by peer to host
+
+ if id == 1:
+ get_tree().change_scene_to_file("res://UI/Lobby.tscn")
+
+
+func get_ordered_player_ids():
+ var keys = players.keys()
+ keys.sort_custom(func(a, b):
+ return int(str(a).substr(0, 8)) < int(str(b).substr(0, 8))
+ )
+
+ return keys
func to_rpc_object(object: Variant):
@@ -42,6 +62,8 @@ func to_rpc_object(object: Variant):
remote_object[property] = {}
for key in object[property]:
remote_object[property][key] = to_rpc_object(object[property][key])
+ elif property_class is String and property_class.begins_with("node://"):
+ remote_object[property] = object[property]
elif property_class:
remote_object[property] = to_rpc_object(object[property])
else:
@@ -66,6 +88,12 @@ func from_rpc_object(remote_object: Dictionary, remote_class_path: String):
if object[property] is Dictionary:
for key in object[property]:
object[property][key] = from_rpc_object(remote_object[property], property_class)
+ elif property_class is String and property_class.begins_with("node://"):
+ var node_path = property_class.substr(7) # after node://
+ object.remove_child(object.get_node(node_path))
+ remote_object[property].name = node_path.get_basename()
+ object[property] = remote_object[property]
+ object.add_child(remote_object[property])
elif property_class:
object[property] = from_rpc_object(remote_object[property], property_class)
else:
@@ -94,14 +122,37 @@ func merge_with_rpc_object(object: Variant, remote_object: Dictionary):
func add_to_players(remote_player: Dictionary):
var id = multiplayer.get_remote_sender_id()
var player = from_rpc_object(remote_player, "res://Game/Player.gd")
+ player.id = id
players[id] = player
+ players_changed.emit()
@rpc("call_local", "any_peer")
func update_player(remote_player: Dictionary):
var id = multiplayer.get_remote_sender_id()
var player = merge_with_rpc_object(players[id], remote_player)
+ player.id = id
players[id] = player
+ players_changed.emit()
+
+
+@rpc("any_peer", "reliable")
+func update_node(node_path: NodePath, properties: Dictionary):
+ var root_node = get_tree().root.get_node(node_path)
+
+ for property in properties:
+ if property.contains(":"):
+ var child_node = get_nested_node_and_property(root_node, property)
+ child_node.node[child_node.property] = properties[property]
+ else:
+ root_node[property] = properties[property]
+
+func get_nested_node_and_property(node: Node, property: String) -> Dictionary:
+ if property.contains(":"):
+ var nested_node_path = property.substr(0, property.find(":"))
+ var nested_property = property.substr(property.find(":") + 1)
+ return get_nested_node_and_property(node.get_node(nested_node_path), nested_property)
+ return { "node": node, "property": property }
@rpc("any_peer")
@@ -129,4 +180,25 @@ func spawn_unit(remote_unit: Dictionary, remote_spawn: Dictionary):
var unit = from_rpc_object(remote_unit, "res://Units/Unit.tscn")
var spawn = from_rpc_object(remote_spawn, "res://Stages/Paths/Spawn.tscn")
+ var remote_id = multiplayer.get_remote_sender_id()
+ unit.owner_id = remote_id
+ unit.set_multiplayer_authority(remote_id)
+
Client.stage.spawn_unit(unit, spawn)
+
+@rpc("any_peer")
+func remove_unit(remote_unit_node_path):
+ var unit = get_tree().current_scene.get_node_or_null(remote_unit_node_path)
+ if unit:
+ unit.queue_free()
+
+@rpc("any_peer")
+func update_unit(remote_unit_node_path, data):
+ var unit: Unit = get_tree().current_scene.get_node_or_null(remote_unit_node_path)
+ if unit:
+ if "position" in data:
+ unit.position = data.position
+ unit.hp = data.hp
+ if "sprite" in data:
+ unit.get_node("Sprite2D").self_modulate = data.sprite.self_modulate
+