浏览代码

/abba join, leave and reload

TODO remove peeps who disconnect from games
lennartVH01 9 年之前
父节点
当前提交
267b133bb1
共有 6 个文件被更改,包括 225 次插入22 次删除
  1. 5 3
      config.yml
  2. 2 0
      plugin.yml
  3. 36 1
      src/me/lennartVH01/AbbaGame.java
  4. 11 2
      src/me/lennartVH01/AbbaTools.java
  5. 170 16
      src/me/lennartVH01/Main.java
  6. 1 0
      src/me/lennartVH01/Messages.java

+ 5 - 3
config.yml

@@ -11,12 +11,14 @@ NotifyTimes:
 - 60
 
 # Max players per game, users with permission AbbaCaving.joinFull can still join
-PlayerCap: 10
+PlayerCap: 1
 
 # Ratio of spoils given per player: 
-#   Top: first n players receive these chunks of total wins
-#   Pot: Amount to be added to general Pot
 #   All: Amount to be spread over all participants
+#   Pot: Amount to be added to general Pot
+#   Top: first n players receive these chunks of total wins
+
+
 WinRatios:
   All: 0.05
   Pot: 0.05

+ 2 - 0
plugin.yml

@@ -27,4 +27,6 @@ permissions:
   AbbaCaving.tp:
     default: op
   AbbaCaving.start:
+    default: op
+  AbbaGame.reload:
     default: op

+ 36 - 1
src/me/lennartVH01/AbbaGame.java

@@ -2,7 +2,11 @@ package me.lennartVH01;
 
 
 
+import java.util.List;
+import java.util.ArrayList;
+
 import org.bukkit.Location;
