package com.nisovin.magicspells.spells.targeted; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerQuitEvent; import com.nisovin.magicspells.spells.TargetedEntitySpell; import com.nisovin.magicspells.spells.TargetedSpell; import com.nisovin.magicspells.util.MagicConfig; import com.nisovin.magicspells.util.TargetInfo; public class MountSpell extends TargetedSpell implements TargetedEntitySpell { boolean reverse = false; public MountSpell(MagicConfig config, String spellName) { super(config, spellName); reverse = getConfigBoolean("reverse", false); } @Override public PostCastAction castSpell(Player player, SpellCastState state, float power, String[] args) { if (state == SpellCastState.NORMAL) { if (!reverse) { // normal - casting player mounts target if (player.getVehicle() != null) { // leave stack Entity veh = player.getVehicle(); veh.eject(); Entity pass = player.getPassenger(); if (pass != null) { player.eject(); veh.setPassenger(pass); } } else { // join stack LivingEntity target = null; TargetInfo<Player> targetInfo = getTargetedPlayer(player, power); if (targetInfo != null) { target = targetInfo.getTarget(); } if (target != null) { while (target.getPassenger() != null && target.getPassenger() instanceof LivingEntity) { target = (LivingEntity)target.getPassenger(); } player.eject(); target.setPassenger(player); sendMessages(player, target); return PostCastAction.NO_MESSAGES; } else { return noTarget(player); } } } else { // reverse - casting player forces target to mount self LivingEntity target = null; TargetInfo<Player> targetInfo = getTargetedPlayer(player, power); if (targetInfo != null) { target = targetInfo.getTarget(); } if (target != null) { // clear out any previous passengers if (player.getPassenger() != null) { player.eject(); } if (player.getVehicle() != null) { player.getVehicle().eject(); } if (target.getPassenger() != null) { target.eject(); } if (target.getVehicle() != null) { target.getVehicle().eject(); } // set passenger player.setPassenger(target); sendMessages(player, target); return PostCastAction.NO_MESSAGES; } } } return PostCastAction.HANDLE_NORMALLY; } @Override public boolean castAtEntity(Player caster, LivingEntity target, float power) { return false; } @Override public boolean castAtEntity(LivingEntity target, float power) { return false; } @Override public boolean isBeneficialDefault() { return true; } @EventHandler public void onQuit(PlayerQuitEvent event) { Player player = event.getPlayer(); Entity vehicle = player.getVehicle(); Entity passenger = player.getPassenger(); if (passenger != null) { player.eject(); } if (vehicle != null && vehicle instanceof Player) { vehicle.eject(); } } @EventHandler public void onDeath(PlayerDeathEvent event) { Player player = event.getEntity(); Entity vehicle = player.getVehicle(); Entity passenger = player.getPassenger(); if (passenger != null) { player.eject(); } if (vehicle != null && vehicle instanceof Player) { vehicle.eject(); } } }