sunder/scripts/multiplayer/server.gd
2026-02-18 18:33:17 -05:00

55 lines
1.5 KiB
GDScript

extends Node
const TICK_RATE := 128
const TICK_INTERVAL := 1.0 / TICK_RATE
var tick_timer := 0.0
var server_time := 0.0
# Keep track of players
var players := {}
func _start_server(port:int = 9000) -> void:
var peer := ENetMultiplayerPeer.new()
peer.create_server(port, 1024)
multiplayer.multiplayer_peer = peer
multiplayer.peer_connected.connect(_on_peer_connected)
multiplayer.peer_disconnected.connect(_on_peer_disconnected)
prints("server started on port", port)
func _process(delta: float) -> void:
tick_timer += delta
while tick_timer >= TICK_INTERVAL:
_server_tick()
tick_timer -= TICK_INTERVAL
func _server_tick() -> void:
server_time += TICK_INTERVAL
# for each player, update logic
for id:int in players.keys():
var player:Player = players[id]
player["position"] += player["velocity"] * TICK_INTERVAL
# broadcast game state to all clients
update_player_states.rpc(players)
func _on_peer_connected(peer_id:int) -> void:
print("Player connected:", peer_id)
players[peer_id] = {
"position": Vector2.ZERO,
"velocity": Vector2.ZERO
}
func _on_peer_disconnected(peer_id:int) -> void:
print("Player disconnected:", peer_id)
players.erase(peer_id)
@rpc("any_peer")
func send_input(input_velocity: Vector2) -> void:
var id:int = multiplayer.get_remote_sender_id()
if players.has(id):
players[id]["velocity"] = input_velocity
@rpc("authority", "unreliable")
func update_player_states(state:Array[Dictionary]) -> void:
print(state)
pass # No-op on server