154 lines
5.0 KiB
GDScript
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())
|