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