mirror of
https://github.com/cyberarm/i-mic-fps.git
synced 2025-12-15 07:32:35 +00:00
BROKEN: Work on netcode refactor
This commit is contained in:
@@ -1,2 +1,6 @@
|
|||||||
class Channel
|
module CyberarmEngine
|
||||||
|
module Networking
|
||||||
|
class Channel
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
@@ -1,27 +1,31 @@
|
|||||||
class Connection
|
module CyberarmEngine
|
||||||
def initialize(hostname:, port:, max_clients:, channels: 1)
|
module Networking
|
||||||
end
|
class Connection
|
||||||
|
def initialize(hostname:, port:, max_clients:, channels: 1)
|
||||||
|
end
|
||||||
|
|
||||||
# Callbacks #
|
# Callbacks #
|
||||||
def connected
|
def connected
|
||||||
end
|
end
|
||||||
|
|
||||||
def disconnected(reason)
|
def disconnected(reason)
|
||||||
end
|
end
|
||||||
|
|
||||||
def reconnected
|
def reconnected
|
||||||
end
|
end
|
||||||
|
|
||||||
def packet_received(message, channel)
|
def packet_received(message, channel)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Functions #
|
# Functions #
|
||||||
def send_packet(message, reliable, channel = 0)
|
def send_packet(message, reliable, channel = 0)
|
||||||
end
|
end
|
||||||
|
|
||||||
def broadcast_packet(message, reliable, channel = 0)
|
def broadcast_packet(message, reliable, channel = 0)
|
||||||
end
|
end
|
||||||
|
|
||||||
def disconnect(reason = "")
|
def disconnect(reason = "")
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
19
lib/networking/backend/packet.rb
Normal file
19
lib/networking/backend/packet.rb
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
module CyberarmEngine
|
||||||
|
module Networking
|
||||||
|
class Packet
|
||||||
|
attr_reader :protocol_version, :type, :peer_id, :message
|
||||||
|
|
||||||
|
def self.type
|
||||||
|
raise NotImplementedError, "#{self.class}.type must be defined!"
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.decode(packet)
|
||||||
|
raise NotImplementedError, "#{self.class}.decode must be defined!"
|
||||||
|
end
|
||||||
|
|
||||||
|
def encode
|
||||||
|
raise NotImplementedError, "#{self.class}#encode must be defined!"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
6
lib/networking/backend/packet_handler.rb
Normal file
6
lib/networking/backend/packet_handler.rb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
module CyberarmEngine
|
||||||
|
module Networking
|
||||||
|
module PacketHandler
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
37
lib/networking/backend/packets/data_packet.rb
Normal file
37
lib/networking/backend/packets/data_packet.rb
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
module CyberarmEngine
|
||||||
|
module Networking
|
||||||
|
class DataPacket < Packet
|
||||||
|
HEADER_PACKER = "CCn"
|
||||||
|
HEADER_LENGTH = 1 + 1 + 4 # bytes
|
||||||
|
|
||||||
|
def self.type
|
||||||
|
Protocol::DATA
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.decode(raw_message)
|
||||||
|
header = raw_message.unpack(HEADER_PACKER)
|
||||||
|
message = raw_message[HEADER_LENGTH..raw_message.length - 1]
|
||||||
|
|
||||||
|
DataPacket.new(protocol_version: header[0], type: header[1], message: message)
|
||||||
|
end
|
||||||
|
|
||||||
|
def initialize(protocol_version:, type:, peer_id:, message:)
|
||||||
|
@protocol_version = protocol_version
|
||||||
|
@type = type
|
||||||
|
@peer_id = peer_id
|
||||||
|
|
||||||
|
@message = message
|
||||||
|
end
|
||||||
|
|
||||||
|
def encode
|
||||||
|
header = [
|
||||||
|
Protocol::PROTOCOL_VERSION,
|
||||||
|
@type,
|
||||||
|
@peer_id,
|
||||||
|
].pack(HEADER_PACKER)
|
||||||
|
|
||||||
|
"#{header}#{message}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -1,10 +1,14 @@
|
|||||||
class Peer
|
module CyberarmEngine
|
||||||
attr_reader :id, :hostname, :port, :data
|
module Networking
|
||||||
def initialize(id:, hostname:, port:)
|
class Peer
|
||||||
@id = id
|
attr_reader :id, :hostname, :port, :data
|
||||||
@hostname = hostname
|
def initialize(id:, hostname:, port:)
|
||||||
@port = port
|
@id = id
|
||||||
|
@hostname = hostname
|
||||||
|
@port = port
|
||||||
|
|
||||||
@data = {}
|
@data = {}
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -1,34 +1,23 @@
|
|||||||
class IMICFPS
|
module CyberarmEngine
|
||||||
module Networking
|
module Networking
|
||||||
module Protocol
|
module Protocol
|
||||||
MAX_PACKET_SIZE = 1024
|
MAX_PACKET_SIZE = 1024
|
||||||
PROTOCOL_VERSION = 0 # int
|
PROTOCOL_VERSION = 0 # int
|
||||||
HEARTBEAT_INTERVAL = 250 # ms
|
HEARTBEAT_INTERVAL = 5_000 # ms
|
||||||
TIMEOUT_PERIOD = 30_000 # ms
|
TIMEOUT_PERIOD = 30_000 # ms
|
||||||
|
|
||||||
packet_types = %w{
|
packet_types = %w{
|
||||||
# protocol packets
|
# protocol packets
|
||||||
reliable
|
reliable
|
||||||
multipart
|
multipart
|
||||||
acknowledgement
|
|
||||||
control
|
control
|
||||||
data
|
data
|
||||||
|
|
||||||
# protocol control packets
|
# control packet types
|
||||||
connect
|
|
||||||
verify_connect
|
|
||||||
disconnect
|
disconnect
|
||||||
authenticate
|
acknowledge
|
||||||
heartbeat
|
heartbeat
|
||||||
|
ping
|
||||||
# game data packets
|
|
||||||
snapshot
|
|
||||||
player_joined
|
|
||||||
player_left
|
|
||||||
play_sound_effect
|
|
||||||
create_particle
|
|
||||||
create_entity
|
|
||||||
remove_entity
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# emulate c-like enum
|
# emulate c-like enum
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
class IMICFPS
|
|
||||||
module Networking
|
|
||||||
class Packet
|
|
||||||
HEADER_PACKER = "CnCnCC"
|
|
||||||
HEADER_SIZE = 8
|
|
||||||
|
|
||||||
def self.from_stream(raw)
|
|
||||||
header = raw[ 0..HEADER_SIZE ].unpack(HEADER_PACKER)
|
|
||||||
payload = raw[HEADER_SIZE..raw.length - 1]
|
|
||||||
|
|
||||||
new(peer_id: header.last, sequence: header[1], type: header[2], payload: payload)
|
|
||||||
end
|
|
||||||
|
|
||||||
# TODO: Handle splitting big packets into smaller ones
|
|
||||||
def self.splinter(packet)
|
|
||||||
packets = [packet]
|
|
||||||
|
|
||||||
return packets
|
|
||||||
end
|
|
||||||
|
|
||||||
attr_reader :peer_id, :sequence_number, :type, :parity, :payload, :content_length
|
|
||||||
def initialize(peer_id:, sequence:, type:, payload:)
|
|
||||||
@peer_id = peer_id
|
|
||||||
@sequence_number = sequence
|
|
||||||
@type = type
|
|
||||||
@parity = calculate_parity
|
|
||||||
@payload = payload
|
|
||||||
|
|
||||||
@content_length = payload.length
|
|
||||||
end
|
|
||||||
|
|
||||||
def header
|
|
||||||
[
|
|
||||||
Protocol::PROTOCOL_VERSION, # char
|
|
||||||
@sequence_number, # uint16
|
|
||||||
@type, # char
|
|
||||||
@content_length, # uint16
|
|
||||||
@parity, # char
|
|
||||||
@peer_id, # char
|
|
||||||
].pack(HEADER_PACKER)
|
|
||||||
end
|
|
||||||
|
|
||||||
def calculate_parity
|
|
||||||
return 0
|
|
||||||
end
|
|
||||||
|
|
||||||
def encode
|
|
||||||
"#{header}#{@payload}"
|
|
||||||
end
|
|
||||||
|
|
||||||
def decode(payload)
|
|
||||||
payload
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
class IMICFPS
|
class IMICFPS
|
||||||
module Networking
|
module Networking
|
||||||
class SnapshotPacket < Packet
|
class SnapshotPacket < CyberarmEngine::Networking::Packet
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
Reference in New Issue
Block a user