begin server

This commit is contained in:
2025-08-06 12:53:33 +02:00
parent 9c5ad07747
commit 599dfa0cee
7 changed files with 189 additions and 0 deletions

View File

@@ -0,0 +1,31 @@
#pragma once
#include <server/PlayerIds.h>
#include <td/misc/Signal.h>
#include <td/protocol/packet/Packets.h>
namespace td {
namespace server {
class IServerSocket {
public:
utils::Signal<PlayerID> OnConnect;
utils::Signal<PlayerID> OnDisconnect;
utils::Signal<PlayerID, const protocol::PacketBase&> OnReceive;
virtual void Send(PlayerID, const protocol::PacketBase&) = 0;
IServerSocket() {}
virtual ~IServerSocket() {}
private:
PlayerIds m_Ids;
protected:
void OnConnectPeer(PeerID a_PeerId);
void OnDisconnectPeer(PeerID a_PeerId);
void OnReceivePeer(PeerID a_PeerId, const protocol::PacketBase& a_Packet);
};
} // namespace server
} // namespace td

View File

@@ -0,0 +1,36 @@
#pragma once
#include <server/IServerSocket.h>
namespace td {
namespace server {
class Server;
class IServerState {
protected:
void SendPacket(PlayerID a_Id, const protocol::PacketBase& a_Packet);
void SetNewState(const std::shared_ptr<IServerState>& a_NewState);
public:
virtual void HandlePacket(PlayerID a_Id, const protocol::PacketBase& a_Packet) = 0;
virtual void Update(float a_Delta) = 0;
virtual void OnPlayerJoin(PlayerID a_Id) = 0;
virtual void OnPlayerLeave(PlayerID a_Id) = 0;
IServerState(IServerSocket& a_Server);
virtual ~IServerState() {}
private:
IServerSocket& m_Socket;
Server* m_Server;
void SetServer(Server* a_Server) {
m_Server = a_Server;
}
friend class Server;
};
} // namespace server
} // namespace td

View File

@@ -0,0 +1,41 @@
#pragma once
#include <map>
#include <td/Types.h>
namespace td {
namespace server {
class PlayerIds {
private:
std::map<PeerID, PlayerID> m_PeerToPlayer;
std::map<PlayerID, PeerID> m_PlayerToPeer;
PlayerID m_NextId;
public:
PlayerIds() : m_NextId(0) {}
~PlayerIds() {}
void AddConnection(PeerID a_PeerId) {
m_PeerToPlayer.emplace(a_PeerId, m_NextId);
m_PlayerToPeer.emplace(m_NextId, a_PeerId);
m_NextId++;
}
PlayerID GetPlayerId(PeerID a_PeerId) const {
return m_PeerToPlayer.at(a_PeerId);
}
PeerID GetPeerId(PlayerID a_PlayerId) const {
return m_PlayerToPeer.at(a_PlayerId);
}
void RemovePeer(PeerID a_PeerId) {
PlayerID playerId = GetPlayerId(a_PeerId);
m_PeerToPlayer.erase(a_PeerId);
m_PlayerToPeer.erase(playerId);
}
};
} // namespace server
} // namespace td

30
include/server/Server.h Normal file
View File

@@ -0,0 +1,30 @@
#pragma once
#include <memory>
#include <server/IServerSocket.h>
#include <server/IServerState.h>
namespace td {
namespace server {
class Server {
private:
std::shared_ptr<IServerState> m_State;
std::unique_ptr<IServerSocket> m_Socket;
public:
Server(std::unique_ptr<IServerSocket>&& a_Socket) : m_Socket(std::move(a_Socket)) {}
void Update(float a_Delta) {
m_State->Update(a_Delta);
}
void UpdateState(const std::shared_ptr<IServerState>& a_State) {
m_State = a_State;
m_State->SetServer(this);
}
};
} // namespace server
} // namespace td