+import org.bukkit.entity.Player;
 
 
 public class AbbaGame {
@@ -11,11 +15,19 @@ public class AbbaGame {
 	public String name;
 	public Location spawn;
 	public int duration;
+	public int playerCap;
+	public List<Player> players;
 	
-	public AbbaGame(String name, Location spawn, int duration){
+	public AbbaGame(String name, Location spawn, int duration, int playerCap){
 		this.name = name;
 		this.spawn = spawn;
 		this.duration = duration;
+		this.playerCap = playerCap;
+		if(playerCap == -1){
+			players = new ArrayList<Player>();
+		}else{
+			players = new ArrayList<Player>(playerCap);
+		}
 		this.open = false;
 	}
 	
@@ -28,7 +40,30 @@ public class AbbaGame {
 	public boolean isOpen(){
 		return open;
 	}
+	public boolean hasRoom(){
+		return (playerCap == -1 || players.size() < playerCap);
+	}
+	public int getPlayerCount(){
+		return players.size();
+	}
+	public int getMaxPlayers(){
+		return playerCap;
+	}
 	public String getName(){
 		return name;
 	}
+	public Location getSpawn(){
+		return spawn;
+	}
+
+	public void addPlayer(Player p) {
+		players.add(p);
+		
+	}
+
+	public void leave(Player p) {
+		players.remove(p);
+	}
+
+	
 }

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

@@ -4,6 +4,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.bukkit.Location;
+import org.bukkit.entity.Player;
 import org.bukkit.inventory.Inventory;
 import org.bukkit.inventory.ItemStack;
 
@@ -20,8 +21,8 @@ public class AbbaTools {
 	
 	
 	
-	public static void create(String name, Location spawn, int duration){
-		AbbaGame game = new AbbaGame(name, spawn, duration);
+	public static void create(String name, Location spawn, int duration, int playerCap){
+		AbbaGame game = new AbbaGame(name, spawn, duration, playerCap);
 		games.add(game);
 	}
 	public static boolean removeAbbaGame(String name){
@@ -49,6 +50,11 @@ public class AbbaTools {
 			return null;
 		}
 	}
+	public static ItemStack[] getContraband(Inventory i){
+		return null;
+	}
+	
+	
 	
 	public static calculatedScore calcScore(Inventory inv){
 		calculatedScore points = new calculatedScore(itemPairs);
@@ -70,4 +76,7 @@ public class AbbaTools {
 	public static List<AbbaGame> getGames() {
 		return games;
 	}
+
+
+	
 }

+ 170 - 16
src/me/lennartVH01/Main.java

@@ -2,11 +2,14 @@ package me.lennartVH01;
 
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.List;
+import java.util.UUID;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 
+import org.bukkit.GameMode;
 import org.bukkit.Location;
 import org.bukkit.World;
 import org.bukkit.command.Command;
@@ -14,6 +17,7 @@ import org.bukkit.command.CommandSender;
 import org.bukkit.configuration.file.FileConfiguration;
 import org.bukkit.entity.Player;
 import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.PlayerInventory;
 import org.bukkit.plugin.java.JavaPlugin;
 
 public class Main extends JavaPlugin{
@@ -30,8 +34,9 @@ public class Main extends JavaPlugin{
 	
 	
 	
+	public final 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 final FileConfiguration config = this.getConfig();
@@ -45,6 +50,8 @@ public class Main extends JavaPlugin{
 		
 		
 		
+		
+		
 		//Config
 		this.saveDefaultConfig();
 		
@@ -84,27 +91,92 @@ public class Main extends JavaPlugin{
 			}
 			switch(args[0].toLowerCase()){
 			case "join":
-				if(sender.hasPermission("AbbaGame.join")){
-					
-					
-					
-					
+				if(sender instanceof Player){
+					if(sender.hasPermission("AbbaCaving.join")){
+						Player p = (Player) sender;
+						AbbaGame game;
+						
+						if(args.length >= 2){
+							game = AbbaTools.getAbbaGame(args[1]);
+						}else{
+							game = AbbaTools.getAbbaGame();
+						}
+						if(!(game.isOpen() || p.hasPermission("AbbaCaving.joinClosed"))){
+							p.sendMessage("§cThis game is closed!");
+							return false;
+						}
+						if(!(game.hasRoom() || p.hasPermission("AbbaCaving.joinFull"))){
+							p.sendMessage("§cThis game is full!");
+							return false;
+						}
+						
+						if(!p.hasPermission("AbbaCaving.canCarryContraband")){
+							ItemStack[] contraband = AbbaTools.getContraband(p.getInventory());
+							if(contraband != null && contraband.length >= 1){
+								p.sendMessage("§cYou cannot carry " + contraband[0].getType().toString() + " with you on an abba game!");
+								return false;
+							}
+						}
+						
+						AbbaGame oldGame = playerMap.get(p.getUniqueId());
+						if(oldGame != null){
+							if(p.hasPermission("AbbaCaving.leave")){
+								oldGame.leave(p);
+								playerMap.remove(p.getUniqueId());
+								p.sendMessage("Left game \"" + oldGame.getName() + "\"");
+							}else{
+								p.sendMessage("§cYou don't have permission to leave the current game!");
+							}
+						}
+						
+						game.addPlayer(p);
+						playerMap.put(p.getUniqueId(), game);
+						p.sendMessage("Joined game \"" + game.getName() + "\"");
+						
+						p.teleport(game.getSpawn());
+						p.setGameMode(GameMode.SURVIVAL);
+						return true;
+					}else{
+						sender.sendMessage(Messages.noPermissionError);
+						return false;
+					}
 				}else{
-					sender.sendMessage(Messages.noPermissionError);
+					sender.sendMessage(Messages.mustBeInGameError);
 					return false;
 				}
-				
-				break;
 			case "leave":
-				
-				break;
+				if(sender instanceof Player){
+					if(sender.hasPermission("AbbaCaving.leave")){
+						Player p = (Player) sender;
+						AbbaGame game = playerMap.get(p.getUniqueId());
+						game.leave(p);
+						playerMap.remove(p.getUniqueId());
+						p.sendMessage("Left game \"" + game.getName() + "\"");
+						return true;
+					}else{
+						sender.sendMessage(Messages.noPermissionError);
+						return false;
+					}
+					
+				}else{
+					sender.sendMessage(Messages.mustBeInGameError);
+					return false;
+				}
 			case "info":
 				if(sender.hasPermission("AbbaCaving.info")){
 					AbbaGame game;
 					if(args.length >= 2){
 						game = AbbaTools.getAbbaGame(args[1]);
+						if(game == null){
+							sender.sendMessage("§cGame \"" + args[1] + "\" doesn't exist");
+							return false;
+						}
 					}else{
 						game = AbbaTools.getAbbaGame();
+						if(game == null){
+							sender.sendMessage("§cNo Games found!");
+							return false;
+						}
 					}
 					sender.sendMessage("Game \"" + game.getName() + "\" " + (game.isOpen() ? "§aOpen":"§cClosed"));
 				}else{
@@ -117,9 +189,9 @@ public class Main extends JavaPlugin{
 					sender.sendMessage("Games:");
 					for(AbbaGame g:AbbaTools.getGames()){
 						if(g.isOpen()){
-							sender.sendMessage("- §a" + g.getName());
+							sender.sendMessage("- §a" + g.getName() + " (" + g.getPlayerCount() + "/" + g.getMaxPlayers() + ")");
 						}else{
-							sender.sendMessage("- §7§o" + g.getName());
+							sender.sendMessage("- §7§o" + g.getName() + " (" + g.getPlayerCount() + "/" + g.getMaxPlayers() + ")");
 						}
 					}
 					return true;
@@ -212,11 +284,17 @@ public class Main extends JavaPlugin{
 					}
 					
 					
+					
+					while(AbbaTools.getAbbaGame(gameName) != null){
+						gameName += "_";
+					}
 					//create game
-					AbbaTools.create(gameName, gameSpawn, config.getInt("GameDuration"));
+					AbbaTools.create(gameName, gameSpawn, config.getInt("GameDuration"), config.getInt("PlayerCap"));
 					sender.sendMessage("Successfully created game \"" + gameName + "\"");
 					return true;
 					
+				}else{
+					sender.sendMessage(Messages.noPermissionError);
 				}
 				break;
 			case "remove":
@@ -238,13 +316,68 @@ public class Main extends JavaPlugin{
 					return false;
 				}
 				
-			
+			case "open":
+				if(sender.hasPermission("AbbaCaving.open")){
+					AbbaGame game;
+					if(args.length >= 2){
+						game = AbbaTools.getAbbaGame(args[1]);
+						if(game == null){
+							sender.sendMessage("§cThere is no game named \"" + args[1] + "\"");
+							return false;
+						}
+					}else{
+						game = AbbaTools.getAbbaGame();
+						if(game == null){
+							sender.sendMessage("§cNo game found");
+							return false;
+						}
+					}
+					game.open();
+					sender.sendMessage("Opened game \"" + args[1] + "\"");
+					return true;
+				}else{
+					sender.sendMessage(Messages.noPermissionError);
+					return false;
+				}
+			case "close":
+				if(sender.hasPermission("AbbaCaving.open")){
+					AbbaGame game;
+					if(args.length >= 2){
+						game = AbbaTools.getAbbaGame(args[1]);
+						if(game == null){
+							sender.sendMessage("§cThere is no game named \"" + args[1] + "\"");
+							return false;
+						}
+					}else{
+						game = AbbaTools.getAbbaGame();
+						if(game == null){
+							sender.sendMessage("§cNo game found");
+							return false;
+						}
+					}
+					game.close();
+					sender.sendMessage("Closed game \"" + args[1] + "\"");
+					return true;
+				}else{
+					sender.sendMessage(Messages.noPermissionError);
+					return false;
+				}
 			
 			
 			
 			//Abba help
+			case "reload":
+				if(sender.hasPermission("AbbaCaving.reload")){
+					sender.sendMessage("Reloading config...");
+					this.reloadConfig();
+					sender.sendMessage("Reload Complete.");
+				}else{
+					sender.sendMessage(Messages.noPermissionError);
+					return false;
+				}
+				break;
 			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: Opens a game\n - §aabba close§f: Closes a game");
+				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;
 			}
 			
@@ -255,4 +388,25 @@ public class Main extends JavaPlugin{
 		
 		return false;
 	}
+	@Override
+	public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args){
+		List<String> cmds = new ArrayList<String>();
+		if(command.getName().equalsIgnoreCase("abba")){
+			if(args.length == 0){
+				for(String s:abbaSubCommands){
+					if(sender.hasPermission("AbbaCaving." + s)){
+						cmds.add(s);
+					}
+				}
+			}else if(args.length == 1){
+				for(String s:abbaSubCommands){
+					if(sender.hasPermission("AbbaCaving." + s) && s.startsWith(args[0])){
+						cmds.add(s);
+					}
+				}
+			}else{
+			}
+		}
+		return cmds;
+	}
 }

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

@@ -2,4 +2,5 @@ package me.lennartVH01;
 
 public class Messages {
 	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!";
 }