diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/FightSystem.java b/FightSystem_Main/src/de/steamwar/fightsystem/FightSystem.java index 4cb4aed..6944b43 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/FightSystem.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/FightSystem.java @@ -20,7 +20,10 @@ import org.bukkit.GameMode; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; public class FightSystem extends JavaPlugin { @@ -30,6 +33,7 @@ public class FightSystem extends JavaPlugin { private static FightState fightState = FightState.PRE_LEADER_SETUP; private static Map stateDependentFeatures = new HashMap<>(); private static int fightTime = 0; + private static Countdown mainCountdown; @Override public void onLoad() { @@ -41,6 +45,8 @@ public class FightSystem extends JavaPlugin { public void onEnable() { Fight.init(); KitManager.loadAllKits(); + TechHider.init(); + FightScoreboard.init(); new EntityDamageListener(); new EntityExplodeListener(); @@ -52,62 +58,10 @@ public class FightSystem extends JavaPlugin { new PlayerStateListener(); new ProjectileLaunchListener(); new InFightDamageListener(); - - if(!Config.test()){ - new FreezeWorldStateListener(); - TechHider.init(); - } - - FightScoreboard.init(); - - getCommand("leave").setExecutor(new LeaveCommand()); - getCommand("kit").setExecutor(new KitCommand()); - getCommand("remove").setExecutor(new RemoveCommand()); - getCommand("accept").setExecutor(new AcceptCommand()); - getCommand("decline").setExecutor(new DeclineCommand()); - getCommand("invite").setExecutor(new InviteCommand()); - getCommand("ready").setExecutor(new ReadyCommand()); - getCommand("ak").setExecutor(new AkCommand()); - getCommand("leader").setExecutor(new LeaderCommand()); - getCommand("lockschem").setExecutor(new LockschemCommand()); - - if(Config.event()) { - new EventJoinListener(); - - getCommand("invite").setExecutor(new EventDummyCommand()); - getCommand("ready").setExecutor(new EventDummyCommand()); - getCommand("ak").setExecutor(new EventDummyCommand()); - getCommand("leader").setExecutor(new EventDummyCommand()); - - new EventStartCountdown(); - }else if(Config.test()){ - new TestListener(); - - Bukkit.getScheduler().runTaskLater(this, Fight.getBlueTeam()::pasteDummy, 0); - Bukkit.getScheduler().runTaskLater(this, Fight.getRedTeam()::pasteDummy, 0); - - new NoPlayersOnlineCountdown(); - }else{ - new NormalJoinListener(); - - new NoPlayersOnlineCountdown(); - } - } - - public static void setPreRunningState() { - if(fightState != FightState.PRE_LEADER_SETUP) //TODO - return; - setFightState(FightState.PRE_RUNNING); - Countdown.cancelAllTimers(); - - loadKits(Fight.getBlueTeam()); - loadKits(Fight.getRedTeam()); - setAllPlayersGM(GameMode.SURVIVAL); - Bukkit.broadcastMessage(PREFIX + "§aDer Kampf beginnt!"); - - new PreRunningCountdown(); - - Fight.replaceSync(); + new FreezeWorldStateListener(); + new EventJoinListener(); + new TestListener(); + new NormalJoinListener(); new WinconditionAllDead(); new WinconditionCaptainDead(); @@ -116,35 +70,117 @@ public class FightSystem extends JavaPlugin { new WinconditionPercentSystem(); new WinconditionRelativePercent(); new WinconditionPoints(); + new WinconditionTimeout(); + new WinconditionHeartRatioTimeout(); + new WinconditionTechKO(); - if(Config.event()){ - new EventTeamOffWincondition(); + Objects.requireNonNull(getCommand("leave")).setExecutor(new LeaveCommand()); + Objects.requireNonNull(getCommand("kit")).setExecutor(new KitCommand()); + Objects.requireNonNull(getCommand("remove")).setExecutor(new RemoveCommand()); + Objects.requireNonNull(getCommand("accept")).setExecutor(new AcceptCommand()); + Objects.requireNonNull(getCommand("decline")).setExecutor(new DeclineCommand()); + Objects.requireNonNull(getCommand("invite")).setExecutor(new InviteCommand()); + Objects.requireNonNull(getCommand("ready")).setExecutor(new ReadyCommand()); + Objects.requireNonNull(getCommand("ak")).setExecutor(new AkCommand()); + Objects.requireNonNull(getCommand("leader")).setExecutor(new LeaderCommand()); + Objects.requireNonNull(getCommand("lockschem")).setExecutor(new LockschemCommand()); + + mainCountdown = new NoPlayersOnlineCountdown(); + + if(Config.event()) { + Objects.requireNonNull(getCommand("invite")).setExecutor(new EventDummyCommand()); + Objects.requireNonNull(getCommand("ready")).setExecutor(new EventDummyCommand()); + Objects.requireNonNull(getCommand("ak")).setExecutor(new EventDummyCommand()); + Objects.requireNonNull(getCommand("leader")).setExecutor(new EventDummyCommand()); + + setPreSchemState(); + }else if(Config.test()){ + Bukkit.getScheduler().runTaskLater(this, Fight.getBlueTeam()::pasteDummy, 0); + Bukkit.getScheduler().runTaskLater(this, Fight.getRedTeam()::pasteDummy, 0); + + setPreSchemState(); + setPostSchemState(); } } + public static void setPreSchemState() { + if(fightState != FightState.PRE_LEADER_SETUP) + throw new SecurityException(fightState.name()); + setFightState(FightState.PRE_SCHEM_SETUP); + + mainCountdown = new SetupOverCountdown(); + } + + public static void setPostSchemState() { + if(fightState != FightState.PRE_SCHEM_SETUP) + throw new SecurityException(fightState.name()); + setFightState(FightState.POST_SCHEM_SETUP); + + if(!Config.test()){ + TechHider.start(); + Fight.getBlueTeam().pasteSchematic(); + Fight.getRedTeam().pasteSchematic(); + } + + if(Config.event()) + mainCountdown = new EventStartCountdown(); + else if(Config.test()) + mainCountdown = null; + else + mainCountdown = new SetupOverCountdown(); + } + + public static void setPreRunningState() { + if(fightState != FightState.POST_SCHEM_SETUP) + throw new SecurityException(fightState.name()); + setFightState(FightState.PRE_RUNNING); + + loadKits(Fight.getBlueTeam()); + loadKits(Fight.getRedTeam()); + setAllPlayersGM(GameMode.SURVIVAL); + Bukkit.broadcastMessage(PREFIX + "§aDer Kampf beginnt!"); + + mainCountdown = new PreRunningCountdown(); + + Fight.replaceSync(); + + if(Config.event()) + new EventTeamOffWincondition(); + } + public static void setRunningState() { if(fightState != FightState.PRE_RUNNING) - return; + throw new SecurityException(fightState.name()); setFightState(FightState.RUNNING); - Countdown.cancelAllTimers(); - setAllPlayersGM(GameMode.SURVIVAL); - new WinconditionTimeout(); - new WinconditionHeartRatioTimeout(); - new WinconditionEntern(); - new WinconditionTechKO(); + if(Config.Entern) + new EnternCountdown(); WaterRemover.init(); - Bukkit.broadcastMessage(PREFIX + "§aArena freigegeben!"); } + public static void setEntern() { + if(fightState != FightState.RUNNING) + throw new SecurityException(fightState.name()); + setFightState(FightState.ENTERN); + + final List> chunksBlue = TechHider.prepareChunkReload(Fight.getBlueTeam().getPlayers().iterator().next().getPlayer()); + final List> chunksRed = TechHider.prepareChunkReload(Fight.getRedTeam().getPlayers().iterator().next().getPlayer()); + IFightSystem.setEntern(true); + for(FightPlayer player : Fight.getBlueTeam().getPlayers()){ + TechHider.reloadChunks(player.getPlayer(), chunksBlue); + } + for(FightPlayer player : Fight.getRedTeam().getPlayers()){ + TechHider.reloadChunks(player.getPlayer(), chunksRed); + } + } + public static void setSpectateState(FightTeam winFightTeam) { - if(fightState != FightState.RUNNING && fightState != FightState.PRE_RUNNING) - return; + if(!fightState.ingame()) + throw new SecurityException(fightState.name()); setFightState(FightState.SPECTATE); - Countdown.cancelAllTimers(); setAllPlayersGM(GameMode.SPECTATOR); Fight.getBlueTeam().teleportToSpawn(); @@ -176,18 +212,6 @@ public class FightSystem extends JavaPlugin { FightSystem.fightTime = fightTime; } - public static void setEntern(boolean entern) { - final List> chunksBlue = TechHider.prepareChunkReload(Fight.getBlueTeam().getPlayers().iterator().next().getPlayer()); - final List> chunksRed = TechHider.prepareChunkReload(Fight.getRedTeam().getPlayers().iterator().next().getPlayer()); - IFightSystem.setEntern(entern); - for(FightPlayer player : Fight.getBlueTeam().getPlayers()){ - TechHider.reloadChunks(player.getPlayer(), chunksBlue); - } - for(FightPlayer player : Fight.getRedTeam().getPlayers()){ - TechHider.reloadChunks(player.getPlayer(), chunksRed); - } - } - public static void setEventLeiter(Player el){ IFightSystem.setEventLeiter(el); } @@ -216,16 +240,17 @@ public class FightSystem extends JavaPlugin { return fightTime; } - public static boolean isEntern() { - return IFightSystem.isEntern(); - } - public static void shutdown(String reason){ IFightSystem.shutdown(reason); } public static void registerStateDependent(StateDependent stateDependent){ - stateDependentFeatures.put(stateDependent, false); + if(stateDependent.enabled().isEmpty()) + return; + boolean enabled = stateDependent.enabled().contains(fightState); + stateDependentFeatures.put(stateDependent, enabled); + if(enabled) + stateDependent.enable(); } private static void loadKits(FightTeam team){ @@ -250,6 +275,8 @@ public class FightSystem extends JavaPlugin { private static void setFightState(FightState state){ fightState = state; + if(mainCountdown != null) + mainCountdown.disable(); postStateChange(); } diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/commands/AkCommand.java b/FightSystem_Main/src/de/steamwar/fightsystem/commands/AkCommand.java index 5f5d775..95756e9 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/commands/AkCommand.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/commands/AkCommand.java @@ -66,7 +66,7 @@ public class AkCommand implements CommandExecutor { return false; } KitManager.saveInventory(args[1], player); - } else if(args[0].equalsIgnoreCase("schemlist") && FightSystem.getFightState() == FightState.SETUP) { + } else if(args[0].equalsIgnoreCase("schemlist") && FightSystem.getFightState() == FightState.PRE_SCHEM_SETUP) { try { FightTeam fightTeam = Fight.getPlayerTeam(player); if(fightTeam != null && fightTeam.getFightPlayer(player).isLeader()) { diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/commands/Commands.java b/FightSystem_Main/src/de/steamwar/fightsystem/commands/Commands.java index 43c9797..4a8e8f8 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/commands/Commands.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/commands/Commands.java @@ -3,7 +3,6 @@ package de.steamwar.fightsystem.commands; import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightPlayer; -import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.fight.FightTeam; import de.steamwar.fightsystem.kit.Kit; import de.steamwar.fightsystem.kit.KitManager; @@ -18,7 +17,7 @@ public class Commands { } static boolean checkSetup(Player p){ - if(FightSystem.getFightState() != FightState.SETUP){ + if(FightSystem.getFightState().setup()){ p.sendMessage(FightSystem.PREFIX + "§cDer Kampf hat bereits begonnen!"); return true; } diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/countdown/Countdown.java b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/Countdown.java index fe05212..c26acc1 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/countdown/Countdown.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/Countdown.java @@ -9,17 +9,12 @@ import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.Bukkit; import org.bukkit.Sound; import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitScheduler; - -import java.util.ArrayList; -import java.util.logging.Level; +import org.bukkit.scheduler.BukkitTask; public abstract class Countdown { - private static final ArrayList countdowns = new ArrayList<>(); - private int time; - private final int taskID; + private final BukkitTask task; private final Sound sound; private final boolean level; @@ -30,10 +25,8 @@ public abstract class Countdown { this.time = time; this.sound = getSound(sound); this.level = level; - countdowns.add(this); - BukkitScheduler bukkitScheduler = Bukkit.getServer().getScheduler(); - this.taskID = bukkitScheduler.scheduleSyncRepeatingTask(FightSystem.getPlugin(), this::count, 0, 20); + task = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), this::count, 0, 20); } public static Sound getSound(SWSound sound){ @@ -56,16 +49,8 @@ public abstract class Countdown { } } - public static void cancelAllTimers() { - while (!countdowns.isEmpty()) { - countdowns.get(0).cancelTimer(); - } - } - - public static void cancelTimerType(Class type) { - for(int i = countdowns.size() - 1; i >= 0; i--) - if(type.isInstance(countdowns.get(i))) - countdowns.get(i).cancelTimer(); + public void disable() { + task.cancel(); } private void broadcast(String message){ @@ -95,7 +80,7 @@ public abstract class Countdown { if(this.sound != null) Fight.playSound(this.sound, 100.0F, 2.0F); - cancelTimer(); + disable(); countdownFinished(); break; default: @@ -108,15 +93,6 @@ public abstract class Countdown { } void onTime(int time){ - //Unused - } - - public void cancelTimer() { - try { - Bukkit.getScheduler().cancelTask(this.taskID); - } catch (AssertionError ex) { - FightSystem.getPlugin().getLogger().log(Level.SEVERE, "Could not cancel timer", ex); - } - countdowns.remove(this); + //Implemented in some countdowns } } diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/countdown/EnternCountdown.java b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/EnternCountdown.java index d737981..0029c7b 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/countdown/EnternCountdown.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/EnternCountdown.java @@ -17,7 +17,7 @@ public class EnternCountdown extends Countdown { @Override public void countdownFinished() { - FightSystem.setEntern(true); + FightSystem.setEntern(); Bukkit.broadcastMessage(FightSystem.PREFIX + "§aEntern ist nun erlaubt!"); } } diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java b/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java index edaaa86..1bebc3c 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java @@ -3,10 +3,10 @@ package de.steamwar.fightsystem.fight; import com.sk89q.worldedit.EditSession; import de.steamwar.core.Core; import de.steamwar.fightsystem.Config; -import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.IFightSystem; import de.steamwar.fightsystem.kit.KitManager; +import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.utils.ColorConverter; import de.steamwar.fightsystem.utils.FightScoreboard; import de.steamwar.fightsystem.utils.ItemBuilder; @@ -28,10 +28,7 @@ import org.bukkit.scoreboard.NameTagVisibility; import org.bukkit.scoreboard.Team; import java.io.IOException; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.UUID; +import java.util.*; public class FightTeam implements IFightTeam{ @@ -83,28 +80,6 @@ public class FightTeam implements IFightTeam{ team.setAllowFriendlyFire(false); } - private void setTeamColor(Team team, ChatColor color){ - switch(Core.getVersion()){ - case 15: - FightTeam_15.setTeamColor(team, color); - break; - case 14: - FightTeam_14.setTeamColor(team, color); - break; - case 10: - FightTeam_10.setTeamColor(team, color); - break; - case 9: - FightTeam_9.setTeamColor(team, color); - break; - case 8: - FightTeam_8.setTeamColor(team, color); - break; - default: - FightTeam_12.setTeamColor(team, color); - } - } - public final int getCornerX() { return cornerX; } @@ -183,24 +158,14 @@ public class FightTeam implements IFightTeam{ public void removePlayer(Player player) { FightPlayer fightPlayer = getFightPlayer(player); - if(fightPlayer == null) - return; final List> chunksToReload = TechHider.prepareChunkReload(player); players.remove(fightPlayer); team.removeEntry(player.getName()); fightPlayer.getPlayer().getInventory().clear(); - if(fightPlayer.equals(leader) && FightSystem.getFightState() == FightState.SETUP){ - this.leader = null; - if(!players.isEmpty()) { - setLeader(players.iterator().next()); - Bukkit.broadcastMessage(FightSystem.PREFIX + "§aDer Spieler §e" + leader.getPlayer().getName() + " §aist nun Leader von Team " + getColoredName() + "§a!"); - }else if(!Config.event()){ - FightSystem.shutdown(FightSystem.PREFIX + "§cTeam " + getColoredName() + " §chat keine Spieler mehr.\n Arena schließt..."); - }else{ - setLeader(null); - } - } + + if(fightPlayer.equals(leader) && FightSystem.getFightState().setup()) + setLeader(null); player.setGameMode(GameMode.SPECTATOR); player.teleport(Config.SpecSpawn); @@ -222,8 +187,15 @@ public class FightTeam implements IFightTeam{ public void setLeader(FightPlayer leader) { this.leader = leader; - if (leader == null) + if (leader == null){ + if(!players.isEmpty()) { + setLeader(players.iterator().next()); + Bukkit.broadcastMessage(FightSystem.PREFIX + "§aDer Spieler §e" + this.leader.getPlayer().getName() + " §aist nun Leader von Team " + getColoredName() + "§a!"); + }else if(!Config.event()){ + FightSystem.shutdown(FightSystem.PREFIX + "§cTeam " + getColoredName() + " §chat keine Spieler mehr.\n Arena schließt..."); + } return; + } leader.setKit(KitManager.getKitByName(Config.LeaderDefault)); Inventory inventory = leader.getPlayer().getInventory(); @@ -231,12 +203,15 @@ public class FightTeam implements IFightTeam{ inventory.setItem(1, new ItemBuilder(Material.LEATHER_CHESTPLATE).removeAllAttributs().addEnchantment(Enchantment.DURABILITY, 1).setDisplayName("§eKit wählen").build()); else inventory.setItem(1, new ItemBuilder(Material.AIR).build()); + if(!Config.event()){ inventory.setItem(2, new ItemBuilder(Material.PAPER).removeAllAttributs().setDisplayName("§eSpieler einladen").build()); inventory.setItem(3, new ItemBuilder(SWItem.getMaterial("FIREWORK_CHARGE")).removeAllAttributs().setDisplayName("§cSpieler rauswerfen").build()); inventory.setItem(4, new ItemBuilder(SWItem.getDye(10), (short) 10).removeAllAttributs().addEnchantment(Enchantment.DURABILITY, 1).setDisplayName("§cNicht bereit").build()); } - inventory.setItem(0, new ItemBuilder(SWItem.getMaterial("CAULDRON_ITEM")).removeAllAttributs().addEnchantment(Enchantment.DURABILITY, 1).setDisplayName("§e" + Config.GameName + " wählen").build()); + + if(!Config.test() && FightSystem.getFightState() != FightState.POST_SCHEM_SETUP) + inventory.setItem(0, new ItemBuilder(SWItem.getMaterial("CAULDRON_ITEM")).removeAllAttributs().addEnchantment(Enchantment.DURABILITY, 1).setDisplayName("§e" + Config.GameName + " wählen").build()); } public Set getPlayers() { @@ -247,28 +222,35 @@ public class FightTeam implements IFightTeam{ return ready; } - private void pasteSchematic(){ + public void pasteSchematic(){ FreezeWorld freezer = new FreezeWorld(); + DyeColor c = ColorConverter.chat2dye(color); EditSession e; try { switch(Core.getVersion()){ case 15: e = FightTeam_15.pasteSchematic(schematic, pasteX, pasteY, pasteZ, rotate); + FightTeam_15.replaceTeamColor(e, c, cornerX, cornerY, cornerZ); break; case 14: e = FightTeam_14.pasteSchematic(schematic, pasteX, pasteY, pasteZ, rotate); + FightTeam_14.replaceTeamColor(e, c, cornerX, cornerY, cornerZ); break; case 10: e = FightTeam_10.pasteSchematic(schematic, pasteX, pasteY, pasteZ, rotate); + FightTeam_10.replaceTeamColor(e, c, cornerX, cornerY, cornerZ); break; case 9: e = FightTeam_9.pasteSchematic(schematic, pasteX, pasteY, pasteZ, rotate); + FightTeam_9.replaceTeamColor(e, c, cornerX, cornerY, cornerZ); break; case 8: e = FightTeam_8.pasteSchematic(schematic, pasteX, pasteY, pasteZ, rotate); + FightTeam_8.replaceTeamColor(e, c, cornerX, cornerY, cornerZ); break; default: e = FightTeam_12.pasteSchematic(schematic, pasteX, pasteY, pasteZ, rotate); + FightTeam_12.replaceTeamColor(e, c, cornerX, cornerY, cornerZ); } } catch (Schematic.WrongVersionException ex) { broadcast(FightSystem.PREFIX + "§cDie gewählte Schematic kann nicht in dieser Version geladen werden"); @@ -278,41 +260,16 @@ public class FightTeam implements IFightTeam{ broadcast(FightSystem.PREFIX + "§cFehler beim Pasten der Schematic"); throw new SecurityException("Error pasting arena in schematic", ex); } - replaceTeamColor(e); HandlerList.unregisterAll(freezer); Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), this::teleportToSpawn,40); } - private void replaceTeamColor(EditSession e){ - DyeColor c = ColorConverter.chat2dye(color); - - switch(Core.getVersion()){ - case 15: - FightTeam_15.replaceTeamColor(e, c, cornerX, cornerY, cornerZ); - break; - case 14: - FightTeam_14.replaceTeamColor(e, c, cornerX, cornerY, cornerZ); - break; - case 10: - FightTeam_10.replaceTeamColor(e, c, cornerX, cornerY, cornerZ); - break; - case 9: - FightTeam_9.replaceTeamColor(e, c, cornerX, cornerY, cornerZ); - break; - case 8: - FightTeam_8.replaceTeamColor(e, c, cornerX, cornerY, cornerZ); - break; - default: - FightTeam_12.replaceTeamColor(e, c, cornerX, cornerY, cornerZ); - } - } - public void pasteDummy(){ List publics = Schematic.getSchemsOfType(0, Config.SchematicType); if(publics.isEmpty()) return; - schematic = publics.get(0); + schematic = publics.get(new Random().nextInt(publics.size())); pasteSchematic(); } @@ -326,9 +283,7 @@ public class FightTeam implements IFightTeam{ if(Config.test()) pasteSchematic(); else if(Fight.getOpposite(this).hasSchematic()){ - TechHider.start(); - pasteSchematic(); - Fight.getOpposite(this).pasteSchematic(); + FightSystem.setPostSchemState(); } } @@ -348,35 +303,14 @@ public class FightTeam implements IFightTeam{ if(ready) { l.getInventory().setItem(4, new ItemBuilder(SWItem.getDye(8), (short) 8).removeAllAttributs().addEnchantment(Enchantment.DURABILITY,1 ).setDisplayName("§aBereit").build()); broadcast(FightSystem.PREFIX + "§aEuer Team ist nun bereit!"); - if(Fight.getOpposite(this).isReady() || Config.test()) { + if(Fight.getOpposite(this).isReady() || Config.test()) FightSystem.setPreRunningState(); - } } else { l.getInventory().setItem(4, new ItemBuilder(SWItem.getDye(10), (short) 10).removeAllAttributs().addEnchantment(Enchantment.DURABILITY, 1).setDisplayName("§cNicht bereit").build()); broadcast(FightSystem.PREFIX + "§cEuer Team ist nicht mehr bereit!"); } } - void replaceSync(boolean replace, Material target, Material replacement) { - if(!replace) - return; - - World world = Bukkit.getWorlds().get(0); - Location minPoint = new Location(world, cornerX, cornerY, cornerZ); - Location maxPoint = new Location(world, (cornerX + Config.SchemsizeX), (cornerY + Config.SchemsizeY), (cornerZ + Config.SchemsizeZ)); - - for(int x = minPoint.getBlockX(); x <= maxPoint.getBlockX(); x++) { - for(int z = minPoint.getBlockZ(); z <= maxPoint.getBlockZ(); z++) { - for(int y = minPoint.getBlockY(); y <= maxPoint.getBlockY(); y++) { - - Block block = world.getBlockAt(x, y, z); - if(block.getType() == target) - block.setType(replacement); - } - } - } - } - public Set getInvited() { return invited; } @@ -416,6 +350,48 @@ public class FightTeam implements IFightTeam{ return currentHearts / maximumHearts; } + void replaceSync(boolean replace, Material target, Material replacement) { + if(!replace) + return; + + World world = Bukkit.getWorlds().get(0); + Location minPoint = new Location(world, cornerX, cornerY, cornerZ); + Location maxPoint = new Location(world, (cornerX + Config.SchemsizeX), (cornerY + Config.SchemsizeY), (cornerZ + Config.SchemsizeZ)); + + for(int x = minPoint.getBlockX(); x <= maxPoint.getBlockX(); x++) { + for(int z = minPoint.getBlockZ(); z <= maxPoint.getBlockZ(); z++) { + for(int y = minPoint.getBlockY(); y <= maxPoint.getBlockY(); y++) { + + Block block = world.getBlockAt(x, y, z); + if(block.getType() == target) + block.setType(replacement); + } + } + } + } + + private void setTeamColor(Team team, ChatColor color){ + switch(Core.getVersion()){ + case 15: + FightTeam_15.setTeamColor(team, color); + break; + case 14: + FightTeam_14.setTeamColor(team, color); + break; + case 10: + FightTeam_10.setTeamColor(team, color); + break; + case 9: + FightTeam_9.setTeamColor(team, color); + break; + case 8: + FightTeam_8.setTeamColor(team, color); + break; + default: + FightTeam_12.setTeamColor(team, color); + } + } + private static class FreezeWorld implements Listener { private FreezeWorld(){ Bukkit.getPluginManager().registerEvents(this, IFightSystem.getPlugin()); diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/EventJoinListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/EventJoinListener.java index da76ffc..81807d8 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/EventJoinListener.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/EventJoinListener.java @@ -17,7 +17,7 @@ import java.util.EnumSet; public class EventJoinListener extends BasicListener { public EventJoinListener() { - super(EnumSet.of(FightState.PRE_LEADER_SETUP, FightState.PRE_SCHEM_SETUP, FightState.POST_SCHEM_SETUP)); + super(Config.event() ? EnumSet.of(FightState.PRE_LEADER_SETUP, FightState.PRE_SCHEM_SETUP, FightState.POST_SCHEM_SETUP) : EnumSet.noneOf(FightState.class)); } @EventHandler diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/FreezeWorldStateListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/FreezeWorldStateListener.java index 4b35430..6f2a400 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/FreezeWorldStateListener.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/FreezeWorldStateListener.java @@ -1,5 +1,6 @@ package de.steamwar.fightsystem.listener; +import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.states.FightState; import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.entity.Player; @@ -17,7 +18,7 @@ import java.util.EnumSet; public class FreezeWorldStateListener extends BasicListener { public FreezeWorldStateListener() { - super(EnumSet.of(FightState.PRE_LEADER_SETUP, FightState.PRE_SCHEM_SETUP, FightState.POST_SCHEM_SETUP, FightState.PRE_RUNNING, FightState.SPECTATE)); + super(Config.test() ? EnumSet.noneOf(FightState.class) : EnumSet.of(FightState.PRE_LEADER_SETUP, FightState.PRE_SCHEM_SETUP, FightState.POST_SCHEM_SETUP, FightState.PRE_RUNNING, FightState.SPECTATE)); } @EventHandler diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/NormalJoinListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/NormalJoinListener.java index 05a22a4..de7a770 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/NormalJoinListener.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/NormalJoinListener.java @@ -1,8 +1,7 @@ package de.steamwar.fightsystem.listener; -import de.steamwar.fightsystem.countdown.Countdown; -import de.steamwar.fightsystem.countdown.NoPlayersOnlineCountdown; -import de.steamwar.fightsystem.countdown.SetupOverCountdown; +import de.steamwar.fightsystem.Config; +import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; import de.steamwar.fightsystem.states.FightState; @@ -15,7 +14,7 @@ import java.util.EnumSet; public class NormalJoinListener extends BasicListener { public NormalJoinListener() { - super(EnumSet.of(FightState.PRE_LEADER_SETUP)); + super(Config.event() || Config.test() ? EnumSet.noneOf(FightState.class) : EnumSet.of(FightState.PRE_LEADER_SETUP)); } @EventHandler @@ -33,8 +32,7 @@ public class NormalJoinListener extends BasicListener { if(Fight.getRedTeam().hasTeamLeader() && Fight.getBlueTeam().hasTeamLeader() && (Fight.getRedTeam().getLeader().getPlayer() == player || Fight.getBlueTeam().getLeader().getPlayer() == player)) { - Countdown.cancelTimerType(NoPlayersOnlineCountdown.class); - new SetupOverCountdown(); + FightSystem.setPreSchemState(); } } } diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/PlayerMoveListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/PlayerMoveListener.java index 16c3b71..96176b1 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/PlayerMoveListener.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/PlayerMoveListener.java @@ -1,10 +1,10 @@ package de.steamwar.fightsystem.listener; +import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.fight.Fight; -import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.fight.FightTeam; -import de.steamwar.fightsystem.Config; +import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.utils.Region; import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.GameMode; @@ -13,12 +13,18 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerMoveEvent; +import java.util.EnumSet; + public class PlayerMoveListener extends BasicListener { private static final String DENY_ARENA = "§cDu darfst die Arena nicht verlassen"; private static final String DENY_TEAM = "§cDu darfst nicht zu den Teams"; private static final String DENY_ENTERN = "§cDu darfst nicht entern"; + public PlayerMoveListener() { + super(EnumSet.allOf(FightState.class)); + } + @EventHandler public void teamAreas(PlayerMoveEvent event) { Player player = event.getPlayer(); @@ -28,6 +34,7 @@ public class PlayerMoveListener extends BasicListener { Location to = event.getTo(); FightTeam fightTeam = Fight.getPlayerTeam(player); + assert to != null; boolean inArenaY = to.getY() + 1.8 <= Config.upperArenaBorder; boolean inBlueArea = inArenaY && Region.isIn2DRange(to, Config.TeamBlueCornerX, Config.TeamBlueCornerZ, Config.SchemsizeX, Config.SchemsizeZ, Config.BorderFromSchematic); @@ -37,7 +44,7 @@ public class PlayerMoveListener extends BasicListener { if(fightTeam == null) reset(event, DENY_TEAM); }else if(fightTeam != null && ( - !FightSystem.isEntern() || player.getGameMode() == GameMode.SPECTATOR)){ + FightSystem.getFightState() != FightState.ENTERN || player.getGameMode() == GameMode.SPECTATOR)){ reset(event, DENY_ENTERN); } } @@ -48,6 +55,7 @@ public class PlayerMoveListener extends BasicListener { Location to = event.getTo(); //Check in Arena + assert to != null; if(!Region.isIn2DRegion(to, Config.ArenaMinX, Config.ArenaMinZ, Config.ArenaMaxX, Config.ArenaMaxZ)){ reset(event, DENY_ARENA); return; diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/TestListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/TestListener.java index 24c6fda..f8636de 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/TestListener.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/TestListener.java @@ -1,7 +1,7 @@ package de.steamwar.fightsystem.listener; +import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.FightSystem; -import de.steamwar.fightsystem.countdown.Countdown; import de.steamwar.fightsystem.countdown.NoPlayersOnlineCountdown; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; @@ -15,8 +15,12 @@ import java.util.EnumSet; public class TestListener extends BasicListener { + private NoPlayersOnlineCountdown countdown; + public TestListener() { - super(EnumSet.allOf(FightState.class)); + super(Config.test() ? EnumSet.allOf(FightState.class) : EnumSet.noneOf(FightState.class)); + if(Config.test()) + countdown = new NoPlayersOnlineCountdown(); } @EventHandler @@ -28,7 +32,10 @@ public class TestListener extends BasicListener { player.sendMessage(FightSystem.PREFIX + "§7Werde zum Teamleader mit §8/§eleader"); } - Countdown.cancelTimerType(NoPlayersOnlineCountdown.class); + if(countdown != null){ + countdown.disable(); + countdown = null; + } PermissionAttachment attachment = player.addAttachment(FightSystem.getPlugin()); attachment.setPermission("fawe.permpack.basic", true); diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/states/FightState.java b/FightSystem_Main/src/de/steamwar/fightsystem/states/FightState.java index a234745..36af1ae 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/states/FightState.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/states/FightState.java @@ -1,8 +1,8 @@ package de.steamwar.fightsystem.states; public enum FightState { - PRE_LEADER_SETUP(true, true, false, false), //Can be skipped - PRE_SCHEM_SETUP(true, true, false, false), //Can be skipped + PRE_LEADER_SETUP(true, true, false, false), + PRE_SCHEM_SETUP(true, true, false, false), POST_SCHEM_SETUP(true, true, false, false), PRE_RUNNING(false, false, true, false), RUNNING(false, false, true, true), diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/utils/FightScoreboard.java b/FightSystem_Main/src/de/steamwar/fightsystem/utils/FightScoreboard.java index e8434b9..f11db48 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/utils/FightScoreboard.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/utils/FightScoreboard.java @@ -71,7 +71,7 @@ public class FightScoreboard { objective.getScore("§7Zeit: §a" + fightTime + "s").setScore(3); } if (Config.Entern) - objective.getScore("§7Entern: " + (FightSystem.isEntern() ? "§aja" : "§cnein")).setScore(2); + objective.getScore("§7Entern: " + (FightSystem.getFightState() == FightState.ENTERN ? "§aja" : "§cnein")).setScore(2); if(fullScoreboard.contains(FightSystem.getFightState())){ if (Config.PercentSystem){ diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/EventTeamOffWincondition.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/EventTeamOffWincondition.java index 0347f0d..2a7edbd 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/EventTeamOffWincondition.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/EventTeamOffWincondition.java @@ -1,17 +1,31 @@ package de.steamwar.fightsystem.winconditions; +import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; +import de.steamwar.fightsystem.states.FightState; import org.bukkit.Bukkit; -public class EventTeamOffWincondition { +import java.util.EnumSet; + +public class EventTeamOffWincondition extends Wincondition { public EventTeamOffWincondition(){ + super(Config.event(), EnumSet.of(FightState.PRE_RUNNING)); + } + + @Override + public void enable() { teamOff(Fight.getBlueTeam()); teamOff(Fight.getRedTeam()); } + @Override + public void disable() { + //Team off is a on time trigger + } + private void teamOff(FightTeam team){ if(team.allPlayersOut()){ Bukkit.broadcastMessage(FightSystem.PREFIX + "§6Das Team " + team.getColoredName() + " §6ist Offline!"); diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/ListenerWincondition.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/ListenerWincondition.java index 309526c..04babde 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/ListenerWincondition.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/ListenerWincondition.java @@ -1,15 +1,33 @@ package de.steamwar.fightsystem.winconditions; import de.steamwar.fightsystem.FightSystem; +import de.steamwar.fightsystem.states.FightState; import org.bukkit.Bukkit; +import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; -abstract class ListenerWincondition implements Listener { +import java.util.Set; - void init(boolean condition){ - if(!condition) - return; +abstract class ListenerWincondition extends Wincondition implements Listener { + ListenerWincondition(boolean condition, Set enabled){ + //If the condition is not met, never enable + super(condition, enabled); + } + + /** + * Enables the state dependent object + */ + @Override + public void enable(){ Bukkit.getPluginManager().registerEvents(this, FightSystem.getPlugin()); } + + /** + * Disables the state dependent object + */ + @Override + public void disable(){ + HandlerList.unregisterAll(this); + } } diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/PlayerWincondition.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/PlayerWincondition.java index dd12e75..9cac8f5 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/PlayerWincondition.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/PlayerWincondition.java @@ -1,17 +1,19 @@ package de.steamwar.fightsystem.winconditions; -import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; import de.steamwar.fightsystem.states.FightState; import org.bukkit.entity.Player; +import java.util.EnumSet; + abstract class PlayerWincondition extends ListenerWincondition { - boolean isTarget(Player player){ - if(FightSystem.getFightState() != FightState.PRE_RUNNING && FightSystem.getFightState() != FightState.RUNNING) - return false; + PlayerWincondition(boolean condition) { + super(condition, EnumSet.of(FightState.PRE_RUNNING, FightState.RUNNING, FightState.ENTERN)); + } + boolean isTarget(Player player){ FightTeam fightTeam = Fight.getPlayerTeam(player); if(fightTeam == null) return false; diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/Wincondition.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/Wincondition.java new file mode 100644 index 0000000..2605ba6 --- /dev/null +++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/Wincondition.java @@ -0,0 +1,23 @@ +package de.steamwar.fightsystem.winconditions; + +import de.steamwar.fightsystem.FightSystem; +import de.steamwar.fightsystem.states.FightState; +import de.steamwar.fightsystem.states.StateDependent; + +import java.util.Set; + +abstract class Wincondition implements StateDependent { + + private final Set enabled; + + Wincondition(boolean condition, Set enabled){ + this.enabled = enabled; + if(condition) + FightSystem.registerStateDependent(this); + } + + @Override + public Set enabled(){ + return enabled; + } +} diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionAllDead.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionAllDead.java index a938f73..862fcfe 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionAllDead.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionAllDead.java @@ -13,7 +13,7 @@ import org.bukkit.event.player.PlayerQuitEvent; public class WinconditionAllDead extends PlayerWincondition { public WinconditionAllDead(){ - init(Config.AllDead); + super(Config.AllDead); } @EventHandler diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionCaptainDead.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionCaptainDead.java index 3fb803e..c716d0c 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionCaptainDead.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionCaptainDead.java @@ -13,7 +13,7 @@ import org.bukkit.event.player.PlayerQuitEvent; public class WinconditionCaptainDead extends PlayerWincondition { public WinconditionCaptainDead(){ - init(Config.CaptainDead); + super(Config.CaptainDead); } @EventHandler diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionEntern.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionEntern.java deleted file mode 100644 index 24259f1..0000000 --- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionEntern.java +++ /dev/null @@ -1,13 +0,0 @@ -package de.steamwar.fightsystem.winconditions; - -import de.steamwar.fightsystem.countdown.EnternCountdown; -import de.steamwar.fightsystem.Config; - -public class WinconditionEntern { - public WinconditionEntern() { - if(!Config.Entern) - return; - - new EnternCountdown(); - } -} diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionHeartRatioTimeout.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionHeartRatioTimeout.java index 7f79a16..18974be 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionHeartRatioTimeout.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionHeartRatioTimeout.java @@ -4,14 +4,21 @@ import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.countdown.TimeOverCountdown; import de.steamwar.fightsystem.fight.Fight; +import de.steamwar.fightsystem.states.FightState; -public class WinconditionHeartRatioTimeout { +import java.util.EnumSet; + +public class WinconditionHeartRatioTimeout extends Wincondition { + + private TimeOverCountdown countdown; public WinconditionHeartRatioTimeout() { - if(!Config.HeartRatioTimeout) - return; + super(Config.HeartRatioTimeout, EnumSet.of(FightState.RUNNING, FightState.ENTERN)); + } - new TimeOverCountdown(() -> { + @Override + public void enable() { + countdown = new TimeOverCountdown(() -> { double blueHeartRatio = Fight.getBlueTeam().getHeartRatio(); double redHeartRatio = Fight.getRedTeam().getHeartRatio(); @@ -23,4 +30,9 @@ public class WinconditionHeartRatioTimeout { FightSystem.setSpectateState(null); }); } -} + + @Override + public void disable(){ + countdown.disable(); + } +} \ No newline at end of file diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPercentSystem.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPercentSystem.java index fae97c3..664c522 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPercentSystem.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPercentSystem.java @@ -1,14 +1,16 @@ package de.steamwar.fightsystem.winconditions; +import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.states.FightState; -import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.utils.Region; import org.bukkit.entity.Entity; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityExplodeEvent; +import java.util.EnumSet; + public class WinconditionPercentSystem extends ListenerWincondition { private static double bluePercent = 0D; @@ -17,12 +19,10 @@ public class WinconditionPercentSystem extends ListenerWincondition { private static int blueDestroyedBlocks; private static int redDestroyedBlocks; - private static int schematicSize; + private static final int schematicSize = Math.abs(Config.SchemsizeX * Config.SchemsizeY * Config.SchemsizeZ); public WinconditionPercentSystem() { - init(Config.PercentSystem); - - schematicSize = Math.abs(Config.SchemsizeX * Config.SchemsizeY * Config.SchemsizeZ); + super(Config.PercentSystem, EnumSet.of(FightState.RUNNING, FightState.ENTERN)); } @EventHandler diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPoints.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPoints.java index 1fab87c..23d2857 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPoints.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPoints.java @@ -5,6 +5,7 @@ import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.countdown.TimeOverCountdown; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; +import de.steamwar.fightsystem.states.FightState; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -15,15 +16,38 @@ public class WinconditionPoints extends PlayerWincondition { private static TeamPoints blue; private static TeamPoints red; + private TimeOverCountdown countdown; public WinconditionPoints(){ - if(!Config.Points) - return; + super(Config.Points); + } - init(true); + public static TeamPoints getRed(){ + return red; + } + + public static TeamPoints getBlue(){ + return blue; + } + + @Override + public void enable() { + super.enable(); blue = new TeamPoints(Fight.getRedTeam(), WinconditionRelativePercent.getBlue(), WinconditionRelativePercent.getRed()); red = new TeamPoints(Fight.getBlueTeam(), WinconditionRelativePercent.getRed(), WinconditionRelativePercent.getBlue()); - new TimeOverCountdown(this::fightEnds); + } + + @Override + public void disable() { + super.disable(); + countdown.disable(); + } + + @Override + public void stateChange(FightState state){ + if(state == FightState.RUNNING){ + countdown = new TimeOverCountdown(this::fightEnds); + } } @EventHandler @@ -54,14 +78,6 @@ public class WinconditionPoints extends PlayerWincondition { } - public static TeamPoints getRed(){ - return red; - } - - public static TeamPoints getBlue(){ - return blue; - } - private void fightEnds(){ if(red.getPoints() > blue.getPoints()) FightSystem.setSpectateState(blue.enemy); @@ -78,7 +94,7 @@ public class WinconditionPoints extends PlayerWincondition { return red; } - public static class TeamPoints extends PlayerWincondition { + public static class TeamPoints { private final FightTeam enemy; private final WinconditionRelativePercent.TeamPercent enemyPercent; private final double factor; @@ -89,13 +105,12 @@ public class WinconditionPoints extends PlayerWincondition { TeamPoints(FightTeam enemy, WinconditionRelativePercent.TeamPercent ownPercent, WinconditionRelativePercent.TeamPercent enemyPercent){ this.enemy = enemy; this.enemyPercent = enemyPercent; - init(true); points = 0; if(enemyPercent.getBlockCount() < ownPercent.getBlockCount()) this.factor = 10000; //Original mit 20 (20% = 0.2 ergeben 2000 Punkte else{ - double f = 10000 * ownPercent.getBlockCount() / enemyPercent.getBlockCount(); + double f = 10000.0 * ownPercent.getBlockCount() / enemyPercent.getBlockCount(); if(f > 10000) f = 10000; diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPumpkinTechKO.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPumpkinTechKO.java index 100bb9b..6dc6d23 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPumpkinTechKO.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPumpkinTechKO.java @@ -4,23 +4,25 @@ import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; +import de.steamwar.fightsystem.states.FightState; import de.steamwar.inventory.SWItem; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.World; +import org.bukkit.scheduler.BukkitTask; -public class WinconditionPumpkinTechKO { +import java.util.EnumSet; + +public class WinconditionPumpkinTechKO extends Wincondition { private static int teamRedPumpkins = -1; private static int teamBluePumpkins = -1; private static final World WORLD = Bukkit.getWorlds().get(0); private static final Material PUMPKIN_LANTERN = SWItem.getMaterial("JACK_O_LANTERN"); + private BukkitTask task; public WinconditionPumpkinTechKO(){ - if(!Config.PumpkinTechKO) - return; - - Bukkit.getScheduler().runTaskTimerAsynchronously(FightSystem.getPlugin(), WinconditionPumpkinTechKO::recursiveCheck, 0, 200); + super(Config.PumpkinTechKO, EnumSet.of(FightState.PRE_RUNNING, FightState.RUNNING, FightState.ENTERN)); } public static int getTeamBluePumpkins() { @@ -30,6 +32,16 @@ public class WinconditionPumpkinTechKO { return teamRedPumpkins; } + @Override + public void enable() { + task = Bukkit.getScheduler().runTaskTimerAsynchronously(FightSystem.getPlugin(), WinconditionPumpkinTechKO::recursiveCheck, 0, 200); + } + + @Override + public void disable() { + task.cancel(); + } + private static void recursiveCheck(){ teamRedPumpkins = getPumpkins(Config.TeamRedCornerX, Config.TeamRedCornerY, diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionRelativePercent.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionRelativePercent.java index 2ae481e..413047b 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionRelativePercent.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionRelativePercent.java @@ -4,15 +4,18 @@ import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; +import de.steamwar.fightsystem.states.FightState; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.World; +import org.bukkit.scheduler.BukkitTask; import java.util.Collections; +import java.util.EnumSet; import java.util.HashSet; import java.util.Set; -public class WinconditionRelativePercent{ +public class WinconditionRelativePercent extends Wincondition{ private static final Set ignoredBlocks; private static TeamPercent blue; @@ -26,11 +29,7 @@ public class WinconditionRelativePercent{ } public WinconditionRelativePercent(){ - if(!Config.RelativePercent && !Config.Points) - return; - - blue = new TeamPercent(Fight.getBlueTeam()); - red = new TeamPercent(Fight.getRedTeam()); + super(Config.RelativePercent || Config.Points, EnumSet.of(FightState.PRE_RUNNING, FightState.RUNNING)); } public static TeamPercent getBlue(){ @@ -41,19 +40,32 @@ public class WinconditionRelativePercent{ return red; } + @Override + public void enable() { + blue = new TeamPercent(Fight.getBlueTeam()); + red = new TeamPercent(Fight.getRedTeam()); + } + + @Override + public void disable() { + blue.task.cancel(); + red.task.cancel(); + } + public static class TeamPercent { private static final World world = Bukkit.getWorlds().get(0); private final FightTeam team; private final int blockCount; + private final BukkitTask task; private int currentBlocks; - TeamPercent(FightTeam team){ + private TeamPercent(FightTeam team){ this.team = team; this.blockCount = currentBlocks(); this.currentBlocks = blockCount; - Bukkit.getScheduler().runTaskTimerAsynchronously(FightSystem.getPlugin(), () -> { + task = Bukkit.getScheduler().runTaskTimerAsynchronously(FightSystem.getPlugin(), () -> { currentBlocks = currentBlocks(); checkPercentDefeat(); }, 400, 400); @@ -73,7 +85,7 @@ public class WinconditionRelativePercent{ } private int currentBlocks(){ - if(FightSystem.isEntern()) + if(FightSystem.getFightState() == FightState.ENTERN || FightSystem.getFightState() == FightState.SPECTATE) return currentBlocks; int blocks = 0; diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTechKO.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTechKO.java index 5cb45bf..04228cb 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTechKO.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTechKO.java @@ -1,46 +1,61 @@ package de.steamwar.fightsystem.winconditions; +import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.countdown.TechKOCountdown; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; -import de.steamwar.fightsystem.Config; +import de.steamwar.fightsystem.states.FightState; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.entity.TNTPrimed; import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityExplodeEvent; +import org.bukkit.scheduler.BukkitTask; +import java.util.EnumSet; import java.util.HashMap; import java.util.Map; -public class WinconditionTechKO implements Listener { +public class WinconditionTechKO extends ListenerWincondition { private static final int TECH_KO_TIME_IN_S = 90; private static final int TECH_KO_HALF_TIME = TECH_KO_TIME_IN_S*10; public static final int TECH_KO_COUNTDOWN_TIME = TECH_KO_HALF_TIME/20; - private World world; + private World world = Bukkit.getWorlds().get(0); private Map map = new HashMap<>(400); - private double toggle; - private int smallerZtime; - private int biggerZtime; + private double toggle = Config.SpecSpawn.getZ(); + private int smallerZtime = TECH_KO_HALF_TIME; + private int biggerZtime = TECH_KO_HALF_TIME; private TechKOCountdown smallerZcountdown = null; private TechKOCountdown biggerZcountdown = null; + private BukkitTask task; - //Works only for z-Axis fight direction for performance reasons + /** + * Works only for z-Axis fight direction for performance reasons + */ public WinconditionTechKO(){ - if(!Config.TechKO) - return; + super(Config.TechKO, EnumSet.of(FightState.RUNNING, FightState.SPECTATE)); + } - world = Bukkit.getWorlds().get(0); - toggle = Config.SpecSpawn.getZ(); - smallerZtime=TECH_KO_HALF_TIME; - biggerZtime=TECH_KO_HALF_TIME; + @Override + public void enable() { + super.enable(); + task = Bukkit.getScheduler().runTaskTimerAsynchronously(FightSystem.getPlugin(), this::run, 1, 1); + } - Bukkit.getScheduler().runTaskTimerAsynchronously(FightSystem.getPlugin(), this::run, 1, 1); - Bukkit.getPluginManager().registerEvents(this, FightSystem.getPlugin()); + @Override + public void disable() { + super.disable(); + smallerZcountdown.disable(); + biggerZcountdown.disable(); + task.cancel(); + } + + @EventHandler + public void onEntityDead(EntityExplodeEvent event){ + map.remove(event.getEntity().getEntityId()); } private void run(){ @@ -57,14 +72,14 @@ public class WinconditionTechKO implements Listener { } if(smallerZtime == TECH_KO_HALF_TIME && smallerZcountdown != null){ - smallerZcountdown.cancelTimer(); + smallerZcountdown.disable(); smallerZcountdown = null; }else if(smallerZtime == 0){ smallerZcountdown = new TechKOCountdown(smallerTeam()); } if(biggerZtime == TECH_KO_HALF_TIME && biggerZcountdown != null){ - biggerZcountdown.cancelTimer(); + biggerZcountdown.disable(); biggerZcountdown = null; }else if(biggerZtime == 0){ biggerZcountdown = new TechKOCountdown(biggerTeam()); @@ -87,9 +102,4 @@ public class WinconditionTechKO implements Listener { else return Fight.getRedTeam(); } - - @EventHandler - public void onEntityDead(EntityExplodeEvent event){ - map.remove(event.getEntity().getEntityId()); - } } diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTimeout.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTimeout.java index dd24980..a2c46ad 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTimeout.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTimeout.java @@ -1,14 +1,27 @@ package de.steamwar.fightsystem.winconditions; +import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.countdown.TimeOverCountdown; -import de.steamwar.fightsystem.Config; +import de.steamwar.fightsystem.states.FightState; + +import java.util.EnumSet; + +public class WinconditionTimeout extends Wincondition { + + private TimeOverCountdown countdown; -public class WinconditionTimeout { public WinconditionTimeout() { - if(!Config.Timeout) - return; + super(Config.Timeout, EnumSet.of(FightState.RUNNING, FightState.ENTERN)); + } - new TimeOverCountdown(() -> FightSystem.setSpectateState(null)); + @Override + public void enable() { + countdown = new TimeOverCountdown(() -> FightSystem.setSpectateState(null)); + } + + @Override + public void disable() { + countdown.disable(); } } diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionWaterTechKO.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionWaterTechKO.java index 2731e59..84c66ae 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionWaterTechKO.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionWaterTechKO.java @@ -10,21 +10,34 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; +import org.bukkit.scheduler.BukkitTask; +import java.util.EnumSet; import java.util.HashSet; import java.util.Set; -public class WinconditionWaterTechKO { +public class WinconditionWaterTechKO extends Wincondition { private static final Set teamRedWater = new HashSet<>(); private static final Set teamBlueWater = new HashSet<>(); private static final World WORLD = Bukkit.getWorlds().get(0); - public WinconditionWaterTechKO() { - if(!Config.WaterTechKO) - return; + private BukkitTask task; - Bukkit.getScheduler().runTaskTimerAsynchronously(FightSystem.getPlugin(), this::addWater, 200, 200); + public WinconditionWaterTechKO() { + super(Config.WaterTechKO, EnumSet.of(FightState.PRE_RUNNING, FightState.RUNNING, FightState.SPECTATE)); + } + + public static int getTeamBlueWater() { + return teamBlueWater.size(); + } + + public static int getTeamRedWater() { + return teamRedWater.size(); + } + + @Override + public void enable() { checkForWater(teamRedWater, Config.TeamRedCornerX, Config.TeamRedCornerY, @@ -39,6 +52,19 @@ public class WinconditionWaterTechKO { Config.TeamBlueCornerX + Config.SchemsizeX, Config.TeamBlueCornerY + Config.SchemsizeY, Config.TeamBlueCornerZ + Config.SchemsizeZ); + task = Bukkit.getScheduler().runTaskTimerAsynchronously(FightSystem.getPlugin(), this::addWater, 200, 200); + } + + @Override + public void disable() { + task.cancel(); + } + + private void checkEmpty(FightTeam team, Set teamWater){ + if(teamWater.isEmpty()){ + Bukkit.broadcastMessage(FightSystem.PREFIX + "§eDas Team " + team.getColoredName() + " §eist Tech K.O.!"); + Bukkit.getScheduler().runTask(FightSystem.getPlugin(), () -> FightSystem.setSpectateState(Fight.getOpposite(team))); + } } private void addWater() { @@ -77,19 +103,4 @@ public class WinconditionWaterTechKO { } } } - - private static void checkEmpty(FightTeam team, Set teamWater){ - if(teamWater.isEmpty()){ - Bukkit.broadcastMessage(FightSystem.PREFIX + "§eDas Team " + team.getColoredName() + " §eist Tech K.O.!"); - Bukkit.getScheduler().runTask(FightSystem.getPlugin(), () -> FightSystem.setSpectateState(Fight.getOpposite(team))); - } - } - - public static int getTeamBlueWater() { - return teamBlueWater.size(); - } - - public static int getTeamRedWater() { - return teamRedWater.size(); - } }