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 = {}
  @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) ⇒ Object

Re-broadcast to everyone except the original sender



61
62
63
64
65
66
67
68
69
# File 'lib/game_2d/server_port.rb', line 61

def broadcast_player_action(hash, channel)
  sender_player_id = hash[:player_id]
  fail "No player_id in #{hash.inspect}" unless sender_player_id
  data = hash.to_json
  @player_connections.each do |player_id, conn|
    @server.send_packet(conn.id, data, false, channel) unless player_id == sender_player_id
  end
  @server.flush
end

#deregister_player(player_id) ⇒ Object



46
47
48
# File 'lib/game_2d/server_port.rb', line 46

def deregister_player(player_id)
  @player_connections.delete player_id
end

#new_playersObject



50
51
52
53
54
# File 'lib/game_2d/server_port.rb', line 50

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
  gone.close
  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_connection(player_id) ⇒ Object



56
57
58
# File 'lib/game_2d/server_port.rb', line 56

def player_connection(player_id)
  @player_connections[player_id]
end

#register_player(player_id, conn) ⇒ Object



41
42
43
44
# File 'lib/game_2d/server_port.rb', line 41

def register_player(player_id, conn)
  @player_connections[player_id] = conn
  @new_players << player_id
end

#update(timeout = 0) ⇒ Object

non-blocking by default



71
72
73
# File 'lib/game_2d/server_port.rb', line 71

def update(timeout=0) # non-blocking by default
  @server.update(timeout)
end

#update_until(stop_time) ⇒ Object



75
76
77
78
79
# File 'lib/game_2d/server_port.rb', line 75

def update_until(stop_time)
  while Time.now.to_r < stop_time do
    update
  end
end