package com.nisovin.magicspells.spells.targeted;
import org.bukkit.Bukkit;
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.events.SpellTargetLocationEvent;
import com.nisovin.magicspells.materials.MagicMaterial;
import com.nisovin.magicspells.spelleffects.EffectPosition;
import com.nisovin.magicspells.spells.TargetedLocationSpell;
import com.nisovin.magicspells.spells.TargetedSpell;
import com.nisovin.magicspells.util.BlockUtils;
import com.nisovin.magicspells.util.MagicConfig;
public class FarmSpell extends TargetedSpell implements TargetedLocationSpell {
private int radius;
private int growth;
private MagicMaterial newCropType;
private boolean targeted;
public FarmSpell(MagicConfig config, String spellName) {
super(config, spellName);
radius = getConfigInt("radius", 3);
growth = getConfigInt("growth", 1);
newCropType = MagicSpells.getItemNameResolver().resolveBlock(getConfigString("new-crop-type", "crops"));
targeted = getConfigBoolean("targeted", false);
}
@Override
public PostCastAction castSpell(Player player, SpellCastState state, float power, String[] args) {
if (state == SpellCastState.NORMAL) {
Block block = null;
if (targeted) {
block = getTargetedBlock(player, power);
} else {
block = player.getLocation().subtract(0, 1, 0).getBlock();
}
if (block != null) {
SpellTargetLocationEvent event = new SpellTargetLocationEvent(this, player, block.getLocation(), power);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) {
block = null;
} else {
block = event.getTargetLocation().getBlock();
power = event.getPower();
}
}
if (block != null) {
boolean farmed = farm(block, Math.round(radius * power));
if (!farmed) return noTarget(player);
playSpellEffects(EffectPosition.CASTER, player);
if (targeted) {
playSpellEffects(EffectPosition.TARGET, block.getLocation());
}
} else {
return noTarget(player);
}
}
return PostCastAction.HANDLE_NORMALLY;
}
private boolean farm(Block center, int radius) {
int cx = center.getX();
int y = center.getY();
int cz = center.getZ();
int count = 0;
for (int x = cx - radius; x <= cx + radius; x++) {
for (int z = cz - radius; z <= cz + radius; z++) {
Block b = center.getWorld().getBlockAt(x, y, z);
if (b.getType() != Material.SOIL) {
b = b.getRelative(BlockFace.DOWN);
if (b.getType() != Material.SOIL) {
continue;
}
}
b = b.getRelative(BlockFace.UP);
if (b.getType() == Material.AIR) {
if (newCropType != null) {
newCropType.setBlock(b);
if (growth > 1) {
BlockUtils.setGrowthLevel(b, growth - 1);
}
count++;
}
} else if ((b.getType() == Material.CROPS || b.getType() == Material.CARROT || b.getType() == Material.POTATO) && BlockUtils.getGrowthLevel(b) < 7) {
int newGrowth = BlockUtils.getGrowthLevel(b) + growth;
if (newGrowth > 7) newGrowth = 7;
BlockUtils.setGrowthLevel(b, newGrowth);
count++;
}
}
}
return count > 0;
}
@Override
public boolean castAtLocation(Player caster, Location target, float power) {
return farm(target.subtract(0, 1, 0).getBlock(), Math.round(radius * power));
}
@Override
public boolean castAtLocation(Location target, float power) {
return farm(target.getBlock(), Math.round(radius * power));
}
}