package com.nisovin.magicspells.spells.instant; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Random; import java.util.Set; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Horse; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; import org.spigotmc.event.entity.EntityDismountEvent; import com.nisovin.magicspells.spelleffects.EffectPosition; import com.nisovin.magicspells.spells.InstantSpell; import com.nisovin.magicspells.util.MagicConfig; import com.nisovin.magicspells.util.Util; public class SteedSpell extends InstantSpell { Random random = new Random(); Map<String, Integer> mounted = new HashMap<String, Integer>(); EntityType type; Horse.Color color = null; Horse.Style style = null; Horse.Variant variant = null; ItemStack armor; String strAlreadyMounted; public SteedSpell(MagicConfig config, String spellName) { super(config, spellName); type = Util.getEntityType(getConfigString("type", "horse")); if (type == EntityType.HORSE) { String c = getConfigString("color", null); String s = getConfigString("style", null); String v = getConfigString("variant", null); String a = getConfigString("armor", null); if (c != null) { for (Horse.Color h : Horse.Color.values()) { if (h.name().equalsIgnoreCase(c)) { color = h; break; } } } if (s != null) { for (Horse.Style h : Horse.Style.values()) { if (h.name().equalsIgnoreCase(s)) { style = h; break; } } } if (v != null) { for (Horse.Variant h : Horse.Variant.values()) { if (h.name().equalsIgnoreCase(v)) { variant = h; break; } } } if (a != null) { armor = Util.getItemStackFromString(a); } } strAlreadyMounted = getConfigString("str-already-mounted", "You are already mounted!"); } @Override public PostCastAction castSpell(Player player, SpellCastState state, float power, String[] args) { if (state == SpellCastState.NORMAL) { if (player.getVehicle() != null) { sendMessage(player, strAlreadyMounted); return PostCastAction.ALREADY_HANDLED; } Entity entity = player.getWorld().spawnEntity(player.getLocation(), type); if (type == EntityType.HORSE) { ((Horse)entity).setTamed(true); ((Horse)entity).setOwner(player); ((Horse)entity).setJumpStrength(2d); ((Horse)entity).setAdult(); if (color != null) { ((Horse)entity).setColor(color); } else { ((Horse)entity).setColor(Horse.Color.values()[random.nextInt(Horse.Color.values().length)]); } if (style != null) { ((Horse)entity).setStyle(style); } else { ((Horse)entity).setStyle(Horse.Style.values()[random.nextInt(Horse.Style.values().length)]); } if (variant != null) { ((Horse)entity).setVariant(variant); } else { ((Horse)entity).setVariant(Horse.Variant.values()[random.nextInt(Horse.Variant.values().length)]); } ((Horse)entity).setTamed(true); ((Horse)entity).setOwner(player); ((Horse)entity).getInventory().setSaddle(new ItemStack(Material.SADDLE)); if (armor != null) { ((Horse)entity).getInventory().setArmor(armor); } } entity.setPassenger(player); playSpellEffects(EffectPosition.CASTER, player); mounted.put(player.getName(), entity.getEntityId()); } return PostCastAction.HANDLE_NORMALLY; } @EventHandler void onDamage(EntityDamageEvent event) { if (mounted.containsValue(event.getEntity().getEntityId())) { event.setCancelled(true); } } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) void onDismount(EntityDismountEvent event) { if (event.getEntity() instanceof Player) { Player player = (Player)event.getEntity(); if (mounted.containsKey(player.getName())) { mounted.remove(player.getName()); event.getDismounted().remove(); playSpellEffects(EffectPosition.DISABLED, player); } } } @EventHandler void onDeath(PlayerDeathEvent event) { if (mounted.containsKey(event.getEntity().getName()) && event.getEntity().getVehicle() != null) { mounted.remove(event.getEntity().getName()); Entity vehicle = event.getEntity().getVehicle(); vehicle.eject(); vehicle.remove(); } } @EventHandler void onQuit(PlayerQuitEvent event) { if (mounted.containsKey(event.getPlayer().getName()) && event.getPlayer().getVehicle() != null) { mounted.remove(event.getPlayer().getName()); Entity vehicle = event.getPlayer().getVehicle(); vehicle.eject(); vehicle.remove(); } } @Override public void turnOff() { for (String name : mounted.keySet()) { @SuppressWarnings("deprecation") Player player = Bukkit.getPlayerExact(name); if (player != null && player.getVehicle() != null) { player.getVehicle().eject(); } } mounted.clear(); } }