package com.nisovin.magicspells.spells.buff; import java.util.HashSet; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.Player; import com.nisovin.magicspells.MagicSpells; import com.nisovin.magicspells.spells.BuffSpell; import com.nisovin.magicspells.util.MagicConfig; public class WaterwalkSpell extends BuffSpell { private float speed; private HashSet<String> waterwalking; private Ticker ticker = null; public WaterwalkSpell(MagicConfig config, String spellName) { super(config, spellName); speed = getConfigFloat("speed", 0.05F); waterwalking = new HashSet<String>(); } @Override public boolean castBuff(Player player, float power, String[] args) { waterwalking.add(player.getName()); startTicker(); return true; } @Override public boolean isActive(Player player) { return waterwalking.contains(player.getName()); } @Override public void turnOffBuff(Player player) { if (waterwalking.remove(player.getName())) { player.setFlying(false); if (player.getGameMode() != GameMode.CREATIVE) { player.setAllowFlight(false); } } if (waterwalking.size() == 0) { stopTicker(); } } @Override protected void turnOff() { for (String playerName : waterwalking) { Player player = Bukkit.getPlayerExact(playerName); if (player != null && player.isValid()) { player.setFlying(false); if (player.getGameMode() != GameMode.CREATIVE) { player.setAllowFlight(false); } } } waterwalking.clear(); stopTicker(); } private void startTicker() { if (ticker == null) { ticker = new Ticker(); } } private void stopTicker() { if (ticker != null) { ticker.stop(); ticker = null; } } private class Ticker implements Runnable { private int taskId = 0; private int count = 0; public Ticker() { taskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(MagicSpells.plugin, this, 5, 5); } public void run() { count += 1; if (count >= 4) count = 0; Location loc; Block feet, underfeet; for (String n : waterwalking) { Player p = Bukkit.getPlayerExact(n); if (p != null && p.isOnline() && p.isValid()) { loc = p.getLocation(); feet = loc.getBlock(); underfeet = feet.getRelative(BlockFace.DOWN); if (feet.getType() == Material.STATIONARY_WATER) { loc.setY(Math.floor(loc.getY() + 1) + .1); p.teleport(loc); } else if (p.isFlying() && underfeet.getType() == Material.AIR) { loc.setY(Math.floor(loc.getY() - 1) + .1); p.teleport(loc); } feet = p.getLocation().getBlock(); underfeet = feet.getRelative(BlockFace.DOWN); if (feet.getType() == Material.AIR && underfeet.getType() == Material.STATIONARY_WATER) { if (!p.isFlying()) { p.setAllowFlight(true); p.setFlying(true); p.setFlySpeed(speed); } if (count == 0) { addUseAndChargeCost(p); } } else if (p.isFlying()) { p.setFlying(false); if (p.getGameMode() != GameMode.CREATIVE) { p.setAllowFlight(false); } p.setFlySpeed(0.1F); } } } } public void stop() { Bukkit.getScheduler().cancelTask(taskId); } } }