summaryrefslogtreecommitdiff
path: root/network/network.gd
blob: 38eba42b712eb8d7c421a321eb4794a42b747157 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
extends Node


signal connected

var local_player: Player

signal current_player_changed
var current_player_id: int:
	set (value):
		current_player_id = value
		current_player = get_player(value)
		current_player_changed.emit()
var current_player: Player

var player_order := [1]:
	set (value):
		player_order = value
		set_player_order.rpc(value)


func _ready() -> void:
	multiplayer.peer_connected.connect(_on_peer_connected)
	multiplayer.peer_disconnected.connect(_on_peer_disconnected)


func host() -> void:
	var peer := ENetMultiplayerPeer.new()
	peer.create_server(1234)
	multiplayer.multiplayer_peer = peer
	add_player(multiplayer.get_unique_id())
	local_player = get_player(multiplayer.get_unique_id())
	current_player = local_player
	current_player_id = multiplayer.get_unique_id()


func join() -> void:
	var peer := ENetMultiplayerPeer.new()
	peer.create_client("localhost", 1234)
	multiplayer.multiplayer_peer = peer
	add_player(multiplayer.get_unique_id())
	local_player = get_player(multiplayer.get_unique_id())


func add_player(id: int) -> void:
	var player: Player = load("res://player/player.tscn").instantiate()
	player.id = id
	%Players.add_child(player)


func get_player(id: int) -> Player:
	return %Players.get_node(str(id))


func is_my_turn() -> bool:
	return current_player == local_player


func set_current_player(id: int) -> void:
	sync_current_player.rpc(id)

@rpc("any_peer", "call_local")
func sync_current_player(id: int) -> void:
	current_player_id = id


@rpc("authority", "call_remote")
func set_player_order(value: Array) -> void:
	player_order = value


func _on_peer_connected(id: int):
	add_player(id)
	
	if multiplayer.is_server():
		sync_current_player.rpc_id(id, current_player_id)
		player_order.append(id)
	else:
		check_is_connected()
		#get_player(id).set_initial_values()


func _on_peer_disconnected(id: int):
	%Players.remove_child(%Players.get_node(str(id)))


# check is connected
# TODO: check how to correctly do player setup at join

func check_is_connected():
	server_check_is_connected.rpc_id(1, multiplayer.get_peers().size())

@rpc("any_peer", "call_remote")
func server_check_is_connected(remote_peers_size: int):
	if multiplayer.get_peers().size() == remote_peers_size:
		server_tells_connected.rpc_id(multiplayer.get_remote_sender_id())

@rpc("authority", "call_remote")
func server_tells_connected():
	connected.emit()