/* This file is a part of the SteamWar software. Copyright (C) 2020 SteamWar.de-Serverteam This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ 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.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 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)); } @Override public void enable() { super.enable(); task = Bukkit.getScheduler().runTaskTimerAsynchronously(FightSystem.getPlugin(), this::run, 1, 1); } @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(){ 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; } } 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()); } 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(); } }