GameServer.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include "server/GameServer.h"
  2. #include "common/network/Packets.h"
  3. #include "memory/UniquePointer.h"
  4. #include "server/Game.h"
  5. #include "utils/Logger.h"
  6. static Server server;
  7. static HashMap<int, UniquePointer<ServerPlayer>> players;
  8. static void handleControllerPacket(ServerPlayer& p, InPacket& in) {
  9. ControllerPacket cp;
  10. cp.read(in);
  11. p.onControllerPacket(cp);
  12. }
  13. struct Receiver {
  14. void onConnect(Server::Client& client) {
  15. if(players.tryEmplace(client.getId(), new ServerPlayer(client))) {
  16. LOG_WARNING(StringBuffer<50>("cannot emplace client id: ")
  17. .append(client.getId()));
  18. server.disconnect(client);
  19. return;
  20. }
  21. auto* p = players.search(client.getId());
  22. if(p == nullptr) {
  23. LOG_WARNING("cannot find added client");
  24. return;
  25. }
  26. Game::addPlayer(**p);
  27. }
  28. void onDisconnect(Server::Client& client) {
  29. auto* p = players.search(client.getId());
  30. if(p == nullptr) {
  31. LOG_WARNING("disconnecting missing player");
  32. return;
  33. }
  34. Game::removePlayer(**p);
  35. players.remove(client.getId());
  36. }
  37. void onPacket(Server::Client& client, InPacket& in) {
  38. auto* p = players.search(client.getId());
  39. if(p == nullptr) {
  40. LOG_WARNING("packet from missing player");
  41. return;
  42. }
  43. uint16 id;
  44. if(in.readU16(id)) {
  45. LOG_WARNING("invalid packet from client");
  46. return;
  47. }
  48. switch(id) {
  49. case Packets::C_CHAT: (*p)->onChat(in); break;
  50. case Packets::C_CONTROLLER: handleControllerPacket(**p, in); break;
  51. default: LOG_WARNING("invalid packet from client");
  52. }
  53. }
  54. };
  55. bool GameServer::init(Server::Port port, int maxClients) {
  56. Error error = server.start(port, maxClients);
  57. if(error.has()) {
  58. LOG_ERROR(error.message);
  59. }
  60. return error.has();
  61. }
  62. void GameServer::tick() {
  63. Receiver r;
  64. server.consumeEvents(r);
  65. }
  66. void GameServer::sendToAll(OutPacket& out) {
  67. server.send(out);
  68. }