瀏覽代碼

Improved ItemStack in Config +bugfixes

lennartVH01 9 年之前
父節點
當前提交
0bd13785ab

+ 11 - 21
config.yml

@@ -17,33 +17,23 @@ PlayerCap: 10
 
 # Points awarded for each item at the end of an Abba Match
 ItemValues:
-- type: IRON_ORE
-  Value: 1
-- type: REDSTONE_ORE
-  Value: 2
-- type: GOLD_ORE
-  Value: 4
-- type: LAPIS_ORE
-  Value: 8
-- type: DIAMOND_ORE
-  Value: 10
-- type: EMERALD_ORE
-  Value: 10
-- type: DIAMOND_BARDING
-  Value: 10
-- type: GOLDEN_APPLE
-  damage: 1
-  Value: 10
+- IRON_ORE=1
+- REDSTONE_ORE=2
+- GOLD_ORE=4
+- LAPIS_ORE=8
+- DIAMOND_ORE=10
+- EMERALD_ORE=10
+- DIAMOND_BARDING=10
+- GOLDEN_APPLE(1)=10
 
 # Enables the contraband scanner
 ScanContraband: true
 
 # Prohibited items, automatically includes entries in ItemValues
 Contraband:
-- type: GOLDEN_APPLE
-  damage: 0
-- type: POTION
+- GOLDEN_APPLE(0)
+- POTION
 
 # Enables debugging
 # ONLY USE IF YOU KNOW WHAT YOU ARE DOING OR HAVE BEEN ASKED TO DO SO BY A DEVELOPER
-Debug: false
+Debug: true

+ 2 - 0
lang.yml

@@ -24,6 +24,8 @@ error:
     breakClaimedChest: "&cYou cannot break an occupied chest!"
     
 help:
+    abba: "&aabba <subcommand>"
+    
     join: "&aabba join [game]&f: Joins the Abba Match"
     leave: "&aabba leave&f: Leaves current Abba Game"
     info: "&aabba info [game]&f: Displays info about an Abba Match"

+ 4 - 2
src/me/lennartVH01/CommandHandler.java

