/*
* KubaTech - Gregtech Addon
* Copyright (C) 2022 - 2023 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 .
*
*/
package kubatech.tileentity;
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.*;
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.TextWidget;
import java.text.NumberFormat;
import java.util.function.BiFunction;
import kubatech.api.enums.ItemList;
import kubatech.api.utils.StringUtils;
import kubatech.loaders.ItemLoader;
import kubatech.loaders.block.KubaBlock;
import kubatech.savedata.PlayerData;
import kubatech.savedata.PlayerDataManager;
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;
public class TeaAcceptorTile extends TileEntity
implements IInventory, ITileWithModularUI, KubaBlock.IModularUIProvider {
public TeaAcceptorTile() {
super();
}
private String tileOwner = null;
private PlayerData playerData = null;
private long averageInput = 0L;
private long inAmount = 0L;
private int ticker = 0;
public void setTeaOwner(String teaOwner) {
if (tileOwner == null || tileOwner.isEmpty()) {
tileOwner = teaOwner;
playerData = PlayerDataManager.getPlayer(tileOwner);
markDirty();
}
}
@Override
public void readFromNBT(NBTTagCompound NBTData) {
super.readFromNBT(NBTData);
tileOwner = NBTData.getString("tileOwner");
if (!tileOwner.isEmpty()) {
playerData = PlayerDataManager.getPlayer(tileOwner);
}
}
@Override
public void writeToNBT(NBTTagCompound NBTData) {
super.writeToNBT(NBTData);
NBTData.setString("tileOwner", tileOwner);
}
@Override
public void updateEntity() {
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 (playerData != null) {
playerData.teaAmount += p_70299_2_.stackSize;
playerData.markDirty();
inAmount += 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_.getCommandSenderName().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_) {
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();
builder.widgets(
posCenteredHorizontally(
10,
new TextWidget(new Text("Tea Acceptor")
.format(EnumChatFormatting.BOLD)
.format(EnumChatFormatting.DARK_RED))),
posCenteredHorizontally(30, new DynamicTextWidget(() -> {
if (player.getCommandSenderName().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, new DynamicTextWidget(() -> new Text(
(playerData == null
? "ERROR"
: StringUtils.applyRainbow(
NumberFormat.getInstance().format(playerData.teaAmount),
(int) ((playerData.teaAmount / Math.max(1, averageInput * 10))
% Integer.MAX_VALUE),
EnumChatFormatting.BOLD.toString())))
.shadow())),
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();
}
}