Class: ServerPort

Inherits:
Object
  • Object
show all
Defined in:
lib/game_2d/server_port.rb

Instance Method Summary collapse

Constructor Details

#initialize(game, port_number, max_clients) ⇒ ServerPort

Returns a new instance of ServerPort.



7
8
9
10
11
12
13
14
15
16
17
18
19
# 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

Instance Method Details

#_create_enet_server(*args) ⇒ Object



21
22
23
# 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) ⇒ Object

Re-broadcast to everyone except the original sender



70
71
72
73
74
75
76
77
78
# 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) ⇒ Object



50
51
52
53
54
55
56
57
# 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_playersObject



59
60
61
62
63
# 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) ⇒ Object



25
26
27
28
# 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) ⇒ Object



34
35
36
37
38
39
# 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) ⇒ Object



30
31
32
# 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) ⇒ Object



65
66
67
# 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) ⇒ Object



41
42
43
44
45
46
47
48
# 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) ⇒ Object

non-blocking by default



80
81
82
# 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) ⇒ Object



84
85
86
87
88
# 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