package chbachman.armour.handler;
import chbachman.api.item.IModularItem;
import chbachman.api.nbt.helper.NBTHelper;
import chbachman.api.registry.UpgradeRegistry;
import chbachman.api.upgrade.IUpgrade;
import chbachman.api.upgrade.Recipe;
import chbachman.api.util.ArmourSlot;
import chbachman.armour.network.ArmourPacket;
import chbachman.armour.network.ArmourPacket.PacketTypes;
import chbachman.armour.register.Vanilla;
import chbachman.armour.util.InventoryUtil;
import chbachman.armour.util.MiscUtil;
import cofh.core.network.PacketHandler;
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 cpw.mods.fml.common.gameevent.TickEvent.PlayerTickEvent;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.EntityEvent.EntityConstructing;
/**
* Generic event handler, used for onEquip and onDequip methods.
*
* @author Chbachman
*
*/
public class GenericEventHandler {
public static void register() {
new GenericEventHandler();
}
public GenericEventHandler() {
MinecraftForge.EVENT_BUS.register(this);
FMLCommonHandler.instance().bus().register(this);
}
@SubscribeEvent
public void onEntityConstructing(EntityConstructing event) {
if (event.entity instanceof EntityPlayer && PlayerArmour.getFor((EntityPlayer) event.entity) == null) {
EntityPlayer player = (EntityPlayer) event.entity;
PlayerArmour.register(player);
}
}
@SubscribeEvent
public void onCraft(ItemCraftedEvent e) {
PlayerArmour storage = PlayerArmour.getFor(e.player);
if (!storage.hasCraftedArmour) {
if (e.crafting.getItem() instanceof IModularItem) {
storage.hasCraftedArmour = true;
InventoryUtil.givePlayerItem(e.player, Vanilla.defaultTablet);
}
}
}
@SubscribeEvent
public void onPlayerTick(PlayerTickEvent e) {
EntityPlayer player = e.player;
PlayerArmour storage = PlayerArmour.getFor(player);
ItemStack[] armourList = player.inventory.armorInventory;
for (int i = 0; i < armourList.length; i++) {
ItemStack playerStack = armourList[i];
ItemStack storedStack = storage.stacks[i];
if (!InventoryUtil.itemMatches(playerStack, storedStack, false)) {
if (playerStack != null && playerStack.getItem() instanceof IModularItem) {
((IModularItem) playerStack.getItem()).onArmourEquip(player.worldObj, player, playerStack);
}
if (storedStack != null && storedStack.getItem() instanceof IModularItem) {
((IModularItem) storedStack.getItem()).onArmourDequip(player.worldObj, player, storedStack);
}
}
}
storage.update(armourList);
}
@SubscribeEvent
public void onPlayerJoinWorld(PlayerEvent.PlayerLoggedInEvent e) {
for (ItemStack stack : e.player.inventory.armorInventory) {
if (stack != null && stack.getItem() instanceof IModularItem) {
NBTHelper.createDefaultStackTag(stack);
IModularItem armour = (IModularItem) stack.getItem();
for (IUpgrade upgrade : NBTHelper.getNBTUpgradeList(stack.stackTagCompound)) {
if (upgrade == null) {
continue;
}
upgrade.onEquip(e.player.worldObj, e.player, stack, ArmourSlot.getArmourSlot(armour.getSlot()));
}
}
}
if (MiscUtil.isServer(e.player)) {
ArmourPacket packet = ArmourPacket.getPacket(PacketTypes.RECIPESYNC);
packet.addInt(UpgradeRegistry.getRecipeList().size());
for (Recipe recipe : UpgradeRegistry.getRecipeList()) {
for (Object obj : recipe.getInput()) {
if (obj instanceof String) {
packet.addByte(1);
packet.addString((String) obj);
} else if (obj instanceof ItemStack) {
packet.addByte(2);
packet.addItemStack((ItemStack) obj);
} else if (obj == null) {
packet.addByte(3);
}
}
packet.addString(recipe.getRecipeOutput().getBaseName());
packet.addInt(recipe.width);
packet.addInt(recipe.height);
}
PacketHandler.sendTo(packet, e.player);
}
}
}