浏览代码

implemented abba games

TODO cleanup. Lots of cleanup.
lennartVH01 9 年之前
父节点
当前提交
bf5a5d3f5d

+ 1 - 1
README.md

@@ -5,7 +5,7 @@ Simple Abba managing plugin
 //todo usage
 //todo usage
 
 
 ## Features
 ## Features
-// todo features
+Abba inventory calculator
 
 
 ## Planned Features
 ## Planned Features
 - Allow betting on winner of game
 - Allow betting on winner of game

+ 23 - 1
plugin.yml

@@ -2,10 +2,26 @@ name: AbbaCaving
 main: me.lennartVH01.Main
 main: me.lennartVH01.Main
 version: 0.1
 version: 0.1
 description: Abba Caving Management Plugin
 description: Abba Caving Management Plugin
+author: lennartVH01
 commands:
 commands:
   abba:
   abba:
     description: Abba hub command
     description: Abba hub command
 permissions:
 permissions:
+  AbbaCaving.player.*:
+    description: Gives access to all commands for players
+    children:
+      AbbaCaving.join: true
+      AbbaCaving.leave: true
+      AbbaCaving.info: true
+      AbbaCaving.list: true
+      AbbaCaving.calc: true
+  AbbaCaving.admin.*:
+    AbbaCaving.create: true
+    AbbaCaving.remove: true
+    AbbaCaving.reload: true
+    AbbaCaving.open: true
+    AbbaCaving.close: true
+    AbbaCaving.start: true
   AbbaCaving.join:
   AbbaCaving.join:
     default: true
     default: true
   AbbaCaving.leave:
   AbbaCaving.leave:
@@ -14,6 +30,8 @@ permissions:
     default: true
     default: true
   AbbaCaving.list:
   AbbaCaving.list:
     default: true
     default: true
+  AbbaCaving.calc:
+    default: true
   AbbaCaving.joinFull:
   AbbaCaving.joinFull:
     default: op
     default: op
   AbbaCaving.create:
   AbbaCaving.create:
@@ -28,5 +46,9 @@ permissions:
     default: op
     default: op
   AbbaCaving.start:
   AbbaCaving.start:
     default: op
     default: op
-  AbbaGame.reload:
+  AbbaCaving.reload:
+    default: op
+  AbbaCaving.config:
+    default: op
+  AbbaCaving.registerChest:
     default: op
     default: op

+ 70 - 3
src/me/lennartVH01/AbbaGame.java

@@ -2,21 +2,36 @@ package me.lennartVH01;
 
 
 
 
 
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.List;
 import java.util.ArrayList;
 import java.util.ArrayList;
+import java.util.Map;
+import java.util.UUID;
 
 
+import org.bukkit.Bukkit;
 import org.bukkit.Location;
 import org.bukkit.Location;
+import org.bukkit.block.Chest;
 import org.bukkit.entity.Player;
 import org.bukkit.entity.Player;
