Search in sources :

Example 1 with CauldronContents

use of pl.asie.charset.module.crafting.cauldron.api.CauldronContents in project Charset by CharsetMC.

the class RecipeDyeItem method apply.

@Override
public Optional<CauldronContents> apply(ICauldron cauldron, CauldronContents contents) {
    if (!contents.hasFluidStack() || !contents.hasHeldItem()) {
        return Optional.empty();
    }
    FluidStack stack = contents.getFluidStack();
    ItemStack heldItem = contents.getHeldItem();
    if (stack.getFluid() == CharsetCraftingCauldron.dyedWater && stack.tag != null && stack.amount >= 125 && stack.tag.hasKey("dyes", Constants.NBT.TAG_LIST)) {
        NBTTagList dyes = (NBTTagList) stack.tag.getTag("dyes");
        ItemStack[] stacks = new ItemStack[9];
        stacks[0] = heldItem.copy();
        stacks[0].setCount(1);
        for (int i = 0; i < 8; i++) {
            if (i < dyes.tagCount()) {
                stacks[i + 1] = new ItemStack(Items.DYE, 1, 15 - ((NBTPrimitive) dyes.get(i)).getByte());
            } else {
                stacks[i + 1] = ItemStack.EMPTY;
            }
        }
        ItemStack result = FastRecipeLookup.getCraftingResult(RecipeUtils.getCraftingInventory(3, 3, stacks), cauldron.getCauldronWorld());
        if (!result.isEmpty() && !ItemUtils.canMerge(stacks[0], result)) {
            return Optional.of(new CauldronContents(new FluidStack(stack, stack.amount - 125), result));
        }
    }
    return Optional.empty();
}
Also used : NBTTagList(net.minecraft.nbt.NBTTagList) CauldronContents(pl.asie.charset.module.crafting.cauldron.api.CauldronContents) FluidStack(net.minecraftforge.fluids.FluidStack) ItemStack(net.minecraft.item.ItemStack)

Example 2 with CauldronContents

use of pl.asie.charset.module.crafting.cauldron.api.CauldronContents in project Charset by CharsetMC.

the class RecipeDyeItemPure method apply.

@Override
public Optional<CauldronContents> apply(ICauldron cauldron, CauldronContents contents) {
    if (!contents.hasFluidStack() || !contents.hasHeldItem()) {
        return Optional.empty();
    }
    FluidStack stack = contents.getFluidStack();
    ItemStack heldItem = contents.getHeldItem();
    if (stack.getFluid() == CharsetCraftingCauldron.dyedWater && stack.tag != null && stack.amount >= 125 && stack.tag.hasKey("dyes", Constants.NBT.TAG_LIST)) {
        NBTTagList dyes = (NBTTagList) stack.tag.getTag("dyes");
        boolean isImpure = dyes.tagCount() > 1;
        ItemStack[] stacks = new ItemStack[9];
        stacks[0] = heldItem.copy();
        stacks[0].setCount(1);
        for (int i = 1; i <= 8; i++) {
            if (i == 4)
                continue;
            stacks[i] = stacks[0];
        }
        stacks[4] = new ItemStack(Items.DYE, 1, 15 - ((NBTPrimitive) dyes.get(0)).getByte());
        ItemStack result = FastRecipeLookup.getCraftingResult(RecipeUtils.getCraftingInventory(3, 3, stacks), cauldron.getCauldronWorld());
        int expectedCount = 8;
        if (result.isEmpty()) {
            stacks = new ItemStack[2];
            stacks[0] = heldItem.copy();
            stacks[0].setCount(1);
            stacks[1] = new ItemStack(Items.DYE, 1, 15 - ((NBTPrimitive) dyes.get(0)).getByte());
            result = FastRecipeLookup.getCraftingResult(RecipeUtils.getCraftingInventory(2, 1, stacks), cauldron.getCauldronWorld());
            expectedCount = 1;
        }
        if (!result.isEmpty() && result.getCount() == expectedCount && !ItemUtils.canMerge(stacks[0], result)) {
            if (isImpure) {
                // TODO
                return Optional.empty();
            // return Optional.of(new CauldronContents(new TextComponentTranslation("notice.charset.cauldron.dye_impure")));
            } else {
                ItemStack result1 = result.copy();
                result1.setCount(1);
                return Optional.of(new CauldronContents(new FluidStack(stack, stack.amount - 125), result1));
            }
        }
    }
    return Optional.empty();
}
Also used : NBTTagList(net.minecraft.nbt.NBTTagList) CauldronContents(pl.asie.charset.module.crafting.cauldron.api.CauldronContents) FluidStack(net.minecraftforge.fluids.FluidStack) ItemStack(net.minecraft.item.ItemStack)

