99 lines
2.2 KiB
GDScript3
Raw Normal View History

2024-01-24 00:09:50 +01:00
class_name Server
2024-01-20 22:18:58 +01:00
extends NetworkNode
2024-01-21 01:21:58 +01:00
## Port number.
2024-01-20 22:18:58 +01:00
@export var port := 4242
2024-01-21 01:21:58 +01:00
## Timeout in milliseconds.
@export var timeout := 5000
## Maximum number of pending connections.
2024-01-20 22:18:58 +01:00
@export var max_pending_connections := 4096
var server := UDPServer.new()
2024-01-21 01:21:58 +01:00
var clients := {}
2024-01-20 22:18:58 +01:00
var packet_count := 0
2024-01-21 01:21:58 +01:00
var now := 0
2024-01-20 22:18:58 +01:00
func _init():
super._init()
server.set_max_pending_connections(max_pending_connections)
server.listen(port)
2024-01-24 00:09:50 +01:00
Performance.add_custom_monitor("Server/Clients", get_client_count)
Performance.add_custom_monitor("Server/Packets", get_packet_count)
2024-01-20 22:18:58 +01:00
func _process(_delta):
server.poll()
2024-01-24 00:09:50 +01:00
func _physics_process(_delta):
2024-01-21 01:21:58 +01:00
now = Time.get_ticks_msec()
2024-01-20 22:18:58 +01:00
2024-01-22 17:12:26 +01:00
# Accept new connections
2024-01-20 22:18:58 +01:00
while server.is_connection_available():
2024-01-24 00:09:50 +01:00
var peer := server.take_connection()
peer_to_client(peer)
2024-01-22 17:12:26 +01:00
# Process packets from clients
2024-01-22 23:41:48 +01:00
for address in clients:
var client = clients[address]
2024-01-21 01:21:58 +01:00
var peer = client.peer
2024-01-20 22:18:58 +01:00
while peer.get_available_packet_count() > 0:
2024-01-24 00:09:50 +01:00
client.last_packet = now
2024-01-20 22:18:58 +01:00
var packet = peer.get_packet()
handle_packet(packet, peer)
packet_count += 1
2024-01-24 00:09:50 +01:00
# Disconnect
for address in clients.keys():
var client = clients[address]
var last_packet_time = client.last_packet
if now - last_packet_time > timeout:
peer_disconnected(client)
clients.erase(address)
func broadcast(packet: PackedByteArray):
for address in clients:
clients[address].peer.put_packet(packet)
func broadcast_others(packet: PackedByteArray, exclude: Client):
for address in clients:
var client = clients[address]
if client == exclude:
continue
client.peer.put_packet(packet)
2024-01-21 01:21:58 +01:00
2024-01-24 00:09:50 +01:00
func get_client_count() -> int:
return clients.size()
2024-01-22 17:12:26 +01:00
2024-01-24 00:09:50 +01:00
func get_packet_count() -> int:
var tmp := packet_count
packet_count = 0
return tmp
2024-01-21 01:21:58 +01:00
2024-01-22 23:41:48 +01:00
func peer_address(peer: PacketPeerUDP):
return "%s:%d" % [peer.get_packet_ip(), peer.get_packet_port()]
2024-01-24 00:09:50 +01:00
func peer_connected(c: Client):
print("[%s] Connected." % c.address)
func peer_disconnected(c: Client):
print("[%s] Disconnected." % c.address)
if c.player:
c.player.queue_free()
2024-01-22 23:41:48 +01:00
func peer_to_client(peer: PacketPeerUDP) -> Client:
var address = peer_address(peer)
if !clients.has(address):
2024-01-24 00:09:50 +01:00
var client = Client.new(peer, address)
2024-01-22 23:41:48 +01:00
clients[address] = client
peer_connected(client)
return client
return clients[address]