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
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);
|
|
}
|
|
}
|
|
}
|