/*
* This file is part of Skript.
*
* Skript is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Skript is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Skript. If not, see <http://www.gnu.org/licenses/>.
*
*
* Copyright 2011-2014 Peter Güttinger
*
*/
package ch.njol.skript.events;
import org.bukkit.event.Event;
import org.bukkit.event.block.BlockDispenseEvent;
import org.bukkit.event.entity.ItemSpawnEvent;
import org.bukkit.event.inventory.CraftItemEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerItemConsumeEvent;
import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.inventory.ItemStack;
import org.eclipse.jdt.annotation.Nullable;
import ch.njol.skript.Skript;
import ch.njol.skript.aliases.ItemType;
import ch.njol.skript.lang.Literal;
import ch.njol.skript.lang.SkriptEvent;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.util.Checker;
/**
* @author Peter Güttinger
*/
public class EvtItem extends SkriptEvent {
private final static boolean hasConsumeEvent = Skript.classExists("org.bukkit.event.player.PlayerItemConsumeEvent");
static {
Skript.registerEvent("Dispense", EvtItem.class, BlockDispenseEvent.class, "dispens(e|ing) [[of] %itemtypes%]")
.description("Called when a dispenser dispenses an item.")
.examples("")
.since("");
Skript.registerEvent("Item Spawn", EvtItem.class, ItemSpawnEvent.class, "item spawn[ing] [[of] %itemtypes%]")
.description("Called whenever an item stack is spawned in a world, e.g. as drop of a block or mob, a player throwing items out of his inventory, or a dispenser dispensing an item (not shooting it).")
.examples("")
.since("");
Skript.registerEvent("Drop", EvtItem.class, PlayerDropItemEvent.class, "[player] drop[ing] [[of] %itemtypes%]")
.description("Called when a player drops an item from his inventory.")
.examples("")
.since("");
// TODO limit to InventoryAction.PICKUP_* and similar (e.g. COLLECT_TO_CURSOR)
Skript.registerEvent("Craft", EvtItem.class, CraftItemEvent.class, "[player] craft[ing] [[of] %itemtypes%]")
.description("Called when a player crafts an item.")
.examples("")
.since("");
Skript.registerEvent("Pick Up", EvtItem.class, PlayerPickupItemEvent.class, "[player] (pick[ ]up|picking up) [[of] %itemtypes%]")
.description("Called when a player picks up an item. Please note that the item is still on the ground when this event is called.")
.examples("")
.since("");
// TODO brew event
// Skript.registerEvent("Brew", EvtItem.class, BrewEvent.class, "brew[ing] [[of] %itemtypes%]")
// .description("Called when a potion finished brewing.")
// .examples("")
// .since("2.0");
if (hasConsumeEvent) {
Skript.registerEvent("Consume", EvtItem.class, PlayerItemConsumeEvent.class, "[player] ((eat|drink)[ing]|consum(e|ing)) [[of] %itemtypes%]")
.description("Called when a player is done eating/drinking something, e.g. an apple, bread, meat, milk or a potion.")
.examples("")
.since("2.0");
}
}
@Nullable
private Literal<ItemType> types;
@SuppressWarnings("unchecked")
@Override
public boolean init(final Literal<?>[] args, final int matchedPattern, final ParseResult parser) {
types = (Literal<ItemType>) args[0];
return true;
}
@SuppressWarnings("null")
@Override
public boolean check(final Event e) {
if (types == null)
return true;
final ItemStack is;
if (e instanceof BlockDispenseEvent) {
is = ((BlockDispenseEvent) e).getItem();
} else if (e instanceof ItemSpawnEvent) {
is = ((ItemSpawnEvent) e).getEntity().getItemStack();
} else if (e instanceof PlayerDropItemEvent) {
is = ((PlayerDropItemEvent) e).getItemDrop().getItemStack();
} else if (e instanceof CraftItemEvent) {
is = ((CraftItemEvent) e).getRecipe().getResult();
} else if (e instanceof PlayerPickupItemEvent) {
is = ((PlayerPickupItemEvent) e).getItem().getItemStack();
} else if (hasConsumeEvent && e instanceof PlayerItemConsumeEvent) {
is = ((PlayerItemConsumeEvent) e).getItem();
// } else if (e instanceof BrewEvent)
// is = ((BrewEvent) e).getContents().getContents()
} else {
assert false;
return false;
}
return types.check(e, new Checker<ItemType>() {
@Override
public boolean check(final ItemType t) {
return t.isOfType(is);
}
});
}
@Override
public String toString(final @Nullable Event e, final boolean debug) {
return "dispense/spawn/drop/craft/pickup/consume/break" + (types == null ? "" : " of " + types);
}
}