Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/game/StarServerClientContext.hpp
blob: b81b706aada178be51a79533371b378b69ea776b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#pragma once

#include "StarNetElementSystem.hpp"
#include "StarThread.hpp"
#include "StarUuid.hpp"
#include "StarJsonRpc.hpp"
#include "StarDamageTypes.hpp"
#include "StarGameTypes.hpp"
#include "StarHostAddress.hpp"
#include "StarClientContext.hpp"
#include "StarWorldStorage.hpp"
#include "StarSystemWorld.hpp"

namespace Star {

STAR_CLASS(WorldServerThread);
STAR_CLASS(SystemWorldServerThread);
STAR_CLASS(ServerClientContext);

class ServerClientContext {
public:
  ServerClientContext(ConnectionId clientId, Maybe<HostAddress> remoteAddress, NetCompatibilityRules netRules, Uuid playerUuid,
      String playerName, String playerSpecies, bool canBecomeAdmin, WorldChunks initialShipChunks);

  ConnectionId clientId() const;
  Maybe<HostAddress> const& remoteAddress() const;
  Uuid const& playerUuid() const;
  String const& playerName() const;
  String const& playerSpecies() const;
  bool canBecomeAdmin() const;
  NetCompatibilityRules netRules() const;
  String descriptiveName() const;

  // Register additional rpc methods from other server side services.
  void registerRpcHandlers(JsonRpcHandlers const& rpcHandlers);

  // The coordinate for the world which the *player's* ship is currently
  // orbiting, if it is currently orbiting a world.
  CelestialCoordinate shipCoordinate() const;
  void setShipCoordinate(CelestialCoordinate shipCoordinate);

  SystemLocation shipLocation() const;
  void setShipLocation(SystemLocation location);

  // Warp action and warp mode to the planet the player is currently orbiting
  // valid when the player is on any ship world orbiting a location
  Maybe<pair<WarpAction, WarpMode>> orbitWarpAction() const;
  void setOrbitWarpAction(Maybe<pair<WarpAction, WarpMode>> warpAction);

  bool isAdmin() const;
  void setAdmin(bool admin);

  EntityDamageTeam team() const;
  void setTeam(EntityDamageTeam team);

  ShipUpgrades shipUpgrades() const;
  void setShipUpgrades(ShipUpgrades shipUpgrades);

  WorldChunks shipChunks() const;
  void updateShipChunks(WorldChunks newShipChunks);

  ByteArray writeInitialState() const;

  void readUpdate(ByteArray data);
  ByteArray writeUpdate();

  void setPlayerWorld(WorldServerThreadPtr worldThread);
  WorldServerThreadPtr playerWorld() const;
  WorldId playerWorldId() const;
  void clearPlayerWorld();

  void setSystemWorld(SystemWorldServerThreadPtr systemWorldThread);
  SystemWorldServerThreadPtr systemWorld() const;
  void clearSystemWorld();

  WarpToWorld playerReturnWarp() const;
  void setPlayerReturnWarp(WarpToWorld warp);

  WarpToWorld playerReviveWarp() const;
  void setPlayerReviveWarp(WarpToWorld warp);

  // Store and load the data for this client that should be persisted on the
  // server, such as celestial log data, admin state, team, and current ship
  // location, and warp history.  Does not store ship data or ship upgrades.
  void loadServerData(Json const& store);
  Json storeServerData();

  int64_t creationTime() const;

private:
  ConnectionId const m_clientId;
  Maybe<HostAddress> const m_remoteAddress;
  NetCompatibilityRules m_netRules;
  Uuid const m_playerUuid;
  String const m_playerName;
  String const m_playerSpecies;
  bool const m_canBecomeAdmin;

  mutable RecursiveMutex m_mutex;

  WorldChunks m_shipChunks;
  WorldChunks m_shipChunksUpdate;

  SystemLocation m_shipSystemLocation;
  JsonRpc m_rpc;
  WorldServerThreadPtr m_worldThread;
  WarpToWorld m_returnWarp;
  WarpToWorld m_reviveWarp;

  SystemWorldServerThreadPtr m_systemWorldThread;

  NetElementTopGroup m_netGroup;
  uint64_t m_netVersion = 0;
  int64_t m_creationTime;

  NetElementData<Maybe<pair<WarpAction, WarpMode>>> m_orbitWarpActionNetState;
  NetElementData<WorldId> m_playerWorldIdNetState;
  NetElementBool m_isAdminNetState;
  NetElementData<EntityDamageTeam> m_teamNetState;
  NetElementData<ShipUpgrades> m_shipUpgrades;
  NetElementData<CelestialCoordinate> m_shipCoordinate;
};

}