Files
Archimedes/modules/ClientModule/ClientModule.h
2025-05-12 14:32:13 -05:00

74 lines
2.2 KiB
C++

#include "Archimedes.h"
#include <steam/steamnetworkingsockets.h>
#include <steam/isteamnetworkingutils.h>
#include "utils/Events/NetworkEvents.h"
class ClientModule : public Archimedes::Module {
public:
ClientModule(Archimedes::App*, void*);
ClientModule() { name = "ClientModule"; }
~ClientModule();
void onLoad();
void run();
bool onEvent(const Archimedes::Event&);
void startClient(SteamNetworkingIPAddr&);
void stopClient();
void sendReliable(const void* data, uint32 byteCount) {
interface->SendMessageToConnection(connection, data, byteCount, k_nSteamNetworkingSend_Reliable, nullptr);
app->emitEvent(new Archimedes::DataSentEvent(data, byteCount));
}
bool isRunning() const { return running; }
bool isConnected() const { return connection != k_HSteamNetConnection_Invalid; }
void pollIncomingData();
void shouldHandleEvents(unsigned int events) { eventsToHandle = events; }
enum CMEventEnum {
None = 0,
ConnectionStatusChanged = 1 << 0,
DataRecieved = 1 << 1,
DataSent = 1 << 2
};
private:
unsigned int eventsToHandle = CMEventEnum::ConnectionStatusChanged | CMEventEnum::DataSent | CMEventEnum::DataRecieved;
bool running = false;
ISteamNetworkingSockets* interface;
HSteamNetConnection connection;
inline static ClientModule* callbackInstance = nullptr;
static void SteamNetConnectionStatusChangedCallback( SteamNetConnectionStatusChangedCallback_t *pInfo ) {
callbackInstance->OnSteamNetConnectionStatusChanged( pInfo );
}
void OnSteamNetConnectionStatusChanged( SteamNetConnectionStatusChangedCallback_t *pInfo ) {
app->emitEvent(new Archimedes::ConnectionStatusChangedEvent(pInfo));
}
void PollConnectionStateChanges() {
callbackInstance = this;
interface->RunCallbacks();
}
};
#ifdef CLIENTMODULE_DYNAMIC
typedef ClientModule mtype;
#include "endModule.h"
#endif