PageRenderTime 54ms CodeModel.GetById 25ms RepoModel.GetById 1ms app.codeStats 0ms

/src/minecraft/net/minecraft/scoreboard/Scoreboard.java

https://gitlab.com/Hexeption/Thx
Java | 525 lines | 391 code | 81 blank | 53 comment | 74 complexity | e28f4ee676aa5368c2278dd42250e585 MD5 | raw file
  1. package net.minecraft.scoreboard;
  2. import com.google.common.collect.Lists;
  3. import com.google.common.collect.Maps;
  4. import java.util.Collection;
  5. import java.util.Collections;
  6. import java.util.List;
  7. import java.util.Map;
  8. import javax.annotation.Nullable;
  9. import net.minecraft.entity.Entity;
  10. import net.minecraft.entity.player.EntityPlayer;
  11. import net.minecraft.util.text.TextFormatting;
  12. public class Scoreboard
  13. {
  14. private final Map<String, ScoreObjective> scoreObjectives = Maps.<String, ScoreObjective>newHashMap();
  15. private final Map<IScoreCriteria, List<ScoreObjective>> scoreObjectiveCriterias = Maps.<IScoreCriteria, List<ScoreObjective>>newHashMap();
  16. private final Map<String, Map<ScoreObjective, Score>> entitiesScoreObjectives = Maps.<String, Map<ScoreObjective, Score>>newHashMap();
  17. /** Index 0 is tab menu, 1 is sidebar, and 2 is below name */
  18. private final ScoreObjective[] objectiveDisplaySlots = new ScoreObjective[19];
  19. private final Map<String, ScorePlayerTeam> teams = Maps.<String, ScorePlayerTeam>newHashMap();
  20. private final Map<String, ScorePlayerTeam> teamMemberships = Maps.<String, ScorePlayerTeam>newHashMap();
  21. private static String[] displaySlots;
  22. @Nullable
  23. /**
  24. * Returns a ScoreObjective for the objective name
  25. */
  26. public ScoreObjective getObjective(String name)
  27. {
  28. return (ScoreObjective)this.scoreObjectives.get(name);
  29. }
  30. /**
  31. * Create and returns the score objective for the given name and ScoreCriteria
  32. */
  33. public ScoreObjective addScoreObjective(String name, IScoreCriteria criteria)
  34. {
  35. if (name.length() > 16)
  36. {
  37. throw new IllegalArgumentException("The objective name \'" + name + "\' is too long!");
  38. }
  39. else
  40. {
  41. ScoreObjective scoreobjective = this.getObjective(name);
  42. if (scoreobjective != null)
  43. {
  44. throw new IllegalArgumentException("An objective with the name \'" + name + "\' already exists!");
  45. }
  46. else
  47. {
  48. scoreobjective = new ScoreObjective(this, name, criteria);
  49. List<ScoreObjective> list = (List)this.scoreObjectiveCriterias.get(criteria);
  50. if (list == null)
  51. {
  52. list = Lists.<ScoreObjective>newArrayList();
  53. this.scoreObjectiveCriterias.put(criteria, list);
  54. }
  55. list.add(scoreobjective);
  56. this.scoreObjectives.put(name, scoreobjective);
  57. this.onScoreObjectiveAdded(scoreobjective);
  58. return scoreobjective;
  59. }
  60. }
  61. }
  62. public Collection<ScoreObjective> getObjectivesFromCriteria(IScoreCriteria criteria)
  63. {
  64. Collection<ScoreObjective> collection = (Collection)this.scoreObjectiveCriterias.get(criteria);
  65. return collection == null ? Lists.<ScoreObjective>newArrayList() : Lists.newArrayList(collection);
  66. }
  67. /**
  68. * Returns if the entity has the given ScoreObjective
  69. */
  70. public boolean entityHasObjective(String name, ScoreObjective objective)
  71. {
  72. Map<ScoreObjective, Score> map = (Map)this.entitiesScoreObjectives.get(name);
  73. if (map == null)
  74. {
  75. return false;
  76. }
  77. else
  78. {
  79. Score score = (Score)map.get(objective);
  80. return score != null;
  81. }
  82. }
  83. /**
  84. * Get a player's score or create it if it does not exist
  85. */
  86. public Score getOrCreateScore(String username, ScoreObjective objective)
  87. {
  88. if (username.length() > 40)
  89. {
  90. throw new IllegalArgumentException("The player name \'" + username + "\' is too long!");
  91. }
  92. else
  93. {
  94. Map<ScoreObjective, Score> map = (Map)this.entitiesScoreObjectives.get(username);
  95. if (map == null)
  96. {
  97. map = Maps.<ScoreObjective, Score>newHashMap();
  98. this.entitiesScoreObjectives.put(username, map);
  99. }
  100. Score score = (Score)map.get(objective);
  101. if (score == null)
  102. {
  103. score = new Score(this, objective, username);
  104. map.put(objective, score);
  105. }
  106. return score;
  107. }
  108. }
  109. public Collection<Score> getSortedScores(ScoreObjective objective)
  110. {
  111. List<Score> list = Lists.<Score>newArrayList();
  112. for (Map<ScoreObjective, Score> map : this.entitiesScoreObjectives.values())
  113. {
  114. Score score = (Score)map.get(objective);
  115. if (score != null)
  116. {
  117. list.add(score);
  118. }
  119. }
  120. Collections.sort(list, Score.SCORE_COMPARATOR);
  121. return list;
  122. }
  123. public Collection<ScoreObjective> getScoreObjectives()
  124. {
  125. return this.scoreObjectives.values();
  126. }
  127. public Collection<String> getObjectiveNames()
  128. {
  129. return this.entitiesScoreObjectives.keySet();
  130. }
  131. /**
  132. * Remove the given ScoreObjective for the given Entity name.
  133. */
  134. public void removeObjectiveFromEntity(String name, ScoreObjective objective)
  135. {
  136. if (objective == null)
  137. {
  138. Map<ScoreObjective, Score> map = (Map)this.entitiesScoreObjectives.remove(name);
  139. if (map != null)
  140. {
  141. this.broadcastScoreUpdate(name);
  142. }
  143. }
  144. else
  145. {
  146. Map<ScoreObjective, Score> map2 = (Map)this.entitiesScoreObjectives.get(name);
  147. if (map2 != null)
  148. {
  149. Score score = (Score)map2.remove(objective);
  150. if (map2.size() < 1)
  151. {
  152. Map<ScoreObjective, Score> map1 = (Map)this.entitiesScoreObjectives.remove(name);
  153. if (map1 != null)
  154. {
  155. this.broadcastScoreUpdate(name);
  156. }
  157. }
  158. else if (score != null)
  159. {
  160. this.broadcastScoreUpdate(name, objective);
  161. }
  162. }
  163. }
  164. }
  165. public Collection<Score> getScores()
  166. {
  167. Collection<Map<ScoreObjective, Score>> collection = this.entitiesScoreObjectives.values();
  168. List<Score> list = Lists.<Score>newArrayList();
  169. for (Map<ScoreObjective, Score> map : collection)
  170. {
  171. list.addAll(map.values());
  172. }
  173. return list;
  174. }
  175. public Map<ScoreObjective, Score> getObjectivesForEntity(String name)
  176. {
  177. Map<ScoreObjective, Score> map = (Map)this.entitiesScoreObjectives.get(name);
  178. if (map == null)
  179. {
  180. map = Maps.<ScoreObjective, Score>newHashMap();
  181. }
  182. return map;
  183. }
  184. public void removeObjective(ScoreObjective objective)
  185. {
  186. this.scoreObjectives.remove(objective.getName());
  187. for (int i = 0; i < 19; ++i)
  188. {
  189. if (this.getObjectiveInDisplaySlot(i) == objective)
  190. {
  191. this.setObjectiveInDisplaySlot(i, (ScoreObjective)null);
  192. }
  193. }
  194. List<ScoreObjective> list = (List)this.scoreObjectiveCriterias.get(objective.getCriteria());
  195. if (list != null)
  196. {
  197. list.remove(objective);
  198. }
  199. for (Map<ScoreObjective, Score> map : this.entitiesScoreObjectives.values())
  200. {
  201. map.remove(objective);
  202. }
  203. this.onScoreObjectiveRemoved(objective);
  204. }
  205. /**
  206. * 0 is tab menu, 1 is sidebar, 2 is below name
  207. */
  208. public void setObjectiveInDisplaySlot(int objectiveSlot, ScoreObjective objective)
  209. {
  210. this.objectiveDisplaySlots[objectiveSlot] = objective;
  211. }
  212. @Nullable
  213. /**
  214. * 0 is tab menu, 1 is sidebar, 2 is below name
  215. */
  216. public ScoreObjective getObjectiveInDisplaySlot(int slotIn)
  217. {
  218. return this.objectiveDisplaySlots[slotIn];
  219. }
  220. /**
  221. * Retrieve the ScorePlayerTeam instance identified by the passed team name
  222. */
  223. public ScorePlayerTeam getTeam(String teamName)
  224. {
  225. return (ScorePlayerTeam)this.teams.get(teamName);
  226. }
  227. public ScorePlayerTeam createTeam(String name)
  228. {
  229. if (name.length() > 16)
  230. {
  231. throw new IllegalArgumentException("The team name \'" + name + "\' is too long!");
  232. }
  233. else
  234. {
  235. ScorePlayerTeam scoreplayerteam = this.getTeam(name);
  236. if (scoreplayerteam != null)
  237. {
  238. throw new IllegalArgumentException("A team with the name \'" + name + "\' already exists!");
  239. }
  240. else
  241. {
  242. scoreplayerteam = new ScorePlayerTeam(this, name);
  243. this.teams.put(name, scoreplayerteam);
  244. this.broadcastTeamCreated(scoreplayerteam);
  245. return scoreplayerteam;
  246. }
  247. }
  248. }
  249. /**
  250. * Removes the team from the scoreboard, updates all player memberships and broadcasts the deletion to all players
  251. */
  252. public void removeTeam(ScorePlayerTeam playerTeam)
  253. {
  254. this.teams.remove(playerTeam.getRegisteredName());
  255. for (String s : playerTeam.getMembershipCollection())
  256. {
  257. this.teamMemberships.remove(s);
  258. }
  259. this.broadcastTeamRemove(playerTeam);
  260. }
  261. /**
  262. * Adds a player to the given team
  263. */
  264. public boolean addPlayerToTeam(String player, String newTeam)
  265. {
  266. if (player.length() > 40)
  267. {
  268. throw new IllegalArgumentException("The player name \'" + player + "\' is too long!");
  269. }
  270. else if (!this.teams.containsKey(newTeam))
  271. {
  272. return false;
  273. }
  274. else
  275. {
  276. ScorePlayerTeam scoreplayerteam = this.getTeam(newTeam);
  277. if (this.getPlayersTeam(player) != null)
  278. {
  279. this.removePlayerFromTeams(player);
  280. }
  281. this.teamMemberships.put(player, scoreplayerteam);
  282. scoreplayerteam.getMembershipCollection().add(player);
  283. return true;
  284. }
  285. }
  286. public boolean removePlayerFromTeams(String playerName)
  287. {
  288. ScorePlayerTeam scoreplayerteam = this.getPlayersTeam(playerName);
  289. if (scoreplayerteam != null)
  290. {
  291. this.removePlayerFromTeam(playerName, scoreplayerteam);
  292. return true;
  293. }
  294. else
  295. {
  296. return false;
  297. }
  298. }
  299. /**
  300. * Removes the given username from the given ScorePlayerTeam. If the player is not on the team then an
  301. * IllegalStateException is thrown.
  302. */
  303. public void removePlayerFromTeam(String username, ScorePlayerTeam playerTeam)
  304. {
  305. if (this.getPlayersTeam(username) != playerTeam)
  306. {
  307. throw new IllegalStateException("Player is either on another team or not on any team. Cannot remove from team \'" + playerTeam.getRegisteredName() + "\'.");
  308. }
  309. else
  310. {
  311. this.teamMemberships.remove(username);
  312. playerTeam.getMembershipCollection().remove(username);
  313. }
  314. }
  315. public Collection<String> getTeamNames()
  316. {
  317. return this.teams.keySet();
  318. }
  319. public Collection<ScorePlayerTeam> getTeams()
  320. {
  321. return this.teams.values();
  322. }
  323. @Nullable
  324. /**
  325. * Gets the ScorePlayerTeam object for the given username.
  326. */
  327. public ScorePlayerTeam getPlayersTeam(String username)
  328. {
  329. return (ScorePlayerTeam)this.teamMemberships.get(username);
  330. }
  331. /**
  332. * Called when a score objective is added
  333. */
  334. public void onScoreObjectiveAdded(ScoreObjective scoreObjectiveIn)
  335. {
  336. }
  337. public void onObjectiveDisplayNameChanged(ScoreObjective objective)
  338. {
  339. }
  340. public void onScoreObjectiveRemoved(ScoreObjective objective)
  341. {
  342. }
  343. public void onScoreUpdated(Score scoreIn)
  344. {
  345. }
  346. public void broadcastScoreUpdate(String scoreName)
  347. {
  348. }
  349. public void broadcastScoreUpdate(String scoreName, ScoreObjective objective)
  350. {
  351. }
  352. /**
  353. * This packet will notify the players that this team is created, and that will register it on the client
  354. */
  355. public void broadcastTeamCreated(ScorePlayerTeam playerTeam)
  356. {
  357. }
  358. /**
  359. * This packet will notify the players that this team is updated
  360. */
  361. public void broadcastTeamInfoUpdate(ScorePlayerTeam playerTeam)
  362. {
  363. }
  364. public void broadcastTeamRemove(ScorePlayerTeam playerTeam)
  365. {
  366. }
  367. /**
  368. * Returns 'list' for 0, 'sidebar' for 1, 'belowName for 2, otherwise null.
  369. */
  370. public static String getObjectiveDisplaySlot(int id)
  371. {
  372. switch (id)
  373. {
  374. case 0:
  375. return "list";
  376. case 1:
  377. return "sidebar";
  378. case 2:
  379. return "belowName";
  380. default:
  381. if (id >= 3 && id <= 18)
  382. {
  383. TextFormatting textformatting = TextFormatting.fromColorIndex(id - 3);
  384. if (textformatting != null && textformatting != TextFormatting.RESET)
  385. {
  386. return "sidebar.team." + textformatting.getFriendlyName();
  387. }
  388. }
  389. return null;
  390. }
  391. }
  392. /**
  393. * Returns 0 for (case-insensitive) 'list', 1 for 'sidebar', 2 for 'belowName', otherwise -1.
  394. */
  395. public static int getObjectiveDisplaySlotNumber(String name)
  396. {
  397. if ("list".equalsIgnoreCase(name))
  398. {
  399. return 0;
  400. }
  401. else if ("sidebar".equalsIgnoreCase(name))
  402. {
  403. return 1;
  404. }
  405. else if ("belowName".equalsIgnoreCase(name))
  406. {
  407. return 2;
  408. }
  409. else
  410. {
  411. if (name.startsWith("sidebar.team."))
  412. {
  413. String s = name.substring("sidebar.team.".length());
  414. TextFormatting textformatting = TextFormatting.getValueByName(s);
  415. if (textformatting != null && textformatting.getColorIndex() >= 0)
  416. {
  417. return textformatting.getColorIndex() + 3;
  418. }
  419. }
  420. return -1;
  421. }
  422. }
  423. public static String[] getDisplaySlotStrings()
  424. {
  425. if (displaySlots == null)
  426. {
  427. displaySlots = new String[19];
  428. for (int i = 0; i < 19; ++i)
  429. {
  430. displaySlots[i] = getObjectiveDisplaySlot(i);
  431. }
  432. }
  433. return displaySlots;
  434. }
  435. public void removeEntity(Entity entityIn)
  436. {
  437. if (entityIn != null && !(entityIn instanceof EntityPlayer) && !entityIn.isEntityAlive())
  438. {
  439. String s = entityIn.func_189512_bd();
  440. this.removeObjectiveFromEntity(s, (ScoreObjective)null);
  441. this.removePlayerFromTeams(s);
  442. }
  443. }
  444. }