Example 3 with CauldronContents

use of pl.asie.charset.module.crafting.cauldron.api.CauldronContents in project Charset by CharsetMC.

the class BlockCauldronCharset method onEntityCollidedWithBlock.

@Override
public void onEntityCollidedWithBlock(World worldIn, BlockPos pos, IBlockState state, Entity entityIn) {
    if (!worldIn.isRemote) {
        TileEntity tile = worldIn.getTileEntity(pos);
        if (tile instanceof TileCauldronCharset) {
            FluidStack stack = ((TileCauldronCharset) tile).getContents();
            float height = (float) pos.getY() + ((TileCauldronCharset) tile).getFluidHeight() / 16.0F;
            if (stack != null && stack.amount > 0 && entityIn.getEntityBoundingBox().minY <= height) {
                if (stack.getFluid() == FluidRegistry.LAVA) {
                    if (!entityIn.isBurning() && stack.amount >= 100 && !entityIn.isImmuneToFire()) {
                        entityIn.setFire(stack.amount / 100);
                        return;
                    }
                } else if (stack.getFluid() == FluidRegistry.WATER) {
                    if (entityIn.isBurning() && stack.amount >= 250) {
                        entityIn.extinguish();
                        ((TileCauldronCharset) tile).drain(250, true);
                        return;
                    }
                }
                if (entityIn instanceof EntityItem) {
                    EntityItem entityItem = (EntityItem) entityIn;
                    ItemStack heldItem = entityItem.getItem();
                    if (!heldItem.isEmpty()) {
                        ItemStack heldItemOne = heldItem.copy();
                        heldItemOne.setCount(1);
                        Optional<CauldronContents> contentsNew = Optional.empty();
                        Optional<ItemStack> fluidResult = FluidUtils.handleTank((IFluidHandler) tile, stack, worldIn, pos, heldItemOne, false, true, false);
                        if (fluidResult.isPresent()) {
                            contentsNew = Optional.of(new CauldronContents(((TileCauldronCharset) tile).getContents(), fluidResult.get()));
                        }
                        if (!contentsNew.isPresent()) {
                            contentsNew = CharsetCraftingCauldron.craft((ICauldron) tile, new CauldronContents(CauldronContents.Source.ENTITY, stack, heldItemOne));
                        }
                        if (contentsNew.isPresent()) {
                            CauldronContents cc = contentsNew.get();
                            if (cc.hasResponse()) {
                                new Notice(tile, cc.getResponse()).sendToAll();
                            } else {
                                if (cc.getHeldItem().isEmpty()) {
                                    heldItem.shrink(1);
                                } else if (cc.getHeldItem().getCount() == 1 && ItemUtils.canMerge(cc.getHeldItem(), heldItem)) {
                                // pass
                                } else {
                                    heldItem.shrink(1);
                                    ItemUtils.spawnItemEntity(worldIn, entityItem.getPositionVector(), cc.getHeldItem(), 0, 0, 0, 0);
                                }
                                ((TileCauldronCharset) tile).setContents(cc.getFluidStack());
                            }
                        }
                    }
                }
            }
        }
    }
}
Also used : TileEntity(net.minecraft.tileentity.TileEntity) Notice(pl.asie.charset.lib.notify.Notice) CauldronContents(pl.asie.charset.module.crafting.cauldron.api.CauldronContents) FluidStack(net.minecraftforge.fluids.FluidStack) ItemStack(net.minecraft.item.ItemStack) ICauldron(pl.asie.charset.module.crafting.cauldron.api.ICauldron) EntityItem(net.minecraft.entity.item.EntityItem)

Example 4 with CauldronContents

use of pl.asie.charset.module.crafting.cauldron.api.CauldronContents in project Charset by CharsetMC.

the class BlockCauldronCharset method onBlockActivated.

