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