+import org.bukkit.scoreboard.DisplaySlot;
+import org.bukkit.scoreboard.Objective;
+import org.bukkit.scoreboard.Score;
+import org.bukkit.scoreboard.Scoreboard;
 
 
 
 
 public class AbbaGame {
 public class AbbaGame {
 	
 	
-	public boolean open;
+	public boolean open = false;
+	public boolean running = false;
+	public boolean ended = true;
 	public String name;
 	public String name;
 	public Location spawn;
 	public Location spawn;
+	public long endTime;
 	public int duration;
 	public int duration;
 	public int playerCap;
 	public int playerCap;
 	public List<Player> players;
 	public List<Player> players;
+	public List<Chest> chests;
+	public Map<UUID, CalculatedScore> endStats = new HashMap<UUID, CalculatedScore>();
+	public Scoreboard sb;
 	
 	
 	public AbbaGame(String name, Location spawn, int duration, int playerCap){
 	public AbbaGame(String name, Location spawn, int duration, int playerCap){
 		this.name = name;
 		this.name = name;
@@ -28,7 +43,6 @@ public class AbbaGame {
 		}else{
 		}else{
 			players = new ArrayList<Player>(playerCap);
 			players = new ArrayList<Player>(playerCap);
 		}
 		}
-		this.open = false;
 	}
 	}
 	
 	
 	public void open(){
 	public void open(){
@@ -60,10 +74,63 @@ public class AbbaGame {
 		players.add(p);
 		players.add(p);
 		
 		
 	}
 	}
-
+	public void addChest(Chest c){
+		chests.add(c);
+	}
+	public List<Chest> getChests(){
+		return chests;
+	}
 	public void leave(Player p) {
 	public void leave(Player p) {
 		players.remove(p);
 		players.remove(p);
 	}
 	}
+	public void onSecond(){
+		
+	}
 
 
+	public boolean isRunning() {
+		return running;
+	}
+
+	public long getEndTime() {
+		return endTime;
+	}
+
+	public void start() {
+		// TODO Add stuff like tp people to cave if neccecary
+		endTime = System.currentTimeMillis() + 1000 * duration;
+		running = true;
+		
+	}
+
+	public void finishGame() {
+		sb = Bukkit.getScoreboardManager().getNewScoreboard();
+		Objective abbaObjective = sb.registerNewObjective("Abba Scores", "dummy");
+		abbaObjective.setDisplaySlot(DisplaySlot.SIDEBAR);;
+		for(Player p:players){
+			p.sendMessage("Game ended!");
+			p.teleport(spawn);
+			
+			
+			Score score = abbaObjective.getScore(p.getName());
+			CalculatedScore stat = AbbaTools.calcScore(p.getInventory());
+			score.setScore(stat.getTotal());
+			endStats.put(p.getUniqueId(), stat);
+		}
+		for(Player p:players){
+			p.setScoreboard(sb);
+		}
+		running = false;
+		ended = true;
+	}
+
+	public void setDuration(long newDuration) {
+		duration = (int) newDuration;
+		
+	}
+
+	public void setEndTime(long newEndTime) {
+		endTime = newEndTime;
+		
+	}
 	
 	
 }
 }

+ 2 - 2
src/me/lennartVH01/AbbaTools.java

