diff --git a/lib/networking/client.rb b/lib/networking/client.rb index 1e9290c..93d492d 100644 --- a/lib/networking/client.rb +++ b/lib/networking/client.rb @@ -1,16 +1,13 @@ class IMICFPS module Networking class Client - attr_reader :uuid, - :packets_sent, :packets_received, + attr_reader :packets_sent, :packets_received, :data_sent, :data_received def initialize(socket:) @socket = socket @write_queue = [] @read_queue = [] - @uuid = "not_defined" - @packets_sent = 0 @packets_received = 0 @data_sent = 0 @@ -18,9 +15,23 @@ class IMICFPS end def read + data = @socket.recvfrom_nonblock(Protocol::MAX_PACKET_SIZE) + @read_queue << Packet.decode(data) + + @packets_received += 1 + @data_received += data.length + rescue IO::WaitReadable end def write + @write_queue.each do |packet| + raw = Packet.encode + @socket.send(raw, 0) + @write_queue.delete(packet) + + @packets_sent += 1 + @data_sent += raw.length + end end def puts(packet) @@ -28,7 +39,7 @@ class IMICFPS end def gets - @socket.recvfrom_nonblock(Protocol::MAX_PACKET_SIZE) + @read_queue.shift end def close diff --git a/lib/networking/packet.rb b/lib/networking/packet.rb index 2986881..e662ed7 100644 --- a/lib/networking/packet.rb +++ b/lib/networking/packet.rb @@ -1,17 +1,43 @@ class IMICFPS module Networking class Packet - def initialize(type:, payload:) + HEADER_PACKER = "CnCnC" + HEADER_SIZE = 7 + + def self.from_stream(raw) + header = raw[ 0..HEADER_SIZE ].unpack(HEADER_PACKER) + payload = raw[HEADER_SIZE + 1..raw.length - 1] + + new(header[1], [2], payload) end - def self.encode(packet) - "#{packet.type}|#{packet.payload}" + def initialize(sequence:, type:, payload:) + @sequence_number = sequence + @packet_type = type + @content_length = payload.length + @parity = calculate_parity + @payload = payload end - def self.decode(string) - split = string.split("|") + def header + [ + Protocol::PROTOCOL_VERSION, # char + @sequence_number, # uint16 + @packet_type, # char + @content_length, # uint16 + @parity, # char + ].unpack(HEADER_PACKER) + end - Packet.new(split.first, split.last) + def calculate_parity + return 0 + end + + def encode + "#{header}#{@payload}" + end + + def decode(payload) end end end diff --git a/lib/networking/packet_handlers/move.rb b/lib/networking/packet_handlers/move.rb deleted file mode 100644 index e69de29..0000000 diff --git a/lib/networking/packet_handlers/snapshot.rb b/lib/networking/packet_handlers/snapshot.rb new file mode 100644 index 0000000..49c6f7c --- /dev/null +++ b/lib/networking/packet_handlers/snapshot.rb @@ -0,0 +1,6 @@ +class IMICFPS + module Networking + class SnapshotPacket < Packet + end + end +end \ No newline at end of file diff --git a/lib/networking/protocol.rb b/lib/networking/protocol.rb index 4d6581b..aa4c4d0 100644 --- a/lib/networking/protocol.rb +++ b/lib/networking/protocol.rb @@ -1,7 +1,6 @@ class IMICFPS module Networking module Protocol - MAX_CLIENTS = 32 MAX_PACKET_SIZE = 1024 PROTOCOL_VERSION = 0 # int HEARTBEAT_INTERVAL = 250 # ms @@ -22,11 +21,13 @@ class IMICFPS heartbeat # game data packets - client_connected - client_disconnected - entity_move + snapshot + player_joined + player_left play_sound_effect create_particle + create_entity + remove_entity } # emulate c-like enum diff --git a/lib/networking/server.rb b/lib/networking/server.rb index ee04c36..adfa774 100644 --- a/lib/networking/server.rb +++ b/lib/networking/server.rb @@ -1,8 +1,8 @@ class IMICFPS module Networking - MAX_CLIENTS = 32 - class Server + MAX_CLIENTS = 32 + attr_reader :hostname, :port, :max_clients, :clients def initialize(hostname:, port:, max_clients: MAX_CLIENTS) @hostname = hostname diff --git a/lib/states/game_states/game.rb b/lib/states/game_states/game.rb index 9235d8f..d8760dc 100644 --- a/lib/states/game_states/game.rb +++ b/lib/states/game_states/game.rb @@ -109,13 +109,5 @@ eos @camera.button_up(id) end - - def needs_cursor? - @needs_cursor - end - - def lose_focus - puts 'Bye' - end end end