class ServerPort
Public Class Methods
new(game, port_number, max_clients)
click to toggle source
# File lib/game_2d/server_port.rb, line 7 def initialize(game, port_number, max_clients) @game = game @server = _create_enet_server port_number, max_clients, 2, 0, 0 puts "ENet server listening on #{port_number}" @clients = {} @player_connections = {} # player_name => ServerConnection @new_players = Set.new @server.on_connection method(:on_connection) @server.on_packet_receive method(:on_packet_receive) @server.on_disconnection method(:on_disconnection) end
Public Instance Methods
_create_enet_server(*args)
click to toggle source
# File lib/game_2d/server_port.rb, line 21 def _create_enet_server(*args) ENet::Server.new *args end
broadcast_player_action(hash, channel=0)
click to toggle source
Re-broadcast to everyone except the original sender
# File lib/game_2d/server_port.rb, line 70 def broadcast_player_action(hash, channel=0) sender_player_name = hash[:player_name] fail "No player_name in #{hash.inspect}" unless sender_player_name data = hash.to_json @player_connections.each do |player_name, conn| @server.send_packet(conn.id, data, false, channel) unless player_name == sender_player_name end @server.flush end
deregister_player(conn)
click to toggle source
# File lib/game_2d/server_port.rb, line 50 def deregister_player(conn) player_name = conn.player_name if conn.authenticated? && @player_connections[player_name] == conn puts "Player #{player_name} logged out at <#{@game.tick}>" @player_connections.delete player_name conn.close end end
new_players()
click to toggle source
# File lib/game_2d/server_port.rb, line 59 def new_players copy = @new_players.dup @new_players.clear copy end
on_connection(id, ip)
click to toggle source
# File lib/game_2d/server_port.rb, line 25 def on_connection(id, ip) puts "New ENet connection #{id} from #{ip}" @clients[id] = ServerConnection.new(self, @game, @server, id, ip) end
on_disconnection(id)
click to toggle source
# File lib/game_2d/server_port.rb, line 34 def on_disconnection(id) puts "ENet connection #{id} disconnected" gone = @clients.delete id deregister_player(gone) puts "Remaining connection IDs: #{@clients.keys.sort.join(', ')}" end
on_packet_receive(id, data, channel)
click to toggle source
# File lib/game_2d/server_port.rb, line 30 def on_packet_receive(id, data, channel) @clients[id].on_packet(data, channel) end
player_name_connection(player_name)
click to toggle source
# File lib/game_2d/server_port.rb, line 65 def player_name_connection(player_name) @player_connections[player_name] end
register_player(player_name, conn)
click to toggle source
# File lib/game_2d/server_port.rb, line 41 def register_player(player_name, conn) if old_conn = @player_connections[player_name] warn "Disconnecting old connection for #{player_name} (#{old_conn})" old_conn.disconnect! end @player_connections[player_name] = conn @new_players << player_name end
update(timeout=0)
click to toggle source
# File lib/game_2d/server_port.rb, line 80 def update(timeout=0) # non-blocking by default @server.update(timeout) end
update_until(stop_time)
click to toggle source
# File lib/game_2d/server_port.rb, line 84 def update_until(stop_time) while Time.now.to_r < stop_time do update end end