|
@@ -28,13 +28,13 @@ public class AbbaGame implements ConfigurationSerializable{
|
|
|
|
|
|
@Override
|
|
|
public int compare(Tuple2<UUID, CalculatedScore> arg0, Tuple2<UUID, CalculatedScore> arg1) {
|
|
|
- return arg0.getArg2().getTotal() - arg1.getArg2().getTotal();
|
|
|
+ return arg1.getArg2().getTotal() - arg0.getArg2().getTotal();
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
- private Main plugin;
|
|
|
+ private static Main plugin;
|
|
|
public int taskId;
|
|
|
public boolean open = false;
|
|
|
public GameState state = GameState.WAITING;
|
|
@@ -42,11 +42,11 @@ public class AbbaGame implements ConfigurationSerializable{
|
|
|
public Location spawn;
|
|
|
public long endTime;
|
|
|
public int duration;
|
|
|
- public int countDownTime;
|
|
|
public int playerCap;
|
|
|
- public List<Player> players;
|
|
|
+ public List<UUID> players;
|
|
|
public List<Tuple2<UUID, CalculatedScore>> endStats = new ArrayList<Tuple2<UUID, CalculatedScore>>();
|
|
|
public Map<UUID, Chest> playerChests = new HashMap<UUID, Chest>();
|
|
|
+ public Map<UUID, List<ItemStack>> leftovers = new HashMap<UUID, List<ItemStack>>();
|
|
|
public List<ItemStack> collectedItems = new ArrayList<ItemStack>();
|
|
|
public List<Chest> chests = new ArrayList<Chest>();
|
|
|
public List<Sign> signs = new ArrayList<Sign>();
|
|
@@ -54,18 +54,18 @@ public class AbbaGame implements ConfigurationSerializable{
|
|
|
private Objective abbaObjective = scoreboard.registerNewObjective("AbbaStats", "dummy");
|
|
|
private Score timer = abbaObjective.getScore("Time Remaining");
|
|
|
|
|
|
-
|
|
|
- public AbbaGame(Main plugin, String name, Location spawn, int duration, int playerCap, int countDownTime){
|
|
|
- this.plugin = plugin;
|
|
|
+ public static void initialize(Main plugin){
|
|
|
+ AbbaGame.plugin = plugin;
|
|
|
+ }
|
|
|
+ public AbbaGame(String name, Location spawn, int duration, int playerCap){
|
|
|
this.name = name;
|
|
|
this.spawn = spawn;
|
|
|
this.duration = duration;
|
|
|
this.playerCap = playerCap;
|
|
|
- this.countDownTime = countDownTime;
|
|
|
if(playerCap == -1){
|
|
|
- players = new ArrayList<Player>();
|
|
|
+ players = new ArrayList<UUID>();
|
|
|
}else{
|
|
|
- players = new ArrayList<Player>(playerCap);
|
|
|
+ players = new ArrayList<UUID>(playerCap);
|
|
|
}
|
|
|
abbaObjective.setDisplaySlot(DisplaySlot.SIDEBAR);
|
|
|
|
|
@@ -75,6 +75,8 @@ public class AbbaGame implements ConfigurationSerializable{
|
|
|
collectedItems.add(stack);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
public void destroy(){
|
|
|
for(Sign s:signs){
|
|
|
s.setLine(0, "");
|
|
@@ -82,28 +84,28 @@ public class AbbaGame implements ConfigurationSerializable{
|
|
|
//s.setLine(2, "");
|
|
|
s.update();
|
|
|
}
|
|
|
- for(Player p:players){
|
|
|
- plugin.playerMap.remove(p.getUniqueId());
|
|
|
- p.sendMessage("§cGame ended!");
|
|
|
-
|
|
|
+ for(int i = players.size() - 1; i >= 0; i--){ //loop array backwards for speed
|
|
|
+ removePlayer(players.get(i));
|
|
|
//probably tp people to spawn or something
|
|
|
|
|
|
}
|
|
|
+ stopClock();
|
|
|
}
|
|
|
|
|
|
public void start() {
|
|
|
// TODO Add stuff like tp people to cave if neccecary
|
|
|
if(state == GameState.WAITING){
|
|
|
- endTime = System.currentTimeMillis() + 1000 * countDownTime;
|
|
|
+ endTime = System.currentTimeMillis() + 5000;
|
|
|
state = GameState.COUNTDOWN;
|
|
|
- for(Player p:players){
|
|
|
+ for(UUID id:players){
|
|
|
+ Player p = plugin.getServer().getPlayer(id);
|
|
|
p.sendMessage("§cGame starting!");
|
|
|
}
|
|
|
}else if(state == GameState.PAUSED){
|
|
|
endTime = System.currentTimeMillis() + 1000 * duration;
|
|
|
state = GameState.RUNNING;
|
|
|
- for(Player p:players){
|
|
|
- p.sendMessage("§cGame continuing!");
|
|
|
+ for(UUID id:players){
|
|
|
+ plugin.getServer().getPlayer(id).sendMessage("§cGame continuing!");
|
|
|
}
|
|
|
startClock(0);
|
|
|
}
|
|
@@ -127,12 +129,13 @@ public class AbbaGame implements ConfigurationSerializable{
|
|
|
public void run() {
|
|
|
switch(state){
|
|
|
case COUNTDOWN:
|
|
|
- if(endTime - System.currentTimeMillis() <= 0){
|
|
|
+ if((endTime - System.currentTimeMillis())/1000 <= 0){
|
|
|
state = GameState.RUNNING;
|
|
|
endTime = System.currentTimeMillis() + duration * 1000;
|
|
|
timer.setScore(duration);
|
|
|
|
|
|
- for(Player p:players){
|
|
|
+ for(UUID id:players){
|
|
|
+ Player p = plugin.getServer().getPlayer(id);
|
|
|
p.sendMessage("§cGOGOGO!");
|
|
|
p.setScoreboard(scoreboard);
|
|
|
}
|
|
@@ -140,8 +143,8 @@ public class AbbaGame implements ConfigurationSerializable{
|
|
|
|
|
|
}else{
|
|
|
String message = "§c" + (endTime - System.currentTimeMillis())/1000;
|
|
|
- for(Player p:players){
|
|
|
- p.sendMessage(message);
|
|
|
+ for(UUID id:players){
|
|
|
+ plugin.getServer().getPlayer(id).sendMessage(message);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -158,7 +161,8 @@ public class AbbaGame implements ConfigurationSerializable{
|
|
|
state = GameState.FINISHED;
|
|
|
scoreboard.resetScores("Time Remaining");
|
|
|
|
|
|
- for(Player p:players){
|
|
|
+ for(UUID id:players){
|
|
|
+ Player p = plugin.getServer().getPlayer(id);
|
|
|
p.sendMessage("Game ended!");
|
|
|
p.teleport(spawn);
|
|
|
|
|
@@ -210,18 +214,48 @@ public class AbbaGame implements ConfigurationSerializable{
|
|
|
|
|
|
List<Integer> LeaderBoardWeights = plugin.getConfig().getIntegerList("WinWeights.Top");
|
|
|
int AllPlayerWeight = plugin.getConfig().getInt("WinWeights.All");
|
|
|
- int total = AllPlayerWeight;
|
|
|
- for(int weight:LeaderBoardWeights){
|
|
|
- total += weight;
|
|
|
+ int totalWeight = 0;
|
|
|
+ for(int i = 0; i < Math.min(LeaderBoardWeights.size(), playerChests.size()); i++){
|
|
|
+ totalWeight += LeaderBoardWeights.get(i);
|
|
|
+ }
|
|
|
+ if(playerChests.size() > LeaderBoardWeights.size()){
|
|
|
+ totalWeight += (playerChests.size() - LeaderBoardWeights.size()) * AllPlayerWeight;
|
|
|
}
|
|
|
|
|
|
- for(int i = 0; i < LeaderBoardWeights.size(); i++){
|
|
|
- Inventory chestInv = playerChests.get(endStats.get(0).arg1).getInventory();
|
|
|
+ for(int i = 0; i < Math.min(LeaderBoardWeights.size(), playerChests.size()); i++){
|
|
|
+ Inventory chestInv = playerChests.get(endStats.get(i).arg1).getInventory();
|
|
|
+ List<ItemStack> leftoverList = new ArrayList<ItemStack>();
|
|
|
+ leftovers.put(endStats.get(i).arg1, leftoverList);
|
|
|
for(ItemStack stack: collectedItems){
|
|
|
+ ItemStack newStack = stack.clone();
|
|
|
+ newStack.setAmount((int) Math.ceil(stack.getAmount() * LeaderBoardWeights.get(i) / totalWeight));
|
|
|
+ stack.setAmount(stack.getAmount() - newStack.getAmount());
|
|
|
+
|
|
|
+ if(newStack.getAmount() != 0){
|
|
|
+ leftoverList.addAll(chestInv.addItem(newStack).values());
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
|
|
|
}
|
|
|
+ totalWeight -= LeaderBoardWeights.get(i);
|
|
|
|
|
|
-
|
|
|
+ }
|
|
|
+ for(int i = LeaderBoardWeights.size(); i < playerChests.size(); i++){
|
|
|
+ Inventory chestInv = playerChests.get(endStats.get(i).arg1).getInventory();
|
|
|
+ List<ItemStack> leftoverList = new ArrayList<ItemStack>();
|
|
|
+ leftovers.put(endStats.get(i).arg1, leftoverList);
|
|
|
+ for(ItemStack stack: collectedItems){
|
|
|
+ int newAmount = (int) (stack.getAmount() / (playerChests.size() - LeaderBoardWeights.size()));
|
|
|
+ int left = stack.getAmount() % (playerChests.size() - LeaderBoardWeights.size());
|
|
|
+ if(i - LeaderBoardWeights.size() < left){
|
|
|
+ newAmount++;
|
|
|
+ }
|
|
|
+ ItemStack newStack = stack.clone();
|
|
|
+ newStack.setAmount(newAmount);
|
|
|
+
|
|
|
+ leftoverList.addAll(chestInv.addItem(newStack).values());
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -267,9 +301,20 @@ public class AbbaGame implements ConfigurationSerializable{
|
|
|
public Location getSpawn(){
|
|
|
return spawn;
|
|
|
}
|
|
|
-
|
|
|
- public void addPlayer(Player p) {
|
|
|
- players.add(p);
|
|
|
+ public JoinResult addPlayer(Player p){
|
|
|
+ if(!Permission.hasPermission(p, Permission.JOIN_FULL) && players.size() >= playerCap){
|
|
|
+ return JoinResult.FAIL_FULL;
|
|
|
+ }
|
|
|
+ if(players.size() >= chests.size()){
|
|
|
+ return JoinResult.FAIL_NOCHEST;
|
|
|
+ }
|
|
|
+ if(!open && !Permission.hasPermission(p, Permission.JOIN_CLOSED)){
|
|
|
+ return JoinResult.FAIL_CLOSED;
|
|
|
+ }
|
|
|
+ //TODO Add stuff here for whitelist aswell
|
|
|
+
|
|
|
+
|
|
|
+ players.add(p.getUniqueId());
|
|
|
int index = playerChests.size();
|
|
|
Chest chest = chests.get(index);
|
|
|
Sign sign = signs.get(index);
|
|
@@ -277,13 +322,14 @@ public class AbbaGame implements ConfigurationSerializable{
|
|
|
sign.update();
|
|
|
playerChests.put(p.getUniqueId(), chest);
|
|
|
|
|
|
-
|
|
|
+ return JoinResult.SUCCESS;
|
|
|
}
|
|
|
- public void removePlayer(Player p) {
|
|
|
- players.remove(p);
|
|
|
+ public void removePlayer(UUID id) {
|
|
|
+ players.remove(id);
|
|
|
+ Player p = plugin.getServer().getPlayer(id);
|
|
|
+ p.setScoreboard(plugin.getServer().getScoreboardManager().getMainScoreboard());
|
|
|
int index = chests.indexOf(playerChests.remove(p.getUniqueId()));
|
|
|
- chests.remove(index);
|
|
|
- Sign sign = signs.remove(index);
|
|
|
+ Sign sign = signs.get(index);
|
|
|
sign.setLine(1, "");
|
|
|
sign.update();
|
|
|
}
|
|
@@ -309,20 +355,82 @@ public class AbbaGame implements ConfigurationSerializable{
|
|
|
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+ // ==SERIALIZATION==
|
|
|
|
|
|
//TODO Make dis serializable
|
|
|
|
|
|
@Override
|
|
|
public Map<String, Object> serialize() {
|
|
|
Map<String, Object> abbaMap = new HashMap<String, Object>();
|
|
|
- abbaMap.put("spawn", spawn);
|
|
|
+ abbaMap.put("Name", name);
|
|
|
+ abbaMap.put("Spawn", spawn);
|
|
|
+
|
|
|
+ abbaMap.put("Open", open);
|
|
|
+ switch(state){
|
|
|
+ case WAITING:
|
|
|
+ case COUNTDOWN:
|
|
|
+ abbaMap.put("State", "WAITING");
|
|
|
+ break;
|
|
|
+ case RUNNING:
|
|
|
+ case PAUSED:
|
|
|
+ abbaMap.put("State", "PAUSED");
|
|
|
+ break;
|
|
|
+ case FINISHED:
|
|
|
+ abbaMap.put("State", "FINISHED");
|
|
|
+ break;
|
|
|
+ case CONCLUDED:
|
|
|
+ abbaMap.put("State", "CONCLUDED");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ abbaMap.put("Duration", duration);
|
|
|
+ abbaMap.put("PlayerCap", playerCap);
|
|
|
|
|
|
|
|
|
return abbaMap;
|
|
|
}
|
|
|
- public AbbaGame deserialize(Map<String, Object> inputMap){
|
|
|
- return null;
|
|
|
+ public static AbbaGame deserialize(Map<String, Object> inputMap){
|
|
|
+ AbbaGame game = new AbbaGame((String) inputMap.get("Name"), (Location) inputMap.get("Spawn"), (int) inputMap.get("Duration"), (int) inputMap.get("PlayerCap"));
|
|
|
+
|
|
|
+ switch((String) inputMap.get("State")){
|
|
|
+
|
|
|
+ case "PAUSED":
|
|
|
+ game.state = GameState.PAUSED;
|
|
|
+ break;
|
|
|
+ case "FINISHED":
|
|
|
+ game.state = GameState.FINISHED;
|
|
|
+ break;
|
|
|
+ case "CONCLUDED":
|
|
|
+ game.state = GameState.CONCLUDED;
|
|
|
+ break;
|
|
|
+ default: // WAITING also refers back to this state
|
|
|
+ game.state = GameState.WAITING;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ return game;
|
|
|
+ }
|
|
|
+ public List<UUID> getPlayerIDs() {
|
|
|
+ return players;
|
|
|
}
|
|
|
|
|
|
+ public enum JoinResult{
|
|
|
+ SUCCESS,
|
|
|
+ FAIL_FULL,
|
|
|
+ FAIL_CLOSED,
|
|
|
+ FAIL_WHITELIST,
|
|
|
+ FAIL_NOCHEST,
|
|
|
+
|
|
|
+ }
|
|
|
+ public enum GameState {
|
|
|
+ WAITING,
|
|
|
+ COUNTDOWN,
|
|
|
+ RUNNING,
|
|
|
+ PAUSED,
|
|
|
+ FINISHED,
|
|
|
+ CONCLUDED
|
|
|
+
|
|
|
+ }
|
|
|
}
|