/**
* Copyright (c) Lambda Innovation, 2013-2016
* This file is part of the AcademyCraft mod.
* https://github.com/LambdaInnovation/AcademyCraft
* Licensed under GPLv3, see project root for more information.
*/
package cn.academy.misc.achievements;
import cn.academy.ability.api.Category;
import cn.academy.ability.api.Skill;
import cn.academy.ability.api.data.AbilityData;
import cn.academy.ability.api.event.LevelChangeEvent;
import cn.academy.ability.api.event.SkillLearnEvent;
import cn.academy.crafting.api.event.MatterUnitHarvestEvent;
import cn.academy.misc.achievements.aches.*;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.PlayerEvent;
import cpw.mods.fml.common.gameevent.PlayerEvent.ItemCraftedEvent;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.MinecraftForge;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
/**
* @author EAirPeter
*/
public final class DispatcherAch {
public static final DispatcherAch INSTANCE = new DispatcherAch();
//cpw.mods.fml.common.gameevent.PlayerEvent.ItemCraftedEvent
private final HashMap<Item, HashSet<AchEvItemCrafted>> hcItemCrafted = new HashMap<Item, HashSet<AchEvItemCrafted>>();
public void rgItemCrafted(Item item, AchEvItemCrafted ach) {
if (hcItemCrafted.containsKey(item))
hcItemCrafted.get(item).add(ach);
else {
HashSet<AchEvItemCrafted> set = new HashSet<AchEvItemCrafted>();
set.add(ach);
hcItemCrafted.put(item, set);
}
hcItemCrafted.get(item).add(ach);
}
public void urItemCrafted(Item item, AchEvItemCrafted ach) {
HashSet<AchEvItemCrafted> set = hcItemCrafted.get(item);
if (set != null)
set.remove(ach);
}
@SubscribeEvent
public void onItemCrafted(ItemCraftedEvent event) {
HashSet<AchEvItemCrafted> set = hcItemCrafted.get(event.crafting.getItem());
if (set != null)
for (AchEvItemCrafted a : set)
if (a.accept(event))
event.player.triggerAchievement(a);
}
//cn.academy.ability.api.event.LevelChangeEvent
private final HashMap<Category, AchEvLevelChange[]> hcLevelChange = new HashMap<>();
public void rgLevelChange(Category cat, int lv, AchEvLevelChange ach) {
if (hcLevelChange.containsKey(cat))
hcLevelChange.get(cat)[lv - 1] = ach;
else {
AchEvLevelChange[] arr = new AchEvLevelChange[5];
arr[lv - 1] = ach;
hcLevelChange.put(cat, arr);
}
}
public void urLevelChange(Category cat, int lv) {
AchEvLevelChange[] arr = hcLevelChange.get(cat);
if (arr != null)
arr[lv - 1] = null;
}
@SubscribeEvent
public void onLevelChange(LevelChangeEvent event) {
AbilityData data = AbilityData.get(event.player);
if (data.hasCategory()) {
int xlv = data.getLevel() - 1;
AchEvLevelChange[] arr = hcLevelChange.get(data.getCategory());
if (arr != null && xlv >= 0 && arr[xlv] != null && arr[xlv].accept(event))
event.player.triggerAchievement(arr[xlv]);
}
}
//cn.academy.crafting.api.event.MatterUnitHarvestEvent
private final HashMap<Block, AchEvMatterUnitHarvest> hcMatterUnitHarvest = new HashMap<Block, AchEvMatterUnitHarvest>();
public void rgMatterUnitHarvest(Block blo, AchEvMatterUnitHarvest ach) {
hcMatterUnitHarvest.put(blo, ach);
}
public void urMatterUnitHarvest(Block blo) {
hcMatterUnitHarvest.remove(blo);
}
@SubscribeEvent
public void onMatterUnitHarvest(MatterUnitHarvestEvent event) {
AchEvMatterUnitHarvest ach = hcMatterUnitHarvest.get(event.mat.block);
if (ach != null && ach.accept(event))
event.player.triggerAchievement(ach);
}
//cn.academy.ability.api.event.SkillLearnEvent
private final HashMap<Skill, AchEvSkillLearn> hcSkillLearn = new HashMap<Skill, AchEvSkillLearn>();
public void rgSkillLearn(Skill skill, AchEvSkillLearn ach) {
hcSkillLearn.put(skill, ach);
}
public void urSkillLearn(Skill skill) {
hcSkillLearn.remove(skill);
}
@SubscribeEvent
public void onSkillLearn(SkillLearnEvent event) {
AchEvSkillLearn ach = hcSkillLearn.get(event.skill);//CHANGED HERE
if (ach != null && ach.accept(event))
event.player.triggerAchievement(ach);
}
//cpw.mods.fml.common.gameevent.PlayerEvent.ItemPickupEvent
private final Map<Item, AchEvItemPickup> hcPlayerPickup = new HashMap();
public void rgPlayerPickup(ItemStack stack, AchEvItemPickup ach) {
hcPlayerPickup.put(stack.getItem(), ach);
}
@SubscribeEvent
public void onPlayerPickup(PlayerEvent.ItemPickupEvent event) {
ItemStack stack = event.pickedUp.getEntityItem();
AchEvItemPickup ach = hcPlayerPickup.get(stack.getItem());
if(ach != null && ach.accept(event)) {
event.player.triggerAchievement(ach);
}
}
//Init
private DispatcherAch() {
FMLCommonHandler.instance().bus().register(this);
MinecraftForge.EVENT_BUS.register(this);
}
//stub method for loading
public static void init() {
}
}