#pragma once #include "StarUuid.hpp" #include "StarDrawable.hpp" #include "StarWarping.hpp" #include "StarJsonRpc.hpp" namespace Star { STAR_CLASS(Player); STAR_CLASS(ClientContext); STAR_CLASS(TeamClient); class TeamClient { public: struct Member { String name; Uuid uuid; int entity; float healthPercentage; float energyPercentage; WorldId world; Vec2F position; WarpMode warpMode; List portrait; }; TeamClient(PlayerPtr mainPlayer, ClientContextPtr clientContext); void invitePlayer(String const& playerName); void acceptInvitation(Uuid const& inviterUuid); Maybe currentTeam() const; void makeLeader(Uuid const& playerUuid); void removeFromTeam(Uuid const& playerUuid); bool isTeamLeader(); bool isTeamLeader(Uuid const& playerUuid); bool isMemberOfTeam(); bool hasInvitationPending(); pair pullInvitation(); void update(); void pullFullUpdate(); void statusUpdate(); void forceUpdate(); List members(); private: typedef pair, function> RpcResponseHandler; void invokeRemote(String const& method, Json const& args, function responseFunction = {}); void handleRpcResponses(); void writePlayerData(JsonObject& request, PlayerPtr player, bool fullWrite = false) const; void clearTeam(); PlayerPtr m_mainPlayer; ClientContextPtr m_clientContext; Maybe m_teamUuid; Uuid m_teamLeader; List m_members; bool m_hasPendingInvitation; pair m_pendingInvitation; double m_pollInvitationsTimer; bool m_fullUpdateRunning; double m_fullUpdateTimer; bool m_statusUpdateRunning; double m_statusUpdateTimer; List m_pendingResponses; }; }