diff --git a/dependencies.gradle b/dependencies.gradle index 91d6a5d5c7e..ec6767e637c 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -40,7 +40,7 @@ dependencies { // Published dependencies api("codechicken:codechickenlib:3.2.3.358") - api("com.cleanroommc:modularui:2.5.0-rc2") { transitive = false } + api("com.cleanroommc:modularui:2.5.0-rc3") { transitive = false } api("com.cleanroommc:groovyscript:1.2.0-hotfix1") { transitive = false } api("CraftTweaker2:CraftTweaker2-MC1120-Main:1.12-4.1.20.700") api("appeng:ae2-uel:v0.56.4") { transitive = false } diff --git a/src/main/java/gregtech/GregTechMod.java b/src/main/java/gregtech/GregTechMod.java index 04fcd09786c..5334d5afe13 100644 --- a/src/main/java/gregtech/GregTechMod.java +++ b/src/main/java/gregtech/GregTechMod.java @@ -31,7 +31,8 @@ acceptedMinecraftVersions = "[1.12.2,1.13)", version = GTInternalTags.VERSION, dependencies = "required:forge@[14.23.5.2847,);" + "required-after:codechickenlib@[3.2.3,);" + - "required-after:modularui@[2.3,);" + "required-after:mixinbooter@[8.0,);" + "after:appliedenergistics2;" + + "required-after:modularui@[2.5.0-rc,);" + "required-after:mixinbooter@[8.0,);" + + "after:appliedenergistics2;" + "after:forestry;" + "after:extrabees;" + "after:extratrees;" + "after:genetics;" + "after:magicbees;" + "after:jei@[4.15.0,);" + "after:crafttweaker@[4.1.20,);" + "after:groovyscript@[1.2.0,);" + "after:theoneprobe;" + "after:hwyla;") diff --git a/src/main/java/gregtech/api/GTValues.java b/src/main/java/gregtech/api/GTValues.java index 9d3bb3f2534..b530c0d468d 100644 --- a/src/main/java/gregtech/api/GTValues.java +++ b/src/main/java/gregtech/api/GTValues.java @@ -122,11 +122,12 @@ public class GTValues { * The short names for the voltages, formatted for text */ public static final String[] VNF = new String[] { - DARK_GRAY + "ULV", GRAY + "LV", AQUA + "MV", - GOLD + "HV", DARK_PURPLE + "EV", DARK_BLUE + "IV", - LIGHT_PURPLE + "LuV", RED + "ZPM", DARK_AQUA + "UV", - DARK_RED + "UHV", GREEN + "UEV", DARK_GREEN + "UIV", - YELLOW + "UXV", BLUE + "OpV", RED.toString() + BOLD + "MAX" }; + RED + "ULV", GRAY + "LV", GOLD + "MV", + YELLOW + "HV", DARK_GRAY + "EV", WHITE + "IV", + LIGHT_PURPLE + "LuV", AQUA + "ZPM", DARK_GREEN + "UV", + DARK_RED + "UHV", DARK_BLUE + "UEV", DARK_GREEN.toString() + BOLD + "UIV", + DARK_PURPLE.toString() + BOLD + "UXV", DARK_RED.toString() + BOLD + "OpV", + RED.toString() + BOLD + "MAX" }; /** * The short names for the voltages, up to max Long, formatted for text @@ -146,7 +147,7 @@ public class GTValues { * Color values for the voltages */ public static final int[] VC = new int[] { 0xC80000, 0xDCDCDC, 0xFF6400, 0xFFFF1E, 0x808080, 0xF0F0F5, 0xE99797, - 0x7EC3C4, 0x7EB07E, 0xBF74C0, 0x0B5CFE, 0x914E91, 0x488748, 0x8C0000, 0x2828F5 }; + 0x7EC3C4, 0x7EB07E, 0xBF74C0, 0x0B5CFE, 0x488748, 0x914E91, 0x8C0000, 0x2828F5 }; /** * The long names for the voltages diff --git a/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java b/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java index 455ae3afd47..23018a736ca 100644 --- a/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java +++ b/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java @@ -3,6 +3,7 @@ import gregtech.api.GTValues; import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.GregtechTileCapabilities; +import gregtech.api.capability.IEnergyContainer; import gregtech.api.capability.IMultiblockController; import gregtech.api.capability.IMultipleTankHandler; import gregtech.api.capability.IWorkable; @@ -101,17 +102,27 @@ public AbstractRecipeLogic(MetaTileEntity tileEntity, RecipeMap recipeMap, bo /** * @return the energy container's energy input per second */ - protected abstract long getEnergyInputPerSecond(); + protected long getEnergyInputPerSecond() { + return getEnergyContainer().getInputPerSec(); + } /** * @return the energy container's current stored energy */ - protected abstract long getEnergyStored(); + protected long getEnergyStored() { + return getEnergyContainer().getEnergyStored(); + } /** * @return the energy container's maximum energy capacity */ - protected abstract long getEnergyCapacity(); + protected long getEnergyCapacity() { + return getEnergyContainer().getEnergyCapacity(); + } + + protected IEnergyContainer getEnergyContainer() { + return IEnergyContainer.DEFAULT; + } /** * Draw energy from the energy container @@ -120,12 +131,22 @@ public AbstractRecipeLogic(MetaTileEntity tileEntity, RecipeMap recipeMap, bo * @param simulate whether to simulate energy extraction or not * @return true if the energy can/was drained, otherwise false */ - protected abstract boolean drawEnergy(long recipeEUt, boolean simulate); + protected boolean drawEnergy(long recipeEUt, boolean simulate) { + // this should be the ONLY time eut is negative! + if (consumesEnergy()) recipeEUt = -recipeEUt; + long resultEnergy = getEnergyStored() + recipeEUt; + if (resultEnergy >= 0L && resultEnergy <= getEnergyCapacity()) { + if (!simulate) getEnergyContainer().changeEnergy(recipeEUt); + return true; + } else return false; + } /** * @return the maximum voltage the machine can use/handle for recipe searching */ - public abstract long getMaxVoltage(); + public long getMaxVoltage() { + return Math.max(getEnergyContainer().getInputVoltage(), getEnergyContainer().getOutputVoltage()); + } /** * @@ -941,7 +962,7 @@ public String[] getAvailableOverclockingTiers() { protected void setupRecipe(@NotNull Recipe recipe) { this.progressTime = 1; setMaxProgress(ocResult.duration()); - this.recipeEUt = consumesEnergy() ? ocResult.eut() : -ocResult.eut(); + this.recipeEUt = ocResult.eut(); int recipeTier = GTUtility.getTierByVoltage(recipe.getEUt()); int machineTier = getOverclockForTier(getMaximumOverclockVoltage()); @@ -1226,7 +1247,7 @@ public void deserializeNBT(@NotNull NBTTagCompound compound) { if (progressTime > 0) { this.isActive = true; this.maxProgressTime = compound.getInteger("MaxProgress"); - this.recipeEUt = compound.getLong("RecipeEUt"); + this.recipeEUt = Math.abs(compound.getLong("RecipeEUt")); NBTTagList itemOutputsList = compound.getTagList("ItemOutputs", Constants.NBT.TAG_COMPOUND); this.itemOutputs = new ArrayList<>(itemOutputsList.tagCount()); for (int i = 0; i < itemOutputsList.tagCount(); i++) { diff --git a/src/main/java/gregtech/api/capability/impl/BoilerRecipeLogic.java b/src/main/java/gregtech/api/capability/impl/BoilerRecipeLogic.java index 28b2ee7afd0..a2163db4637 100644 --- a/src/main/java/gregtech/api/capability/impl/BoilerRecipeLogic.java +++ b/src/main/java/gregtech/api/capability/impl/BoilerRecipeLogic.java @@ -1,6 +1,7 @@ package gregtech.api.capability.impl; import gregtech.api.GTValues; +import gregtech.api.capability.IEnergyContainer; import gregtech.api.capability.IMultiblockController; import gregtech.api.capability.IMultipleTankHandler; import gregtech.api.recipes.Recipe; @@ -330,6 +331,12 @@ public long getMaxVoltage() { return 0; } + @Override + protected IEnergyContainer getEnergyContainer() { + GTLog.logger.error("Large Boiler called getEnergyContainer(), this should not be possible!"); + return super.getEnergyContainer(); + } + /** * @param fluidHandler the handler to drain from * @param amount the amount to drain diff --git a/src/main/java/gregtech/api/capability/impl/MultiblockFuelRecipeLogic.java b/src/main/java/gregtech/api/capability/impl/MultiblockFuelRecipeLogic.java index 30c5e5410e3..4c374985014 100644 --- a/src/main/java/gregtech/api/capability/impl/MultiblockFuelRecipeLogic.java +++ b/src/main/java/gregtech/api/capability/impl/MultiblockFuelRecipeLogic.java @@ -95,19 +95,9 @@ protected long boostProduction(long production) { } @Override - protected boolean drawEnergy(long recipeEUt, boolean simulate) { - long euToDraw = boostProduction(recipeEUt); - long resultEnergy = getEnergyStored() - euToDraw; - if (resultEnergy >= 0L && resultEnergy <= getEnergyCapacity()) { - if (!simulate) getEnergyContainer().changeEnergy(-euToDraw); - return true; - } - return false; - } - - @Override - public long getInfoProviderEUt() { - return boostProduction(super.getInfoProviderEUt()); + protected void setupRecipe(@NotNull Recipe recipe) { + super.setupRecipe(recipe); + this.recipeEUt = boostProduction(this.recipeEUt); } @Override diff --git a/src/main/java/gregtech/api/capability/impl/MultiblockRecipeLogic.java b/src/main/java/gregtech/api/capability/impl/MultiblockRecipeLogic.java index ff95f0fbb0c..728ed138cc9 100644 --- a/src/main/java/gregtech/api/capability/impl/MultiblockRecipeLogic.java +++ b/src/main/java/gregtech/api/capability/impl/MultiblockRecipeLogic.java @@ -384,35 +384,11 @@ protected void performMufflerOperations() { } } - @Override - protected long getEnergyInputPerSecond() { - return getEnergyContainer().getInputPerSec(); - } - - @Override - protected long getEnergyStored() { - return getEnergyContainer().getEnergyStored(); - } - - @Override - protected long getEnergyCapacity() { - return getEnergyContainer().getEnergyCapacity(); - } - - @Override - protected boolean drawEnergy(long recipeEUt, boolean simulate) { - long resultEnergy = getEnergyStored() - recipeEUt; - if (resultEnergy >= 0L && resultEnergy <= getEnergyCapacity()) { - if (!simulate) getEnergyContainer().changeEnergy(-recipeEUt); - return true; - } else return false; - } - @Override public long getMaxVoltage() { IEnergyContainer energyContainer = getEnergyContainer(); if (!consumesEnergy()) { - // Generators + // Generator Multiblocks long voltage = energyContainer.getOutputVoltage(); long amperage = energyContainer.getOutputAmperage(); if (energyContainer instanceof EnergyContainerList && amperage == 1) { @@ -424,7 +400,7 @@ public long getMaxVoltage() { } return voltage; } else { - // Machines + // Machine Multiblocks if (energyContainer instanceof EnergyContainerList energyList) { long highestVoltage = energyList.getHighestInputVoltage(); if (energyList.getNumHighestInputContainers() > 1) { diff --git a/src/main/java/gregtech/api/capability/impl/RecipeLogicEnergy.java b/src/main/java/gregtech/api/capability/impl/RecipeLogicEnergy.java index 8460b2a7aa7..f94b239ecc6 100644 --- a/src/main/java/gregtech/api/capability/impl/RecipeLogicEnergy.java +++ b/src/main/java/gregtech/api/capability/impl/RecipeLogicEnergy.java @@ -25,33 +25,8 @@ public RecipeLogicEnergy(MetaTileEntity tileEntity, RecipeMap recipeMap, } @Override - protected long getEnergyInputPerSecond() { - return energyContainer.get().getInputPerSec(); - } - - @Override - protected long getEnergyStored() { - return energyContainer.get().getEnergyStored(); - } - - @Override - protected long getEnergyCapacity() { - return energyContainer.get().getEnergyCapacity(); - } - - @Override - protected boolean drawEnergy(long recipeEUt, boolean simulate) { - long resultEnergy = getEnergyStored() - recipeEUt; - if (resultEnergy >= 0L && resultEnergy <= getEnergyCapacity()) { - if (!simulate) energyContainer.get().changeEnergy(-recipeEUt); - return true; - } - return false; - } - - @Override - public long getMaxVoltage() { - return Math.max(energyContainer.get().getInputVoltage(), energyContainer.get().getOutputVoltage()); + protected IEnergyContainer getEnergyContainer() { + return energyContainer.get(); } @Override diff --git a/src/main/java/gregtech/api/items/metaitem/stats/IItemBehaviour.java b/src/main/java/gregtech/api/items/metaitem/stats/IItemBehaviour.java index eb2b743d176..55121079639 100644 --- a/src/main/java/gregtech/api/items/metaitem/stats/IItemBehaviour.java +++ b/src/main/java/gregtech/api/items/metaitem/stats/IItemBehaviour.java @@ -38,7 +38,7 @@ default EnumActionResult onItemUseFirst(EntityPlayer player, World world, BlockP default ActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { - return ActionResult.newResult(EnumActionResult.PASS, player.getHeldItem(hand)); + return pass(player.getHeldItem(hand)); } default void addInformation(ItemStack itemStack, List lines) {} @@ -50,8 +50,20 @@ default Multimap getAttributeModifiers(EntityEquipmen } default ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { - return ActionResult.newResult(EnumActionResult.PASS, player.getHeldItem(hand)); + return pass(player.getHeldItem(hand)); } default void addPropertyOverride(@NotNull Item item) {} + + default ActionResult pass(ItemStack stack) { + return ActionResult.newResult(EnumActionResult.PASS, stack); + } + + default ActionResult success(ItemStack stack) { + return ActionResult.newResult(EnumActionResult.SUCCESS, stack); + } + + default ActionResult fail(ItemStack stack) { + return ActionResult.newResult(EnumActionResult.FAIL, stack); + } } diff --git a/src/main/java/gregtech/api/items/metaitem/stats/ItemFluidContainer.java b/src/main/java/gregtech/api/items/metaitem/stats/ItemFluidContainer.java index b206c683512..f94c0202b74 100644 --- a/src/main/java/gregtech/api/items/metaitem/stats/ItemFluidContainer.java +++ b/src/main/java/gregtech/api/items/metaitem/stats/ItemFluidContainer.java @@ -1,15 +1,54 @@ package gregtech.api.items.metaitem.stats; +import gregtech.api.util.GTUtility; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockLiquid; +import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvent; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.FluidUtil; +import net.minecraftforge.fluids.IFluidBlock; +import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandlerItem; +import net.minecraftforge.fluids.capability.wrappers.BlockLiquidWrapper; +import net.minecraftforge.fluids.capability.wrappers.BlockWrapper; +import net.minecraftforge.fluids.capability.wrappers.FluidBlockWrapper; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class ItemFluidContainer implements IItemContainerItemProvider, IItemBehaviour { -public class ItemFluidContainer implements IItemContainerItemProvider { + private final boolean isBucket; + + public ItemFluidContainer(boolean isBucket) { + this.isBucket = isBucket; + } + + public ItemFluidContainer() { + this(false); + } @Override public ItemStack getContainerItem(ItemStack itemStack) { - IFluidHandlerItem handler = itemStack.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); + IFluidHandlerItem handler = FluidUtil.getFluidHandler(itemStack); if (handler != null) { FluidStack drained = handler.drain(1000, false); if (drained == null || drained.amount != 1000) return ItemStack.EMPTY; @@ -18,4 +57,175 @@ public ItemStack getContainerItem(ItemStack itemStack) { } return itemStack; } + + @Override + public void addInformation(ItemStack itemStack, List lines) { + if (isBucket) { + lines.add(I18n.format("behaviour.cell_bucket.tooltip")); + } + } + + @Override + public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); + if (!isBucket) return pass(stack); + + ItemStack cellStack = GTUtility.copy(1, stack); + + var cellHandler = FluidUtil.getFluidHandler(cellStack); + if (cellHandler == null) return pass(stack); + + var result = rayTrace(world, player, true); + if (result == null || result.typeOfHit != RayTraceResult.Type.BLOCK) { + return pass(stack); + } + + var pos = result.getBlockPos(); + + // can the player modify the clicked block + if (!world.isBlockModifiable(player, pos)) { + return fail(stack); + } + + // can player edit + if (!player.canPlayerEdit(pos, result.sideHit, cellStack)) { + return fail(stack); + } + + // prioritize filling the cell if there's space, otherwise place fluid + if (fillCell(cellStack, world, pos, result.sideHit, player)) { + addToPlayerInventory(stack, cellHandler.getContainer(), player, hand); + return success(stack); + + } else { + result = rayTrace(world, player, false); + if (result == null || result.typeOfHit != RayTraceResult.Type.BLOCK) { + return pass(stack); + } + pos = result.getBlockPos(); + + if (tryPlace(cellHandler, world, pos.offset(result.sideHit), result.sideHit, player)) { + addToPlayerInventory(stack, cellHandler.getContainer(), player, hand); + return success(stack); + } + } + + return pass(stack); + } + + private static boolean tryPlace(IFluidHandlerItem cellHandler, World world, BlockPos pos, EnumFacing side, + EntityPlayer player) { + var cellFluid = cellHandler.drain(Fluid.BUCKET_VOLUME, false); + if (cellFluid == null || !cellFluid.getFluid().canBePlacedInWorld()) + return false; + + IFluidHandler blockHandler = getOrCreate(cellFluid, world, pos, side); + + // check that we can place the fluid at the destination + IBlockState destBlockState = world.getBlockState(pos); + Material destMaterial = destBlockState.getMaterial(); + boolean isDestNonSolid = !destMaterial.isSolid(); + boolean isDestReplaceable = destBlockState.getBlock().isReplaceable(world, pos); + + if (!world.isAirBlock(pos) && !isDestNonSolid && !isDestReplaceable) { + // Non-air, solid, unreplacable block. We can't put fluid here. + return false; + } + + // check vaporize + if (world.provider.doesWaterVaporize() && cellFluid.getFluid().doesVaporize(cellFluid)) { + cellHandler.drain(Fluid.BUCKET_VOLUME, true); + cellFluid.getFluid().vaporize(player, world, pos, cellFluid); + return true; + } + + // fill block + int filled = blockHandler.fill(cellFluid, false); + + if (filled != Fluid.BUCKET_VOLUME) return false; + + playSound(cellFluid, true, player); + boolean consume = !player.isSpectator() && !player.isCreative(); + blockHandler.fill(cellHandler.drain(Fluid.BUCKET_VOLUME, consume), true); + return true; + } + + private static boolean fillCell(ItemStack cellStack, World world, BlockPos pos, EnumFacing side, + EntityPlayer player) { + IFluidHandler blockHandler = FluidUtil.getFluidHandler(world, pos, side); + if (blockHandler == null) return false; + + IFluidHandlerItem cellHandler = FluidUtil.getFluidHandler(cellStack); + if (cellHandler == null) return false; + + FluidStack stack = blockHandler.drain(Fluid.BUCKET_VOLUME, false); + int filled = cellHandler.fill(stack, false); + + if (filled != Fluid.BUCKET_VOLUME) return false; + + playSound(stack, false, player); + boolean consume = !player.isSpectator() && !player.isCreative(); + cellHandler.fill(blockHandler.drain(Fluid.BUCKET_VOLUME, true), consume); + return true; + } + + // copied and adapted from Item.java + @Nullable + private static RayTraceResult rayTrace(World worldIn, EntityPlayer player, boolean hitFluids) { + Vec3d lookPos = player.getPositionVector() + .add(0, player.getEyeHeight(), 0); + + Vec3d lookOffset = player.getLookVec() + .scale(player.getEntityAttribute(EntityPlayer.REACH_DISTANCE).getAttributeValue()); + + return worldIn.rayTraceBlocks(lookPos, lookPos.add(lookOffset), + hitFluids, !hitFluids, false); + } + + @NotNull + private static IFluidHandler createHandler(FluidStack stack, World world, BlockPos pos) { + Block block = stack.getFluid().getBlock(); + if (block instanceof IFluidBlock) { + return new FluidBlockWrapper((IFluidBlock) block, world, pos); + } else if (block instanceof BlockLiquid) { + return new BlockLiquidWrapper((BlockLiquid) block, world, pos); + } else { + return new BlockWrapper(block, world, pos); + } + } + + private static IFluidHandler getOrCreate(FluidStack stack, World world, BlockPos pos, EnumFacing side) { + IFluidHandler handler = FluidUtil.getFluidHandler(world, pos, side); + if (handler != null) return handler; + return createHandler(stack, world, pos); + } + + private static void addToPlayerInventory(ItemStack playerStack, ItemStack resultStack, EntityPlayer player, + EnumHand hand) { + if (playerStack.getCount() > resultStack.getCount()) { + playerStack.shrink(resultStack.getCount()); + if (!player.inventory.addItemStackToInventory(resultStack) && !player.world.isRemote) { + EntityItem dropItem = player.entityDropItem(resultStack, 0); + if (dropItem != null) dropItem.setPickupDelay(0); + } + } else { + player.setHeldItem(hand, resultStack); + } + } + + /** + * Play the appropriate fluid interaction sound for the fluid.
+ * Must be called on server to work correctly + **/ + private static void playSound(FluidStack fluid, boolean fill, EntityPlayer player) { + if (fluid == null || player.world.isRemote) return; + SoundEvent soundEvent; + if (fill) { + soundEvent = fluid.getFluid().getFillSound(fluid); + } else { + soundEvent = fluid.getFluid().getEmptySound(fluid); + } + player.world.playSound(null, player.posX, player.posY + 0.5, player.posZ, + soundEvent, SoundCategory.PLAYERS, 1.0F, 1.0F); + } } diff --git a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java index c89fe48379d..eada02187ab 100644 --- a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java @@ -737,7 +737,7 @@ public boolean canPlaceCoverOnSide(@NotNull EnumFacing side) { } @Override - public final boolean acceptsCovers() { + public boolean acceptsCovers() { return covers.size() < EnumFacing.VALUES.length; } @@ -1083,10 +1083,8 @@ public void receiveCustomData(int dataId, @NotNull PacketBuffer buf) { if (trait == null) { GTLog.logger.warn("Could not find MTETrait for id: {} at position {}.", traitNetworkId, getPos()); } else { + ISyncedTileEntity.addCode(internalId, trait); trait.receiveCustomData(internalId, buf); - - // this should be fine, as nothing else is read after this - ISyncedTileEntity.checkCustomData(internalId, buf, trait); } } else if (dataId == COVER_ATTACHED_MTE) { CoverSaveHandler.readCoverPlacement(buf, this); @@ -1102,10 +1100,8 @@ public void receiveCustomData(int dataId, @NotNull PacketBuffer buf) { Cover cover = getCoverAtSide(coverSide); int internalId = buf.readVarInt(); if (cover != null) { + ISyncedTileEntity.addCode(internalId, cover); cover.readCustomData(internalId, buf); - - // this should be fine, as nothing else is read after this - ISyncedTileEntity.checkCustomData(internalId, buf, cover); } } else if (dataId == UPDATE_SOUND_MUFFLED) { this.muffled = buf.readBoolean(); diff --git a/src/main/java/gregtech/api/metatileentity/SyncedTileEntityBase.java b/src/main/java/gregtech/api/metatileentity/SyncedTileEntityBase.java index 9b42003a0dc..fbcf0a179fe 100644 --- a/src/main/java/gregtech/api/metatileentity/SyncedTileEntityBase.java +++ b/src/main/java/gregtech/api/metatileentity/SyncedTileEntityBase.java @@ -1,7 +1,6 @@ package gregtech.api.metatileentity; import gregtech.api.block.BlockStateTileEntity; -import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.interfaces.ISyncedTileEntity; import gregtech.api.network.PacketDataList; @@ -80,12 +79,9 @@ public final void onDataPacket(@NotNull NetworkManager net, @NotNull SPacketUpda for (String discriminatorKey : entryTag.getKeySet()) { ByteBuf backedBuffer = Unpooled.copiedBuffer(entryTag.getByteArray(discriminatorKey)); int dataId = Integer.parseInt(discriminatorKey); + ISyncedTileEntity.addCode(dataId, this); receiveCustomData(dataId, new PacketBuffer(backedBuffer)); - - MetaTileEntity mte = null; - if (this instanceof IGregTechTileEntity gtte) - mte = gtte.getMetaTileEntity(); - ISyncedTileEntity.checkCustomData(dataId, backedBuffer, mte == null ? this : mte); + ISyncedTileEntity.checkData(backedBuffer); } } } @@ -105,11 +101,8 @@ public final void handleUpdateTag(@NotNull NBTTagCompound tag) { super.readFromNBT(tag); // deserializes Forge data and capabilities byte[] updateData = tag.getByteArray("d"); ByteBuf backedBuffer = Unpooled.copiedBuffer(updateData); + ISyncedTileEntity.track(this); receiveInitialSyncData(new PacketBuffer(backedBuffer)); - - MetaTileEntity mte = null; - if (this instanceof IGregTechTileEntity gtte) - mte = gtte.getMetaTileEntity(); - ISyncedTileEntity.checkInitialData(backedBuffer, mte == null ? this : mte); + ISyncedTileEntity.checkData(backedBuffer); } } diff --git a/src/main/java/gregtech/api/metatileentity/WorkableTieredMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/WorkableTieredMetaTileEntity.java index 5e648be0f60..88651b9e9cc 100644 --- a/src/main/java/gregtech/api/metatileentity/WorkableTieredMetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/WorkableTieredMetaTileEntity.java @@ -47,6 +47,7 @@ public abstract class WorkableTieredMetaTileEntity extends TieredMetaTileEntity public final boolean handlesRecipeOutputs; + @Nullable private ICleanroomProvider cleanroom; public WorkableTieredMetaTileEntity(ResourceLocation metaTileEntityId, RecipeMap recipeMap, @@ -210,7 +211,12 @@ public ICleanroomProvider getCleanroom() { } @Override - public void setCleanroom(ICleanroomProvider provider) { + public void setCleanroom(@NotNull ICleanroomProvider provider) { this.cleanroom = provider; } + + @Override + public void unsetCleanroom() { + this.cleanroom = null; + } } diff --git a/src/main/java/gregtech/api/metatileentity/interfaces/ISyncedTileEntity.java b/src/main/java/gregtech/api/metatileentity/interfaces/ISyncedTileEntity.java index 97bff58419b..47b28ba4a03 100644 --- a/src/main/java/gregtech/api/metatileentity/interfaces/ISyncedTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/interfaces/ISyncedTileEntity.java @@ -10,6 +10,8 @@ import net.minecraft.util.math.BlockPos; import io.netty.buffer.ByteBuf; +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntList; import org.jetbrains.annotations.NotNull; import java.util.function.Consumer; @@ -20,6 +22,8 @@ public interface ISyncedTileEntity { Consumer NO_OP = buf -> {}; + IntList datacodes = new IntArrayList(); + ThreadLocal tracked = ThreadLocal.withInitial(() -> null); /** * Used to sync data from Server -> Client. @@ -119,26 +123,25 @@ default void writeCustomData(int discriminator) { */ void receiveCustomData(int discriminator, @NotNull PacketBuffer buf); - static void checkCustomData(int discriminator, @NotNull ByteBuf buf, Object obj) { - if (buf.readableBytes() == 0) return; - - GTLog.logger.error( - "Class {} failed to finish reading receiveCustomData with discriminator {} and {} bytes remaining", - stringify(obj), GregtechDataCodes.getNameFor(discriminator), buf.readableBytes()); - - buf.clear(); // clear to prevent further logging - } - - static void checkInitialData(@NotNull ByteBuf buf, Object obj) { - if (buf.readableBytes() == 0) return; - - GTLog.logger.error("Class {} failed to finish reading initialSyncData with {} bytes remaining", - stringify(obj), buf.readableBytes()); + static void checkData(@NotNull ByteBuf buf) { + if (buf.readableBytes() != 0) { + if (datacodes.isEmpty()) { + GTLog.logger.error("Class {} failed to finish reading initialSyncData with {} bytes remaining", + stringify(tracked.get()), buf.readableBytes()); + } else { + GTLog.logger.error( + "Class {} failed to finish reading receiveCustomData at code path [{}] with {} bytes remaining", + stringify(tracked.get()), getCodePath(), buf.readableBytes()); + } + } - buf.clear(); // clear to prevent further logging + reset(); } static String stringify(Object obj) { + if (obj instanceof IGregTechTileEntity gtte && gtte.getMetaTileEntity() != null) + obj = gtte.getMetaTileEntity(); + StringBuilder builder = new StringBuilder(obj.getClass().getSimpleName()); BlockPos pos = null; @@ -158,4 +161,27 @@ static String stringify(Object obj) { return builder.toString(); } + + static void addCode(int code, Object trackedObject) { + datacodes.add(code); + track(trackedObject); + } + + static void track(Object trackedObject) { + tracked.set(trackedObject); + } + + static String getCodePath() { + var builder = new StringBuilder(); + for (int i = 0; i < datacodes.size(); i++) { + builder.append(GregtechDataCodes.getNameFor(datacodes.get(i))); + if (i < datacodes.size() - 1) builder.append(" > "); + } + return builder.toString(); + } + + static void reset() { + datacodes.clear(); + tracked.remove(); + } } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/DummyCleanroom.java b/src/main/java/gregtech/api/metatileentity/multiblock/DummyCleanroom.java index 6b51624ed4c..eba7d877af3 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/DummyCleanroom.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/DummyCleanroom.java @@ -64,4 +64,11 @@ public void setCleanAmount(int amount) {} @Override public void adjustCleanAmount(int amount) {} + + // Have a higher priority than the cleanroom multiblock (which doesn't override getPriority so it'll return 0) + // doesn't replace the set cleanroom in multiblocks. + @Override + public int getPriority() { + return Integer.MAX_VALUE; + } } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java index 790a150ec0c..fb3a1993fc2 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java @@ -72,7 +72,7 @@ protected boolean isDynamoTierTooLow() { IEnergyContainer energyContainer = recipeMapWorkable.getEnergyContainer(); if (energyContainer != null && energyContainer.getEnergyCapacity() > 0) { long maxVoltage = Math.max(energyContainer.getInputVoltage(), energyContainer.getOutputVoltage()); - return maxVoltage < -recipeMapWorkable.getRecipeEUt(); + return maxVoltage < recipeMapWorkable.getRecipeEUt(); } } return false; diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ICleanroomProvider.java b/src/main/java/gregtech/api/metatileentity/multiblock/ICleanroomProvider.java index ea9c6a65324..39f223bee38 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ICleanroomProvider.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ICleanroomProvider.java @@ -49,4 +49,13 @@ public interface ICleanroomProvider { * @return the tier {@link gregtech.api.GTValues#V} of energy the cleanroom uses at minimum */ int getEnergyTier(); + + /** + * Get the priority of this cleanroom provider to determine which should be used. + * + * @return the priority this cleanroom provider should have over other cleanrooms. + */ + default int getPriority() { + return 0; + } } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ICleanroomReceiver.java b/src/main/java/gregtech/api/metatileentity/multiblock/ICleanroomReceiver.java index af729726b23..c6bfa155936 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ICleanroomReceiver.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ICleanroomReceiver.java @@ -1,5 +1,6 @@ package gregtech.api.metatileentity.multiblock; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** @@ -19,5 +20,11 @@ public interface ICleanroomReceiver { * * @param provider the cleanroom to assign to this machine */ - void setCleanroom(ICleanroomProvider provider); + void setCleanroom(@NotNull ICleanroomProvider provider); + + /** + * Set the receiver's reference to null. Use instead of passing {@code null} to + * {@link ICleanroomReceiver#setCleanroom(ICleanroomProvider)} + */ + void unsetCleanroom(); } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayText.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayText.java index 9127d5ca68c..e7b5d68e6d2 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayText.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayText.java @@ -155,7 +155,7 @@ public Builder addEnergyUsageExactLine(long energyUsage) { */ public Builder addEnergyProductionLine(long maxVoltage, long recipeEUt) { if (!isStructureFormed) return this; - if (maxVoltage != 0 && maxVoltage >= -recipeEUt) { + if (maxVoltage != 0 && maxVoltage >= recipeEUt) { String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); // wrap in text component to keep it from being formatted ITextComponent voltageName = new TextComponentString( diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java index 4949074c91a..06032732857 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java @@ -51,6 +51,7 @@ public abstract class RecipeMapMultiblockController extends MultiblockWithDispla private boolean isDistinct = false; + @Nullable private ICleanroomProvider cleanroom; public RecipeMapMultiblockController(ResourceLocation metaTileEntityId, RecipeMap recipeMap) { @@ -320,7 +321,14 @@ public ICleanroomProvider getCleanroom() { } @Override - public void setCleanroom(ICleanroomProvider provider) { - this.cleanroom = provider; + public void setCleanroom(@NotNull ICleanroomProvider provider) { + if (cleanroom == null || provider.getPriority() > cleanroom.getPriority()) { + this.cleanroom = provider; + } + } + + @Override + public void unsetCleanroom() { + this.cleanroom = null; } } diff --git a/src/main/java/gregtech/api/mui/GTGuis.java b/src/main/java/gregtech/api/mui/GTGuis.java index 9f9989b2601..f955cd922f8 100644 --- a/src/main/java/gregtech/api/mui/GTGuis.java +++ b/src/main/java/gregtech/api/mui/GTGuis.java @@ -9,6 +9,7 @@ import net.minecraft.item.ItemStack; +import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.factory.GuiManager; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Alignment; @@ -71,33 +72,38 @@ public static ModularPanel defaultPanel(MetaItem.MetaValueItem valueItem) { return createPanel(valueItem.unlocalizedName); } - public static ModularPanel createPopupPanel(String name, int width, int height) { - return createPopupPanel(name, width, height, false, false); + public static PopupPanel createPopupPanel(String name, int width, int height) { + return defaultPopupPanel(name) + .size(width, height); } - public static ModularPanel createPopupPanel(String name, int width, int height, boolean disableBelow, - boolean closeOnOutsideClick) { - return new PopupPanel(name, width, height, disableBelow, closeOnOutsideClick); + public static PopupPanel createPopupPanel(String name, int width, int height, boolean deleteCachedPanel) { + return createPopupPanel(name, width, height) + .deleteCachedPanel(deleteCachedPanel); } - public static ModularPanel defaultPopupPanel(String name) { - return defaultPopupPanel(name, false, false); + public static PopupPanel defaultPopupPanel(String name) { + return new PopupPanel(name) + .size(DEFAULT_WIDTH, DEFAULT_HIEGHT); } - public static ModularPanel defaultPopupPanel(String name, boolean disableBelow, - boolean closeOnOutsideClick) { - return new PopupPanel(name, DEFAULT_WIDTH, DEFAULT_HIEGHT, disableBelow, closeOnOutsideClick); + public static PopupPanel defaultPopupPanel(String name, boolean disableBelow, + boolean closeOnOutsideClick, boolean deleteCachedPanel) { + return defaultPopupPanel(name) + .disablePanelsBelow(disableBelow) + .closeOnOutOfBoundsClick(closeOnOutsideClick) + .deleteCachedPanel(deleteCachedPanel); } - private static class PopupPanel extends ModularPanel { + public static class PopupPanel extends ModularPanel { - private final boolean disableBelow; - private final boolean closeOnOutsideClick; + private boolean disableBelow; + private boolean closeOnOutsideClick; + private boolean deleteCachedPanel; - public PopupPanel(@NotNull String name, int width, int height, boolean disableBelow, - boolean closeOnOutsideClick) { + private PopupPanel(@NotNull String name) { super(name); - size(width, height).align(Alignment.Center); + align(Alignment.Center); background(GTGuiTextures.BACKGROUND_POPUP); child(ButtonWidget.panelCloseButton().top(5).right(5) .onMousePressed(mouseButton -> { @@ -107,8 +113,41 @@ public PopupPanel(@NotNull String name, int width, int height, boolean disableBe } return false; })); + } + + @Override + public void onClose() { + super.onClose(); + if (deleteCachedPanel && isSynced() && getSyncHandler() instanceof IPanelHandler handler) { + handler.deleteCachedPanel(); + } + } + + public PopupPanel disablePanelsBelow(boolean disableBelow) { this.disableBelow = disableBelow; + return this; + } + + public PopupPanel closeOnOutOfBoundsClick(boolean closeOnOutsideClick) { this.closeOnOutsideClick = closeOnOutsideClick; + return this; + } + + public PopupPanel deleteCachedPanel(boolean deleteCachedPanel) { + this.deleteCachedPanel = deleteCachedPanel; + return this; + } + + @Override + public PopupPanel size(int w, int h) { + super.size(w, h); + return this; + } + + @Override + public PopupPanel size(int val) { + super.size(val); + return this; } @Override diff --git a/src/main/java/gregtech/api/mui/LocaleAccessor.java b/src/main/java/gregtech/api/mui/LocaleAccessor.java new file mode 100644 index 00000000000..2fee169f215 --- /dev/null +++ b/src/main/java/gregtech/api/mui/LocaleAccessor.java @@ -0,0 +1,20 @@ +package gregtech.api.mui; + +import net.minecraft.client.resources.Locale; + +// todo remove in next mui2 version +public interface LocaleAccessor { + + String gregtech$getRawKey(String s); + + ThreadLocal accessor = new ThreadLocal<>(); + + static String getRawKey(String s) { + if (accessor.get() == null) return s; + return accessor.get().gregtech$getRawKey(s); + } + + static void setLocale(Locale locale) { + accessor.set((LocaleAccessor) locale); + } +} diff --git a/src/main/java/gregtech/api/mui/StateOverlay.java b/src/main/java/gregtech/api/mui/StateOverlay.java deleted file mode 100644 index fefdc7fc477..00000000000 --- a/src/main/java/gregtech/api/mui/StateOverlay.java +++ /dev/null @@ -1,22 +0,0 @@ -package gregtech.api.mui; - -import com.cleanroommc.modularui.api.drawable.IDrawable; -import com.cleanroommc.modularui.widgets.ToggleButton; - -import java.util.function.Consumer; - -public interface StateOverlay { - - StateOverlay overlay(boolean selected, IDrawable... overlay); - - StateOverlay hoverOverlay(boolean selected, IDrawable... overlay); - - static ToggleButton cast(ToggleButton button, Consumer function) { - function.accept((StateOverlay) button); - return button; - } - - static ToggleButton create(Consumer function) { - return cast(new ToggleButton(), function); - } -} diff --git a/src/main/java/gregtech/api/mui/UnboxFix.java b/src/main/java/gregtech/api/mui/UnboxFix.java deleted file mode 100644 index 48f1bda2f20..00000000000 --- a/src/main/java/gregtech/api/mui/UnboxFix.java +++ /dev/null @@ -1,8 +0,0 @@ -package gregtech.api.mui; - -public interface UnboxFix { - - void gregTech$useDefaultTextColor(boolean b); - - void gregTech$useDefaultShadow(boolean b); -} diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index 1886be86d31..4571c26e93d 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -52,11 +52,10 @@ public GTFluidSyncHandler(IFluidTank tank) { @Override public void detectAndSendChanges(boolean init) { var current = getFluid(); - if (current == null && lastFluid == null) return; - if (current == null || lastFluid == null || lastFluid.getFluid() != current.getFluid()) { + if (init || current == null || lastFluid == null || current.isFluidEqual(lastFluid)) { lastFluid = current == null ? null : current.copy(); syncToClient(UPDATE_TANK, buffer -> NetworkUtils.writeFluidStack(buffer, current)); - } else if (current.amount != lastFluid.amount) { + } else if (lastFluid != null && current.amount != lastFluid.amount) { lastFluid.amount = current.amount; syncToClient(UPDATE_AMOUNT, buffer -> buffer.writeInt(current.amount)); } diff --git a/src/main/java/gregtech/client/renderer/scene/ISceneRenderHook.java b/src/main/java/gregtech/client/renderer/scene/ISceneRenderHook.java deleted file mode 100644 index e6674c9b4d2..00000000000 --- a/src/main/java/gregtech/client/renderer/scene/ISceneRenderHook.java +++ /dev/null @@ -1,17 +0,0 @@ -package gregtech.client.renderer.scene; - -import net.minecraft.util.BlockRenderLayer; - -/** - * Created with IntelliJ IDEA. - * - * @Author: KilaBash - * @Date: 2021/08/25 - * @Description: Scene Render State hooks. - * This is where you decide whether or not this group of pos should be rendered. What other requirements - * do you have for rendering. - */ -public interface ISceneRenderHook { - - void apply(boolean isTESR, int pass, BlockRenderLayer layer); -} diff --git a/src/main/java/gregtech/client/renderer/scene/WorldSceneRenderer.java b/src/main/java/gregtech/client/renderer/scene/WorldSceneRenderer.java index d5947edf46d..cb0dacd1c63 100644 --- a/src/main/java/gregtech/client/renderer/scene/WorldSceneRenderer.java +++ b/src/main/java/gregtech/client/renderer/scene/WorldSceneRenderer.java @@ -25,6 +25,8 @@ import net.minecraftforge.fml.relauncher.SideOnly; import codechicken.lib.vec.Vector3; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import org.jetbrains.annotations.Nullable; import org.lwjgl.opengl.GL11; import org.lwjgl.util.glu.GLU; @@ -33,8 +35,6 @@ import java.nio.FloatBuffer; import java.nio.IntBuffer; import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.function.Consumer; import javax.vecmath.Vector3f; @@ -61,7 +61,7 @@ public abstract class WorldSceneRenderer { .order(ByteOrder.nativeOrder()).asFloatBuffer(); public final World world; - public final Map, ISceneRenderHook> renderedBlocksMap; + public final Collection renderedBlocks = new ObjectOpenHashSet<>(); private Consumer beforeRender; private Consumer afterRender; private Consumer onLookingAt; @@ -73,7 +73,6 @@ public abstract class WorldSceneRenderer { public WorldSceneRenderer(World world) { this.world = world; - renderedBlocksMap = new LinkedHashMap<>(); } public WorldSceneRenderer setBeforeWorldRender(Consumer callback) { @@ -86,9 +85,9 @@ public WorldSceneRenderer setAfterWorldRender(Consumer callb return this; } - public WorldSceneRenderer addRenderedBlocks(Collection blocks, ISceneRenderHook renderHook) { + public WorldSceneRenderer addRenderedBlocks(@Nullable Collection blocks) { if (blocks != null) { - this.renderedBlocksMap.put(blocks, renderHook); + this.renderedBlocks.addAll(blocks); } return this; } @@ -240,31 +239,24 @@ protected void drawWorld() { for (BlockRenderLayer layer : BlockRenderLayer.values()) { ForgeHooksClient.setRenderLayer(layer); int pass = layer == BlockRenderLayer.TRANSLUCENT ? 1 : 0; + setDefaultPassRenderState(pass); - renderedBlocksMap.forEach((renderedBlocks, hook) -> { - if (hook != null) { - hook.apply(false, pass, layer); - } else { - setDefaultPassRenderState(pass); - } + BufferBuilder buffer = Tessellator.getInstance().getBuffer(); + buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); + BlockRendererDispatcher blockrendererdispatcher = mc.getBlockRendererDispatcher(); - BufferBuilder buffer = Tessellator.getInstance().getBuffer(); - buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); - BlockRendererDispatcher blockrendererdispatcher = mc.getBlockRendererDispatcher(); - - for (BlockPos pos : renderedBlocks) { - IBlockState state = world.getBlockState(pos); - Block block = state.getBlock(); - if (block == Blocks.AIR) continue; - state = state.getActualState(world, pos); - if (block.canRenderInLayer(state, layer)) { - blockrendererdispatcher.renderBlock(state, pos, world, buffer); - } + for (BlockPos pos : renderedBlocks) { + IBlockState state = world.getBlockState(pos); + Block block = state.getBlock(); + if (block == Blocks.AIR) continue; + state = state.getActualState(world, pos); + if (block.canRenderInLayer(state, layer)) { + blockrendererdispatcher.renderBlock(state, pos, world, buffer); } + } - Tessellator.getInstance().draw(); - Tessellator.getInstance().getBuffer().setTranslation(0, 0, 0); - }); + Tessellator.getInstance().draw(); + Tessellator.getInstance().getBuffer().setTranslation(0, 0, 0); } } finally { ForgeHooksClient.setRenderLayer(oldRenderLayer); @@ -276,22 +268,15 @@ protected void drawWorld() { // render TESR for (int pass = 0; pass < 2; pass++) { ForgeHooksClient.setRenderPass(pass); - int finalPass = pass; - renderedBlocksMap.forEach((renderedBlocks, hook) -> { - if (hook != null) { - hook.apply(true, finalPass, null); - } else { - setDefaultPassRenderState(finalPass); - } - for (BlockPos pos : renderedBlocks) { - TileEntity tile = world.getTileEntity(pos); - if (tile != null) { - if (tile.shouldRenderInPass(finalPass)) { - TileEntityRendererDispatcher.instance.render(tile, pos.getX(), pos.getY(), pos.getZ(), 0); - } + setDefaultPassRenderState(pass); + for (BlockPos pos : renderedBlocks) { + TileEntity tile = world.getTileEntity(pos); + if (tile != null) { + if (tile.shouldRenderInPass(pass)) { + TileEntityRendererDispatcher.instance.render(tile, pos.getX(), pos.getY(), pos.getZ(), 0); } } - }); + } } ForgeHooksClient.setRenderPass(-1); GlStateManager.enableDepth(); diff --git a/src/main/java/gregtech/common/covers/CoverConveyor.java b/src/main/java/gregtech/common/covers/CoverConveyor.java index 1fa4e43dffe..b037492f993 100644 --- a/src/main/java/gregtech/common/covers/CoverConveyor.java +++ b/src/main/java/gregtech/common/covers/CoverConveyor.java @@ -43,7 +43,6 @@ import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IDrawable; -import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.factory.GuiData; import com.cleanroommc.modularui.factory.SidedPosGuiData; @@ -545,7 +544,6 @@ protected ParentWidget createUI(GuiData data, PanelSyncManager guiSyncMana .onMousePressed(mouseButton -> { int val = throughput.getValue() - getIncrementValue(MouseData.create(mouseButton)); throughput.setValue(val, true, true); - Interactable.playButtonClickSound(); return true; }) .onUpdateListener(w -> w.overlay(createAdjustOverlay(false)))) @@ -560,7 +558,6 @@ protected ParentWidget createUI(GuiData data, PanelSyncManager guiSyncMana .onMousePressed(mouseButton -> { int val = throughput.getValue() + getIncrementValue(MouseData.create(mouseButton)); throughput.setValue(val, true, true); - Interactable.playButtonClickSound(); return true; }) .onUpdateListener(w -> w.overlay(createAdjustOverlay(true))))); diff --git a/src/main/java/gregtech/common/covers/CoverPump.java b/src/main/java/gregtech/common/covers/CoverPump.java index b57e5a33545..659b916e80b 100644 --- a/src/main/java/gregtech/common/covers/CoverPump.java +++ b/src/main/java/gregtech/common/covers/CoverPump.java @@ -41,7 +41,6 @@ import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IDrawable; -import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.factory.GuiData; import com.cleanroommc.modularui.factory.SidedPosGuiData; @@ -226,7 +225,6 @@ protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { .onMousePressed(mouseButton -> { int val = throughput.getValue() - getIncrementValue(MouseData.create(mouseButton)); throughput.setValue(val); - Interactable.playButtonClickSound(); return true; }) .onUpdateListener(w -> w.overlay(createAdjustOverlay(false)))) @@ -241,7 +239,6 @@ protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { .onMousePressed(mouseButton -> { int val = throughput.getValue() + getIncrementValue(MouseData.create(mouseButton)); throughput.setValue(val); - Interactable.playButtonClickSound(); return true; }) .onUpdateListener(w -> w.overlay(createAdjustOverlay(true))))); diff --git a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java index 4ed97afcc0e..3bde5ee79d9 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java @@ -26,7 +26,6 @@ import codechicken.lib.raytracer.CuboidRayTraceResult; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.IWidget; -import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.drawable.GuiTextures; import com.cleanroommc.modularui.drawable.Rectangle; @@ -50,8 +49,9 @@ import org.jetbrains.annotations.Nullable; import org.lwjgl.input.Keyboard; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; -import java.util.Set; import java.util.UUID; import java.util.regex.Pattern; @@ -149,8 +149,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan protected Flow createWidgets(GuiData data, PanelSyncManager syncManager) { var name = new StringSyncValue(this::getColorStr, this::updateColor); - // todo unneeded cast in mui2 rc3 - var entrySelectorSH = (PanelSyncHandler) syncManager.panel("entry_selector", entrySelector(getType()), true); + var entrySelectorSH = syncManager.panel("entry_selector", entrySelector(getType()), true); return Flow.column().coverChildrenHeight().top(24) .margin(7, 0).widthRel(1f) @@ -173,6 +172,7 @@ protected Flow createWidgets(GuiData data, PanelSyncManager syncManager) { .onMousePressed(i -> { if (entrySelectorSH.isPanelOpen()) { entrySelectorSH.closePanel(); + entrySelectorSH.deleteCachedPanel(); } else { entrySelectorSH.openPanel(); } @@ -284,14 +284,19 @@ public void writeToNBT(@NotNull NBTTagCompound nbt) { protected PanelSyncHandler.IPanelBuilder entrySelector(EntryTypes type) { return (syncManager, syncHandler) -> { - Set names = VirtualEnderRegistry.getEntryNames(getOwner(), type); - return GTGuis.createPopupPanel("entry_selector", 168, 112) + List rows = new ArrayList<>(); + for (String name : VirtualEnderRegistry.getEntryNames(getOwner(), type)) { + rows.add(createRow(name, syncManager, type)); + } + return GTGuis.createPopupPanel("entry_selector", 168, 112, true) .child(IKey.lang("cover.generic.ender.known_channels") .color(UI_TITLE_COLOR) .asWidget() .top(6) .left(4)) - .child(ListWidget.builder(names, name -> createRow(name, syncManager, type)) + .child(new ListWidget<>() + .children(rows) + // .builder(names, name -> createRow(name, syncManager, type)) .background(GTGuiTextures.DISPLAY.asIcon() .width(168 - 8) .height(112 - 20)) @@ -305,7 +310,7 @@ protected PanelSyncHandler.IPanelBuilder entrySelector(EntryTypes type) { protected PanelSyncHandler.IPanelBuilder entryDescription(String key, T entry) { return (syncManager, syncHandler) -> { var sync = new StringSyncValue(entry::getDescription, entry::setDescription); - return GTGuis.createPopupPanel(key, 168, 36 + 6) + return GTGuis.createPopupPanel(key, 168, 36 + 6, true) .child(IKey.lang("cover.generic.ender.set_description.title", entry.getColorStr()) .color(UI_TITLE_COLOR) .asWidget() @@ -391,7 +396,6 @@ protected IWidget createRow(final String name, final PanelSyncManager syncManage getOwner() == null ? "null" : getOwner().toString()); NetworkUtils.writeStringSafe(buffer, name); }); - Interactable.playButtonClickSound(); return true; })); } diff --git a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java index 7bb6c7473e3..524998ec460 100644 --- a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java +++ b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java @@ -10,12 +10,13 @@ import net.minecraft.util.math.MathHelper; import net.minecraftforge.items.ItemStackHandler; +import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.drawable.GuiTextures; import com.cleanroommc.modularui.factory.GuiData; +import com.cleanroommc.modularui.network.NetworkUtils; import com.cleanroommc.modularui.utils.Alignment; -import com.cleanroommc.modularui.value.sync.PanelSyncHandler; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.SyncHandlers; import com.cleanroommc.modularui.widgets.ButtonWidget; @@ -24,8 +25,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.io.IOException; - public abstract class BaseFilterContainer extends ItemStackHandler { private int maxTransferSize = 1; @@ -213,7 +212,7 @@ public void handleLegacyNBT(NBTTagCompound nbt) { /** Uses Cleanroom MUI */ public IWidget initUI(GuiData data, PanelSyncManager manager) { - PanelSyncHandler panel = (PanelSyncHandler) manager.panel("filter_panel", (syncManager, syncHandler) -> { + IPanelHandler panel = manager.panel("filter_panel", (syncManager, syncHandler) -> { var filter = hasFilter() ? getFilter() : BaseFilter.ERROR_FILTER; filter.setMaxTransferSize(getMaxTransferSize()); return filter.createPopupPanel(syncManager); @@ -253,17 +252,13 @@ public IWidget initUI(GuiData data, PanelSyncManager manager) { } public void writeInitialSyncData(PacketBuffer packetBuffer) { - packetBuffer.writeItemStack(this.getFilterStack()); + NetworkUtils.writeItemStack(packetBuffer, this.getFilterStack()); packetBuffer.writeInt(this.maxTransferSize); packetBuffer.writeInt(this.transferSize); } public void readInitialSyncData(@NotNull PacketBuffer packetBuffer) { - var stack = ItemStack.EMPTY; - try { - stack = packetBuffer.readItemStack(); - } catch (IOException ignore) {} - this.setFilterStack(stack); + this.setFilterStack(NetworkUtils.readItemStack(packetBuffer)); this.setMaxTransferSize(packetBuffer.readInt()); this.setTransferSize(packetBuffer.readInt()); } diff --git a/src/main/java/gregtech/common/covers/filter/OreDictionaryItemFilter.java b/src/main/java/gregtech/common/covers/filter/OreDictionaryItemFilter.java index 0d91fd97cf8..d12a346724a 100644 --- a/src/main/java/gregtech/common/covers/filter/OreDictionaryItemFilter.java +++ b/src/main/java/gregtech/common/covers/filter/OreDictionaryItemFilter.java @@ -75,7 +75,7 @@ public void initUI(Consumer widgetGroup) {} @Override public @NotNull ModularPanel createPopupPanel(PanelSyncManager syncManager) { - return GTGuis.createPopupPanel("ore_dict_filter", 188, 76) + return GTGuis.createPopupPanel("ore_dict_filter", 188, 76, false) .padding(7) .child(CoverWithUI.createTitleRow(getContainerStack())) .child(createWidgets(syncManager).top(22)); diff --git a/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java b/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java index b36acc61283..f91d5105799 100644 --- a/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java +++ b/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java @@ -39,7 +39,7 @@ public void configureFilterTanks(int amount) { @Override public @NotNull ModularPanel createPopupPanel(PanelSyncManager syncManager) { - return GTGuis.createPopupPanel("simple_fluid_filter", 98, 81) + return GTGuis.createPopupPanel("simple_fluid_filter", 98, 81, false) .padding(4) .child(CoverWithUI.createTitleRow(getContainerStack())) .child(createWidgets(syncManager).top(22)); diff --git a/src/main/java/gregtech/common/covers/filter/SimpleItemFilter.java b/src/main/java/gregtech/common/covers/filter/SimpleItemFilter.java index d69e6de7649..dbeabae9c0b 100644 --- a/src/main/java/gregtech/common/covers/filter/SimpleItemFilter.java +++ b/src/main/java/gregtech/common/covers/filter/SimpleItemFilter.java @@ -94,7 +94,7 @@ public void initUI(Consumer widgetGroup) { @Override public @NotNull ModularPanel createPopupPanel(PanelSyncManager syncManager) { - return GTGuis.createPopupPanel("simple_item_filter", 98, 81) + return GTGuis.createPopupPanel("simple_item_filter", 98, 81, false) .child(CoverWithUI.createTitleRow(getContainerStack())) .child(createWidgets(syncManager).top(22).left(4)); } diff --git a/src/main/java/gregtech/common/covers/filter/SmartItemFilter.java b/src/main/java/gregtech/common/covers/filter/SmartItemFilter.java index d7cbf29c463..b86f37b0cde 100644 --- a/src/main/java/gregtech/common/covers/filter/SmartItemFilter.java +++ b/src/main/java/gregtech/common/covers/filter/SmartItemFilter.java @@ -98,7 +98,7 @@ public void initUI(Consumer widgetGroup) { @Override public @NotNull ModularPanel createPopupPanel(PanelSyncManager syncManager) { - return GTGuis.createPopupPanel("smart_item_filter", 98 + 27, 81) + return GTGuis.createPopupPanel("smart_item_filter", 98 + 27, 81, false) .child(CoverWithUI.createTitleRow(getContainerStack())) .child(createWidgets(syncManager).top(22).left(4)); } diff --git a/src/main/java/gregtech/common/items/MetaItem1.java b/src/main/java/gregtech/common/items/MetaItem1.java index 3cf94c8a5b5..cae98881402 100644 --- a/src/main/java/gregtech/common/items/MetaItem1.java +++ b/src/main/java/gregtech/common/items/MetaItem1.java @@ -191,46 +191,51 @@ public void registerSubItems() { // Fluid Cells: ID 78-88 FLUID_CELL = addItem(78, "fluid_cell") .addComponents(new FilteredFluidStats(1000, 1800, true, false, false, false, false), - new ItemFluidContainer()) + new ItemFluidContainer(true)) .setCreativeTabs(GTCreativeTabs.TAB_GREGTECH_TOOLS); FLUID_CELL_UNIVERSAL = addItem(79, "fluid_cell.universal") .addComponents(new FilteredFluidStats(1000, 1800, true, false, false, false, true), - new ItemFluidContainer()) + new ItemFluidContainer(true)) .setCreativeTabs(GTCreativeTabs.TAB_GREGTECH_TOOLS); FLUID_CELL_LARGE_STEEL = addItem(80, "large_fluid_cell.steel") .addComponents(new FilteredFluidStats(8000, Materials.Steel.getProperty(PropertyKey.FLUID_PIPE).getMaxFluidTemperature(), true, false, - false, false, true), new ItemFluidContainer()) + false, false, true), + new ItemFluidContainer(true)) .setMaterialInfo(new ItemMaterialInfo(new MaterialStack(Materials.Steel, M * 4))) // ingot * 4 .setCreativeTabs(GTCreativeTabs.TAB_GREGTECH_TOOLS); FLUID_CELL_LARGE_ALUMINIUM = addItem(81, "large_fluid_cell.aluminium") .addComponents(new FilteredFluidStats(32000, Materials.Aluminium.getProperty(PropertyKey.FLUID_PIPE).getMaxFluidTemperature(), true, false, - false, false, true), new ItemFluidContainer()) + false, false, true), + new ItemFluidContainer(true)) .setMaterialInfo(new ItemMaterialInfo(new MaterialStack(Materials.Aluminium, M * 4))) // ingot * 4 .setCreativeTabs(GTCreativeTabs.TAB_GREGTECH_TOOLS); FLUID_CELL_LARGE_STAINLESS_STEEL = addItem(82, "large_fluid_cell.stainless_steel") .addComponents(new FilteredFluidStats(64000, Materials.StainlessSteel.getProperty(PropertyKey.FLUID_PIPE).getMaxFluidTemperature(), true, - true, true, false, true), new ItemFluidContainer()) + true, true, false, true), + new ItemFluidContainer(true)) .setMaterialInfo(new ItemMaterialInfo(new MaterialStack(Materials.StainlessSteel, M * 6))) // ingot * 6 .setCreativeTabs(GTCreativeTabs.TAB_GREGTECH_TOOLS); FLUID_CELL_LARGE_TITANIUM = addItem(83, "large_fluid_cell.titanium") .addComponents(new FilteredFluidStats(128000, Materials.Titanium.getProperty(PropertyKey.FLUID_PIPE).getMaxFluidTemperature(), true, true, - false, false, true), new ItemFluidContainer()) + false, false, true), + new ItemFluidContainer(true)) .setMaterialInfo(new ItemMaterialInfo(new MaterialStack(Materials.Titanium, M * 6))) // ingot * 6 .setCreativeTabs(GTCreativeTabs.TAB_GREGTECH_TOOLS); FLUID_CELL_LARGE_TUNGSTEN_STEEL = addItem(84, "large_fluid_cell.tungstensteel") .addComponents(new FilteredFluidStats(512000, Materials.TungstenSteel.getProperty(PropertyKey.FLUID_PIPE).getMaxFluidTemperature(), true, - true, false, false, true), new ItemFluidContainer()) + true, false, false, true), + new ItemFluidContainer(true)) .setMaxStackSize(32) .setMaterialInfo(new ItemMaterialInfo(new MaterialStack(Materials.TungstenSteel, M * 8))) // ingot * 8 .setCreativeTabs(GTCreativeTabs.TAB_GREGTECH_TOOLS); diff --git a/src/main/java/gregtech/common/items/behaviors/monitorplugin/AdvancedMonitorPluginBehavior.java b/src/main/java/gregtech/common/items/behaviors/monitorplugin/AdvancedMonitorPluginBehavior.java index 7c3da2f0166..694dcc04f5e 100644 --- a/src/main/java/gregtech/common/items/behaviors/monitorplugin/AdvancedMonitorPluginBehavior.java +++ b/src/main/java/gregtech/common/items/behaviors/monitorplugin/AdvancedMonitorPluginBehavior.java @@ -104,7 +104,7 @@ private void createWorldScene() { TrackedDummyWorld dummyWorld = new TrackedDummyWorld(world); dummyWorld.setRenderFilter(pos -> validPos.contains(pos)); worldSceneRenderer = new FBOWorldSceneRenderer(dummyWorld, FBO); - worldSceneRenderer.addRenderedBlocks(validPos, null); + worldSceneRenderer.addRenderedBlocks(validPos); center = new Vector3f((minX + maxX) / 2f + 0.5f, (minY + maxY) / 2f + 0.5f, (minZ + maxZ) / 2f + 0.5f); worldSceneRenderer.setCameraLookAt(center, 10 / scale, Math.toRadians(rotationPitch), Math.toRadians(rotationYaw)); diff --git a/src/main/java/gregtech/common/metatileentities/MetaTileEntities.java b/src/main/java/gregtech/common/metatileentities/MetaTileEntities.java index dbe94985456..5e213673e81 100644 --- a/src/main/java/gregtech/common/metatileentities/MetaTileEntities.java +++ b/src/main/java/gregtech/common/metatileentities/MetaTileEntities.java @@ -2,6 +2,7 @@ import gregtech.api.GTValues; import gregtech.api.GregTechAPI; +import gregtech.api.capability.FeCompat; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.SimpleGeneratorMetaTileEntity; import gregtech.api.metatileentity.SimpleMachineMetaTileEntity; @@ -206,24 +207,24 @@ public class MetaTileEntities { public static final SimpleGeneratorMetaTileEntity[] GAS_TURBINE = new SimpleGeneratorMetaTileEntity[4]; // MULTIBLOCK PARTS SECTION - public static final MetaTileEntityItemBus[] ITEM_IMPORT_BUS = new MetaTileEntityItemBus[GTValues.UHV + 1]; // ULV-UHV - public static final MetaTileEntityItemBus[] ITEM_EXPORT_BUS = new MetaTileEntityItemBus[GTValues.UHV + 1]; - public static final MetaTileEntityFluidHatch[] FLUID_IMPORT_HATCH = new MetaTileEntityFluidHatch[GTValues.UHV + 1]; - public static final MetaTileEntityFluidHatch[] FLUID_EXPORT_HATCH = new MetaTileEntityFluidHatch[GTValues.UHV + 1]; - public static final MetaTileEntityMultiFluidHatch[] QUADRUPLE_IMPORT_HATCH = new MetaTileEntityMultiFluidHatch[6]; // EV-UHV - public static final MetaTileEntityMultiFluidHatch[] NONUPLE_IMPORT_HATCH = new MetaTileEntityMultiFluidHatch[6]; // EV-UHV - public static final MetaTileEntityMultiFluidHatch[] QUADRUPLE_EXPORT_HATCH = new MetaTileEntityMultiFluidHatch[6]; // EV-UHV - public static final MetaTileEntityMultiFluidHatch[] NONUPLE_EXPORT_HATCH = new MetaTileEntityMultiFluidHatch[6]; // EV-UHV + public static final MetaTileEntityItemBus[] ITEM_IMPORT_BUS = new MetaTileEntityItemBus[GTValues.V.length - 1]; // All tiers but MAX + public static final MetaTileEntityItemBus[] ITEM_EXPORT_BUS = new MetaTileEntityItemBus[GTValues.V.length - 1]; + public static final MetaTileEntityFluidHatch[] FLUID_IMPORT_HATCH = new MetaTileEntityFluidHatch[GTValues.V.length - 1]; + public static final MetaTileEntityFluidHatch[] FLUID_EXPORT_HATCH = new MetaTileEntityFluidHatch[GTValues.V.length - 1]; + public static final MetaTileEntityMultiFluidHatch[] QUADRUPLE_IMPORT_HATCH = new MetaTileEntityMultiFluidHatch[11]; // EV+ + public static final MetaTileEntityMultiFluidHatch[] NONUPLE_IMPORT_HATCH = new MetaTileEntityMultiFluidHatch[11]; // EV+ + public static final MetaTileEntityMultiFluidHatch[] QUADRUPLE_EXPORT_HATCH = new MetaTileEntityMultiFluidHatch[11]; // EV+ + public static final MetaTileEntityMultiFluidHatch[] NONUPLE_EXPORT_HATCH = new MetaTileEntityMultiFluidHatch[11]; // EV+ public static final MetaTileEntityEnergyHatch[] ENERGY_INPUT_HATCH = new MetaTileEntityEnergyHatch[GTValues.V.length]; - public static final MetaTileEntityEnergyHatch[] ENERGY_INPUT_HATCH_4A = new MetaTileEntityEnergyHatch[6]; // EV, IV, LuV, ZPM, UV, UHV - public static final MetaTileEntityEnergyHatch[] ENERGY_INPUT_HATCH_16A = new MetaTileEntityEnergyHatch[5]; // IV, LuV, ZPM, UV, UHV + public static final MetaTileEntityEnergyHatch[] ENERGY_INPUT_HATCH_4A = new MetaTileEntityEnergyHatch[11]; // EV+ + public static final MetaTileEntityEnergyHatch[] ENERGY_INPUT_HATCH_16A = new MetaTileEntityEnergyHatch[10]; // IV+ public static final MetaTileEntityEnergyHatch[] ENERGY_OUTPUT_HATCH = new MetaTileEntityEnergyHatch[GTValues.V.length]; - public static final MetaTileEntityEnergyHatch[] ENERGY_OUTPUT_HATCH_4A = new MetaTileEntityEnergyHatch[6]; // EV, IV, LuV, ZPM, UV, UHV - public static final MetaTileEntityEnergyHatch[] ENERGY_OUTPUT_HATCH_16A = new MetaTileEntityEnergyHatch[5]; // IV, LuV, ZPM, UV, UHV - public static final MetaTileEntitySubstationEnergyHatch[] SUBSTATION_ENERGY_INPUT_HATCH = new MetaTileEntitySubstationEnergyHatch[5]; // IV, LuV, ZPM, UV, UHV - public static final MetaTileEntitySubstationEnergyHatch[] SUBSTATION_ENERGY_OUTPUT_HATCH = new MetaTileEntitySubstationEnergyHatch[5]; // IV, LuV, ZPM, UV, UHV + public static final MetaTileEntityEnergyHatch[] ENERGY_OUTPUT_HATCH_4A = new MetaTileEntityEnergyHatch[11]; // EV+ + public static final MetaTileEntityEnergyHatch[] ENERGY_OUTPUT_HATCH_16A = new MetaTileEntityEnergyHatch[10]; // IV+ + public static final MetaTileEntitySubstationEnergyHatch[] SUBSTATION_ENERGY_INPUT_HATCH = new MetaTileEntitySubstationEnergyHatch[10]; // IV+ + public static final MetaTileEntitySubstationEnergyHatch[] SUBSTATION_ENERGY_OUTPUT_HATCH = new MetaTileEntitySubstationEnergyHatch[10]; // IV+ public static final MetaTileEntityRotorHolder[] ROTOR_HOLDER = new MetaTileEntityRotorHolder[6]; // HV, EV, IV, LuV, ZPM, UV - public static final MetaTileEntityMufflerHatch[] MUFFLER_HATCH = new MetaTileEntityMufflerHatch[GTValues.UV + 1]; // LV-UV + public static final MetaTileEntityMufflerHatch[] MUFFLER_HATCH = new MetaTileEntityMufflerHatch[GTValues.UHV + 1]; // LV-UHV public static final MetaTileEntityFusionReactor[] FUSION_REACTOR = new MetaTileEntityFusionReactor[3]; public static MetaTileEntityQuantumStorageController QUANTUM_STORAGE_CONTROLLER; public static MetaTileEntityQuantumProxy QUANTUM_STORAGE_PROXY; @@ -378,6 +379,7 @@ public class MetaTileEntities { public static MetaTileEntityLDFluidEndpoint LONG_DIST_FLUID_ENDPOINT; public static MetaTileEntityAlarm ALARM; + // todo public static MetaTileEntityConverter[][] ENERGY_CONVERTER = new MetaTileEntityConverter[4][GTValues.V.length]; //spotless:on @@ -783,7 +785,8 @@ public static void init() { // MISC MTE's START: IDs 1150-2000 // Import/Export Buses/Hatches, IDs 1150-1209 - for (int i = 0; i < ITEM_IMPORT_BUS.length; i++) { + endPos = GregTechAPI.isHighTier() ? ITEM_IMPORT_BUS.length : GTValues.UHV + 1; + for (int i = 0; i < endPos; i++) { String voltageName = GTValues.VN[i].toLowerCase(); ITEM_IMPORT_BUS[i] = new MetaTileEntityItemBus(gregtechId("item_bus.import." + voltageName), i, false); ITEM_EXPORT_BUS[i] = new MetaTileEntityItemBus(gregtechId("item_bus.export." + voltageName), i, true); @@ -792,15 +795,22 @@ public static void init() { FLUID_EXPORT_HATCH[i] = new MetaTileEntityFluidHatch(gregtechId("fluid_hatch.export." + voltageName), i, true); - registerMetaTileEntity(1150 + i, ITEM_IMPORT_BUS[i]); - registerMetaTileEntity(1165 + i, ITEM_EXPORT_BUS[i]); - registerMetaTileEntity(1180 + i, FLUID_IMPORT_HATCH[i]); - registerMetaTileEntity(1195 + i, FLUID_EXPORT_HATCH[i]); + if (i <= GTValues.UHV) { + registerMetaTileEntity(1150 + i, ITEM_IMPORT_BUS[i]); + registerMetaTileEntity(1165 + i, ITEM_EXPORT_BUS[i]); + registerMetaTileEntity(1180 + i, FLUID_IMPORT_HATCH[i]); + registerMetaTileEntity(1195 + i, FLUID_EXPORT_HATCH[i]); + } else { + registerMetaTileEntity(1850 + i, ITEM_IMPORT_BUS[i]); + registerMetaTileEntity(1855 + i, ITEM_EXPORT_BUS[i]); + registerMetaTileEntity(1860 + i, FLUID_IMPORT_HATCH[i]); + registerMetaTileEntity(1865 + i, FLUID_EXPORT_HATCH[i]); + } } // IDs 1190, 1191, 1205, and 1206 reserved for multi-fluid hatches - // Energy Input/Output Hatches, IDs 1210-1269 + // Energy Input/Output Hatches, IDs 1210-1269, 1800-1829 endPos = GregTechAPI.isHighTier() ? ENERGY_INPUT_HATCH.length - 1 : Math.min(ENERGY_INPUT_HATCH.length - 1, GTValues.UV + 2); for (int i = 0; i < endPos; i++) { @@ -810,21 +820,23 @@ public static void init() { ENERGY_OUTPUT_HATCH[i] = registerMetaTileEntity(1225 + i, new MetaTileEntityEnergyHatch(gregtechId("energy_hatch.output." + voltageName), i, 2, true)); - if (i >= GTValues.IV && i <= GTValues.UHV) { - ENERGY_INPUT_HATCH_4A[i + 1 - GTValues.IV] = registerMetaTileEntity(1240 + i - GTValues.IV, + if (i >= GTValues.IV) { + int baseId = (i <= GTValues.UHV ? 1240 : 1820); + + ENERGY_INPUT_HATCH_4A[i + 1 - GTValues.IV] = registerMetaTileEntity(baseId + i - GTValues.IV, new MetaTileEntityEnergyHatch(gregtechId("energy_hatch.input_4a." + voltageName), i, 4, false)); - ENERGY_INPUT_HATCH_16A[i - GTValues.IV] = registerMetaTileEntity(1245 + i - GTValues.IV, + ENERGY_INPUT_HATCH_16A[i - GTValues.IV] = registerMetaTileEntity(baseId + 5 + i - GTValues.IV, new MetaTileEntityEnergyHatch(gregtechId("energy_hatch.input_16a." + voltageName), i, 16, false)); - ENERGY_OUTPUT_HATCH_4A[i + 1 - GTValues.IV] = registerMetaTileEntity(1250 + i - GTValues.IV, + ENERGY_OUTPUT_HATCH_4A[i + 1 - GTValues.IV] = registerMetaTileEntity(baseId + 10 + i - GTValues.IV, new MetaTileEntityEnergyHatch(gregtechId("energy_hatch.output_4a." + voltageName), i, 4, true)); - ENERGY_OUTPUT_HATCH_16A[i - GTValues.IV] = registerMetaTileEntity(1255 + i - GTValues.IV, + ENERGY_OUTPUT_HATCH_16A[i - GTValues.IV] = registerMetaTileEntity(baseId + 15 + i - GTValues.IV, new MetaTileEntityEnergyHatch(gregtechId("energy_hatch.output_16a." + voltageName), i, 16, true)); - SUBSTATION_ENERGY_INPUT_HATCH[i - GTValues.IV] = registerMetaTileEntity(1260 + i - GTValues.IV, + SUBSTATION_ENERGY_INPUT_HATCH[i - GTValues.IV] = registerMetaTileEntity(baseId + 20 + i - GTValues.IV, new MetaTileEntitySubstationEnergyHatch(gregtechId("substation_hatch.input_64a." + voltageName), i, 64, false)); - SUBSTATION_ENERGY_OUTPUT_HATCH[i - GTValues.IV] = registerMetaTileEntity(1265 + i - GTValues.IV, + SUBSTATION_ENERGY_OUTPUT_HATCH[i - GTValues.IV] = registerMetaTileEntity(baseId + 25 + i - GTValues.IV, new MetaTileEntitySubstationEnergyHatch( gregtechId("substation_hatch.output_64a." + voltageName), i, 64, true)); } @@ -860,8 +872,7 @@ public static void init() { } // Battery Buffer, IDs 1315-1360 - endPos = GregTechAPI.isHighTier() ? BATTERY_BUFFER[0].length - 1 : - Math.min(BATTERY_BUFFER[0].length - 1, GTValues.UHV + 1); + endPos = GregTechAPI.isHighTier() ? BATTERY_BUFFER[0].length : GTValues.UHV + 1; int[] batteryBufferSlots = new int[] { 4, 8, 16 }; for (int slot = 0; slot < batteryBufferSlots.length; slot++) { BATTERY_BUFFER[slot] = new MetaTileEntityBatteryBuffer[endPos]; @@ -875,7 +886,7 @@ public static void init() { } // Charger, IDs 1375-1389 - endPos = GregTechAPI.isHighTier() ? CHARGER.length - 1 : Math.min(CHARGER.length - 1, GTValues.UHV + 1); + endPos = GregTechAPI.isHighTier() ? CHARGER.length : GTValues.UHV + 1; for (int i = 0; i < endPos; i++) { String chargerId = "charger." + GTValues.VN[i].toLowerCase(); MetaTileEntityCharger charger = new MetaTileEntityCharger(gregtechId(chargerId), i, 4); @@ -1111,9 +1122,10 @@ public static void init() { CLEANING_MAINTENANCE_HATCH = registerMetaTileEntity(1401, new MetaTileEntityCleaningMaintenanceHatch(gregtechId("maintenance_hatch_cleanroom_auto"))); - // Muffler Hatches, IDs 1657-1664 + // Muffler Hatches, IDs 1657-1665 for (int i = 0; i < MUFFLER_HATCH.length - 1; i++) { int tier = i + 1; + if (!GregTechAPI.isHighTier() && tier == GTValues.UHV) continue; // requires UHV motor to craft, so skip String voltageName = GTValues.VN[tier].toLowerCase(); MUFFLER_HATCH[tier] = new MetaTileEntityMufflerHatch(gregtechId("muffler_hatch." + voltageName), tier); @@ -1129,11 +1141,20 @@ public static void init() { CREATIVE_TANK = registerMetaTileEntity(1669, new MetaTileEntityCreativeTank(gregtechId("creative_tank"))); // Energy Converter, IDs 1670-1729 - endPos = GregTechAPI.isHighTier() ? ENERGY_CONVERTER[0].length - 1 : - Math.min(ENERGY_CONVERTER[0].length - 1, GTValues.UHV + 1); + endPos = GregTechAPI.isHighTier() ? ENERGY_CONVERTER[0].length : GTValues.UHV + 1; int[] amps = { 1, 4, 8, 16 }; for (int i = 0; i < endPos; i++) { for (int j = 0; j < 4; j++) { + // Check to make sure this is a valid amount of power to be able to convert. + // Tests if both: + // - The maximum amount of EU/t of this converter can turn into FE without overflowing + // - Max int FE/t can convert to the full amount of EU/t without being short + // This is done because these ratios are configured separately. + long eu = amps[j] * GTValues.V[i]; + long euToFe = FeCompat.toFeLong(eu, FeCompat.ratio(false)); + long feToEu = FeCompat.toEu(Integer.MAX_VALUE, FeCompat.ratio(true)); + if (euToFe > Integer.MAX_VALUE || feToEu < eu) continue; + String id = "energy_converter." + GTValues.VN[i].toLowerCase() + "." + amps[j]; MetaTileEntityConverter converter = new MetaTileEntityConverter(gregtechId(id), i, amps[j]); ENERGY_CONVERTER[j][i] = registerMetaTileEntity(1670 + j + i * 4, converter); @@ -1171,7 +1192,7 @@ public static void init() { // IDs 1752-1756 are taken by AE2 parts - // Multi-Fluid Hatches, IDs 1190, 1191, 1205, 1206, 1780-1799 + // Multi-Fluid Hatches, IDs 1190, 1191, 1205, 1206, 1780-1819 // EV hatches separate because of old names/IDs QUADRUPLE_IMPORT_HATCH[0] = registerMetaTileEntity(1190, new MetaTileEntityMultiFluidHatch(gregtechId("fluid_hatch.import_4x"), GTValues.EV, 4, false)); @@ -1181,19 +1202,23 @@ public static void init() { new MetaTileEntityMultiFluidHatch(gregtechId("fluid_hatch.export_4x"), GTValues.EV, 4, true)); NONUPLE_EXPORT_HATCH[0] = registerMetaTileEntity(1206, new MetaTileEntityMultiFluidHatch(gregtechId("fluid_hatch.export_9x"), GTValues.EV, 9, true)); - for (int i = GTValues.IV; i <= GTValues.UHV; i++) { + for (int i = GTValues.IV; i <= (GregTechAPI.isHighTier() ? GTValues.OpV : GTValues.UHV); i++) { int index = i - GTValues.IV; + int startId = i > GTValues.UHV ? 1800 : 1780; String tierName = GTValues.VN[i].toLowerCase(); - QUADRUPLE_IMPORT_HATCH[index + 1] = registerMetaTileEntity(1780 + index, + QUADRUPLE_IMPORT_HATCH[index + 1] = registerMetaTileEntity(startId + index, new MetaTileEntityMultiFluidHatch(gregtechId("fluid_hatch.import_4x." + tierName), i, 4, false)); - NONUPLE_IMPORT_HATCH[index + 1] = registerMetaTileEntity(1785 + index, + NONUPLE_IMPORT_HATCH[index + 1] = registerMetaTileEntity(startId + 5 + index, new MetaTileEntityMultiFluidHatch(gregtechId("fluid_hatch.import_9x." + tierName), i, 9, false)); - QUADRUPLE_EXPORT_HATCH[index + 1] = registerMetaTileEntity(1790 + index, + QUADRUPLE_EXPORT_HATCH[index + 1] = registerMetaTileEntity(startId + 10 + index, new MetaTileEntityMultiFluidHatch(gregtechId("fluid_hatch.export_4x." + tierName), i, 4, true)); - NONUPLE_EXPORT_HATCH[index + 1] = registerMetaTileEntity(1795 + index, + NONUPLE_EXPORT_HATCH[index + 1] = registerMetaTileEntity(startId + 15 + index, new MetaTileEntityMultiFluidHatch(gregtechId("fluid_hatch.export_9x." + tierName), i, 9, true)); } + // 1820-1849 are taken for UHV+ 4A/16A/64A Energy/Dynamo Hatches + // 1850-1869 are taken for UHV+ Input/Output Buses/Hatches + /* * FOR ADDON DEVELOPERS: * diff --git a/src/main/java/gregtech/common/metatileentities/MetaTileEntityClipboard.java b/src/main/java/gregtech/common/metatileentities/MetaTileEntityClipboard.java index a50a2978aae..02fbe96793d 100644 --- a/src/main/java/gregtech/common/metatileentities/MetaTileEntityClipboard.java +++ b/src/main/java/gregtech/common/metatileentities/MetaTileEntityClipboard.java @@ -529,6 +529,11 @@ public boolean canPlaceCoverOnSide(@NotNull EnumFacing side) { return false; } + @Override + public boolean acceptsCovers() { + return false; + } + @Override public boolean canRenderMachineGrid(@NotNull ItemStack mainHandStack, @NotNull ItemStack offHandStack) { return false; diff --git a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityBatteryBuffer.java b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityBatteryBuffer.java index 22060a1716b..88caa0adc19 100644 --- a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityBatteryBuffer.java +++ b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityBatteryBuffer.java @@ -6,19 +6,16 @@ import gregtech.api.capability.IControllable; import gregtech.api.capability.IElectricItem; import gregtech.api.capability.impl.EnergyContainerBatteryBuffer; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.ModularUI.Builder; -import gregtech.api.gui.widgets.SlotWidget; import gregtech.api.metatileentity.*; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuis; import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.texture.Textures; import gregtech.client.utils.PipelineUtil; import gregtech.common.ConfigHolder; 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.util.EnumFacing; @@ -37,6 +34,15 @@ 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.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.layout.Grid; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -137,27 +143,42 @@ protected void initializeInventory() { } @Override - protected ModularUI createUI(EntityPlayer entityPlayer) { + public boolean usesMui2() { + return true; + } + + @Override + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { int rowSize = (int) Math.sqrt(inventorySize); int colSize = rowSize; if (inventorySize == 8) { rowSize = 4; colSize = 2; } - Builder builder = ModularUI.builder(GuiTextures.BACKGROUND, 176, - 18 + 18 * colSize + 94) - .label(6, 6, getMetaFullName()); + + guiSyncManager.registerSlotGroup("item_inv", rowSize); int index = 0; + List> widgets = new ArrayList<>(); for (int y = 0; y < colSize; y++) { + widgets.add(new ArrayList<>()); for (int x = 0; x < rowSize; x++) { - builder.widget(new SlotWidget(importItems, index++, 88 - rowSize * 9 + x * 18, 18 + y * 18, true, true) - .setBackgroundTexture(GuiTextures.SLOT, GuiTextures.BATTERY_OVERLAY)); + widgets.get(y).add(new ItemSlot().slot(SyncHandlers.itemSlot(this.importItems, index++) + .slotGroup("item_inv")) + .background(GTGuiTextures.SLOT, GTGuiTextures.BATTERY_OVERLAY)); } } - builder.bindPlayerInventory(entityPlayer.inventory, GuiTextures.SLOT, 7, 18 + 18 * colSize + 12); - return builder.build(getHolder(), entityPlayer); + // TODO: Change the position of the name when it's standardized. + return GTGuis.createPanel(this, 176, 18 + 18 * colSize + 94) + .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) + .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) + .child(new Grid() + .top(18).height(colSize * 18).width(rowSize * 18) + .minElementMargin(0, 0) + .minColWidth(18).minRowHeight(18) + .alignX(0.5f) + .matrix(widgets)); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityBlockBreaker.java b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityBlockBreaker.java index 52855de6e03..9e5a81f5299 100644 --- a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityBlockBreaker.java +++ b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityBlockBreaker.java @@ -1,14 +1,11 @@ package gregtech.common.metatileentities.electric; import gregtech.api.GTValues; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.ModularUI.Builder; -import gregtech.api.gui.widgets.SlotWidget; import gregtech.api.items.itemhandlers.GTItemStackHandler; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.TieredMetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; +import gregtech.api.mui.GTGuis; import gregtech.api.util.BlockUtility; import gregtech.api.util.GTTransferUtils; import gregtech.api.util.GregFakePlayer; @@ -38,8 +35,18 @@ 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.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.layout.Grid; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -247,20 +254,34 @@ protected IItemHandlerModifiable createExportItemHandler() { } @Override - protected ModularUI createUI(EntityPlayer entityPlayer) { + public boolean usesMui2() { + return true; + } + + @Override + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { int rowSize = (int) Math.sqrt(getInventorySize()); - Builder builder = ModularUI.builder(GuiTextures.BACKGROUND, 176, 18 + 18 * rowSize + 94) - .label(10, 5, getMetaFullName()); - - for (int y = 0; y < rowSize; y++) { - for (int x = 0; x < rowSize; x++) { - int index = y * rowSize + x; - builder.widget(new SlotWidget(exportItems, index, 89 - rowSize * 9 + x * 18, 18 + y * 18, true, false) - .setBackgroundTexture(GuiTextures.SLOT)); + guiSyncManager.registerSlotGroup("item_inv", rowSize); + + List> widgets = new ArrayList<>(); + for (int i = 0; i < rowSize; i++) { + widgets.add(new ArrayList<>()); + for (int j = 0; j < rowSize; j++) { + int index = i * rowSize + j; + widgets.get(i).add(new ItemSlot().slot(SyncHandlers.itemSlot(exportItems, index) + .slotGroup("item_inv").accessibility(false, true))); } } - builder.bindPlayerInventory(entityPlayer.inventory, GuiTextures.SLOT, 7, 18 + 18 * rowSize + 12); - return builder.build(getHolder(), entityPlayer); + + return GTGuis.createPanel(this, 176, 18 + 18 * rowSize + 94) + .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)); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityFisher.java b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityFisher.java index d0c2f925a81..c32f2ce65a2 100644 --- a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityFisher.java +++ b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityFisher.java @@ -1,13 +1,12 @@ package gregtech.common.metatileentities.electric; import gregtech.api.GTValues; -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.TieredMetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuis; import gregtech.api.unification.OreDictUnifier; import gregtech.api.util.GTTransferUtils; import gregtech.client.renderer.texture.Textures; @@ -15,7 +14,6 @@ import net.minecraft.block.BlockLiquid; import net.minecraft.block.material.Material; import net.minecraft.client.resources.I18n; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; @@ -30,9 +28,19 @@ 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.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.layout.Grid; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.List; public class MetaTileEntityFisher extends TieredMetaTileEntity { @@ -57,25 +65,41 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) { } @Override - protected ModularUI createUI(EntityPlayer entityPlayer) { - int rowSize = (int) Math.sqrt(inventorySize); + public boolean usesMui2() { + return true; + } - ModularUI.Builder builder = ModularUI.builder(GuiTextures.BACKGROUND, 176, - 18 + 18 * rowSize + 94) - .label(10, 5, getMetaFullName()) - .widget(new SlotWidget(importItems, 0, 18, 18, true, true) - .setBackgroundTexture(GuiTextures.SLOT, GuiTextures.STRING_SLOT_OVERLAY)); - - for (int y = 0; y < rowSize; y++) { - for (int x = 0; x < rowSize; x++) { - int index = y * rowSize + x; - builder.widget(new SlotWidget(exportItems, index, 89 - rowSize * 9 + x * 18, 18 + y * 18, true, false) - .setBackgroundTexture(GuiTextures.SLOT)); + @Override + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { + int rowSize = (int) Math.sqrt(inventorySize); + guiSyncManager.registerSlotGroup("item_in", 1); + guiSyncManager.registerSlotGroup("item_out", rowSize); + + List> widgets = new ArrayList<>(); + for (int i = 0; i < rowSize; i++) { + widgets.add(new ArrayList<>()); + for (int j = 0; j < rowSize; j++) { + int index = i * rowSize + j; + widgets.get(i).add(new ItemSlot() + .slot(SyncHandlers.itemSlot(exportItems, index) + .slotGroup("item_out") + .accessibility(false, true))); } } - builder.bindPlayerInventory(entityPlayer.inventory, GuiTextures.SLOT, 7, 18 + 18 * rowSize + 12); - return builder.build(getHolder(), entityPlayer); + return GTGuis.createPanel(this, 176, 18 + 18 * rowSize + 94) + .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) + .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) + .child(new ItemSlot().slot(SyncHandlers.itemSlot(importItems, 0) + .slotGroup("item_in")) + .background(GTGuiTextures.SLOT, GTGuiTextures.STRING_SLOT_OVERLAY) + .pos(7 + 9, 9 * (rowSize + 1))) + .child(new Grid() + .top(18).alignX(0.5f) + .height(rowSize * 18) + .minElementMargin(0, 0) + .minColWidth(18).minRowHeight(18) + .matrix(widgets)); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPumpHatch.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPumpHatch.java index dc158cd074a..bbdfff7ae9d 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPumpHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPumpHatch.java @@ -2,29 +2,28 @@ import gregtech.api.capability.impl.FilteredItemHandler; import gregtech.api.capability.impl.FluidTankList; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.widgets.FluidContainerSlotWidget; -import gregtech.api.gui.widgets.ImageWidget; -import gregtech.api.gui.widgets.SlotWidget; -import gregtech.api.gui.widgets.TankWidget; 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.MultiblockAbility; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuiTheme; +import gregtech.api.mui.GTGuis; +import gregtech.api.mui.sync.GTFluidSyncHandler; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; import gregtech.common.metatileentities.multi.multiblockpart.MetaTileEntityMultiblockPart; import gregtech.common.metatileentities.storage.MetaTileEntityQuantumTank; +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.util.ResourceLocation; import net.minecraft.world.World; import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fluids.IFluidTank; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.items.IItemHandlerModifiable; @@ -32,6 +31,16 @@ 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.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.utils.Alignment; +import com.cleanroommc.modularui.utils.Color; +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.RichTextWidget; +import com.cleanroommc.modularui.widgets.SlotGroupWidget; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -108,27 +117,60 @@ public void registerAbilities(List abilityList) { } @Override - protected ModularUI createUI(EntityPlayer entityPlayer) { - return createTankUI(exportFluids.getTankAt(0), getMetaFullName(), entityPlayer) - .build(getHolder(), entityPlayer); - } - - public ModularUI.Builder createTankUI(IFluidTank fluidTank, String title, EntityPlayer entityPlayer) { - ModularUI.Builder builder = ModularUI.defaultBuilder(); - builder.image(7, 16, 81, 55, GuiTextures.DISPLAY); - TankWidget tankWidget = new TankWidget(fluidTank, 69, 52, 18, 18) - .setHideTooltip(true).setAlwaysShowFull(true); - builder.widget(tankWidget); - builder.label(11, 20, "gregtech.gui.fluid_amount", 0xFFFFFF); - builder.dynamicLabel(11, 30, tankWidget::getFormattedFluidAmount, 0xFFFFFF); - builder.dynamicLabel(11, 40, tankWidget::getFluidLocalizedName, 0xFFFFFF); - return builder.label(6, 6, title) - .widget(new FluidContainerSlotWidget(importItems, 0, 90, 17, false) - .setBackgroundTexture(GuiTextures.SLOT, GuiTextures.IN_SLOT_OVERLAY)) - .widget(new ImageWidget(91, 36, 14, 15, GuiTextures.TANK_ICON)) - .widget(new SlotWidget(exportItems, 0, 90, 54, true, false) - .setBackgroundTexture(GuiTextures.SLOT, GuiTextures.OUT_SLOT_OVERLAY)) - .bindPlayerInventory(entityPlayer.inventory); + public boolean usesMui2() { + return true; + } + + @Override + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { + guiSyncManager.registerSlotGroup("item_inv", 2); + + GTFluidSyncHandler tankSyncHandler = GTFluidSlot.sync(this.exportFluids.getTankAt(0)) + .showAmount(false) + .accessibility(true, false); + + // TODO: Change the position of the name when it's standardized. + return GTGuis.createPanel(this, 176, 166) + .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) + .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) + .child(GTGuiTextures.DISPLAY.asWidget() + .left(7).top(16) + .size(81, 55)) + .child(GTGuiTextures.TANK_ICON.asWidget() + .left(92).top(36) + .size(14, 15)) + .child(new RichTextWidget() + .size(75, 47) + .pos(10, 20) + .textColor(Color.WHITE.main) + .alignment(Alignment.TopLeft) + .autoUpdate(true) + .textBuilder(richText -> { + richText.addLine(IKey.lang("gregtech.gui.fluid_amount")); + String name = tankSyncHandler.getFluidLocalizedName(); + if (name == null) return; + + richText.addLine(IKey.str(name)); + richText.addLine(IKey.str(tankSyncHandler.getFormattedFluidAmount())); + })) + .child(new GTFluidSlot().syncHandler(tankSyncHandler) + .pos(69, 52) + .disableBackground()) + .child(new ItemSlot().slot(SyncHandlers.itemSlot(this.importItems, 0) + .slotGroup("item_inv") + .filter(itemStack -> FluidUtil.getFluidHandler(itemStack) != null)) + .background(GTGuiTextures.SLOT, GTGuiTextures.IN_SLOT_OVERLAY) + .pos(90, 16)) + .child(new ItemSlot().slot(SyncHandlers.itemSlot(this.exportItems, 0) + .slotGroup("item_inv") + .accessibility(false, true)) + .background(GTGuiTextures.SLOT, GTGuiTextures.OUT_SLOT_OVERLAY) + .pos(90, 53)); + } + + @Override + public GTGuiTheme getUITheme() { + return GTGuiTheme.PRIMITIVE; } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java index 22c6909ca35..99f1d89726e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java @@ -150,7 +150,11 @@ public void invalidateStructure() { resetTileAbilities(); this.cleanroomLogic.invalidate(); this.cleanAmount = MIN_CLEAN_AMOUNT; - cleanroomReceivers.forEach(receiver -> receiver.setCleanroom(null)); + cleanroomReceivers.forEach(receiver -> { + if (receiver.getCleanroom() == this) { + receiver.unsetCleanroom(); + } + }); cleanroomReceivers.clear(); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java index 7814f3dccc9..abf7a3d31d4 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java @@ -9,8 +9,17 @@ import gregtech.api.capability.impl.EnergyContainerList; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; -import gregtech.api.metatileentity.multiblock.*; -import gregtech.api.pattern.*; +import gregtech.api.metatileentity.multiblock.IBatteryData; +import gregtech.api.metatileentity.multiblock.IMultiblockPart; +import gregtech.api.metatileentity.multiblock.IProgressBarMultiblock; +import gregtech.api.metatileentity.multiblock.MultiblockAbility; +import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; +import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; +import gregtech.api.pattern.BlockPattern; +import gregtech.api.pattern.FactoryBlockPattern; +import gregtech.api.pattern.MultiblockShapeInfo; +import gregtech.api.pattern.PatternMatchContext; +import gregtech.api.pattern.TraceabilityPredicate; import gregtech.api.util.BlockInfo; import gregtech.api.util.TextComponentUtil; import gregtech.api.util.TextFormattingUtil; @@ -48,7 +57,11 @@ import java.math.BigInteger; import java.time.Duration; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.Map; import java.util.function.Supplier; import static gregtech.api.util.RelativeDirection.*; @@ -247,7 +260,7 @@ protected BlockPattern createStructurePattern() { @Override public List getMatchingShapes() { List shapeInfo = new ArrayList<>(); - MultiblockShapeInfo.Builder builder = MultiblockShapeInfo.builder() + MultiblockShapeInfo.Builder builder = MultiblockShapeInfo.builder(RIGHT, DOWN, FRONT) .aisle("CCCCC", "CCCCC", "GGGGG", "GGGGG", "GGGGG") .aisle("CCCCC", "CCCCC", "GBBBG", "GBBBG", "GGGGG") .aisle("CCCCC", "CCCCC", "GBBBG", "GBBBG", "GGGGG") diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java index 4759bb1dec7..0a06b0fb546 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java @@ -239,13 +239,20 @@ public int getItemOutputLimit() { } @Override - public void setCleanroom(ICleanroomProvider provider) { + public void setCleanroom(@NotNull ICleanroomProvider provider) { super.setCleanroom(provider); // Sync Cleanroom Change to Internal Workable MTE ((ProcessingArrayWorkable) this.recipeMapWorkable).updateCleanroom(); } + @Override + public void unsetCleanroom() { + super.unsetCleanroom(); + + ((ProcessingArrayWorkable) this.recipeMapWorkable).updateCleanroom(); + } + @SuppressWarnings("InnerClassMayBeStatic") protected class ProcessingArrayWorkable extends MultiblockRecipeLogic { @@ -269,8 +276,8 @@ public void invalidate() { super.invalidate(); // invalidate mte's cleanroom reference - if (mte != null && mte instanceof ICleanroomReceiver) { - ((ICleanroomReceiver) mte).setCleanroom(null); + if (mte != null && mte instanceof ICleanroomReceiver cleanroomMTE) { + cleanroomMTE.unsetCleanroom(); } // Reset locally cached variables upon invalidation @@ -284,7 +291,7 @@ public void invalidate() { /** * Checks if a provided Recipe Map is valid to be used in the processing array - * Will filter out anything in the config blacklist, and also any non-singleblock machines + * Will filter out anything in the config blacklist, and also any non-single block machines * * @param recipeMap The recipeMap to check * @return {@code true} if the provided recipeMap is valid for use @@ -360,7 +367,11 @@ private void updateCleanroom() { receiver.setCleanroom(DUMMY_CLEANROOM); } else { ICleanroomProvider provider = ((RecipeMapMultiblockController) metaTileEntity).getCleanroom(); - if (provider != null) receiver.setCleanroom(provider); + if (provider == null) { + receiver.unsetCleanroom(); + } else { + receiver.setCleanroom(provider); + } } } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityCleaningMaintenanceHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityCleaningMaintenanceHatch.java index c7e24cb6649..5996b8ab11f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityCleaningMaintenanceHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityCleaningMaintenanceHatch.java @@ -52,9 +52,8 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) { @Override public void addToMultiBlock(MultiblockControllerBase controllerBase) { super.addToMultiBlock(controllerBase); - if (controllerBase instanceof ICleanroomReceiver && - ((ICleanroomReceiver) controllerBase).getCleanroom() == null) { - ((ICleanroomReceiver) controllerBase).setCleanroom(DUMMY_CLEANROOM); + if (controllerBase instanceof ICleanroomReceiver cleanroomReceiver) { + cleanroomReceiver.setCleanroom(DUMMY_CLEANROOM); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityEnergyHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityEnergyHatch.java index fd79fc8811d..5d0b13fc491 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityEnergyHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityEnergyHatch.java @@ -177,7 +177,7 @@ public boolean canRenderFrontFaceX() { @Override public void getSubItems(CreativeTabs creativeTab, NonNullList subItems) { // override here is gross, but keeps things in order despite - // IDs being out of order, due to EV 4A hatches being added later + // IDs being out of order, due to EV 4A and UEV+ 4A+ hatches being added later if (this == MetaTileEntities.ENERGY_INPUT_HATCH[0]) { for (MetaTileEntityEnergyHatch hatch : MetaTileEntities.ENERGY_INPUT_HATCH) { if (hatch != null) subItems.add(hatch.getStackForm()); @@ -203,7 +203,11 @@ public void getSubItems(CreativeTabs creativeTab, NonNullList subItem for (MetaTileEntityEnergyHatch hatch : MetaTileEntities.SUBSTATION_ENERGY_OUTPUT_HATCH) { if (hatch != null) subItems.add(hatch.getStackForm()); } - } + } else if (this.getClass() != MetaTileEntityEnergyHatch.class && + this.getClass() != MetaTileEntitySubstationEnergyHatch.class) { + // let subclasses fall through this override + super.getSubItems(creativeTab, subItems); + } } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java index 153c93bdb12..4cb1dd3003e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java @@ -13,14 +13,17 @@ import gregtech.api.mui.GTGuis; import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleOverlayRenderer; +import gregtech.common.metatileentities.MetaTileEntities; import gregtech.common.metatileentities.storage.MetaTileEntityQuantumTank; import gregtech.common.mui.widget.GTFluidSlot; import net.minecraft.client.resources.I18n; +import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; import net.minecraft.util.EnumFacing; +import net.minecraft.util.NonNullList; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; @@ -185,7 +188,7 @@ public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, } protected int getInventorySize() { - return INITIAL_INVENTORY_SIZE * (1 << Math.min(9, getTier())); + return INITIAL_INVENTORY_SIZE * Math.min(Integer.MAX_VALUE, 1 << getTier()); } @Override @@ -338,6 +341,21 @@ private void setLocked(boolean locked) { fluidTank.onContentsChanged(); } + @Override + public void getSubItems(CreativeTabs creativeTab, NonNullList subItems) { + if (this == MetaTileEntities.FLUID_IMPORT_HATCH[0]) { + for (var hatch : MetaTileEntities.FLUID_IMPORT_HATCH) { + if (hatch != null) subItems.add(hatch.getStackForm()); + } + for (var hatch : MetaTileEntities.FLUID_EXPORT_HATCH) { + if (hatch != null) subItems.add(hatch.getStackForm()); + } + } else if (this.getClass() != MetaTileEntityFluidHatch.class) { + // let subclasses fall through this override + super.getSubItems(creativeTab, subItems); + } + } + protected class HatchFluidTank extends NotifiableFluidTank implements IFilteredFluidContainer, IFilter { public HatchFluidTank(int capacity, MetaTileEntity entityToNotify, boolean isExport) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java index a549ccbf81f..37c145eab75 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java @@ -1,5 +1,6 @@ package gregtech.common.metatileentities.multi.multiblockpart; +import gregtech.api.GTValues; import gregtech.api.capability.*; import gregtech.api.capability.impl.GhostCircuitItemStackHandler; import gregtech.api.capability.impl.ItemHandlerList; @@ -16,14 +17,17 @@ import gregtech.api.util.GTHashMaps; import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleOverlayRenderer; +import gregtech.common.metatileentities.MetaTileEntities; import net.minecraft.client.resources.I18n; +import net.minecraft.creativetab.CreativeTabs; 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.EnumHand; +import net.minecraft.util.NonNullList; import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; @@ -180,7 +184,7 @@ public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, } private int getInventorySize() { - int sizeRoot = 1 + Math.min(9, getTier()); + int sizeRoot = 1 + Math.min(GTValues.UHV, getTier()); return sizeRoot * sizeRoot; } @@ -453,4 +457,21 @@ public void addToolUsages(ItemStack stack, @Nullable World world, List t tooltip.add(I18n.format("gregtech.tool_action.wrench.set_facing")); super.addToolUsages(stack, world, tooltip, advanced); } + + @Override + public void getSubItems(CreativeTabs creativeTab, NonNullList subItems) { + // override here is gross, but keeps things in order despite + // IDs being out of order, due to UEV+ being added later + if (this == MetaTileEntities.ITEM_IMPORT_BUS[0]) { + for (var hatch : MetaTileEntities.ITEM_IMPORT_BUS) { + if (hatch != null) subItems.add(hatch.getStackForm()); + } + for (var hatch : MetaTileEntities.ITEM_EXPORT_BUS) { + if (hatch != null) subItems.add(hatch.getStackForm()); + } + } else if (this.getClass() != MetaTileEntityItemBus.class) { + // let subclasses fall through this override + super.getSubItems(creativeTab, subItems); + } + } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityLaserHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityLaserHatch.java index f47d35c0377..3d594d4827d 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityLaserHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityLaserHatch.java @@ -29,7 +29,7 @@ import java.util.List; import static gregtech.api.GTValues.V; -import static gregtech.api.GTValues.VN; +import static gregtech.api.GTValues.VNF; public class MetaTileEntityLaserHatch extends MetaTileEntityMultiblockPart implements IMultiblockAbilityPart, IDataInfoProvider { @@ -95,10 +95,10 @@ public void addInformation(ItemStack stack, @Nullable World world, @NotNull List tooltip.add(I18n.format("gregtech.machine.laser_hatch.tooltip2")); if (isOutput) { - tooltip.add(I18n.format("gregtech.universal.tooltip.voltage_out", V[tier], VN[tier])); + tooltip.add(I18n.format("gregtech.universal.tooltip.voltage_out", V[tier], VNF[tier])); tooltip.add(I18n.format("gregtech.universal.tooltip.amperage_out_till", amperage)); } else { - tooltip.add(I18n.format("gregtech.universal.tooltip.voltage_in", V[tier], VN[tier])); + tooltip.add(I18n.format("gregtech.universal.tooltip.voltage_in", V[tier], VNF[tier])); tooltip.add(I18n.format("gregtech.universal.tooltip.amperage_in_till", amperage)); } tooltip.add(I18n.format("gregtech.universal.tooltip.energy_storage_capacity", buffer.getEnergyCapacity())); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMachineHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMachineHatch.java index 312f7cb9d56..46f47cf3928 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMachineHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMachineHatch.java @@ -1,9 +1,6 @@ package gregtech.common.metatileentities.multi.multiblockpart; import gregtech.api.capability.impl.NotifiableItemStackHandler; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.widgets.BlockableSlotWidget; import gregtech.api.metatileentity.IMachineHatchMultiblock; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; @@ -11,12 +8,12 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; +import gregtech.api.mui.GTGuis; import gregtech.api.util.GTUtility; import gregtech.api.util.ItemStackHashStrategy; 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.util.ResourceLocation; import net.minecraft.world.World; @@ -25,6 +22,15 @@ 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.drawable.GuiDraw; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.RichTooltip; +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 org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -62,17 +68,35 @@ protected IItemHandlerModifiable createImportItemHandler() { } @Override - protected ModularUI createUI(EntityPlayer entityPlayer) { - ModularUI.Builder builder = ModularUI.builder(GuiTextures.BACKGROUND, 176, - 18 + 18 + 94) - .label(10, 5, getMetaFullName()); - - builder.widget(new BlockableSlotWidget(machineHandler, 0, 81, 18, true, true) - .setIsBlocked(this::isSlotBlocked) - .setBackgroundTexture(GuiTextures.SLOT)); + public boolean usesMui2() { + return true; + } - return builder.bindPlayerInventory(entityPlayer.inventory, GuiTextures.SLOT, 7, 18 + 18 + 12).build(getHolder(), - entityPlayer); + @Override + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { + guiSyncManager.registerSlotGroup("item_inv", 1); + + // TODO: Change the position of the name when it's standardized. + return GTGuis.createPanel(this, 176, 18 + 18 + 94) + .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) + .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) + .child(new ItemSlot() + .slot(SyncHandlers.itemSlot(machineHandler, 0) + .slotGroup("item_inv")) + .tooltip(t -> t.setAutoUpdate(false)) + .onUpdateListener(itemSlot -> { + RichTooltip tooltip = itemSlot.tooltip(); + tooltip.buildTooltip(); + if (isSlotBlocked()) { + tooltip.clearText(); + } + }) + .overlay((context, x, y, width, height, widgetTheme) -> { + if (isSlotBlocked()) { + GuiDraw.drawRect(x, y, width, height, 0x80404040); + } + }) + .left(79).top(18)); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMufflerHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMufflerHatch.java index 4634293686a..3788ac57732 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMufflerHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMufflerHatch.java @@ -2,9 +2,6 @@ import gregtech.api.GTValues; import gregtech.api.capability.IMufflerHatch; -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.ITieredMetaTileEntity; import gregtech.api.metatileentity.MetaTileEntity; @@ -13,6 +10,7 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; +import gregtech.api.mui.GTGuis; import gregtech.api.util.GTTransferUtils; import gregtech.api.util.GTUtility; import gregtech.client.particle.VanillaParticleEffects; @@ -21,7 +19,6 @@ import net.minecraft.block.state.IBlockState; 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.util.ResourceLocation; @@ -33,10 +30,20 @@ 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.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.layout.Grid; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.List; public class MetaTileEntityMufflerHatch extends MetaTileEntityMultiblockPart implements @@ -49,7 +56,7 @@ public class MetaTileEntityMufflerHatch extends MetaTileEntityMultiblockPart imp public MetaTileEntityMufflerHatch(ResourceLocation metaTileEntityId, int tier) { super(metaTileEntityId, tier); - this.recoveryChance = Math.max(1, tier * 10); + this.recoveryChance = (int) Math.ceil((tier - 1.0f) / 8 * 100); this.inventory = new GTItemStackHandler(this, (int) Math.pow(tier + 1, 2)); this.frontFaceFree = false; } @@ -158,26 +165,38 @@ public void registerAbilities(List abilityList) { } @Override - protected ModularUI createUI(EntityPlayer entityPlayer) { - int rowSize = (int) Math.sqrt(this.inventory.getSlots()); - return createUITemplate(entityPlayer, rowSize, rowSize == 10 ? 9 : 0) - .build(getHolder(), entityPlayer); + public boolean usesMui2() { + return true; } - private ModularUI.Builder createUITemplate(EntityPlayer player, int rowSize, int xOffset) { - ModularUI.Builder builder = ModularUI.builder(GuiTextures.BACKGROUND, 176 + xOffset * 2, - 18 + 18 * rowSize + 94) - .label(10, 5, getMetaFullName()); + @Override + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { + int rowSize = (int) Math.sqrt(this.inventory.getSlots()); + int xOffset = rowSize == 10 ? 9 : 0; + guiSyncManager.registerSlotGroup("item_inv", rowSize); + + List> widgets = new ArrayList<>(); for (int y = 0; y < rowSize; y++) { + widgets.add(new ArrayList<>()); for (int x = 0; x < rowSize; x++) { int index = y * rowSize + x; - builder.widget(new SlotWidget(inventory, index, - (88 - rowSize * 9 + x * 18) + xOffset, 18 + y * 18, true, false) - .setBackgroundTexture(GuiTextures.SLOT)); + widgets.get(y).add(new ItemSlot().slot(SyncHandlers.itemSlot(this.inventory, index) + .slotGroup("item_inv") + .accessibility(false, true))); } } - return builder.bindPlayerInventory(player.inventory, GuiTextures.SLOT, 7 + xOffset, 18 + 18 * rowSize + 12); + + // TODO: Change the position of the name when it's standardized. + return GTGuis.createPanel(this, 176 + xOffset * 2, 18 + 18 * rowSize + 94) + .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)); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java index 6ac0ad4ee05..ff1b2341f32 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java @@ -1,6 +1,5 @@ package gregtech.common.metatileentities.multi.multiblockpart; -import gregtech.api.GTValues; import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.GregtechTileCapabilities; import gregtech.api.capability.IControllable; @@ -13,13 +12,16 @@ import gregtech.api.mui.GTGuis; import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleOverlayRenderer; +import gregtech.common.metatileentities.MetaTileEntities; import gregtech.common.mui.widget.GTFluidSlot; import net.minecraft.client.resources.I18n; +import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; import net.minecraft.util.EnumFacing; +import net.minecraft.util.NonNullList; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; @@ -59,7 +61,7 @@ public MetaTileEntityMultiFluidHatch(ResourceLocation metaTileEntityId, int tier this.numSlots = numSlots; // Quadruple: 1/4th the capacity of a fluid hatch of this tier // Nonuple: 1/8th the capacity of a fluid hatch of this tier - this.tankSize = (BASE_TANK_SIZE * (1 << Math.min(GTValues.UHV, tier))) / (numSlots == 4 ? 4 : 8); + this.tankSize = BASE_TANK_SIZE * (1 << tier) / (numSlots == 4 ? 4 : 8); FluidTank[] fluidsHandlers = new FluidTank[numSlots]; for (int i = 0; i < fluidsHandlers.length; i++) { fluidsHandlers[i] = new NotifiableFluidTank(tankSize, this, isExportHatch); @@ -227,4 +229,27 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .coverChildren()) .bindPlayerInventory(); } + + @Override + public void getSubItems(CreativeTabs creativeTab, NonNullList subItems) { + // override here is gross, but keeps things in order despite + // IDs being out of order, due to IV+ hatches being added later + if (this == MetaTileEntities.QUADRUPLE_IMPORT_HATCH[0]) { + for (var hatch : MetaTileEntities.QUADRUPLE_IMPORT_HATCH) { + if (hatch != null) subItems.add(hatch.getStackForm()); + } + for (var hatch : MetaTileEntities.QUADRUPLE_EXPORT_HATCH) { + if (hatch != null) subItems.add(hatch.getStackForm()); + } + for (var hatch : MetaTileEntities.NONUPLE_IMPORT_HATCH) { + if (hatch != null) subItems.add(hatch.getStackForm()); + } + for (var hatch : MetaTileEntities.NONUPLE_EXPORT_HATCH) { + if (hatch != null) subItems.add(hatch.getStackForm()); + } + } else if (this.getClass() != MetaTileEntityMultiFluidHatch.class) { + // let subclasses fall through this override + super.getSubItems(creativeTab, subItems); + } + } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityObjectHolder.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityObjectHolder.java index c55fcbfeaa8..d358d7eccc7 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityObjectHolder.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityObjectHolder.java @@ -4,9 +4,6 @@ import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.IObjectHolder; import gregtech.api.capability.impl.NotifiableItemStackHandler; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.widgets.BlockableSlotWidget; import gregtech.api.items.metaitem.MetaItem; import gregtech.api.items.metaitem.stats.IDataItem; import gregtech.api.items.metaitem.stats.IItemBehaviour; @@ -15,11 +12,12 @@ import gregtech.api.metatileentity.multiblock.IMultiblockAbilityPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuis; import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleOverlayRenderer; 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; @@ -31,6 +29,14 @@ 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.drawable.GuiDraw; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +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 org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -55,18 +61,43 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) { } @Override - protected ModularUI createUI(EntityPlayer entityPlayer) { - return ModularUI.defaultBuilder() - .label(5, 5, getMetaFullName()) - .image(46, 18, 84, 60, GuiTextures.PROGRESS_BAR_RESEARCH_STATION_BASE) - .widget(new BlockableSlotWidget(heldItems, 0, 79, 39) - .setIsBlocked(this::isSlotBlocked) - .setBackgroundTexture(GuiTextures.SLOT, GuiTextures.RESEARCH_STATION_OVERLAY)) - .widget(new BlockableSlotWidget(heldItems, 1, 15, 39) - .setIsBlocked(this::isSlotBlocked) - .setBackgroundTexture(GuiTextures.SLOT, GuiTextures.DATA_ORB_OVERLAY)) - .bindPlayerInventory(entityPlayer.inventory) - .build(getHolder(), entityPlayer); + public boolean usesMui2() { + return true; + } + + @Override + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { + guiSyncManager.registerSlotGroup("item_inv", 2); + + // TODO: Change the position of the name when it's standardized. + return GTGuis.createPanel(this, 176, 166) + .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) + .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) + .child(GTGuiTextures.PROGRESS_BAR_RESEARCH_STATION_BASE.asWidget() + .left(46).top(18) + .size(84, 60)) + .child(new ItemSlot() + .slot(SyncHandlers.itemSlot(heldItems, 0) + .slotGroup("item_inv") + .filter(itemStack -> !isSlotBlocked())) + .background(GTGuiTextures.SLOT, GTGuiTextures.RESEARCH_STATION_OVERLAY) + .overlay((context, x, y, width, height, widgetTheme) -> { + if (isSlotBlocked()) { + GuiDraw.drawRect(x, y, width, height, 0x80404040); + } + }) + .left(79).top(39)) + .child(new ItemSlot() + .slot(SyncHandlers.itemSlot(heldItems, 1) + .slotGroup("item_inv") + .filter(itemStack -> !isSlotBlocked())) + .background(GTGuiTextures.SLOT, GTGuiTextures.DATA_ORB_OVERLAY) + .overlay((context, x, y, width, height, widgetTheme) -> { + if (isSlotBlocked()) { + GuiDraw.drawRect(x, y, width, height, 0x80404040); + } + }) + .left(15).top(39)); } private boolean isSlotBlocked() { diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityReservoirHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityReservoirHatch.java index e8cf6d7b59b..e91f6e4f05d 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityReservoirHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityReservoirHatch.java @@ -4,29 +4,27 @@ import gregtech.api.capability.impl.FilteredItemHandler; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.capability.impl.NotifiableFluidTank; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.widgets.*; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockAbilityPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuis; +import gregtech.api.mui.sync.GTFluidSyncHandler; 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.util.EnumFacing; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TextComponentString; -import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fluids.IFluidTank; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.items.IItemHandlerModifiable; @@ -35,11 +33,20 @@ 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.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.utils.Alignment; +import com.cleanroommc.modularui.utils.Color; +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.RichTextWidget; +import com.cleanroommc.modularui.widgets.SlotGroupWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; -import java.util.function.Consumer; public class MetaTileEntityReservoirHatch extends MetaTileEntityMultiblockNotifiablePart implements IMultiblockAbilityPart { @@ -117,51 +124,55 @@ public void registerAbilities(List abilityList) { } @Override - protected ModularUI createUI(EntityPlayer entityPlayer) { - return createTankUI(fluidTank, getMetaFullName(), entityPlayer).build(getHolder(), entityPlayer); - } - - public ModularUI.Builder createTankUI(IFluidTank fluidTank, String title, EntityPlayer entityPlayer) { - // Create base builder/widget references - ModularUI.Builder builder = ModularUI.defaultBuilder(); - TankWidget tankWidget; - - // Add input/output-specific widgets - tankWidget = new TankWidget(fluidTank, 69, 52, 18, 18) - .setAlwaysShowFull(true).setDrawHoveringText(false).setContainerClicking(true, false); - - builder.image(7, 16, 81, 55, GuiTextures.DISPLAY) - .widget(new ImageWidget(91, 36, 14, 15, GuiTextures.TANK_ICON)) - .widget(new SlotWidget(exportItems, 0, 90, 53, true, false) - .setBackgroundTexture(GuiTextures.SLOT, GuiTextures.OUT_SLOT_OVERLAY)); - - // Add general widgets - return builder.label(6, 6, title) - .label(11, 20, "gregtech.gui.fluid_amount", 0xFFFFFF) - .widget(new AdvancedTextWidget(11, 30, getFluidAmountText(tankWidget), 0xFFFFFF)) - .widget(new AdvancedTextWidget(11, 40, getFluidNameText(tankWidget), 0xFFFFFF)) - .widget(tankWidget) - .widget(new FluidContainerSlotWidget(importItems, 0, 90, 16, false) - .setBackgroundTexture(GuiTextures.SLOT, GuiTextures.IN_SLOT_OVERLAY)) - .bindPlayerInventory(entityPlayer.inventory); - } - - private Consumer> getFluidNameText(TankWidget tankWidget) { - return (list) -> { - TextComponentTranslation translation = tankWidget.getFluidTextComponent(); - if (translation != null) { - list.add(translation); - } - }; + public boolean usesMui2() { + return true; } - private Consumer> getFluidAmountText(TankWidget tankWidget) { - return (list) -> { - String fluidAmount = tankWidget.getFormattedFluidAmount(); - if (!fluidAmount.isEmpty()) { - list.add(new TextComponentString(fluidAmount)); - } - }; + @Override + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { + guiSyncManager.registerSlotGroup("item_inv", 2); + + GTFluidSyncHandler tankSyncHandler = GTFluidSlot.sync(this.fluidTank) + .showAmount(false) + .accessibility(true, false); + + // TODO: Change the position of the name when it's standardized. + return GTGuis.createPanel(this, 176, 166) + .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) + .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) + .child(GTGuiTextures.DISPLAY.asWidget() + .left(7).top(16) + .size(81, 55)) + .child(GTGuiTextures.TANK_ICON.asWidget() + .left(92).top(36) + .size(14, 15)) + .child(new RichTextWidget() + .size(75, 47) + .pos(10, 20) + .textColor(Color.WHITE.main) + .alignment(Alignment.TopLeft) + .autoUpdate(true) + .textBuilder(richText -> { + richText.addLine(IKey.lang("gregtech.gui.fluid_amount")); + String name = tankSyncHandler.getFluidLocalizedName(); + if (name == null) return; + + richText.addLine(IKey.str(name)); + richText.addLine(IKey.str(tankSyncHandler.getFormattedFluidAmount())); + })) + .child(new GTFluidSlot().syncHandler(tankSyncHandler) + .pos(69, 52) + .disableBackground()) + .child(new ItemSlot().slot(SyncHandlers.itemSlot(this.importItems, 0) + .slotGroup("item_inv") + .filter(itemStack -> FluidUtil.getFluidHandler(itemStack) != null)) + .background(GTGuiTextures.SLOT, GTGuiTextures.IN_SLOT_OVERLAY) + .pos(90, 16)) + .child(new ItemSlot().slot(SyncHandlers.itemSlot(this.exportItems, 0) + .slotGroup("item_inv") + .accessibility(false, true)) + .background(GTGuiTextures.SLOT, GTGuiTextures.OUT_SLOT_OVERLAY) + .pos(90, 53)); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityRotorHolder.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityRotorHolder.java index 1fd863b864f..7f3c732270e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityRotorHolder.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityRotorHolder.java @@ -5,13 +5,13 @@ import gregtech.api.capability.impl.MultiblockFuelRecipeLogic; import gregtech.api.capability.impl.NotifiableItemStackHandler; import gregtech.api.damagesources.DamageSources; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; import gregtech.api.metatileentity.ITieredMetaTileEntity; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockAbilityPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuis; import gregtech.api.util.RelativeDirection; import gregtech.client.renderer.texture.Textures; import gregtech.common.items.behaviors.AbstractMaterialPartBehavior; @@ -37,6 +37,13 @@ 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.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +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 org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -73,12 +80,24 @@ public IItemHandlerModifiable getImportItems() { } @Override - protected ModularUI createUI(@NotNull EntityPlayer entityPlayer) { - return ModularUI.defaultBuilder() - .label(6, 6, getMetaFullName()) - .slot(inventory, 0, 79, 36, GuiTextures.SLOT, GuiTextures.TURBINE_OVERLAY) - .bindPlayerInventory(entityPlayer.inventory) - .build(getHolder(), entityPlayer); + public boolean usesMui2() { + return true; + } + + @Override + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { + guiSyncManager.registerSlotGroup("item_inv", 1); + // TODO: Change the position of the name when it's standardized. + return GTGuis.createPanel(this, 176, 166) + .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) + .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) + .child(new ItemSlot() + .slot(SyncHandlers.itemSlot(inventory, 0) + .slotGroup("item_inv") + .changeListener( + (newItem, onlyAmountChanged, client, init) -> inventory.onContentsChanged(0))) + .background(GTGuiTextures.SLOT, GTGuiTextures.TURBINE_OVERLAY) + .left(79).top(36)); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/steam/multiblockpart/MetaTileEntitySteamHatch.java b/src/main/java/gregtech/common/metatileentities/steam/multiblockpart/MetaTileEntitySteamHatch.java index abccdb7183a..cdcad82843f 100644 --- a/src/main/java/gregtech/common/metatileentities/steam/multiblockpart/MetaTileEntitySteamHatch.java +++ b/src/main/java/gregtech/common/metatileentities/steam/multiblockpart/MetaTileEntitySteamHatch.java @@ -4,31 +4,30 @@ import gregtech.api.capability.impl.FilteredFluidHandler; import gregtech.api.capability.impl.FilteredItemHandler; import gregtech.api.capability.impl.FluidTankList; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.widgets.FluidContainerSlotWidget; -import gregtech.api.gui.widgets.ImageWidget; -import gregtech.api.gui.widgets.SlotWidget; -import gregtech.api.gui.widgets.TankWidget; 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.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuiTheme; +import gregtech.api.mui.GTGuis; +import gregtech.api.mui.sync.GTFluidSyncHandler; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleOverlayRenderer; import gregtech.common.ConfigHolder; import gregtech.common.metatileentities.multi.multiblockpart.MetaTileEntityMultiblockPart; import gregtech.common.metatileentities.storage.MetaTileEntityQuantumTank; +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.util.ResourceLocation; import net.minecraft.world.World; +import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fluids.IFluidTank; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.items.IItemHandlerModifiable; @@ -36,6 +35,16 @@ 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.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.utils.Alignment; +import com.cleanroommc.modularui.utils.Color; +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.RichTextWidget; +import com.cleanroommc.modularui.widgets.SlotGroupWidget; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -124,30 +133,56 @@ public void registerAbilities(List abilityList) { } @Override - protected ModularUI createUI(EntityPlayer entityPlayer) { - return createTankUI(importFluids.getTankAt(0), getMetaFullName(), entityPlayer) - .build(getHolder(), entityPlayer); - } - - public ModularUI.Builder createTankUI(IFluidTank fluidTank, String title, EntityPlayer entityPlayer) { - ModularUI.Builder builder = ModularUI.builder(GuiTextures.BACKGROUND_STEAM.get(IS_STEEL), 176, 166); - builder.image(7, 16, 81, 55, GuiTextures.DISPLAY_STEAM.get(IS_STEEL)); - TankWidget tankWidget = new TankWidget(fluidTank, 69, 52, 18, 18) - .setHideTooltip(true).setAlwaysShowFull(true); - builder.widget(tankWidget); - builder.shouldColor(false); - builder.label(11, 20, "gregtech.gui.fluid_amount", 0xFFFFFF); - builder.dynamicLabel(11, 30, tankWidget::getFormattedFluidAmount, 0xFFFFFF); - builder.dynamicLabel(11, 40, tankWidget::getFluidLocalizedName, 0xFFFFFF); - return builder.label(6, 6, title) - .widget(new FluidContainerSlotWidget(importItems, 0, 90, 17, false) - .setBackgroundTexture(GuiTextures.SLOT_STEAM.get(IS_STEEL), - GuiTextures.IN_SLOT_OVERLAY_STEAM.get(IS_STEEL))) - .widget(new ImageWidget(91, 36, 14, 15, GuiTextures.TANK_ICON)) // todo tank icon - .widget(new SlotWidget(exportItems, 0, 90, 54, true, false) - .setBackgroundTexture(GuiTextures.SLOT_STEAM.get(IS_STEEL), - GuiTextures.OUT_SLOT_OVERLAY_STEAM.get(IS_STEEL))) - .bindPlayerInventory(entityPlayer.inventory, GuiTextures.SLOT_STEAM.get(IS_STEEL), 7, 83); + public boolean usesMui2() { + return true; + } + + @Override + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { + guiSyncManager.registerSlotGroup("item_inv", 2); + + GTFluidSyncHandler tankSyncHandler = GTFluidSlot.sync(this.importFluids.getTankAt(0)) + .showAmount(false); + + return GTGuis.createPanel(this, 176, 166) + .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) + .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) + .child((IS_STEEL ? GTGuiTextures.DISPLAY_STEEL : GTGuiTextures.DISPLAY_BRONZE).asWidget() + .left(7).top(16) + .size(81, 55)) + .child(GTGuiTextures.TANK_ICON.asWidget() + .left(92).top(36) + .size(14, 15)) + .child(new RichTextWidget() + .size(75, 47) + .pos(10, 20) + .textColor(Color.WHITE.main) + .alignment(Alignment.TopLeft) + .autoUpdate(true) + .textBuilder(richText -> { + richText.addLine(IKey.lang("gregtech.gui.fluid_amount")); + String name = tankSyncHandler.getFluidLocalizedName(); + if (name == null) return; + + richText.addLine(IKey.str(name)); + richText.addLine(IKey.str(tankSyncHandler.getFormattedFluidAmount())); + })) + .child(new GTFluidSlot().syncHandler(tankSyncHandler) + .pos(69, 52) + .disableBackground()) + .child(new ItemSlot().slot(SyncHandlers.itemSlot(this.importItems, 0) + .slotGroup("item_inv") + .filter(itemStack -> FluidUtil.getFluidHandler(itemStack) != null)) + .pos(90, 16)) + .child(new ItemSlot().slot(SyncHandlers.itemSlot(this.exportItems, 0) + .slotGroup("item_inv") + .accessibility(false, true)) + .pos(90, 53)); + } + + @Override + public GTGuiTheme getUITheme() { + return IS_STEEL ? GTGuiTheme.STEEL : GTGuiTheme.BRONZE; } @Override diff --git a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityBuffer.java b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityBuffer.java index 1ecb31c1821..e7a94663d21 100644 --- a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityBuffer.java +++ b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityBuffer.java @@ -2,19 +2,17 @@ import gregtech.api.capability.impl.FilteredFluidHandler; import gregtech.api.capability.impl.FluidTankList; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.widgets.TankWidget; import gregtech.api.items.itemhandlers.GTItemStackHandler; import gregtech.api.metatileentity.ITieredMetaTileEntity; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; +import gregtech.api.mui.GTGuis; import gregtech.api.util.GTUtility; import gregtech.client.renderer.texture.Textures; +import gregtech.common.mui.widget.GTFluidSlot; import net.minecraft.client.renderer.texture.TextureAtlasSprite; 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.util.EnumFacing; @@ -28,11 +26,21 @@ import codechicken.lib.render.pipeline.ColourMultiplier; 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.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.layout.Grid; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.tuple.Pair; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.List; public class MetaTileEntityBuffer extends MetaTileEntity implements ITieredMetaTileEntity { @@ -72,25 +80,47 @@ public Pair getParticleTexture() { } @Override - protected ModularUI createUI(EntityPlayer entityPlayer) { + public boolean usesMui2() { + return true; + } + + @Override + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { int invTier = tier + 2; - ModularUI.Builder builder = ModularUI.builder(GuiTextures.BACKGROUND, - 176, Math.max(166, 18 + 18 * invTier + 94));// 176, 166 - for (int i = 0; i < this.fluidTankList.getTanks(); i++) { - builder.widget(new TankWidget(this.fluidTankList.getTankAt(i), 176 - 8 - 18, 18 + 18 * i, 18, 18) - .setAlwaysShowFull(true) - .setBackgroundTexture(GuiTextures.FLUID_SLOT) - .setContainerClicking(true, true)); - } + guiSyncManager.registerSlotGroup("item_inv", invTier); + + List> slotWidgets = new ArrayList<>(); for (int y = 0; y < invTier; y++) { + slotWidgets.add(new ArrayList<>()); for (int x = 0; x < invTier; x++) { int index = y * invTier + x; - builder.slot(itemStackHandler, index, 8 + x * 18, 18 + y * 18, GuiTextures.SLOT); + slotWidgets.get(y) + .add(new ItemSlot().slot(SyncHandlers.itemSlot(itemStackHandler, index).slotGroup("item_inv"))); } } - return builder.label(6, 6, getMetaFullName()) - .bindPlayerInventory(entityPlayer.inventory, GuiTextures.SLOT, 8, 18 + 18 * invTier + 12) - .build(getHolder(), entityPlayer); + + List> tankWidgets = new ArrayList<>(); + for (int i = 0; i < this.fluidTankList.getTanks(); i++) { + tankWidgets.add(new ArrayList<>()); + tankWidgets.get(i).add(new GTFluidSlot().syncHandler(this.fluidTankList.getTankAt(i))); + } + + // TODO: Change the position of the name when it's standardized. + return GTGuis.createPanel(this, 176, Math.max(166, 18 + 18 * invTier + 94)) + .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) + .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) + .child(new Grid() + .top(18).height(18 * invTier) + .left(7) + .minElementMargin(0, 0) + .minColWidth(18).minRowHeight(18) + .matrix(slotWidgets)) + .child(new Grid() + .top(18).height(18 * invTier) + .left(144 + 7) + .minElementMargin(0, 0) + .minColWidth(18).minRowHeight(18) + .matrix(tankWidgets)); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityWorkbench.java b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityWorkbench.java index bbfb8c2685e..44c92f8e11a 100644 --- a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityWorkbench.java +++ b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityWorkbench.java @@ -5,8 +5,16 @@ import gregtech.api.gui.ModularUI.Builder; import gregtech.api.gui.Widget.ClickData; import gregtech.api.gui.resources.TextureArea; -import gregtech.api.gui.widgets.*; +import gregtech.api.gui.widgets.AbstractWidgetGroup; +import gregtech.api.gui.widgets.ClickButtonWidget; +import gregtech.api.gui.widgets.CraftingStationInputWidgetGroup; +import gregtech.api.gui.widgets.ImageWidget; +import gregtech.api.gui.widgets.LabelWidget; +import gregtech.api.gui.widgets.SimpleTextWidget; +import gregtech.api.gui.widgets.SlotWidget; +import gregtech.api.gui.widgets.TabGroup; import gregtech.api.gui.widgets.TabGroup.TabLocation; +import gregtech.api.gui.widgets.WidgetGroup; import gregtech.api.gui.widgets.tab.ItemTabInfo; import gregtech.api.items.itemhandlers.GTItemStackHandler; import gregtech.api.metatileentity.MetaTileEntity; @@ -254,6 +262,11 @@ public boolean canPlaceCoverOnSide(@NotNull EnumFacing side) { return false; } + @Override + public boolean acceptsCovers() { + return false; + } + @Override public boolean canRenderMachineGrid(@NotNull ItemStack mainHandStack, @NotNull ItemStack offHandStack) { return false; diff --git a/src/main/java/gregtech/integration/hwyla/HWYLAModule.java b/src/main/java/gregtech/integration/hwyla/HWYLAModule.java index a604d6331e1..f93bdf6ee1a 100644 --- a/src/main/java/gregtech/integration/hwyla/HWYLAModule.java +++ b/src/main/java/gregtech/integration/hwyla/HWYLAModule.java @@ -4,7 +4,23 @@ import gregtech.api.modules.GregTechModule; import gregtech.api.util.Mods; import gregtech.integration.IntegrationSubmodule; -import gregtech.integration.hwyla.provider.*; +import gregtech.integration.hwyla.provider.ActiveTransformerDataProvider; +import gregtech.integration.hwyla.provider.BatteryBufferDataProvider; +import gregtech.integration.hwyla.provider.BlockOreDataProvider; +import gregtech.integration.hwyla.provider.ControllableDataProvider; +import gregtech.integration.hwyla.provider.ConverterDataProvider; +import gregtech.integration.hwyla.provider.DiodeDataProvider; +import gregtech.integration.hwyla.provider.ElectricContainerDataProvider; +import gregtech.integration.hwyla.provider.LampDataProvider; +import gregtech.integration.hwyla.provider.MaintenanceDataProvider; +import gregtech.integration.hwyla.provider.MultiRecipeMapDataProvider; +import gregtech.integration.hwyla.provider.MultiblockDataProvider; +import gregtech.integration.hwyla.provider.PrimitivePumpDataProvider; +import gregtech.integration.hwyla.provider.QuantumStorageProvider; +import gregtech.integration.hwyla.provider.RecipeLogicDataProvider; +import gregtech.integration.hwyla.provider.SteamBoilerDataProvider; +import gregtech.integration.hwyla.provider.TransformerDataProvider; +import gregtech.integration.hwyla.provider.WorkableDataProvider; import gregtech.modules.GregTechModules; import net.minecraft.item.ItemStack; @@ -42,6 +58,7 @@ public void register(IWailaRegistrar registrar) { LampDataProvider.INSTANCE.register(registrar); ActiveTransformerDataProvider.INSTANCE.register(registrar); BatteryBufferDataProvider.INSTANCE.register(registrar); + QuantumStorageProvider.INSTANCE.register(registrar); } /** Render an ItemStack. */ diff --git a/src/main/java/gregtech/integration/hwyla/provider/QuantumStorageProvider.java b/src/main/java/gregtech/integration/hwyla/provider/QuantumStorageProvider.java new file mode 100644 index 00000000000..509c890405d --- /dev/null +++ b/src/main/java/gregtech/integration/hwyla/provider/QuantumStorageProvider.java @@ -0,0 +1,113 @@ +package gregtech.integration.hwyla.provider; + +import gregtech.api.GTValues; +import gregtech.api.capability.IQuantumController; +import gregtech.api.capability.IQuantumStorage; +import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; +import gregtech.api.util.GTUtility; + +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextFormatting; +import net.minecraft.world.World; + +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; +import mcp.mobius.waila.api.IWailaDataProvider; +import mcp.mobius.waila.api.IWailaRegistrar; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class QuantumStorageProvider implements IWailaDataProvider { + + public static final QuantumStorageProvider INSTANCE = new QuantumStorageProvider(); + + public void register(@NotNull IWailaRegistrar registrar) { + registrar.registerBodyProvider(this, IGregTechTileEntity.class); + registrar.registerNBTProvider(this, IGregTechTileEntity.class); + registrar.addConfig(GTValues.MOD_NAME, "gregtech.quantum_storage"); + } + + @NotNull + @Override + public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, + BlockPos pos) { + if (te instanceof IGregTechTileEntity gtte) { + if (gtte.getMetaTileEntity() instanceof IQuantumStoragestorage && + (storage.getType() == IQuantumStorage.Type.ITEM || + storage.getType() == IQuantumStorage.Type.FLUID)) { + var controller = storage.getQuantumController(); + int status = 0; + + if (controller != null) { + if (controller.isPowered()) { + status = 1; + } else { + status = 2; + } + } + + NBTTagCompound subTag = new NBTTagCompound(); + subTag.setInteger("Connection", status); + tag.setTag("gregtech.IQuantumStorageController", subTag); + } + } + + return tag; + } + + @NotNull + @Override + public List getWailaBody(ItemStack itemStack, List tooltip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + if (!config.getConfig("gregtech.quantum_storage") || + !(accessor.getTileEntity() instanceof IGregTechTileEntity gtte)) { + return tooltip; + } + + if (gtte.getMetaTileEntity() instanceof IQuantumController controller) { + String eutText = configureEnergyUsage(controller.getEnergyUsage() / 10); + if (controller.getCount(IQuantumStorage.Type.ENERGY) == 0) { + tooltip.add(I18n.format("gregtech.top.quantum_controller.no_hatches")); + tooltip.add(I18n.format("gregtech.top.energy_required") + eutText); + } else if (!controller.isPowered()) { + tooltip.add(I18n.format("gregtech.top.quantum_controller.no_power")); + tooltip.add(I18n.format("gregtech.top.energy_required") + eutText); + } else { + tooltip.add(I18n.format("gregtech.top.energy_consumption") + eutText); + } + } else if (gtte.getMetaTileEntity() instanceof IQuantumStoragestorage && + (storage.getType() == IQuantumStorage.Type.ITEM || + storage.getType() == IQuantumStorage.Type.FLUID)) { + if (accessor.getNBTData().hasKey("gregtech.IQuantumStorageController")) { + NBTTagCompound tag = accessor.getNBTData() + .getCompoundTag("gregtech.IQuantumStorageController"); + int connection = tag.getInteger("Connection"); + String status; + + switch (connection) { + case 1 -> status = I18n.format("gregtech.top.quantum_status.powered"); + case 2 -> status = I18n.format("gregtech.top.quantum_status.connected"); + default -> status = I18n.format("gregtech.top.quantum_status.disconnected"); + } + + status = I18n.format("gregtech.top.quantum_status.label") + + status; + + tooltip.add(status); + } + } + + return tooltip; + } + + public String configureEnergyUsage(long EUs) { + return TextFormatting.RED.toString() + EUs + " EU/t" + TextFormatting.GREEN + + " (" + GTValues.VNF[GTUtility.getTierByVoltage(EUs)] + TextFormatting.GREEN + ")"; + } +} diff --git a/src/main/java/gregtech/integration/jei/multiblock/MultiblockInfoRecipeWrapper.java b/src/main/java/gregtech/integration/jei/multiblock/MultiblockInfoRecipeWrapper.java index b746f67a2cd..1e5dd465b99 100644 --- a/src/main/java/gregtech/integration/jei/multiblock/MultiblockInfoRecipeWrapper.java +++ b/src/main/java/gregtech/integration/jei/multiblock/MultiblockInfoRecipeWrapper.java @@ -217,7 +217,7 @@ private void setNextLayer(int newLayer) { if (renderer != null) { TrackedDummyWorld world = ((TrackedDummyWorld) renderer.world); resetCenter(world); - renderer.renderedBlocksMap.clear(); + renderer.renderedBlocks.clear(); int minY = (int) world.getMinPos().getY(); Collection renderBlocks; if (newLayer == -1) { @@ -226,7 +226,7 @@ private void setNextLayer(int newLayer) { renderBlocks = world.renderedBlocks.stream().filter(pos -> pos.getY() - minY == newLayer) .collect(Collectors.toSet()); } - renderer.addRenderedBlocks(renderBlocks, null); + renderer.addRenderedBlocks(renderBlocks); } } @@ -593,7 +593,7 @@ private MBPattern initializePattern(@NotNull MultiblockShapeInfo shapeInfo, @Not Vector3f minPos = world.getMinPos(); center = new Vector3f(minPos.x + size.x / 2, minPos.y + size.y / 2, minPos.z + size.z / 2); - worldSceneRenderer.addRenderedBlocks(world.renderedBlocks, null); + worldSceneRenderer.addRenderedBlocks(world.renderedBlocks); worldSceneRenderer.setOnLookingAt(ray -> {}); worldSceneRenderer.setAfterWorldRender(renderer -> { @@ -607,8 +607,7 @@ private MBPattern initializePattern(@NotNull MultiblockShapeInfo shapeInfo, @Not renderBlockOverLay(selected, 255, 0, 0); }); world.updateEntities(); - world.setRenderFilter( - pos -> worldSceneRenderer.renderedBlocksMap.keySet().stream().anyMatch(c -> c.contains(pos))); + world.setRenderFilter(worldSceneRenderer.renderedBlocks::contains); Map predicateMap = new HashMap<>(); if (controllerBase != null) { diff --git a/src/main/java/gregtech/integration/theoneprobe/provider/QuantumStorageProvider.java b/src/main/java/gregtech/integration/theoneprobe/provider/QuantumStorageProvider.java index 792be0ac4e5..c831488cc9c 100644 --- a/src/main/java/gregtech/integration/theoneprobe/provider/QuantumStorageProvider.java +++ b/src/main/java/gregtech/integration/theoneprobe/provider/QuantumStorageProvider.java @@ -31,13 +31,15 @@ public void addProbeInfo(ProbeMode mode, IProbeInfo probeInfo, EntityPlayer play if (blockState.getBlock().hasTileEntity(blockState) && world.getTileEntity(data.getPos()) instanceof IGregTechTileEntity gtte) { if (gtte.getMetaTileEntity() instanceof IQuantumController controller) { + String eutText = configureEnergyUsage(controller.getEnergyUsage() / 10); if (controller.getCount(IQuantumStorage.Type.ENERGY) == 0) { probeInfo.text("{*gregtech.top.quantum_controller.no_hatches*}"); + probeInfo.text(TextStyleClass.INFO + "{*gregtech.top.energy_required*} " + eutText); } else if (!controller.isPowered()) { probeInfo.text("{*gregtech.top.quantum_controller.no_power*}"); + probeInfo.text(TextStyleClass.INFO + "{*gregtech.top.energy_required*} " + eutText); } else { - long usage = controller.getEnergyUsage(); - configureEnergyUsage(usage / 10, probeInfo); + probeInfo.text(TextStyleClass.INFO + "{*gregtech.top.energy_consumption*} " + eutText); } } else if (gtte.getMetaTileEntity() instanceof IQuantumStoragestorage && (storage.getType() == IQuantumStorage.Type.ITEM || @@ -59,10 +61,8 @@ public void addProbeInfo(ProbeMode mode, IProbeInfo probeInfo, EntityPlayer play "{*" + status + "*}"; } - public void configureEnergyUsage(long EUs, IProbeInfo probeInfo) { - if (EUs == 0) return; - String text = TextFormatting.RED.toString() + EUs + TextStyleClass.INFO + " EU/t" + TextFormatting.GREEN + + public String configureEnergyUsage(long EUs) { + return TextFormatting.RED.toString() + EUs + TextStyleClass.INFO + " EU/t" + TextFormatting.GREEN + " (" + GTValues.VNF[GTUtility.getTierByVoltage(EUs)] + TextFormatting.GREEN + ")"; - probeInfo.text(TextStyleClass.INFO + "{*gregtech.top.energy_consumption*} " + text); } } diff --git a/src/main/java/gregtech/loaders/recipe/chemistry/PolymerRecipes.java b/src/main/java/gregtech/loaders/recipe/chemistry/PolymerRecipes.java index 7a1531eeb7c..7144f197c50 100644 --- a/src/main/java/gregtech/loaders/recipe/chemistry/PolymerRecipes.java +++ b/src/main/java/gregtech/loaders/recipe/chemistry/PolymerRecipes.java @@ -366,28 +366,29 @@ private static void polybenzimidazoleProcess() { .buildAndRegister(); // 3,3-Diaminobenzidine - LARGE_CHEMICAL_RECIPES.recipeBuilder().EUt(VA[IV]).duration(100) + CHEMICAL_RECIPES.recipeBuilder().EUt(VA[IV]).duration(100) .fluidInputs(Dichlorobenzidine.getFluid(1000)) .fluidInputs(Ammonia.getFluid(2000)) - .notConsumable(dust, Zinc) + .input(dustTiny, Copper) .fluidOutputs(Diaminobenzidine.getFluid(1000)) .fluidOutputs(HydrochloricAcid.getFluid(2000)) .buildAndRegister(); - CHEMICAL_RECIPES.recipeBuilder().EUt(VA[EV]).duration(200) - .input(dustTiny, Copper) + LARGE_CHEMICAL_RECIPES.recipeBuilder().EUt(VA[IV]).duration(900) + .fluidInputs(Dichlorobenzidine.getFluid(9000)) + .fluidInputs(Ammonia.getFluid(18000)) + .input(dust, Copper) + .fluidOutputs(Diaminobenzidine.getFluid(9000)) + .fluidOutputs(HydrochloricAcid.getFluid(18000)) + .buildAndRegister(); + + LARGE_CHEMICAL_RECIPES.recipeBuilder().EUt(VA[EV]).duration(200) .fluidInputs(Nitrochlorobenzene.getFluid(2000)) .fluidInputs(Hydrogen.getFluid(2000)) + .notConsumable(dust, Zinc) .fluidOutputs(Dichlorobenzidine.getFluid(1000)) .buildAndRegister(); - LARGE_CHEMICAL_RECIPES.recipeBuilder().EUt(VA[EV]).duration(1800) - .input(dust, Copper) - .fluidInputs(Nitrochlorobenzene.getFluid(18000)) - .fluidInputs(Hydrogen.getFluid(18000)) - .fluidOutputs(Dichlorobenzidine.getFluid(9000)) - .buildAndRegister(); - CHEMICAL_RECIPES.recipeBuilder().EUt(VA[HV]).duration(100) .fluidInputs(NitrationMixture.getFluid(2000)) .fluidInputs(Chlorobenzene.getFluid(1000)) diff --git a/src/main/java/gregtech/loaders/recipe/handlers/MaterialRecipeHandler.java b/src/main/java/gregtech/loaders/recipe/handlers/MaterialRecipeHandler.java index 3b048b093c6..56b9ea27cb4 100644 --- a/src/main/java/gregtech/loaders/recipe/handlers/MaterialRecipeHandler.java +++ b/src/main/java/gregtech/loaders/recipe/handlers/MaterialRecipeHandler.java @@ -160,6 +160,11 @@ public static void processDust(OrePrefix dustPrefix, Material mat, DustProperty .inputs(dustStack) .outputs(OreDictUnifier.get(OrePrefix.plate, mat)) .buildAndRegister(); + } else if (!OreDictUnifier.get(block, mat).isEmpty()) { + COMPRESSOR_RECIPES.recipeBuilder() + .input(dust, mat, (int) (block.getMaterialAmount(mat) / M)) + .output(block, mat) + .duration(300).EUt(2).buildAndRegister(); } // Some Ores with Direct Smelting Results have neither ingot nor gem properties diff --git a/src/main/java/gregtech/mixins/minecraft/L18nMixin.java b/src/main/java/gregtech/mixins/minecraft/L18nMixin.java new file mode 100644 index 00000000000..26d67c82e0b --- /dev/null +++ b/src/main/java/gregtech/mixins/minecraft/L18nMixin.java @@ -0,0 +1,21 @@ +package gregtech.mixins.minecraft; + +import gregtech.api.mui.LocaleAccessor; + +import net.minecraft.client.resources.I18n; +import net.minecraft.client.resources.Locale; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +// todo remove in next mui2 version +@Mixin(I18n.class) +public abstract class L18nMixin { + + @Inject(method = "setLocale", at = @At("HEAD")) + private static void getLocale(Locale i18nLocaleIn, CallbackInfo ci) { + LocaleAccessor.setLocale(i18nLocaleIn); + } +} diff --git a/src/main/java/gregtech/mixins/minecraft/LocaleMixin.java b/src/main/java/gregtech/mixins/minecraft/LocaleMixin.java new file mode 100644 index 00000000000..b93f29b02e6 --- /dev/null +++ b/src/main/java/gregtech/mixins/minecraft/LocaleMixin.java @@ -0,0 +1,23 @@ +package gregtech.mixins.minecraft; + +import gregtech.api.mui.LocaleAccessor; + +import net.minecraft.client.resources.Locale; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Map; + +// todo remove in next mui2 version +@Mixin(Locale.class) +public abstract class LocaleMixin implements LocaleAccessor { + + @Shadow + Map properties; + + @Override + public String gregtech$getRawKey(String s) { + return this.properties.get(s); + } +} diff --git a/src/main/java/gregtech/mixins/mui2/ClientEventHandlerMixin.java b/src/main/java/gregtech/mixins/mui2/ClientEventHandlerMixin.java deleted file mode 100644 index 678de031802..00000000000 --- a/src/main/java/gregtech/mixins/mui2/ClientEventHandlerMixin.java +++ /dev/null @@ -1,79 +0,0 @@ -package gregtech.mixins.mui2; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiScreen; -import net.minecraftforge.client.event.GuiScreenEvent; - -import com.cleanroommc.modularui.ClientEventHandler; -import com.cleanroommc.modularui.api.IMuiScreen; -import com.cleanroommc.modularui.core.mixin.GuiScreenAccessor; -import com.cleanroommc.modularui.screen.ClientScreenHandler; -import com.cleanroommc.modularui.screen.ModularScreen; -import org.lwjgl.input.Keyboard; -import org.lwjgl.input.Mouse; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.io.IOException; - -@Mixin(value = ClientEventHandler.class, remap = false) -@SuppressWarnings("UnstableApiUsage") -public abstract class ClientEventHandlerMixin { - - @Redirect(method = "onGuiInput(Lnet/minecraftforge/client/event/GuiScreenEvent$MouseInputEvent$Pre;)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiScreen;handleMouseInput()V")) - private static void fixMouseInput(GuiScreen instance) { - int button = Mouse.getEventButton(); - if (instance instanceof IMuiScreen screen && instance instanceof GuiScreenAccessor acc) { - ModularScreen ms = screen.getScreen(); - if (Mouse.getEventButtonState()) { - acc.setEventButton(button); - acc.setLastMouseEvent(Minecraft.getSystemTime()); - ms.onMousePressed(button); - - } else if (button != -1) { - acc.setEventButton(-1); - ms.onMouseRelease(button); - - } else if (acc.getEventButton() != -1 && acc.getLastMouseEvent() > 0L) { - long l = Minecraft.getSystemTime() - acc.getLastMouseEvent(); - ms.onMouseDrag(button, l); - } - } - } - - @Inject(method = "onGuiInput(Lnet/minecraftforge/client/event/GuiScreenEvent$MouseInputEvent$Pre;)V", - at = @At("TAIL")) - private static void fixScrollJei(GuiScreenEvent.MouseInputEvent.Pre event, CallbackInfo ci) throws IOException { - if (!event.isCanceled()) - ClientScreenHandler.onGuiInputLow(event); - } - - @Unique - private static Character gregTech$lastChar = null; - - @Redirect(method = "onGuiInput(Lnet/minecraftforge/client/event/GuiScreenEvent$KeyboardInputEvent$Pre;)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiScreen;handleKeyboardInput()V")) - private static void fixKeyInput(GuiScreen instance) { - if (instance instanceof IMuiScreen screen && instance instanceof GuiScreenAccessor acc) { - char c0 = Keyboard.getEventCharacter(); - int key = Keyboard.getEventKey(); - boolean state = Keyboard.getEventKeyState(); - if (state) { - gregTech$lastChar = c0; - screen.getScreen().onKeyPressed(c0, key); - } else { - // releasing a key - // for some reason when you press E after joining a world the button will not trigger the press event, - // but only the release event, causing this to be null - if (gregTech$lastChar == null) return; - // when the key is released, the event char is empty - screen.getScreen().onKeyRelease(gregTech$lastChar, key); - } - } - } -} diff --git a/src/main/java/gregtech/mixins/mui2/ItemSlotSHMixin.java b/src/main/java/gregtech/mixins/mui2/ItemSlotSHMixin.java deleted file mode 100644 index 5d53a35d3d0..00000000000 --- a/src/main/java/gregtech/mixins/mui2/ItemSlotSHMixin.java +++ /dev/null @@ -1,141 +0,0 @@ -package gregtech.mixins.mui2; - -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketBuffer; -import net.minecraftforge.items.ItemHandlerHelper; - -import com.cleanroommc.modularui.network.NetworkUtils; -import com.cleanroommc.modularui.screen.ModularContainer; -import com.cleanroommc.modularui.utils.MouseData; -import com.cleanroommc.modularui.value.sync.ItemSlotSH; -import com.cleanroommc.modularui.value.sync.SyncHandler; -import com.cleanroommc.modularui.widgets.slot.ModularSlot; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.io.IOException; - -@Mixin(value = ItemSlotSH.class, remap = false) -public abstract class ItemSlotSHMixin extends SyncHandler { - - @Unique - private boolean gregTech$registered; - - @Shadow - protected abstract void phantomScroll(MouseData mouseData); - - @Shadow - public abstract void setEnabled(boolean enabled, boolean sync); - - @Shadow - public abstract boolean isPhantom(); - - @Shadow - private ItemStack lastStoredPhantomItem; - - @Shadow - public abstract ModularSlot getSlot(); - - @Shadow - public abstract void incrementStackCount(int amount); - - @WrapOperation(method = "init", - at = @At(value = "INVOKE", - target = "Lcom/cleanroommc/modularui/screen/ModularContainer;registerSlot(Ljava/lang/String;Lcom/cleanroommc/modularui/widgets/slot/ModularSlot;)V")) - protected void wrapRegister(ModularContainer instance, String slotGroup, ModularSlot modularSlot, - Operation original) { - if (!gregTech$registered) { - original.call(instance, slotGroup, modularSlot); - gregTech$registered = true; - } - } - - /** - * @author GTCEu - Ghzdude - * @reason Implement MUI2 PR#90 - */ - @Overwrite - public void readOnServer(int id, PacketBuffer buf) throws IOException { - if (id == 2) { - phantomClick(MouseData.readPacket(buf)); - } else if (id == 3) { - phantomScroll(MouseData.readPacket(buf)); - } else if (id == 4) { - setEnabled(buf.readBoolean(), false); - } else if (id == 5) { - if (!isPhantom()) return; - gregTech$phantomClick(MouseData.create(0), buf.readItemStack()); - } - } - - @Inject(method = "readOnClient", at = @At("HEAD")) - protected void handlePhantomScroll(int id, PacketBuffer buf, CallbackInfo ci) { - if (id == 3) { - this.lastStoredPhantomItem = NetworkUtils.readItemStack(buf); - getSlot().putStack(this.lastStoredPhantomItem.copy()); - } - } - - @Inject(method = "phantomScroll", at = @At("TAIL")) - protected void syncPhantomScroll(MouseData mouseData, CallbackInfo ci) { - syncToClient(3, buffer -> NetworkUtils.writeItemStack(buffer, this.lastStoredPhantomItem)); - } - - /** - * @author GTCEu - Ghzdude - * @reason Implement MUI2 PR#90 - */ - @Overwrite - protected void phantomClick(MouseData mouseData) { - gregTech$phantomClick(mouseData, getSyncManager().getCursorItem()); - } - - @Unique - protected void gregTech$phantomClick(MouseData mouseData, ItemStack cursorStack) { - ItemStack slotStack = getSlot().getStack(); - ItemStack stackToPut; - if (!cursorStack.isEmpty() && !slotStack.isEmpty() && - !ItemHandlerHelper.canItemStacksStack(cursorStack, slotStack)) { - stackToPut = cursorStack.copy(); - if (mouseData.mouseButton == 1) { - stackToPut.setCount(1); - } - stackToPut.setCount(Math.min(stackToPut.getCount(), getSlot().getItemStackLimit(stackToPut))); - getSlot().putStack(stackToPut); - this.lastStoredPhantomItem = stackToPut.copy(); - } else if (slotStack.isEmpty()) { - if (cursorStack.isEmpty()) { - if (mouseData.mouseButton == 1 && !this.lastStoredPhantomItem.isEmpty()) { - stackToPut = this.lastStoredPhantomItem.copy(); - } else { - return; - } - } else { - stackToPut = cursorStack.copy(); - } - if (mouseData.mouseButton == 1) { - stackToPut.setCount(1); - } - stackToPut.setCount(Math.min(stackToPut.getCount(), getSlot().getItemStackLimit(stackToPut))); - getSlot().putStack(stackToPut); - this.lastStoredPhantomItem = stackToPut.copy(); - } else { - if (mouseData.mouseButton == 0) { - if (mouseData.shift) { - getSlot().putStack(ItemStack.EMPTY); - } else { - incrementStackCount(-1); - } - } else if (mouseData.mouseButton == 1) { - incrementStackCount(1); - } - } - } -} diff --git a/src/main/java/gregtech/mixins/mui2/LangKeyMixin.java b/src/main/java/gregtech/mixins/mui2/LangKeyMixin.java new file mode 100644 index 00000000000..7c219710609 --- /dev/null +++ b/src/main/java/gregtech/mixins/mui2/LangKeyMixin.java @@ -0,0 +1,31 @@ +package gregtech.mixins.mui2; + +import gregtech.api.mui.LocaleAccessor; + +import com.cleanroommc.modularui.drawable.text.BaseKey; +import com.cleanroommc.modularui.drawable.text.LangKey; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +// todo remove in next mui2 version +@Mixin(value = LangKey.class, remap = false) +public abstract class LangKeyMixin extends BaseKey { + + @Redirect(method = "getFormatted", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/resources/I18n;format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;")) + public String getTranslateKey(String translateKey, Object[] parameters) { + return LocaleAccessor.getRawKey(translateKey) + .replace("\\n", "\n") + .replace("/n", "\n"); + } + + @ModifyExpressionValue(method = "get", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/resources/I18n;format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;")) + public String switchNewLines(String original) { + return original.replace("/n", "\n"); + } +} diff --git a/src/main/java/gregtech/mixins/mui2/PanelSyncHandlerMixin.java b/src/main/java/gregtech/mixins/mui2/PanelSyncHandlerMixin.java deleted file mode 100644 index 99a850b1c10..00000000000 --- a/src/main/java/gregtech/mixins/mui2/PanelSyncHandlerMixin.java +++ /dev/null @@ -1,47 +0,0 @@ -package gregtech.mixins.mui2; - -import com.cleanroommc.modularui.api.widget.ISynced; -import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.value.sync.ModularSyncManager; -import com.cleanroommc.modularui.value.sync.PanelSyncHandler; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.widget.WidgetTree; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.concurrent.atomic.AtomicInteger; - -@Mixin(value = PanelSyncHandler.class, remap = false) -public abstract class PanelSyncHandlerMixin { - - @Shadow - private PanelSyncManager syncManager; - - @Shadow - public abstract boolean isPanelOpen(); - - @Redirect(method = "openPanel(Z)V", - at = @At(value = "INVOKE", - target = "Lcom/cleanroommc/modularui/widget/WidgetTree;collectSyncValues(Lcom/cleanroommc/modularui/value/sync/PanelSyncManager;Lcom/cleanroommc/modularui/screen/ModularPanel;)V")) - protected void redirectCollectValues(PanelSyncManager syncManager, ModularPanel panel) { - AtomicInteger id = new AtomicInteger(0); - String syncKey = ModularSyncManager.AUTO_SYNC_PREFIX + panel.getName(); - WidgetTree.foreachChildBFS(panel, widget -> { - if (widget instanceof ISyncedsynced) { - if (synced.isSynced() && !this.syncManager.hasSyncHandler(synced.getSyncHandler())) { - this.syncManager.syncValue(syncKey, id.getAndIncrement(), synced.getSyncHandler()); - } - } - return true; - }, false); - } - - @Inject(method = "openPanel(Z)V", at = @At("HEAD"), cancellable = true) - protected void openCheck(boolean syncToServer, CallbackInfo ci) { - if (isPanelOpen()) ci.cancel(); - } -} diff --git a/src/main/java/gregtech/mixins/mui2/PanelSyncManagerMixin.java b/src/main/java/gregtech/mixins/mui2/PanelSyncManagerMixin.java deleted file mode 100644 index 9bea0ab1af2..00000000000 --- a/src/main/java/gregtech/mixins/mui2/PanelSyncManagerMixin.java +++ /dev/null @@ -1,36 +0,0 @@ -package gregtech.mixins.mui2; - -import gregtech.api.util.GTLog; - -import net.minecraft.network.PacketBuffer; - -import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.value.sync.SyncHandler; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.Map; - -@Mixin(value = PanelSyncManager.class, remap = false) -public abstract class PanelSyncManagerMixin { - - @Shadow - @Final - private Map syncHandlers; - - @Shadow - private String panelName; - - @Inject(method = "receiveWidgetUpdate", at = @At("HEAD"), cancellable = true) - public void injectCheck(String mapKey, int id, PacketBuffer buf, CallbackInfo ci) { - if (!this.syncHandlers.containsKey(mapKey)) { - GTLog.logger.warn("[ModularUI] SyncHandler \"{}\" does not exist for panel \"{}\"! ID was {}.", mapKey, - panelName, id); - ci.cancel(); - } - } -} diff --git a/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java b/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java deleted file mode 100644 index 41c269111ab..00000000000 --- a/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java +++ /dev/null @@ -1,119 +0,0 @@ -package gregtech.mixins.mui2; - -import gregtech.api.mui.UnboxFix; - -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.drawable.text.AnimatedText; -import com.cleanroommc.modularui.drawable.text.StyledText; -import com.cleanroommc.modularui.theme.WidgetTheme; -import com.cleanroommc.modularui.utils.Alignment; -import com.cleanroommc.modularui.widgets.TextWidget; -import com.llamalad7.mixinextras.sugar.Local; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyArg; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -@Mixin(value = StyledText.class, remap = false) -public abstract class StyledTextMixin implements UnboxFix { - - @Shadow - @Final - private IKey key; - - @Shadow - private Alignment alignment; - - @Shadow - private Integer color; - - @Shadow - private float scale; - - @Shadow - private Boolean shadow; - - @Unique - private boolean gregTech$defaultTextColor = true; - - @Unique - private boolean gregTech$defaultShadow = true; - - @Override - public void gregTech$useDefaultTextColor(boolean b) { - gregTech$defaultTextColor = b; - } - - @Override - public void gregTech$useDefaultShadow(boolean b) { - gregTech$defaultShadow = b; - } - - @Inject(method = "color", at = @At("HEAD")) - private void setDefault(int color, CallbackInfoReturnable cir) { - gregTech$useDefaultTextColor(false); - } - - @Inject(method = "shadow", at = @At("HEAD")) - private void setDefault(boolean shadow, CallbackInfoReturnable cir) { - gregTech$useDefaultShadow(false); - } - - /** - * @author GTCEu - Ghzdude - * @reason Implement MUI2 PR#86 - */ - @Overwrite - public TextWidget asWidget() { - var text = new TextWidget(this.key) - .alignment(this.alignment) - .scale(this.scale); - - ((UnboxFix) text).gregTech$useDefaultTextColor(this.gregTech$defaultTextColor); - ((UnboxFix) text).gregTech$useDefaultShadow(this.gregTech$defaultShadow); - - return text.color(color == null ? 0 : color) - .shadow(shadow != null && shadow); - } - - /** - * @author GTCEu - Ghzdude - * @reason Implement MUI2 PR#86 - */ - @Overwrite - public AnimatedText withAnimation() { - var text = new AnimatedText(this.key) - .alignment(this.alignment) - .scale(this.scale); - - ((UnboxFix) text).gregTech$useDefaultTextColor(this.gregTech$defaultTextColor); - ((UnboxFix) text).gregTech$useDefaultShadow(this.gregTech$defaultShadow); - - return text.color(color == null ? 0 : color) - .shadow(shadow != null && shadow); - } - - @SideOnly(Side.CLIENT) - @ModifyArg(method = "draw", - at = @At(value = "INVOKE", - target = "Lcom/cleanroommc/modularui/drawable/text/TextRenderer;setColor(I)V")) - public int fixColor(int color, @Local(argsOnly = true) WidgetTheme theme) { - return gregTech$defaultTextColor ? theme.getTextColor() : color; - } - - @SideOnly(Side.CLIENT) - @ModifyArg(method = "draw", - at = @At(value = "INVOKE", - target = "Lcom/cleanroommc/modularui/drawable/text/TextRenderer;setShadow(Z)V")) - public boolean fixShadow(boolean shadow, @Local(argsOnly = true) WidgetTheme theme) { - return gregTech$defaultShadow ? theme.getTextShadow() : shadow; - } -} diff --git a/src/main/java/gregtech/mixins/mui2/TextWidgetMixin.java b/src/main/java/gregtech/mixins/mui2/TextWidgetMixin.java deleted file mode 100644 index 40320a51020..00000000000 --- a/src/main/java/gregtech/mixins/mui2/TextWidgetMixin.java +++ /dev/null @@ -1,57 +0,0 @@ -package gregtech.mixins.mui2; - -import gregtech.api.mui.UnboxFix; - -import com.cleanroommc.modularui.theme.WidgetTheme; -import com.cleanroommc.modularui.widget.Widget; -import com.cleanroommc.modularui.widgets.TextWidget; -import com.llamalad7.mixinextras.injector.ModifyReturnValue; -import com.llamalad7.mixinextras.sugar.Local; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyArg; - -@Mixin(value = TextWidget.class, remap = false) -public abstract class TextWidgetMixin extends Widget implements UnboxFix { - - @Unique - private boolean gregTech$defaultTextColor = true; - - @Unique - private boolean gregTech$defaultShadow = true; - - @Override - public void gregTech$useDefaultTextColor(boolean b) { - gregTech$defaultTextColor = b; - } - - @Override - public void gregTech$useDefaultShadow(boolean b) { - gregTech$defaultShadow = b; - } - - @Override - public boolean canHover() { - return hasTooltip(); - } - - @ModifyReturnValue(method = { "getDefaultHeight", "getDefaultWidth" }, at = @At("TAIL")) - public int clamp(int r) { - return Math.max(1, r); - } - - @ModifyArg(method = "draw", - at = @At(value = "INVOKE", - target = "Lcom/cleanroommc/modularui/drawable/text/TextRenderer;setColor(I)V")) - public int fixColor(int color, @Local(argsOnly = true) WidgetTheme theme) { - return gregTech$defaultTextColor ? theme.getTextColor() : color; - } - - @ModifyArg(method = "draw", - at = @At(value = "INVOKE", - target = "Lcom/cleanroommc/modularui/drawable/text/TextRenderer;setShadow(Z)V")) - public boolean fixShadow(boolean shadow, @Local(argsOnly = true) WidgetTheme theme) { - return gregTech$defaultShadow ? theme.getTextShadow() : shadow; - } -} diff --git a/src/main/java/gregtech/mixins/mui2/ToggleButtonMixin.java b/src/main/java/gregtech/mixins/mui2/ToggleButtonMixin.java deleted file mode 100644 index 3838ecf5805..00000000000 --- a/src/main/java/gregtech/mixins/mui2/ToggleButtonMixin.java +++ /dev/null @@ -1,22 +0,0 @@ -package gregtech.mixins.mui2; - -import gregtech.api.mui.StateOverlay; - -import com.cleanroommc.modularui.api.drawable.IDrawable; -import com.cleanroommc.modularui.widgets.AbstractCycleButtonWidget; -import com.cleanroommc.modularui.widgets.ToggleButton; -import org.spongepowered.asm.mixin.Mixin; - -@Mixin(value = ToggleButton.class, remap = false) -public class ToggleButtonMixin extends AbstractCycleButtonWidget implements StateOverlay { - - public StateOverlay overlay(boolean selected, IDrawable... overlay) { - this.overlay = addToArray(this.overlay, overlay, selected ? 1 : 0); - return (StateOverlay) getThis(); - } - - public StateOverlay hoverOverlay(boolean selected, IDrawable... overlay) { - this.hoverOverlay = addToArray(this.hoverOverlay, overlay, selected ? 1 : 0); - return (StateOverlay) getThis(); - } -} diff --git a/src/main/java/gregtech/mixins/mui2/TooltipMixin.java b/src/main/java/gregtech/mixins/mui2/TooltipMixin.java deleted file mode 100644 index 7883e8b12de..00000000000 --- a/src/main/java/gregtech/mixins/mui2/TooltipMixin.java +++ /dev/null @@ -1,100 +0,0 @@ -package gregtech.mixins.mui2; - -import com.cleanroommc.modularui.drawable.text.RichText; -import com.cleanroommc.modularui.screen.RichTooltip; -import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; -import com.cleanroommc.modularui.theme.WidgetTheme; -import com.cleanroommc.modularui.widget.Widget; -import com.cleanroommc.modularui.widgets.RichTextWidget; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; - -import java.util.function.Consumer; - -@Mixin(value = RichTooltip.class, remap = false) -public abstract class TooltipMixin { - - @Shadow - private boolean dirty; - - @Shadow - @Final - private RichText text; - - @Shadow - private Consumer tooltipBuilder; - - @Shadow - public abstract RichTooltip getThis(); - - @Shadow - public abstract void markDirty(); - - /** - * @author GTCEu - Ghzdude - * @reason Implement MUI2 PR#83 - */ - @Overwrite - public void buildTooltip() { - this.dirty = false; - if (this.tooltipBuilder != null) { - this.text.clearText(); - this.tooltipBuilder.accept(getThis()); - } - } - - /** - * @author GTCEu - Ghzdude - * @reason Implement MUI2 PR#83 - */ - @Overwrite - public RichTooltip tooltipBuilder(Consumer tooltipBuilder) { - Consumer existingBuilder = this.tooltipBuilder; - if (existingBuilder != null) { - this.tooltipBuilder = tooltip -> { - existingBuilder.accept(getThis()); - tooltipBuilder.accept(getThis()); - }; - } else { - this.tooltipBuilder = tooltipBuilder; - } - markDirty(); - return getThis(); - } - - @Mixin(value = RichTextWidget.class, remap = false) - private static abstract class RichTextWidgetMixin extends Widget { - - @Shadow - private boolean autoUpdate; - - @Shadow - private boolean dirty; - - @Shadow - @Final - private RichText text; - - @Shadow - private Consumer builder; - - /** - * @author GTCEu - Ghzdude - * @reason Implement MUI2 PR#83 - */ - @Overwrite - public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { - super.draw(context, widgetTheme); - if (this.autoUpdate || this.dirty) { - if (this.builder != null) { - this.text.clearText(); - this.builder.accept(this.text); - } - this.dirty = false; - } - this.text.drawAtZero(context, getArea(), widgetTheme); - } - } -} diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index eef80763ada..56a674d293b 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -68,6 +68,7 @@ gregtech.top.working_disabled=Working Disabled gregtech.top.energy_consumption=Using gregtech.top.energy_production=Producing +gregtech.top.energy_required=Requires gregtech.top.transform_up=Step Up gregtech.top.transform_down=Step Down @@ -4783,6 +4784,7 @@ behaviour.softhammer=Activates and Deactivates Machines behaviour.hammer=Turns on and off Muffling for Machines (by hitting them) behaviour.wrench=Rotates Blocks on Rightclick behaviour.boor.by=by %s +behaviour.cell_bucket.tooltip=Can pickup or place fluids behaviour.paintspray.solvent.tooltip=Can remove color from things behaviour.paintspray.white.tooltip=Can paint things in White behaviour.paintspray.orange.tooltip=Can paint things in Orange @@ -5041,6 +5043,11 @@ gregtech.machine.item_bus.import.luv.name=LuV Input Bus gregtech.machine.item_bus.import.zpm.name=ZPM Input Bus gregtech.machine.item_bus.import.uv.name=UV Input Bus gregtech.machine.item_bus.import.uhv.name=UHV Input Bus +gregtech.machine.item_bus.import.uev.name=UEV Input Bus +gregtech.machine.item_bus.import.uiv.name=UIV Input Bus +gregtech.machine.item_bus.import.uxv.name=UXV Input Bus +gregtech.machine.item_bus.import.opv.name=OpV Input Bus +gregtech.machine.item_bus.import.max.name=MAX Input Bus gregtech.machine.item_bus.export.tooltip=Item Output for Multiblocks @@ -5054,6 +5061,11 @@ gregtech.machine.item_bus.export.luv.name=LuV Output Bus gregtech.machine.item_bus.export.zpm.name=ZPM Output Bus gregtech.machine.item_bus.export.uv.name=UV Output Bus gregtech.machine.item_bus.export.uhv.name=UHV Output Bus +gregtech.machine.item_bus.export.uev.name=UEV Output Bus +gregtech.machine.item_bus.export.uiv.name=UIV Output Bus +gregtech.machine.item_bus.export.uxv.name=UXV Output Bus +gregtech.machine.item_bus.export.opv.name=OpV Output Bus +gregtech.machine.item_bus.export.max.name=MAX Output Bus gregtech.bus.collapse_true=Bus will collapse Items gregtech.bus.collapse_false=Bus will not collapse Items @@ -5070,6 +5082,11 @@ gregtech.machine.fluid_hatch.import.luv.name=LuV Input Hatch gregtech.machine.fluid_hatch.import.zpm.name=ZPM Input Hatch gregtech.machine.fluid_hatch.import.uv.name=UV Input Hatch gregtech.machine.fluid_hatch.import.uhv.name=UHV Input Hatch +gregtech.machine.fluid_hatch.import.uev.name=UEV Input Hatch +gregtech.machine.fluid_hatch.import.uiv.name=UIV Input Hatch +gregtech.machine.fluid_hatch.import.uxv.name=UXV Input Hatch +gregtech.machine.fluid_hatch.import.opv.name=OpV Input Hatch +gregtech.machine.fluid_hatch.import.max.name=MAX Input Hatch gregtech.machine.fluid_hatch.export.tooltip=Fluid Output for Multiblocks @@ -5079,6 +5096,11 @@ gregtech.machine.fluid_hatch.import_4x.luv.name=LuV Quadruple Input Hatch gregtech.machine.fluid_hatch.import_4x.zpm.name=ZPM Quadruple Input Hatch gregtech.machine.fluid_hatch.import_4x.uv.name=UV Quadruple Input Hatch gregtech.machine.fluid_hatch.import_4x.uhv.name=UHV Quadruple Input Hatch +gregtech.machine.fluid_hatch.import_4x.uev.name=UEV Quadruple Input Hatch +gregtech.machine.fluid_hatch.import_4x.uiv.name=UIV Quadruple Input Hatch +gregtech.machine.fluid_hatch.import_4x.uxv.name=UXV Quadruple Input Hatch +gregtech.machine.fluid_hatch.import_4x.opv.name=OpV Quadruple Input Hatch +gregtech.machine.fluid_hatch.import_4x.max.name=MAX Quadruple Input Hatch gregtech.machine.fluid_hatch.import_9x.name=EV Nonuple Input Hatch gregtech.machine.fluid_hatch.import_9x.iv.name=IV Nonuple Input Hatch @@ -5086,6 +5108,11 @@ gregtech.machine.fluid_hatch.import_9x.luv.name=LuV Nonuple Input Hatch gregtech.machine.fluid_hatch.import_9x.zpm.name=ZPM Nonuple Input Hatch gregtech.machine.fluid_hatch.import_9x.uv.name=UV Nonuple Input Hatch gregtech.machine.fluid_hatch.import_9x.uhv.name=UHV Nonuple Input Hatch +gregtech.machine.fluid_hatch.import_9x.uev.name=UEV Nonuple Input Hatch +gregtech.machine.fluid_hatch.import_9x.uiv.name=UIV Nonuple Input Hatch +gregtech.machine.fluid_hatch.import_9x.uxv.name=UXV Nonuple Input Hatch +gregtech.machine.fluid_hatch.import_9x.opv.name=OpV Nonuple Input Hatch +gregtech.machine.fluid_hatch.import_9x.max.name=MAX Nonuple Input Hatch gregtech.machine.fluid_hatch.export_4x.name=EV Quadruple Output Hatch gregtech.machine.fluid_hatch.export_4x.iv.name=IV Quadruple Output Hatch @@ -5093,6 +5120,11 @@ gregtech.machine.fluid_hatch.export_4x.luv.name=LuV Quadruple Output Hatch gregtech.machine.fluid_hatch.export_4x.zpm.name=ZPM Quadruple Output Hatch gregtech.machine.fluid_hatch.export_4x.uv.name=UV Quadruple Output Hatch gregtech.machine.fluid_hatch.export_4x.uhv.name=UHV Quadruple Output Hatch +gregtech.machine.fluid_hatch.export_4x.uev.name=UEV Quadruple Output Hatch +gregtech.machine.fluid_hatch.export_4x.uiv.name=UIV Quadruple Output Hatch +gregtech.machine.fluid_hatch.export_4x.uxv.name=UXV Quadruple Output Hatch +gregtech.machine.fluid_hatch.export_4x.opv.name=OpV Quadruple Output Hatch +gregtech.machine.fluid_hatch.export_4x.max.name=MAX Quadruple Output Hatch gregtech.machine.fluid_hatch.export_9x.name=EV Nonuple Output Hatch gregtech.machine.fluid_hatch.export_9x.iv.name=IV Nonuple Output Hatch @@ -5100,6 +5132,11 @@ gregtech.machine.fluid_hatch.export_9x.luv.name=LuV Nonuple Output Hatch gregtech.machine.fluid_hatch.export_9x.zpm.name=ZPM Nonuple Output Hatch gregtech.machine.fluid_hatch.export_9x.uv.name=UV Nonuple Output Hatch gregtech.machine.fluid_hatch.export_9x.uhv.name=UHV Nonuple Output Hatch +gregtech.machine.fluid_hatch.export_9x.uev.name=UEV Nonuple Output Hatch +gregtech.machine.fluid_hatch.export_9x.uiv.name=UIV Nonuple Output Hatch +gregtech.machine.fluid_hatch.export_9x.uxv.name=UXV Nonuple Output Hatch +gregtech.machine.fluid_hatch.export_9x.opv.name=OpV Nonuple Output Hatch +gregtech.machine.fluid_hatch.export_9x.max.name=MAX Nonuple Output Hatch gregtech.machine.fluid_hatch.export.ulv.name=ULV Output Hatch gregtech.machine.fluid_hatch.export.lv.name=LV Output Hatch @@ -5111,6 +5148,11 @@ gregtech.machine.fluid_hatch.export.luv.name=LuV Output Hatch gregtech.machine.fluid_hatch.export.zpm.name=ZPM Output Hatch gregtech.machine.fluid_hatch.export.uv.name=UV Output Hatch gregtech.machine.fluid_hatch.export.uhv.name=UHV Output Hatch +gregtech.machine.fluid_hatch.export.uev.name=UEV Output Hatch +gregtech.machine.fluid_hatch.export.uiv.name=UIV Output Hatch +gregtech.machine.fluid_hatch.export.uxv.name=UXV Output Hatch +gregtech.machine.fluid_hatch.export.opv.name=OpV Output Hatch +gregtech.machine.fluid_hatch.export.max.name=MAX Output Hatch gregtech.machine.energy_hatch.input.tooltip=Energy Input for Multiblocks @@ -5138,12 +5180,22 @@ gregtech.machine.energy_hatch.input_4a.luv.name=LuV 4A Energy Hatch gregtech.machine.energy_hatch.input_4a.zpm.name=ZPM 4A Energy Hatch gregtech.machine.energy_hatch.input_4a.uv.name=UV 4A Energy Hatch gregtech.machine.energy_hatch.input_4a.uhv.name=UHV 4A Energy Hatch +gregtech.machine.energy_hatch.input_4a.uev.name=UEV 4A Energy Hatch +gregtech.machine.energy_hatch.input_4a.uiv.name=UIV 4A Energy Hatch +gregtech.machine.energy_hatch.input_4a.uxv.name=UXV 4A Energy Hatch +gregtech.machine.energy_hatch.input_4a.opv.name=OpV 4A Energy Hatch +gregtech.machine.energy_hatch.input_4a.max.name=MAX 4A Energy Hatch gregtech.machine.energy_hatch.input_16a.iv.name=IV 16A Energy Hatch gregtech.machine.energy_hatch.input_16a.luv.name=LuV 16A Energy Hatch gregtech.machine.energy_hatch.input_16a.zpm.name=ZPM 16A Energy Hatch gregtech.machine.energy_hatch.input_16a.uv.name=UV 16A Energy Hatch gregtech.machine.energy_hatch.input_16a.uhv.name=UHV 16A Energy Hatch +gregtech.machine.energy_hatch.input_16a.uev.name=UEV 16A Energy Hatch +gregtech.machine.energy_hatch.input_16a.uiv.name=UIV 16A Energy Hatch +gregtech.machine.energy_hatch.input_16a.uxv.name=UXV 16A Energy Hatch +gregtech.machine.energy_hatch.input_16a.opv.name=OpV 16A Energy Hatch +gregtech.machine.energy_hatch.input_16a.max.name=MAX 16A Energy Hatch gregtech.machine.substation_hatch.input.tooltip=Energy Input for the Power Substation @@ -5152,6 +5204,11 @@ gregtech.machine.substation_hatch.input_64a.luv.name=LuV 64A Substation Energy H gregtech.machine.substation_hatch.input_64a.zpm.name=ZPM 64A Substation Energy Hatch gregtech.machine.substation_hatch.input_64a.uv.name=UV 64A Substation Energy Hatch gregtech.machine.substation_hatch.input_64a.uhv.name=UHV 64A Substation Energy Hatch +gregtech.machine.substation_hatch.input_64a.uev.name=UEV 64A Substation Energy Hatch +gregtech.machine.substation_hatch.input_64a.uiv.name=UIV 64A Substation Energy Hatch +gregtech.machine.substation_hatch.input_64a.uxv.name=UXV 64A Substation Energy Hatch +gregtech.machine.substation_hatch.input_64a.opv.name=OpV 64A Substation Energy Hatch +gregtech.machine.substation_hatch.input_64a.max.name=MAX 64A Substation Energy Hatch gregtech.machine.energy_hatch.output.tooltip=Energy Output for Multiblocks @@ -5179,12 +5236,22 @@ gregtech.machine.energy_hatch.output_4a.luv.name=LuV 4A Dynamo Hatch gregtech.machine.energy_hatch.output_4a.zpm.name=ZPM 4A Dynamo Hatch gregtech.machine.energy_hatch.output_4a.uv.name=UV 4A Dynamo Hatch gregtech.machine.energy_hatch.output_4a.uhv.name=UHV 4A Dynamo Hatch +gregtech.machine.energy_hatch.output_4a.uev.name=UEV 4A Dynamo Hatch +gregtech.machine.energy_hatch.output_4a.uiv.name=UIV 4A Dynamo Hatch +gregtech.machine.energy_hatch.output_4a.uxv.name=UXV 4A Dynamo Hatch +gregtech.machine.energy_hatch.output_4a.opv.name=OpV 4A Dynamo Hatch +gregtech.machine.energy_hatch.output_4a.max.name=MAX 4A Dynamo Hatch gregtech.machine.energy_hatch.output_16a.iv.name=IV 16A Dynamo Hatch gregtech.machine.energy_hatch.output_16a.luv.name=LuV 16A Dynamo Hatch gregtech.machine.energy_hatch.output_16a.zpm.name=ZPM 16A Dynamo Hatch gregtech.machine.energy_hatch.output_16a.uv.name=UV 16A Dynamo Hatch gregtech.machine.energy_hatch.output_16a.uhv.name=UHV 16A Dynamo Hatch +gregtech.machine.energy_hatch.output_16a.uev.name=UEV 16A Dynamo Hatch +gregtech.machine.energy_hatch.output_16a.uiv.name=UIV 16A Dynamo Hatch +gregtech.machine.energy_hatch.output_16a.uxv.name=UXV 16A Dynamo Hatch +gregtech.machine.energy_hatch.output_16a.opv.name=OpV 16A Dynamo Hatch +gregtech.machine.energy_hatch.output_16a.max.name=MAX 16A Dynamo Hatch gregtech.machine.substation_hatch.output.tooltip=Energy Output for the Power Substation @@ -5193,6 +5260,11 @@ gregtech.machine.substation_hatch.output_64a.luv.name=LuV 64A Substation Dynamo gregtech.machine.substation_hatch.output_64a.zpm.name=ZPM 64A Substation Dynamo Hatch gregtech.machine.substation_hatch.output_64a.uv.name=UV 64A Substation Dynamo Hatch gregtech.machine.substation_hatch.output_64a.uhv.name=UHV 64A Substation Dynamo Hatch +gregtech.machine.substation_hatch.output_64a.uev.name=UEV 64A Substation Dynamo Hatch +gregtech.machine.substation_hatch.output_64a.uiv.name=UIV 64A Substation Dynamo Hatch +gregtech.machine.substation_hatch.output_64a.uxv.name=UXV 64A Substation Dynamo Hatch +gregtech.machine.substation_hatch.output_64a.opv.name=OpV 64A Substation Dynamo Hatch +gregtech.machine.substation_hatch.output_64a.max.name=MAX 64A Substation Dynamo Hatch gregtech.machine.rotor_holder.tooltip1=Rotor Holder for Multiblocks gregtech.machine.rotor_holder.tooltip2=Holds Rotor in place so it will not fly away diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/conveyor.module.uiv.png b/src/main/resources/assets/gregtech/textures/items/metaitems/conveyor.module.uiv.png index 06323251106..9ea51add5e4 100644 Binary files a/src/main/resources/assets/gregtech/textures/items/metaitems/conveyor.module.uiv.png and b/src/main/resources/assets/gregtech/textures/items/metaitems/conveyor.module.uiv.png differ diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/conveyor.module.uxv.png b/src/main/resources/assets/gregtech/textures/items/metaitems/conveyor.module.uxv.png index 2ced6b9a2c6..4df4dddd9cf 100644 Binary files a/src/main/resources/assets/gregtech/textures/items/metaitems/conveyor.module.uxv.png and b/src/main/resources/assets/gregtech/textures/items/metaitems/conveyor.module.uxv.png differ diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/electric.motor.uiv.png b/src/main/resources/assets/gregtech/textures/items/metaitems/electric.motor.uiv.png index 325767a271c..d73b64d8aa4 100644 Binary files a/src/main/resources/assets/gregtech/textures/items/metaitems/electric.motor.uiv.png and b/src/main/resources/assets/gregtech/textures/items/metaitems/electric.motor.uiv.png differ diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/electric.motor.uxv.png b/src/main/resources/assets/gregtech/textures/items/metaitems/electric.motor.uxv.png index c698b0be170..a9d05b3ba54 100644 Binary files a/src/main/resources/assets/gregtech/textures/items/metaitems/electric.motor.uxv.png and b/src/main/resources/assets/gregtech/textures/items/metaitems/electric.motor.uxv.png differ diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/electric.piston.uiv.png b/src/main/resources/assets/gregtech/textures/items/metaitems/electric.piston.uiv.png index d5cea012ff3..70b1edddf91 100644 Binary files a/src/main/resources/assets/gregtech/textures/items/metaitems/electric.piston.uiv.png and b/src/main/resources/assets/gregtech/textures/items/metaitems/electric.piston.uiv.png differ diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/electric.piston.uxv.png b/src/main/resources/assets/gregtech/textures/items/metaitems/electric.piston.uxv.png index 53296aa3010..2ba45f126c4 100644 Binary files a/src/main/resources/assets/gregtech/textures/items/metaitems/electric.piston.uxv.png and b/src/main/resources/assets/gregtech/textures/items/metaitems/electric.piston.uxv.png differ diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/electric.pump.uiv.png b/src/main/resources/assets/gregtech/textures/items/metaitems/electric.pump.uiv.png index 8162fa247c9..50052712dd5 100644 Binary files a/src/main/resources/assets/gregtech/textures/items/metaitems/electric.pump.uiv.png and b/src/main/resources/assets/gregtech/textures/items/metaitems/electric.pump.uiv.png differ diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/electric.pump.uxv.png b/src/main/resources/assets/gregtech/textures/items/metaitems/electric.pump.uxv.png index 0e118952297..eeab9678a88 100644 Binary files a/src/main/resources/assets/gregtech/textures/items/metaitems/electric.pump.uxv.png and b/src/main/resources/assets/gregtech/textures/items/metaitems/electric.pump.uxv.png differ diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/emitter.uiv.png b/src/main/resources/assets/gregtech/textures/items/metaitems/emitter.uiv.png index 0f7dba778e7..cf81fe66894 100644 Binary files a/src/main/resources/assets/gregtech/textures/items/metaitems/emitter.uiv.png and b/src/main/resources/assets/gregtech/textures/items/metaitems/emitter.uiv.png differ diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/emitter.uxv.png b/src/main/resources/assets/gregtech/textures/items/metaitems/emitter.uxv.png index d1cf0492679..88b8b259e88 100644 Binary files a/src/main/resources/assets/gregtech/textures/items/metaitems/emitter.uxv.png and b/src/main/resources/assets/gregtech/textures/items/metaitems/emitter.uxv.png differ diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/field.generator.uiv.png b/src/main/resources/assets/gregtech/textures/items/metaitems/field.generator.uiv.png index e6159ba128e..87801dd3809 100644 Binary files a/src/main/resources/assets/gregtech/textures/items/metaitems/field.generator.uiv.png and b/src/main/resources/assets/gregtech/textures/items/metaitems/field.generator.uiv.png differ diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/field.generator.uxv.png b/src/main/resources/assets/gregtech/textures/items/metaitems/field.generator.uxv.png index fc2926fe30d..98075409d92 100644 Binary files a/src/main/resources/assets/gregtech/textures/items/metaitems/field.generator.uxv.png and b/src/main/resources/assets/gregtech/textures/items/metaitems/field.generator.uxv.png differ diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/robot.arm.uiv.png b/src/main/resources/assets/gregtech/textures/items/metaitems/robot.arm.uiv.png index 04b59430f91..1c07f760c0c 100644 Binary files a/src/main/resources/assets/gregtech/textures/items/metaitems/robot.arm.uiv.png and b/src/main/resources/assets/gregtech/textures/items/metaitems/robot.arm.uiv.png differ diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/robot.arm.uxv.png b/src/main/resources/assets/gregtech/textures/items/metaitems/robot.arm.uxv.png index b6d8e1effb3..420a17cce0d 100644 Binary files a/src/main/resources/assets/gregtech/textures/items/metaitems/robot.arm.uxv.png and b/src/main/resources/assets/gregtech/textures/items/metaitems/robot.arm.uxv.png differ diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/sensor.uiv.png b/src/main/resources/assets/gregtech/textures/items/metaitems/sensor.uiv.png index 03589241faa..affa834cbfa 100644 Binary files a/src/main/resources/assets/gregtech/textures/items/metaitems/sensor.uiv.png and b/src/main/resources/assets/gregtech/textures/items/metaitems/sensor.uiv.png differ diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/sensor.uxv.png b/src/main/resources/assets/gregtech/textures/items/metaitems/sensor.uxv.png index 2971a364226..e06f44a606e 100644 Binary files a/src/main/resources/assets/gregtech/textures/items/metaitems/sensor.uxv.png and b/src/main/resources/assets/gregtech/textures/items/metaitems/sensor.uxv.png differ diff --git a/src/main/resources/mixins.gregtech.minecraft.json b/src/main/resources/mixins.gregtech.minecraft.json index 85676f99055..41a4c44b26e 100644 --- a/src/main/resources/mixins.gregtech.minecraft.json +++ b/src/main/resources/mixins.gregtech.minecraft.json @@ -18,8 +18,10 @@ "client": [ "BlockMixin", "EntityRendererMixin", + "L18nMixin", "LayerArmorBaseMixin", "LayerCustomHeadMixin", + "LocaleMixin", "RecipeRepairItemMixin", "RegionRenderCacheBuilderMixin", "RenderChunkMixin", diff --git a/src/main/resources/mixins.gregtech.mui2.json b/src/main/resources/mixins.gregtech.mui2.json index cb97f2be00c..427113e6ac8 100644 --- a/src/main/resources/mixins.gregtech.mui2.json +++ b/src/main/resources/mixins.gregtech.mui2.json @@ -7,18 +7,9 @@ "injectors": { "maxShiftBy": 10 }, - "mixins": [ - "ItemSlotSHMixin", - "PanelSyncHandlerMixin", - "PanelSyncManagerMixin", - "StyledTextMixin", - "TextWidgetMixin", - "ToggleButtonMixin", - "TooltipMixin", - "TooltipMixin$RichTextWidgetMixin" - ], + "mixins": [], "client": [ - "ClientEventHandlerMixin" + "LangKeyMixin" ], "server": [] }