Fixed destructpack UI

Closes #122

Was also implemented extra feature: destructpack now works with fluid
containers, so it can empty cells fisrt, than delete items, or just
shit-click from inventory will delete anyway.
This commit is contained in:
TheDarkDnKTv 2021-05-18 04:14:06 +03:00
parent 2c0cec9d28
commit ea4a4159d6
5 changed files with 154 additions and 45 deletions

View file

@ -8,6 +8,7 @@ import com.google.common.collect.Lists;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import gregtechmod.api.util.GT_Log;
import gregtechmod.api.util.GT_Utility;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
@ -25,55 +26,72 @@ import net.minecraftforge.fluids.FluidStack;
*/
public class GT_GUIContainer extends GuiContainer {
public boolean mCrashed = false;
protected FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer;
public ResourceLocation mGUIbackground;
public GT_GUIContainer(Container aContainer, String aGUIbackground) {
super(aContainer);
mGUIbackground = new ResourceLocation(aGUIbackground);
}
@SideOnly(Side.CLIENT)
protected void drawTooltips(int posX, int posY) {
List<GT_FluidSlot> fluids = ((GT_Container)inventorySlots).fluidSlots;
for (GT_FluidSlot slot : fluids) {
if (this.func_146978_c(slot.xDisplayPosition, slot.yDisplayPosition, 16, 16, posX, posY)) {
GL11.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT);
{
List<String> tooltipData = Lists.newArrayList();
FluidStack fluid = slot.getFluid();
if (GT_Utility.isFluidStackValid(fluid)) {
tooltipData.add(fluid.getLocalizedName());
tooltipData.add(EnumChatFormatting.GRAY + I18n.format("metatileentity.fluid.amount", GT_Utility.parseNumberToString(fluid.amount)));
} else {
tooltipData.add(I18n.format("metatileentity.fluid.empty"));
if (inventorySlots instanceof GT_Container) {
List<GT_FluidSlot> fluids = ((GT_Container)inventorySlots).fluidSlots;
for (GT_FluidSlot slot : fluids) {
if (this.func_146978_c(slot.xDisplayPosition, slot.yDisplayPosition, 16, 16, posX, posY)) {
GL11.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT);
{
List<String> tooltipData = Lists.newArrayList();
FluidStack fluid = slot.getFluid();
if (GT_Utility.isFluidStackValid(fluid)) {
tooltipData.add(fluid.getLocalizedName());
tooltipData.add(EnumChatFormatting.GRAY + I18n.format("metatileentity.fluid.amount", GT_Utility.parseNumberToString(fluid.amount)));
} else {
tooltipData.add(I18n.format("metatileentity.fluid.empty"));
}
if (slot.canFill)
tooltipData.add(EnumChatFormatting.GRAY.toString() + EnumChatFormatting.ITALIC.toString() + I18n.format("metatileentity.fluid.fill"));
if (slot.canDrain)
tooltipData.add(EnumChatFormatting.GRAY.toString() + EnumChatFormatting.ITALIC.toString() + I18n.format("metatileentity.fluid.drain"));
this.func_146283_a(tooltipData, posX, posY);
}
if (slot.canFill)
tooltipData.add(EnumChatFormatting.GRAY.toString() + EnumChatFormatting.ITALIC.toString() + I18n.format("metatileentity.fluid.fill"));
if (slot.canDrain)
tooltipData.add(EnumChatFormatting.GRAY.toString() + EnumChatFormatting.ITALIC.toString() + I18n.format("metatileentity.fluid.drain"));
this.func_146283_a(tooltipData, posX, posY);
}
GL11.glPopAttrib();
GL11.glPopAttrib();
}
}
}
}
@Override
protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) {
for (GT_FluidSlot slot : ((GT_Container)inventorySlots).fluidSlots)
slot.draw(this.guiLeft, this.guiTop, this.func_146978_c(slot.xDisplayPosition, slot.yDisplayPosition, 16, 16, par2, par3));
if (inventorySlots instanceof GT_Container) {
for (GT_FluidSlot slot : ((GT_Container)inventorySlots).fluidSlots)
slot.draw(this.guiLeft, this.guiTop, this.func_146978_c(slot.xDisplayPosition, slot.yDisplayPosition, 16, 16, par2, par3));
}
mc.renderEngine.bindTexture(mGUIbackground);
}
@Override
public void drawScreen(int par1, int par2, float par3) {
if (mCrashed) {
this.mc.thePlayer.closeScreen();
return;
}
try {
super.drawScreen(par1, par2, par3);
this.drawTooltips(par1, par2);
} catch(Throwable e) {}
} catch(Throwable e) {
mCrashed = true;
GT_Log.log.catching(new RuntimeException("Crash occured while rendering UI, it will be closed", e));
}
}
}

View file

