Files
AmongFromUs.Prototype/networking.gd
2020-10-01 19:53:08 +02:00

154 lines
5.0 KiB
GDScript

extends Node
signal player_disconnected
signal server_disconnected
export var SERVER_IP: String = "127.0.0.1"
export var SERVER_PORT: int = 55055
export var MAX_PLAYERS: int = 10
export var BASE_PATH: String = "/root/Node2D";
onready var gui_username: TextEdit = get_node(BASE_PATH + "/GUI/Control/Username")
onready var gui_lusername: Label = get_node(BASE_PATH + "/GUI/Control/LUsername")
onready var gui_create: Button = get_node(BASE_PATH + "/GUI/Control/Create")
onready var gui_join: Button = get_node(BASE_PATH + "/GUI/Control/Join")
onready var gui_waiting: Label = get_node(BASE_PATH + "/GUI/Control/Waiting")
onready var gui_lip: Label = get_node(BASE_PATH + "/GUI/Control/LIP")
onready var gui_ip: TextEdit = get_node(BASE_PATH + "/GUI/Control/IP")
onready var gui_chat: VBoxContainer = get_node(BASE_PATH + "/GUI/Control/Chat")
onready var spawn: Node2D = get_node(BASE_PATH + "/Game/Spawn") as Node2D
var players = {}
# If true, the player can't move. Accessed by tasks.
var move = true
var self_data = { name = '', position = Vector2(66, 175) }
func _ready():
get_tree().connect('network_peer_disconnected', self, '_on_player_disconnected')
get_tree().connect('network_peer_connected', self, '_on_player_connected')
#######################
### SERVER CODE
#######################
# Called when the node enters the scene tree for the first time.
func start_server():
var admin_name = gui_username.text
self_data.name = admin_name
self_data.position = spawn.position
players[1] = self_data # ID of server is always 1
var peer = NetworkedMultiplayerENet.new()
peer.create_server(SERVER_PORT, MAX_PLAYERS)
get_tree().network_peer = peer
add_to_chat("Server is now running!", Color(0, 100, 0, 1))
gui_create.text = "Cancel"
gui_join.visible = false
gui_waiting.visible = true
# Create admin player
create_new_player(1, players[1])
hideLobby()
func _on_player_connected(connected_player_id):
print("Client connected!")
add_to_chat("User " + String(connected_player_id) + " joined the game!")
rpc_id(1, '_request_players')
func _on_player_disconnected(id):
var player = get_node("/root/Node2D/Game/" + str(id))
player.get_parent().remove_child(player)
add_to_chat("User " + String(id) + " left the game!")
players.erase(id)
# This function get's called by each client on join.
# It will loop though all players (except the requester) and will force the client
# to execute _send_player_info to create the local player objects
remote func _request_players():
var request_from_id = get_tree().get_rpc_sender_id()
if get_tree().is_network_server():
for peer_id in players:
#if( peer_id != request_from_id):
rpc_id(request_from_id, '_send_player_info', peer_id, players[peer_id])
remote func _request_player_info(request_from_id, player_id):
if get_tree().is_network_server():
rpc_id(request_from_id, '_send_player_info', player_id, players[player_id])
remote func _send_player_info(id, info):
print("Create player ", id, "with: ", info)
players[id] = info
create_new_player(id, info)
func update_position(id, position):
#print("Update position of", id, ":", position)
players[id].position = position
#######################
### CLIENT CODE
#######################
func connect_to_server():
var player_name = gui_username.text
self_data.name = player_name
get_tree().connect("connected_to_server", self, '_connected_to_server')
var peer = NetworkedMultiplayerENet.new()
peer.create_client(SERVER_IP, SERVER_PORT)
get_tree().network_peer = peer
func _connected_to_server():
var id = get_tree().get_network_unique_id()
print("Connected to server with id ", id)
players[get_tree().get_network_unique_id()] = self_data
rpc_id(1, '_send_player_info', get_tree().get_network_unique_id(), self_data)
rpc_id(1, '_request_players')
print("==== END CONNECT ====")
hideLobby()
###
### HELPER
###
func hideLobby():
(get_node(BASE_PATH + "/Game")).visible = true
gui_username.visible = false
gui_lusername.visible = false
gui_create.visible = false
gui_join.visible = false
gui_lip.visible = false
gui_ip.visible = false
gui_waiting.visible = false
func add_to_chat(message: String, color = Color(100, 100, 100, 1)):
var label: Label = Label.new()
label.text = message
if color != null:
label.add_color_override("font_color", color)
gui_chat.add_child(label)
func get_player_node(name: int):
return get_node("/root/Node2D/Game/" + String(name))
func create_new_player(id: int, info):
if get_node(BASE_PATH + "/Game/" + str(id)) != null:
return # Do not create a new player (duplicate)
var new_player = (load('res://Characters/Player/Player.tscn').instance() as KinematicBody2D)
new_player.position = info.position
new_player.name = str(id)
new_player.set_network_master(id)
if get_tree().get_network_unique_id() != id:
(new_player.get_node("./Light2D") as Light2D).enabled = false
(new_player.get_node("./Darken") as Light2D).enabled = false
new_player.get_node("Label").text = info.name
get_node(BASE_PATH + "/Game").add_child(new_player)
print("New player with master:", new_player.get_network_master())