@@ -56,8 +56,8 @@ public class AbbaTools {
 	
 	
 	
 	
 	
 	
-	public static calculatedScore calcScore(Inventory inv){
-		calculatedScore points = new calculatedScore(itemPairs);
+	public static CalculatedScore calcScore(Inventory inv){
+		CalculatedScore points = new CalculatedScore(itemPairs);
 		
 		
 		//might not be the most efficient, should probably use a HashMap for the itemPairs array
 		//might not be the most efficient, should probably use a HashMap for the itemPairs array
 		for(int i = 0; i < itemPairs.size(); i++){
 		for(int i = 0; i < itemPairs.size(); i++){

+ 31 - 0
src/me/lennartVH01/EventListener.java

@@ -0,0 +1,31 @@
+package me.lennartVH01;
+
+import org.bukkit.Material;
+import org.bukkit.block.Chest;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.block.BlockBreakEvent;
+import org.bukkit.event.block.BlockPlaceEvent;
+import org.bukkit.event.block.SignChangeEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
+
+public class EventListener implements Listener{
+	public Main plugin;
+	public void initialize(Main plugin) {
+		this.plugin = plugin;
+		
+	}
+	@EventHandler
+	public void onPlayerQuit(PlayerQuitEvent e){
+		AbbaGame game = plugin.playerMap.remove(e.getPlayer().getUniqueId());
+		if(game != null){
+			game.leave(e.getPlayer());
+		}
+	}
+	
+	//Don't use doublechests, they kinda break stuff
+	@EventHandler
+	public void onChestRemove(BlockBreakEvent e){
+		
+	}
+}

+ 135 - 12
src/me/lennartVH01/Main.java

@@ -17,8 +17,8 @@ import org.bukkit.command.CommandSender;
 import org.bukkit.configuration.file.FileConfiguration;
 import org.bukkit.configuration.file.FileConfiguration;
 import org.bukkit.entity.Player;
 import org.bukkit.entity.Player;
 import org.bukkit.inventory.ItemStack;
 import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.PlayerInventory;
 import org.bukkit.plugin.java.JavaPlugin;
 import org.bukkit.plugin.java.JavaPlugin;
+import org.bukkit.scheduler.BukkitRunnable;
 
 
 public class Main extends JavaPlugin{
 public class Main extends JavaPlugin{
 	
 	
@@ -34,22 +34,36 @@ public class Main extends JavaPlugin{
 	
 	
 	
 	
 	
 	
-	public final Map<UUID, AbbaGame> playerMap = new HashMap<UUID, AbbaGame>();
+	public Map<UUID, AbbaGame> playerMap = new HashMap<UUID, AbbaGame>();
 	
 	
-	public final String[] abbaSubCommands = new String[]{"calc", "close", "create", "info", "join", "leave", "list", "open", "reload", "remove"};
+	public List<AbbaGame> ongoingGames = new ArrayList<AbbaGame>();
 	
 	
+	public final String[] abbaSubCommands = new String[]{"calc", "close", "create", "info", "join", "leave", "list", "open", "reload", "remove"};
 	
 	
-	public final FileConfiguration config = this.getConfig();
 	
 	
-	public static Main plugin;
+	public FileConfiguration config = this.getConfig();
 	
 	
 	
 	
+	public EventListener evtListener = new EventListener();
 	
 	
 	@Override
 	@Override
 	public void onEnable(){
 	public void onEnable(){
+		// Event handler
+		evtListener.initialize(this);
+		getServer().getPluginManager().registerEvents(evtListener, this);
 		
 		
-		
-		
+		getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
+			
+			@Override
+			public void run() {
+				for(AbbaGame game:AbbaTools.getGames()){
+					if(game.isRunning() && System.currentTimeMillis() > game.endTime){
+						game.finishGame();
+					}
+				}
+				System.out.println("ding!");
+			}
+		}, 0, 20);
 		
 		
 		
 		
 		//Config
 		//Config
@@ -144,6 +158,9 @@ public class Main extends JavaPlugin{
 					sender.sendMessage(Messages.mustBeInGameError);
 					sender.sendMessage(Messages.mustBeInGameError);
 					return false;
 					return false;
 				}
 				}
+				
+				
+				
 			case "leave":
 			case "leave":
 				if(sender instanceof Player){
 				if(sender instanceof Player){
 					if(sender.hasPermission("AbbaCaving.leave")){
 					if(sender.hasPermission("AbbaCaving.leave")){
@@ -162,13 +179,16 @@ public class Main extends JavaPlugin{
 					sender.sendMessage(Messages.mustBeInGameError);
 					sender.sendMessage(Messages.mustBeInGameError);
 					return false;
 					return false;
 				}
 				}
+				
+				
+				
 			case "info":
 			case "info":
 				if(sender.hasPermission("AbbaCaving.info")){
 				if(sender.hasPermission("AbbaCaving.info")){
 					AbbaGame game;
 					AbbaGame game;
 					if(args.length >= 2){
 					if(args.length >= 2){
 						game = AbbaTools.getAbbaGame(args[1]);
 						game = AbbaTools.getAbbaGame(args[1]);
 						if(game == null){
 						if(game == null){
-							sender.sendMessage("§cGame \"" + args[1] + "\" doesn't exist");
+							sender.sendMessage(String.format(Messages.gameNotFoundError, args[1]));
 							return false;
 							return false;
 						}
 						}
 					}else{
 					}else{
@@ -184,6 +204,9 @@ public class Main extends JavaPlugin{
 					return false;
 					return false;
 				}
 				}
 				break;
 				break;
+				
+				
+				
 			case "list":
 			case "list":
 				if(sender.hasPermission("AbbaCaving.list")){
 				if(sender.hasPermission("AbbaCaving.list")){
 					sender.sendMessage("Games:");
 					sender.sendMessage("Games:");
@@ -199,6 +222,9 @@ public class Main extends JavaPlugin{
 					sender.sendMessage(Messages.noPermissionError);
 					sender.sendMessage(Messages.noPermissionError);
 					return false;
 					return false;
 				}
 				}
+				
+				
+				
 			case "calc":
 			case "calc":
 				if(sender.hasPermission("AbbaCaving.calc")){
 				if(sender.hasPermission("AbbaCaving.calc")){
 					Player calcPlayer;
 					Player calcPlayer;
@@ -217,7 +243,7 @@ public class Main extends JavaPlugin{
 						}
 						}
 					}
 					}
 					
 					
-					calculatedScore score = AbbaTools.calcScore(calcPlayer.getInventory());
+					CalculatedScore score = AbbaTools.calcScore(calcPlayer.getInventory());
 					for(int i = 0; i < score.size(); i++){
 					for(int i = 0; i < score.size(); i++){
 						if(score.getItemCount(i) != 0)
 						if(score.getItemCount(i) != 0)
 							sender.sendMessage(score.getItemCount(i) + "x" + score.getItemStack(i).getType().toString() + ": " + score.getItemPoints(i));
 							sender.sendMessage(score.getItemCount(i) + "x" + score.getItemStack(i).getType().toString() + ": " + score.getItemPoints(i));
@@ -297,6 +323,9 @@ public class Main extends JavaPlugin{
 					sender.sendMessage(Messages.noPermissionError);
 					sender.sendMessage(Messages.noPermissionError);
 				}
 				}
 				break;
 				break;
+				
+				
+				
 			case "remove":
 			case "remove":
 				if(sender.hasPermission("AbbaCaving.remove")){
 				if(sender.hasPermission("AbbaCaving.remove")){
 					if(args.length >= 2){
 					if(args.length >= 2){
@@ -304,7 +333,7 @@ public class Main extends JavaPlugin{
 							sender.sendMessage("Successfully removed game \"" + args[1] + "\"");
 							sender.sendMessage("Successfully removed game \"" + args[1] + "\"");
 							return true;
 							return true;
 						}else{
 						}else{
-							sender.sendMessage("§cNo such game \"" + args[1] + "\"");
+							sender.sendMessage(String.format(Messages.gameNotFoundError, args[1]));
 							return false;
 							return false;
 						}
 						}
 					}else{
 					}else{
@@ -316,13 +345,15 @@ public class Main extends JavaPlugin{
 					return false;
 					return false;
 				}
 				}
 				
 				
+				
+				
 			case "open":
 			case "open":
 				if(sender.hasPermission("AbbaCaving.open")){
 				if(sender.hasPermission("AbbaCaving.open")){
 					AbbaGame game;
 					AbbaGame game;
 					if(args.length >= 2){
 					if(args.length >= 2){
 						game = AbbaTools.getAbbaGame(args[1]);
 						game = AbbaTools.getAbbaGame(args[1]);
 						if(game == null){
 						if(game == null){
-							sender.sendMessage("§cThere is no game named \"" + args[1] + "\"");
+							sender.sendMessage(String.format(Messages.gameNotFoundError, args[1]));
 							return false;
 							return false;
 						}
 						}
 					}else{
 					}else{
@@ -339,13 +370,16 @@ public class Main extends JavaPlugin{
 					sender.sendMessage(Messages.noPermissionError);
 					sender.sendMessage(Messages.noPermissionError);
 					return false;
 					return false;
 				}
 				}
+				
+				
+				
 			case "close":
 			case "close":
 				if(sender.hasPermission("AbbaCaving.open")){
 				if(sender.hasPermission("AbbaCaving.open")){
 					AbbaGame game;
 					AbbaGame game;
 					if(args.length >= 2){
 					if(args.length >= 2){
 						game = AbbaTools.getAbbaGame(args[1]);
 						game = AbbaTools.getAbbaGame(args[1]);
 						if(game == null){
 						if(game == null){
-							sender.sendMessage("§cThere is no game named \"" + args[1] + "\"");
+							sender.sendMessage(String.format(Messages.gameNotFoundError, args[1]));
 							return false;
 							return false;
 						}
 						}
 					}else{
 					}else{
@@ -376,6 +410,95 @@ public class Main extends JavaPlugin{
 					return false;
 					return false;
 				}
 				}
 				break;
 				break;
+				
+				
+				
+			case "start":
+				if(sender.hasPermission("AbbaCaving.start")){
+					AbbaGame game;
+					if(args.length >= 2){
+						game = AbbaTools.getAbbaGame(args[1]);
+						if(game == null){
+							sender.sendMessage(String.format(Messages.gameNotFoundError, args[1]));
+							return false;
+						}
+					}else{
+						game = AbbaTools.getAbbaGame();
+						if(game == null){
+							sender.sendMessage("§cNo games found");
+							return false;
+						}
+					}
+					if(game.isRunning()){
+						sender.sendMessage("§cGame already running!");
+						return false;
+					}else{
+						game.start();
+						sender.sendMessage("Game started, " + game.duration + " seconds left!");
+						return true;
+					}
+					
+				}else{
+					sender.sendMessage(Messages.noPermissionError);
+					return false;
+				}
+				
+				
+				
+			case "config":
+				if(sender.hasPermission("AbbaCaving.config")){
+					if(args.length >= 2){
+						if(args.length >= 3){
+							AbbaGame game = AbbaTools.getAbbaGame(args[1]);
+							if(game == null){
+								sender.sendMessage(Messages.gameNotFoundError);
+							}
+							switch(args[2].toLowerCase()){
+							case "timer":
+								
+								if(args.length >= 4){
+									int newTime;
+								
+									try{
+										newTime = Integer.parseInt(args[3]);
+									}catch(NumberFormatException e){
+										sender.sendMessage("§cPlease specify a number when you use this command");
+										return false;
+									}
+									if(newTime <= 0){
+										sender.sendMessage("§cPlease specify a stricktly positive number");
+										return false;
+									}
+									if(game.isRunning()){
+										game.setEndTime(System.currentTimeMillis() + newTime * 1000);
+										
+									}else{
+										game.setDuration(newTime);
+									}
+									sender.sendMessage("Time has been updated!");
+									return true;
+									
+								}else{
+									sender.sendMessage("§cPlease specify new time");
+									return false;
+								}
+							}
+						}else{
+							sender.sendMessage("§cChoose an option!");
+							return false;
+						}
+					}else{
+						sender.sendMessage(Messages.mustSpecifyGameError);
+						return false;
+					}
+				}else{
+					sender.sendMessage(Messages.noPermissionError);
+					return false;
+				}
+				
+				
+				
+				break;
 			default:
 			default:
 				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");
 				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");
 				return false;
 				return false;

+ 2 - 0
src/me/lennartVH01/Messages.java

@@ -3,4 +3,6 @@ package me.lennartVH01;
 public class Messages {
 public class Messages {
 	public static final String noPermissionError = "§cYou don't have permission to use this command!";
 	public static final String noPermissionError = "§cYou don't have permission to use this command!";
 	public static final String mustBeInGameError = "§cYou must be ingame to use this command!";
 	public static final String mustBeInGameError = "§cYou must be ingame to use this command!";
+	public static final String gameNotFoundError = "§cGame %s not found!";
+	public static final String mustSpecifyGameError = "§cYou must specify a game!";
 }
 }