#pragma once #include "StarDrawable.hpp" #include "StarUuid.hpp" #include "StarJsonRpc.hpp" #include "StarWarping.hpp" #include "StarThread.hpp" #include "StarDamageTypes.hpp" namespace Star { STAR_CLASS(TeamManager); class TeamManager { public: TeamManager(); JsonRpcHandlers rpcHandlers(); void setConnectedPlayers(StringMap> const& connectedPlayers); void playerDisconnected(Uuid const& playerUuid); TeamNumber getPvpTeam(Uuid const& playerUuid); HashMap getPvpTeams(); Maybe getTeam(Uuid const& playerUuid) const; private: struct TeamMember { String name; int entity; float healthPercentage; float energyPercentage; WorldId world; Vec2F position; WarpMode warpMode; List portrait; }; struct Team { Uuid leaderUuid; TeamNumber pvpTeamNumber; Map members; }; struct Invitation { Uuid inviterUuid; String inviterName; }; void purgeInvitationsFor(Uuid const& playerUuid); void purgeInvitationsFrom(Uuid const& playerUuid); bool playerWithUuidExists(Uuid const& playerUuid) const; Uuid createTeam(Uuid const& leaderUuid); bool addToTeam(Uuid const& playerUuid, Uuid const& teamUuid); bool removeFromTeam(Uuid const& playerUuid, Uuid const& teamUuid); RecursiveMutex m_mutex; Map m_teams; StringMap> m_connectedPlayers; Map m_invitations; unsigned m_maxTeamSize; TeamNumber m_pvpTeamCounter; Json fetchTeamStatus(Json const& args); Json updateStatus(Json const& args); Json invite(Json const& args); Json pollInvitation(Json const& args); Json acceptInvitation(Json const& args); Json removeFromTeam(Json const& args); Json makeLeader(Json const& args); }; }