From 75185425b6d04e0e737996f9bc8b28702086b7c4 Mon Sep 17 00:00:00 2001 From: Cyberarm Date: Thu, 26 Mar 2020 14:25:55 -0500 Subject: [PATCH] Stubbed out files for networking --- Gemfile | 1 + i-mic-fps-server.rb | 16 +++++ i-mic-fps.rb | 9 +++ lib/map.rb | 1 - lib/networking/backends/memory_connection.rb | 6 ++ lib/networking/backends/memory_server.rb | 6 ++ lib/networking/client.rb | 18 ++++++ lib/networking/connection.rb | 14 +++++ lib/networking/director.rb | 61 ++++++++++++++++++++ lib/networking/events.rb | 11 ++++ lib/networking/packet.rb | 18 ++++++ lib/networking/packet_handler.rb | 6 ++ lib/networking/server.rb | 26 +++++++++ lib/states/game_states/game.rb | 2 + 14 files changed, 194 insertions(+), 1 deletion(-) create mode 100644 i-mic-fps-server.rb create mode 100644 lib/networking/backends/memory_connection.rb create mode 100644 lib/networking/backends/memory_server.rb create mode 100644 lib/networking/client.rb create mode 100644 lib/networking/connection.rb create mode 100644 lib/networking/director.rb create mode 100644 lib/networking/events.rb create mode 100644 lib/networking/packet.rb create mode 100644 lib/networking/packet_handler.rb create mode 100644 lib/networking/server.rb diff --git a/Gemfile b/Gemfile index cf086c5..493b75d 100644 --- a/Gemfile +++ b/Gemfile @@ -2,6 +2,7 @@ source "https://rubygems.org" gem "opengl-bindings", require: "opengl" gem "cyberarm_engine", git: "https://github.com/cyberarm/cyberarm_engine" gem "nokogiri", ">= 1.11.0.rc1" +gem "async-websocket" group(:packaging) do gem "ocra" diff --git a/i-mic-fps-server.rb b/i-mic-fps-server.rb new file mode 100644 index 0000000..219a4bc --- /dev/null +++ b/i-mic-fps-server.rb @@ -0,0 +1,16 @@ +require "async/websocket" + +require_relative "lib/networking/director" +require_relative "lib/networking/packet_handler" +require_relative "lib/networking/server" +require_relative "lib/networking/client" + +require_relative "lib/networking/backends/memory_server" +require_relative "lib/networking/backends/memory_connection" + +director = IMICFPS::Networking::Director.new(mode: :server, hostname: "0.0.0.0", port: 56789, interface: IMICFPS::Networking::MemoryServer) +director.define_singleton_method(:tick) do |dt| + puts "Ticked: #{dt}" +end + +director.run.join \ No newline at end of file diff --git a/i-mic-fps.rb b/i-mic-fps.rb index c1ae3ce..edea256 100644 --- a/i-mic-fps.rb +++ b/i-mic-fps.rb @@ -106,6 +106,15 @@ require_relative "lib/scenes/turn_table" require_relative "lib/crosshair" require_relative "lib/demo" +require_relative "lib/networking/director" +require_relative "lib/networking/packet_handler" +require_relative "lib/networking/client" +require_relative "lib/networking/server" +require_relative "lib/networking/connection" + +require_relative "lib/networking/backends/memory_server" +require_relative "lib/networking/backends/memory_connection" + require_relative "lib/overlay" require_relative "lib/window" diff --git a/lib/map.rb b/lib/map.rb index 1bee346..6f16fc4 100644 --- a/lib/map.rb +++ b/lib/map.rb @@ -61,7 +61,6 @@ class IMICFPS @collision_manager.update @entities.each(&:update) - # @lights.each(&:update) end end end diff --git a/lib/networking/backends/memory_connection.rb b/lib/networking/backends/memory_connection.rb new file mode 100644 index 0000000..363945e --- /dev/null +++ b/lib/networking/backends/memory_connection.rb @@ -0,0 +1,6 @@ +class IMICFPS + module Networking + class MemoryConnection < Connection + end + end +end \ No newline at end of file diff --git a/lib/networking/backends/memory_server.rb b/lib/networking/backends/memory_server.rb new file mode 100644 index 0000000..3f80f66 --- /dev/null +++ b/lib/networking/backends/memory_server.rb @@ -0,0 +1,6 @@ +class IMICFPS + module Networking + class MemoryServer < Server + end + end +end \ No newline at end of file diff --git a/lib/networking/client.rb b/lib/networking/client.rb new file mode 100644 index 0000000..7f9fc5a --- /dev/null +++ b/lib/networking/client.rb @@ -0,0 +1,18 @@ +class IMICFPS + module Networking + class Client + def initialize(socket:) + @socket = socket + end + + def read + end + + def write + end + + def close + end + end + end +end \ No newline at end of file diff --git a/lib/networking/connection.rb b/lib/networking/connection.rb new file mode 100644 index 0000000..41de78e --- /dev/null +++ b/lib/networking/connection.rb @@ -0,0 +1,14 @@ +class IMICFPS + module Networking + class Connection + def initialize(hostname:, port:) + end + + def connect + end + + def close + end + end + end +end \ No newline at end of file diff --git a/lib/networking/director.rb b/lib/networking/director.rb new file mode 100644 index 0000000..2a0fd19 --- /dev/null +++ b/lib/networking/director.rb @@ -0,0 +1,61 @@ +class IMICFPS + module Networking + class Director + attr_reader :mode, :hostname, :port, :tick_rate, :storage + def initialize(mode:, hostname:, port:, interface:, state: nil, tick_rate: 2) + @mode = mode + @hostname = hostname + @port = port + @state = state + @tick_rate = (1000.0 / tick_rate) / 1000.0 + + case @mode + when :server + @server = interface.new(hostname: @hostname, port: @port) + when :connection + @connection = interface.new(hostname: @hostname, port: @port) + when :memory + @server = interface[:server].new(hostname: @hostname, port: @port) + @connection = interface[:connection].new(hostname: @hostname, port: @port) + else + raise ArgumentError, "Expected mode to be :server, :connection, or :memory, not #{mode.inspect}" + end + + @last_tick_time = milliseconds + @directing = true + @storage = {} + end + + def run + Thread.start do |thread| + while(@directing) + dt = milliseconds - @last_tick_time + + tick(dt) + + @server.update if @server + @connection.update if @connection + + @last_tick_time = milliseconds + sleep(@tick_rate) + end + end + end + + def tick(dt) + end + + def shutdown + @directing = false + + @clients.each(&:close) + @server.update if @server + @connection.update if @connection + end + + def milliseconds + Process.clock_gettime(Process::CLOCK_MONOTONIC) + end + end + end +end \ No newline at end of file diff --git a/lib/networking/events.rb b/lib/networking/events.rb new file mode 100644 index 0000000..6e764cb --- /dev/null +++ b/lib/networking/events.rb @@ -0,0 +1,11 @@ +class IMICFPS + module Networking + module Events + def on_connect(client) + end + + def on_disconnect(client) + end + end + end +end \ No newline at end of file diff --git a/lib/networking/packet.rb b/lib/networking/packet.rb new file mode 100644 index 0000000..2986881 --- /dev/null +++ b/lib/networking/packet.rb @@ -0,0 +1,18 @@ +class IMICFPS + module Networking + class Packet + def initialize(type:, payload:) + end + + def self.encode(packet) + "#{packet.type}|#{packet.payload}" + end + + def self.decode(string) + split = string.split("|") + + Packet.new(split.first, split.last) + end + end + end +end \ No newline at end of file diff --git a/lib/networking/packet_handler.rb b/lib/networking/packet_handler.rb new file mode 100644 index 0000000..e88df79 --- /dev/null +++ b/lib/networking/packet_handler.rb @@ -0,0 +1,6 @@ +class IMICFPS + module Networking + class PacketHandler + end + end +end \ No newline at end of file diff --git a/lib/networking/server.rb b/lib/networking/server.rb new file mode 100644 index 0000000..e7ec776 --- /dev/null +++ b/lib/networking/server.rb @@ -0,0 +1,26 @@ +class IMICFPS + module Networking + MAX_CLIENTS = 32 + + class Server + attr_reader :hostname, :port, :max_clients, :clients + def initialize(hostname:, port:, max_clients: MAX_CLIENTS) + @hostname = hostname + @port = port + @max_clients = max_clients + + @clients = [] + @socket = nil + end + + def bind + end + + def broadcast(packet) + end + + def close + end + end + end +end \ No newline at end of file diff --git a/lib/states/game_states/game.rb b/lib/states/game_states/game.rb index 2b687eb..a509569 100644 --- a/lib/states/game_states/game.rb +++ b/lib/states/game_states/game.rb @@ -9,6 +9,7 @@ class IMICFPS @player = @map.find_entity_by(name: "character") @camera = Camera.new(position: @player.position.clone) @camera.attach_to(@player) + @director = Networking::Director.new(mode: :memory, hostname: "i-mic.rubyclan.org", port: 56789, interface: { server: Networking::MemoryServer, connection: Networking::MemoryConnection }, state: self) @crosshair = Crosshair.new @@ -39,6 +40,7 @@ class IMICFPS control_player @camera.update + @director.tick(window.dt) if window.config.get(:debug_options, :stats) @text.text = update_text