package com.nisovin.magicspells.spells.targeted; import java.util.HashSet; 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 org.bukkit.event.Event.Result; import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEvent; import com.nisovin.magicspells.MagicSpells; import com.nisovin.magicspells.events.SpellTargetLocationEvent; import com.nisovin.magicspells.spells.TargetedLocationSpell; import com.nisovin.magicspells.spells.TargetedSpell; import com.nisovin.magicspells.util.MagicConfig; public class TelekinesisSpell extends TargetedSpell implements TargetedLocationSpell { private boolean checkPlugins; public TelekinesisSpell(MagicConfig config, String spellName) { super(config, spellName); checkPlugins = getConfigBoolean("check-plugins", true); losTransparentBlocks = new HashSet<Byte>(losTransparentBlocks); losTransparentBlocks.remove((byte)Material.LEVER.getId()); losTransparentBlocks.remove((byte)Material.STONE_PLATE.getId()); losTransparentBlocks.remove((byte)Material.WOOD_PLATE.getId()); losTransparentBlocks.remove((byte)Material.IRON_PLATE.getId()); losTransparentBlocks.remove((byte)Material.GOLD_PLATE.getId()); losTransparentBlocks.remove((byte)Material.STONE_BUTTON.getId()); losTransparentBlocks.remove((byte)Material.WOOD_BUTTON.getId()); } public PostCastAction castSpell(Player player, SpellCastState state, float power, String[] args) { if (state == SpellCastState.NORMAL) { Block target = getTargetedBlock(player, power); if (target == null) { // fail return noTarget(player); } else { // run target event SpellTargetLocationEvent event = new SpellTargetLocationEvent(this, player, target.getLocation(), power); Bukkit.getPluginManager().callEvent(event); if (event.isCancelled()) { return noTarget(player); } else { target = event.getTargetLocation().getBlock(); } // run effect boolean activated = activate(player, target); if (!activated) { return noTarget(player); } else { playSpellEffects(player, target.getLocation()); } } } return PostCastAction.HANDLE_NORMALLY; } private boolean activate(Player caster, Block target) { if (target.getType() == Material.LEVER || target.getType() == Material.STONE_BUTTON || target.getType() == Material.WOOD_BUTTON) { if (checkPlugins(caster, target)) { MagicSpells.getVolatileCodeHandler().toggleLeverOrButton(target); return true; } } else if (target.getType() == Material.WOOD_PLATE || target.getType() == Material.STONE_PLATE || target.getType() == Material.IRON_PLATE || target.getType() == Material.GOLD_PLATE) { if (checkPlugins(caster, target)) { MagicSpells.getVolatileCodeHandler().pressPressurePlate(target); return true; } } return false; } private boolean checkPlugins(Player caster, Block target) { if (checkPlugins) { PlayerInteractEvent event = new PlayerInteractEvent(caster, Action.RIGHT_CLICK_BLOCK, caster.getItemInHand(), target, BlockFace.SELF); Bukkit.getPluginManager().callEvent(event); if (event.useInteractedBlock() == Result.DENY) { return false; } } return true; } @Override public boolean castAtLocation(Player caster, Location target, float power) { boolean activated = activate(caster, target.getBlock()); if (activated) { playSpellEffects(caster, target); } return activated; } @Override public boolean castAtLocation(Location target, float power) { return false; } }