diff --git a/include/server/IServerState.h b/include/server/IServerState.h index 8e8626d..ff3365b 100644 --- a/include/server/IServerState.h +++ b/include/server/IServerState.h @@ -18,16 +18,13 @@ class IServerState { virtual void OnPlayerJoin(PlayerID a_Id) = 0; virtual void OnPlayerLeave(PlayerID a_Id) = 0; - IServerState(IServerSocket& a_Server); - virtual ~IServerState() {} + IServerState(); + virtual ~IServerState(); private: - IServerSocket& m_Socket; Server* m_Server; - void SetServer(Server* a_Server) { - m_Server = a_Server; - } + void SetServer(Server* a_Server); friend class Server; }; diff --git a/include/server/Server.h b/include/server/Server.h index 79c0ecf..77e79d6 100644 --- a/include/server/Server.h +++ b/include/server/Server.h @@ -9,11 +9,11 @@ namespace server { class Server { private: + std::shared_ptr m_Socket; std::shared_ptr m_State; - std::unique_ptr m_Socket; public: - Server(std::unique_ptr&& a_Socket) : m_Socket(std::move(a_Socket)) {} + Server(const std::shared_ptr& a_Socket) : m_Socket(a_Socket) {} void Update(float a_Delta) { m_State->Update(a_Delta); @@ -24,6 +24,7 @@ class Server { m_State->SetServer(this); } + friend class IServerState; }; } // namespace server diff --git a/include/server/socket/TcpSocket.h b/include/server/socket/TcpSocket.h new file mode 100644 index 0000000..229d677 --- /dev/null +++ b/include/server/socket/TcpSocket.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +namespace td { +namespace server { + +class TcpSocket : public IServerSocket { + private: + /* data */ + public: + TcpSocket(/* args */) {} + ~TcpSocket() {} + + virtual void Send(PlayerID, const protocol::PacketBase&) {} +}; + +} // namespace server +} // namespace td diff --git a/include/server/state/EndGameState.h b/include/server/state/EndGameState.h new file mode 100644 index 0000000..e38e2de --- /dev/null +++ b/include/server/state/EndGameState.h @@ -0,0 +1,17 @@ +#pragma once + +#include + +namespace td { +namespace server { + +class EndGameState : public IServerState { + private: + /* data */ + public: + EndGameState(/* args */) {} + ~EndGameState() {} +}; + +} // namespace server +} // namespace td diff --git a/include/server/state/GameState.h b/include/server/state/GameState.h new file mode 100644 index 0000000..05b739b --- /dev/null +++ b/include/server/state/GameState.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +namespace td { +namespace server { + +class GameState : public IServerState{ + private: + /* data */ + public: + GameState(/* args */) {} + ~GameState() {} + + virtual void HandlePacket(PlayerID a_Id, const protocol::PacketBase& a_Packet) override; + virtual void Update(float a_Delta) override; + virtual void OnPlayerJoin(PlayerID a_Id) override; + virtual void OnPlayerLeave(PlayerID a_Id) override; +}; + +} // namespace server +} // namespace td diff --git a/include/server/state/LobbyState.h b/include/server/state/LobbyState.h new file mode 100644 index 0000000..f0ac688 --- /dev/null +++ b/include/server/state/LobbyState.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +namespace td { +namespace server { + +class LobbyState : public IServerState { + private: + /* data */ + public: + LobbyState(/* args */) {} + ~LobbyState() {} + + virtual void HandlePacket(PlayerID a_Id, const protocol::PacketBase& a_Packet) override; + virtual void Update(float a_Delta) override; + virtual void OnPlayerJoin(PlayerID a_Id) override; + virtual void OnPlayerLeave(PlayerID a_Id) override; +}; + +} // namespace server +} // namespace td diff --git a/include/td/misc/Signal.h b/include/td/misc/Signal.h index b8dbf17..9091b43 100644 --- a/include/td/misc/Signal.h +++ b/include/td/misc/Signal.h @@ -11,7 +11,8 @@ namespace utils { template class Signal : private NonCopyable { private: - using CallBack = std::function; + using FnType = void(Args...); + using CallBack = std::function; std::vector m_Callbacks; @@ -20,6 +21,12 @@ class Signal : private NonCopyable { m_Callbacks.push_back(std::move(a_Callback)); } + void Disconnect(const CallBack& a_Callback) { + auto it = std::find_if(m_Callbacks.begin(), m_Callbacks.end(), + [&a_Callback](CallBack& callback) { return a_Callback.template target() == callback.template target(); }); + m_Callbacks.erase(it); + } + void operator()(Args... args) const { for (const CallBack& callback : m_Callbacks) { callback(args...); diff --git a/src/main.cpp b/src/main.cpp index ea61461..51c1b5f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -15,6 +15,10 @@ #include #include +#include +#include +#include + class WorldApply : public td::protocol::PacketHandler { private: td::game::World& m_World; @@ -92,7 +96,6 @@ td::sim::GameHistory GetCustomHistory() { return gh; } - int main(int argc, char** argv) { td::game::World w = GetWorld(); @@ -128,6 +131,15 @@ int main(int argc, char** argv) { } }); + + // server + auto socket = std::make_shared(); + td::server::Server server(socket); + server.UpdateState(std::make_shared()); + server.Update(1.0f); + server.Update(1.0f); + socket->OnDisconnect(0); + while (!display.IsCloseRequested()) { display.PollEvents(); float lerp = simulation.Update(); diff --git a/src/server/IServerState.cpp b/src/server/IServerState.cpp index fe5accb..f8c0f06 100644 --- a/src/server/IServerState.cpp +++ b/src/server/IServerState.cpp @@ -4,21 +4,26 @@ namespace td { namespace server { -IServerState::IServerState(IServerSocket& a_Socket) : m_Socket(a_Socket) { - // TODO: don't do it like this - m_Socket.OnConnect.Connect([this](PlayerID a_Player){ - OnPlayerJoin(a_Player); - }); - m_Socket.OnDisconnect.Connect([this](PlayerID a_Player){ - OnPlayerLeave(a_Player); - }); - m_Socket.OnReceive.Connect([this](PlayerID a_Player, const protocol::PacketBase& a_Packet){ - HandlePacket(a_Player, a_Packet); - }); +void IServerState::SetServer(Server* a_Server) { + assert(a_Server); + m_Server = a_Server; + m_Server->m_Socket->OnConnect.Connect(std::bind(&IServerState::OnPlayerJoin, this, std::placeholders::_1)); + m_Server->m_Socket->OnDisconnect.Connect(std::bind(&IServerState::OnPlayerLeave, this, std::placeholders::_1)); + m_Server->m_Socket->OnReceive.Connect(std::bind(&IServerState::HandlePacket, this, std::placeholders::_1, std::placeholders::_2)); +} + +IServerState::IServerState() : m_Server(nullptr) {} + +IServerState::~IServerState() { + if (!m_Server) + return; + m_Server->m_Socket->OnConnect.Disconnect(std::bind(&IServerState::OnPlayerJoin, this, std::placeholders::_1)); + m_Server->m_Socket->OnDisconnect.Disconnect(std::bind(&IServerState::OnPlayerLeave, this, std::placeholders::_1)); + m_Server->m_Socket->OnReceive.Disconnect(std::bind(&IServerState::HandlePacket, this, std::placeholders::_1, std::placeholders::_2)); } void IServerState::SendPacket(PlayerID a_Id, const protocol::PacketBase& a_Packet) { - m_Socket.Send(a_Id, a_Packet); + m_Server->m_Socket->Send(a_Id, a_Packet); } void IServerState::SetNewState(const std::shared_ptr& a_NewState) { diff --git a/src/server/socket/TcpSocket.cpp b/src/server/socket/TcpSocket.cpp new file mode 100644 index 0000000..8c5acb5 --- /dev/null +++ b/src/server/socket/TcpSocket.cpp @@ -0,0 +1,8 @@ +#include + +namespace td { +namespace server { + + +} // namespace server +} // namespace td diff --git a/src/server/state/GameState.cpp b/src/server/state/GameState.cpp new file mode 100644 index 0000000..6a28183 --- /dev/null +++ b/src/server/state/GameState.cpp @@ -0,0 +1,25 @@ +#include + +#include + +namespace td { +namespace server { + +void GameState::HandlePacket(PlayerID a_Id, const protocol::PacketBase& a_Packet) { + +} + +void GameState::Update(float a_Delta) { + +} + +void GameState::OnPlayerJoin(PlayerID a_Id) { + +} + +void GameState::OnPlayerLeave(PlayerID a_Id) { + std::cout << "Game leave !" << std::endl; +} + +} // namespace server +} // namespace td diff --git a/src/server/state/LobbyState.cpp b/src/server/state/LobbyState.cpp new file mode 100644 index 0000000..7db94e4 --- /dev/null +++ b/src/server/state/LobbyState.cpp @@ -0,0 +1,26 @@ +#include +#include + +#include + +namespace td { +namespace server { + +void LobbyState::HandlePacket(PlayerID a_Id, const protocol::PacketBase& a_Packet) { + +} + +void LobbyState::Update(float a_Delta) { + SetNewState(std::make_shared()); +} + +void LobbyState::OnPlayerJoin(PlayerID a_Id) { + +} + +void LobbyState::OnPlayerLeave(PlayerID a_Id) { + std::cout << "Lobby leave !" << std::endl; +} + +} // namespace server +} // namespace td