goblin/Scripts/Server/server.gd

274 lines
7 KiB
GDScript3
Raw Permalink Normal View History

2025-07-21 20:38:11 -06:00
class_name Server
extends Node
#region Constants
const DEFAULT_PORT = 10567
const MAX_CLIENTS = 3
#endregion
#region Onready Variables
# @onready var microphone : AudioStreamPlayer3D = $Microphone
#endregion
#region Variables
var players_ready : Array = []
var peer : MultiplayerPeer = null
#var mic_capture : AudioEffectOpusChunked
var lobby_id : int = -1
#endregion
#region RPC
# @rpc("any_peer", "unreliable")
# func voice_packet_recieved(packet):
# var sender_id = multiplayer.get_remote_sender_id()
# push_opus_packet_to_player.emit(sender_id, packet)
#endregion
#region Signals
signal game_log(message : String, color : Color)
signal server_close()
signal client_connected_to_server()
signal client_disconnected_from_server()
signal remove_client_from_server(id : int)
signal steam_lobby_created()
# signal push_opus_packet_to_player(id : int, packet)
#endregion
#region Godot Functions
func _ready() -> void:
for argument in OS.get_cmdline_args():
if argument == "-steam":
ready_steam()
# ready_voip()
#set multiplayer signals
multiplayer.peer_connected.connect(_multiplayer_peer_connected)
multiplayer.peer_disconnected.connect(_multiplayer_peer_disconnected)
multiplayer.connected_to_server.connect(_multiplayer_connected_to_server)
multiplayer.connection_failed.connect(_multiplayer_connection_failed)
multiplayer.server_disconnected.connect(_multiplayer_server_disconnected)
#set steam signals
if Global.steam_connected == true:
Steam.lobby_joined.connect(_steam_lobby_joined)
Steam.lobby_created.connect(_steam_lobby_created)
func _process(_delta : float):
# process_voip()
Steam.run_callbacks()
#endregion
#region Ready Functions
func ready_steam() -> void:
var steam_response : Dictionary = Steam.steamInitEx()
Global.steam_connected = steam_response["status"] == 0
if Global.steam_connected == false:
get_tree().create_timer(3.0).timeout.connect(
func():
game_log.emit("Could Not Connect To Steam", Color(1, 0, 0, 1))
)
# func ready_voip() -> void:
# assert(microphone.bus == "MicrophoneBus")
# var mic_bus = AudioServer.get_bus_index("MicrophoneBus")
# mic_capture = AudioServer.get_bus_effect(mic_bus, 0)
#endregion
#region Process Functions
# func process_voip() -> void:
# if mic_capture == null:
# return
# while mic_capture.chunk_available():
# var packet = mic_capture.read_opus_packet(PackedByteArray())
# mic_capture.drop_chunk()
# if Global.voip_on == false:
# continue
# if Global.is_multiplayer and multiplayer.multiplayer_peer.get_connection_status() == MultiplayerPeer.CONNECTION_CONNECTED:
# voice_packet_recieved.rpc(packet)
#endregion
#region Default Multiplayer Functions
func destroy_lobby() -> void:
Global.is_multiplayer = false
multiplayer.multiplayer_peer.close()
peer = OfflineMultiplayerPeer.new()
multiplayer.multiplayer_peer = peer
server_close.emit()
func disconnect_client() -> void:
Global.is_multiplayer = false
multiplayer.multiplayer_peer.close()
peer = OfflineMultiplayerPeer.new()
multiplayer.multiplayer_peer = peer
client_disconnected_from_server.emit()
#endregion
#region Enet Functions
func enet_create_host() -> void:
#set multiplayer to true
Global.is_multiplayer = true
#init multiplayer host
peer = ENetMultiplayerPeer.new()
(peer as ENetMultiplayerPeer).create_server(DEFAULT_PORT, MAX_CLIENTS)
multiplayer.multiplayer_peer = peer
func enet_create_client(address : String) -> void:
#set multiplayer to true
Global.is_multiplayer = true
#init client and wait for connection
peer = ENetMultiplayerPeer.new()
(peer as ENetMultiplayerPeer).create_client(address, DEFAULT_PORT)
multiplayer.set_multiplayer_peer(peer)
await multiplayer.connected_to_server
#endregion
#region Steam Functions
func steam_create_host() -> void:
#players[1] = PlayerData.new(1, 0, new_username)
Steam.createLobby(Steam.LOBBY_TYPE_FRIENDS_ONLY, MAX_CLIENTS)
func steam_join_lobby(new_lobby_id : int) -> void:
Steam.joinLobby(new_lobby_id)
func steam_create_socket():
Global.is_multiplayer = true
peer = SteamMultiplayerPeer.new()
peer.create_host(0)
multiplayer.set_multiplayer_peer(peer)
func steam_connect_socket(steam_id : int) -> void:
Global.is_multiplayer = true
peer = SteamMultiplayerPeer.new()
peer.create_client(steam_id, 0)
multiplayer.set_multiplayer_peer(peer)
#endregion
#region Signal Functions
func _multiplayer_peer_connected(_id : int):
pass
func _multiplayer_peer_disconnected(id : int):
if multiplayer.is_server():
game_log.emit("Player \"" + str(id) + "\" disconnected", Color(1, 0, 0, 1))
remove_client_from_server.emit(id)
func _multiplayer_connected_to_server() -> void:
client_connected_to_server.emit()
func _multiplayer_connection_failed() -> void:
Global.is_multiplayer = false
peer = OfflineMultiplayerPeer.new()
multiplayer.multiplayer_peer = peer
client_disconnected_from_server.emit()
game_log.emit("Server connection failed", Color(1, 0, 0, 1))
func _multiplayer_server_disconnected() -> void:
Global.is_multiplayer = false
peer = OfflineMultiplayerPeer.new()
multiplayer.multiplayer_peer = peer
client_disconnected_from_server.emit()
game_log.emit("Server disconnected", Color(1, 0, 0, 1))
func _steam_lobby_joined(new_lobby_id : int, _permissions : int, _locked : bool, response : int) -> void:
if response == Steam.CHAT_ROOM_ENTER_RESPONSE_SUCCESS:
lobby_id = new_lobby_id
var id : int = Steam.getLobbyOwner(new_lobby_id)
if id != Steam.getSteamID():
steam_connect_socket(id)
#player_register.rpc(username)
#players[multiplayer.get_unique_id()] = username
return
var message : String
match response:
Steam.CHAT_ROOM_ENTER_RESPONSE_DOESNT_EXIST:
message = "This lobby no longer exists."
Steam.CHAT_ROOM_ENTER_RESPONSE_NOT_ALLOWED:
message = "You don't have permission to join this lobby."
Steam.CHAT_ROOM_ENTER_RESPONSE_FULL:
message = "The lobby is now full."
Steam.CHAT_ROOM_ENTER_RESPONSE_ERROR:
message = "Response errored."
Steam.CHAT_ROOM_ENTER_RESPONSE_BANNED:
message = "You are banned from this lobby."
Steam.CHAT_ROOM_ENTER_RESPONSE_LIMITED:
message = "You cannot join due to having a limited account."
Steam.CHAT_ROOM_ENTER_RESPONSE_CLAN_DISABLED:
message = "This lobby is locked or disabled."
Steam.CHAT_ROOM_ENTER_RESPONSE_COMMUNITY_BAN:
message = "This lobby is community locked."
Steam.CHAT_ROOM_ENTER_RESPONSE_MEMBER_BLOCKED_YOU:
message = "A user in the lobby has blocked you from joining."
Steam.CHAT_ROOM_ENTER_RESPONSE_YOU_BLOCKED_MEMBER:
message = "A user you have blocked is in the lobby."
game_log.emit(message, Color(1, 0, 0, 1))
func _steam_lobby_created(connected: int, this_lobby_id: int) -> void:
if connected == 1:
Global.steam_lobby_id = str(this_lobby_id)
Steam.setLobbyData(this_lobby_id, "name", str(Steam.getPersonaName(), "'s test server"))
steam_create_socket()
steam_lobby_created.emit()
return
game_log.emit("Error on create lobby!", Color(1, 0, 0, 1))
#endregion