2
0
Эх сурвалжийг харах

Moved from lots of booleans to a GameState enum for AbbaGame

lennartVH01 9 жил өмнө
parent
commit
21d0ba28ae

+ 3 - 0
config.yml

@@ -3,6 +3,9 @@
 # Game duration in seconds
 GameDuration: 1800
 
+# Countdown in seconds
+CountdownTime: 5
+
 # Times in game to notify players of the time left in seconds
 # Example: a NotifyTime of 120 will let all players know when there are 2 minutes left
 NotifyTimes:

+ 135 - 46
src/me/lennartVH01/AbbaGame.java

@@ -10,8 +10,14 @@ import java.util.UUID;
 
 import org.bukkit.Bukkit;
 import org.bukkit.Location;
+import org.bukkit.Material;
+import org.bukkit.block.Block;
 import org.bukkit.block.Chest;
+import org.bukkit.block.Sign;
 import org.bukkit.entity.Player;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.InventoryHolder;
+import org.bukkit.material.TrapDoor;
 import org.bukkit.scoreboard.DisplaySlot;
 import org.bukkit.scoreboard.Objective;
 import org.bukkit.scoreboard.Score;
@@ -19,30 +25,113 @@ import org.bukkit.scoreboard.Scoreboard;
 
 
 public class AbbaGame {
-	
+	private Main plugin;
+	public int taskId;
 	public boolean open = false;
-	public boolean running = false;
-	public boolean ended = true;
+	public GameState state = GameState.WAITING;
 	public String name;
 	public Location spawn;
 	public long endTime;
 	public int duration;
+	public int countDownTime;
 	public int playerCap;
 	public List<Player> players;
-	public List<Chest> chests;
 	public Map<UUID, CalculatedScore> endStats = new HashMap<UUID, CalculatedScore>();
-	public Scoreboard sb;
+	public Map<UUID, Inventory> playerChests = new HashMap<UUID, Inventory>();
+	private Scoreboard scoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
+	private Objective abbaObjective = scoreboard.registerNewObjective("AbbaStats", "dummy");
+	private Score timer = abbaObjective.getScore("Time Remaining");
 	
-	public AbbaGame(String name, Location spawn, int duration, int playerCap){
+	public AbbaGame(Main plugin, String name, Location spawn, int duration, int playerCap, int countDownTime){
+		this.plugin = plugin;
 		this.name = name;
 		this.spawn = spawn;
 		this.duration = duration;
 		this.playerCap = playerCap;
+		this.countDownTime = countDownTime;
 		if(playerCap == -1){
 			players = new ArrayList<Player>();
 		}else{
 			players = new ArrayList<Player>(playerCap);
 		}
+		abbaObjective.setDisplaySlot(DisplaySlot.SIDEBAR);
+	}
+	
+	public void start() {
+		// TODO Add stuff like tp people to cave if neccecary
+		endTime = System.currentTimeMillis() + 1000 * countDownTime;
+		state = GameState.COUNTDOWN;
+		
+		for(Player p:players){
+			p.sendMessage("§cGame starting!");
+		}
+		
+		startClock(20);
+	}
+	
+	
+	private void startClock(long delay){
+		taskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() {
+			
+			@Override
+			public void run() {
+				switch(state){
+				case COUNTDOWN:
+					if(endTime - System.currentTimeMillis() <= 0){
+						state = GameState.RUNNING;
+						endTime = System.currentTimeMillis() + duration * 1000;
+						timer.setScore(duration);
+						
+						for(Player p:players){
+							p.sendMessage("§cGOGOGO!");
+							p.setScoreboard(scoreboard);
+						}
+						//do stuff when countdown is finished here
+						
+					}else{
+						String message = "§c" + (endTime - System.currentTimeMillis())/1000;
+						for(Player p:players){
+							p.sendMessage(message);
+						}
+					}
+					
+					
+					
+					break;
+				case RUNNING:
+					int timeRemaining = (int) (endTime - System.currentTimeMillis())/1000;
+					if(timeRemaining > 0){
+						timer.setScore(timeRemaining);
+					}else{
+						//end game
+						stopClock();
+						state = GameState.FINISHED;
+						scoreboard.resetScores("Time Remaining");
+						
+						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);
+						}
+						
+					}
+					
+					break;
+				default:
+					break;
+				
+				}
+				
+			}
+		}, delay, 20);
+	}
+	private void stopClock(){
+		Bukkit.getScheduler().cancelTask(taskId);
 	}
 	
 	public void open(){
@@ -51,6 +140,32 @@ public class AbbaGame {
 	public void close(){
 		open = false;
 	}
+	public void claimChest(Player p, Sign sign){
+		if(playerChests.containsKey(p.getUniqueId())){
+			p.sendMessage("§cYou already have a chest!");
+			return;
+		}
+		Block blockBelowSign = spawn.getWorld().getBlockAt(sign.getX(), sign.getY() - 1, sign.getZ());
+		if(blockBelowSign instanceof InventoryHolder){
+			InventoryHolder chest = (InventoryHolder) blockBelowSign;
+			
+			
+			
+			if(playerChests.containsValue(chest.getInventory())){
+				p.sendMessage("§cThis chest is already claimed!");
+				return;
+			}else{
+				playerChests.put(p.getUniqueId(), chest.getInventory());
+				sign.setLine(2, p.getName());
+				
+			}
+			
+		}
+		
+	}
+	
+	
+	
 	public boolean isOpen(){
 		return open;
 	}
@@ -74,55 +189,22 @@ public class AbbaGame {
 		players.add(p);
 		
 	}
-	public void addChest(Chest c){
-		chests.add(c);
-	}
-	public List<Chest> getChests(){
-		return chests;
-	}
 	public void leave(Player p) {
 		players.remove(p);
+		playerChests.remove(p.getUniqueId());
 	}
-	public void onSecond(){
-		
-	}
+	
 
-	public boolean isRunning() {
-		return running;
+	public GameState getState(){
+		return state;
 	}
 
 	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;
 		
@@ -132,5 +214,12 @@ public class AbbaGame {
 		endTime = newEndTime;
 		
 	}
+
+	public Map<UUID, Inventory> getPlayerChests() {
+		return playerChests;
+		
+	}
+	
+	
 	
 }

+ 8 - 3
src/me/lennartVH01/AbbaTools.java

@@ -4,6 +4,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.bukkit.Location;
+import org.bukkit.configuration.file.FileConfiguration;
 import org.bukkit.entity.Player;
 import org.bukkit.inventory.Inventory;
 import org.bukkit.inventory.ItemStack;
@@ -11,18 +12,22 @@ import org.bukkit.inventory.ItemStack;
 
 
 public class AbbaTools {
+	public static Main plugin;
 	public static List<ValueItemPair> itemPairs;
 	public static List<AbbaGame> games = new ArrayList<AbbaGame>();
 	
-	public static void initialize(List<ValueItemPair> valueItemPairs) {
+	
+	public static void initialize(Main plugin, List<ValueItemPair> valueItemPairs) {
+		AbbaTools.plugin = plugin;
 		itemPairs = valueItemPairs;
 		
 	}
 	
 	
 	
-	public static void create(String name, Location spawn, int duration, int playerCap){
-		AbbaGame game = new AbbaGame(name, spawn, duration, playerCap);
+	public static void create(String name, Location spawn){
+		FileConfiguration config = plugin.getConfig();
+		AbbaGame game = new AbbaGame(plugin, name, spawn, config.getInt("GameDuration"), config.getInt("PlayerCap"), config.getInt("CountdownTime"));
 		games.add(game);
 	}
 	public static boolean removeAbbaGame(String name){

+ 14 - 2
src/me/lennartVH01/EventListener.java

@@ -1,12 +1,19 @@
 package me.lennartVH01;
 
+import java.util.UUID;
+
 import org.bukkit.Material;
 import org.bukkit.block.Chest;
+import org.bukkit.entity.Player;
+import org.bukkit.event.Cancellable;
 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.inventory.InventoryEvent;
+import org.bukkit.event.inventory.InventoryInteractEvent;
+import org.bukkit.event.inventory.InventoryOpenEvent;
 import org.bukkit.event.player.PlayerQuitEvent;
 
 public class EventListener implements Listener{
@@ -23,9 +30,14 @@ public class EventListener implements Listener{
 		}
 	}
 	
-	//Don't use doublechests, they kinda break stuff
 	@EventHandler
-	public void onChestRemove(BlockBreakEvent e){
+	public void onInventoryEdit(InventoryInteractEvent e){
+		UUID p = e.getView().getPlayer().getUniqueId();
+		if(!plugin.playerMap.get(p).getPlayerChests().get(p).equals(e.getInventory())){
+			((Cancellable) e).setCancelled(true);
+		}
+	}
+	public void onChestOpen(InventoryOpenEvent e){
 		
 	}
 }

+ 9 - 0
src/me/lennartVH01/GameState.java

@@ -0,0 +1,9 @@
+package me.lennartVH01;
+
+public enum GameState {
+	WAITING, 
+	COUNTDOWN,
+	RUNNING, 
+	PAUSED, 
+	FINISHED
+}

+ 24 - 38
src/me/lennartVH01/Main.java

@@ -22,15 +22,7 @@ import org.bukkit.scheduler.BukkitRunnable;
 
 public class Main extends JavaPlugin{
 	
-	/*public static void main(String[] args){
-		ItemStack test = new ItemStack(Material.STONE);
-		
-		
-		
-		
-		System.out.println(test.serialize());
-		
-	}*/
+	
 	
 	
 	
@@ -38,7 +30,7 @@ public class Main extends JavaPlugin{
 	
 	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 String[] abbaSubCommands = new String[]{"calc", "close", "config", "create", "info", "join", "leave", "list", "open", "reload", "remove", "start"};
 	
 	
 	public FileConfiguration config = this.getConfig();
@@ -52,18 +44,6 @@ public class Main extends JavaPlugin{
 		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
@@ -89,7 +69,7 @@ public class Main extends JavaPlugin{
 			valueItemPairs.add(new ValueItemPair(stack, value));
 		}
 		
-		AbbaTools.initialize(valueItemPairs);
+		AbbaTools.initialize(this, valueItemPairs);
 		
 		
 	}
@@ -315,7 +295,7 @@ public class Main extends JavaPlugin{
 						gameName += "_";
 					}
 					//create game
-					AbbaTools.create(gameName, gameSpawn, config.getInt("GameDuration"), config.getInt("PlayerCap"));
+					AbbaTools.create(gameName, gameSpawn);
 					sender.sendMessage("Successfully created game \"" + gameName + "\"");
 					return true;
 					
@@ -429,13 +409,18 @@ public class Main extends JavaPlugin{
 							return false;
 						}
 					}
-					if(game.isRunning()){
-						sender.sendMessage("§cGame already running!");
-						return false;
-					}else{
+					switch(game.getState()){
+					case WAITING:
 						game.start();
-						sender.sendMessage("Game started, " + game.duration + " seconds left!");
 						return true;
+					case PAUSED:
+						break;
+					case COUNTDOWN:  //countdown and running both do the same
+					case RUNNING:
+						sender.sendMessage("§cGame already running!");
+						return false;
+					case FINISHED:
+						break;
 					}
 					
 				}else{
@@ -469,9 +454,8 @@ public class Main extends JavaPlugin{
 										sender.sendMessage("§cPlease specify a stricktly positive number");
 										return false;
 									}
-									if(game.isRunning()){
+									if(game.getState() == GameState.RUNNING || game.getState() == GameState.PAUSED){
 										game.setEndTime(System.currentTimeMillis() + newTime * 1000);
-										
 									}else{
 										game.setDuration(newTime);
 									}
@@ -515,20 +499,22 @@ public class Main extends JavaPlugin{
 	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){
+			switch(args.length){
+			case 1:
 				for(String s:abbaSubCommands){
-					if(sender.hasPermission("AbbaCaving." + s)){
+					if(sender.hasPermission("AbbaCaving." + s) && s.startsWith(args[0])){
 						cmds.add(s);
 					}
 				}
-			}else if(args.length == 1){
-				for(String s:abbaSubCommands){
-					if(sender.hasPermission("AbbaCaving." + s) && s.startsWith(args[0])){
-						cmds.add(s);
+				break;
+			case 2:
+				for(AbbaGame game:AbbaTools.getGames()){
+					if(game.getName().startsWith(args[1])){
+						cmds.add(game.getName());
 					}
 				}
-			}else{
 			}
+			
 		}
 		return cmds;
 	}