package in.twizmwaz.cardinal.module.modules.kit.kitTypes; import in.twizmwaz.cardinal.Cardinal; import in.twizmwaz.cardinal.event.MatchEndEvent; import in.twizmwaz.cardinal.module.modules.kit.KitRemovable; import org.bukkit.Bukkit; import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.HandlerList; import org.bukkit.event.player.PlayerOnGroundEvent; import org.bukkit.event.player.PlayerToggleFlightEvent; import org.bukkit.util.Vector; import java.util.ArrayList; import java.util.List; import java.util.UUID; /** * Parts of code borrowed from * https://github.com/rmsy/DoubleJump * * Modified for use with CardinalPGM */ public class DoubleJumpKit implements KitRemovable { private boolean enabled; private double power; private double rechargeTime; private boolean rechargeBeforeLanding; private long lastUpdate = 0L; List<UUID> players = new ArrayList<>(); List<UUID> landed = new ArrayList<>(); public DoubleJumpKit(boolean enabled, double power, double rechargeTime, final boolean rechargeBeforeLanding) { this.enabled = enabled; this.power = power; this.rechargeTime = rechargeTime; this.rechargeBeforeLanding = rechargeBeforeLanding; Bukkit.getScheduler().runTaskTimer(Cardinal.getInstance(), new Runnable() { public void run() { DoubleJumpKit.this.update(); } }, 0, 2); } private void update() { int diff = (int) (System.currentTimeMillis() - lastUpdate); lastUpdate = System.currentTimeMillis(); float toAddExp = rechargeTime > 0 ? (float) (diff / (rechargeTime * 1000)) : 1.0f; for(UUID uuid : players) { Player player = Bukkit.getPlayer(uuid); if(player.getExp() < 1.0f && (rechargeBeforeLanding || landed.contains(uuid))) { player.setExp(player.getExp() + toAddExp > 1.0f ? 1.0f : player.getExp() + toAddExp); } else if(player.getExp() > 1.0f) { player.setExp(1.0f); } if(player.getExp() >= 1.0f) { player.setAllowFlight(true); } } } @Override public void unload() { HandlerList.unregisterAll(this); } @Override public void apply(Player player, Boolean force) { if (!enabled) return; players.add(player.getUniqueId()); player.setExp(1.0f); player.setAllowFlight(true); } @Override public void remove(Player player) { if (!players.contains(player.getUniqueId())) return; players.remove(player.getUniqueId()); player.setExp(0.0f); player.setAllowFlight(false); } @EventHandler(priority = EventPriority.LOWEST) public void onMatchEnd(MatchEndEvent event) { enabled = false; for(UUID uuid : players) { Player player = Bukkit.getPlayer(uuid); player.setExp(0.0f); player.setAllowFlight(false); } landed.clear(); players.clear(); } @EventHandler public void onPlayerGround(PlayerOnGroundEvent event) { if (!enabled || rechargeBeforeLanding) return; UUID id = event.getPlayer().getUniqueId(); if (!players.contains(id) || landed.contains(id)) return; if (event.getOnGround()) landed.add(id); } @EventHandler public void onPlayerToggleFly(PlayerToggleFlightEvent event) { if (!enabled) return; Player player = event.getPlayer(); if (!players.contains(player.getUniqueId()) || player.getExp() > 1.0f || !event.isFlying()) return; player.setAllowFlight(false); player.setExp(0.0f); event.setCancelled(true); Vector normal = player.getEyeLocation().getDirection(); normal.setY(0.75 + Math.max(normal.getY() * 0.5, 0)); normal.multiply(power / 2); event.getPlayer().setVelocity(normal); player.getWorld().playSound(player.getLocation(), Sound.ENTITY_ZOMBIE_INFECT, 0.5f, 1.8f); update(); } }