-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMainScene.gd
More file actions
106 lines (79 loc) · 3.28 KB
/
MainScene.gd
File metadata and controls
106 lines (79 loc) · 3.28 KB
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
101
102
103
104
105
106
extends Node
# ----------------------------------------------------------------------------------------- Settings
const SERVER_PORT = 2000
const MAX_PLAYERS = 5
const SERVER_IP = "127.0.0.1"
const COLORS_LIST = [
"#0ad609",
"#f0bf58",
"#1120d3",
"#704c28",
"#2af4ce"
]
# --------------------------------------------------------------------------------------------- Vars
onready var _menu: Control = $Menu
onready var _session_type_lbl: Label = $SessionTypeLbl
var _player_id_counter = 0
var _players = {}
# ------------------------------------------------------------------------------------- UI functions
func _start_server():
_menu.hide()
_session_type_lbl.text = "Server"
var peer = NetworkedMultiplayerENet.new()
peer.create_server(SERVER_PORT, MAX_PLAYERS)
get_tree().network_peer = peer
get_tree().connect("network_peer_connected", self, "_on_client_connected")
get_tree().connect("network_peer_disconnected", self, "_on_client_disconnected")
print("Server IP: ", IP.get_local_addresses())
func _start_client():
_menu.hide()
_session_type_lbl.text = "Client"
var peer = NetworkedMultiplayerENet.new()
peer.create_client(SERVER_IP, SERVER_PORT)
get_tree().network_peer = peer
# ------------------------------------------------------------------- Server only internal functions
func _on_client_connected(peer_id):
print("Connected: ", peer_id)
var new_player_id = _player_id_counter
_player_id_counter += 1
_players[new_player_id] = {"peer_id": peer_id, "player_id": new_player_id}
# Spawn player on server, for server any player is puppet (even if it's
# autoritative)
_spawn_new_player(new_player_id, peer_id)
# Spawn the player on the client
rpc_id(peer_id, "_spawn_new_player", new_player_id, peer_id)
# Tell anyone new player appeared
for player_id in _players.keys():
if _players[player_id]["peer_id"] != peer_id:
rpc_id(_players[player_id]["peer_id"], "_spawn_new_player", new_player_id, 1)
# Spawn the actual _players on this client
for player_id in _players.keys():
if player_id != new_player_id:
rpc_id(peer_id, "_spawn_new_player", player_id, 1)
func _on_client_disconnected(peer_id):
print("Disconnected: ", peer_id)
var disconnected_player_id = -1
for player_id in _players.keys():
if _players[player_id]["peer_id"] == peer_id:
disconnected_player_id = player_id
break
if disconnected_player_id == -1:
return
_players.erase(disconnected_player_id)
_remove_player(disconnected_player_id)
# Tell anyone player disappeared
for player_id in _players.keys():
rpc_id(_players[player_id]["peer_id"], "_remove_player", disconnected_player_id)
# --------------------------------------------------------------------------------- Remote functions
remote func _spawn_new_player(player_id, peer_id):
print("Spawn player id: ", player_id, ", Peer_id: ", peer_id)
print("While my peer id is: ", get_tree().multiplayer.network_peer.get_unique_id())
var character = load("res://Character.tscn").instance()
character.set_network_master(peer_id)
character.set_name("player_" + str(player_id))
get_tree().get_current_scene().add_child(character)
character.set_color(COLORS_LIST[player_id])
remote func _remove_player(player_id):
var player_node = get_tree().get_current_scene().get_node("player_" + str(player_id))
if player_node != null:
player_node.queue_free()