@ -2,12 +2,16 @@ package gregtechmod.common.containers;
import gregtechmod.api.gui.GT_Slot_Holo;
import gregtechmod.api.util.GT_Utility;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.IFluidContainerItem;
public class GT_Container_Item_Destructopack extends Container {
@ -53,29 +57,36 @@ public class GT_Container_Item_Destructopack extends Container {
@Override
public ItemStack slotClick(int aSlotIndex, int aMouseclick, int aShifthold, EntityPlayer aPlayer) {
if (aSlotIndex < 0) return super.slotClick(aSlotIndex, aMouseclick, aShifthold, aPlayer);
ItemStack ret = null;
if (aSlotIndex < 1) {
if (aPlayer.inventory.getItemStack() != null) {
if (aMouseclick == 0) {
if (aShifthold == 1) {
for (int i = 0; i < aPlayer.inventory.getSizeInventory(); i++) {
ItemStack tStack = aPlayer.inventory.getStackInSlot(i);
if (tStack != null) {
if (GT_Utility.areStacksEqual(tStack, aPlayer.inventory.getItemStack())) {
aPlayer.inventory.setInventorySlotContents(i, null);
}
}
}
}
aPlayer.inventory.setItemStack(null);
} else if (aPlayer.inventory.getItemStack().stackSize < 2) {
aPlayer.inventory.setItemStack(null);
} else {
aPlayer.inventory.getItemStack().stackSize--;
return aPlayer.inventory.getItemStack();
if (aShifthold == 1 || (ret = emtpyContainer(aPlayer.inventory.getItemStack(), aPlayer, aMouseclick == 0)) == null) {
if (aMouseclick == 0) {
if (aShifthold == 1) {
for (int i = 0; i < aPlayer.inventory.getSizeInventory(); i++) {
ItemStack tStack = aPlayer.inventory.getStackInSlot(i);
if (tStack != null) {
if (GT_Utility.areStacksEqual(tStack, aPlayer.inventory.getItemStack())) {
aPlayer.inventory.setInventorySlotContents(i, null);
}
}
}
}
aPlayer.inventory.setItemStack(null);
} else if (aPlayer.inventory.getItemStack().stackSize < 2) {
aPlayer.inventory.setItemStack(null);
} else {
aPlayer.inventory.getItemStack().stackSize--;
ret = aPlayer.inventory.getItemStack();
}
}
}
return null;
return ret;
}
return super.slotClick(aSlotIndex, aMouseclick, aShifthold, aPlayer);
}
@ -85,4 +96,45 @@ public class GT_Container_Item_Destructopack extends Container {
slotObject.putStack(null);
return null;
}
protected ItemStack emtpyContainer(ItemStack held, EntityPlayer player, boolean leftClick) {
ItemStack result = null;
if (held.stackSize > 1) {
ItemStack copy = this.getContainer(GT_Utility.copyAmount(1, held));
if (copy != null) {
if (leftClick) {
copy.stackSize = held.stackSize;
player.inventory.setItemStack(copy);
result = copy;
} else {
held.stackSize--;
player.inventory.addItemStackToInventory(copy);
result = held;
}
}
} else {
result = getContainer(held);
if (result != null)
player.inventory.setItemStack(result);
}
return result;
}
/**
* Gets an empty container of stack
* @return null if no fluid in stack, otherwise will return container stack
*/
public ItemStack getContainer(ItemStack item) {
if (FluidContainerRegistry.isContainer(item))
return FluidContainerRegistry.drainFluidContainer(item);
else if (item.getItem() instanceof IFluidContainerItem) {
FluidStack fl = ((IFluidContainerItem)item.getItem()).drain(item, Integer.MAX_VALUE, true);
if (fl != null && fl.amount > 0)
return item;
}
return null;
}
}

View file

@ -1,21 +1,58 @@
package gregtechmod.common.gui;
import java.lang.reflect.Field;
import java.util.Collections;
import cpw.mods.fml.relauncher.ReflectionHelper;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import gregtechmod.api.GregTech_API;
import gregtechmod.api.gui.GT_GUIContainer;
import gregtechmod.api.gui.GT_Slot_Holo;
import gregtechmod.api.util.GT_LanguageManager;
import gregtechmod.common.containers.GT_Container_Item_Destructopack;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.fluids.IFluidContainerItem;
public class GT_GUIContainer_Destructopack extends GT_GUIContainer {
public ResourceLocation mGUIbackground;
protected static Field theSlot;
public GT_GUIContainer_Destructopack(InventoryPlayer aInventoryPlayer, ItemStack aItem) {
public GT_GUIContainer_Destructopack(InventoryPlayer aInventoryPlayer, ItemStack aItem) {
super(new GT_Container_Item_Destructopack(aInventoryPlayer, aItem), GregTech_API.GUI_PATH + "Destructopack.png");
}
static {
try {
theSlot = ReflectionHelper.findField(GuiContainer.class, "field_147006_u", "theSlot");
} catch (Throwable e) {
theSlot = null;
}
}
@Override
@SideOnly(Side.CLIENT)
protected void drawTooltips(int posX, int posY) {
super.drawTooltips(posX, posY);
if (theSlot != null) {
try {
ItemStack stack = this.mc.thePlayer.inventory.getItemStack();
if (stack != null && theSlot.get(this) instanceof GT_Slot_Holo && (FluidContainerRegistry.isContainer(stack) || stack.getItem() instanceof IFluidContainerItem)) {
this.func_146283_a(Collections.singletonList(I18n.format("item.destructpack.fluid_info")), posX, posY);
}
} catch (Throwable e) {}
}
}
@Override
protected void drawGuiContainerForegroundLayer(int par1, int par2) {
//draw text and stuff here

View file

@ -1007,6 +1007,7 @@ item.GT_SensorCard_Item.tooltip=Insert into Display Panel
item.GT_SensorCard_Item.tooltip.info.1=Device at:
item.GT_SensorCard_Item.tooltip.info.2=x: %d y: %d z: %d
item.GT_SensorCard_Item.tooltip.info.missing=Missing Coordinates!
item.destructpack.fluid_info=Also working with fluid containers!
gt_crops.indigo=Indigo
gt_crops.flax=Flax

View file

@ -1415,6 +1415,7 @@ item.GT_SensorCard_Item.tooltip=Ввести в панель дисплея
item.GT_SensorCard_Item.tooltip.info.1=Устройство на:
item.GT_SensorCard_Item.tooltip.info.2=x: %d y: %d z: %d
item.GT_SensorCard_Item.tooltip.info.missing=Координаты утеряны!
item.destructpack.fluid_info=Так же работает с жидкостными контейнерами!
gt_crops.indigo=Индиго
gt_crops.flax=Лён