Search in sources :

Example 21 with Mage

use of com.elmakers.mine.bukkit.magic.Mage in project MagicPlugin by elBukkit.

the class PlayerController method onPlayerDropItem.

@EventHandler
public void onPlayerDropItem(PlayerDropItemEvent event) {
    final Player player = event.getPlayer();
    Mage mage = controller.getRegisteredMage(player);
    if (mage == null)
        return;
    // Catch lag-related glitches dropping items from GUIs
    if (mage.getActiveGUI() != null) {
        event.setCancelled(true);
        return;
    }
    final Wand activeWand = mage.getActiveWand();
    final ItemStack droppedItem = event.getItemDrop().getItemStack();
    boolean cancelEvent = false;
    ItemStack activeItem = activeWand == null ? null : activeWand.getItem();
    // It seems like Spigot sets the original item to air before dropping
    // We will be satisfied to only compare the metadata.
    ItemMeta activeMeta = activeItem == null ? null : activeItem.getItemMeta();
    ItemMeta droppedMeta = droppedItem.getItemMeta();
    boolean droppedWand = droppedMeta != null && activeMeta != null && activeItem.getItemMeta().equals(droppedItem.getItemMeta());
    if (droppedWand && activeWand.isUndroppable()) {
        // Postpone cycling until after this event unwinds
        Bukkit.getScheduler().scheduleSyncDelayedTask(controller.getPlugin(), new DropActionTask(activeWand));
        cancelEvent = true;
    } else if (activeWand != null) {
        if (droppedWand) {
            ItemStack mainhandItem = player.getInventory().getItemInMainHand();
            activeWand.deactivate();
            ItemStack restoredItem = player.getInventory().getItemInMainHand();
            ItemMeta restoredMeta = restoredItem == null ? null : restoredItem.getItemMeta();
            activeMeta = activeWand.getItem().getItemMeta();
            // Might have just saved some changes
            droppedItem.setItemMeta(activeMeta);
            // Clear after inventory restore (potentially with deactivate), since that will put the wand back
            if (Wand.hasActiveWand(player) && restoredItem.getType() != Material.AIR && restoredMeta != null && activeMeta.equals(restoredMeta)) {
                ItemStack newItem = player.getInventory().getItemInMainHand();
                if (mainhandItem.getAmount() > 0) {
                    newItem.setAmount(mainhandItem.getAmount());
                    player.getInventory().setItemInMainHand(newItem);
                } else {
                    player.getInventory().setItemInMainHand(new ItemStack(Material.AIR, 1));
                }
            }
        } else if (activeWand.isInventoryOpen()) {
            if (!controller.isSpellDroppingEnabled()) {
                cancelEvent = true;
                // This will happen if you graph an item, change pages, and then drop the item- it would disappear
                // from the inventory until reload.
                // Check for this state and prevent it.
                boolean isInventoryFull = true;
                PlayerInventory playerInventory = player.getInventory();
                for (int i = 0; i < Wand.PLAYER_INVENTORY_SIZE; i++) {
                    ItemStack item = playerInventory.getItem(i);
                    if (item == null || item.getType() == Material.AIR) {
                        isInventoryFull = false;
                        break;
                    }
                }
                if (isInventoryFull) {
                    activeWand.addToInventory(droppedItem);
                }
            } else {
                // The item is already removed from the wand's inventory, but that should be ok
                controller.removeItemFromWand(activeWand, droppedItem);
            }
        }
    }
    if (!cancelEvent) {
        cancelEvent = InventoryUtils.getMetaBoolean(droppedItem, "undroppable", false);
    }
    if (cancelEvent) {
        if (droppedWand) {
            activeWand.setItem(droppedItem);
        }
        event.setCancelled(true);
    }
}
Also used : DropActionTask(com.elmakers.mine.bukkit.magic.DropActionTask) Player(org.bukkit.entity.Player) Mage(com.elmakers.mine.bukkit.magic.Mage) Wand(com.elmakers.mine.bukkit.wand.Wand) PlayerInventory(org.bukkit.inventory.PlayerInventory) ItemStack(org.bukkit.inventory.ItemStack) ItemMeta(org.bukkit.inventory.meta.ItemMeta) EventHandler(org.bukkit.event.EventHandler)

Example 22 with Mage

use of com.elmakers.mine.bukkit.magic.Mage in project MagicPlugin by elBukkit.

the class PlayerController method onPlayerInteractArmorStand.

@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onPlayerInteractArmorStand(PlayerArmorStandManipulateEvent event) {
    Player player = event.getPlayer();
    Mage mage = controller.getRegisteredMage(player);
    if (mage == null)
        return;
    com.elmakers.mine.bukkit.api.wand.Wand wand = mage.checkWand();
    if (wand != null) {
        if (wand.isUndroppable()) {
            event.setCancelled(true);
            return;
        } else {
            wand.deactivate();
        }
    } else {
        ItemStack mainHand = player.getInventory().getItemInMainHand();
        ItemStack offhand = player.getInventory().getItemInOffHand();
        if (InventoryUtils.getMetaBoolean(mainHand, "undroppable", false) || (InventoryUtils.isEmpty(mainHand) && InventoryUtils.getMetaBoolean(offhand, "undroppable", false))) {
            event.setCancelled(true);
            return;
        }
    }
}
Also used : Player(org.bukkit.entity.Player) Mage(com.elmakers.mine.bukkit.magic.Mage) ItemStack(org.bukkit.inventory.ItemStack) EventHandler(org.bukkit.event.EventHandler)

