osb/source/game/StarServerClientContext.hpp
2024-02-25 15:46:47 +01:00

120 lines
3.7 KiB
C++

#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, 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;
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();
private:
ConnectionId const m_clientId;
Maybe<HostAddress> const m_remoteAddress;
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;
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;
};
}