Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.github.will11690.mechanicraft.blocks.machines.basic.basicfurnace;
- import java.util.Optional;
- import javax.annotation.Nonnull;
- import javax.annotation.Nullable;
- import com.github.will11690.mechanicraft.energy.MechaniCraftEnergyStorage;
- import com.github.will11690.mechanicraft.util.handlers.TileEntityHandler;
- import net.minecraft.block.BlockState;
- import net.minecraft.entity.player.PlayerEntity;
- import net.minecraft.entity.player.PlayerInventory;
- import net.minecraft.inventory.Inventory;
- import net.minecraft.inventory.container.Container;
- import net.minecraft.inventory.container.INamedContainerProvider;
- import net.minecraft.item.ItemStack;
- import net.minecraft.item.crafting.FurnaceRecipe;
- import net.minecraft.item.crafting.IRecipeType;
- import net.minecraft.item.crafting.RecipeManager;
- import net.minecraft.nbt.CompoundNBT;
- import net.minecraft.network.NetworkManager;
- import net.minecraft.network.play.server.SUpdateTileEntityPacket;
- import net.minecraft.tileentity.ITickableTileEntity;
- import net.minecraft.tileentity.TileEntity;
- import net.minecraft.util.Direction;
- import net.minecraft.util.IIntArray;
- import net.minecraft.util.text.ITextComponent;
- import net.minecraft.util.text.TranslationTextComponent;
- import net.minecraft.world.World;
- import net.minecraftforge.common.capabilities.Capability;
- import net.minecraftforge.common.util.LazyOptional;
- import net.minecraftforge.energy.CapabilityEnergy;
- import net.minecraftforge.energy.IEnergyStorage;
- import net.minecraftforge.items.CapabilityItemHandler;
- import net.minecraftforge.items.ItemStackHandler;
- public class TileEntityBasicFurnace extends TileEntity implements ITickableTileEntity, INamedContainerProvider {
- public enum FurnaceSlots {
- CHARGE(0),
- INPUT(1),
- OUTPUT(2);
- int id;
- FurnaceSlots(int number) {
- id = number;
- }
- public int getId() {
- return id;
- }
- }
- private MechaniCraftEnergyStorage energyStorage = createEnergy();
- private BasicFurnaceItemHandler itemHandler = createItem();
- private LazyOptional<IEnergyStorage> energy = LazyOptional.of(() -> energyStorage);
- public LazyOptional<ItemStackHandler> inventory = LazyOptional.of(() -> itemHandler);
- private int progress = 0;
- static final int WORK_TIME = 10 * 20;
- //TODO Create config for energy consumed and working times
- private int smeltingEnergy = 20/*PER TICK*/;
- static int MAX_ENERGY = 0;
- private final IIntArray fields = new IIntArray() {
- @Override
- public int get(int index) {
- switch (index) {
- case 0:
- return energyStorage.getEnergyStored();
- case 1:
- return progress;
- default:
- return 0;
- }
- }
- @Override
- public void set(int index, int value) {
- switch (index) {
- case 0:
- energyStorage.setEnergyStored(value, false);
- break;
- case 1:
- progress = value;
- break;
- default:
- break;
- }
- }
- @Override
- public int getCount() {
- return 2;
- }
- };
- public TileEntityBasicFurnace() {
- super(TileEntityHandler.TILE_ENTITY_BASIC_FURNACE.get());
- }
- @Override
- public void tick() {
- if (this.level == null || this.level.isClientSide) {
- return;
- }
- if(energyStorage.getMaxEnergyStored() > energyStorage.getEnergyStored()) {
- if(!(itemHandler.getStackInSlot(FurnaceSlots.CHARGE.id).equals(ItemStack.EMPTY))) {
- receivePowerItem(itemHandler.getStackInSlot(FurnaceSlots.CHARGE.id));
- }
- else
- receivePower();
- }
- if(progress <= 0 && this.level.getBlockState(this.worldPosition).getValue(BasicFurnace.LIT) == true) {
- this.level.setBlockAndUpdate(this.worldPosition, this.level.getBlockState(this.worldPosition).setValue(BasicFurnace.LIT, Boolean.valueOf(false)));
- }
- if(canSmelt()) {
- startSmelting();
- }
- if(itemHandler.getStackInSlot(FurnaceSlots.INPUT.id).equals(ItemStack.EMPTY) && progress > 0) {
- progress = 0;
- }
- if(energyStorage.getEnergyStored() <= 0 && progress > 0) {
- progress -= 2;
- }
- if(progress > 0 && this.level.getBlockState(this.worldPosition).getValue(BasicFurnace.LIT) == false) {
- this.level.setBlockAndUpdate(this.worldPosition, this.level.getBlockState(this.worldPosition).setValue(BasicFurnace.LIT, Boolean.valueOf(true)));
- }
- }
- private MechaniCraftEnergyStorage createEnergy() {
- return new MechaniCraftEnergyStorage(100000, 500, 0) {
- @Override
- protected void onEnergyChanged() {
- setChanged();
- }
- };
- }
- private BasicFurnaceItemHandler createItem() {
- return new BasicFurnaceItemHandler(this) {
- @Override
- public boolean isItemValid(int slot, @Nonnull ItemStack stack) {
- Optional<FurnaceRecipe> recipe = getRecipeForInput(level, stack);
- if(slot == TileEntityBasicFurnace.FurnaceSlots.INPUT.getId() && recipe.isPresent() && !(ItemStack.matches(getResultForItem(level, stack), stack))) {
- return true;
- }
- if(slot == TileEntityBasicFurnace.FurnaceSlots.OUTPUT.getId()) {
- return false;
- }
- if(slot == TileEntityBasicFurnace.FurnaceSlots.CHARGE.getId() && stack.getCapability(CapabilityEnergy.ENERGY).isPresent()) {
- return true;
- }
- return false;
- }
- };
- }
- //FOR GUI SYNC
- private int setMaxEnergy() {
- return MAX_ENERGY = energyStorage.getMaxEnergyStored();
- }
- private boolean canSmelt() {
- ItemStack input = itemHandler.getStackInSlot(FurnaceSlots.INPUT.id);
- ItemStack output = itemHandler.getStackInSlot(FurnaceSlots.OUTPUT.id);
- ItemStack result = getResultForItem(level, input);
- if(energyStorage.getEnergyStored() >= smeltingEnergy) {
- if (result.isEmpty() || input.isEmpty()) {
- setMaxEnergy();
- return false;
- }
- if ((output.getCount() + result.getCount()) > output.getMaxStackSize()) {
- setMaxEnergy();
- return false;
- }
- if (output.isEmpty() || output.getItem().equals(result.getItem())) {
- setMaxEnergy();
- return true;
- }
- return false;
- }
- else return false;
- }
- private void startSmelting() {
- ItemStack input = itemHandler.getStackInSlot(FurnaceSlots.INPUT.id);
- ItemStack output = itemHandler.getStackInSlot(FurnaceSlots.OUTPUT.id);
- ItemStack result = getResultForItem(level, input);
- if(canSmelt()) {
- if(progress < WORK_TIME) {
- ++progress;
- energyStorage.consumeEnergy(smeltingEnergy);
- }
- if (progress >= WORK_TIME) {
- if(output.isEmpty()) {
- itemHandler.setStackInSlot(FurnaceSlots.OUTPUT.id, result.copy());
- progress = 0;
- itemHandler.extractItem(FurnaceSlots.INPUT.id, 1, false);
- } else {
- if(output.getItem().equals(result.getItem()) && output.getCount() < result.getMaxStackSize()) {
- output.grow(result.getCount());
- progress = 0;
- itemHandler.extractItem(FurnaceSlots.INPUT.id, 1, false);
- }
- }
- }
- }
- }
- public static Optional<FurnaceRecipe> getRecipeForInput(World world, ItemStack itemStack) {
- RecipeManager recipeManager = world.getRecipeManager();
- Inventory singleItemInventory = new Inventory(itemStack);
- Optional<FurnaceRecipe> recipe = recipeManager.getRecipeFor(IRecipeType.SMELTING, singleItemInventory, world);
- return recipe;
- }
- public static ItemStack getResultForItem(World world, ItemStack itemStack) {
- Optional<FurnaceRecipe> recipe = getRecipeForInput(world, itemStack);
- if (!recipe.isPresent()) return ItemStack.EMPTY;
- return recipe.get().getResultItem().copy();
- }
- private void receivePower() {
- if (energyStorage.getEnergyStored() <= 0 || energyStorage.getMaxEnergyStored() > energyStorage.getEnergyStored()) {
- for (Direction direction : Direction.values()) {
- TileEntity te = level.getBlockEntity(worldPosition.relative(direction));
- if (te != null) {
- this.getCapability(CapabilityEnergy.ENERGY).ifPresent(energyStorage -> te.getCapability(CapabilityEnergy.ENERGY).ifPresent(tileEnergy -> {
- if(!isEnergyBlock(tileEnergy) || tileEnergy.getEnergyStored() <= 0 || energyStorage.getEnergyStored() == energyStorage.getMaxEnergyStored()) {
- return;
- } else {
- if(tileEnergy.getEnergyStored() < this.energyStorage.getMaxReceive()) {
- int energyToReceive = tileEnergy.extractEnergy(Math.min(energyStorage.getMaxEnergyStored() - energyStorage.getEnergyStored(), tileEnergy.getEnergyStored()), true);
- tileEnergy.extractEnergy(energyToReceive, false);
- this.energyStorage.receiveEnergy(energyToReceive, false);
- } else {
- int energyToReceive = tileEnergy.extractEnergy(Math.min(energyStorage.getMaxEnergyStored() - energyStorage.getEnergyStored(), this.energyStorage.getMaxReceive()), true);
- tileEnergy.extractEnergy(energyToReceive, false);
- this.energyStorage.receiveEnergy(energyToReceive, false);
- }
- }
- }));
- }
- }
- }
- }
- private void receivePowerItem(ItemStack stack) {
- //TODO Figure out why items not powering machine
- this.getCapability(CapabilityEnergy.ENERGY).ifPresent(energyStorage -> stack.getCapability(CapabilityEnergy.ENERGY).ifPresent(itemEnergy -> {
- if(!isEnergyItem(itemEnergy) || itemEnergy.getEnergyStored() <= 0 || energyStorage.getEnergyStored() == energyStorage.getMaxEnergyStored()) {
- return;
- } else {
- int energyToReceive = itemEnergy.extractEnergy(Math.min(energyStorage.getMaxEnergyStored() - energyStorage.getEnergyStored(), this.energyStorage.getMaxExtract()), true);
- itemEnergy.extractEnergy(energyToReceive, false);
- this.energyStorage.receiveEnergy(energyToReceive, false);
- }
- }));
- }
- private boolean isEnergyItem(IEnergyStorage itemEnergy) {
- return itemEnergy.getEnergyStored() >= 0 && itemEnergy.extractEnergy(itemEnergy.getEnergyStored(), true) >= 0;
- }
- private boolean isEnergyBlock(IEnergyStorage blockEnergy) {
- return blockEnergy.getEnergyStored() >= 0 && blockEnergy.extractEnergy(blockEnergy.getEnergyStored(), true) >= 0;
- }
- @Nullable
- @Override
- public Container createMenu(int id, PlayerInventory playerInventory, PlayerEntity playerEntity) {
- assert level != null;
- return new ContainerBasicFurnace(this, this.fields, id, playerInventory, this.inventory.orElse(new ItemStackHandler(3)));
- }
- @Override
- public void load(BlockState state, CompoundNBT tags) {
- super.load(state, tags);
- this.progress = tags.getInt("Progress");
- this.energyStorage.deserializeNBT(tags.getCompound("energy"));
- inventory.ifPresent(h -> h.deserializeNBT(tags.getCompound("items")));
- }
- @Override
- public CompoundNBT save(CompoundNBT tags) {
- super.save(tags);
- tags.putInt("Progress", this.progress);
- tags.put("energy", energyStorage.serializeNBT());
- inventory.ifPresent(h -> tags.put("items", h.serializeNBT()));
- return tags;
- }
- @Nullable
- @Override
- public SUpdateTileEntityPacket getUpdatePacket() {
- CompoundNBT tags = this.getUpdateTag();
- return new SUpdateTileEntityPacket(this.worldPosition, 1, tags);
- }
- @Override
- public CompoundNBT getUpdateTag() {
- return save(new CompoundNBT());
- }
- @Override
- public void handleUpdateTag(BlockState stateIn, CompoundNBT tag) {
- load(stateIn, tag);
- }
- @Override
- public void onDataPacket(NetworkManager net, SUpdateTileEntityPacket pkt) {
- load(this.getBlockState(), pkt.getTag());
- }
- @Nullable
- @Override
- public <T> LazyOptional<T> getCapability(Capability<T> cap, @Nullable Direction side) {
- if (!this.remove && side != null) {
- if (cap == CapabilityEnergy.ENERGY) {
- return energy.cast();
- }
- if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) {
- return inventory.cast();
- }
- }
- return super.getCapability(cap, side);
- }
- @Override
- public void setRemoved() {
- energy.invalidate();
- inventory.invalidate();
- super.setRemoved();
- }
- @Override
- public ITextComponent getDisplayName() {
- return new TranslationTextComponent("container.mechanicraft.basic_furnace");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement