2024-08-31 14:58:41 +02:00
|
|
|
## FreeFTF
|
|
|
|
## Copyright (C) 2024 Interstellar Development
|
2024-08-08 21:49:24 +02:00
|
|
|
##
|
2024-08-31 14:58:41 +02:00
|
|
|
## This program is free software: you can redistribute it and/or modify
|
|
|
|
## it under the terms of the GNU General Public License as published by
|
|
|
|
## the Free Software Foundation, either version 3 of the License, or
|
|
|
|
## (at your option) any later version.
|
2024-08-08 21:49:24 +02:00
|
|
|
##
|
2024-08-31 14:58:41 +02:00
|
|
|
## This program is distributed in the hope that it will be useful,
|
|
|
|
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
## GNU General Public License for more details.
|
2024-08-08 21:49:24 +02:00
|
|
|
##
|
2024-08-31 14:58:41 +02:00
|
|
|
## You should have received a copy of the GNU General Public License
|
|
|
|
## along with this program. If not, see <https://www.gnu.org/licenses/>.
|
2024-08-08 21:49:24 +02:00
|
|
|
|
|
|
|
extends Node
|
|
|
|
|
|
|
|
const PORT = 35000
|
|
|
|
const MAX_CONNECTIONS = 256
|
|
|
|
|
|
|
|
var game_rooms = {}
|
|
|
|
var player_associations = {}
|
|
|
|
var name_associations = {}
|
|
|
|
|
|
|
|
|
|
|
|
func _ready():
|
|
|
|
multiplayer.peer_disconnected.connect(_on_player_disconnected)
|
|
|
|
multiplayer.peer_connected.connect(_on_player_connected)
|
|
|
|
|
|
|
|
func create_game():
|
|
|
|
var peer = ENetMultiplayerPeer.new()
|
|
|
|
var error = peer.create_server(PORT, MAX_CONNECTIONS)
|
|
|
|
if error:
|
|
|
|
return error
|
|
|
|
multiplayer.multiplayer_peer = peer
|
|
|
|
|
|
|
|
func _on_player_disconnected(id):
|
2024-08-11 19:43:03 +02:00
|
|
|
while multiplayer.is_server():
|
2024-08-21 19:17:22 +02:00
|
|
|
for i in range(1000):
|
2024-08-11 19:43:03 +02:00
|
|
|
if id in multiplayer.get_peers():
|
|
|
|
break
|
|
|
|
await get_tree().create_timer(0.001).timeout
|
2024-08-08 21:49:24 +02:00
|
|
|
var room_name = player_associations[id]
|
|
|
|
var player_list = create_player_list(room_name)
|
|
|
|
if game_rooms.has(room_name) and game_rooms[room_name] == id:
|
|
|
|
for p in player_list:
|
|
|
|
Client.rpc_id(p,"room_closed")
|
|
|
|
game_rooms.erase(room_name)
|
|
|
|
else:
|
|
|
|
for p in player_list:
|
|
|
|
Client.rpc_id(p,"_on_player_disconnected",id)
|
|
|
|
player_associations.erase(id)
|
|
|
|
name_associations.erase(id)
|
2024-08-11 19:43:03 +02:00
|
|
|
break
|
2024-08-08 21:49:24 +02:00
|
|
|
|
|
|
|
func _on_player_connected(id):
|
|
|
|
if multiplayer.is_server():
|
|
|
|
Client.rpc_id(id,"send_playerinfo")
|
|
|
|
|
|
|
|
func create_player_list(room_name):
|
|
|
|
var player_list = {}
|
|
|
|
for player in player_associations:
|
|
|
|
if player_associations[player] == room_name:
|
|
|
|
player_list[player] = name_associations[player]
|
|
|
|
return player_list
|
|
|
|
|
|
|
|
@rpc("any_peer","call_remote","reliable")
|
|
|
|
func recieve_playerinfo(player_name, room_name):
|
|
|
|
var exists = false
|
|
|
|
var id = multiplayer.get_remote_sender_id()
|
|
|
|
for game_room in game_rooms:
|
|
|
|
if game_room == room_name:
|
|
|
|
exists = true
|
|
|
|
player_associations[id] = room_name
|
|
|
|
name_associations[id] = player_name
|
|
|
|
if !exists:
|
|
|
|
game_rooms[room_name] = id
|
|
|
|
Server.rpc_id(id,"elevate")
|
|
|
|
var player_list = create_player_list(room_name)
|
|
|
|
for p in player_list:
|
|
|
|
Client.rpc_id(p,"get_player_list",player_list)
|