You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.6 KiB
90 lines
2.6 KiB
extends Node |
|
|
|
const SERVER_ADDRESS: String = "127.0.0.1" |
|
const SERVER_PORT: int = 8080 |
|
const MAX_PLAYERS : int = 10 |
|
|
|
var players = {} |
|
var player_info = { |
|
"nick" : "host", |
|
"skin" : Character.SkinColor.BLUE |
|
} |
|
|
|
signal player_connected(peer_id, player_info) |
|
signal server_disconnected |
|
|
|
func _process(_delta): |
|
if Input.is_action_just_pressed("quit"): |
|
get_tree().quit(0) |
|
|
|
func _ready() -> void: |
|
multiplayer.server_disconnected.connect(_on_connection_failed) |
|
multiplayer.connection_failed.connect(_on_server_disconnected) |
|
multiplayer.peer_disconnected.connect(_on_player_disconnected) |
|
multiplayer.peer_connected.connect(_on_player_connected) |
|
multiplayer.connected_to_server.connect(_on_connected_ok) |
|
|
|
func start_host(nickname: String, skin_color_str: String): |
|
var peer = ENetMultiplayerPeer.new() |
|
var error = peer.create_server(SERVER_PORT, MAX_PLAYERS) |
|
if error: |
|
return error |
|
multiplayer.multiplayer_peer = peer |
|
|
|
if !nickname or nickname.strip_edges() == "": |
|
nickname = "Host_" + str(1) |
|
|
|
player_info["nick"] = nickname |
|
player_info["skin"] = skin_str_to_e(skin_color_str) |
|
players[1] = player_info |
|
player_connected.emit(1, player_info) |
|
|
|
func join_game(nickname: String, skin_color_str: String, address: String = SERVER_ADDRESS): |
|
var peer = ENetMultiplayerPeer.new() |
|
var error = peer.create_client(address, SERVER_PORT) |
|
if error: |
|
return error |
|
|
|
multiplayer.multiplayer_peer = peer |
|
|
|
if !nickname or nickname.strip_edges() == "": |
|
nickname = "Player_" + str(multiplayer.get_unique_id()) |
|
|
|
var skin_enum = skin_str_to_e(skin_color_str) |
|
|
|
player_info["nick"] = nickname |
|
player_info["skin"] = skin_enum |
|
|
|
func _on_connected_ok(): |
|
var peer_id = multiplayer.get_unique_id() |
|
players[peer_id] = player_info |
|
player_connected.emit(peer_id, player_info) |
|
|
|
func _on_player_connected(id): |
|
_register_player.rpc_id(id, player_info) |
|
|
|
@rpc("any_peer", "reliable") |
|
func _register_player(new_player_info): |
|
var new_player_id = multiplayer.get_remote_sender_id() |
|
players[new_player_id] = new_player_info |
|
player_connected.emit(new_player_id, new_player_info) |
|
#print("debug function _register_player on Network.gd: ", players, "\n") |
|
|
|
func _on_player_disconnected(id): |
|
players.erase(id) |
|
|
|
func _on_connection_failed(): |
|
multiplayer.multiplayer_peer = null |
|
|
|
func _on_server_disconnected(): |
|
multiplayer.multiplayer_peer = null |
|
players.clear() |
|
server_disconnected.emit() |
|
|
|
func skin_str_to_e(s): |
|
match s.to_lower(): |
|
"blue": return Character.SkinColor.BLUE |
|
"yellow": return Character.SkinColor.YELLOW |
|
"green": return Character.SkinColor.GREEN |
|
"red": return Character.SkinColor.RED |
|
_: return Character.SkinColor.BLUE
|
|
|