Example 23 with Mage

use of com.elmakers.mine.bukkit.magic.Mage in project MagicPlugin by elBukkit.

the class PlayerController method onPlayerExpChange.

@EventHandler
public void onPlayerExpChange(PlayerExpChangeEvent event) {
    Player player = event.getPlayer();
    Mage mage = controller.getRegisteredMage(player);
    if (mage != null) {
        mage.experienceChanged();
    }
}
Also used : Player(org.bukkit.entity.Player) Mage(com.elmakers.mine.bukkit.magic.Mage) EventHandler(org.bukkit.event.EventHandler)

Example 24 with Mage

use of com.elmakers.mine.bukkit.magic.Mage in project MagicPlugin by elBukkit.

the class PlayerController method onPlayerToggleGlide.

@EventHandler
public void onPlayerToggleGlide(EntityToggleGlideEvent event) {
    Entity entity = event.getEntity();
    Mage mage = controller.getRegisteredMage(entity);
    if (mage != null && mage.isGlidingAllowed() && !event.isGliding() && !entity.isOnGround()) {
        event.setCancelled(true);
    }
}
Also used : Entity(org.bukkit.entity.Entity) Mage(com.elmakers.mine.bukkit.magic.Mage) EventHandler(org.bukkit.event.EventHandler)

Example 25 with Mage

use of com.elmakers.mine.bukkit.magic.Mage in project MagicPlugin by elBukkit.

the class PlayerController method onProjectileLaunch.

@EventHandler
public void onProjectileLaunch(ProjectileLaunchEvent event) {
    if (launching || event.isCancelled())
        return;
    Projectile projectile = event.getEntity();
    ProjectileSource shooter = projectile.getShooter();
    // Not really handling magic mobs with magic bows...
    if (!(shooter instanceof Player))
        return;
    Player player = (Player) shooter;
    Mage mage = controller.getRegisteredMage(player);
    if (mage == null)
        return;
    Wand wand = mage.getActiveWand();
    if (wand == null)
        return;
    if (wand.getIcon().getMaterial() != Material.BOW)
        return;
    double minPull = wand.getDouble("cast_min_bowpull");
    double pull = Math.min(1.0, projectile.getVelocity().length() / MAX_ARROW_SPEED);
    if (minPull > 0 && pull < minPull) {
        if (wand.isInventoryOpen())
            event.setCancelled(true);
        return;
    }
    Spell spell = wand.getActiveSpell();
    if (spell == null) {
        if (wand.isInventoryOpen())
            event.setCancelled(true);
        return;
    }
    event.setCancelled(true);
    String[] parameters = { "bowpull", Double.toString(pull) };
    // prevent recursion!
    launching = true;
    try {
        wand.cast(parameters);
    } catch (Exception ex) {
        controller.getLogger().log(Level.SEVERE, "Error casting bow spell", ex);
    }
    launching = false;
}
Also used : Player(org.bukkit.entity.Player) Mage(com.elmakers.mine.bukkit.magic.Mage) Wand(com.elmakers.mine.bukkit.wand.Wand) ProjectileSource(org.bukkit.projectiles.ProjectileSource) Spell(com.elmakers.mine.bukkit.api.spell.Spell) Projectile(org.bukkit.entity.Projectile) EventHandler(org.bukkit.event.EventHandler)

Aggregations

Mage (com.elmakers.mine.bukkit.magic.Mage)27 EventHandler (org.bukkit.event.EventHandler)22 Player (org.bukkit.entity.Player)20 Wand (com.elmakers.mine.bukkit.wand.Wand)11 ItemStack (org.bukkit.inventory.ItemStack)11 Spell (com.elmakers.mine.bukkit.api.spell.Spell)5 GUIAction (com.elmakers.mine.bukkit.api.action.GUIAction)4 Messages (com.elmakers.mine.bukkit.api.magic.Messages)3 Entity (org.bukkit.entity.Entity)3 Inventory (org.bukkit.inventory.Inventory)3 PlayerInventory (org.bukkit.inventory.PlayerInventory)3 SpellTemplate (com.elmakers.mine.bukkit.api.spell.SpellTemplate)2 Item (org.bukkit.entity.Item)2 CraftingInventory (org.bukkit.inventory.CraftingInventory)2 UndoList (com.elmakers.mine.bukkit.api.block.UndoList)1 EntityData (com.elmakers.mine.bukkit.api.entity.EntityData)1 WandAction (com.elmakers.mine.bukkit.api.wand.WandAction)1 DropActionTask (com.elmakers.mine.bukkit.magic.DropActionTask)1 CompleteDragTask (com.elmakers.mine.bukkit.utility.CompleteDragTask)1 WandMode (com.elmakers.mine.bukkit.wand.WandMode)1