This commit is contained in:
modmuss50 2019-12-04 17:08:20 +00:00
parent e48d1f1184
commit 375fb83e70

View file

@ -26,11 +26,13 @@ package techreborn.items;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.block.FluidDrainable;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.fluid.Fluid; import net.minecraft.fluid.Fluid;
import net.minecraft.fluid.FluidState;
import net.minecraft.fluid.Fluids; import net.minecraft.fluid.Fluids;
import net.minecraft.item.*; import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundCategory;
import net.minecraft.sound.SoundEvent; import net.minecraft.sound.SoundEvent;
@ -38,12 +40,18 @@ import net.minecraft.sound.SoundEvents;
import net.minecraft.tag.FluidTags; import net.minecraft.tag.FluidTags;
import net.minecraft.text.LiteralText; import net.minecraft.text.LiteralText;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.util.ActionResult;
import net.minecraft.util.DefaultedList; import net.minecraft.util.DefaultedList;
import net.minecraft.util.Hand;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.TypedActionResult;
import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.hit.HitResult;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.Registry;
import net.minecraft.world.IWorld; import net.minecraft.world.IWorld;
import net.minecraft.world.RayTraceContext;
import net.minecraft.world.World;
import org.apache.commons.lang3.Validate; import org.apache.commons.lang3.Validate;
import org.apache.commons.lang3.text.WordUtils; import org.apache.commons.lang3.text.WordUtils;
import reborncore.common.fluid.FluidUtil; import reborncore.common.fluid.FluidUtil;
@ -123,29 +131,51 @@ public class ItemDynamicCell extends Item implements ItemFluidInfo {
} }
@Override @Override
public ActionResult useOnBlock(ItemUsageContext usageContext) { public TypedActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) {
ItemStack stack = usageContext.getStack(); ItemStack stack = player.getStackInHand(hand);
Fluid containedFluid = getFluid(stack); Fluid containedFluid = getFluid(stack);
BlockPos pos = usageContext.getBlockPos().offset(usageContext.getSide());
BlockState blockState = usageContext.getWorld().getBlockState(pos);
if(containedFluid == Fluids.EMPTY){ HitResult hitResult = rayTrace(world, player, containedFluid == Fluids.EMPTY ? RayTraceContext.FluidHandling.SOURCE_ONLY : RayTraceContext.FluidHandling.NONE);
FluidState fluidState = usageContext.getWorld().getFluidState(pos); if (hitResult.getType() == HitResult.Type.MISS) {
if(fluidState.getFluid() != Fluids.EMPTY && fluidState.isStill()){ return TypedActionResult.pass(stack);
stack.decrement(1); } else if (hitResult.getType() != HitResult.Type.BLOCK) {
insertOrDropStack(usageContext.getPlayer(), getCellWithFluid(fluidState.getFluid(), 1)); return TypedActionResult.pass(stack);
usageContext.getWorld().setBlockState(pos, Blocks.AIR.getDefaultState());
playEmptyingSound(usageContext.getPlayer(), usageContext.getWorld(), pos, fluidState.getFluid());
}
} else { } else {
if(blockState.canReplace(new ItemPlacementContext(usageContext))){ BlockHitResult blockHitResult = (BlockHitResult)hitResult;
usageContext.getWorld().setBlockState(pos, containedFluid.getDefaultState().getBlockState()); BlockPos hitPos = blockHitResult.getBlockPos();
stack.decrement(1); BlockState hitState = world.getBlockState(hitPos);
insertOrDropStack(usageContext.getPlayer(), getEmpty());
playEmptyingSound(usageContext.getPlayer(), usageContext.getWorld(), pos, containedFluid); Direction side = blockHitResult.getSide();
BlockPos placePos = hitPos.offset(side);
if (world.canPlayerModifyAt(player, hitPos) && player.canPlaceOn(placePos, side, stack)) {
if(containedFluid == Fluids.EMPTY){
if (hitState.getBlock() instanceof FluidDrainable) {
Fluid drainFluid = ((FluidDrainable)hitState.getBlock()).tryDrainFluid(world, hitPos, hitState);
if(drainFluid != Fluids.EMPTY){
stack.decrement(1);
insertOrDropStack(player, getCellWithFluid(drainFluid, 1));
world.setBlockState(hitPos, Blocks.AIR.getDefaultState());
playEmptyingSound(player, world, hitPos, drainFluid);
return TypedActionResult.pass(stack);
}
}
} else {
BlockState placeState = world.getBlockState(placePos);
if(placeState.canBucketPlace(containedFluid)){
world.setBlockState(placePos, containedFluid.getDefaultState().getBlockState());
stack.decrement(1);
insertOrDropStack(player, getEmpty());
playEmptyingSound(player, world, placePos, containedFluid);
return TypedActionResult.pass(stack);
}
}
} }
} }
return super.useOnBlock(usageContext); return TypedActionResult.fail(stack);
} }
private void insertOrDropStack(PlayerEntity playerEntity, ItemStack stack){ private void insertOrDropStack(PlayerEntity playerEntity, ItemStack stack){