From b8b8b1b0f50b44648ad1004f0e898436f7dcb98b Mon Sep 17 00:00:00 2001 From: Lixfel Date: Thu, 24 Dec 2020 14:53:29 +0100 Subject: [PATCH] Optimize TechKO detection Signed-off-by: Lixfel --- .../countdown/TechKOCountdown.java | 5 +- .../winconditions/WinconditionTechKO.java | 88 +++++++------------ 2 files changed, 35 insertions(+), 58 deletions(-) diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/countdown/TechKOCountdown.java b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/TechKOCountdown.java index af2378d..5d60997 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/countdown/TechKOCountdown.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/TechKOCountdown.java @@ -22,15 +22,14 @@ package de.steamwar.fightsystem.countdown; import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; -import de.steamwar.fightsystem.winconditions.WinconditionTechKO; import org.bukkit.Bukkit; public class TechKOCountdown extends Countdown { private final FightTeam team; - public TechKOCountdown(FightTeam team) { - super(WinconditionTechKO.TECH_KO_COUNTDOWN_TIME, SWSound.BLOCK_NOTE_PLING, false); + public TechKOCountdown(FightTeam team, int countdownTime) { + super(countdownTime, SWSound.BLOCK_NOTE_PLING, false); this.team = team; } diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTechKO.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTechKO.java index 117e966..1652e2d 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTechKO.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTechKO.java @@ -28,41 +28,45 @@ 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.entity.EntityExplodeEvent; import org.bukkit.scheduler.BukkitTask; import java.util.EnumSet; -import java.util.HashMap; -import java.util.Map; 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 = Bukkit.getWorlds().get(0); - private Map map = new HashMap<>(400); - private double toggle = Config.SpecSpawn.getZ(); + private final World world = Bukkit.getWorlds().get(0); + private final double toggle = Config.SpecSpawn.getZ(); + private final FightTeam smallerZteam; + private final FightTeam biggerZteam; + 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; - private boolean running = false; /** * Works only for z-Axis fight direction for performance reasons */ public WinconditionTechKO(){ super(Config.TechKO, EnumSet.of(FightState.RUNNING)); + + if(Config.TeamBluetoReddistanceZ > 0) { + smallerZteam = Fight.getBlueTeam(); + biggerZteam = Fight.getRedTeam(); + }else{ + smallerZteam = Fight.getRedTeam(); + biggerZteam = Fight.getBlueTeam(); + } } @Override public void enable() { super.enable(); - task = Bukkit.getScheduler().runTaskTimerAsynchronously(FightSystem.getPlugin(), this::run, 1, 1); + task = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), this::run, 1, 1); } @Override @@ -79,58 +83,32 @@ public class WinconditionTechKO extends ListenerWincondition { task.cancel(); } - @EventHandler - public void onEntityDead(EntityExplodeEvent event){ - map.remove(event.getEntity().getEntityId()); - } - private void run(){ - if(running) - return; - running = true; - for(TNTPrimed tnt : world.getEntitiesByClass(TNTPrimed.class)){ - int id = tnt.getEntityId(); - boolean smallerZ = tnt.getLocation().getZ() < toggle; - Boolean old = map.put(id, smallerZ); - if(old != null && old != smallerZ){ - if(old) - smallerZtime = TECH_KO_HALF_TIME; - else - biggerZtime = TECH_KO_HALF_TIME; + double z = tnt.getLocation().getZ(); + boolean smallerZ = z < toggle; + boolean wasSmallerZ = z - tnt.getVelocity().getZ() < toggle; + if(wasSmallerZ && !smallerZ) { + smallerZtime = TECH_KO_HALF_TIME; + if(smallerZcountdown != null){ + smallerZcountdown.disable(); + smallerZcountdown = null; + } + }else if(!wasSmallerZ && smallerZ){ + biggerZtime = TECH_KO_HALF_TIME; + if(biggerZcountdown != null){ + biggerZcountdown.disable(); + biggerZcountdown = null; + } } } - if(smallerZtime == TECH_KO_HALF_TIME && smallerZcountdown != null){ - smallerZcountdown.disable(); - smallerZcountdown = null; - }else if(smallerZtime == 0){ - smallerZcountdown = new TechKOCountdown(smallerTeam()); - } - - if(biggerZtime == TECH_KO_HALF_TIME && biggerZcountdown != null){ - biggerZcountdown.disable(); - biggerZcountdown = null; - }else if(biggerZtime == 0){ - biggerZcountdown = new TechKOCountdown(biggerTeam()); - } + if(smallerZtime == 0) + smallerZcountdown = new TechKOCountdown(smallerZteam, TECH_KO_HALF_TIME / 20); + if(biggerZtime == 0) + biggerZcountdown = new TechKOCountdown(biggerZteam, TECH_KO_HALF_TIME / 20); smallerZtime--; biggerZtime--; - running = false; - } - - private FightTeam smallerTeam(){ - if(Config.TeamBluetoReddistanceZ > 0) - return Fight.getBlueTeam(); - else - return Fight.getRedTeam(); - } - - private FightTeam biggerTeam(){ - if(Config.TeamBluetoReddistanceZ < 0) - return Fight.getBlueTeam(); - else - return Fight.getRedTeam(); } } -- 2.39.2