package joshie.progression.handlers;
import joshie.progression.api.ICustomDataBuilder;
import joshie.progression.api.IProgressionAPI;
import joshie.progression.api.criteria.*;
import joshie.progression.api.special.IRequestItem;
import joshie.progression.crafting.ActionType;
import joshie.progression.criteria.Condition;
import joshie.progression.criteria.Filter;
import joshie.progression.criteria.Reward;
import joshie.progression.criteria.Trigger;
import joshie.progression.criteria.rewards.RewardHurt;
import joshie.progression.helpers.CraftingHelper;
import joshie.progression.helpers.PlayerHelper;
import joshie.progression.network.PacketFireTrigger;
import joshie.progression.network.PacketHandler;
import joshie.progression.network.PacketRequestItem;
import joshie.progression.player.PlayerTracker;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.DamageSource;
import net.minecraftforge.fml.common.eventhandler.Event.Result;
import java.util.HashMap;
import java.util.UUID;
public class APIHandler implements IProgressionAPI {
//This is the registry for trigger type and reward type creation
public static final HashMap<String, ITriggerProvider> triggerTypes = new HashMap();
public static final HashMap<String, IRewardProvider> rewardTypes = new HashMap();
public static final HashMap<String, IConditionProvider> conditionTypes = new HashMap();
public static final HashMap<String, IFilterProvider> filterTypes = new HashMap();
@Override
//Fired Server Side only
public Result fireTrigger(UUID uuid, String string, Object... data) {
return PlayerTracker.getServerPlayer(uuid).getMappings().fireAllTriggers(string, data);
}
@Override
//Fired Server Side only
public Result fireTrigger(EntityPlayer player, String string, Object... data) {
if (!player.worldObj.isRemote) {
return fireTrigger(PlayerHelper.getUUIDForPlayer(player), string, data);
} else return Result.DEFAULT;
}
@Override
public void fireTriggerClientside(String trigger, Object... data) {
PacketHandler.sendToServer(new PacketFireTrigger(trigger, data));
}
@Override
public void forceComplete(ICriteria criteria) {
fireTriggerClientside("complete", criteria);
}
@Override
public void registerCustomDataBuilder(String trigger, ICustomDataBuilder builder) {
PacketFireTrigger.handlers.put(trigger, builder);
}
public static IConditionProvider registerConditionType(IRule rule, String unlocalised) {
try {
String name = "condition." + unlocalised;
IConditionProvider dummy = new Condition((ICondition)rule.getClass().newInstance(), name);
conditionTypes.put(name, dummy);
return dummy;
} catch (Exception e) {return null; }
}
public static ITriggerProvider registerTriggerType(IRule rule, String unlocalised, int color) {
try {
String name = "trigger." + unlocalised;
ITriggerProvider dummy = new Trigger((ITrigger)rule.getClass().newInstance(), name, color);
triggerTypes.put(name, dummy);
return dummy;
} catch (Exception e) { return null; }
}
public static IRewardProvider registerRewardType(IRule rule, String unlocalised, int color) {
try {
String name = "reward." + unlocalised;
IRewardProvider dummy = new Reward((IReward)rule.getClass().newInstance(), name, color);
rewardTypes.put(name, dummy);
return dummy;
} catch (Exception e) { return null; }
}
public static IFilterProvider registerFilterType(IRule rule, String unlocalised, int color) {
try {
IFilter filter = (IFilter)rule.getClass().newInstance();
String name = "filter." + filter.getType().getName() + "." + unlocalised;
IFilterProvider dummy = new Filter(filter, name, color);
filterTypes.put(name, dummy);
return dummy;
} catch (Exception e) { return null; }
}
@Override
public void registerDamageSource(DamageSource source) {
RewardHurt.sources.put(source.damageType, source);
}
@Override
public IAction registerActionType(String name) {
return new ActionType(name.toUpperCase()); //WOOT!
}
@Override
public void requestItem(IRequestItem reward, EntityPlayer player) {
PacketHandler.sendToClient(new PacketRequestItem(reward.getProvider().getUniqueID()), player);
}
@Override
public boolean canUseToPerformAction(String actionType, ItemStack stack, Object tileOrPlayer) {
ActionType type = ActionType.getCraftingActionFromName(actionType);
return CraftingHelper.canPerformActionAbstract(type, tileOrPlayer, stack);
}
}