2
0
Fork 0
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
3.7 KiB
Java

package com.zivilon.cinder_loe.mixins;
import com.zivilon.cinder_loe.util.DurableItemCrafter;
import cpw.mods.fml.common.FMLCommonHandler;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.SlotCrafting;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent;
import org.spongepowered.asm.mixin.Dynamic;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Overwrite;
import com.zivilon.cinder_loe.CinderLoE;
@Mixin(SlotCrafting.class)
public abstract class MixinSlotCrafting {
@Shadow
private final IInventory craftMatrix;
@Shadow
private EntityPlayer thePlayer;
@Shadow
protected void onCrafting(ItemStack p_75210_1_) {}
public MixinSlotCrafting() {
craftMatrix = null;
}
/**
* @author Shinare
* @reason Added support for crafting with item durability. To register items for durability crafting, refer to com.zivilon.cinder_loe.util.DurableItemCrafter
*/
@Overwrite
public void onPickupFromSlot(EntityPlayer p_82870_1_, ItemStack p_82870_2_) {
FMLCommonHandler.instance().firePlayerCraftingEvent(p_82870_1_, p_82870_2_, craftMatrix);
onCrafting(p_82870_2_);
boolean hasExceptionItem = false;
int arrow_count = 0;
for (int i = 0; i < craftMatrix.getSizeInventory(); ++i) {
ItemStack itemstack1 = craftMatrix.getStackInSlot(i);
if (itemstack1 != null && DurableItemCrafter.exceptionItems.contains(itemstack1.getItem())) {
hasExceptionItem = true;
}
if (itemstack1 != null && itemstack1.getItem() == Items.arrow) {
arrow_count++;
}
}
for (int i = 0; i < craftMatrix.getSizeInventory(); ++i) {
ItemStack itemstack1 = craftMatrix.getStackInSlot(i);
if (itemstack1 != null) {
if (!hasExceptionItem && DurableItemCrafter.customItems.contains(itemstack1.getItem())) {
damage_item(itemstack1, i, 1, craftMatrix);
} else {
craftMatrix.decrStackSize(i, 1);
}
if (itemstack1 != null && itemstack1.getItem().hasContainerItem(itemstack1)) {
ItemStack itemstack2 = itemstack1.getItem().getContainerItem(itemstack1);
if (itemstack2 != null && itemstack2.isItemStackDamageable() && itemstack2.getItemDamage() > itemstack2.getMaxDamage()) {
MinecraftForge.EVENT_BUS.post(new PlayerDestroyItemEvent(thePlayer, itemstack2));
continue;
}
if (!itemstack1.getItem().doesContainerItemLeaveCraftingGrid(itemstack1) || !thePlayer.inventory.addItemStackToInventory(itemstack2)) {
if (craftMatrix.getStackInSlot(i) == null) {
craftMatrix.setInventorySlotContents(i, itemstack2);
} else {
thePlayer.dropPlayerItemWithRandomChoice(itemstack2, false);
}
}
}
}
}
}
@Dynamic
public void damage_item(ItemStack item, int i, int damage, IInventory matrix) {
item.setItemDamage(item.getItemDamage() + damage);
if (item.getItemDamage() >= item.getMaxDamage()) {
matrix.setInventorySlotContents(i, null); // Item breaks and is removed
} else {
matrix.setInventorySlotContents(i, item);
}
}
}