package cn.academy.misc.tutorial; import cn.lambdalib.annoreg.core.Registrant; import cn.lambdalib.annoreg.mc.RegInitCallback; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.PlayerEvent.ItemCraftedEvent; import cpw.mods.fml.common.gameevent.PlayerEvent.ItemPickupEvent; import cpw.mods.fml.common.gameevent.PlayerEvent.ItemSmeltedEvent; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.common.MinecraftForge; import java.util.ArrayList; import java.util.List; /** * Factory of various kinds of conditions. Condition can be only created from this class. */ @Registrant public class Conditions { private Conditions() {} private static final List<Condition> indexedConditions = new ArrayList<>(); private static final Multimap<Item, ItemInfo> craftConds = ArrayListMultimap.create(), smeltConds = ArrayListMultimap.create(), pickupConds = ArrayListMultimap.create(); public static Condition alwaysTrue() { return player -> true; } public static Condition itemCrafted(Item item) { return itemCrafted(item, -1); } public static Condition itemCrafted(Item item, int meta) { return createItemMapped(craftConds, item, meta); } public static Condition itemSmelted(Item item) { return itemSmelted(item, -1); } public static Condition itemSmelted(Item item, int meta) { return createItemMapped(smeltConds, item, meta); } public static Condition itemPickup(Item item) { return itemPickup(item, -1); } public static Condition itemPickup(Item item, int meta) { return createItemMapped(pickupConds, item, meta); } public static Condition itemObtained(Item item) { return itemCrafted(item).or(itemPickup(item)).or(itemSmelted(item)); } public static Condition itemObtained(Item item, int meta) { return itemCrafted(item, meta).or(itemPickup(item, meta)).or(itemSmelted(item, meta)); } public static Condition itemObtained(Block block) { return itemObtained(Item.getItemFromBlock(block)); } public static Condition itemObtained(Block block, int meta) { return itemObtained(Item.getItemFromBlock(block), meta); } private static IndexedCondition indexed() { int idx = indexedConditions.size(); IndexedCondition ret = new IndexedCondition(idx); indexedConditions.add(ret); return ret; } private static Condition createItemMapped(Multimap<Item, ItemInfo> map, Item item, int meta) { IndexedCondition ret = indexed(); map.put(item, new ItemInfo(ret, item, meta)); return ret; } private static class IndexedCondition implements Condition { final int index; IndexedCondition(int idx) { index = idx; } @Override public boolean test(EntityPlayer entityPlayer) { return TutorialData.get(entityPlayer).isCondActivate(index); } } private static class ItemInfo { public final IndexedCondition cond; public final Item item; public final int meta; public ItemInfo(IndexedCondition cond, Item item, int meta) { this.cond = cond; this.item = item; this.meta = meta; } public boolean metaSensitive() { return meta != -1; } } @RegInitCallback private static void _init() { Conditions instance = new Conditions(); MinecraftForge.EVENT_BUS.register(instance); FMLCommonHandler.instance().bus().register(instance); } @SubscribeEvent public void onItemSmelt(ItemSmeltedEvent evt) { trigger(smeltConds, evt.smelting, evt.player); } @SubscribeEvent public void onItemCraft(ItemCraftedEvent evt) { trigger(craftConds, evt.crafting, evt.player); } @SubscribeEvent public void onItemPickup(ItemPickupEvent evt) { trigger(pickupConds, evt.pickedUp.getEntityItem(), evt.player); } private void trigger(Multimap<Item, ItemInfo> map, ItemStack stack, EntityPlayer player) { if (!player.worldObj.isRemote) { TutorialData tdata = TutorialData.get(player); map.get(stack.getItem()) .stream() .filter(info -> !info.metaSensitive() || stack.getItemDamage() == info.meta) .forEach(info -> { tdata.setCondActivate(info.cond.index); }); } } }