Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class TileEntityBasicFurnace extends TileEntity implements ITickableTileEntity, INamedContainerProvider {
- public enum FurnaceSlots {
- //TODO Reason for existing gone, makes code messy so remove it
- CHARGE(0),
- INPUT(0),
- OUTPUT(0);
- int id;
- FurnaceSlots(int number) {
- id = number;
- }
- public int getId() {
- return id;
- }
- }
- private MechaniCraftEnergyStorage energyStorage = createEnergy();
- private ItemStackHandler inputSlotHandler = createInput();
- private ItemStackHandler inputSlotWrapperHandler = createInputWrapper(inputSlotHandler);
- private ItemStackHandler outputSlotHandler = createOutput();
- private ItemStackHandler chargeSlotHandler = createCharge();
- private final LazyOptional<IItemHandler> inputSlotWrapper = LazyOptional.of(() -> inputSlotWrapperHandler);
- private final LazyOptional<IItemHandler> outputSlot = LazyOptional.of(() -> outputSlotHandler);
- private final LazyOptional<IItemHandler> chargeSlot = LazyOptional.of(() -> chargeSlotHandler);
- private final LazyOptional<IItemHandler> allSlots = LazyOptional.of(() -> new CombinedInvWrapper(chargeSlotHandler, inputSlotWrapperHandler, outputSlotHandler));
- private LazyOptional<IEnergyStorage> energy = LazyOptional.of(() -> energyStorage);
- 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());
- }
- private ItemStackHandler createCharge() {
- return new ItemStackHandler() {
- @Override
- public boolean isItemValid(int slot, @Nonnull ItemStack stack) {
- if(slot == TileEntityBasicFurnace.FurnaceSlots.CHARGE.getId() && stack.getCapability(CapabilityEnergy.ENERGY).isPresent()) {
- return true;
- }
- return false;
- }
- };
- }
- private ItemStackHandler createInput() {
- return new ItemStackHandler() {
- @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;
- }
- return false;
- }
- };
- }
- private ItemStackHandler createInputWrapper(ItemStackHandler inputSlot) {
- return new InputStackHandler(this.inputSlotHandler) {
- @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;
- }
- return false;
- }
- };
- }
- private ItemStackHandler createOutput() {
- return new ItemStackHandler() {
- @Override
- public boolean isItemValid(int slot, @Nonnull ItemStack stack) {
- if(slot == TileEntityBasicFurnace.FurnaceSlots.OUTPUT.getId()) {
- return false;
- }
- return false;
- }
- };
- }
- private MechaniCraftEnergyStorage createEnergy() {
- return new MechaniCraftEnergyStorage(100000, 500, 0) {
- @Override
- protected void onEnergyChanged() {
- setChanged();
- }
- };
- }
- @Override
- public void tick() {
- if (this.level == null || this.level.isClientSide) {
- return;
- }
- if(energyStorage.getMaxEnergyStored() > energyStorage.getEnergyStored()) {
- if(!(chargeSlotHandler.getStackInSlot(FurnaceSlots.CHARGE.id).equals(ItemStack.EMPTY))) {
- receivePowerItem(chargeSlotHandler.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(inputSlotHandler.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)));
- }
- }
- //FOR GUI SYNC
- private int setMaxEnergy() {
- return MAX_ENERGY = energyStorage.getMaxEnergyStored();
- }
- private boolean canSmelt() {
- ItemStack input = inputSlotHandler.getStackInSlot(FurnaceSlots.INPUT.id);
- ItemStack output = outputSlotHandler.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 = inputSlotHandler.getStackInSlot(FurnaceSlots.INPUT.id);
- ItemStack output = outputSlotHandler.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()) {
- outputSlotHandler.setStackInSlot(FurnaceSlots.OUTPUT.id, result.copy());
- progress = 0;
- inputSlotHandler.extractItem(FurnaceSlots.INPUT.id, 1, false);
- } else {
- if(output.getItem().equals(result.getItem()) && output.getCount() < result.getMaxStackSize()) {
- output.grow(result.getCount());
- progress = 0;
- inputSlotHandler.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, new CombinedInvWrapper(chargeSlotHandler, inputSlotHandler, outputSlotHandler));
- }
- @Override
- public void load(BlockState state, CompoundNBT tags) {
- super.load(state, tags);
- this.progress = tags.getInt("Progress");
- this.energyStorage.deserializeNBT(tags.getCompound("energy"));
- inputSlotHandler.deserializeNBT(tags.getCompound("inputSlot"));
- outputSlotHandler.deserializeNBT(tags.getCompound("outputSlot"));
- chargeSlotHandler.deserializeNBT(tags.getCompound("chargeSlot"));
- }
- @Override
- public CompoundNBT save(CompoundNBT tags) {
- super.save(tags);
- tags.putInt("Progress", this.progress);
- tags.put("energy", energyStorage.serializeNBT());
- tags.put("inputSlot", inputSlotHandler.serializeNBT());
- tags.put("outputSlot", outputSlotHandler.serializeNBT());
- tags.put("chargeSlot", chargeSlotHandler.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 allSlots.cast();
- }
- }
- return super.getCapability(cap, side);
- }
- @Override
- public void setRemoved() {
- energy.invalidate();
- inputSlotWrapper.invalidate();
- outputSlot.invalidate();
- chargeSlot.invalidate();
- allSlots.invalidate();
- super.setRemoved();
- }
- @Override
- public ITextComponent getDisplayName() {
- return new TranslationTextComponent("container.mechanicraft.basic_furnace");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement