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);
}
}
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;
}
}
}
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();
}
}
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);
}
}
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;
}
Aggregations