2020-10-24 08:59:04 -04:00
|
|
|
package wayoftime.bloodmagic.common.item.sigil;
|
|
|
|
|
|
|
|
import javax.annotation.Nullable;
|
|
|
|
|
|
|
|
import net.minecraft.block.Block;
|
|
|
|
import net.minecraft.block.BlockState;
|
|
|
|
import net.minecraft.entity.player.PlayerEntity;
|
|
|
|
import net.minecraft.util.Direction;
|
|
|
|
import net.minecraft.util.math.BlockPos;
|
|
|
|
import net.minecraft.world.World;
|
|
|
|
import net.minecraftforge.fluids.FluidStack;
|
|
|
|
import net.minecraftforge.fluids.FluidUtil;
|
|
|
|
import net.minecraftforge.fluids.capability.IFluidHandler;
|
|
|
|
import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction;
|
|
|
|
import net.minecraftforge.fluids.capability.wrappers.BlockWrapper;
|
|
|
|
|
|
|
|
public abstract class ItemSigilFluidBase extends ItemSigilBase
|
|
|
|
{
|
|
|
|
// Class for sigils that interact with fluids, either creating or deleting them.
|
|
|
|
// Sigils still have to define their own onRightClick behavior, but the actual
|
|
|
|
// fluid-interacting code is largely limited to here.
|
|
|
|
public final FluidStack sigilFluid;
|
|
|
|
|
|
|
|
public ItemSigilFluidBase(String name, int lpUsed, FluidStack fluid)
|
|
|
|
{
|
|
|
|
super(name, lpUsed);
|
|
|
|
sigilFluid = fluid;
|
|
|
|
}
|
|
|
|
|
|
|
|
public ItemSigilFluidBase(String name, FluidStack fluid)
|
|
|
|
{
|
|
|
|
super(name);
|
|
|
|
sigilFluid = fluid;
|
|
|
|
}
|
|
|
|
|
|
|
|
public ItemSigilFluidBase(String name)
|
|
|
|
{
|
|
|
|
super(name);
|
|
|
|
sigilFluid = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
// The following are handler functions for fluids, all genericized.
|
|
|
|
// They're all based off of the Forge FluidUtil methods, but directly taking the
|
|
|
|
// sigilFluid constant instead of getting an argument.
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Gets a fluid handler for the targeted block and siding. Works for both tile
|
|
|
|
* entity liquid containers and fluid blocks. This one is literally identical to
|
|
|
|
* the FluidUtil method of the same signature.
|
|
|
|
*/
|
|
|
|
@Nullable
|
|
|
|
protected IFluidHandler getFluidHandler(World world, BlockPos blockPos, @Nullable Direction side)
|
|
|
|
{
|
|
|
|
BlockState state = world.getBlockState(blockPos);
|
|
|
|
Block block = state.getBlock();
|
2020-10-26 15:53:09 -04:00
|
|
|
|
2020-10-24 08:59:04 -04:00
|
|
|
IFluidHandler targetFluidHandler = FluidUtil.getFluidHandler(world, blockPos, side).orElse(null);
|
|
|
|
|
|
|
|
if (targetFluidHandler == null)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
return targetFluidHandler;
|
|
|
|
// if (block instanceof IFluidBlock)
|
|
|
|
// return new FluidBlockWrapper((IFluidBlock) block, world, blockPos);
|
|
|
|
// else if (block instanceof BlockLiquid)
|
|
|
|
// return new BlockLiquidWrapper((BlockLiquid) block, world, blockPos);
|
|
|
|
// return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Tries to insert fluid into a fluid handler. If doTransfer is false, only
|
|
|
|
* simulate the transfer. If true, actually do so. Returns true if the transfer
|
|
|
|
* is successful, false otherwise.
|
|
|
|
*/
|
|
|
|
protected boolean tryInsertSigilFluid(IFluidHandler destination, boolean doTransfer)
|
|
|
|
{
|
|
|
|
if (destination == null)
|
|
|
|
return false;
|
|
|
|
return destination.fill(sigilFluid, doTransfer ? FluidAction.EXECUTE : FluidAction.SIMULATE) > 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Tries basically the oppostive of the above, removing fluids instead of adding
|
|
|
|
* them
|
|
|
|
*/
|
|
|
|
protected boolean tryRemoveFluid(IFluidHandler source, int amount, boolean doTransfer)
|
|
|
|
{
|
|
|
|
if (source == null)
|
|
|
|
return false;
|
|
|
|
return source.drain(amount, doTransfer ? FluidAction.EXECUTE : FluidAction.SIMULATE) != null;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Tries to place a fluid block in the world. Returns true if successful,
|
|
|
|
* otherwise false. This is the big troublesome one, oddly enough. It's
|
|
|
|
* genericized in case anyone wants to create variant sigils with weird fluids.
|
|
|
|
*/
|
|
|
|
protected boolean tryPlaceSigilFluid(PlayerEntity player, World world, BlockPos blockPos)
|
|
|
|
{
|
|
|
|
BlockState state = sigilFluid.getFluid().getAttributes().getBlock(world, blockPos, sigilFluid.getFluid().getDefaultState());
|
|
|
|
BlockWrapper wrapper = new BlockWrapper(state, world, blockPos);
|
|
|
|
return wrapper.fill(sigilFluid, FluidAction.EXECUTE) > 0;
|
|
|
|
// // Make sure world coordinants are valid
|
|
|
|
// if (world == null || blockPos == null)
|
|
|
|
// {
|
|
|
|
// return false;
|
|
|
|
// }
|
|
|
|
// // Make sure fluid is placeable
|
|
|
|
// Fluid fluid = sigilFluid.getFluid();
|
|
|
|
// if (!fluid.getAttributes().canBePlacedInWorld(world, blockPos, sigilFluid))
|
|
|
|
// {
|
|
|
|
// return false;
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// // Check if the block is an air block or otherwise replaceable
|
|
|
|
// BlockState state = world.getBlockState(blockPos);
|
|
|
|
// Material mat = state.getMaterial();
|
|
|
|
// boolean isDestSolid = mat.isSolid();
|
|
|
|
// boolean isDestReplaceable = state.getBlock().isReplaceable(state, fluid);
|
|
|
|
// if (!world.isAirBlock(blockPos) && isDestSolid && !isDestReplaceable)
|
|
|
|
// {
|
|
|
|
// return false;
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
//// // If the fluid vaporizes, this exists here in the lava sigil solely so the code
|
|
|
|
//// // is usable for other fluids
|
|
|
|
//// if (world.provider.doesWaterVaporize() && fluid.doesVaporize(sigilFluid))
|
|
|
|
//// {
|
|
|
|
//// fluid.vaporize(player, world, blockPos, sigilFluid);
|
|
|
|
//// return true;
|
|
|
|
//// }
|
|
|
|
//
|
|
|
|
// // Finally we've done enough checking to make sure everything at the end is
|
|
|
|
// // safe, let's place some fluid.
|
|
|
|
// IFluidHandler handler;
|
|
|
|
// Block block = fluid.getAttributes().getStateForPlacement(world, blockPos, sigilFluid).getBlockState().getBlock();
|
|
|
|
// if (block instanceof IFluidBlock)
|
|
|
|
// {
|
|
|
|
// handler = new FluidBlockWrapper((IFluidBlock) block, world, blockPos);
|
|
|
|
// } else if (block instanceof BlockLiquid)
|
|
|
|
// handler = new BlockLiquidWrapper((BlockLiquid) block, world, blockPos);
|
|
|
|
// else
|
|
|
|
// handler = new BlockWrapper(block, world, blockPos);
|
|
|
|
// return tryInsertSigilFluid(handler, true);
|
|
|
|
//// return false;
|
|
|
|
}
|
|
|
|
}
|