/* * spotless:off * KubaTech - Gregtech Addon * Copyright (C) 2022 - 2024 kuba6000 * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library. If not, see . * spotless:on */ package kubatech.tileentity; import static kubatech.api.Variables.numberFormat; import static kubatech.api.Variables.numberFormatScientific; import java.math.BigInteger; import java.util.UUID; import java.util.concurrent.atomic.AtomicReference; import java.util.function.BiFunction; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumChatFormatting; import com.gtnewhorizons.modularui.api.ModularUITextures; import com.gtnewhorizons.modularui.api.drawable.Text; import com.gtnewhorizons.modularui.api.math.Color; import com.gtnewhorizons.modularui.api.math.Pos2d; import com.gtnewhorizons.modularui.api.screen.ITileWithModularUI; import com.gtnewhorizons.modularui.api.screen.ModularWindow; import com.gtnewhorizons.modularui.api.screen.UIBuildContext; import com.gtnewhorizons.modularui.api.widget.Widget; import com.gtnewhorizons.modularui.common.builder.UIInfo; import com.gtnewhorizons.modularui.common.internal.wrapper.ModularUIContainer; import com.gtnewhorizons.modularui.common.widget.DynamicTextWidget; import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; import com.gtnewhorizons.modularui.common.widget.TextWidget; import codechicken.nei.NEIClientUtils; import kubatech.api.enums.ItemList; import kubatech.api.tea.TeaNetwork; import kubatech.api.utils.StringUtils; import kubatech.loaders.ItemLoader; import kubatech.loaders.block.kubablock.KubaBlock; public class TeaAcceptorTile extends TileEntity implements IInventory, ITileWithModularUI, KubaBlock.IModularUIProvider { public TeaAcceptorTile() { super(); } private UUID tileOwner = null; private TeaNetwork teaNetwork = null; private long averageInput = 0L; private long inAmount = 0L; private int ticker = 0; public void setTeaOwner(UUID teaOwner) { if (tileOwner == null) { tileOwner = teaOwner; teaNetwork = TeaNetwork.getNetwork(tileOwner); markDirty(); } } @Override public void readFromNBT(NBTTagCompound NBTData) { super.readFromNBT(NBTData); try { tileOwner = UUID.fromString(NBTData.getString("tileOwner")); teaNetwork = TeaNetwork.getNetwork(tileOwner); } catch (Exception ignored) {} } @Override public void writeToNBT(NBTTagCompound NBTData) { super.writeToNBT(NBTData); NBTData.setString("tileOwner", tileOwner.toString()); } @Override public void updateEntity() { if (this.worldObj.isRemote) return; if (++ticker % 100 == 0) { averageInput = inAmount / 100; inAmount = 0; } } @Override public int getSizeInventory() { return 10; } @Override public ItemStack getStackInSlot(int p_70301_1_) { return null; } @Override public ItemStack decrStackSize(int p_70298_1_, int p_70298_2_) { return null; } @Override public ItemStack getStackInSlotOnClosing(int p_70304_1_) { return null; } @Override public void setInventorySlotContents(int p_70299_1_, ItemStack p_70299_2_) { if (teaNetwork != null) { inAmount += p_70299_2_.stackSize; teaNetwork.addTea(p_70299_2_.stackSize); } } @Override public String getInventoryName() { return "Tea acceptor"; } @Override public boolean hasCustomInventoryName() { return false; } @Override public int getInventoryStackLimit() { return 64; } @Override public boolean isUseableByPlayer(EntityPlayer p_70300_1_) { return p_70300_1_.getPersistentID() .equals(tileOwner); } @Override public void openInventory() {} @Override public void closeInventory() {} private static final int minDamage = ItemList.BlackTea.get(1) .getItemDamage(); private static final int maxDamage = ItemList.YellowTea.get(1) .getItemDamage(); @Override public boolean isItemValidForSlot(int p_94041_1_, ItemStack p_94041_2_) { if (teaNetwork == null) return false; if (!teaNetwork.canAdd(p_94041_2_.stackSize)) return false; return p_94041_2_.getItem() == ItemLoader.kubaitems && p_94041_2_.getItemDamage() >= minDamage && p_94041_2_.getItemDamage() <= maxDamage; } private static final UIInfo UI = KubaBlock.TileEntityUIFactory.apply(ModularUIContainer::new); @Override public UIInfo getUI() { return UI; } private static TextWidget posCenteredHorizontally(int y, TextWidget textWidget) { return (TextWidget) textWidget.setPosProvider(posCenteredHorizontallyProvider.apply(textWidget, y)); } private static final BiFunction posCenteredHorizontallyProvider = ( TextWidget widget, Integer y) -> (Widget.PosProvider) (screenSize, window, parent) -> new Pos2d((window.getSize().width / 2) - (widget.getSize().width / 2), y); @Override public ModularWindow createWindow(UIBuildContext buildContext) { ModularWindow.Builder builder = ModularWindow.builder(170, 70); builder.setBackground(ModularUITextures.VANILLA_BACKGROUND); EntityPlayer player = buildContext.getPlayer(); AtomicReference teaAmount = new AtomicReference<>(BigInteger.ZERO); builder.widgets( posCenteredHorizontally( 10, new TextWidget( new Text("Tea Acceptor").format(EnumChatFormatting.BOLD) .format(EnumChatFormatting.DARK_RED))), posCenteredHorizontally(30, new DynamicTextWidget(() -> { if (player.getPersistentID() .equals(tileOwner)) return new Text("[Tea]").color(Color.GREEN.normal); else return new Text("This is not your block").color(Color.RED.normal); })), posCenteredHorizontally( 40, (TextWidget) new DynamicTextWidget( () -> new Text( StringUtils.applyRainbow( NEIClientUtils.shiftKey() ? numberFormat.format(teaAmount.get()) : numberFormatScientific.format(teaAmount.get()), (int) ((teaAmount.get() .longValue() / Math.max(1, averageInput * 10)) % Integer.MAX_VALUE), EnumChatFormatting.BOLD.toString())).shadow()).setSynced(false) .attachSyncer( new FakeSyncWidget.BigIntegerSyncer(() -> teaNetwork.teaAmount, teaAmount::set), builder)), posCenteredHorizontally( 50, new DynamicTextWidget(() -> new Text("IN: " + averageInput + "/t").color(Color.BLACK.normal))) .addTooltip(new Text("Average input from the last 5 seconds").color(Color.GRAY.normal))); return builder.build(); } }