@Override
public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
    TileEntity tankEntity = worldIn.getTileEntity(pos);
    ItemStack heldItem = playerIn.getHeldItem(hand);
    if (heldItem.isEmpty()) {
        notice(worldIn, tankEntity, playerIn);
        return true;
    }
    if (isEmptyOrWater(worldIn, pos)) {
        if (super.onBlockActivated(worldIn, pos, state, playerIn, hand, facing, hitX, hitY, hitZ)) {
            return true;
        }
    }
    if (hand != EnumHand.MAIN_HAND) {
        return false;
    }
    if (tankEntity instanceof TileCauldronCharset) {
        if (FluidUtils.handleTank((IFluidHandler) tankEntity, ((TileCauldronCharset) tankEntity).getContents(), worldIn, pos, playerIn, hand)) {
            return true;
        }
        if (!heldItem.isEmpty()) {
            FluidStack stack = ((TileCauldronCharset) tankEntity).getContents();
            ItemStack heldItemOne = heldItem.copy();
            heldItemOne.setCount(1);
            Optional<CauldronContents> contentsNew = CharsetCraftingCauldron.craft((ICauldron) tankEntity, new CauldronContents(CauldronContents.Source.HAND, stack, heldItemOne));
            if (contentsNew.isPresent()) {
                if (!worldIn.isRemote) {
                    boolean success = false;
                    CauldronContents cc = contentsNew.get();
                    if (cc.hasResponse()) {
                        new Notice(tankEntity, cc.getResponse()).sendTo(playerIn);
                    } else {
                        if (cc.getHeldItem().isEmpty()) {
                            if (!playerIn.isCreative()) {
                                heldItem.shrink(1);
                            }
                            success = true;
                        } else if (cc.getHeldItem().getCount() == 1 && ItemUtils.canMerge(cc.getHeldItem(), heldItem)) {
                            success = true;
                        } else if (heldItem.getCount() > 1) {
                            if (playerIn.inventory.addItemStackToInventory(cc.getHeldItem())) {
                                heldItem.shrink(1);
                                success = true;
                            }
                        } else if (heldItem.getCount() == 1) {
                            playerIn.setHeldItem(hand, cc.getHeldItem());
                            success = true;
                        }
                        if (success) {
                            ((TileCauldronCharset) tankEntity).setContents(cc.getFluidStack());
                        }
                    }
                }
                return true;
            }
        }
    }
    if (!playerIn.isSneaking()) {
        notice(worldIn, tankEntity, playerIn);
        return true;
    }
    return false;
}
Also used : TileEntity(net.minecraft.tileentity.TileEntity) Notice(pl.asie.charset.lib.notify.Notice) CauldronContents(pl.asie.charset.module.crafting.cauldron.api.CauldronContents) FluidStack(net.minecraftforge.fluids.FluidStack) ItemStack(net.minecraft.item.ItemStack)

Example 5 with CauldronContents

use of pl.asie.charset.module.crafting.cauldron.api.CauldronContents in project Charset by CharsetMC.

the class RecipeBucketCraft method apply.

@Override
public Optional<CauldronContents> apply(ICauldron cauldron, CauldronContents contents) {
    if (!contents.hasFluidStack() || !contents.hasHeldItem()) {
        return Optional.empty();
    }
    FluidStack stack = contents.getFluidStack();
    ItemStack heldItem = contents.getHeldItem();
    if (stack.amount >= Fluid.BUCKET_VOLUME) {
        ItemStack filledBucket = FluidUtil.getFilledBucket(stack);
        InventoryCrafting inventoryCrafting = RecipeUtils.getCraftingInventory(2, 1, heldItem, filledBucket);
        IRecipe recipe = FastRecipeLookup.findMatchingRecipe(inventoryCrafting, cauldron.getCauldronWorld());
        if (recipe != null) {
            ItemStack result = recipe.getCraftingResult(inventoryCrafting);
            if (!result.isEmpty() && !ItemUtils.canMerge(heldItem, result)) {
                NonNullList<ItemStack> stacks = recipe.getRemainingItems(inventoryCrafting);
                if (stacks.size() >= 2 && ItemUtils.canMerge(stacks.get(1), ForgeHooks.getContainerItem(filledBucket))) {
                    return Optional.of(new CauldronContents(new FluidStack(stack, stack.amount - Fluid.BUCKET_VOLUME), result));
                }
            }
        }
    }
    return Optional.empty();
}
Also used : IRecipe(net.minecraft.item.crafting.IRecipe) CauldronContents(pl.asie.charset.module.crafting.cauldron.api.CauldronContents) ItemStack(net.minecraft.item.ItemStack) InventoryCrafting(net.minecraft.inventory.InventoryCrafting)

Aggregations

ItemStack (net.minecraft.item.ItemStack)5 CauldronContents (pl.asie.charset.module.crafting.cauldron.api.CauldronContents)5 FluidStack (net.minecraftforge.fluids.FluidStack)4 NBTTagList (net.minecraft.nbt.NBTTagList)2 TileEntity (net.minecraft.tileentity.TileEntity)2 Notice (pl.asie.charset.lib.notify.Notice)2 EntityItem (net.minecraft.entity.item.EntityItem)1 InventoryCrafting (net.minecraft.inventory.InventoryCrafting)1 IRecipe (net.minecraft.item.crafting.IRecipe)1 ICauldron (pl.asie.charset.module.crafting.cauldron.api.ICauldron)1