Want to contribute? Fork me on Codeberg.org!
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.
nzbrawl/multiplayer_controller.gd

89 lines
2.2 KiB

extends Control
@export var port = 1717
@export var max_players = 4
var COMPRESSION = ENetConnection.COMPRESS_RANGE_CODER
var line_edit: LineEdit
var peer: ENetMultiplayerPeer
# Called when the node enters the scene tree for the first time.
func _ready():
multiplayer.peer_connected.connect(peer_connected)
multiplayer.peer_disconnected.connect(peer_disconnected)
multiplayer.connected_to_server.connect(connected_to_server)
multiplayer.connection_failed.connect(connection_failed)
# We have to enable object encoding to send PlayerData, etc.
multiplayer.allow_object_decoding = true
line_edit = get_node("LineEditName")
# Called on both server and clients
func peer_connected(id):
print("Player connected " + str(id))
# Called on both server and clients
func peer_disconnected(id):
print("Player disconnected " + str(id))
@rpc("any_peer")
func send_player_data(player_data: Dictionary):
if !GameManager.players.has(player_data.id):
GameManager.players[player_data.id] = player_data
if multiplayer.is_server():
for i in GameManager.players:
send_player_data.rpc(GameManager.players[i])
# Called only from clients
func connected_to_server():
print("Connected to server!")
send_player_data.rpc_id(1, {
"id": multiplayer.get_unique_id(),
"name": line_edit.text if line_edit.text else "Player"
})
# Called only from clients
func connection_failed():
print("Couldn't connect!")
func _on_host_pressed():
# Create peer instance for host's player
peer = ENetMultiplayerPeer.new()
var error = peer.create_server(port, max_players)
if error != OK:
print("Cannot host: " + error)
peer.get_host().compress(COMPRESSION)
# Connect host's player
multiplayer.set_multiplayer_peer(peer)
print("Waiting for players!")
send_player_data({
"id": multiplayer.get_unique_id(),
"name": line_edit.text if line_edit.text else "Player"
})
func _on_join_pressed():
peer = ENetMultiplayerPeer.new()
peer.create_client($LineEditIP.text if $LineEditIP.text else "127.0.0.1", port)
peer.get_host().compress(COMPRESSION)
multiplayer.set_multiplayer_peer(peer)
@rpc("any_peer", "call_local")
func start_game():
var scene = load("res://main.tscn").instantiate()
get_tree().root.add_child(scene)
self.hide()
func _on_start_game_pressed():
start_game.rpc()