BloodMagic/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilFluidBase.java
WayofTime ec1b0644cb Framework for ARC
Initial framework for the ARC block, including GUI, Container, Tile Entity, and Block.
2020-10-26 15:53:09 -04:00

149 lines
No EOL
5.2 KiB
Java

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