Advertisement
Guest User

Untitled

a guest
Jun 25th, 2016
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.75 KB | None | 0 0
  1. package me.pepe.skywars.game;
  2.  
  3. import com.google.gson.Gson;
  4. import com.google.gson.GsonBuilder;
  5. import me.pepe.api.MinigameManager;
  6. import me.pepe.skywars.SkyWars;
  7. import me.pepe.skywars.game.lobby.Lobby;
  8. import me.pepe.skywars.game.serializer.ILocationSerializer;
  9. import me.pepe.skywars.game.serializer.SLocationSerializer;
  10. import org.apache.commons.lang3.StringUtils;
  11. import org.bukkit.World;
  12. import org.bukkit.entity.Player;
  13. import org.bukkit.scheduler.BukkitRunnable;
  14. import org.bukkit.scheduler.BukkitTask;
  15. import me.pepe.skywars.game.serializer.GameDataSerializer;
  16. import me.pepe.skywars.game.worlds.GameWorld;
  17. import me.pepe.skywars.scoreboard.ScoreboardTemplates;
  18. import me.pepe.skywars.utils.ILocation;
  19. import me.pepe.skywars.utils.SLocation;
  20.  
  21. import java.io.*;
  22. import java.util.*;
  23. import java.util.concurrent.ThreadLocalRandom;
  24. import java.util.logging.Level;
  25.  
  26. public class GameManager implements MinigameManager<Game, Lobby> {
  27.  
  28. private final Gson gson;
  29. private final SkyWars plugin;
  30. private final Map<Integer, Game> games = new HashMap<>();
  31. private Lobby lobby;
  32. private BukkitTask task;
  33.  
  34. public GameManager(SkyWars plugin) {
  35. this.plugin = plugin;
  36. this.gson = new GsonBuilder().setPrettyPrinting()
  37. .registerTypeAdapter(ILocation.class, new ILocationSerializer())
  38. .registerTypeAdapter(SLocation.class, new SLocationSerializer())
  39. .registerTypeAdapter(GameData.class, new GameDataSerializer(plugin)).create();
  40. }
  41.  
  42. @Override
  43. public void register(Game game) {
  44. games.put(game.getId(), game);
  45. }
  46.  
  47. @Override
  48. public Game getGame(int id) {
  49. return games.get(id);
  50. }
  51.  
  52. @Override
  53. @Deprecated
  54. public Game getGame(String name) {
  55. for(Game game : games.values()) {
  56. if(game.getName().equals(name)) {
  57. return game;
  58. }
  59. }
  60.  
  61. return null;
  62. }
  63.  
  64. @Override
  65. public Game getGame(World world) {
  66. for(Game game : games.values()) {
  67. if(game.getWorld() == null) {
  68. continue;
  69. }
  70.  
  71. if(game.getWorld().getUID().equals(world.getUID())) {
  72. return game;
  73. }
  74. }
  75.  
  76. return null;
  77. }
  78.  
  79. public List<Game> getGame(GameWorld gameWorld) {
  80. List<Game> gameWorlds = new ArrayList<>();
  81.  
  82. for(Game game : games.values()) {
  83. if(game.getGameWorld().equals(gameWorld)) {
  84. gameWorlds.add(game);
  85. }
  86. }
  87.  
  88. return gameWorlds;
  89. }
  90.  
  91. @Override
  92. public Game getGame(UUID uuid) {
  93. GamePlayer gamePlayer = getGamePlayer(uuid);
  94. return (gamePlayer == null ? null : gamePlayer.getGame());
  95. }
  96.  
  97. @Override
  98. public GamePlayer getGamePlayer(UUID uuid) {
  99. for(Game game : games.values()) {
  100. GamePlayer gamePlayer = game.getPlayer(uuid);
  101.  
  102. if(gamePlayer == null) {
  103. continue;
  104. }
  105.  
  106. return gamePlayer;
  107. }
  108.  
  109. return null;
  110. }
  111.  
  112. public Collection<Game> getGames() {
  113. return games.values();
  114. }
  115.  
  116. public List<Game> getGames(GameState... states) {
  117. List<Game> games = new ArrayList<>();
  118.  
  119. for(Game game : getGames()) {
  120. if(game.getState().is(states)) {
  121. games.add(game);
  122. }
  123. }
  124.  
  125. return games;
  126. }
  127.  
  128. @Override
  129. public void removeGame(int id) {
  130. games.remove(id);
  131. }
  132.  
  133. @Override
  134. public int randomID() {
  135. int random = ThreadLocalRandom.current().nextInt(10000);
  136.  
  137. if(games.containsKey(random)) {
  138. return randomID();
  139. }
  140.  
  141. return random;
  142. }
  143.  
  144. @Override
  145. public Lobby getLobby() {
  146. return lobby;
  147. }
  148.  
  149. @Override
  150. public void setLobby(Lobby lobby) {
  151. stop();
  152. this.lobby = lobby;
  153.  
  154. if(lobby == null) {
  155. return;
  156. }
  157.  
  158. task = lobbyRunnable();
  159. }
  160.  
  161. @Override
  162. public File getFile() {
  163. return new File(plugin.getDataFolder(), "Games");
  164. }
  165.  
  166. @Override
  167. public void unloadGames() {
  168. try {
  169. File folder = getFile();
  170. folder.mkdirs();
  171.  
  172. for(Game game : games.values()) {
  173. try(FileWriter writer = new FileWriter(game.getFile())) {
  174. writer.write(gson.toJson(game.getGameData()));
  175. }
  176.  
  177. if(game.getState() == GameState.UNLOADED) {
  178. continue;
  179. }
  180.  
  181. game.unload();
  182. }
  183.  
  184. games.clear();
  185.  
  186. saveLobby();
  187. stop();
  188. } catch (IOException e) {
  189. plugin.getLogger().log(Level.SEVERE, "Couldn't save Games data", e);
  190. }
  191. }
  192.  
  193. @Override
  194. public void loadGames() {
  195. try {
  196. games.clear();
  197.  
  198. loadLobby();
  199.  
  200. if(lobby == null) {
  201. plugin.getLogger().log(Level.SEVERE, "Can't load Games if there isn't a Lobby");
  202. } else {
  203. File folder = getFile();
  204.  
  205. if (!folder.exists()) {
  206. return;
  207. }
  208.  
  209. File[] files = folder.listFiles();
  210. if(files == null) {
  211. return;
  212. }
  213.  
  214. for(File file : files) {
  215. try(BufferedReader reader = new BufferedReader(new FileReader(file))) {
  216. GameData gameData = gson.fromJson(reader, GameData.class);
  217. if (gameData.getGameWorld() == null) {
  218. plugin.getLogger().severe("The GameWorld from the Game (" + gameData.getName() + ") is null");
  219. continue;
  220. }
  221.  
  222. if(gameData.getDefaultChest() == null) {
  223. plugin.getLogger().severe("The default ChestLoot from the Game (" + gameData.getName() + ") is null");
  224. continue;
  225. }
  226.  
  227. Game game = new Game(plugin, gameData);
  228. if (game.load()) {
  229. register(game);
  230. }
  231. }
  232. }
  233. }
  234. } catch (IOException e) {
  235. plugin.getLogger().log(Level.SEVERE, "Couldn't load Games data", e);
  236. }
  237. }
  238.  
  239. private File getLobbyFile() {
  240. return new File(plugin.getDataFolder(), "lobby.json");
  241. }
  242.  
  243. private void saveLobby() {
  244. try {
  245. File file = getLobbyFile();
  246.  
  247. if (lobby == null) {
  248. return;
  249. }
  250.  
  251. if(!file.exists()) {
  252. file.createNewFile();
  253. }
  254.  
  255. try(FileWriter writer = new FileWriter(file)) {
  256. writer.write(gson.toJson(lobby.getLocation()));
  257. }
  258. } catch (IOException e) {
  259. plugin.getLogger().log(Level.SEVERE, "Couldn't save Games data", e);
  260. }
  261. }
  262.  
  263. private void loadLobby() {
  264. try {
  265. lobby = null;
  266. File file = getLobbyFile();
  267.  
  268. if(file.exists()) {
  269. try(BufferedReader reader = new BufferedReader(new FileReader(file))) {
  270. SLocation location = gson.fromJson(reader, SLocation.class);
  271.  
  272. setLobby(new Lobby(location));
  273. }
  274. }
  275. } catch (IOException e) {
  276. plugin.getLogger().log(Level.SEVERE, "Couldn't load lobby", e);
  277. }
  278. }
  279.  
  280. private BukkitTask lobbyRunnable() {
  281. stop();
  282. return new BukkitRunnable() {
  283. @Override
  284. public void run() {
  285. try {
  286. if (lobby == null) {
  287. stop();
  288. } else {
  289. for (Player player : lobby.getPlayers()) {
  290. PlayerData playerData = plugin.getDataManager().load(player.getUniqueId(), player.getName());
  291. ScoreboardTemplates.LOBBY.get().toBoard(playerData).send(player);
  292. }
  293. }
  294. } catch (Exception e) {
  295. plugin.getLogger().log(Level.SEVERE, "An error occurred while updating scoreboard", e);
  296. stop();
  297. }
  298. }
  299. }.runTaskTimer(plugin, 0, 20);
  300. }
  301.  
  302. public void stop() {
  303. if(task != null) {
  304. task.cancel();
  305. task = null;
  306. }
  307. }
  308.  
  309. public boolean isActive() {
  310. return task != null;
  311. }
  312.  
  313. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement