package tc.oc.pgm.itemmeta;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockDispenseEvent;
import org.bukkit.event.entity.ItemSpawnEvent;
import org.bukkit.event.inventory.CraftItemEvent;
import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.event.inventory.PrepareItemCraftEvent;
import org.bukkit.event.player.PlayerPickupArrowEvent;
import org.bukkit.inventory.ItemStack;
import tc.oc.pgm.events.ListenerScope;
import tc.oc.pgm.match.Match;
import tc.oc.pgm.match.MatchModule;
import tc.oc.pgm.match.MatchScope;
@ListenerScope(MatchScope.LOADED)
public class ItemModifyMatchModule extends MatchModule implements Listener {
private final ItemModifyModule imm;
public ItemModifyMatchModule(Match match) {
super(match);
this.imm = match.getModuleContext().needModule(ItemModifyModule.class);
}
private boolean applyRules(ItemStack stack) {
return imm.applyRules(stack);
}
@EventHandler
public void onItemSpawn(ItemSpawnEvent event) {
ItemStack stack = event.getEntity().getItemStack();
if(applyRules(stack)) {
event.getEntity().setItemStack(stack);
}
}
@EventHandler
public void onItemCraft(CraftItemEvent event) {
ItemStack stack = event.getCurrentItem();
if(applyRules(stack)) {
event.setCurrentItem(stack);
event.getInventory().setResult(stack);
}
}
@EventHandler
public void onPrepareItemCraft(PrepareItemCraftEvent event) {
ItemStack stack = event.getInventory().getResult();
if(applyRules(stack)) {
event.getInventory().setResult(stack);
}
}
@EventHandler
public void onInventoryOpen(InventoryOpenEvent event) {
event.getInventory().contents().forEach(this::applyRules);
}
@EventHandler
public void onArmorDispense(BlockDispenseEvent event) {
// This covers armor being equipped by a dispenser, which does not call any of the other events
ItemStack stack = event.getItem();
if(applyRules(stack)) {
event.setItem(stack);
}
}
@EventHandler
public void onArrowPickup(PlayerPickupArrowEvent event) {
// Only needed for players picking up arrows stuck in blocks
final ItemStack item = event.getItem().getItemStack();
if(applyRules(item)) {
event.getItem().setItemStack(item);
}
}
}