package joshie.progression.criteria.triggers;
import joshie.progression.Progression;
import joshie.progression.api.ProgressionAPI;
import joshie.progression.api.criteria.IField;
import joshie.progression.api.criteria.IFilterProvider;
import joshie.progression.api.criteria.ITrigger;
import joshie.progression.api.criteria.ProgressionRule;
import joshie.progression.api.special.DisplayMode;
import joshie.progression.api.special.IClickable;
import joshie.progression.api.special.IMiniIcon;
import joshie.progression.api.special.ISpecialFieldProvider;
import joshie.progression.plugins.jei.ProgressionJEI;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.fml.common.Optional;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.PlayerEvent.ItemCraftedEvent;
import java.util.List;
import java.util.UUID;
import static joshie.progression.ItemProgression.ItemMeta.craft;
import static joshie.progression.ItemProgression.getStackFromMeta;
@Optional.Interface(iface = "joshie.progression.api.special.IClickable", modid = "JEI")
@ProgressionRule(name="crafting", color=0xFF663300)
public class TriggerCrafting extends TriggerBaseItemFilter implements IClickable, IMiniIcon, ISpecialFieldProvider {
private static final ItemStack mini = getStackFromMeta(craft);
public int timesCrafted = 1;
protected transient int timesItemCrafted;
@Override
public ITrigger copy() {
TriggerCrafting trigger = new TriggerCrafting();
trigger.timesCrafted = timesCrafted;
return copyCounter(copyFilter(trigger));
}
@Override
public ItemStack getMiniIcon() {
return mini;
}
@Override
public String getDescription() {
return Progression.format("trigger.crafting.description", amount);
}
@Optional.Method(modid = "JEI")
@Override
public boolean onClicked(ItemStack stack) {
try {
ProgressionJEI.runtime.showRecipes(stack);
return true;
} catch (Exception e) { e.printStackTrace(); }
return false;
}
@Override
public void addSpecialFields(List<IField> fields, DisplayMode mode) {
if (mode == DisplayMode.EDIT) fields.add(ProgressionAPI.fields.getItemPreview(this, "filters", 30, 35, 1.9F));
else fields.add(ProgressionAPI.fields.getItemPreview(this, "filters", 65, 35, 1.9F));
}
@SubscribeEvent
public void onEvent(ItemCraftedEvent event) {
ItemStack result = event.crafting.copy();
if (result.stackSize != 0) {
ProgressionAPI.registry.fireTrigger(event.player, getProvider().getUnlocalisedName(), event.crafting.copy());
}
}
@Override
public boolean isCompleted() {
return counter >= amount && timesItemCrafted >= timesCrafted;
}
@Override
public boolean onFired(UUID uuid, Object... additional) {
ItemStack crafted = (ItemStack) (additional[0]);
for (IFilterProvider filter : filters) {
if (filter.getProvided().matches(crafted)) {
counter += crafted.stackSize;
timesItemCrafted++;
return true;
}
}
return true;
}
@Override
public void readDataFromNBT(NBTTagCompound tag) {
super.readDataFromNBT(tag);
timesItemCrafted = tag.getInteger("Times");
}
@Override
public void writeDataToNBT(NBTTagCompound tag) {
super.writeDataToNBT(tag);
tag.setInteger("Times", timesItemCrafted);
}
}