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.
89 lines
2.2 KiB
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()
|