Main.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521
  1. package me.lennartVH01;
  2. import java.util.ArrayList;
  3. import java.util.Date;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6. import java.util.List;
  7. import java.util.UUID;
  8. import java.text.DateFormat;
  9. import java.text.SimpleDateFormat;
  10. import org.bukkit.GameMode;
  11. import org.bukkit.Location;
  12. import org.bukkit.World;
  13. import org.bukkit.command.Command;
  14. import org.bukkit.command.CommandSender;
  15. import org.bukkit.configuration.file.FileConfiguration;
  16. import org.bukkit.entity.Player;
  17. import org.bukkit.inventory.ItemStack;
  18. import org.bukkit.plugin.java.JavaPlugin;
  19. import org.bukkit.scheduler.BukkitRunnable;
  20. public class Main extends JavaPlugin{
  21. public Map<UUID, AbbaGame> playerMap = new HashMap<UUID, AbbaGame>();
  22. public List<AbbaGame> ongoingGames = new ArrayList<AbbaGame>();
  23. public final String[] abbaSubCommands = new String[]{"calc", "close", "config", "create", "info", "join", "leave", "list", "open", "reload", "remove", "start"};
  24. public FileConfiguration config = this.getConfig();
  25. public EventListener evtListener = new EventListener();
  26. @Override
  27. public void onEnable(){
  28. // Event handler
  29. evtListener.initialize(this);
  30. getServer().getPluginManager().registerEvents(evtListener, this);
  31. //Config
  32. this.saveDefaultConfig();
  33. // get Item Point Values
  34. List<Map<?,?>> itemPointMaps = config.getMapList("ItemValues");
  35. List<ValueItemPair> valueItemPairs = new ArrayList<ValueItemPair>();
  36. for(Map<?,?> itemMapGeneric:itemPointMaps){
  37. //Put the torches and pitchforks away, config.getMapList() *should* return Map<String, Object> anyways
  38. @SuppressWarnings("unchecked")
  39. Map<String, Object> itemMap = (Map<String, Object>) itemMapGeneric;
  40. if(itemMap.get("Value") == null)
  41. continue;
  42. int value = (int) itemMap.remove("Value");
  43. ItemStack stack = ItemStack.deserialize(itemMap);
  44. stack.setAmount(0);
  45. valueItemPairs.add(new ValueItemPair(stack, value));
  46. }
  47. AbbaTools.initialize(this, valueItemPairs);
  48. }
  49. @Override
  50. public void onDisable(){
  51. }
  52. public boolean onCommand(CommandSender sender, Command cmd, String cmdLabel, String[] args){
  53. if(cmdLabel.equalsIgnoreCase("abba")){
  54. if(args.length == 0){
  55. args = new String[]{"help"};
  56. }
  57. switch(args[0].toLowerCase()){
  58. case "join":
  59. if(sender instanceof Player){
  60. if(sender.hasPermission("AbbaCaving.join")){
  61. Player p = (Player) sender;
  62. AbbaGame game;
  63. if(args.length >= 2){
  64. game = AbbaTools.getAbbaGame(args[1]);
  65. }else{
  66. game = AbbaTools.getAbbaGame();
  67. }
  68. if(!(game.isOpen() || p.hasPermission("AbbaCaving.joinClosed"))){
  69. p.sendMessage("§cThis game is closed!");
  70. return false;
  71. }
  72. if(!(game.hasRoom() || p.hasPermission("AbbaCaving.joinFull"))){
  73. p.sendMessage("§cThis game is full!");
  74. return false;
  75. }
  76. if(!p.hasPermission("AbbaCaving.canCarryContraband")){
  77. ItemStack[] contraband = AbbaTools.getContraband(p.getInventory());
  78. if(contraband != null && contraband.length >= 1){
  79. p.sendMessage("§cYou cannot carry " + contraband[0].getType().toString() + " with you on an abba game!");
  80. return false;
  81. }
  82. }
  83. AbbaGame oldGame = playerMap.get(p.getUniqueId());
  84. if(oldGame != null){
  85. if(p.hasPermission("AbbaCaving.leave")){
  86. oldGame.leave(p);
  87. playerMap.remove(p.getUniqueId());
  88. p.sendMessage("Left game \"" + oldGame.getName() + "\"");
  89. }else{
  90. p.sendMessage("§cYou don't have permission to leave the current game!");
  91. }
  92. }
  93. game.addPlayer(p);
  94. playerMap.put(p.getUniqueId(), game);
  95. p.sendMessage("Joined game \"" + game.getName() + "\"");
  96. p.teleport(game.getSpawn());
  97. p.setGameMode(GameMode.SURVIVAL);
  98. return true;
  99. }else{
  100. sender.sendMessage(Messages.noPermissionError);
  101. return false;
  102. }
  103. }else{
  104. sender.sendMessage(Messages.mustBeInGameError);
  105. return false;
  106. }
  107. case "leave":
  108. if(sender instanceof Player){
  109. if(sender.hasPermission("AbbaCaving.leave")){
  110. Player p = (Player) sender;
  111. AbbaGame game = playerMap.get(p.getUniqueId());
  112. game.leave(p);
  113. playerMap.remove(p.getUniqueId());
  114. p.sendMessage("Left game \"" + game.getName() + "\"");
  115. return true;
  116. }else{
  117. sender.sendMessage(Messages.noPermissionError);
  118. return false;
  119. }
  120. }else{
  121. sender.sendMessage(Messages.mustBeInGameError);
  122. return false;
  123. }
  124. case "info":
  125. if(sender.hasPermission("AbbaCaving.info")){
  126. AbbaGame game;
  127. if(args.length >= 2){
  128. game = AbbaTools.getAbbaGame(args[1]);
  129. if(game == null){
  130. sender.sendMessage(String.format(Messages.gameNotFoundError, args[1]));
  131. return false;
  132. }
  133. }else{
  134. game = AbbaTools.getAbbaGame();
  135. if(game == null){
  136. sender.sendMessage("§cNo Games found!");
  137. return false;
  138. }
  139. }
  140. sender.sendMessage("Game \"" + game.getName() + "\" " + (game.isOpen() ? "§aOpen":"§cClosed"));
  141. }else{
  142. sender.sendMessage(Messages.noPermissionError);
  143. return false;
  144. }
  145. break;
  146. case "list":
  147. if(sender.hasPermission("AbbaCaving.list")){
  148. sender.sendMessage("Games:");
  149. for(AbbaGame g:AbbaTools.getGames()){
  150. if(g.isOpen()){
  151. sender.sendMessage("- §a" + g.getName() + " (" + g.getPlayerCount() + "/" + g.getMaxPlayers() + ")");
  152. }else{
  153. sender.sendMessage("- §7§o" + g.getName() + " (" + g.getPlayerCount() + "/" + g.getMaxPlayers() + ")");
  154. }
  155. }
  156. return true;
  157. }else{
  158. sender.sendMessage(Messages.noPermissionError);
  159. return false;
  160. }
  161. case "calc":
  162. if(sender.hasPermission("AbbaCaving.calc")){
  163. Player calcPlayer;
  164. if(args.length >= 2){
  165. calcPlayer = getServer().getPlayer(args[1]);
  166. if(calcPlayer == null){
  167. sender.sendMessage("§cUnable to find player \"" + args[1] + "\"");
  168. return false;
  169. }
  170. }else{
  171. if(sender instanceof Player){
  172. calcPlayer = (Player) sender;
  173. }else{
  174. sender.sendMessage("usage: /abba calc <Player>");
  175. return false;
  176. }
  177. }
  178. CalculatedScore score = AbbaTools.calcScore(calcPlayer.getInventory());
  179. for(int i = 0; i < score.size(); i++){
  180. if(score.getItemCount(i) != 0)
  181. sender.sendMessage(score.getItemCount(i) + "x" + score.getItemStack(i).getType().toString() + ": " + score.getItemPoints(i));
  182. }
  183. sender.sendMessage("§aTotal Score: " + score.total);
  184. }else{
  185. sender.sendMessage(Messages.noPermissionError);
  186. return false;
  187. }
  188. break;
  189. //Admin commands
  190. case "create":
  191. if(args.length <= 5 && !(sender instanceof Player)){
  192. System.out.println("Must be ingame or specify world and coordinates");
  193. return false;
  194. }
  195. if(sender.hasPermission("AbbaCaving.create")){
  196. String gameName;
  197. Location gameSpawn = null;
  198. // set gameName
  199. if(args.length >= 2){
  200. gameName = args[1];
  201. }else{
  202. DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
  203. gameName = "Abba" + dateFormat.format(new Date());
  204. }
  205. // set gameSpawn
  206. if(args.length >= 5){
  207. double spawnX, spawnY, spawnZ;
  208. try{
  209. spawnX = Double.parseDouble(args[2]);
  210. spawnY = Double.parseDouble(args[3]);
  211. spawnZ = Double.parseDouble(args[4]);
  212. }catch(NumberFormatException e){
  213. return false;
  214. }
  215. if(args.length >= 6){
  216. World w = getServer().getWorld(args[5]);
  217. if(w != null){
  218. gameSpawn = new Location(w, spawnX, spawnY, spawnZ);
  219. }else{
  220. sender.sendMessage("§4Unknown world: \"" + args[5] + "\"");
  221. return false;
  222. }
  223. }
  224. }else{
  225. if(sender instanceof Player){
  226. gameSpawn = ((Player) sender).getLocation();
  227. }else{
  228. return false;
  229. }
  230. }
  231. while(AbbaTools.getAbbaGame(gameName) != null){
  232. gameName += "_";
  233. }
  234. //create game
  235. AbbaTools.create(gameName, gameSpawn);
  236. sender.sendMessage("Successfully created game \"" + gameName + "\"");
  237. return true;
  238. }else{
  239. sender.sendMessage(Messages.noPermissionError);
  240. }
  241. break;
  242. case "remove":
  243. if(sender.hasPermission("AbbaCaving.remove")){
  244. if(args.length >= 2){
  245. if(AbbaTools.removeAbbaGame(args[1])){
  246. sender.sendMessage("Successfully removed game \"" + args[1] + "\"");
  247. return true;
  248. }else{
  249. sender.sendMessage(String.format(Messages.gameNotFoundError, args[1]));
  250. return false;
  251. }
  252. }else{
  253. sender.sendMessage("Usage: /abba remove <game>");
  254. return false;
  255. }
  256. }else{
  257. sender.sendMessage(Messages.noPermissionError);
  258. return false;
  259. }
  260. case "open":
  261. if(sender.hasPermission("AbbaCaving.open")){
  262. AbbaGame game;
  263. if(args.length >= 2){
  264. game = AbbaTools.getAbbaGame(args[1]);
  265. if(game == null){
  266. sender.sendMessage(String.format(Messages.gameNotFoundError, args[1]));
  267. return false;
  268. }
  269. }else{
  270. game = AbbaTools.getAbbaGame();
  271. if(game == null){
  272. sender.sendMessage("§cNo game found");
  273. return false;
  274. }
  275. }
  276. game.open();
  277. sender.sendMessage("Opened game \"" + args[1] + "\"");
  278. return true;
  279. }else{
  280. sender.sendMessage(Messages.noPermissionError);
  281. return false;
  282. }
  283. case "close":
  284. if(sender.hasPermission("AbbaCaving.open")){
  285. AbbaGame game;
  286. if(args.length >= 2){
  287. game = AbbaTools.getAbbaGame(args[1]);
  288. if(game == null){
  289. sender.sendMessage(String.format(Messages.gameNotFoundError, args[1]));
  290. return false;
  291. }
  292. }else{
  293. game = AbbaTools.getAbbaGame();
  294. if(game == null){
  295. sender.sendMessage("§cNo game found");
  296. return false;
  297. }
  298. }
  299. game.close();
  300. sender.sendMessage("Closed game \"" + args[1] + "\"");
  301. return true;
  302. }else{
  303. sender.sendMessage(Messages.noPermissionError);
  304. return false;
  305. }
  306. //Abba help
  307. case "reload":
  308. if(sender.hasPermission("AbbaCaving.reload")){
  309. sender.sendMessage("Reloading config...");
  310. this.reloadConfig();
  311. sender.sendMessage("Reload Complete.");
  312. }else{
  313. sender.sendMessage(Messages.noPermissionError);
  314. return false;
  315. }
  316. break;
  317. case "start":
  318. if(sender.hasPermission("AbbaCaving.start")){
  319. AbbaGame game;
  320. if(args.length >= 2){
  321. game = AbbaTools.getAbbaGame(args[1]);
  322. if(game == null){
  323. sender.sendMessage(String.format(Messages.gameNotFoundError, args[1]));
  324. return false;
  325. }
  326. }else{
  327. game = AbbaTools.getAbbaGame();
  328. if(game == null){
  329. sender.sendMessage("§cNo games found");
  330. return false;
  331. }
  332. }
  333. switch(game.getState()){
  334. case WAITING:
  335. game.start();
  336. return true;
  337. case PAUSED:
  338. break;
  339. case COUNTDOWN: //countdown and running both do the same
  340. case RUNNING:
  341. sender.sendMessage("§cGame already running!");
  342. return false;
  343. case FINISHED:
  344. break;
  345. }
  346. }else{
  347. sender.sendMessage(Messages.noPermissionError);
  348. return false;
  349. }
  350. case "config":
  351. if(sender.hasPermission("AbbaCaving.config")){
  352. if(args.length >= 2){
  353. if(args.length >= 3){
  354. AbbaGame game = AbbaTools.getAbbaGame(args[1]);
  355. if(game == null){
  356. sender.sendMessage(Messages.gameNotFoundError);
  357. }
  358. switch(args[2].toLowerCase()){
  359. case "timer":
  360. if(args.length >= 4){
  361. int newTime;
  362. try{
  363. newTime = Integer.parseInt(args[3]);
  364. }catch(NumberFormatException e){
  365. sender.sendMessage("§cPlease specify a number when you use this command");
  366. return false;
  367. }
  368. if(newTime <= 0){
  369. sender.sendMessage("§cPlease specify a stricktly positive number");
  370. return false;
  371. }
  372. if(game.getState() == GameState.RUNNING || game.getState() == GameState.PAUSED){
  373. game.setEndTime(System.currentTimeMillis() + newTime * 1000);
  374. }else{
  375. game.setDuration(newTime);
  376. }
  377. sender.sendMessage("Time has been updated!");
  378. return true;
  379. }else{
  380. sender.sendMessage("§cPlease specify new time");
  381. return false;
  382. }
  383. }
  384. }else{
  385. sender.sendMessage("§cChoose an option!");
  386. return false;
  387. }
  388. }else{
  389. sender.sendMessage(Messages.mustSpecifyGameError);
  390. return false;
  391. }
  392. }else{
  393. sender.sendMessage(Messages.noPermissionError);
  394. return false;
  395. }
  396. break;
  397. default:
  398. sender.sendMessage("Usage:\n - §aabba join§r: Joins the Abba Match\n - §aabba leave§f: Leaves current Abba Game\n - §aabba info§f: Displays info about an Abba Match\n - §aabba create§f: Creates an Abba Game at current location\n - §aabba remove§f: Stops game\n - §aabba open§f: Allows players to join the game\n - §aabba close§f: Prevents players from joining");
  399. return false;
  400. }
  401. }
  402. return false;
  403. }
  404. @Override
  405. public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args){
  406. List<String> cmds = new ArrayList<String>();
  407. if(command.getName().equalsIgnoreCase("abba")){
  408. switch(args.length){
  409. case 1:
  410. for(String s:abbaSubCommands){
  411. if(sender.hasPermission("AbbaCaving." + s) && s.startsWith(args[0])){
  412. cmds.add(s);
  413. }
  414. }
  415. break;
  416. case 2:
  417. for(AbbaGame game:AbbaTools.getGames()){
  418. if(game.getName().startsWith(args[1])){
  419. cmds.add(game.getName());
  420. }
  421. }
  422. }
  423. }
  424. return cmds;
  425. }
  426. }