84 inline explicit NetCommand(CommandQueue* commandQueue) :
85 _g_commandQueue(commandQueue)
87 virtual ~NetCommand() =
default;
89 [[nodiscard]]
virtual NetCommandTypes getType()
const = 0;
90 [[nodiscard]] NetCommandResults update(TransmitPacketPtr& buffPacket,
91 IpAddress::Types addressType,
93 std::chrono::milliseconds deltaTime);
94 [[nodiscard]]
virtual NetCommandResults
95 onReceive(std::unique_ptr<ProtocolPacket>& packet, IpAddress::Types addressType,
Client& client) = 0;
97 [[nodiscard]]
virtual std::chrono::milliseconds getTimeoutTarget()
const;
100 [[nodiscard]]
virtual NetCommandResults
101 internalUpdate(TransmitPacketPtr& buffPacket, IpAddress::Types addressType,
Client& client) = 0;
102 [[nodiscard]]
virtual NetCommandResults timeout(
Client& client);
105 CommandQueue* _g_commandQueue{
nullptr};
108 std::chrono::milliseconds g_timeout{0};
114 using NetCommand::NetCommand;
117 [[nodiscard]] NetCommandTypes getType()
const override {
return NetCommandTypes::DISCOVER_MTU; }
119 [[nodiscard]] NetCommandResults
120 internalUpdate(TransmitPacketPtr& buffPacket, IpAddress::Types addressType,
Client& client)
override;
121 [[nodiscard]] NetCommandResults
122 onReceive(std::unique_ptr<ProtocolPacket>& packet, IpAddress::Types addressType,
Client& client)
override;
124 [[nodiscard]]
inline std::future<uint16_t> get_future() {
return this->g_promise.get_future(); }
126 [[nodiscard]]
inline std::chrono::milliseconds getTimeoutTarget()
const override {
return FGE_NET_MTU_TIMEOUT_MS; }
129 [[nodiscard]] NetCommandResults timeout(
Client& client)
override;
131 std::promise<uint16_t> g_promise;
132 uint16_t g_currentMTU{0};
133 uint16_t g_targetMTU{0};
134 uint16_t g_maximumMTU{0};
135 uint16_t g_intervalMTU{0};
136 std::size_t g_tryCount{0};
144 } g_state{States::ASKING};
150 using NetCommand::NetCommand;
153 void setVersioningString(std::string_view versioningString);
154 [[nodiscard]] std::string
const& getVersioningString()
const;
156 [[nodiscard]] NetCommandTypes getType()
const override {
return NetCommandTypes::CONNECT; }
158 [[nodiscard]] NetCommandResults
159 internalUpdate(TransmitPacketPtr& buffPacket, IpAddress::Types addressType,
Client& client)
override;
160 [[nodiscard]] NetCommandResults
161 onReceive(std::unique_ptr<ProtocolPacket>& packet, IpAddress::Types addressType,
Client& client)
override;
163 [[nodiscard]]
inline std::future<bool> get_future() {
return this->g_promise.get_future(); }
165 [[nodiscard]]
inline std::chrono::milliseconds getTimeoutTarget()
const override
167 return FGE_NET_CONNECT_TIMEOUT_MS;
171 [[nodiscard]] NetCommandResults timeout(
Client& client)
override;
173 std::promise<bool> g_promise;
176 TRANSMIT_FGE_HANDSHAKE,
177 WAITING_FGE_HANDSHAKE,
180 WAITING_SERVER_FINAL_MTU,
186 } g_state{States::TRANSMIT_FGE_HANDSHAKE};
187 bool g_mtuTested{
false};
188 std::future<uint16_t> g_mtuFuture;
189 std::string g_versioningString;
195 using NetCommand::NetCommand;
198 [[nodiscard]] NetCommandTypes getType()
const override {
return NetCommandTypes::CONNECT; }
200 [[nodiscard]] NetCommandResults
201 internalUpdate(TransmitPacketPtr& buffPacket, IpAddress::Types addressType,
Client& client)
override;
202 [[nodiscard]] NetCommandResults
203 onReceive(std::unique_ptr<ProtocolPacket>& packet, IpAddress::Types addressType,
Client& client)
override;
205 [[nodiscard]]
inline std::future<void> get_future() {
return this->g_promise.get_future(); }
207 [[nodiscard]]
inline std::chrono::milliseconds getTimeoutTarget()
const override
209 return FGE_NET_DISCONNECT_TIMEOUT_MS;
213 [[nodiscard]] NetCommandResults timeout(
Client& client)
override;
215 std::promise<void> g_promise;
216 bool g_transmitted{
false};