Dispenser can use cells. Closes #1948

This commit is contained in:
drcrazy 2020-01-10 16:09:03 +03:00
parent 8db5cea07c
commit a115fbd736
9 changed files with 165 additions and 81 deletions

View file

@ -78,7 +78,7 @@ import techreborn.blocks.transformers.BlockMVTransformer;
import techreborn.client.EGui;
import techreborn.config.TechRebornConfig;
import techreborn.entities.EntityNukePrimed;
import techreborn.items.ItemDynamicCell;
import techreborn.items.DynamicCellItem;
import techreborn.items.ItemUpgrade;
import techreborn.items.armor.ItemQuantumSuit;
import techreborn.utils.InitUtils;
@ -147,7 +147,7 @@ public class TRContent {
public static Item FREQUENCY_TRANSMITTER;
public static Item SCRAP_BOX;
public static Item MANUAL;
public static ItemDynamicCell CELL;
public static DynamicCellItem CELL;
//Quantum Suit
public static ItemQuantumSuit QUANTUM_HELMET;

View file

@ -1,13 +1,23 @@
package techreborn.init;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.DispenserBlock;
import net.minecraft.block.FluidDrainable;
import net.minecraft.block.dispenser.ItemDispenserBehavior;
import net.minecraft.block.entity.DispenserBlockEntity;
import net.minecraft.fluid.BaseFluid;
import net.minecraft.fluid.Fluid;
import net.minecraft.fluid.Fluids;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPointer;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.Position;
import net.minecraft.world.IWorld;
import reborncore.common.crafting.RebornRecipe;
import techreborn.config.TechRebornConfig;
import techreborn.items.DynamicCellItem;
import java.util.List;
import java.util.Random;
@ -34,9 +44,53 @@ public class TRDispenserBehavior {
} );
}
// DispenserBlock.registerBehavior(TRContent.CELL, new ItemDispenserBehavior(){
//
// });
DispenserBlock.registerBehavior(TRContent.CELL, new ItemDispenserBehavior(){
public ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) {
DynamicCellItem cell = (DynamicCellItem)stack.getItem();
IWorld iWorld = pointer.getWorld();
BlockPos blockPos = pointer.getBlockPos().offset(pointer.getBlockState().get(DispenserBlock.FACING));
BlockState blockState = iWorld.getBlockState(blockPos);
Block block = blockState.getBlock();
if (cell.getFluid(stack) == Fluids.EMPTY){
// fill cell
if (block instanceof FluidDrainable) {
Fluid fluid = ((FluidDrainable)block).tryDrainFluid(iWorld, blockPos, blockState);
if (!(fluid instanceof BaseFluid)) {
return super.dispenseSilently(pointer, stack);
} else {
ItemStack filledCell = DynamicCellItem.getCellWithFluid(fluid, 1);
if (stack.getCount() == 1) {
stack = filledCell;
} else {
stack.decrement(1);
if (((DispenserBlockEntity)pointer.getBlockEntity()).addToFirstFreeSlot(filledCell) < 0) {
this.dispense(pointer, filledCell);
}
}
return stack;
}
} else {
return super.dispenseSilently(pointer, stack);
}
}
else {
// drain cell
if (cell.placeFluid(null, pointer.getWorld(), blockPos, null, stack)) {
ItemStack emptyCell = cell.getEmpty();
if(stack.getCount() == 1) {
stack = emptyCell;
} else {
stack.decrement(1);
if (((DispenserBlockEntity)pointer.getBlockEntity()).addToFirstFreeSlot(emptyCell) < 0) {
this.dispense(pointer, emptyCell);
}
}
return stack;
} else {
return this.dispense(pointer, stack);
}
}
}
});
}
}