2025-02-06 08:56:39 +00:00
|
|
|
extends Node
|
|
|
|
class_name GameServer
|
|
|
|
|
|
|
|
@export var port: int = 27015
|
|
|
|
@export var player_limit: int = 30
|
|
|
|
@export var current_map: String = "lowpoly_tdm_2"
|
|
|
|
@export var current_player_data := PlayerData.new()
|
|
|
|
|
|
|
|
# -- This variable should store all the active players
|
|
|
|
var players: Dictionary = {}
|
|
|
|
|
|
|
|
func _ready() -> void:
|
|
|
|
multiplayer.peer_connected.connect(_on_player_connected)
|
|
|
|
multiplayer.peer_disconnected.connect(_on_player_disconnected)
|
|
|
|
multiplayer.connected_to_server.connect(_on_connected_to_server)
|
|
|
|
|
|
|
|
|
|
|
|
func _on_player_disconnected(id) -> void:
|
|
|
|
logger.info("player is disconnected with id: " + str(id))
|
|
|
|
|
|
|
|
|
|
|
|
func _on_player_connected(id) -> void:
|
2025-02-12 12:07:21 +00:00
|
|
|
# Send the client information about the server
|
2025-02-06 08:56:39 +00:00
|
|
|
if multiplayer.is_server():
|
|
|
|
logger.info("player is connected with id: " + str(id))
|
2025-02-12 12:07:21 +00:00
|
|
|
_sync_map_from_the_server.rpc_id(id, current_map)
|
|
|
|
_sync_players.rpc_id(id, players)
|
|
|
|
|
|
|
|
@rpc("authority", "reliable", "call_remote")
|
|
|
|
func _sync_players(data: Dictionary):
|
|
|
|
var player_data_id: EncodedObjectAsID = data[1]
|
|
|
|
print(instance_from_id(player_data_id.object_id))
|
2025-02-06 08:56:39 +00:00
|
|
|
|
2025-02-12 12:07:21 +00:00
|
|
|
@rpc("authority", "call_remote", "reliable")
|
|
|
|
func _sync_map_from_the_server(map_name: String):
|
|
|
|
var game_root: GameRoot = get_tree().get_root().find_child("GameRoot", true, false)
|
|
|
|
game_root.load_map.emit(GameServerAutoload.current_map)
|
|
|
|
|
2025-02-06 08:56:39 +00:00
|
|
|
func _on_connected_to_server() -> void:
|
|
|
|
logger.info("connection is successful, sending info")
|
|
|
|
register_player.rpc_id(1, multiplayer.get_unique_id(), current_player_data.username)
|
|
|
|
|
|
|
|
func create_server(server_only: bool = false) -> Error:
|
|
|
|
var peer := ENetMultiplayerPeer.new()
|
|
|
|
logger.info("starting a server the port: " + str(port))
|
|
|
|
var err := peer.create_server(port, player_limit)
|
|
|
|
multiplayer.multiplayer_peer = peer
|
|
|
|
if !server_only:
|
|
|
|
var player_data := PlayerData.new()
|
|
|
|
player_data.id = 1
|
|
|
|
logger.warning("TODO: player name is not yet implemented")
|
|
|
|
player_data.username = "dummy"
|
2025-02-12 12:07:21 +00:00
|
|
|
players[1] = {
|
|
|
|
"id": 1,
|
|
|
|
"username": "dummy",
|
|
|
|
}
|
|
|
|
var game_root: GameRoot = get_tree().get_root().find_child("GameRoot", true, false)
|
|
|
|
game_root.load_map.emit(GameServerAutoload.current_map)
|
|
|
|
if err:
|
|
|
|
return err
|
2025-02-06 08:56:39 +00:00
|
|
|
return OK
|
|
|
|
|
|
|
|
func join_server(ip: String, port: int) -> Error:
|
|
|
|
var peer = ENetMultiplayerPeer.new()
|
|
|
|
logger.info("trying to connect to: " + ip + ":" + str(port))
|
|
|
|
var err = peer.create_client(ip, port)
|
|
|
|
if err != OK:
|
|
|
|
return err
|
|
|
|
multiplayer.multiplayer_peer = peer
|
|
|
|
return OK
|
|
|
|
|
|
|
|
@rpc("any_peer", "reliable", "call_remote")
|
|
|
|
func register_player(id: int, name: String):
|
|
|
|
if multiplayer.is_server():
|
|
|
|
logger.info("registering player: " + str(id))
|
|
|
|
var player_data := PlayerData.new()
|
|
|
|
player_data.id = id
|
|
|
|
player_data.username = name
|
2025-02-12 12:07:21 +00:00
|
|
|
players[multiplayer.get_remote_sender_id()] = {
|
|
|
|
"id": id,
|
|
|
|
"username": "dummy",
|
|
|
|
}
|
2025-02-06 08:56:39 +00:00
|
|
|
logger.info("player " + str(id) + " is registered")
|
|
|
|
else:
|
|
|
|
logger.debug("register player is supposed to be executed on the server")
|
|
|
|
|
2025-02-12 12:07:21 +00:00
|
|
|
@rpc("any_peer", "reliable", "call_local")
|
|
|
|
func select_side(side: String):
|
|
|
|
var player_id = multiplayer.get_remote_sender_id()
|
|
|
|
if side == "blue":
|
|
|
|
players[player_id].side = "blue"
|
|
|
|
elif side == "red":
|
|
|
|
players[player_id].side = "red"
|
|
|
|
else:
|
|
|
|
pass
|
|
|
|
|
2025-02-06 08:56:39 +00:00
|
|
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
|
|
func _process(delta: float) -> void:
|
|
|
|
pass
|