diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityPassthroughHatchFluid.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityPassthroughHatchFluid.java index 84c388dece1..5305afee5e5 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityPassthroughHatchFluid.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityPassthroughHatchFluid.java @@ -1,23 +1,26 @@ package gregtech.common.metatileentities.multi.multiblockpart; +import gregtech.api.capability.GregtechDataCodes; +import gregtech.api.capability.GregtechTileCapabilities; +import gregtech.api.capability.IControllable; import gregtech.api.capability.impl.FilteredFluidHandler; import gregtech.api.capability.impl.FluidHandlerProxy; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.capability.impl.NotifiableItemStackHandler; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.widgets.TankWidget; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockAbilityPart; import gregtech.api.metatileentity.multiblock.IPassthroughHatch; import gregtech.api.metatileentity.multiblock.MultiblockAbility; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuis; import gregtech.client.renderer.texture.Textures; +import gregtech.common.mui.widget.GTFluidSlot; import net.minecraft.client.resources.I18n; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; @@ -29,13 +32,24 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.widget.IWidget; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.value.sync.BooleanSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widgets.SlotGroupWidget; +import com.cleanroommc.modularui.widgets.ToggleButton; +import com.cleanroommc.modularui.widgets.layout.Grid; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.List; public class MetaTileEntityPassthroughHatchFluid extends MetaTileEntityMultiblockPart implements IPassthroughHatch, - IMultiblockAbilityPart { + IMultiblockAbilityPart, + IControllable { private static final int TANK_SIZE = 16_000; @@ -44,8 +58,11 @@ public class MetaTileEntityPassthroughHatchFluid extends MetaTileEntityMultibloc private IFluidHandler importHandler; private IFluidHandler exportHandler; + private boolean workingEnabled; + public MetaTileEntityPassthroughHatchFluid(ResourceLocation metaTileEntityId, int tier) { super(metaTileEntityId, tier); + this.workingEnabled = true; initializeInventory(); } @@ -70,11 +87,25 @@ protected void initializeInventory() { public void update() { super.update(); if (!getWorld().isRemote && getOffsetTimer() % 5 == 0) { - pushFluidsIntoNearbyHandlers(getFrontFacing().getOpposite()); // outputs to back - pullFluidsFromNearbyHandlers(getFrontFacing()); // inputs from front + if (workingEnabled) { + pushFluidsIntoNearbyHandlers(getFrontFacing().getOpposite()); // outputs to back + pullFluidsFromNearbyHandlers(getFrontFacing()); // inputs from front + } + } + } + + public void setWorkingEnabled(boolean workingEnabled) { + this.workingEnabled = workingEnabled; + World world = getWorld(); + if (world != null && !world.isRemote) { + writeCustomData(GregtechDataCodes.WORKING_ENABLED, buf -> buf.writeBoolean(workingEnabled)); } } + public boolean isWorkingEnabled() { + return this.workingEnabled; + } + @Override public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, IVertexOperation[] pipeline) { super.renderMetaTileEntity(renderState, translation, pipeline); @@ -101,33 +132,51 @@ protected IItemHandlerModifiable createImportItemHandler() { } @Override - protected ModularUI createUI(EntityPlayer entityPlayer) { + public boolean usesMui2() { + return true; + } + + @Override + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { int rowSize = (int) Math.sqrt(getTier() + 1); - return createUITemplate(entityPlayer, rowSize) - .build(getHolder(), entityPlayer); - } - - private ModularUI.Builder createUITemplate(EntityPlayer player, int rowSize) { - ModularUI.Builder builder = ModularUI.builder(GuiTextures.BACKGROUND, 176, 18 + 18 * rowSize + 94) - .label(6, 6, getMetaFullName()); - - for (int y = 0; y < rowSize; y++) { - for (int x = 0; x < rowSize; x++) { - int index = y * rowSize + x; - builder.widget( - new TankWidget(fluidTankList.getTankAt(index), 89 - rowSize * 9 + x * 18, 18 + y * 18, 18, 18) - .setBackgroundTexture(GuiTextures.FLUID_SLOT) - .setContainerClicking(true, true) - .setAlwaysShowFull(true)); + + int backgroundWidth = 9 * 18 + 14; + int backgroundHeight = 18 + 18 * rowSize + 94; + + List> widgets = new ArrayList<>(); + for (int i = 0; i < rowSize; i++) { + widgets.add(new ArrayList<>()); + for (int j = 0; j < rowSize; j++) { + widgets.get(i).add(new GTFluidSlot().syncHandler(fluidTankList.getTankAt(i * rowSize + j)) + .background(GTGuiTextures.FLUID_SLOT)); } } - return builder.bindPlayerInventory(player.inventory, GuiTextures.SLOT, 7, 18 + 18 * rowSize + 12); + + BooleanSyncValue workingStateValue = new BooleanSyncValue(() -> workingEnabled, val -> workingEnabled = val); + return GTGuis.createPanel(this, backgroundWidth, backgroundHeight) + .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) + .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) + .child(new Grid() + .top(18).height(rowSize * 18) + .minElementMargin(0, 0) + .minColWidth(18).minRowHeight(18) + .alignX(0.5f) + .matrix(widgets)) + .child(new ToggleButton() + .top(18 * 2).left(18 * 8 + 7) + .value(workingStateValue) + .overlay(GTGuiTextures.BUTTON_FLUID_OUTPUT) + .tooltip(t -> t.setAutoUpdate(true)) + .tooltipBuilder(t -> t.addLine(workingStateValue.getBoolValue() ? + IKey.lang("gregtech.gui.fluid_passthrough.enabled") : + IKey.lang("gregtech.gui.fluid_passthrough.disabled")))); } @Override public NBTTagCompound writeToNBT(NBTTagCompound tag) { super.writeToNBT(tag); tag.setTag("FluidInventory", fluidTankList.serializeNBT()); + tag.setBoolean("WorkingEnabled", workingEnabled); return tag; } @@ -135,6 +184,10 @@ public NBTTagCompound writeToNBT(NBTTagCompound tag) { public void readFromNBT(NBTTagCompound tag) { super.readFromNBT(tag); this.fluidTankList.deserializeNBT(tag.getCompoundTag("FluidInventory")); + // Passthrough hatches before this change won't have WorkingEnabled at all, so we need to check if it exists + if (tag.hasKey("WorkingEnabled")) { + this.workingEnabled = tag.getBoolean("WorkingEnabled"); + } } @Override @@ -174,7 +227,23 @@ public T getCapability(Capability capability, EnumFacing side) { } else if (side == getFrontFacing().getOpposite()) { return CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY.cast(exportHandler); } else return null; + } else if (capability == GregtechTileCapabilities.CAPABILITY_CONTROLLABLE) { + return GregtechTileCapabilities.CAPABILITY_CONTROLLABLE.cast(this); } return super.getCapability(capability, side); } + + @Override + public void writeInitialSyncData(PacketBuffer buf) { + super.writeInitialSyncData(buf); + + buf.writeBoolean(workingEnabled); + } + + @Override + public void receiveInitialSyncData(PacketBuffer buf) { + super.receiveInitialSyncData(buf); + + this.workingEnabled = buf.readBoolean(); + } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityPassthroughHatchItem.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityPassthroughHatchItem.java index febd79c80d6..7f9e5dc3b1c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityPassthroughHatchItem.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityPassthroughHatchItem.java @@ -1,22 +1,24 @@ package gregtech.common.metatileentities.multi.multiblockpart; +import gregtech.api.capability.GregtechDataCodes; +import gregtech.api.capability.GregtechTileCapabilities; +import gregtech.api.capability.IControllable; import gregtech.api.capability.impl.ItemHandlerProxy; import gregtech.api.capability.impl.NotifiableItemStackHandler; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.widgets.SlotWidget; import gregtech.api.items.itemhandlers.GTItemStackHandler; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockAbilityPart; import gregtech.api.metatileentity.multiblock.IPassthroughHatch; import gregtech.api.metatileentity.multiblock.MultiblockAbility; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuis; import gregtech.client.renderer.texture.Textures; import net.minecraft.client.resources.I18n; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; @@ -29,21 +31,37 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.widget.IWidget; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.value.sync.BooleanSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.SyncHandlers; +import com.cleanroommc.modularui.widgets.ItemSlot; +import com.cleanroommc.modularui.widgets.SlotGroupWidget; +import com.cleanroommc.modularui.widgets.ToggleButton; +import com.cleanroommc.modularui.widgets.layout.Grid; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.List; public class MetaTileEntityPassthroughHatchItem extends MetaTileEntityMultiblockPart implements IPassthroughHatch, - IMultiblockAbilityPart { + IMultiblockAbilityPart, + IControllable { private ItemStackHandler itemStackHandler; private IItemHandler importHandler; private IItemHandler exportHandler; + private boolean workingEnabled; + public MetaTileEntityPassthroughHatchItem(ResourceLocation metaTileEntityId, int tier) { super(metaTileEntityId, tier); + this.workingEnabled = true; initializeInventory(); } @@ -69,8 +87,24 @@ private int getInventorySize() { public void update() { super.update(); if (!getWorld().isRemote && getOffsetTimer() % 5 == 0) { - pushItemsIntoNearbyHandlers(getFrontFacing().getOpposite()); // outputs to back - pullItemsFromNearbyHandlers(getFrontFacing()); // inputs from front + if (workingEnabled) { + pushItemsIntoNearbyHandlers(getFrontFacing().getOpposite()); // outputs to back + pullItemsFromNearbyHandlers(getFrontFacing()); // inputs from front + } + } + } + + @Override + public boolean isWorkingEnabled() { + return this.workingEnabled; + } + + @Override + public void setWorkingEnabled(boolean workingEnabled) { + this.workingEnabled = workingEnabled; + World world = getWorld(); + if (world != null && !world.isRemote) { + writeCustomData(GregtechDataCodes.WORKING_ENABLED, buf -> buf.writeBoolean(workingEnabled)); } } @@ -100,31 +134,56 @@ protected IItemHandlerModifiable createImportItemHandler() { } @Override - protected ModularUI createUI(EntityPlayer entityPlayer) { - int rowSize = (int) Math.sqrt(getInventorySize()); - return createUITemplate(entityPlayer, rowSize) - .build(getHolder(), entityPlayer); + public boolean usesMui2() { + return true; } - private ModularUI.Builder createUITemplate(EntityPlayer player, int rowSize) { - ModularUI.Builder builder = ModularUI.builder(GuiTextures.BACKGROUND, 176, 18 + 18 * rowSize + 94) - .label(6, 6, getMetaFullName()); + @Override + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { + int rowSize = (int) Math.sqrt(getInventorySize()); + + guiSyncManager.registerSlotGroup("item_inv", rowSize); + + int backgroundWidth = 9 * 18 + 14; + int backgroundHeight = 18 + 18 * rowSize + 94; - for (int y = 0; y < rowSize; y++) { - for (int x = 0; x < rowSize; x++) { - int index = y * rowSize + x; - builder.widget(new SlotWidget(itemStackHandler, index, - (88 - rowSize * 9 + x * 18), 18 + y * 18, true, true) - .setBackgroundTexture(GuiTextures.SLOT)); + List> widgets = new ArrayList<>(); + for (int i = 0; i < rowSize; i++) { + widgets.add(new ArrayList<>()); + for (int j = 0; j < rowSize; j++) { + widgets.get(i) + .add(new ItemSlot() + .slot(SyncHandlers.itemSlot(itemStackHandler, i * rowSize + j) + .slotGroup("item_inv") + .accessibility(true, true))); } } - return builder.bindPlayerInventory(player.inventory, GuiTextures.SLOT, 7, 18 + 18 * rowSize + 12); + + BooleanSyncValue workingStateValue = new BooleanSyncValue(() -> workingEnabled, val -> workingEnabled = val); + return GTGuis.createPanel(this, backgroundWidth, backgroundHeight) + .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) + .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) + .child(new Grid() + .top(18).height(rowSize * 18) + .minElementMargin(0, 0) + .minColWidth(18).minRowHeight(18) + .alignX(0.5f) + .matrix(widgets)) + .child(new ToggleButton() + .top(18 * 4).left(18 * 8 + 7) + .value(workingStateValue) + .overlay(GTGuiTextures.BUTTON_ITEM_OUTPUT) + .tooltip(t -> t.setAutoUpdate(true)) + .tooltipBuilder(t -> t.addLine(workingStateValue.getBoolValue() ? + IKey.lang("gregtech.gui.item_passthrough.enabled") : + IKey.lang("gregtech.gui.item_passthrough.disabled")))); } @Override public NBTTagCompound writeToNBT(NBTTagCompound tag) { super.writeToNBT(tag); tag.setTag("Inventory", itemStackHandler.serializeNBT()); + tag.setBoolean("WorkingEnabled", workingEnabled); return tag; } @@ -132,6 +191,10 @@ public NBTTagCompound writeToNBT(NBTTagCompound tag) { public void readFromNBT(NBTTagCompound tag) { super.readFromNBT(tag); this.itemStackHandler.deserializeNBT(tag.getCompoundTag("Inventory")); + // Passthrough hatches before this change won't have WorkingEnabled at all, so we need to check if it exists + if (tag.hasKey("WorkingEnabled")) { + this.workingEnabled = tag.getBoolean("WorkingEnabled"); + } } @Override @@ -176,7 +239,23 @@ public T getCapability(Capability capability, EnumFacing side) { } else if (side == getFrontFacing().getOpposite()) { return CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.cast(exportHandler); } else return null; + } else if (capability == GregtechTileCapabilities.CAPABILITY_CONTROLLABLE) { + return GregtechTileCapabilities.CAPABILITY_CONTROLLABLE.cast(this); } return super.getCapability(capability, side); } + + @Override + public void writeInitialSyncData(PacketBuffer buf) { + super.writeInitialSyncData(buf); + + buf.writeBoolean(workingEnabled); + } + + @Override + public void receiveInitialSyncData(PacketBuffer buf) { + super.receiveInitialSyncData(buf); + + this.workingEnabled = buf.readBoolean(); + } } diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index 639b092efac..cc868d54a83 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -5533,6 +5533,10 @@ gregtech.gui.config_slot.auto_pull_managed=§4Disabled:§7 Managed by Auto-Pull gregtech.gui.me_bus.extra_slot=Extra Slot/n§7Put extra items for recipes here, like Molds or Lenses gregtech.gui.me_bus.auto_pull_button=Click to toggle automatic item pulling from ME gregtech.gui.alarm.radius=Radius: +gregtech.gui.item_passthrough.enabled=Item Passthough Enabled +gregtech.gui.item_passthrough.disabled=Item Passthough Disabled +gregtech.gui.fluid_passthrough.enabled=Fluid Passthough Enabled +gregtech.gui.fluid_passthrough.disabled=Fluid Passthough Disabled ore.spawnlocation.name=Ore Spawn Information