#pragma once class Objective; class ObjectiveCriteria; class PlayerTeam; class Score; class Scoreboard { public: static const int DISPLAY_SLOT_LIST = 0; static const int DISPLAY_SLOT_SIDEBAR = 1; static const int DISPLAY_SLOT_BELOW_NAME = 2; static const int DISPLAY_SLOTS = 3; private: unordered_map objectivesByName; unordered_map *> objectivesByCriteria; unordered_map > playerScores; Objective *displayObjectives[DISPLAY_SLOTS]; unordered_map teamsByName; unordered_map teamsByPlayer; public: Objective *getObjective(const wstring &name); Objective *addObjective(const wstring &name, ObjectiveCriteria *criteria); vector *findObjectiveFor(ObjectiveCriteria *criteria); Score *getPlayerScore(const wstring &name, Objective *objective); vector *getPlayerScores(Objective *objective); vector *getObjectives(); vector *getTrackedPlayers(); void resetPlayerScore(const wstring &player); vector *getScores(); vector *getScores(Objective *objective); unordered_map *getPlayerScores(const wstring &player); void removeObjective(Objective *objective); void setDisplayObjective(int slot, Objective *objective); Objective *getDisplayObjective(int slot); PlayerTeam *getPlayerTeam(const wstring &name); PlayerTeam *addPlayerTeam(const wstring &name); void removePlayerTeam(PlayerTeam *team); void addPlayerToTeam(const wstring &player, PlayerTeam *team); bool removePlayerFromTeam(const wstring &player); void removePlayerFromTeam(const wstring &player, PlayerTeam *team); vector *getTeamNames(); vector *getPlayerTeams(); shared_ptr getPlayer(const wstring &name); PlayerTeam *getPlayersTeam(const wstring &name); void onObjectiveAdded(Objective *objective); void onObjectiveChanged(Objective *objective); void onObjectiveRemoved(Objective *objective); void onScoreChanged(Score *score); void onPlayerRemoved(const wstring &player); void onTeamAdded(PlayerTeam *team); void onTeamChanged(PlayerTeam *team); void onTeamRemoved(PlayerTeam *team); static wstring getDisplaySlotName(int slot); static int getDisplaySlotByName(const wstring &name); };