package com.nisovin.magicspells.spells.buff; import java.util.HashSet; import java.util.Random; import org.bukkit.Bukkit; import org.bukkit.GrassSpecies; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.BlockState; import org.bukkit.entity.Player; import org.bukkit.material.LongGrass; import com.nisovin.magicspells.MagicSpells; import com.nisovin.magicspells.spells.BuffSpell; import com.nisovin.magicspells.util.MagicConfig; public class LifewalkSpell extends BuffSpell { private HashSet<String> lifewalkers; private Grower grower; private Random random; private int tickInterval; private int redFlowerChance; private int yellowFlowerChance; private int saplingChance; private int tallgrassChance; private int fernChance; public LifewalkSpell(MagicConfig config, String spellName) { super(config, spellName); lifewalkers = new HashSet<String>(); random = new Random(); tickInterval = getConfigInt("tick-interval", 15); redFlowerChance = getConfigInt("red-flower-chance", 15); yellowFlowerChance = getConfigInt("yellow-flower-chance", 15); saplingChance = getConfigInt("sapling-chance", 5); tallgrassChance = getConfigInt("tallgrass-chance", 25); fernChance = getConfigInt("fern-chance", 15); } @Override public boolean castBuff(Player player, float power, String[] args) { lifewalkers.add(player.getName()); if (grower == null) { grower = new Grower(); } return true; } @Override public void turnOffBuff(Player player) { lifewalkers.remove(player.getName()); if (lifewalkers.size() == 0 && grower != null) { grower.stop(); grower = null; } } @Override protected void turnOff() { lifewalkers.clear(); if (grower != null) { grower.stop(); grower = null; } } private class Grower implements Runnable { int taskId; String[] strArr = new String[0]; public Grower() { taskId = Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(MagicSpells.plugin, this, tickInterval, tickInterval); } public void stop() { Bukkit.getServer().getScheduler().cancelTask(taskId); } public void run() { for (String s : lifewalkers.toArray(strArr)) { Player player = Bukkit.getServer().getPlayer(s); if (player != null) { if (isExpired(player)) { turnOff(player); continue; } Block feet = player.getLocation().getBlock(); Block ground = feet.getRelative(BlockFace.DOWN); if (feet.getType() == Material.AIR && (ground.getType() == Material.DIRT || ground.getType() == Material.GRASS)) { if (ground.getType() == Material.DIRT) { ground.setType(Material.GRASS); } int rand = random.nextInt(100); if (rand < redFlowerChance) { feet.setType(Material.RED_ROSE); addUse(player); chargeUseCost(player); } else { rand -= redFlowerChance; if (rand < yellowFlowerChance) { feet.setType(Material.YELLOW_FLOWER); addUse(player); chargeUseCost(player); } else { rand -= yellowFlowerChance; if (rand < saplingChance) { feet.setType(Material.SAPLING); addUse(player); chargeUseCost(player); } else { rand -= saplingChance; if (rand < tallgrassChance) { BlockState state = feet.getState(); state.setType(Material.LONG_GRASS); state.setData(new LongGrass(GrassSpecies.NORMAL)); state.update(true); addUse(player); chargeUseCost(player); } else { rand -= tallgrassChance; if (rand < fernChance) { BlockState state = feet.getState(); state.setType(Material.LONG_GRASS); state.setData(new LongGrass(GrassSpecies.FERN_LIKE)); state.update(true); addUse(player); chargeUseCost(player); } } } } } } } } } } @Override public boolean isActive(Player player) { return lifewalkers.contains(player.getName()); } }