@@ -555,7 +555,7 @@ public class CommandHandler implements CommandExecutor, TabCompleter{
 	
 	@Override
 	public boolean onCommand(CommandSender sender, Command cmd, String alias, String[] args){
-		CommandFunc command = commands.get(args[0]);
+		CommandFunc command = commands.get(args[0].toLowerCase());
 		if(command != null){
 			if(command.hasPermission(sender)){
 				return command.run(sender, args);
@@ -563,6 +563,8 @@ public class CommandHandler implements CommandExecutor, TabCompleter{
 				sender.sendMessage(Messages.errorNoPermission);
 				return false;
 			}	
+		}else{
+			sender.sendMessage(Messages.helpAbba);
 		}
 		return false;
 	}
@@ -572,7 +574,7 @@ public class CommandHandler implements CommandExecutor, TabCompleter{
 		if(args.length == 1){
 			List<String> suggestions = new ArrayList<String>();
 			commands.forEach((name, command) -> {
-				if(name.startsWith(args[0]) && command.hasPermission(sender))
+				if(name.startsWith(args[0].toLowerCase()) && command.hasPermission(sender))
 					suggestions.add(name);
 			});
 			

+ 28 - 14
src/me/lennartVH01/Config.java

@@ -3,21 +3,23 @@ package me.lennartVH01;
 import java.util.List;
 import java.util.Map;
 
+import me.lennartVH01.game.StackTester;
+
+import org.bukkit.configuration.InvalidConfigurationException;
 import org.bukkit.configuration.file.FileConfiguration;
-import org.bukkit.inventory.ItemStack;
 
 public class Config{
 	private Config(){}
 	
-	public static ItemStack[] itemValues;
-	public static ItemStack[] contraband;
+	public static StackTester[] itemValues;
+	public static StackTester[] contraband;
 	
 	public static int defaultDuration;
 	public static int defaultPlayerCap;
 	
 	public static boolean scanContraband;
 	
-	@SuppressWarnings("unchecked")
+	//@SuppressWarnings("unchecked")
 	public static void reload(FileConfiguration config){
 		Permission.debug = config.getBoolean("Debug");
 		
@@ -25,22 +27,34 @@ public class Config{
 		defaultPlayerCap = config.getInt("PlayerCap");
 		scanContraband = config.getBoolean("ScanContraband");
 		
-		List<Map<?, ?>> itemValueMapList = config.getMapList("ItemValues");
-		List<Map<?, ?>> contrabandMapList = config.getMapList("Contraband");
+		List<Object> itemValueList = (List<Object>) config.getList("ItemValues");
+		List<Object> contrabandList = (List<Object>) config.getList("Contraband");
 		
-		itemValues = new ItemStack[itemValueMapList.size()];
-		contraband = new ItemStack[itemValueMapList.size() + contrabandMapList.size()];
+		itemValues = new StackTester[itemValueList.size()];
+		contraband = new StackTester[itemValueList.size() + contrabandList.size()];
 		
 		
-		for(int i = 0; i < contrabandMapList.size(); i++){
-			contraband[i] = ItemStack.deserialize((Map<String, Object>) contrabandMapList.get(i));
+		for(int i = 0; i < contrabandList.size(); i++){
+			contraband[i] = toStackTester(contrabandList.get(i));
 		}
-		for(int i = 0; i < itemValueMapList.size(); i++){
-			ItemStack stack = ItemStack.deserialize((Map<String, Object>) itemValueMapList.get(i));
-			itemValues[i] = stack;
-			contraband[contrabandMapList.size() + i] = stack;
+		for(int i = 0; i < itemValueList.size(); i++){
+			StackTester tester = toStackTester(itemValueList.get(i));
+			itemValues[i] = tester;
+			contraband[contrabandList.size() + i] = tester;
 		}
 		
 		
 	}
+	private static StackTester toStackTester(Object input){
+		try{
+			if(input instanceof String){
+				return new StackTester((String) input);
+			}else if(input instanceof Map){
+				return new StackTester((Map<String, Object>) input);
+			}
+		}catch(InvalidConfigurationException ex){
+			ex.printStackTrace();
+		}
+		return null;
+	}
 }

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

@@ -34,6 +34,8 @@ public class Messages{
 	public static String chestCreateSuccess;
 	public static String chestRemoveSuccess;
 	
+	public static String helpAbba;
+	
 	public static String helpJoin;
 	public static String helpLeave;
 	public static String helpInfo;
@@ -105,6 +107,8 @@ public class Messages{
 		chestCreateSuccess = load("chest.create");
 		chestRemoveSuccess = load("chest.remove");
 		
+		helpAbba = load("help.abba");
+		
 		helpJoin = load("help.join");
 		helpLeave = load("help.leave");
 		helpInfo = load("help.info");

+ 5 - 2
src/me/lennartVH01/game/AbbaGame.java

@@ -3,6 +3,9 @@ package me.lennartVH01.game;
 import java.util.List;
 
 
+
+import net.minecraft.server.v1_9_R1.IChatBaseComponent;
+
 import org.bukkit.Location;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
@@ -32,6 +35,7 @@ public interface AbbaGame{
 	public int getTimeLeft();
 	
 	public void broadcast(String message);
+	public void broadcast(IChatBaseComponent message);
 	public void tpAll(Location loc);
 	
 	public boolean start(CommandSender sender);
@@ -45,8 +49,7 @@ public interface AbbaGame{
 		COUNTDOWN,
 		RUNNING, 
 		PAUSED, 
-		FINISHED,
-		CONCLUDED
+		FINISHED
 		
 	}
 	

+ 15 - 11
src/me/lennartVH01/game/BasicAbbaGame.java

@@ -41,7 +41,7 @@ public class BasicAbbaGame implements AbbaGame{
 	
 	
 	private ContrabandScanner scanner;
-	private ItemStack[] itemValues;
+	private StackTester[] itemValues;
 	
 	private List<Player> players;
 	
@@ -50,7 +50,7 @@ public class BasicAbbaGame implements AbbaGame{
 	private Score timerScore = objective.getScore(TIMER_SCORE_NAME);
 	
 	
-	public BasicAbbaGame(JavaPlugin plugin, String name, Location spawn, int duration, int playerCap, ContrabandScanner scanner, ItemStack[] itemValues){
+	public BasicAbbaGame(JavaPlugin plugin, String name, Location spawn, int duration, int playerCap, ContrabandScanner scanner, StackTester[] itemValues){
 		clock = new Clock(plugin);
 		this.name = name;
 		this.spawn = spawn;
@@ -119,11 +119,16 @@ public class BasicAbbaGame implements AbbaGame{
 				totalItems[i] += score.count[i];
 			}
 		}
-		StringBuilder msgBuilder = new StringBuilder();
+		StringBuilder msgBuilder = new StringBuilder("[");
 		for(int i = 0; i < itemValues.length; i++){
-			msgBuilder.append(ChatUtil.getName(itemValues[i]) + ": " + totalItems[i]);
+			if(totalItems[i] > 0)
+				msgBuilder.append("{\"translate\":\"" + ChatUtil.getName(itemValues[i].asItemStack()) + "\"},\": " + totalItems[i] + "\n\",");
+		}
+		if(msgBuilder.length() > 1){
+			msgBuilder.replace(msgBuilder.length() - 3, msgBuilder.length() - 1, "\"]");
+			broadcast(ChatUtil.fromRawJSON(msgBuilder.toString()));
+			
 		}
-		
 		
 		
 		for(int i = 0; i < scores.size(); i++){
@@ -251,7 +256,6 @@ public class BasicAbbaGame implements AbbaGame{
 			sender.sendMessage(Messages.commandStartErrorRunning);
 			return false;
 		case FINISHED:
-		case CONCLUDED:
 			sender.sendMessage(Messages.commandStartErrorFinished);
 			return false;
 		default:
@@ -287,19 +291,18 @@ public class BasicAbbaGame implements AbbaGame{
 			AbbaScore score = new AbbaScore(p, itemValues.length);
 			
 			
-			for(Iterator<ItemStack> iter = p.getInventory().iterator(); iter.hasNext();){
-				ItemStack stack = iter.next();
+			for(ItemStack stack: p.getInventory()){
 				for(int i = 0; i < itemValues.length; i++){
 					if(itemValues[i].isSimilar(stack)){
 						score.count[i] += stack.getAmount();
 						break;
 					}
 				}
-				scores.add(score);
 			}
+			scores.add(score);
 			
 			for(int i = 0; i < itemValues.length; i++){
-				score.total += itemValues[i].getAmount() * score.count[i];
+				score.total += itemValues[i].getValue() * score.count[i];
 				totalItems[i] += score.count[i];
 			}
 		}
@@ -327,10 +330,11 @@ public class BasicAbbaGame implements AbbaGame{
 	@Override public String getName(){return name;}
 	@Override public Location getSpawn(){return spawn;}
 	@Override public int getDuration(){return duration;}
-	@Override public void setTimeLeft(int timeLeft){if(state == GameState.WAITING)this.duration = timeLeft; else this.timeLeft = timeLeft;}
+	@Override public void setTimeLeft(int timeLeft){if(state == GameState.WAITING) this.duration = timeLeft; else this.timeLeft = timeLeft;}
 	@Override public int getTimeLeft(){return timeLeft;}
 	
 	@Override public void broadcast(final String message){for(Player p:players) p.sendMessage(message);}
+	@Override public void broadcast(final IChatBaseComponent message){for(Player p:players) ChatUtil.send(p, message);}
 	@Override public void tpAll(final Location loc){for(Player p:players) p.teleport(loc);}
 	
 	private static class Clock{

+ 6 - 6
src/me/lennartVH01/game/ContrabandScanner.java

@@ -11,19 +11,19 @@ import org.bukkit.inventory.Inventory;
 import org.bukkit.inventory.ItemStack;
 
 public class ContrabandScanner{
-	private ItemStack[] illegalItems;
+	private StackTester[] illegalItems;
 	
 	
 	
-	public ContrabandScanner(ItemStack[] illegalItems){
+	public ContrabandScanner(StackTester[] illegalItems){
 		this.illegalItems = illegalItems;
 	}
 	
 	public List<ItemStack> getContraband(Inventory inv){
 		List<ItemStack> totalContraband = new ArrayList<ItemStack>();
-		for(ItemStack detectionStack:illegalItems){
+		for(StackTester tester:illegalItems){
 			for(ItemStack stack:inv){
-				if(detectionStack.isSimilar(stack)){
+				if(tester.isSimilar(stack)){
 					totalContraband.add(stack);
 					break;
 				}
@@ -33,9 +33,9 @@ public class ContrabandScanner{
 	}
 	
 	public boolean hasContraband(Inventory inv){
-		for(ItemStack detectionStack:illegalItems){
+		for(StackTester tester:illegalItems){
 			for(ItemStack stack:inv){
-				if(detectionStack.isSimilar(stack)){
+				if(tester.isSimilar(stack)){
 					return true;
 				}
 			}

+ 0 - 2
src/me/lennartVH01/game/GameManager.java

@@ -9,8 +9,6 @@ import java.util.UUID;
 import org.bukkit.entity.Player;
 import org.bukkit.event.Listener;
 
-import me.lennartVH01.Messages;
-
 public class GameManager implements Listener{
 	private GameManager(){} //private constructor, singleton
 	private static List<AbbaGame> games = new ArrayList<AbbaGame>();

+ 84 - 0
src/me/lennartVH01/game/StackTester.java

@@ -0,0 +1,84 @@
+package me.lennartVH01.game;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Predicate;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.bukkit.Material;
+import org.bukkit.configuration.InvalidConfigurationException;
+import org.bukkit.inventory.ItemStack;
+
+
+public class StackTester{
+	private static final Pattern testableStackPattern = Pattern.compile("^(\\w+)(?:\\((\\d+)\\))?(?:=(\\d+))?$"); // material_name(damage)=amount
+	
+	private final List<Predicate<ItemStack>> tests = new ArrayList<Predicate<ItemStack>>();
+	private final int value;
+	private final ItemStack stack;
+	
+	public StackTester(String input) throws InvalidConfigurationException{
+		Matcher matcher = testableStackPattern.matcher(input);
+		if(matcher.matches()){
+			
+			//type will always be defined, as per definition
+			final Material type = Material.getMaterial(matcher.group(1));
+			tests.add((stack) -> type == stack.getType());
+			
+			stack = new ItemStack(type);
+			
+			if(matcher.group(2) != null && !matcher.group(2).isEmpty()){
+				final short damage = Short.parseShort(matcher.group(2));
+				tests.add((stack) -> damage == stack.getDurability());
+				stack.setDurability(damage);
+			}
+			if(matcher.group(3) != null && !matcher.group(3).isEmpty()){
+				value = Integer.parseInt(matcher.group(3));
+			}else{
+				value = 0;
+			}
+		}else{
+			throw new InvalidConfigurationException();
+		}
+	}
+	public StackTester(Map<String, Object> input){
+		Object value;
+		
+		value = input.get("type");
+		if(value != null && value instanceof String){
+			final Material type = Material.getMaterial((String) value);
+			tests.add((stack) -> type == stack.getType());
+		}
+		
+		value = input.get("damage");
+		if(value != null && value instanceof Number){
+			final short damage = ((Number) value).shortValue();
+			tests.add((stack) -> damage == stack.getDurability());
+		}
+		
+		//TODO Other item tags here
+		
+		
+		value = input.get("value");
+		if(value != null && value instanceof Number){
+			this.value = (int) value;
+		}else{
+			this.value = 0;
+		}
+		
+		stack = ItemStack.deserialize(input);
+	}
+	public boolean isSimilar(ItemStack stack){
+		if(stack == null)
+			return false;
+		for(Predicate<ItemStack> test:tests){
+			if(!test.test(stack))
+				return false;
+		}
+		return true;
+	}
+	public int getValue(){return value;}
+	public ItemStack asItemStack(){return stack;}
+}

+ 0 - 105
src/me/lennartVH01/game/TesterStackFactory.java

@@ -1,105 +0,0 @@
-package me.lennartVH01.game;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.bukkit.Material;
-import org.bukkit.inventory.ItemStack;
-
-
-public class TesterStackFactory{
-	/*private static final Pattern testableStackPattern = Pattern.compile("(\\w+)\\((\\d+)\\)"); // material_name(damage): amount
-	
-	public static StackTestable[] deserialize(List<Object> inputList){
-		StackTestable[] testStacks = new StackTestable[inputList.size()];
-		
-		for(int i = 0; i < inputList.size(); i++){
-			Object entry = inputList.get(i);
-
-			String name;
-			Object data = null;
-			if(entry instanceof String){
-				testStacks[i] = new MaterialTestStack(Material.getMaterial((String) entry));
-				continue;
-			}else if(entry instanceof Map){
-				if(((Map) entry).size() == 1){
-					Map.Entry itemEntry = (Map.Entry) ((Map) entry).entrySet().iterator().next();
-					name = (String) itemEntry.getKey();
-					data = itemEntry.getValue();
-				}else{
-					continue;
-				}
-			}else{
-				continue;
-			}
-			
-			
-			short damage = -1;
-			int amount = -1;
-			Matcher match = testableStackPattern.matcher(name);
-			Material material = Material.getMaterial(match.group(1));
-			if(match.group(2) != null){
-				damage = Short.parseShort(match.group(2));
-			}
-			if(data == null || data instanceof Integer){
-				amount = (Integer) data;
-			}else if(data instanceof Map){
-				
-			}
-		}
-	}
-	
-	
-	private interface StackTestable{
-		public boolean compare(ItemStack testStack);
-		public ItemStack asItemStack();
-	}
-	private static class MaterialTestStack implements StackTestable{
-		private final Material material;
-		private final ItemStack stack;
-		public MaterialTestStack(Material material){
-			this(material, 0);
-		}
-		public MaterialTestStack(Material material, int amount){
-			this.material = material;
-			this.stack = new ItemStack(material, amount);
-		}
-		
-		@Override public boolean compare(ItemStack testStack){
-			return material == testStack.getType();
-		}
-		@Override public ItemStack asItemStack(){return stack;}
-	}
-	private static class MaterialDamageTestStack implements StackTestable{
-		private final Material material;
-		private final short damage;
-		private final ItemStack stack;
-		public MaterialDamageTestStack(Material material, short damage){
-			this(material, damage, 0);
-		}
-		public MaterialDamageTestStack(Material material, short damage, int amount){
-			this.material = material;
-			this.damage = damage;
-			this.stack = new ItemStack(material, amount, damage);
-		}
-		
-		@Override public boolean compare(ItemStack testStack){
-			return material == testStack.getType() && testStack.getDurability() == damage;
-		}
-		@Override public ItemStack asItemStack(){return stack;}
-	}
-	private static class ItemStackTestStack implements StackTestable{
-		private final ItemStack stack;
-		public ItemStackTestStack(ItemStack testStack){
-			this.stack = testStack;
-		}
-		
-		@Override public boolean compare(ItemStack testStack){
-			return stack.isSimilar(testStack);
-		}
-		@Override public ItemStack asItemStack(){return stack;}
-	}*/
-}