diff --git a/dependencies.gradle b/dependencies.gradle index 112c8e2d2c9..a0d91ab38d4 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:3.0.4") { transitive = false } + api("com.cleanroommc:modularui:3.0.5") { transitive = false } api("com.cleanroommc:groovyscript:1.2.0-hotfix1") { transitive = false } api("curse.maven:inventory-bogosorter-632327:7102721-deobf-6717233-sources-6717234") // Inventory BogoSorter − v1.5.0 api("curse.maven:key-binding-patch-928895:5951859") // Key Binding Patch v1.3.3.3, needed by Inventory BogoSorter v1.5.0+ diff --git a/src/main/java/gregtech/api/GTValues.java b/src/main/java/gregtech/api/GTValues.java index 0c029c7927c..1187570caf3 100644 --- a/src/main/java/gregtech/api/GTValues.java +++ b/src/main/java/gregtech/api/GTValues.java @@ -1,5 +1,6 @@ package gregtech.api; +import gregtech.api.util.GTUtility; import gregtech.api.util.random.XoShiRo256PlusPlusRandom; import gregtech.common.ConfigHolder; @@ -7,7 +8,7 @@ import net.minecraftforge.fml.relauncher.FMLLaunchHandler; import net.minecraftforge.oredict.OreDictionary; -import java.time.LocalDate; +import java.time.MonthDay; import java.util.Random; import java.util.function.Supplier; @@ -191,14 +192,29 @@ public static boolean isDeobfEnvironment() { */ public static final int FALLBACK = -1; - public static Supplier FOOLS = () -> { - String[] yearMonthDay = LocalDate.now().toString().split("-"); - return ConfigHolder.misc.specialEvents && yearMonthDay[1].equals("04") && yearMonthDay[2].equals("01"); - }; + public static final MonthDay DAY_APRIL_FOOLS = MonthDay.of(4, 1); + public static final MonthDay DAY_XMAS_EVE = MonthDay.of(12, 24); + public static final MonthDay DAY_XMAS = MonthDay.of(12, 25); - public static Supplier XMAS = () -> { - String[] yearMonthDay = LocalDate.now().toString().split("-"); - return ConfigHolder.misc.specialEvents && yearMonthDay[1].equals("12") && - (yearMonthDay[2].equals("24") || yearMonthDay[2].equals("25")); - }; + /** + * Check if today is April 1st. + */ + public static boolean isAprilFools() { + if (!ConfigHolder.misc.specialEvents) return false; + return GTUtility.isToday(DAY_APRIL_FOOLS); + } + + /** + * Check if today is the day of, or eve of Xmas. + */ + public static boolean isXMAS() { + if (!ConfigHolder.misc.specialEvents) return false; + return GTUtility.isToday(DAY_XMAS_EVE) || GTUtility.isToday(DAY_XMAS); + } + + @Deprecated + public static final Supplier FOOLS = GTValues::isAprilFools; + + @Deprecated + public static final Supplier XMAS = GTValues::isXMAS; } diff --git a/src/main/java/gregtech/api/capability/GregtechDataCodes.java b/src/main/java/gregtech/api/capability/GregtechDataCodes.java index ae106662690..24d0080c1e1 100644 --- a/src/main/java/gregtech/api/capability/GregtechDataCodes.java +++ b/src/main/java/gregtech/api/capability/GregtechDataCodes.java @@ -95,7 +95,6 @@ public static int assignId() { public static final int STORE_TAPED = assignId(); public static final int RECIPE_MAP_INDEX = assignId(); public static final int IS_FRONT_FACE_FREE = assignId(); - public static final int MAINTENANCE_MULTIPLIER = assignId(); public static final int UPDATE_UPWARDS_FACING = assignId(); public static final int UPDATE_FLIP = assignId(); public static final int LOCK_FILL = assignId(); diff --git a/src/main/java/gregtech/api/capability/IMaintenanceHatch.java b/src/main/java/gregtech/api/capability/IMaintenanceHatch.java index 07c148bb3ab..5fd40324c1c 100644 --- a/src/main/java/gregtech/api/capability/IMaintenanceHatch.java +++ b/src/main/java/gregtech/api/capability/IMaintenanceHatch.java @@ -37,9 +37,13 @@ public interface IMaintenanceHatch { */ Tuple readMaintenanceData(); - double getDurationMultiplier(); + default double getDurationMultiplier() { + return 1.0d; + } - double getTimeMultiplier(); + default double getTimeMultiplier() { + return 1.0d; + } boolean startWithoutProblems(); } diff --git a/src/main/java/gregtech/api/capability/impl/FilteredItemHandler.java b/src/main/java/gregtech/api/capability/impl/FilteredItemHandler.java index 63e3131365e..09975fbebb5 100644 --- a/src/main/java/gregtech/api/capability/impl/FilteredItemHandler.java +++ b/src/main/java/gregtech/api/capability/impl/FilteredItemHandler.java @@ -27,6 +27,11 @@ public FilteredItemHandler(MetaTileEntity metaTileEntity, int size) { super(metaTileEntity, size); } + public FilteredItemHandler(MetaTileEntity metaTileEntity, int size, Predicate fillPredicate) { + super(metaTileEntity, size); + this.fillPredicate = fillPredicate; + } + public FilteredItemHandler(MetaTileEntity metaTileEntity, NonNullList stacks) { super(metaTileEntity, stacks); } @@ -36,6 +41,18 @@ public FilteredItemHandler setFillPredicate(Predicate fillPredicate) return this; } + @Override + public @NotNull ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) { + if (!isItemValid(slot, stack)) return stack; + return super.insertItem(slot, stack, simulate); + } + + @Override + public void setStackInSlot(int slot, @NotNull ItemStack stack) { + if (!isItemValid(slot, stack)) return; + super.setStackInSlot(slot, stack); + } + @Override public boolean isItemValid(int slot, @NotNull ItemStack stack) { return fillPredicate == null || fillPredicate.test(stack); diff --git a/src/main/java/gregtech/api/cover/CoverWithUI.java b/src/main/java/gregtech/api/cover/CoverWithUI.java index 4cf44149d9f..a6090942295 100644 --- a/src/main/java/gregtech/api/cover/CoverWithUI.java +++ b/src/main/java/gregtech/api/cover/CoverWithUI.java @@ -22,8 +22,6 @@ import com.cleanroommc.modularui.screen.ModularScreen; import com.cleanroommc.modularui.screen.UISettings; import com.cleanroommc.modularui.utils.Alignment; -import com.cleanroommc.modularui.utils.Color; -import com.cleanroommc.modularui.utils.MouseData; import com.cleanroommc.modularui.value.BoolValue; import com.cleanroommc.modularui.value.sync.EnumSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; @@ -148,32 +146,6 @@ default IKey createEnabledKey(@NotNull String keyBase, @NotNull BooleanSupplier return IKey.lang(() -> enabledState.getAsBoolean() ? enabled : disabled); } - default int getIncrementValue(MouseData data) { - int adjust = 1; - if (data.shift) adjust *= 4; - if (data.ctrl) adjust *= 16; - if (data.alt) adjust *= 64; - return adjust; - } - - default IKey createAdjustOverlay(boolean increment) { - final StringBuilder builder = new StringBuilder(); - builder.append(increment ? '+' : '-'); - builder.append(getIncrementValue(MouseData.create(-1))); - - float scale = 1f; - if (builder.length() == 3) { - scale = 0.8f; - } else if (builder.length() == 4) { - scale = 0.6f; - } else if (builder.length() > 4) { - scale = 0.5f; - } - return IKey.str(builder.toString()) - .color(Color.WHITE.main) - .scale(scale); - } - /** * Get a BoolValue for use with toggle buttons which are "linked together," * meaning only one of them can be pressed at a time. diff --git a/src/main/java/gregtech/api/items/itemhandlers/GTItemStackHandler.java b/src/main/java/gregtech/api/items/itemhandlers/GTItemStackHandler.java index 91c5a6f2853..7568a8b983f 100644 --- a/src/main/java/gregtech/api/items/itemhandlers/GTItemStackHandler.java +++ b/src/main/java/gregtech/api/items/itemhandlers/GTItemStackHandler.java @@ -6,6 +6,8 @@ import net.minecraft.util.NonNullList; import net.minecraftforge.items.ItemStackHandler; +import org.jetbrains.annotations.NotNull; + public class GTItemStackHandler extends ItemStackHandler { final private MetaTileEntity metaTileEntity; @@ -26,7 +28,7 @@ public GTItemStackHandler(MetaTileEntity metaTileEntity, NonNullList } @Override - public void setStackInSlot(int slot, ItemStack stack) { + public void setStackInSlot(int slot, @NotNull ItemStack stack) { if (ItemStack.areItemStacksEqual(stack, getStackInSlot(slot))) return; diff --git a/src/main/java/gregtech/api/items/toolitem/ItemGTToolbelt.java b/src/main/java/gregtech/api/items/toolitem/ItemGTToolbelt.java index b8fd6434292..f1075b30638 100644 --- a/src/main/java/gregtech/api/items/toolitem/ItemGTToolbelt.java +++ b/src/main/java/gregtech/api/items/toolitem/ItemGTToolbelt.java @@ -4,12 +4,12 @@ import gregtech.api.items.IDyeableItem; import gregtech.api.items.gui.ItemUIFactory; import gregtech.api.items.toolitem.behavior.IToolBehavior; -import gregtech.api.metatileentity.MetaTileEntityHolder; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; import gregtech.api.unification.material.Material; import gregtech.api.unification.material.properties.PropertyKey; import gregtech.api.unification.material.properties.ToolProperty; +import gregtech.api.util.GTUtility; import gregtech.api.util.LocalizationUtils; import gregtech.api.util.TextFormattingUtil; import gregtech.client.utils.TooltipHelper; @@ -59,6 +59,7 @@ import com.cleanroommc.modularui.widgets.slot.SlotGroup; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Multimap; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; @@ -70,6 +71,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.function.Consumer; import java.util.function.IntSupplier; import java.util.function.Supplier; @@ -106,6 +108,19 @@ public ItemStack getToolInSlot(@NotNull ItemStack toolbelt, int slot) { return handler.getStackInSlot(slot); } + /** + * Iterate over non-empty slots of the given toolbelt. + */ + public void iterateSlots(@NotNull ItemStack toolBelt, @NotNull Consumer<@NotNull ItemStack> stackConsumer) { + ToolStackHandler handler = getHandler(toolBelt); + if (handler == FALLBACK) return; + for (int index = 0; index < handler.getSlots(); index++) { + ItemStack stack = handler.getStackInSlot(index); + if (stack.isEmpty()) continue; + stackConsumer.accept(stack); + } + } + @Override public ModularPanel buildUI(HandGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { final var usedStack = guiData.getUsedItemStack(); @@ -406,11 +421,6 @@ public void setOnCraftIngredient(ItemStack stack, Ingredient ingredient) { } } - public boolean damageAgainstMaintenanceProblem(ItemStack stack, String toolClass, - @Nullable EntityPlayer entityPlayer) { - return getHandler(stack).checkMaintenanceAgainstTools(toolClass, true, entityPlayer); - } - public boolean supportsIngredient(ItemStack stack, Ingredient ingredient) { return getHandler(stack).checkIngredientAgainstTools(ingredient) != -1; } @@ -478,12 +488,13 @@ public void setSelectedTool(int slot, ItemStack stack) { float hitY, float hitZ, @NotNull EnumHand hand) { EnumActionResult result = IDyeableItem.super.onItemUseFirst(player, world, pos, side, hitX, hitY, hitZ, hand); if (result == EnumActionResult.PASS) { - ItemStack stack = player.getHeldItem(hand); - ToolStackHandler handler = getHandler(stack); - if (handler.getSelectedStack().isEmpty() && - world.getTileEntity(pos) instanceof MetaTileEntityHolder holder && - holder.getMetaTileEntity() instanceof MetaTileEntityMaintenanceHatch maintenance) { - maintenance.fixMaintenanceProblemsWithToolbelt(player, this, stack); + ItemStack toolbeltStack = player.getHeldItem(hand); + ToolStackHandler handler = getHandler(toolbeltStack); + if (handler.getSelectedStack().isEmpty() && GTUtility.getMetaTileEntity(world, + pos) instanceof MetaTileEntityMaintenanceHatch maintenanceHatch) { + List tools = new ObjectArrayList<>(); + iterateSlots(toolbeltStack, tools::add); + maintenanceHatch.fixMaintenanceProblemsWithTools(player, tools); return EnumActionResult.SUCCESS; } return super.onItemUseFirst(player, world, pos, side, hitX, hitY, hitZ, hand); @@ -739,18 +750,6 @@ protected void update() { } } - public boolean checkMaintenanceAgainstTools(String toolClass, boolean doCraftingDamage, - @Nullable EntityPlayer entityPlayer) { - for (int i = 0; i < this.getSlots(); i++) { - ItemStack stack = this.getStackInSlot(i); - if (ToolHelper.isTool(stack, toolClass)) { - if (doCraftingDamage) ToolHelper.damageItemWhenCrafting(stack, entityPlayer); - return true; - } - } - return false; - } - public int checkIngredientAgainstTools(Ingredient ingredient) { for (int i = 0; i < this.getSlots(); i++) { ItemStack stack = this.getStackInSlot(i); diff --git a/src/main/java/gregtech/api/items/toolitem/ToolHelper.java b/src/main/java/gregtech/api/items/toolitem/ToolHelper.java index f696c1684e4..313762cd59b 100644 --- a/src/main/java/gregtech/api/items/toolitem/ToolHelper.java +++ b/src/main/java/gregtech/api/items/toolitem/ToolHelper.java @@ -374,7 +374,7 @@ public static void onActionDone(@NotNull EntityPlayer player, @NotNull World wor /** * @return if any of the specified tool classes exists in the tool */ - public static boolean isTool(ItemStack tool, String... toolClasses) { + public static boolean isTool(@NotNull ItemStack tool, @Nullable String @NotNull... toolClasses) { if (toolClasses.length == 1) { return tool.getItem().getToolClasses(tool).contains(toolClasses[0]); } diff --git a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java index e3ca9cab534..cef73e25a47 100644 --- a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java @@ -24,8 +24,7 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.interfaces.ISyncedTileEntity; import gregtech.api.metatileentity.registry.MTERegistry; -import gregtech.api.mui.GTGuiTheme; -import gregtech.api.mui.GregTechGuiScreen; +import gregtech.api.mui.IMetaTileEntityGuiHolder; import gregtech.api.mui.factory.MetaTileEntityGuiFactory; import gregtech.api.recipes.RecipeMap; import gregtech.api.util.GTLog; @@ -90,12 +89,6 @@ import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; -import com.cleanroommc.modularui.api.IGuiHolder; -import com.cleanroommc.modularui.factory.PosGuiData; -import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.screen.ModularScreen; -import com.cleanroommc.modularui.screen.UISettings; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.google.common.base.Preconditions; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; @@ -103,7 +96,6 @@ import it.unimi.dsi.fastutil.objects.ObjectArraySet; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.tuple.Pair; -import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -119,7 +111,14 @@ import static gregtech.api.capability.GregtechDataCodes.*; -public abstract class MetaTileEntity implements ISyncedTileEntity, CoverHolder, IVoidable, IGuiHolder { +/** + * For addon developers:
+ * Legacy GregTech MUI UIs are being deprecated. GUIs are now done through + * Modular UI. To use the new MUI UIs, implement + * {@link IMetaTileEntityGuiHolder} on your MetaTileEntity class. Opening the UI on right clicks is handled + * automatically. + */ +public abstract class MetaTileEntity implements ISyncedTileEntity, CoverHolder, IVoidable { public static final IndexedCuboid6 FULL_CUBE_COLLISION = new IndexedCuboid6(null, Cuboid6.full); @@ -458,6 +457,11 @@ protected FluidTankList createExportFluidHandler() { return new FluidTankList(false); } + /** + * @return if this MetaTileEntity should open a legacy MUI UI when right-clicked.
+ * Do not override if you're implementing {@link IMetaTileEntityGuiHolder}! + */ + @Deprecated protected boolean openGUIOnRightClick() { return true; } @@ -478,26 +482,6 @@ public ModularUI getModularUI(EntityPlayer entityPlayer) { return createUI(entityPlayer); } - @ApiStatus.Experimental - public boolean usesMui2() { - return false; - } - - @SideOnly(Side.CLIENT) - @Override - public final ModularScreen createScreen(PosGuiData posGuiData, ModularPanel mainPanel) { - return new GregTechGuiScreen(mainPanel, getUITheme()); - } - - public GTGuiTheme getUITheme() { - return GTGuiTheme.STANDARD; - } - - @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager, UISettings settings) { - return null; - } - public final void onCoverLeftClick(EntityPlayer playerIn, CuboidRayTraceResult result) { Cover cover = getCoverAtSide(result.sideHit); if (cover == null || !cover.onLeftClick(playerIn, result)) { @@ -512,6 +496,9 @@ public final void onCoverLeftClick(EntityPlayer playerIn, CuboidRayTraceResult r */ public boolean onRightClick(EntityPlayer playerIn, EnumHand hand, EnumFacing facing, CuboidRayTraceResult hitResult) { + World world = getWorld(); + if (world == null) return false; + ItemStack heldStack = playerIn.getHeldItem(hand); if (this instanceof IDataStickIntractable dsi) { if (MetaItems.TOOL_DATA_STICK.isItemEqual(heldStack) && dsi.onDataStickRightClick(playerIn, heldStack)) { @@ -519,51 +506,61 @@ public boolean onRightClick(EntityPlayer playerIn, EnumHand hand, EnumFacing fac } } - if (!playerIn.isSneaking() && openGUIOnRightClick()) { - if (getWorld() != null && !getWorld().isRemote) { - if (usesMui2()) { - MetaTileEntityGuiFactory.open(playerIn, this); - } else { - MetaTileEntityUIFactory.INSTANCE.openUI(getHolder(), (EntityPlayerMP) playerIn); - } + if (!playerIn.isSneaking()) { + if (this instanceof IMetaTileEntityGuiHolder guiHolder) { + if (guiHolder.shouldOpenUI()) { + if (!world.isRemote) { + MetaTileEntityGuiFactory.open((EntityPlayerMP) playerIn, + (MetaTileEntity & IMetaTileEntityGuiHolder) this); + if (!hasOwner()) { + setOwner(playerIn); + } + } - if (getOwner() == null) { - this.owner = playerIn.getUniqueID(); + return true; } - } - return true; - } else { - // Attempt to rename the MTE first - if (heldStack.getItem() == Items.NAME_TAG) { - if (playerIn.isSneaking() && heldStack.getTagCompound() != null && - heldStack.getTagCompound().hasKey("display")) { - MetaTileEntityHolder mteHolder = (MetaTileEntityHolder) getHolder(); - - mteHolder.setCustomName(heldStack.getTagCompound().getCompoundTag("display").getString("Name")); - if (!playerIn.isCreative()) { - heldStack.shrink(1); + } else if (openGUIOnRightClick()) { + if (!world.isRemote) { + MetaTileEntityUIFactory.INSTANCE.openUI(getHolder(), (EntityPlayerMP) playerIn); + if (!hasOwner()) { + setOwner(playerIn); } - return true; } + + return true; } + } - // Try to do cover right-click behavior on this specific side first - EnumFacing hitFacing = hitResult.sideHit; - Cover cover = hitFacing == null ? null : getCoverAtSide(hitFacing); - if (cover != null) { - if (cover.onRightClick(playerIn, hand, hitResult) == EnumActionResult.SUCCESS) { - return true; + // Attempt to rename the MTE first + if (heldStack.getItem() == Items.NAME_TAG) { + if (playerIn.isSneaking() && heldStack.getTagCompound() != null && + heldStack.getTagCompound().hasKey("display")) { + MetaTileEntityHolder mteHolder = (MetaTileEntityHolder) getHolder(); + + mteHolder.setCustomName(heldStack.getTagCompound().getCompoundTag("display").getString("Name")); + if (!playerIn.isCreative()) { + heldStack.shrink(1); } + return true; } + } - // Then try to do cover screwdriver-click behavior on the cover grid side next - EnumFacing gridSideHit = CoverRayTracer.determineGridSideHit(hitResult); - cover = gridSideHit == null ? null : getCoverAtSide(gridSideHit); - if (cover != null && playerIn.isSneaking() && playerIn.getHeldItemMainhand().isEmpty()) { - return cover.onScrewdriverClick(playerIn, hand, hitResult) == EnumActionResult.SUCCESS; + // Try to do cover right-click behavior on this specific side first + EnumFacing hitFacing = hitResult.sideHit; + Cover cover = hitFacing == null ? null : getCoverAtSide(hitFacing); + if (cover != null) { + if (cover.onRightClick(playerIn, hand, hitResult) == EnumActionResult.SUCCESS) { + return true; } } + // Then try to do cover screwdriver-click behavior on the cover grid side next + EnumFacing gridSideHit = CoverRayTracer.determineGridSideHit(hitResult); + cover = gridSideHit == null ? null : getCoverAtSide(gridSideHit); + if (cover != null && playerIn.isSneaking() && playerIn.getHeldItemMainhand().isEmpty()) { + return cover.onScrewdriverClick(playerIn, hand, hitResult) == EnumActionResult.SUCCESS; + } + return false; } @@ -1440,7 +1437,7 @@ public void invalidate() { } @SideOnly(Side.CLIENT) - public SoundEvent getSound() { + public @Nullable SoundEvent getSound() { return null; } @@ -1524,11 +1521,23 @@ public boolean getWitherProof() { return false; } + public boolean hasOwner() { + return this.owner != null; + } + @Nullable public UUID getOwner() { return owner; } + protected void setOwner(@NotNull EntityPlayer player) { + this.owner = player.getUniqueID(); + } + + protected void setOwner(@Nullable UUID uuid) { + this.owner = uuid; + } + public final void toggleMuffled() { muffled = !muffled; if (!getWorld().isRemote) { diff --git a/src/main/java/gregtech/api/metatileentity/SimpleMachineMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/SimpleMachineMetaTileEntity.java index 5ecd01baa1a..63851c3cb2e 100644 --- a/src/main/java/gregtech/api/metatileentity/SimpleMachineMetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/SimpleMachineMetaTileEntity.java @@ -516,7 +516,7 @@ protected ModularUI.Builder createGuiTemplate(EntityPlayer player) { if (exportItems.getSlots() + exportFluids.getTanks() <= 9) { ImageWidget logo = new ImageWidget(152, 63 + yOffset, 17, 17, - GTValues.XMAS.get() ? getXmasLogo() : getLogo()).setIgnoreColor(true); + GTValues.isXMAS() ? getXmasLogo() : getLogo()).setIgnoreColor(true); if (this.circuitInventory != null) { SlotWidget circuitSlot = new GhostCircuitSlotWidget(circuitInventory, 0, 124, 62 + yOffset) diff --git a/src/main/java/gregtech/api/metatileentity/SteamMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/SteamMetaTileEntity.java index ed904815d2d..c1a5989fe07 100644 --- a/src/main/java/gregtech/api/metatileentity/SteamMetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/SteamMetaTileEntity.java @@ -136,7 +136,7 @@ public ModularUI.Builder createUITemplate(EntityPlayer player) { } @Override - public SoundEvent getSound() { + public @Nullable SoundEvent getSound() { return Objects.requireNonNull(workableHandler.getRecipeMap()).getSound(); } diff --git a/src/main/java/gregtech/api/metatileentity/WorkableTieredMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/WorkableTieredMetaTileEntity.java index 88651b9e9cc..e2a34c2e835 100644 --- a/src/main/java/gregtech/api/metatileentity/WorkableTieredMetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/WorkableTieredMetaTileEntity.java @@ -158,7 +158,7 @@ public boolean isActive() { } @Override - public SoundEvent getSound() { + public @Nullable SoundEvent getSound() { return workable.getRecipeMap().getSound(); } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/IMaintenance.java b/src/main/java/gregtech/api/metatileentity/multiblock/IMaintenance.java index ecebabcc712..47a3d5f7514 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/IMaintenance.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/IMaintenance.java @@ -1,23 +1,132 @@ package gregtech.api.metatileentity.multiblock; +import gregtech.api.GTValues; +import gregtech.api.items.toolitem.ToolClasses; +import gregtech.common.ConfigHolder; + import net.minecraft.init.SoundEvents; import net.minecraft.util.SoundEvent; +import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMaps; +import it.unimi.dsi.fastutil.objects.ObjectArraySet; +import org.jetbrains.annotations.UnmodifiableView; + +import java.util.Collections; +import java.util.Set; + public interface IMaintenance { + /** + * Mapping between maintenance byte indexes and the tool class used to fix the issue. + */ + @UnmodifiableView + Int2ObjectMap maintenance2tool = Int2ObjectMaps.unmodifiable(new Int2ObjectArrayMap<>( + new int[] { 0, 1, 2, 3, 4, 5 }, + new String[] { ToolClasses.WRENCH, + ToolClasses.SCREWDRIVER, + ToolClasses.SOFT_MALLET, + ToolClasses.HARD_HAMMER, + ToolClasses.WIRE_CUTTER, + ToolClasses.CROWBAR })); + + /** + * How many unique problems are possible.
+ * When calculating maintenance values, bit indices higher than {@code POSSIBLE_PROBLEMS - 1} are ignored. + */ + int POSSIBLE_PROBLEMS = maintenance2tool.size(); + + /** + * Represents a maintenance byte where there are no problems, ie {@code 0b111111}. + */ + byte NO_PROBLEMS = (byte) ((1 << POSSIBLE_PROBLEMS) - 1); + + default Set> getToolsForMaintenance() { + byte problems = getMaintenanceProblems(); + if (problems == NO_PROBLEMS) return Collections.emptySet(); + + Set> entries = new ObjectArraySet<>(maintenance2tool.int2ObjectEntrySet()); + entries.removeIf(stringEntry -> ((problems >> stringEntry.getIntKey()) & 1) == 1); + + return entries; + } + + /** + * Get the current maintenance problems.
+ * Each problem type is a single bit in the returned byte:
+ * - {@code 0}: maintenance needed
+ * - {@code 1}: no maintenance needed
+ * See {@link #maintenance2tool} for the mapping between bit index and tool class. + */ byte getMaintenanceProblems(); - int getNumMaintenanceProblems(); + /** + * Set the maintenance problems of this to the given byte. + */ + void setMaintenance(byte maintenance); + + /** + * @return how many unique maintenance problems this has. + */ + default int getNumMaintenanceProblems() { + if (!hasMaintenanceMechanics()) return 0; + return POSSIBLE_PROBLEMS - Integer.bitCount(getMaintenanceProblems()); + } + + /** + * @return if this has any maintenance problems. + */ + default boolean hasMaintenanceProblems() { + if (!hasMaintenanceMechanics()) return false; + return getMaintenanceProblems() < NO_PROBLEMS; + } - boolean hasMaintenanceProblems(); + /** + * Set a certain problem as fixed or unfixed. + */ + default void setMaintenanceAt(int index, boolean fixed) { + if (index >= POSSIBLE_PROBLEMS) return; - void setMaintenanceFixed(int index); + byte maintenance = getMaintenanceProblems(); + if (fixed) { + maintenance |= (byte) (1 << index); + } else { + maintenance &= (byte) ~(1 << index); + } - void causeMaintenanceProblems(); + setMaintenance(maintenance); + } + + /** + * Set a certain problem as fixed. + */ + default void setMaintenanceFixed(int index) { + setMaintenanceAt(index, true); + } + + /** + * Fix every maintenance problem this has. + */ + default void fixAllMaintenance() { + setMaintenance(NO_PROBLEMS); + } + + /** + * Cause a random maintenance problem to need fixing. + */ + default void causeMaintenanceProblems() { + setMaintenanceAt(GTValues.RNG.nextInt(POSSIBLE_PROBLEMS), false); + } void storeTaped(boolean isTaped); - boolean hasMaintenanceMechanics(); + /** + * If overridden, it is recommended that you only ever return false as to not conflict with the maintenance config. + */ + default boolean hasMaintenanceMechanics() { + return ConfigHolder.machines.enableMaintenance; + } default SoundEvent getBreakdownSound() { return SoundEvents.ENTITY_ITEM_BREAK; diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java index 165e2ca69df..67a39f643ec 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java @@ -5,6 +5,8 @@ import gregtech.api.capability.*; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.api.pattern.PatternMatchContext; import gregtech.api.pattern.TraceabilityPredicate; import gregtech.api.unification.OreDictUnifier; @@ -23,7 +25,6 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.screen.UISettings; import com.cleanroommc.modularui.value.sync.PanelSyncManager; @@ -34,7 +35,8 @@ import static gregtech.api.capability.GregtechDataCodes.IS_WORKING; import static gregtech.api.capability.GregtechDataCodes.STORE_TAPED; -public abstract class MultiblockWithDisplayBase extends MultiblockControllerBase implements IMaintenance { +public abstract class MultiblockWithDisplayBase extends MultiblockControllerBase implements IMaintenance, + IMetaTileEntityGuiHolder { private static final String NBT_VOIDING_MODE = "VoidingMode"; private static final String NBT_VOIDING_ITEMS = "VoidingItems"; @@ -81,57 +83,21 @@ public MultiblockWithDisplayBase(ResourceLocation metaTileEntityId) { this.voidingMode = VoidingMode.VOID_NONE; } - /** - * Sets the maintenance problem corresponding to index to fixed - * - * @param index of the maintenance problem - */ - @Override - public void setMaintenanceFixed(int index) { - this.maintenance_problems |= 1 << index; - } - - /** - * Used to cause a single random maintenance problem - */ - @Override - public void causeMaintenanceProblems() { - this.maintenance_problems &= ~(1 << ((int) (GTValues.RNG.nextFloat() * 5))); - this.getWorld().playSound(null, this.getPos().getX(), this.getPos().getY(), this.getPos().getZ(), - this.getBreakdownSound(), SoundCategory.BLOCKS, 1.f, 1.f); - } - - /** - * @return the byte value representing the maintenance problems - */ @Override public byte getMaintenanceProblems() { - return ConfigHolder.machines.enableMaintenance && hasMaintenanceMechanics() ? maintenance_problems : 0b111111; + return hasMaintenanceMechanics() ? maintenance_problems : IMaintenance.NO_PROBLEMS; } - /** - * @return the amount of maintenance problems the multiblock has - */ - @Override - public int getNumMaintenanceProblems() { - return ConfigHolder.machines.enableMaintenance && hasMaintenanceMechanics() ? - 6 - Integer.bitCount(maintenance_problems) : 0; - } - - /** - * @return whether the multiblock has any maintenance problems - */ @Override - public boolean hasMaintenanceProblems() { - return ConfigHolder.machines.enableMaintenance && hasMaintenanceMechanics() && this.maintenance_problems < 63; + public void setMaintenance(byte maintenance) { + this.maintenance_problems = maintenance; } - /** - * @return whether this multiblock has maintenance mechanics - */ @Override - public boolean hasMaintenanceMechanics() { - return true; + public void causeMaintenanceProblems() { + IMaintenance.super.causeMaintenanceProblems(); + this.getWorld().playSound(null, this.getPos().getX(), this.getPos().getY(), this.getPos().getZ(), + this.getBreakdownSound(), SoundCategory.BLOCKS, 1.f, 1.f); } public boolean hasMufflerMechanics() { @@ -367,11 +333,6 @@ public final void setVoidingMode(int mode) { return VoidingMode.VALUES[mode].getName(); } - @Override - public boolean usesMui2() { - return true; - } - protected void configureDisplayText(MultiblockUIBuilder builder) {} protected void configureErrorText(MultiblockUIBuilder builder) { @@ -395,7 +356,8 @@ protected MultiblockUIFactory createUIFactory() { } @Override - public final ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager, UISettings settings) { + public final @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager panelSyncManager, + UISettings settings) { if (uiFactory == null) uiFactory = createUIFactory(); return this.uiFactory.buildUI(guiData, panelSyncManager); } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java index cebe13bc959..f6b2cf93471 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java @@ -287,7 +287,7 @@ public void setDistinct(boolean isDistinct) { } @Override - public SoundEvent getSound() { + public @Nullable SoundEvent getSound() { return recipeMap.getSound(); } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapPrimitiveMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapPrimitiveMultiblockController.java index da874e0bdb8..20eb555fa89 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapPrimitiveMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapPrimitiveMultiblockController.java @@ -17,6 +17,8 @@ import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.items.CapabilityItemHandler; +import org.jetbrains.annotations.Nullable; + import java.util.ArrayList; import java.util.List; @@ -84,7 +86,7 @@ protected boolean shouldUpdate(MTETrait trait) { } @Override - public SoundEvent getSound() { + public @Nullable SoundEvent getSound() { return recipeMapWorkable.getRecipeMap().getSound(); } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java index dd7c0b5f039..1c3c3e8d548 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java @@ -26,6 +26,7 @@ import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IKey; +import org.jetbrains.annotations.Nullable; public abstract class RecipeMapSteamMultiblockController extends MultiblockWithDisplayBase implements IControllable { @@ -173,7 +174,7 @@ public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, } @Override - public SoundEvent getSound() { + public @Nullable SoundEvent getSound() { return recipeMap.getSound(); } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index e4f0bc5acf8..b1c68737ad9 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -5,21 +5,20 @@ import gregtech.api.capability.impl.AbstractRecipeLogic; import gregtech.api.capability.impl.ComputationRecipeLogic; import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.multiblock.IMaintenance; import gregtech.api.mui.GTByteBufAdapters; import gregtech.api.mui.drawable.GTObjectDrawable; import gregtech.api.recipes.Recipe; import gregtech.api.recipes.RecipeMap; import gregtech.api.recipes.chance.output.impl.ChancedFluidOutput; import gregtech.api.recipes.chance.output.impl.ChancedItemOutput; -import gregtech.api.unification.material.Materials; import gregtech.api.util.GTHashMaps; import gregtech.api.util.GTUtility; import gregtech.api.util.KeyUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.api.util.function.ByteSupplier; import gregtech.api.util.function.FloatSupplier; -import gregtech.common.ConfigHolder; -import gregtech.common.items.ToolItems; +import gregtech.client.utils.TooltipHelper; import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; @@ -29,7 +28,6 @@ import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; -import com.cleanroommc.modularui.drawable.ItemDrawable; import com.cleanroommc.modularui.utils.serialization.ByteBufAdapters; import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; import com.cleanroommc.modularui.utils.serialization.IByteBufSerializer; @@ -457,81 +455,23 @@ public MultiblockUIBuilder addLowDynamoTierLine(boolean isTooLow) { } /** - * Adds warning line(s) when the machine has maintenance problems. - *
- * Added if there are any maintenance problems, one line per problem as well as a header.
- * Will check the config - * setting for if maintenance is enabled automatically. + * Adds warning line(s) when the machine has maintenance problems.
+ * Added if there are any maintenance problems, one line per problem as well as a header. + * + * @param maintenanceProblems the maintenance problems to show + * @param warning if {@code true}, will only add lines if there are between {@code 1} and one less than + * {@link IMaintenance#POSSIBLE_PROBLEMS} problems. If {@code false}, lines will only be + * added when there are exactly {@link IMaintenance#POSSIBLE_PROBLEMS} problems. */ public MultiblockUIBuilder addMaintenanceProblemLines(byte maintenanceProblems, boolean warning) { - if (!isStructureFormed || !ConfigHolder.machines.enableMaintenance) return this; - maintenanceProblems = getSyncer().syncByte(maintenanceProblems); - - if (warning && maintenanceProblems < 0b111111 && maintenanceProblems > 0b000000 || - !warning && maintenanceProblems == 0b000000) { - addKey(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.universal.has_problems")); - - // Wrench - if ((maintenanceProblems & 1) == 0) { - addOperation(richText -> richText - .add(new ItemDrawable(ToolItems.WRENCH.get(Materials.Iron))) - .add(IKey.SPACE) - .add(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.universal.problem.wrench")) - .newLine()); - } - - // Screwdriver - if (((maintenanceProblems >> 1) & 1) == 0) { - addOperation(richText -> richText - .add(new ItemDrawable(ToolItems.SCREWDRIVER.get(Materials.Iron))) - .add(IKey.SPACE) - .add(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.universal.problem.screwdriver")) - .newLine()); - } - - // Soft Mallet - if (((maintenanceProblems >> 2) & 1) == 0) { - addOperation(richText -> richText - .add(new ItemDrawable(ToolItems.SOFT_MALLET.get(Materials.Wood))) - .add(IKey.SPACE) - .add(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.universal.problem.soft_mallet")) - .newLine()); - } + if (!isStructureFormed) return this; + final byte finalProblems = getSyncer().syncByte(maintenanceProblems); - // Hammer - if (((maintenanceProblems >> 3) & 1) == 0) { - addOperation(richText -> richText - .add(new ItemDrawable(ToolItems.HARD_HAMMER.get(Materials.Iron))) - .add(IKey.SPACE) - .add(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.universal.problem.hard_hammer")) - .newLine()); - } + if (finalProblems >= IMaintenance.NO_PROBLEMS) return this; + if (!warning && finalProblems > 0) return this; + if (warning && finalProblems == 0) return this; - // Wire Cutters - if (((maintenanceProblems >> 4) & 1) == 0) { - addOperation(richText -> richText - .add(new ItemDrawable(ToolItems.WIRE_CUTTER.get(Materials.Iron))) - .add(IKey.SPACE) - .add(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.universal.problem.wire_cutter")) - .newLine()); - } - - // Crowbar - if (((maintenanceProblems >> 5) & 1) == 0) { - addOperation(richText -> richText - .add(new ItemDrawable(ToolItems.CROWBAR.get(Materials.Iron))) - .add(IKey.SPACE) - .add(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.universal.problem.crowbar")) - .newLine()); - } - } + addOperation(richText -> TooltipHelper.addMaintenanceProblems(richText, finalProblems)); return this; } @@ -927,7 +867,7 @@ public double syncDouble(@NotNull DoubleSupplier initial) { @Override public float syncFloat(@NotNull FloatSupplier initial) { if (isServer()) { - float val = initial.getFloat(); + float val = initial.getAsFloat(); internal.writeFloat(val); return val; } else { diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index bdd21a36b27..4b334dc4dcb 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -6,6 +6,7 @@ import gregtech.api.metatileentity.multiblock.ProgressBarMultiblock; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.api.util.GTLambdaUtils; import gregtech.api.util.KeyUtil; import gregtech.common.mui.widget.ScrollableTextWidget; @@ -232,9 +233,8 @@ public MultiblockUIFactory addScreenChildren(ScreenFunction function) { * Constructs the multiblock ui panel
* It is not recommended to override this method */ - public @NotNull ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager panelSyncManager) { var panel = GTGuis.createPanel(mte, width, height) - .debugName("root_panel") .childIf(!disableDisplay, () -> createScreen(panelSyncManager)); // TODO createExtras() hook for overrides? diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index 80baa6244bf..8fcd55d6d28 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -724,6 +724,9 @@ private static String id(String path) { "textures/gui/progress_bar/progress_bar_fluid_rig_depletion.png", 190, 14); // MISC + public static final UITexture SPEAKER_ICON = fullImage("textures/gui/widget/speaker.png"); + public static final UITexture MAINTENANCE_ICON = fullImage("textures/gui/widget/button_maintenance.png", + ColorType.DEFAULT); public static void init() {/**/} @@ -802,12 +805,12 @@ private static UITexture progressBar(String path, int width, int height, @Nullab } // todo steam logos? multi indicator blinking logos? - public static @NotNull UITexture getLogo(GTGuiTheme theme) { + public static @NotNull UITexture getLogo(@Nullable GTGuiTheme theme) { if (theme != null) { UITexture logo = theme.getLogo(); if (logo != null) return logo; } - return GTValues.XMAS.get() ? GREGTECH_LOGO_XMAS : GREGTECH_LOGO; + return GTValues.isXMAS() ? GREGTECH_LOGO_XMAS : GREGTECH_LOGO; } public static IDrawable dynamic(UITexture[] textures, int rate) { diff --git a/src/main/java/gregtech/api/mui/IMetaTileEntityGuiHolder.java b/src/main/java/gregtech/api/mui/IMetaTileEntityGuiHolder.java new file mode 100644 index 00000000000..477bd36f8e1 --- /dev/null +++ b/src/main/java/gregtech/api/mui/IMetaTileEntityGuiHolder.java @@ -0,0 +1,88 @@ +package gregtech.api.mui; + +// mte imports are for the javadoc, will be removed as stuff is ported +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.SimpleGeneratorMetaTileEntity; +import gregtech.api.metatileentity.SimpleMachineMetaTileEntity; +import gregtech.common.metatileentities.MetaTileEntityClipboard; +import gregtech.common.metatileentities.electric.MetaTileEntityPump; +import gregtech.common.metatileentities.multi.electric.centralmonitor.MetaTileEntityCentralMonitor; +import gregtech.common.metatileentities.multi.electric.centralmonitor.MetaTileEntityMonitorScreen; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.MetaTileEntityMEInputBus; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.MetaTileEntityMEInputHatch; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.MetaTileEntityMEOutputBus; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.MetaTileEntityMEOutputHatch; + +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import com.cleanroommc.modularui.api.IGuiHolder; +import com.cleanroommc.modularui.api.value.IStringValue; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.ModularScreen; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.value.sync.InteractionSyncHandler; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.SyncHandler; +import com.cleanroommc.modularui.widgets.ButtonWidget; +import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +/** + * TODO: these classes still use legacy MUI. Implement this on them and port to MUI(2):
+ * - {@link SimpleGeneratorMetaTileEntity} - PR 2808
+ * - {@link SimpleMachineMetaTileEntity} - PR 2808
+ * - {@link MetaTileEntityClipboard}
+ * - {@link MetaTileEntityPump}
+ * - {@link MetaTileEntityCentralMonitor}
+ * - {@link MetaTileEntityMonitorScreen}
+ * - {@link MetaTileEntityMEInputBus} - PR 2824
+ * - {@link MetaTileEntityMEInputHatch} - PR 2824
+ * - {@link MetaTileEntityMEOutputBus} - PR 2824
+ * - {@link MetaTileEntityMEOutputHatch} - PR 2824
+ * - All steam machines - PR 2808
+ */ +public interface IMetaTileEntityGuiHolder extends IGuiHolder { + + @ApiStatus.NonExtendable + @SideOnly(Side.CLIENT) + @NotNull + @Override + default ModularScreen createScreen(MetaTileEntityGuiData data, ModularPanel mainPanel) { + return new GregTechGuiScreen(mainPanel, getUITheme()); + } + + default GTGuiTheme getUITheme() { + return GTGuiTheme.STANDARD; + } + + /** + * @return whether this {@link MetaTileEntity} should open its UI. + */ + default boolean shouldOpenUI() { + return true; + } + + /** + * Build and return a {@link ModularPanel} with widgets to display to the player. + * + * @param data Contains data about how the {@link MetaTileEntity} was opened, like the player, position of + * the MTE, and extra data from the server written in {@link #writeExtraGuiData(PacketBuffer)}. + * @param syncManager the sync manager for this panel. Is used to register extra {@link SyncHandler}s not used in + * methods that automatically register the sync handler like + * {@link ButtonWidget#syncHandler(InteractionSyncHandler)} or + * {@link TextFieldWidget#value(IStringValue)}. + * @param settings contains miscellaneous settings related to this UI. + */ + @NotNull + @Override + ModularPanel buildUI(MetaTileEntityGuiData data, PanelSyncManager syncManager, UISettings settings); + + /** + * Write extra data on the server that will be available on both sides before UI construction.
+ * Retrieve the data with {@link MetaTileEntityGuiData#getBuffer()}. + */ + default void writeExtraGuiData(@NotNull PacketBuffer buffer) {} +} diff --git a/src/main/java/gregtech/api/mui/MetaTileEntityGuiData.java b/src/main/java/gregtech/api/mui/MetaTileEntityGuiData.java new file mode 100644 index 00000000000..fe2a1b3e72a --- /dev/null +++ b/src/main/java/gregtech/api/mui/MetaTileEntityGuiData.java @@ -0,0 +1,50 @@ +package gregtech.api.mui; + +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; +import gregtech.api.mui.factory.MetaTileEntityGuiFactory; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.network.PacketBuffer; + +import com.cleanroommc.modularui.factory.PosGuiData; +import io.netty.buffer.Unpooled; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.UnknownNullability; + +public class MetaTileEntityGuiData extends PosGuiData { + + private final PacketBuffer buffer = new PacketBuffer(Unpooled.buffer()); + + public MetaTileEntityGuiData(@NotNull EntityPlayer player, int x, int y, int z) { + super(player, x, y, z); + } + + @UnknownNullability + public MetaTileEntity getMetaTileEntity() { + return getTileEntity() instanceof IGregTechTileEntity igtte ? igtte.getMetaTileEntity() : null; + } + + /** + * Directly get the stored {@link PacketBuffer}. Should not be used outside of + * {@link MetaTileEntityGuiFactory} as data should only be written in + * {@link IMetaTileEntityGuiHolder#writeExtraGuiData(PacketBuffer)}. + */ + @ApiStatus.Internal + @NotNull + public PacketBuffer getBufferInternal() { + return buffer; + } + + /** + * Get the byte buffer with data written server-side in + * {@link IMetaTileEntityGuiHolder#writeExtraGuiData(PacketBuffer)}.
+ * Important: this method returns a read only buffer! Writing to the buffer should only happen in + * {@link IMetaTileEntityGuiHolder#writeExtraGuiData(PacketBuffer)}. + */ + @NotNull + public PacketBuffer getBuffer() { + return new PacketBuffer(buffer.asReadOnly()); + } +} diff --git a/src/main/java/gregtech/api/mui/drawable/BatteryIndicatorDrawable.java b/src/main/java/gregtech/api/mui/drawable/BatteryIndicatorDrawable.java new file mode 100644 index 00000000000..4df0b35d1f2 --- /dev/null +++ b/src/main/java/gregtech/api/mui/drawable/BatteryIndicatorDrawable.java @@ -0,0 +1,43 @@ +package gregtech.api.mui.drawable; + +import gregtech.api.util.GTUtility; +import gregtech.api.util.function.FloatSupplier; +import gregtech.client.utils.RenderUtil; + +import net.minecraft.util.math.MathHelper; + +import com.cleanroommc.modularui.api.drawable.IDrawable; +import com.cleanroommc.modularui.screen.viewport.GuiContext; +import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.utils.Color; +import org.jetbrains.annotations.NotNull; + +public class BatteryIndicatorDrawable implements IDrawable { + + private static final int red = Color.withAlpha(Color.RED.main, 0.3f); + private static final int yellow = Color.withAlpha(Color.YELLOW.main, 0.3f); + private static final int green = Color.withAlpha(Color.GREEN.main, 0.4f); + + @NotNull + private final FloatSupplier chargeLevelProvider; + private final float lowCharge; + + public BatteryIndicatorDrawable(@NotNull FloatSupplier chargeLevelProvider, float lowCharge) { + this.chargeLevelProvider = chargeLevelProvider; + this.lowCharge = lowCharge; + } + + @Override + public void draw(GuiContext context, int x, int y, int width, int height, WidgetTheme widgetTheme) { + float charge = MathHelper.clamp(chargeLevelProvider.getAsFloat(), 0.0f, 1.0f); + float newHeight = height * charge; + int color; + if (charge < lowCharge) { + color = GTUtility.argbLerp(red, yellow, charge / lowCharge); + } else { + color = GTUtility.argbLerp(yellow, green, (charge - lowCharge) / (1.0f - lowCharge)); + } + + RenderUtil.renderRect(1, (height - newHeight) + 1, width - 2, newHeight - 2, 1.0f, color); + } +} diff --git a/src/main/java/gregtech/api/mui/factory/MetaTileEntityGuiFactory.java b/src/main/java/gregtech/api/mui/factory/MetaTileEntityGuiFactory.java index 0363476a987..5eb3adc567f 100644 --- a/src/main/java/gregtech/api/mui/factory/MetaTileEntityGuiFactory.java +++ b/src/main/java/gregtech/api/mui/factory/MetaTileEntityGuiFactory.java @@ -1,23 +1,22 @@ package gregtech.api.mui.factory; import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; +import gregtech.api.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.network.PacketBuffer; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import com.cleanroommc.modularui.api.IGuiHolder; import com.cleanroommc.modularui.factory.AbstractUIFactory; import com.cleanroommc.modularui.factory.GuiManager; -import com.cleanroommc.modularui.factory.PosGuiData; import org.jetbrains.annotations.NotNull; import java.util.Objects; -public class MetaTileEntityGuiFactory extends AbstractUIFactory { +public class MetaTileEntityGuiFactory extends AbstractUIFactory { public static final MetaTileEntityGuiFactory INSTANCE = new MetaTileEntityGuiFactory(); @@ -25,7 +24,7 @@ private MetaTileEntityGuiFactory() { super("gregtech:mte"); } - public static > void open(EntityPlayer player, T mte) { + public static void open(EntityPlayerMP player, T mte) { Objects.requireNonNull(player); Objects.requireNonNull(mte); if (!mte.isValid()) { @@ -35,29 +34,38 @@ public static > void open(Enti throw new IllegalArgumentException("MetaTileEntity must be in same dimension as the player!"); } BlockPos pos = mte.getPos(); - PosGuiData data = new PosGuiData(player, pos.getX(), pos.getY(), pos.getZ()); - GuiManager.open(INSTANCE, data, (EntityPlayerMP) player); + MetaTileEntityGuiData data = new MetaTileEntityGuiData(player, pos.getX(), pos.getY(), pos.getZ()); + mte.writeExtraGuiData(data.getBufferInternal()); + GuiManager.open(INSTANCE, data, player); } @Override - public @NotNull IGuiHolder getGuiHolder(PosGuiData data) { - TileEntity te = data.getTileEntity(); - if (te instanceof IGregTechTileEntity gtte) { - MetaTileEntity mte = gtte.getMetaTileEntity(); + public @NotNull IGuiHolder getGuiHolder(MetaTileEntityGuiData data) { + MetaTileEntity mte = data.getMetaTileEntity(); + if (mte != null) { return Objects.requireNonNull(castGuiHolder(mte), "Found MetaTileEntity is not a gui holder!"); } throw new IllegalStateException("Found TileEntity is not a MetaTileEntity!"); } @Override - public void writeGuiData(PosGuiData guiData, PacketBuffer buffer) { + public void writeGuiData(MetaTileEntityGuiData guiData, PacketBuffer buffer) { buffer.writeVarInt(guiData.getX()); buffer.writeVarInt(guiData.getY()); buffer.writeVarInt(guiData.getZ()); + + PacketBuffer guiDataBuffer = guiData.getBufferInternal(); + int length = guiDataBuffer.writerIndex(); + buffer.writeVarInt(length); + buffer.writeBytes(guiDataBuffer, 0, length); } @Override - public @NotNull PosGuiData readGuiData(EntityPlayer player, PacketBuffer buffer) { - return new PosGuiData(player, buffer.readVarInt(), buffer.readVarInt(), buffer.readVarInt()); + public @NotNull MetaTileEntityGuiData readGuiData(EntityPlayer player, PacketBuffer buffer) { + MetaTileEntityGuiData guiData = new MetaTileEntityGuiData(player, buffer.readVarInt(), buffer.readVarInt(), + buffer.readVarInt()); + buffer.readBytes(guiData.getBufferInternal(), buffer.readVarInt()); + + return guiData; } } diff --git a/src/main/java/gregtech/api/mui/sync/FixedIntArraySyncValue.java b/src/main/java/gregtech/api/mui/sync/FixedIntArraySyncValue.java index c3f29ee80b5..a4658c6eeef 100644 --- a/src/main/java/gregtech/api/mui/sync/FixedIntArraySyncValue.java +++ b/src/main/java/gregtech/api/mui/sync/FixedIntArraySyncValue.java @@ -70,6 +70,11 @@ public boolean updateCacheFromSource(boolean isFirstSync) { return false; } + @Override + public void notifyUpdate() { + setValue(this.getter.get(), false, true); + } + @Override public void write(@NotNull PacketBuffer buffer) throws IOException { for (int i : cache) { @@ -92,4 +97,9 @@ public int[] getValue() { public int getValue(int index) { return this.cache[index]; } + + @Override + public Class getValueType() { + return int[].class; + } } diff --git a/src/main/java/gregtech/api/mui/widget/FlappyGreg.java b/src/main/java/gregtech/api/mui/widget/FlappyGreg.java new file mode 100644 index 00000000000..ad9a165d518 --- /dev/null +++ b/src/main/java/gregtech/api/mui/widget/FlappyGreg.java @@ -0,0 +1,247 @@ +package gregtech.api.mui.widget; + +import gregtech.api.GTValues; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.util.GTUtility; + +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.widget.Interactable; +import com.cleanroommc.modularui.drawable.GuiDraw; +import com.cleanroommc.modularui.drawable.Stencil; +import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; +import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.theme.WidgetThemeEntry; +import com.cleanroommc.modularui.utils.Color; +import com.cleanroommc.modularui.widget.Widget; +import com.cleanroommc.modularui.widget.sizer.Area; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.awt.geom.Rectangle2D; +import java.util.List; + +public class FlappyGreg extends Widget implements Interactable { + + protected static final int BACKGROUND_COLOR = Color.BLACK.main; + protected static final float WIN_DISTANCE = 25.0f; + + protected static final float CLICK_IMPULSE = 1.75f; + protected static final float TERMINAL_VELOCITY = 2.0f; + protected static final float GRAVITY = 0.25f; + + protected static final int MAX_OBSTACLES = 5; + protected static final float OBSTACLE_MOVEMENT_SPEED = 2.0f; + protected static final int OBSTACLE_COLOR = Color.GREEN.main; + protected final List obstacles = new ObjectArrayList<>(MAX_OBSTACLES * 2); + protected float obstacleWidth; + + protected static final float GREG_SIZE = 18.0f; + protected Rectangle2D.Float gregArea = new Rectangle2D.Float(); + protected float gregYSpeed = TERMINAL_VELOCITY; + + @Nullable + protected Runnable action; + @NotNull + protected GameState gameState = GameState.INIT; + + protected IKey startMessage; + protected IKey deathMessage; + protected IKey respawnMessage; + protected IKey wonMessage; + + @Override + public void onInit() { + if (!GTValues.isClientSide()) return; + + startMessage = IKey.lang("gregtech.machine.maintenance_hatch.fools.start") + .style(TextFormatting.WHITE); + deathMessage = IKey.lang("gregtech.machine.maintenance_hatch.fools.dead") + .style(TextFormatting.BOLD, TextFormatting.WHITE); + respawnMessage = IKey.lang("gregtech.machine.maintenance_hatch.fools.respawn") + .style(TextFormatting.UNDERLINE, TextFormatting.WHITE); + wonMessage = IKey.lang("gregtech.machine.maintenance_hatch.fools.won") + .style(TextFormatting.GREEN); + } + + @Override + public void onResized() { + super.onResized(); + if (!GTValues.isClientSide()) return; + if (gameState == GameState.INIT) { + // Has to be in onResized instead of onInit since it depends on the size of the widget. + initializeState(); + } + } + + public FlappyGreg onFinish(@NotNull Runnable action) { + this.action = action; + return this; + } + + @SideOnly(Side.CLIENT) + protected void onFinish() { + if (action != null) { + action.run(); + } + } + + protected boolean shouldUpdateGame() { + return gameState == GameState.RUNNING && GTValues.isClientSide(); + } + + protected void initializeState() { + obstacles.clear(); + + Area area = getArea(); + int width = area.width; + int height = area.height; + + gregArea.setRect((width / 3.0f) - (GREG_SIZE / 2.0f), (height / 2.0f) - (GREG_SIZE / 2.0f), GREG_SIZE, + GREG_SIZE); + + float lastXPos = width * 0.95f; + this.obstacleWidth = width / 20.0f; + for (int i = 0; i < MAX_OBSTACLES; i++) { + Rectangle2D.Float top = new Rectangle2D.Float(); + obstacles.add(top); + + Rectangle2D.Float bottom = new Rectangle2D.Float(); + obstacles.add(bottom); + + top.x = lastXPos; + bottom.x = lastXPos; + top.width = obstacleWidth; + bottom.width = obstacleWidth; + + final float topYEnd = (height * 0.55f) - (height * 0.20f * GTValues.RNG.nextFloat()); + top.height = topYEnd; + + final float bottomYStart = topYEnd + (gregArea.height * 1.75f); + bottom.height = height - bottomYStart; + bottom.y = bottomYStart; + + lastXPos += (width / 2.5f) + ((width / 15.0f) * GTValues.RNG.nextFloat()); + } + + gameState = GameState.INIT; + } + + @Override + public void onUpdate() { + super.onUpdate(); + if (!shouldUpdateGame()) return; + + updateGregPosition(); + checkObstacleCollisions(); + if (gameState != GameState.COLLIDED) { + updateObstaclePositions(); + checkWinState(); + } + } + + @SideOnly(Side.CLIENT) + protected void updateGregPosition() { + if (gregArea.getY() < (getArea().height - gregArea.getHeight())) { + gregArea.y = gregArea.y + gregYSpeed; + } + + if (gregYSpeed < TERMINAL_VELOCITY) { + gregYSpeed = Math.min(gregYSpeed + GRAVITY, TERMINAL_VELOCITY); + } + } + + @SideOnly(Side.CLIENT) + protected void checkObstacleCollisions() { + for (Rectangle2D.Float obstacle : obstacles) { + if (GTUtility.rectanglesCollide(obstacle, gregArea)) { + gameState = GameState.COLLIDED; + break; + } + } + } + + @SideOnly(Side.CLIENT) + protected void updateObstaclePositions() { + for (Rectangle2D.Float obstacle : obstacles) { + obstacle.x -= OBSTACLE_MOVEMENT_SPEED; + } + } + + @SideOnly(Side.CLIENT) + protected void checkWinState() { + if (obstacles.isEmpty()) return; + + Rectangle2D.Float obstacle = obstacles.get(obstacles.size() - 1); + if ((obstacle.x + obstacleWidth + WIN_DISTANCE) <= gregArea.getX()) { + gameState = GameState.FINISHED; + onFinish(); + } + } + + @Override + public void draw(ModularGuiContext context, WidgetThemeEntry widgetTheme) { + Area area = getArea(); + int width = area.width; + int height = area.height; + + // Background + GuiDraw.drawRect(0, 0, width, height, BACKGROUND_COLOR); + + // Obstacles + Stencil.applyAtZero(area, context); + for (Rectangle2D.Float obstacle : obstacles) { + GuiDraw.drawRect(obstacle.x, obstacle.y, obstacle.width, obstacle.height, OBSTACLE_COLOR); + } + Stencil.remove(); + + // "Character" + GTGuiTextures.GREGTECH_LOGO.draw(gregArea.x, gregArea.y, gregArea.width, gregArea.height); + + WidgetTheme theme = widgetTheme.getTheme(); + switch (gameState) { + case INIT -> startMessage.draw(context, 0, (height / 2), width, 9, theme); + case COLLIDED -> { + GlStateManager.enableBlend(); + GuiDraw.drawRect(0, 0, width, height, 0x75FFFFFF & BACKGROUND_COLOR); + GlStateManager.disableBlend(); + + deathMessage.draw(context, 0, (height / 2) - 5, width, 9, theme); + respawnMessage.draw(context, 0, (height / 2) + 5, width, 9, theme); + } + case FINISHED -> wonMessage.draw(context, 0, (height / 2), width, 9, theme); + } + } + + @Override + public @NotNull Result onMousePressed(int mouseButton) { + if (gameState == GameState.FINISHED) return Result.IGNORE; + + switch (gameState) { + case INIT -> { + impulseGreg(); + gameState = GameState.RUNNING; + } + case RUNNING -> impulseGreg(); + case COLLIDED -> initializeState(); + } + + return Result.SUCCESS; + } + + protected void impulseGreg() { + gregYSpeed = -CLICK_IMPULSE; + } + + protected enum GameState { + INIT, + RUNNING, + COLLIDED, + FINISHED + } +} diff --git a/src/main/java/gregtech/api/recipes/RecipeMaps.java b/src/main/java/gregtech/api/recipes/RecipeMaps.java index 0f17d0609e3..235e00de29a 100644 --- a/src/main/java/gregtech/api/recipes/RecipeMaps.java +++ b/src/main/java/gregtech/api/recipes/RecipeMaps.java @@ -423,7 +423,7 @@ public final class RecipeMaps { .fluidSlotOverlay(GuiTextures.MOLECULAR_OVERLAY_4, false, true) .fluidSlotOverlay(GuiTextures.VIAL_OVERLAY_2, true) .progressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE) - .sound(GTValues.FOOLS.get() ? GTSoundEvents.SCIENCE : GTSoundEvents.CHEMICAL_REACTOR) + .sound(isAprilFools() ? GTSoundEvents.SCIENCE : GTSoundEvents.CHEMICAL_REACTOR) .onBuild(gregtechId("lcr_copy"), recipeBuilder -> RecipeMaps.LARGE_CHEMICAL_RECIPES.recipeBuilder() .inputs(recipeBuilder.getInputs().toArray(new GTRecipeInput[0])) .fluidInputs(recipeBuilder.getFluidInputs()) diff --git a/src/main/java/gregtech/api/recipes/machines/RecipeMapResearchStation.java b/src/main/java/gregtech/api/recipes/machines/RecipeMapResearchStation.java index 0df34aeb61b..3b16641ad6e 100644 --- a/src/main/java/gregtech/api/recipes/machines/RecipeMapResearchStation.java +++ b/src/main/java/gregtech/api/recipes/machines/RecipeMapResearchStation.java @@ -15,7 +15,7 @@ public class RecipeMapResearchStation> extends Recipe public RecipeMapResearchStation(@NotNull String unlocalizedName, @NotNull R defaultRecipeBuilder, @NotNull RecipeMapUIFunction recipeMapUI) { super(unlocalizedName, defaultRecipeBuilder, recipeMapUI, 2, 1, 0, 0); - setSound(GTValues.FOOLS.get() ? GTSoundEvents.SCIENCE : GTSoundEvents.COMPUTATION); + setSound(GTValues.isAprilFools() ? GTSoundEvents.SCIENCE : GTSoundEvents.COMPUTATION); getPrimaryRecipeCategory().jeiSortToBack(true); } } diff --git a/src/main/java/gregtech/api/util/GTUtility.java b/src/main/java/gregtech/api/util/GTUtility.java index 597f8ef6095..5085c5a2ea2 100644 --- a/src/main/java/gregtech/api/util/GTUtility.java +++ b/src/main/java/gregtech/api/util/GTUtility.java @@ -3,6 +3,8 @@ import gregtech.api.GTValues; import gregtech.api.GregTechAPI; import gregtech.api.block.machines.MachineItemBlock; +import gregtech.api.capability.GregtechCapabilities; +import gregtech.api.capability.IElectricItem; import gregtech.api.capability.IMultipleTankHandler; import gregtech.api.cover.CoverDefinition; import gregtech.api.fluids.GTFluid; @@ -20,6 +22,7 @@ import gregtech.api.unification.ore.OrePrefix; import gregtech.api.unification.stack.ItemAndMetadata; import gregtech.api.util.function.impl.TimedProgressSupplier; +import gregtech.common.ConfigHolder; import net.minecraft.block.BlockRedstoneWire; import net.minecraft.block.BlockSnow; @@ -45,6 +48,8 @@ import net.minecraft.world.biome.Biome; import net.minecraftforge.common.BiomeDictionary; import net.minecraftforge.common.util.Constants; +import net.minecraftforge.energy.CapabilityEnergy; +import net.minecraftforge.energy.IEnergyStorage; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTank; @@ -52,9 +57,12 @@ import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandlerItem; import net.minecraftforge.fml.relauncher.ReflectionHelper; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; +import com.cleanroommc.modularui.api.widget.Interactable; import com.google.common.util.concurrent.AtomicDouble; import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet; import org.apache.commons.lang3.ArrayUtils; @@ -65,6 +73,9 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Range; +import java.awt.geom.Rectangle2D; +import java.time.MonthDay; +import java.time.ZoneId; import java.util.AbstractList; import java.util.ArrayList; import java.util.List; @@ -756,10 +767,10 @@ public static String lowerUnderscoreToUpperCamel(String string) { return result.toString(); } - public static MetaTileEntity getMetaTileEntity(IBlockAccess world, BlockPos pos) { + public static @Nullable MetaTileEntity getMetaTileEntity(@Nullable IBlockAccess world, @Nullable BlockPos pos) { if (world == null || pos == null) return null; TileEntity te = world.getTileEntity(pos); - return te instanceof IGregTechTileEntity ? ((IGregTechTileEntity) te).getMetaTileEntity() : null; + return te instanceof IGregTechTileEntity igtte ? igtte.getMetaTileEntity() : null; } public static MetaTileEntity getMetaTileEntity(ItemStack stack) { @@ -1002,11 +1013,18 @@ public static long scaleVoltage(long voltage, int workingTier) { return Math.min(voltage, GTValues.VA[workingTier]); } + // TODO: remove once ColorUtil from pr 2858 is merged public static int combineRGB(@Range(from = 0, to = 255) int r, @Range(from = 0, to = 255) int g, @Range(from = 0, to = 255) int b) { return (r << 16) | (g << 8) | b; } + // TODO: remove once ColorUtil from pr 2858 is merged + public static int combineRGB(@Range(from = 0, to = 255) int a, @Range(from = 0, to = 255) int r, + @Range(from = 0, to = 255) int g, @Range(from = 0, to = 255) int b) { + return (a << 24) | (r << 16) | (g << 8) | b; + } + /** * @param map the map to get from * @param key the key to retrieve with @@ -1024,9 +1042,123 @@ public static int combineRGB(@Range(from = 0, to = 255) int r, @Range(from = 0, return map.get(key.toWildcard()); } + /** + * Check if the given item is chargeable from an EU source.
+ * Unless the {@code nativeEUToFE} option under Energy Compatibility is enabled, this will return false for RF + * items. + * + * @param tier if the item stores EU and is tiered, check if the given tier is greater than or equal to it. + */ + public static boolean isItemChargableWithEU(@NotNull ItemStack stack, int tier) { + IElectricItem euItem = stack.getCapability(GregtechCapabilities.CAPABILITY_ELECTRIC_ITEM, null); + if (euItem != null) { + return euItem.chargeable() && euItem.getCharge() < euItem.getMaxCharge() && euItem.getTier() <= tier; + } + + if (ConfigHolder.compat.energy.nativeEUToFE) { + IEnergyStorage rfItem = stack.getCapability(CapabilityEnergy.ENERGY, null); + if (rfItem != null) { + return rfItem.canReceive() && rfItem.getEnergyStored() < rfItem.getMaxEnergyStored(); + } + } + + return false; + } + + /** + * Get the level of charge from 0 to 1 of an item. + * + * @return -1 if the supplied item is not electric + */ + public static float itemChargeLevel(@NotNull ItemStack stack) { + if (stack.isEmpty()) return 0.0f; + + IElectricItem euItem = stack.getCapability(GregtechCapabilities.CAPABILITY_ELECTRIC_ITEM, null); + if (euItem != null) { + return (float) euItem.getCharge() / euItem.getMaxCharge(); + } + + IEnergyStorage rfItem = stack.getCapability(CapabilityEnergy.ENERGY, null); + if (rfItem != null) { + return (float) rfItem.getEnergyStored() / rfItem.getMaxEnergyStored(); + } + + return -1.0f; + } + + /** + * Lerp between two ARGB colors + * + * @param start the start point of the lerp + * @param end the end point of the lerp + * @param position the position of the lerp. Must be between 0 and 1. + * @return the lerped color value + */ + public static int argbLerp(int start, int end, float position) { + int aStart = (start >> 24 & 0xFF); + int rStart = (start >> 16 & 0xFF); + int gStart = (start >> 8 & 0xFF); + int bStart = (start & 0xFF); + + int aEnd = (end >> 24 & 0xFF); + int rEnd = (end >> 16 & 0xFF); + int gEnd = (end >> 8 & 0xFF); + int bEnd = (end & 0xFF); + + int aFinal = (int) (aStart + (aEnd - aStart) * position); + int rFinal = (int) (rStart + (rEnd - rStart) * position); + int gFinal = (int) (gStart + (gEnd - gStart) * position); + int bFinal = (int) (bStart + (bEnd - bStart) * position); + + return (aFinal << 24) | (rFinal << 16) | (gFinal << 8) | bFinal; + } + public static boolean areFluidStacksEqual(@Nullable FluidStack a, @Nullable FluidStack b) { if (a == b) return true; if (a == null) return false; return a.isFluidEqual(b); } + + /** + * Check if the provided month and day is today with a given time zone. + */ + public static boolean isToday(@NotNull MonthDay monthDay, @Nullable ZoneId tz) { + MonthDay now = tz == null ? MonthDay.now() : MonthDay.now(tz); + return now.equals(monthDay); + } + + /** + * Check if the provided month and day is today. + */ + public static boolean isToday(@NotNull MonthDay monthDay) { + return isToday(monthDay, null); + } + + /** + * Check if two rectangles would touch or intersect. + */ + public static boolean rectanglesCollide(@NotNull Rectangle2D a, @NotNull Rectangle2D b) { + return (a.getX() <= b.getX() + b.getWidth()) && + (a.getX() + a.getWidth() >= b.getX()) && + (a.getY() <= b.getY() + b.getHeight()) && + (a.getY() + a.getHeight() >= b.getY()); + } + + /** + * Get a value multiplier based on what modifier keys the player is holding down.
+ * Returns {@code 1} if no modifiers are pressed, otherwise:
+ * - {@code shift}: x4
+ * - {@code ctrl}: x16
+ * - {@code alt}: x64
+ * Holding down multiple modifiers multiplies their effects, so if the player is holding down {@code shift}, + * {@code ctrl}, and {@code alt} all at the same time, this method will return {@code 4096}. + */ + @SideOnly(Side.CLIENT) + public static int getButtonIncrementValue() { + int adjust = 1; + if (Interactable.hasShiftDown()) adjust *= 4; + if (Interactable.hasControlDown()) adjust *= 16; + if (Interactable.hasAltDown()) adjust *= 64; + return adjust; + } } diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index 1b547e2fa69..f2d42e554b7 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -9,6 +9,7 @@ import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.drawable.text.StyledText; import org.apache.commons.lang3.ArrayUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -145,4 +146,37 @@ public static IKey fluid(@Nullable Fluid fluid, @Nullable FluidStack stack) { if (stack == null) return IKey.lang(fluid.getUnlocalizedName()); else return IKey.lang(fluid.getUnlocalizedName(stack)); } + + /** + * Create an {@link IKey} that dynamically shows the result of {@link GTUtility#getButtonIncrementValue()}.
+ * Example: player is holding down ctrl and {@code positive} is {@code true} = {@code +16}.
+ * + * @param positive if the prefix should be {@code +} or {@code -} + */ + @NotNull + public static IKey createMultiplierKey(boolean positive) { + Object[] args = new Object[] { positive ? '+' : '-', 0 }; + StyledText key = IKey.str("%c%d", args) + .withStyle(); + + // Using the color supplier here as a callback to update the multiplier and scale before it gets rendered. + key.color(() -> { + int multiplier = GTUtility.getButtonIncrementValue(); + args[1] = multiplier; + + if (multiplier < 10) { + key.scale(1.0f); + } else if (multiplier < 100) { + key.scale(0.8f); + } else if (multiplier < 1000) { + key.scale(0.6f); + } else { + key.scale(0.5f); + } + + return -1; + }); + + return key; + } } diff --git a/src/main/java/gregtech/api/util/function/FloatConsumer.java b/src/main/java/gregtech/api/util/function/FloatConsumer.java index edd172332d7..57b17776e36 100644 --- a/src/main/java/gregtech/api/util/function/FloatConsumer.java +++ b/src/main/java/gregtech/api/util/function/FloatConsumer.java @@ -1,7 +1,16 @@ package gregtech.api.util.function; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Consumer; + @FunctionalInterface -public interface FloatConsumer { +public interface FloatConsumer extends Consumer { + + @Override + default void accept(@NotNull Float value) { + apply(value); + } void apply(float value); } diff --git a/src/main/java/gregtech/api/util/function/FloatSupplier.java b/src/main/java/gregtech/api/util/function/FloatSupplier.java index 4d4501c4778..aa2e2a403e5 100644 --- a/src/main/java/gregtech/api/util/function/FloatSupplier.java +++ b/src/main/java/gregtech/api/util/function/FloatSupplier.java @@ -7,8 +7,8 @@ public interface FloatSupplier extends Supplier { @Override default Float get() { - return getFloat(); + return getAsFloat(); } - float getFloat(); + float getAsFloat(); } diff --git a/src/main/java/gregtech/client/utils/RenderUtil.java b/src/main/java/gregtech/client/utils/RenderUtil.java index 7ad7228b23a..cf25f2da4f5 100644 --- a/src/main/java/gregtech/client/utils/RenderUtil.java +++ b/src/main/java/gregtech/client/utils/RenderUtil.java @@ -115,7 +115,7 @@ public static void popScissorFrame() { } // applies scissor with gui-space coordinates and sizes - private static void applyScissor(int x, int y, int w, int h) { + public static void applyScissor(int x, int y, int w, int h) { // translate upper-left to bottom-left ScaledResolution r = ((GuiIngameForge) Minecraft.getMinecraft().ingameGUI).getResolution(); int s = r == null ? 1 : r.getScaleFactor(); diff --git a/src/main/java/gregtech/client/utils/TooltipHelper.java b/src/main/java/gregtech/client/utils/TooltipHelper.java index b352bb6ca35..23619b3556b 100644 --- a/src/main/java/gregtech/client/utils/TooltipHelper.java +++ b/src/main/java/gregtech/client/utils/TooltipHelper.java @@ -1,22 +1,36 @@ package gregtech.client.utils; +import gregtech.api.metatileentity.multiblock.IMaintenance; +import gregtech.api.unification.material.Materials; import gregtech.api.util.GTLog; +import gregtech.api.util.KeyUtil; import gregtech.common.ConfigHolder; +import gregtech.common.items.ToolItems; +import net.minecraft.client.resources.I18n; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fml.common.gameevent.TickEvent; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; +import com.cleanroommc.modularui.drawable.ItemDrawable; +import org.jetbrains.annotations.NotNull; import org.lwjgl.input.Keyboard; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.function.Supplier; import static gregtech.api.GTValues.CLIENT_TIME; import static net.minecraft.util.text.TextFormatting.*; public class TooltipHelper { + public static final Supplier CREATIVE_TOOLTIP = () -> I18n.format("gregtech.creative_tooltip.1") + + TooltipHelper.RAINBOW + I18n.format("gregtech.creative_tooltip.2") + + I18n.format("gregtech.creative_tooltip.3"); + private static final List CODES = new ArrayList<>(); /* Array of TextFormatting codes that are used to create a rainbow effect */ @@ -74,6 +88,61 @@ public static boolean isCtrlDown() { return Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL); } + public static void addMaintenanceProblems(@NotNull IRichTextBuilder richText, byte maintenanceProblems) { + if (maintenanceProblems >= IMaintenance.NO_PROBLEMS || maintenanceProblems < 0) return; + + richText.addLine(KeyUtil.lang(YELLOW, "gregtech.multiblock.universal.has_problems")) + .spaceLine(2); + + // Wrench + if ((maintenanceProblems & 1) == 0) { + richText.add(new ItemDrawable(ToolItems.WRENCH.get(Materials.Iron))) + .add(IKey.SPACE) + .add(KeyUtil.lang(YELLOW, "gregtech.multiblock.universal.problem.wrench")) + .newLine(); + } + + // Screwdriver + if (((maintenanceProblems >> 1) & 1) == 0) { + richText.add(new ItemDrawable(ToolItems.SCREWDRIVER.get(Materials.Iron))) + .add(IKey.SPACE) + .add(KeyUtil.lang(YELLOW, "gregtech.multiblock.universal.problem.screwdriver")) + .newLine(); + } + + // Soft Mallet + if (((maintenanceProblems >> 2) & 1) == 0) { + richText.add(new ItemDrawable(ToolItems.SOFT_MALLET.get(Materials.Wood))) + .add(IKey.SPACE) + .add(KeyUtil.lang(YELLOW, "gregtech.multiblock.universal.problem.soft_mallet")) + .newLine(); + } + + // Hammer + if (((maintenanceProblems >> 3) & 1) == 0) { + richText.add(new ItemDrawable(ToolItems.HARD_HAMMER.get(Materials.Iron))) + .add(IKey.SPACE) + .add(KeyUtil.lang(YELLOW, "gregtech.multiblock.universal.problem.hard_hammer")) + .newLine(); + } + + // Wire Cutters + if (((maintenanceProblems >> 4) & 1) == 0) { + richText.add(new ItemDrawable(ToolItems.WIRE_CUTTER.get(Materials.Iron))) + .add(IKey.SPACE) + .add(KeyUtil.lang(YELLOW, "gregtech.multiblock.universal.problem.wire_cutter")) + .newLine(); + } + + // Crowbar + if (((maintenanceProblems >> 5) & 1) == 0) { + richText.add(new ItemDrawable(ToolItems.CROWBAR.get(Materials.Iron))) + .add(IKey.SPACE) + .add(KeyUtil.lang(YELLOW, "gregtech.multiblock.universal.problem.crowbar")) + .newLine(); + } + } + public static class GTFormatCode { private final int rate; diff --git a/src/main/java/gregtech/common/covers/CoverConveyor.java b/src/main/java/gregtech/common/covers/CoverConveyor.java index 7cdd1b9f85b..82fcbee63f4 100644 --- a/src/main/java/gregtech/common/covers/CoverConveyor.java +++ b/src/main/java/gregtech/common/covers/CoverConveyor.java @@ -11,7 +11,9 @@ import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; import gregtech.api.util.GTTransferUtils; +import gregtech.api.util.GTUtility; import gregtech.api.util.ItemStackHashStrategy; +import gregtech.api.util.KeyUtil; import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleSidedCubeRenderer; import gregtech.common.covers.filter.ItemFilterContainer; @@ -50,7 +52,6 @@ import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.screen.UISettings; import com.cleanroommc.modularui.utils.Color; -import com.cleanroommc.modularui.utils.MouseData; import com.cleanroommc.modularui.value.sync.EnumSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; @@ -531,12 +532,12 @@ protected Flow createUI(GuiData data, PanelSyncManager guiSyncManager) { .marginBottom(2).widthRel(1f) .child(new ButtonWidget<>() .left(0).width(18) + .overlay(KeyUtil.createMultiplierKey(false)) .onMousePressed(mouseButton -> { - int val = throughput.getValue() - getIncrementValue(MouseData.create(mouseButton)); + int val = throughput.getValue() - GTUtility.getButtonIncrementValue(); throughput.setValue(val, true, true); return true; - }) - .onUpdateListener(w -> w.overlay(createAdjustOverlay(false)))) + })) .child(new GTTextFieldWidget() .left(18).right(18) .setPostFix(" items/s") @@ -546,12 +547,12 @@ protected Flow createUI(GuiData data, PanelSyncManager guiSyncManager) { .background(GTGuiTextures.DISPLAY)) .child(new ButtonWidget<>() .right(0).width(18) + .overlay(KeyUtil.createMultiplierKey(true)) .onMousePressed(mouseButton -> { - int val = throughput.getValue() + getIncrementValue(MouseData.create(mouseButton)); + int val = throughput.getValue() + GTUtility.getButtonIncrementValue(); throughput.setValue(val, true, true); return true; - }) - .onUpdateListener(w -> w.overlay(createAdjustOverlay(true))))); + }))); if (createFilterRow()) column.child(getItemFilterContainer().initUI(data, guiSyncManager)); diff --git a/src/main/java/gregtech/common/covers/CoverPump.java b/src/main/java/gregtech/common/covers/CoverPump.java index c595a56774a..63388ac46cd 100644 --- a/src/main/java/gregtech/common/covers/CoverPump.java +++ b/src/main/java/gregtech/common/covers/CoverPump.java @@ -11,6 +11,8 @@ import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; import gregtech.api.util.GTTransferUtils; +import gregtech.api.util.GTUtility; +import gregtech.api.util.KeyUtil; import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleSidedCubeRenderer; import gregtech.common.covers.filter.FluidFilterContainer; @@ -48,7 +50,6 @@ import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.screen.UISettings; import com.cleanroommc.modularui.utils.Color; -import com.cleanroommc.modularui.utils.MouseData; import com.cleanroommc.modularui.value.sync.EnumSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; @@ -212,12 +213,12 @@ protected Flow createUI(GuiData data, PanelSyncManager syncManager) { .marginBottom(2).widthRel(1f) .child(new ButtonWidget<>() .left(0).width(18) + .overlay(KeyUtil.createMultiplierKey(false)) .onMousePressed(mouseButton -> { - int val = throughput.getValue() - getIncrementValue(MouseData.create(mouseButton)); + int val = throughput.getValue() - GTUtility.getButtonIncrementValue(); throughput.setValue(val); return true; - }) - .onUpdateListener(w -> w.overlay(createAdjustOverlay(false)))) + })) .child(new GTTextFieldWidget() .left(18).right(18) .setPostFix(" L/s") @@ -227,12 +228,12 @@ protected Flow createUI(GuiData data, PanelSyncManager syncManager) { .background(GTGuiTextures.DISPLAY)) .child(new ButtonWidget<>() .right(0).width(18) + .overlay(KeyUtil.createMultiplierKey(true)) .onMousePressed(mouseButton -> { - int val = throughput.getValue() + getIncrementValue(MouseData.create(mouseButton)); + int val = throughput.getValue() + GTUtility.getButtonIncrementValue(); throughput.setValue(val); return true; - }) - .onUpdateListener(w -> w.overlay(createAdjustOverlay(true))))); + }))); if (createFilterRow()) column.child(getFluidFilterContainer().initUI(data, syncManager)); diff --git a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java index c200f506267..8030b30df3d 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java @@ -160,7 +160,7 @@ protected Flow createWidgets(GuiData data, PanelSyncManager syncManager) { name = new StringSyncValue(this::getColorStr); } - IPanelHandler entrySelectorSH = syncManager.panel("entry_selector", entrySelector(getType(), uuid), true); + IPanelHandler entrySelectorSH = syncManager.syncedPanel("entry_selector", true, entrySelector(getType(), uuid)); return Flow.column().coverChildrenHeight().top(24) .margin(7, 0).widthRel(1f) @@ -359,8 +359,7 @@ protected IWidget createRow(String name, PanelSyncManager syncManager, T entry = VirtualEnderRegistry.getEntry(getOwner(), type, name); String key = String.format("entry#%s_description", entry.getColorStr()); String syncKey = PanelSyncManager.makeSyncKey(key, isPrivate ? 1 : 0); - IPanelHandler panelHandler = syncManager.panel(syncKey, - entryDescription(key, entry), true); + IPanelHandler panelHandler = syncManager.syncedPanel(syncKey, true, entryDescription(key, entry)); EnderCoverSyncHandler syncHandler = new EnderCoverSyncHandler(); syncManager.syncValue(key + "_handler", syncHandler); diff --git a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java index 8c050a2e394..52e183ec9d1 100644 --- a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java +++ b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java @@ -13,7 +13,6 @@ 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; @@ -211,7 +210,7 @@ public void handleLegacyNBT(NBTTagCompound nbt) { } /** Uses Cleanroom MUI */ - public IWidget initUI(GuiData data, PanelSyncManager manager) { + public Flow initUI(GuiData data, PanelSyncManager manager) { // i bet brachy is gonna really hate this, but it *does* work // todo Find a better way to handle the filter popup panel than making // a new panel handler every time it changes diff --git a/src/main/java/gregtech/common/covers/filter/IFilter.java b/src/main/java/gregtech/common/covers/filter/IFilter.java index 1bbde04af5d..33b09a66de2 100644 --- a/src/main/java/gregtech/common/covers/filter/IFilter.java +++ b/src/main/java/gregtech/common/covers/filter/IFilter.java @@ -33,7 +33,7 @@ default IPanelHandler createPanelHandler(PanelSyncManager syncManager, int id) { String translationKey = getContainerStack().getTranslationKey(); return syncManager.getOrCreateSyncHandler(translationKey, id, PanelSyncHandler.class, () -> { String key = PanelSyncManager.makeSyncKey(translationKey, id); - return (PanelSyncHandler) syncManager.panel(key, (psm, $) -> createPopupPanel(psm, key), true); + return (PanelSyncHandler) syncManager.syncedPanel(key, true, (psm, $) -> createPopupPanel(psm, key)); }); } diff --git a/src/main/java/gregtech/common/gui/widget/among_us/FixWiringTaskWidget.java b/src/main/java/gregtech/common/gui/widget/among_us/FixWiringTaskWidget.java deleted file mode 100644 index bd946b1e39d..00000000000 --- a/src/main/java/gregtech/common/gui/widget/among_us/FixWiringTaskWidget.java +++ /dev/null @@ -1,191 +0,0 @@ -package gregtech.common.gui.widget.among_us; - -import gregtech.api.GTValues; -import gregtech.api.gui.IRenderContext; -import gregtech.api.gui.Widget; -import gregtech.api.gui.resources.TextureArea; - -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketBuffer; -import net.minecraft.util.math.Vec2f; - -import java.util.*; -import java.util.function.BiPredicate; -import java.util.function.Consumer; -import java.util.function.Supplier; - -public class FixWiringTaskWidget extends Widget { - - private final static TextureArea background = TextureArea - .fullImage("textures/gui/widget/electricity_wires_baseback.png"); - private final static TextureArea wire = TextureArea.fullImage("textures/gui/widget/electricity_wires.png"); - private final static TextureArea wire_base = TextureArea - .fullImage("textures/gui/widget/electricity_wires_base.png"); - private final int[] colors = new int[4]; - private final boolean[] connect = new boolean[4]; - private final int[] init = new int[4]; - private Consumer onConnected; - private Runnable onFinished; - private BiPredicate hoverItemCheck; - private int dragged = -1; - private Supplier canInteractPredicate = () -> true; - - public FixWiringTaskWidget(int x, int y, int width, int height) { - super(x, y, width, height); - for (int i = 0; i < 4; i++) { - colors[i] = (GTValues.RNG.nextInt() & 0x00ffffff) | 0xff000000; - } - List list = new ArrayList<>(Arrays.asList(0, 1, 2, 3)); - Collections.shuffle(list); - for (int i = 0; i < list.size(); i++) { - init[i] = list.get(i); - } - } - - public FixWiringTaskWidget setOnFinished(Runnable onFinished) { - this.onFinished = onFinished; - return this; - } - - public FixWiringTaskWidget setOnConnected(Consumer onConnected) { - this.onConnected = onConnected; - return this; - } - - public FixWiringTaskWidget setHoverItemCheck(BiPredicate hoverItemCheck) { - this.hoverItemCheck = hoverItemCheck; - return this; - } - - public FixWiringTaskWidget setCanInteractPredicate(Supplier canInteractPredicate) { - this.canInteractPredicate = canInteractPredicate; - return this; - } - - public void setColor(int index, int color) { - this.colors[index] = color; - } - - public boolean getConnected(int index) { - return connect[index]; - } - - public int isMouseOverWire(int mouseX, int mouseY, boolean isLeft) { - if (!canInteractPredicate.get()) return -1; - int x = getPosition().x; - int y = getPosition().y; - int width = getSize().width; - int height = getSize().height; - float xScale = width / 504f; - float yScale = height / 504f; - for (int i = 0; i < 4; i++) { - double y1 = y + yScale * ((i + 1) * 104 - 10); - if (isLeft) { - if (isMouseOver(x, (int) (y1 - yScale * 16), (int) (xScale * 38 * 1.5), (int) (yScale * 64), mouseX, - mouseY)) { - return i; - } - } else { - if (isMouseOver(x + width - (int) (xScale * 38 * 1.5), (int) (y1 - yScale * 16), - (int) (xScale * 38 * 1.5), (int) (yScale * 64), mouseX, mouseY)) { - return i; - } - } - } - return -1; - } - - @Override - public void drawInBackground(int mouseX, int mouseY, float partialTicks, IRenderContext context) { - int x = getPosition().x; - int y = getPosition().y; - int width = getSize().width; - int height = getSize().height; - background.draw(x, y, width, height); - float xScale = width / 504f; - float yScale = height / 504f; - // connected - for (int i = 0; i < 4; i++) { - double y1 = y + yScale * ((i + 1) * 104 - 10); - int color = colors[i]; - if (connect[i]) { - for (int j = 0; j < init.length; j++) { - if (init[j] == i) { - double y2 = y + yScale * ((j + 1) * 104 - 10); - drawLines(Arrays.asList(new Vec2f(x + xScale * 25, (float) y1 + yScale * 12), - new Vec2f(x + width - (int) (xScale * 25), (float) y2 + yScale * 12)), color, color, 5); - break; - } - } - } - } - for (int i = 0; i < 4; i++) { - double y1 = y + yScale * ((i + 1) * 104 - 10); - int color = colors[i]; - - if (dragged == i) { - drawLines( - Arrays.asList(new Vec2f(x + xScale * 25, (float) y1 + yScale * 12), new Vec2f(mouseX, mouseY)), - color, color, 5); - } - - // left - wire.drawSubArea(x + (int) (xScale * 25), y1 - yScale * 5, (int) (xScale * 38), (int) (yScale * 32), 0, 0, - 0.5, 1); - setColor(color); - wire_base.drawSubArea(x, (int) y1, (int) (xScale * 50), (int) (yScale * 32), 0, 0, 0.5, 1); - GlStateManager.color(1, 1, 1, 1); - - // right - wire.drawSubArea(x + width - (int) (xScale * (25 + 38)), y1 - yScale * 5, (int) (xScale * 38), - (int) (yScale * 32), 0.5, 0, 0.5, 1); - setColor(colors[init[i]]); - wire_base.drawSubArea(x + width - (int) (xScale * 50), (int) y1, (int) (xScale * 50), (int) (yScale * 32), - 0.5, 0, 0.5, 1); - GlStateManager.color(1, 1, 1, 1); - } - } - - @Override - public boolean mouseClicked(int mouseX, int mouseY, int button) { - int over = isMouseOverWire(mouseX, mouseY, true); - ItemStack holdStack = this.gui.entityPlayer.inventory.getItemStack(); - if (over != -1 && !connect[over] && (hoverItemCheck == null || hoverItemCheck.test(over, holdStack))) { - dragged = over; - } - return super.mouseClicked(mouseX, mouseY, button); - } - - @Override - public boolean mouseDragged(int mouseX, int mouseY, int button, long timeDragged) { - return super.mouseDragged(mouseX, mouseY, button, timeDragged); - } - - @Override - public boolean mouseReleased(int mouseX, int mouseY, int button) { - if (dragged != -1) { - int over = isMouseOverWire(mouseX, mouseY, false); - if (over != -1 && init[over] == dragged) { - connect[dragged] = true; - writeClientAction(5, buffer -> buffer.writeVarInt(dragged)); - } - } - dragged = -1; - return super.mouseReleased(mouseX, mouseY, button); - } - - @Override - public void handleClientAction(int id, PacketBuffer buffer) { - if (id == 5) { - int connected = buffer.readVarInt(); - connect[connected] = true; - if (onConnected != null) { - onConnected.accept(connected); - } - if (connect[0] && connect[1] && connect[2] && connect[3] && onFinished != null) { - onFinished.run(); - } - } - } -} diff --git a/src/main/java/gregtech/common/gui/widget/terminal/gui/widgets/SelectorWidget.java b/src/main/java/gregtech/common/gui/widget/terminal/gui/widgets/SelectorWidget.java deleted file mode 100644 index 20e0bf030b5..00000000000 --- a/src/main/java/gregtech/common/gui/widget/terminal/gui/widgets/SelectorWidget.java +++ /dev/null @@ -1,144 +0,0 @@ -package gregtech.common.gui.widget.terminal.gui.widgets; - -import gregtech.api.gui.resources.IGuiTexture; -import gregtech.api.gui.widgets.SimpleTextWidget; -import gregtech.api.gui.widgets.WidgetGroup; -import gregtech.api.util.Position; -import gregtech.api.util.Size; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.client.resources.I18n; -import net.minecraft.network.PacketBuffer; - -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Supplier; - -public class SelectorWidget extends WidgetGroup { - - protected RectButtonWidget button; - protected List candidates; - protected boolean isShow; - private IGuiTexture background; - private Consumer onChanged; - private Consumer onShowChange; - private boolean isUp; - private final int fontColor; - - public SelectorWidget(int x, int y, int width, int height, List candidates, int fontColor, - Supplier supplier, boolean isClient) { - super(new Position(x, y), new Size(width, height)); - this.button = new RectButtonWidget(0, 0, width, height); - this.candidates = candidates; - this.fontColor = fontColor; - button.setClickListener(d -> { - if (onShowChange != null) { - onShowChange.accept(!isShow); - } - isShow = !isShow; - }); - this.addWidget(button); - this.addWidget(new SimpleTextWidget(width / 2, height / 2, "", fontColor, supplier, isClient)); - } - - public SelectorWidget setIsUp(boolean isUp) { - this.isUp = isUp; - return this; - } - - public SelectorWidget setHoverText(String text) { - button.setHoverText(text); - return this; - } - - public SelectorWidget setOnChanged(Consumer onChanged) { - this.onChanged = onChanged; - return this; - } - - public SelectorWidget setOnShowChange(Consumer onShowChange) { - this.onShowChange = onShowChange; - return this; - } - - public SelectorWidget setColors(int stroke, int anima, int fill) { - button.setColors(stroke, anima, fill); - return this; - } - - public SelectorWidget setButtonBackground(IGuiTexture guiTexture) { - button.setIcon(guiTexture); - return this; - } - - public SelectorWidget setBackground(IGuiTexture background) { - this.background = background; - return this; - } - - public void hide() { - this.isShow = false; - } - - @Override - public void drawInForeground(int mouseX, int mouseY) { - super.drawInForeground(mouseX, mouseY); - if (isShow) { - int x = getPosition().x; - int width = getSize().width; - int height = getSize().height; - int y = (isUp ? -candidates.size() : 1) * height + getPosition().y; - FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer; - for (String candidate : candidates) { - if (background != null) { - background.draw(x, y, width, height); - } else { - drawSolidRect(x, y, width, height, 0xAA000000); - } - fontRenderer.drawString(I18n.format(candidate), x + 4, y + (height - fontRenderer.FONT_HEIGHT) / 2 + 1, - fontColor); - y += height; - } - y = (isUp ? -candidates.size() : 1) * height + getPosition().y; - for (String ignored : candidates) { - if (isMouseOver(x, y, width, height, mouseX, mouseY)) { - drawBorder(x, y, width, height, -1, 1); - } - y += height; - } - } - } - - @Override - public boolean mouseClicked(int mouseX, int mouseY, int button) { - if (isShow) { - int x = getPosition().x; - int width = getSize().width; - int height = getSize().height; - int y = (isUp ? -candidates.size() : 1) * height + getPosition().y; - for (String candidate : candidates) { - if (isMouseOver(x, y, width, height, mouseX, mouseY)) { - if (onChanged != null) { - onChanged.accept(candidate); - } - writeClientAction(2, buffer -> buffer.writeString(candidate)); - isShow = false; - return true; - } - y += height; - } - } - return super.mouseClicked(mouseX, mouseY, button); - } - - @Override - public void handleClientAction(int id, PacketBuffer buffer) { - super.handleClientAction(id, buffer); - if (id == 2) { - if (onChanged != null) { - onChanged.accept(buffer.readString(Short.MAX_VALUE)); - } - } - } -} diff --git a/src/main/java/gregtech/common/inventory/handlers/TapeItemStackHandler.java b/src/main/java/gregtech/common/inventory/handlers/TapeItemStackHandler.java deleted file mode 100644 index 4fd4729126b..00000000000 --- a/src/main/java/gregtech/common/inventory/handlers/TapeItemStackHandler.java +++ /dev/null @@ -1,25 +0,0 @@ -package gregtech.common.inventory.handlers; - -import gregtech.api.items.itemhandlers.GTItemStackHandler; -import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.common.items.MetaItems; - -import net.minecraft.item.ItemStack; - -import org.jetbrains.annotations.NotNull; - -public class TapeItemStackHandler extends GTItemStackHandler { - - public TapeItemStackHandler(MetaTileEntity metaTileEntity, int size) { - super(metaTileEntity, size); - } - - @Override - @NotNull - public ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) { - if (!stack.isEmpty() && stack.isItemEqual(MetaItems.DUCT_TAPE.getStackForm())) { - return super.insertItem(slot, stack, simulate); - } - return stack; - } -} diff --git a/src/main/java/gregtech/common/items/MetaItem1.java b/src/main/java/gregtech/common/items/MetaItem1.java index b528f3c1041..2182515bad8 100644 --- a/src/main/java/gregtech/common/items/MetaItem1.java +++ b/src/main/java/gregtech/common/items/MetaItem1.java @@ -7,7 +7,6 @@ import gregtech.api.items.metaitem.FilteredFluidStats; import gregtech.api.items.metaitem.FoodStats; import gregtech.api.items.metaitem.MetaItem; -import gregtech.api.items.metaitem.MusicDiscStats; import gregtech.api.items.metaitem.StandardMetaItem; import gregtech.api.items.metaitem.stats.IItemComponent; import gregtech.api.items.metaitem.stats.IItemContainerItemProvider; @@ -59,7 +58,6 @@ import gregtech.common.items.behaviors.monitorplugin.FakeGuiPluginBehavior; import gregtech.common.items.behaviors.monitorplugin.OnlinePicPluginBehavior; import gregtech.common.items.behaviors.monitorplugin.TextPluginBehavior; -import gregtech.core.sound.GTSoundEvents; import net.minecraft.client.resources.I18n; import net.minecraft.creativetab.CreativeTabs; @@ -1164,8 +1162,6 @@ public void registerSubItems() { PLUGIN_TEXT = addItem(783, "plugin.text").addComponents(new TextPluginBehavior()); // Records: 800-819 - SUS_RECORD = addItem(800, "record.sus").addComponents(new MusicDiscStats(GTSoundEvents.SUS_RECORD)) - .setRarity(EnumRarity.RARE).setMaxStackSize(1).setInvisible(); // Dyed Glass Lenses: 820-840 for (int i = 0; i < MarkerMaterials.Color.VALUES.length; i++) { @@ -1181,7 +1177,8 @@ public void registerSubItems() { BLACKLIGHT = addItem(1002, "blacklight"); LOGO = addItem(1003, "logo").setInvisible(); - LOGO.getMetaItem().addPropertyOverride(new ResourceLocation("xmas"), (s, w, e) -> GTValues.XMAS.get() ? 1 : 0); + LOGO.getMetaItem().addPropertyOverride(new ResourceLocation("xmas"), + (s, w, e) -> GTValues.isXMAS() ? 1 : 0); MULTIBLOCK_BUILDER = addItem(1004, "tool.multiblock_builder").addComponents(new MultiblockBuilderBehavior()) .setMaxStackSize(1); diff --git a/src/main/java/gregtech/common/items/MetaItems.java b/src/main/java/gregtech/common/items/MetaItems.java index 23c49bb279f..3c77ebb18fe 100644 --- a/src/main/java/gregtech/common/items/MetaItems.java +++ b/src/main/java/gregtech/common/items/MetaItems.java @@ -563,7 +563,6 @@ private MetaItems() {} public static MetaItem.MetaValueItem POWER_THRUSTER_ADVANCED; public static MetaItem.MetaValueItem GRAVITATION_ENGINE; - public static MetaItem.MetaValueItem SUS_RECORD; public static MetaItem.MetaValueItem NAN_CERTIFICATE; public static MetaItem.MetaValueItem FERTILIZER; diff --git a/src/main/java/gregtech/common/metatileentities/MetaTileEntityRegistration.java b/src/main/java/gregtech/common/metatileentities/MetaTileEntityRegistration.java index 55cd52e5cd4..2f9379c385a 100644 --- a/src/main/java/gregtech/common/metatileentities/MetaTileEntityRegistration.java +++ b/src/main/java/gregtech/common/metatileentities/MetaTileEntityRegistration.java @@ -682,7 +682,7 @@ private static void miscSingleblocks() { // creative machines 5650-5659 MetaTileEntities.CREATIVE_ENERGY = MetaTileEntities.registerMetaTileEntity(5650, - new MetaTileEntityCreativeEnergy()); + new MetaTileEntityCreativeEnergy(gregtechId("infinite_energy"))); MetaTileEntities.CREATIVE_CHEST = MetaTileEntities.registerMetaTileEntity(5651, new MetaTileEntityCreativeChest(gregtechId("creative_chest"))); MetaTileEntities.CREATIVE_TANK = MetaTileEntities.registerMetaTileEntity(5652, diff --git a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityAlarm.java b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityAlarm.java index 8e0518fb935..58efbe422fb 100644 --- a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityAlarm.java +++ b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityAlarm.java @@ -1,47 +1,59 @@ package gregtech.common.metatileentities.electric; -import gregtech.api.GTValues; import gregtech.api.GregTechAPI; import gregtech.api.capability.GregtechDataCodes; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.widgets.ImageWidget; -import gregtech.api.gui.widgets.LabelWidget; -import gregtech.api.gui.widgets.TextFieldWidget2; 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.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.client.renderer.texture.Textures; -import gregtech.common.ConfigHolder; -import gregtech.common.gui.widget.terminal.gui.widgets.SelectorWidget; import gregtech.core.sound.GTSoundEvents; import net.minecraft.client.resources.I18n; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.SoundEvents; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundEvent; import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.IPanelHandler; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.widget.IWidget; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.utils.Alignment; +import com.cleanroommc.modularui.value.sync.IntSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncHandler; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.SyncHandler; +import com.cleanroommc.modularui.widgets.ButtonWidget; +import com.cleanroommc.modularui.widgets.ListWidget; +import com.cleanroommc.modularui.widgets.layout.Flow; +import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Arrays; +import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; -public class MetaTileEntityAlarm extends TieredMetaTileEntity { +public class MetaTileEntityAlarm extends TieredMetaTileEntity implements IMetaTileEntityGuiHolder { - private SoundEvent selectedSound; + public static final int BASE_EU_CONSUMPTION = 4; private boolean isActive; private int radius = 64; - public static final int BASE_EU_CONSUMPTION = 4; + + @NotNull + private SoundEvent selectedSound; + private static final List sounds = new ArrayList<>(5); public MetaTileEntityAlarm(ResourceLocation metaTileEntityId) { super(metaTileEntityId, 1); @@ -72,49 +84,105 @@ public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, } @Override - protected ModularUI createUI(EntityPlayer entityPlayer) { - return ModularUI.builder(GuiTextures.BACKGROUND, 240, 86) - .widget(new LabelWidget(10, 5, getMetaFullName())) - .widget(new SelectorWidget(10, 20, 220, 20, - getSounds().stream().map(this::getNameOfSound) - .collect(Collectors.toList()), - 0x555555, () -> getNameOfSound(this.selectedSound), true).setOnChanged((v) -> { - if (this.getWorld().isRemote) - GregTechAPI.soundManager.stopTileSound(getPos()); - SoundEvent newSound = SoundEvent.REGISTRY.getObject(new ResourceLocation(v)); - if (this.selectedSound != newSound) { - this.selectedSound = SoundEvent.REGISTRY.getObject(new ResourceLocation(v)); - this.writeCustomData(GregtechDataCodes.UPDATE_SOUND, - (writer) -> writer - .writeResourceLocation(getResourceLocationOfSound(this.selectedSound))); - } - })) - .widget(new ImageWidget(10, 54, 220, 20, GuiTextures.DISPLAY)) - .label(10, 44, "gregtech.gui.alarm.radius") - .widget(new TextFieldWidget2(12, 60, 216, 16, () -> String.valueOf(radius), value -> { - if (!value.isEmpty()) { - int newRadius = Integer.parseInt(value); - if (newRadius != radius) { - this.writeCustomData(GregtechDataCodes.UPDATE_RADIUS, - (writer) -> writer.writeInt(newRadius)); - radius = newRadius; - } - } - }).setMaxLength(10).setNumbersOnly(0, 128)) - .build(this.getHolder(), entityPlayer); - } - - protected List getSounds() { - if (GTValues.FOOLS.get() && ConfigHolder.misc.specialEvents) { - return Arrays.asList(GTSoundEvents.DEFAULT_ALARM, GTSoundEvents.ARC, SoundEvents.ENTITY_WOLF_HOWL, - SoundEvents.ENTITY_ENDERMEN_DEATH, GTSoundEvents.SUS_RECORD); - } - return Arrays.asList(GTSoundEvents.DEFAULT_ALARM, GTSoundEvents.ARC, SoundEvents.ENTITY_WOLF_HOWL, - SoundEvents.ENTITY_ENDERMEN_DEATH); + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager panelSyncManager, + UISettings settings) { + IntSyncValue radiusSync = new IntSyncValue(this::getRadius, this::setRadius); + SoundEventSyncHandler soundEventSyncHandler = new SoundEventSyncHandler(); + panelSyncManager.syncValue("alarm_data", 0, soundEventSyncHandler); + IPanelHandler soundSelector = panelSyncManager.syncedPanel("sound_selector_popup", true, + createSoundsPopup(soundEventSyncHandler)); + + // TODO: Change the position of the name when it's standardized. + return GTGuis.createPanel(this, 200, 58) + .child(Flow.column() + .margin(5) + .coverChildrenHeight() + .crossAxisAlignment(Alignment.CrossAxis.START) + .child(IKey.lang("gregtech.gui.alarm.radius") + .asWidget()) + .child(new TextFieldWidget() + .widthRel(1.0f) + .margin(0, 2) + .height(16) + .setMaxLength(10) + .setNumbers(0, 128) + .value(radiusSync) + .background(GTGuiTextures.DISPLAY)) + .child(Flow.row() + .widthRel(1.0f) + .coverChildrenHeight() + .mainAxisAlignment(Alignment.MainAxis.START) + .childPadding(2) + .child(new ButtonWidget<>() + .size(18) + .onMousePressed(mouse -> { + guiData.getPlayer().playSound(selectedSound, 1.0f, 1.0f); + // returns false so the default click sound isn't played + return false; + }) + .overlay(GTGuiTextures.SPEAKER_ICON.asIcon() + .size(18)) + .addTooltipLine(IKey.lang("gregtech.gui.alarm.sounds_preview_button"))) + .child(new ButtonWidget<>() + .size(18) + .onMousePressed(mouse -> { + if (soundSelector.isPanelOpen()) { + soundSelector.closePanel(); + } else { + soundSelector.openPanel(); + } + + return true; + }) + .overlay(GTGuiTextures.FILTER_SETTINGS_OVERLAY.asIcon() + .size(16)) + .addTooltipLine(IKey.lang("gregtech.gui.alarm.sounds_popup_button"))) + .child(IKey.dynamic(() -> getSoundName(selectedSound)) + .asWidget() + .alignY(0.5f) + .expanded() + .addTooltipLine(IKey.lang("gregtech.gui.alarm.selected_sound"))))); + } + + protected PanelSyncHandler.IPanelBuilder createSoundsPopup(@NotNull MetaTileEntityAlarm.SoundEventSyncHandler soundEventSyncHandler) { + return (syncManager, syncHandler) -> { + List soundList = new ArrayList<>(sounds.size()); + + for (SoundEvent sound : sounds) { + ResourceLocation name = getSoundResourceLocation(sound); + soundList.add(Flow.row() + .widthRel(1.0f) + .coverChildrenHeight() + .margin(4, 1) + .child(new ButtonWidget<>() + .widthRel(1.0f) + .onMousePressed(mouse -> { + soundEventSyncHandler.setSound(name); + syncHandler.closePanel(); + return true; + }) + .overlay(IKey.str(name.toString())))); + } + + return GTGuis.createPopupPanel("sound_selector", 200, 100) + .child(Flow.column() + .margin(5) + .child(IKey.lang("gregtech.gui.alarm.sounds") + .asWidget()) + .child(new ListWidget<>() + .left(2) + .right(2) + .marginTop(6) + .marginBottom(4) + .expanded() + .children(soundList) + .background(GTGuiTextures.DISPLAY.asIcon() + .margin(0, -2)))); + }; } @Override - public SoundEvent getSound() { + public @Nullable SoundEvent getSound() { return selectedSound; } @@ -139,16 +207,16 @@ public void update() { } @Override - public void receiveCustomData(int dataId, PacketBuffer buf) { + public void receiveCustomData(int dataId, @NotNull PacketBuffer buf) { super.receiveCustomData(dataId, buf); if (dataId == GregtechDataCodes.UPDATE_ACTIVE) { - this.isActive = buf.readBoolean(); - this.scheduleRenderUpdate(); - } else if (dataId == GregtechDataCodes.UPDATE_SOUND) { - this.selectedSound = SoundEvent.REGISTRY.getObject(buf.readResourceLocation()); - GregTechAPI.soundManager.stopTileSound(getPos()); + isActive = buf.readBoolean(); + scheduleRenderUpdate(); } else if (dataId == GregtechDataCodes.UPDATE_RADIUS) { - this.radius = buf.readInt(); + radius = buf.readVarInt(); + GregTechAPI.soundManager.stopTileSound(getPos()); + } else if (dataId == GregtechDataCodes.UPDATE_SOUND) { + selectedSound = getSound(buf.readResourceLocation()); GregTechAPI.soundManager.stopTileSound(getPos()); } } @@ -158,26 +226,35 @@ public float getVolume() { return radius / 16f; } - @Override - public void receiveInitialSyncData(PacketBuffer buf) { - super.receiveInitialSyncData(buf); - this.isActive = buf.readBoolean(); - this.selectedSound = SoundEvent.REGISTRY.getObject(buf.readResourceLocation()); - this.radius = buf.readInt(); + public int getRadius() { + return radius; + } + + public void setRadius(int radius) { + this.radius = radius; + GregTechAPI.soundManager.stopTileSound(getPos()); } @Override - public void writeInitialSyncData(PacketBuffer buf) { + public void writeInitialSyncData(@NotNull PacketBuffer buf) { super.writeInitialSyncData(buf); - buf.writeBoolean(this.isActive); - buf.writeResourceLocation(getResourceLocationOfSound(this.selectedSound)); - buf.writeInt(this.radius); + buf.writeBoolean(isActive); + buf.writeResourceLocation(getSoundResourceLocation(selectedSound)); + buf.writeVarInt(radius); + } + + @Override + public void receiveInitialSyncData(@NotNull PacketBuffer buf) { + super.receiveInitialSyncData(buf); + isActive = buf.readBoolean(); + selectedSound = getSound(buf.readResourceLocation()); + radius = buf.readVarInt(); } @Override public NBTTagCompound writeToNBT(NBTTagCompound data) { data.setBoolean("isActive", this.isActive); - data.setString("selectedSound", getNameOfSound(this.selectedSound)); + data.setString("selectedSound", getSoundName(selectedSound)); data.setInteger("radius", this.radius); return super.writeToNBT(data); } @@ -185,16 +262,54 @@ public NBTTagCompound writeToNBT(NBTTagCompound data) { @Override public void readFromNBT(NBTTagCompound data) { this.isActive = data.getBoolean("isActive"); - this.selectedSound = SoundEvent.REGISTRY.getObject(new ResourceLocation(data.getString("selectedSound"))); + this.selectedSound = getSound(data.getString("selectedSound")); this.radius = data.getInteger("radius"); super.readFromNBT(data); } - public String getNameOfSound(SoundEvent sound) { - return getResourceLocationOfSound(sound).toString(); + public static void addSound(@NotNull SoundEvent soundEvent) { + sounds.add(soundEvent); } - public ResourceLocation getResourceLocationOfSound(SoundEvent sound) { + public static String getSoundName(@NotNull SoundEvent sound) { + return getSoundResourceLocation(sound).toString(); + } + + public static ResourceLocation getSoundResourceLocation(@NotNull SoundEvent sound) { return SoundEvent.REGISTRY.getNameForObject(sound); } + + public static @NotNull SoundEvent getSound(@NotNull String name) { + return getSound(new ResourceLocation(name)); + } + + public static @NotNull SoundEvent getSound(@NotNull ResourceLocation name) { + SoundEvent sound = SoundEvent.REGISTRY.getObject(name); + return sound == null ? GTSoundEvents.DEFAULT_ALARM : sound; + } + + public class SoundEventSyncHandler extends SyncHandler { + + public SoundEventSyncHandler() {} + + @Override + public void readOnClient(int id, PacketBuffer buf) {} + + @Override + public void readOnServer(int id, PacketBuffer buf) { + if (id == 0) { + selectedSound = getSound(buf.readResourceLocation()); + writeCustomData(GregtechDataCodes.UPDATE_SOUND, + toClients -> toClients.writeResourceLocation(getSoundResourceLocation(selectedSound))); + markDirty(); + } + } + + @SideOnly(Side.CLIENT) + public void setSound(@NotNull ResourceLocation name) { + if (getSoundResourceLocation(selectedSound).equals(name)) return; + selectedSound = getSound(name); + syncToServer(0, buf -> buf.writeResourceLocation(name)); + } + } } diff --git a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityBatteryBuffer.java b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityBatteryBuffer.java index ca26c1cba5c..d615d05ca77 100644 --- a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityBatteryBuffer.java +++ b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityBatteryBuffer.java @@ -10,6 +10,8 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.texture.Textures; import gregtech.client.utils.PipelineUtil; @@ -36,7 +38,6 @@ 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.screen.UISettings; import com.cleanroommc.modularui.value.sync.PanelSyncManager; @@ -50,7 +51,8 @@ import java.util.ArrayList; import java.util.List; -public class MetaTileEntityBatteryBuffer extends TieredMetaTileEntity implements IControllable, IDataInfoProvider { +public class MetaTileEntityBatteryBuffer extends TieredMetaTileEntity + implements IControllable, IDataInfoProvider, IMetaTileEntityGuiHolder { private final int inventorySize; private boolean allowEnergyOutput = true; @@ -144,12 +146,8 @@ protected void initializeInventory() { } @Override - public boolean usesMui2() { - return true; - } - - @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager guiSyncManager, + UISettings settings) { int rowSize = (int) Math.sqrt(inventorySize); int colSize = rowSize; if (inventorySize == 8) { diff --git a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityBlockBreaker.java b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityBlockBreaker.java index 65e4e3a76fb..58eca4b9595 100644 --- a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityBlockBreaker.java +++ b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityBlockBreaker.java @@ -6,6 +6,8 @@ import gregtech.api.metatileentity.TieredMetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.api.util.BlockUtility; import gregtech.api.util.GTTransferUtils; import gregtech.api.util.GregFakePlayer; @@ -42,7 +44,6 @@ 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.screen.UISettings; import com.cleanroommc.modularui.value.sync.PanelSyncManager; @@ -60,7 +61,7 @@ import static gregtech.api.capability.GregtechDataCodes.UPDATE_OUTPUT_FACING; -public class MetaTileEntityBlockBreaker extends TieredMetaTileEntity { +public class MetaTileEntityBlockBreaker extends TieredMetaTileEntity implements IMetaTileEntityGuiHolder { private EnumFacing outputFacing; private int breakProgressTicksLeft; @@ -317,12 +318,8 @@ protected IItemHandlerModifiable createExportItemHandler() { } @Override - public boolean usesMui2() { - return true; - } - - @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager guiSyncManager, + UISettings settings) { int rowSize = (int) Math.sqrt(getInventorySize()); guiSyncManager.registerSlotGroup("item_inv", rowSize); diff --git a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityCharger.java b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityCharger.java index b5fef8cc815..3de1f29ce76 100644 --- a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityCharger.java +++ b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityCharger.java @@ -1,33 +1,38 @@ package gregtech.common.metatileentities.electric; import gregtech.api.GTValues; -import gregtech.api.capability.GregtechCapabilities; -import gregtech.api.capability.IElectricItem; import gregtech.api.capability.impl.EnergyContainerBatteryCharger; -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.MetaTileEntity; import gregtech.api.metatileentity.TieredMetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; -import gregtech.common.ConfigHolder; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuis; +import gregtech.api.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; +import gregtech.api.mui.drawable.BatteryIndicatorDrawable; +import gregtech.api.util.GTUtility; 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; -import net.minecraftforge.energy.CapabilityEnergy; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemStackHandler; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.SyncHandlers; +import com.cleanroommc.modularui.widgets.SlotGroupWidget; +import com.cleanroommc.modularui.widgets.layout.Grid; +import com.cleanroommc.modularui.widgets.slot.ItemSlot; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; -public class MetaTileEntityCharger extends TieredMetaTileEntity { +public class MetaTileEntityCharger extends TieredMetaTileEntity implements IMetaTileEntityGuiHolder { private final int inventorySize; @@ -60,12 +65,10 @@ protected void onContentsChanged(int slot) { @NotNull @Override public ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) { - IElectricItem electricItem = stack.getCapability(GregtechCapabilities.CAPABILITY_ELECTRIC_ITEM, null); - if ((electricItem != null && getTier() >= electricItem.getTier()) || - (ConfigHolder.compat.energy.nativeEUToFE && - stack.hasCapability(CapabilityEnergy.ENERGY, null))) { + if (GTUtility.isItemChargableWithEU(stack, getTier())) { return super.insertItem(slot, stack, simulate); } + return stack; } @@ -83,21 +86,31 @@ protected void initializeInventory() { } @Override - protected ModularUI createUI(EntityPlayer entityPlayer) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager panelSyncManager, + UISettings settings) { int rowSize = (int) Math.sqrt(inventorySize); - 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(importItems, index, 89 - rowSize * 9 + x * 18, 18 + y * 18, true, true) - .setBackgroundTexture(GuiTextures.SLOT, GuiTextures.CHARGER_OVERLAY)); - } - } - builder.bindPlayerInventory(entityPlayer.inventory, GuiTextures.SLOT, 7, 18 + 18 * rowSize + 12); - return builder.build(getHolder(), entityPlayer); + panelSyncManager.registerSlotGroup("slots", rowSize); + + return GTGuis.createPanel(this, 176, 18 + 18 * rowSize + 94) + .child(IKey.lang(getMetaFullName()) + .asWidget() + .pos(5, 5)) + .child(new Grid() + .top(18) + .height(rowSize * 18) + .minElementMargin(0, 0) + .minColWidth(18).minRowHeight(18) + .alignX(0.5f) + .mapTo(rowSize, rowSize * rowSize, index -> new ItemSlot() + .slot(SyncHandlers.itemSlot(importItems, index) + .slotGroup("slots")) + .background(GTGuiTextures.SLOT, GTGuiTextures.CHARGER_OVERLAY, + new BatteryIndicatorDrawable( + () -> GTUtility.itemChargeLevel(importItems.getStackInSlot(index)), + 0.85f)))) + .child(SlotGroupWidget.playerInventory(false) + .bottom(7) + .left(7)); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityFisher.java b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityFisher.java index 44c55e814cf..268b4e0f124 100644 --- a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityFisher.java +++ b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityFisher.java @@ -7,6 +7,8 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.api.unification.OreDictUnifier; import gregtech.api.util.GTTransferUtils; import gregtech.client.renderer.texture.Textures; @@ -30,7 +32,6 @@ 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.screen.UISettings; import com.cleanroommc.modularui.value.sync.PanelSyncManager; @@ -44,7 +45,7 @@ import java.util.ArrayList; import java.util.List; -public class MetaTileEntityFisher extends TieredMetaTileEntity { +public class MetaTileEntityFisher extends TieredMetaTileEntity implements IMetaTileEntityGuiHolder { private static final int WATER_CHECK_SIZE = 25; @@ -66,12 +67,8 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) { } @Override - public boolean usesMui2() { - return true; - } - - @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager guiSyncManager, + UISettings settings) { int rowSize = (int) Math.sqrt(inventorySize); guiSyncManager.registerSlotGroup("item_in", 1); guiSyncManager.registerSlotGroup("item_out", rowSize); diff --git a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityItemCollector.java b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityItemCollector.java index f28489a4add..43c7f049832 100644 --- a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityItemCollector.java +++ b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityItemCollector.java @@ -1,25 +1,23 @@ 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.ClickButtonWidget; -import gregtech.api.gui.widgets.ImageWidget; -import gregtech.api.gui.widgets.SimpleTextWidget; -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.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.api.util.GTTransferUtils; +import gregtech.api.util.KeyUtil; +import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleOverlayRenderer; import gregtech.common.covers.filter.ItemFilterContainer; 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.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; @@ -28,6 +26,7 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; +import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fml.relauncher.Side; @@ -37,14 +36,29 @@ 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.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.utils.Alignment; +import com.cleanroommc.modularui.value.sync.BooleanSyncValue; +import com.cleanroommc.modularui.value.sync.IntSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.SyncHandlers; +import com.cleanroommc.modularui.widgets.ButtonWidget; +import com.cleanroommc.modularui.widgets.SlotGroupWidget; +import com.cleanroommc.modularui.widgets.ToggleButton; +import com.cleanroommc.modularui.widgets.layout.Flow; +import com.cleanroommc.modularui.widgets.layout.Grid; +import com.cleanroommc.modularui.widgets.slot.ItemSlot; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; import static gregtech.api.capability.GregtechDataCodes.IS_WORKING; +import static gregtech.api.capability.GregtechDataCodes.UPDATE_AUTO_OUTPUT_ITEMS; -public class MetaTileEntityItemCollector extends TieredMetaTileEntity { +public class MetaTileEntityItemCollector extends TieredMetaTileEntity implements IMetaTileEntityGuiHolder { private static final int[] INVENTORY_SIZES = { 4, 9, 16, 25, 25 }; private static final double MOTION_MULTIPLIER = 0.04; @@ -55,6 +69,7 @@ public class MetaTileEntityItemCollector extends TieredMetaTileEntity { private AxisAlignedBB areaBoundingBox; private BlockPos areaCenterPos; private boolean isWorking; + private boolean autoOutput = false; private final ItemFilterContainer itemFilter; public MetaTileEntityItemCollector(ResourceLocation metaTileEntityId, int tier, int maxItemSuckingRange) { @@ -71,12 +86,16 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) { } @Override + @SideOnly(Side.CLIENT) public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, IVertexOperation[] pipeline) { super.renderMetaTileEntity(renderState, translation, pipeline); SimpleOverlayRenderer renderer = isWorking ? Textures.BLOWER_ACTIVE_OVERLAY : Textures.BLOWER_OVERLAY; renderer.renderSided(EnumFacing.UP, renderState, translation, pipeline); Textures.AIR_VENT_OVERLAY.renderSided(EnumFacing.DOWN, renderState, translation, pipeline); Textures.PIPE_OUT_OVERLAY.renderSided(getFrontFacing(), renderState, translation, pipeline); + if (autoOutput) { + Textures.ITEM_OUTPUT_OVERLAY.renderSided(getFrontFacing(), renderState, translation, pipeline); + } } protected int getEnergyConsumedPerTick() { @@ -84,23 +103,28 @@ protected int getEnergyConsumedPerTick() { } @Override - public void writeInitialSyncData(PacketBuffer buf) { + public void writeInitialSyncData(@NotNull PacketBuffer buf) { super.writeInitialSyncData(buf); buf.writeBoolean(isWorking); + buf.writeBoolean(autoOutput); } @Override - public void receiveInitialSyncData(PacketBuffer buf) { + public void receiveInitialSyncData(@NotNull PacketBuffer buf) { super.receiveInitialSyncData(buf); this.isWorking = buf.readBoolean(); + this.autoOutput = buf.readBoolean(); } @Override - public void receiveCustomData(int dataId, PacketBuffer buf) { + public void receiveCustomData(int dataId, @NotNull PacketBuffer buf) { super.receiveCustomData(dataId, buf); if (dataId == IS_WORKING) { this.isWorking = buf.readBoolean(); scheduleRenderUpdate(); + } else if (dataId == UPDATE_AUTO_OUTPUT_ITEMS) { + this.autoOutput = buf.readBoolean(); + scheduleRenderUpdate(); } } @@ -131,6 +155,10 @@ public void update() { moveItemsInEffectRange(); } + if (autoOutput && getOffsetTimer() % 5 == 0) { + pushItemsIntoNearbyHandlers(getFrontFacing()); + } + if (isWorkingNow != isWorking) { this.isWorking = isWorkingNow; writeCustomData(IS_WORKING, buffer -> buffer.writeBoolean(isWorkingNow)); @@ -166,9 +194,6 @@ protected void moveItemsInEffectRange() { } } } - if (getOffsetTimer() % 5 == 0) { - pushItemsIntoNearbyHandlers(getFrontFacing()); - } } @Override @@ -211,6 +236,7 @@ public NBTTagCompound writeToNBT(NBTTagCompound data) { super.writeToNBT(data); data.setInteger("CollectRange", itemSuckingRange); data.setTag("Filter", itemFilter.serializeNBT()); + data.setBoolean("AutoOutput", autoOutput); return data; } @@ -219,6 +245,9 @@ public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); this.itemSuckingRange = data.getInteger("CollectRange"); this.itemFilter.deserializeNBT(data.getCompoundTag("Filter")); + if (data.hasKey("AutoOutput")) { + this.autoOutput = data.getBoolean("AutoOutput"); + } } protected void setItemSuckingRange(int itemSuckingRange) { @@ -227,33 +256,96 @@ protected void setItemSuckingRange(int itemSuckingRange) { markDirty(); } - protected void adjustSuckingRange(int amount) { - setItemSuckingRange(MathHelper.clamp(itemSuckingRange + amount, 1, maxItemSuckingRange)); + public int getItemSuckingRange() { + return itemSuckingRange; + } + + protected void setAutoOutput(boolean autoOutput) { + this.autoOutput = autoOutput; + if (!getWorld().isRemote) { + writeCustomData(UPDATE_AUTO_OUTPUT_ITEMS, buf -> buf.writeBoolean(autoOutput)); + markDirty(); + } + } + + public boolean autoOutputs() { + return autoOutput; } @Override - protected ModularUI createUI(EntityPlayer entityPlayer) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager panelSyncManager, + UISettings settings) { int rowSize = (int) Math.sqrt(exportItems.getSlots()); - Builder builder = ModularUI.builder(GuiTextures.BACKGROUND, 176, - 45 + rowSize * 18 + 105 + 82) - .label(10, 5, getMetaFullName()); - - builder.widget(new ClickButtonWidget(10, 20, 20, 20, "-1", data -> adjustSuckingRange(-1))); - builder.widget(new ClickButtonWidget(146, 20, 20, 20, "+1", data -> adjustSuckingRange(+1))); - builder.widget(new ImageWidget(30, 20, 116, 20, GuiTextures.DISPLAY)); - builder.widget(new SimpleTextWidget(88, 30, "gregtech.machine.item_collector.gui.collect_range", 0xFFFFFF, - () -> Integer.toString(itemSuckingRange))); - - 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, 45 + y * 18, true, false) - .setBackgroundTexture(GuiTextures.SLOT)); - } - } - // this.itemFilter.initUI(45 + rowSize * 18 + 5, builder::widget); - builder.bindPlayerInventory(entityPlayer.inventory, GuiTextures.SLOT, 7, 45 + rowSize * 18 + 105); - return builder.build(getHolder(), entityPlayer); + IntSyncValue rangeSync = SyncHandlers.intNumber(this::getItemSuckingRange, this::setItemSuckingRange); + BooleanSyncValue autoOutputSync = SyncHandlers.bool(this::autoOutputs, this::setAutoOutput); + + panelSyncManager.syncValue("range", 0, rangeSync); + + return GTGuis.createPanel(this, 176, 45 + rowSize * 18 + 35 + 82) + .child(Flow.column() + .margin(5) + .coverChildrenHeight() + .child(IKey.lang(getMetaFullName()) + .asWidget() + .alignX(0.0f)) + .child(Flow.row() + .widthRel(1.0f) + .coverChildrenHeight() + .margin(0, 4) + .child(new ButtonWidget<>() + .marginRight(5) + .size(20) + .onMousePressed(mouse -> { + int range = rangeSync.getIntValue(); + if (range > 1) { + rangeSync.setIntValue(range - 1); + } + return true; + }) + .overlay(IKey.str("-1"))) + .child(KeyUtil.lang(TextFormatting.WHITE, + "gregtech.machine.item_collector.gui.collect_range", + () -> new Object[] { + TextFormattingUtil.formatNumbers(rangeSync.getIntValue()) }) + .alignment(Alignment.Center) + .asWidget() + .height(20) + .expanded() + .background(GTGuiTextures.DISPLAY)) + .child(new ButtonWidget<>() + .marginLeft(5) + .size(20) + .onMousePressed(mouse -> { + int range = rangeSync.getIntValue(); + if (range < maxItemSuckingRange) { + rangeSync.setIntValue(range + 1); + } + return true; + }) + .overlay(IKey.str("+1")))) + .child(itemFilter.initUI(guiData, panelSyncManager)) + .child(Flow.row() + .widthRel(1.0f) + .marginTop(4) + .coverChildrenHeight() + .child(new Grid() + .alignX(0.5f) + .height(rowSize * 18) + .mapTo(rowSize, rowSize * rowSize, index -> new ItemSlot() + .slot(SyncHandlers.itemSlot(exportItems, index) + .accessibility(false, true)))) + .child(new ToggleButton() + .right(2) + .bottom(0) + .value(autoOutputSync) + .overlay(GTGuiTextures.BUTTON_ITEM_OUTPUT) + .tooltipAutoUpdate(true) + .tooltipBuilder(tooltip -> tooltip.addLine(autoOutputSync.getBoolValue() ? + IKey.lang("gregtech.gui.item_auto_output.tooltip.enabled") : + IKey.lang("gregtech.gui.item_auto_output.tooltip.disabled")))))) + .child(SlotGroupWidget.playerInventory(false) + .bottom(7) + .left(7)); } } diff --git a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityMiner.java b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityMiner.java index 53656efac23..90c482802e6 100644 --- a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityMiner.java +++ b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityMiner.java @@ -14,6 +14,8 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.api.mui.TextStandards; import gregtech.api.util.KeyUtil; import gregtech.client.renderer.texture.Textures; @@ -40,7 +42,6 @@ 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.screen.UISettings; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; @@ -54,7 +55,8 @@ import java.util.Collections; import java.util.List; -public class MetaTileEntityMiner extends TieredMetaTileEntity implements IMiner, IControllable, IDataInfoProvider { +public class MetaTileEntityMiner extends TieredMetaTileEntity + implements IMiner, IControllable, IDataInfoProvider, IMetaTileEntityGuiHolder { private final ItemStackHandler chargerInventory; @@ -103,14 +105,10 @@ public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, minerLogic.renderPipe(renderState, translation, pipeline); } - @Override - public boolean usesMui2() { - return true; - } - @SuppressWarnings("DuplicatedCode") @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager, UISettings settings) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager panelSyncManager, + UISettings settings) { IntSyncValue radiusSync = new IntSyncValue(() -> getWorkingArea(minerLogic.getCurrentRadius())); BooleanSyncValue isDoneSync = new BooleanSyncValue(minerLogic::isDone); BooleanSyncValue isWorkingSync = new BooleanSyncValue(minerLogic::isWorking); @@ -328,7 +326,7 @@ public void setWorkingEnabled(boolean isActivationAllowed) { } @Override - public SoundEvent getSound() { + public @Nullable SoundEvent getSound() { return GTSoundEvents.MINER; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index da5afd69fdc..3fef0217981 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -157,7 +157,7 @@ public GTGuiTheme getUITheme() { protected MultiblockUIFactory createUIFactory() { return super.createUIFactory() .createFlexButton((guiData, syncManager) -> { - var throttle = syncManager.panel("throttle_panel", this::makeThrottlePanel, true); + IPanelHandler throttle = syncManager.syncedPanel("throttle_panel", true, this::makeThrottlePanel); return new ButtonWidget<>() .size(18) @@ -346,7 +346,7 @@ public boolean hasMufflerMechanics() { } @Override - public SoundEvent getSound() { + public @Nullable SoundEvent getSound() { return GTSoundEvents.BOILER; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPumpHatch.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPumpHatch.java index 4d841dc6582..dcbb5c4711f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPumpHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPumpHatch.java @@ -11,6 +11,8 @@ import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuiTheme; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.api.mui.sync.GTFluidSyncHandler; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; @@ -34,7 +36,6 @@ 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.screen.UISettings; import com.cleanroommc.modularui.utils.Alignment; @@ -50,7 +51,7 @@ import java.util.List; public class MetaTileEntityPumpHatch extends MetaTileEntityMultiblockPart - implements IMultiblockAbilityPart { + implements IMultiblockAbilityPart, IMetaTileEntityGuiHolder { private static final int FLUID_TANK_SIZE = 1000; @@ -96,7 +97,7 @@ protected FluidTankList createExportFluidHandler() { @Override protected IItemHandlerModifiable createImportItemHandler() { - return new FilteredItemHandler(this, 1).setFillPredicate( + return new FilteredItemHandler(this, 1, FilteredItemHandler.getCapabilityFilter(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY)); } @@ -121,12 +122,8 @@ public void registerAbilities(@NotNull AbilityInstances abilityInstances) { } @Override - public boolean usesMui2() { - return true; - } - - @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager guiSyncManager, + UISettings settings) { guiSyncManager.registerSlotGroup("item_inv", 2); GTFluidSyncHandler tankSyncHandler = GTFluidSlot.sync(this.exportFluids.getTankAt(0)) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDataBank.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDataBank.java index 9f8f7c9428b..7409a740ced 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDataBank.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDataBank.java @@ -231,7 +231,7 @@ public boolean shouldShowVoidingModeButton() { @SideOnly(Side.CLIENT) @Override - public SoundEvent getSound() { + public @Nullable SoundEvent getSound() { return GTSoundEvents.COMPUTATION; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index 80ba3026917..b88b7b80cce 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -476,7 +476,7 @@ public boolean shouldShowVoidingModeButton() { @SideOnly(Side.CLIENT) @Override - public SoundEvent getSound() { + public @Nullable SoundEvent getSound() { return GTSoundEvents.COMPUTATION; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java index 7436c7eafd2..6db239515a6 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java @@ -527,7 +527,7 @@ public IItemHandlerModifiable getExportItems() { } @Override - public SoundEvent getSound() { + public @Nullable SoundEvent getSound() { return GTSoundEvents.MINER; } 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 fbb5d7faeab..551fa72576f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java @@ -202,7 +202,7 @@ public SoundEvent getBreakdownSound() { } @Override - public SoundEvent getSound() { + public @Nullable SoundEvent getSound() { return GTSoundEvents.ARC; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityAutoMaintenanceHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityAutoMaintenanceHatch.java index 76e72b63888..301de306a18 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityAutoMaintenanceHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityAutoMaintenanceHatch.java @@ -76,16 +76,6 @@ public boolean isFullAuto() { return true; } - @Override - public double getDurationMultiplier() { - return 1.0; - } - - @Override - public double getTimeMultiplier() { - return 1.0; - } - @Override public boolean startWithoutProblems() { return true; diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityDataAccessHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityDataAccessHatch.java index ee036b768a2..c6ab5a9b27e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityDataAccessHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityDataAccessHatch.java @@ -3,9 +3,7 @@ import gregtech.api.GTValues; import gregtech.api.capability.IDataAccessHatch; import gregtech.api.capability.impl.NotifiableItemStackHandler; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.widgets.SlotWidget; +import gregtech.api.items.itemhandlers.GTItemStackHandler; import gregtech.api.metatileentity.IDataInfoProvider; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; @@ -13,6 +11,10 @@ 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.api.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.api.recipes.Recipe; import gregtech.api.recipes.RecipeMaps; import gregtech.api.recipes.machines.IResearchRecipeMap; @@ -26,7 +28,6 @@ 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.util.NonNullList; import net.minecraft.util.ResourceLocation; @@ -39,6 +40,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.drawable.DynamicDrawable; +import com.cleanroommc.modularui.drawable.ItemDrawable; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.utils.Alignment; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.SyncHandlers; +import com.cleanroommc.modularui.widget.Widget; +import com.cleanroommc.modularui.widgets.SlotGroupWidget; +import com.cleanroommc.modularui.widgets.layout.Flow; +import com.cleanroommc.modularui.widgets.layout.Grid; +import com.cleanroommc.modularui.widgets.slot.ItemSlot; import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import org.jetbrains.annotations.NotNull; @@ -48,7 +62,7 @@ public class MetaTileEntityDataAccessHatch extends MetaTileEntityMultiblockNotifiablePart implements IMultiblockAbilityPart, IDataAccessHatch, - IDataInfoProvider { + IDataInfoProvider, IMetaTileEntityGuiHolder { private final Set recipes; private final boolean isCreative; @@ -56,7 +70,7 @@ public class MetaTileEntityDataAccessHatch extends MetaTileEntityMultiblockNotif public MetaTileEntityDataAccessHatch(ResourceLocation metaTileEntityId, int tier, boolean isCreative) { super(metaTileEntityId, tier, false); this.isCreative = isCreative; - this.recipes = isCreative ? Collections.emptySet() : new ObjectOpenHashSet<>(); + this.recipes = isCreative ? Collections.emptySet() : new ObjectOpenHashSet<>(importItems.getSlots()); rebuildData(getController() instanceof MetaTileEntityDataBank); } @@ -87,6 +101,11 @@ public ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate } return stack; } + + @Override + public int getSlotLimit(int slot) { + return 1; + } }; } @@ -103,27 +122,67 @@ public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, } @Override - protected ModularUI createUI(EntityPlayer entityPlayer) { - if (isCreative) return null; - int rowSize = (int) Math.sqrt(getInventorySize()); - ModularUI.Builder builder = ModularUI.builder(GuiTextures.BACKGROUND, 176, 18 + 18 * rowSize + 94) - .label(6, 6, getMetaFullName()); - - for (int y = 0; y < rowSize; y++) { - for (int x = 0; x < rowSize; x++) { - int index = y * rowSize + x; - builder.widget(new SlotWidget(isExportHatch ? exportItems : importItems, index, - 88 - rowSize * 9 + x * 18, 18 + y * 18, true, !isExportHatch) - .setBackgroundTexture(GuiTextures.SLOT)); - } - } - return builder.bindPlayerInventory(entityPlayer.inventory, GuiTextures.SLOT, 7, 18 + 18 * rowSize + 12) - .build(getHolder(), entityPlayer); + public boolean shouldOpenUI() { + return !isCreative; } @Override - protected boolean openGUIOnRightClick() { - return !this.isCreative; + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager panelSyncManager, + UISettings settings) { + int rowSize = (int) Math.sqrt(getInventorySize()); + panelSyncManager.registerSlotGroup("slots", rowSize); + + Widget recipeLogo = new Widget<>() + .align(Alignment.BottomRight) + .size(17) + .overlay(new DynamicDrawable(() -> recipes.isEmpty() ? GTGuiTextures.GREGTECH_LOGO_BLINKING_YELLOW : + GTGuiTextures.GREGTECH_LOGO)) + .tooltipBuilder(tooltip -> { + if (recipes.isEmpty()) { + tooltip.addLine(IKey.lang("gregtech.machine.data_access_hatch.no_recipes")); + } else { + tooltip.addLine(IKey.lang("gregtech.machine.data_access_hatch.recipes")); + tooltip.spaceLine(2); + } + + Set itemsAdded = new ObjectOpenCustomHashSet<>(ItemStackHashStrategy.comparingAll()); + for (Recipe recipe : recipes) { + ItemStack output = recipe.getOutputs().get(0); + if (itemsAdded.add(output)) { + tooltip.add(new ItemDrawable(output)); + tooltip.space(); + tooltip.addLine(IKey.str(output.getDisplayName())); + } + } + }); + + return GTGuis.createPanel(this, 176, 18 + 18 * rowSize + 94) + .child(IKey.lang(getMetaFullName()) + .asWidget() + .pos(5, 5)) + .child(Flow.row() + .top(18) + .margin(7, 0) + .coverChildrenHeight() + .child(new Grid() + .height(rowSize * 18) + .alignX(0.5f) + .minColWidth(18) + .minRowHeight(18) + .mapTo(rowSize, rowSize * rowSize, index -> new ItemSlot() + .slot(SyncHandlers.itemSlot(importItems, index) + .slotGroup("slots") + .changeListener((newItem, onlyAmountChanged, client, init) -> { + recipeLogo.markTooltipDirty(); + if (onlyAmountChanged && + importItems instanceof GTItemStackHandler gtHandler) { + gtHandler.onContentsChanged(index); + } + })))) + .child(recipeLogo)) + .child(SlotGroupWidget.playerInventory(false) + .bottom(7) + .left(7)); } protected int getInventorySize() { @@ -131,7 +190,7 @@ protected int getInventorySize() { } private void rebuildData(boolean isDataBank) { - if (isCreative || getWorld() == null || getWorld().isRemote) return; + if (isCreative || getWorld() == null) return; recipes.clear(); for (int i = 0; i < this.importItems.getSlots(); i++) { ItemStack stack = this.importItems.getStackInSlot(i); @@ -171,8 +230,7 @@ public void addInformation(ItemStack stack, @Nullable World world, @NotNull List super.addInformation(stack, world, tooltip, advanced); tooltip.add(I18n.format("gregtech.machine.data_access_hatch.tooltip.1")); if (isCreative) { - tooltip.add(I18n.format("gregtech.creative_tooltip.1") + TooltipHelper.RAINBOW + - I18n.format("gregtech.creative_tooltip.2") + I18n.format("gregtech.creative_tooltip.3")); + tooltip.add(TooltipHelper.CREATIVE_TOOLTIP.get()); } else { tooltip.add(I18n.format("gregtech.machine.data_access_hatch.tooltip.2", getInventorySize())); } 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 a1e6ab43a3c..988388adcb8 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java @@ -19,6 +19,8 @@ import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.api.mui.widget.GhostCircuitSlotWidget; import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleOverlayRenderer; @@ -44,7 +46,6 @@ 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.network.NetworkUtils; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.screen.UISettings; @@ -65,7 +66,7 @@ public class MetaTileEntityFluidHatch extends MetaTileEntityMultiblockNotifiablePart implements IMultiblockAbilityPart, IControllable, - IGhostSlotConfigurable { + IGhostSlotConfigurable, IMetaTileEntityGuiHolder { public static final int INITIAL_INVENTORY_SIZE = 8000; @@ -250,7 +251,7 @@ protected FluidTankList createExportFluidHandler() { @Override protected IItemHandlerModifiable createImportItemHandler() { - return new FilteredItemHandler(this, 1).setFillPredicate( + return new FilteredItemHandler(this, 1, FilteredItemHandler.getCapabilityFilter(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY)); } @@ -277,12 +278,8 @@ public void registerAbilities(@NotNull AbilityInstances abilityInstances) { } @Override - public boolean usesMui2() { - return true; - } - - @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager guiSyncManager, + UISettings settings) { var fluidSyncHandler = GTFluidSlot.sync(fluidTank) .showAmountOnSlot(false) .accessibility(true, !isExportHatch); 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 127977cb343..719c1892708 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java @@ -14,6 +14,8 @@ import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.api.mui.widget.GhostCircuitSlotWidget; import gregtech.api.util.GTHashMaps; import gregtech.client.renderer.texture.Textures; @@ -38,7 +40,6 @@ 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.screen.UISettings; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; @@ -60,7 +61,7 @@ public class MetaTileEntityItemBus extends MetaTileEntityMultiblockNotifiablePart implements IMultiblockAbilityPart, IControllable, - IGhostSlotConfigurable { + IGhostSlotConfigurable, IMetaTileEntityGuiHolder { @Nullable protected GhostCircuitItemStackHandler circuitInventory; @@ -261,12 +262,8 @@ public void registerAbilities(@NotNull AbilityInstances abilityInstances) { } @Override - public boolean usesMui2() { - return true; - } - - @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager, UISettings settings) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager panelSyncManager, + UISettings settings) { int rowSize = (int) Math.sqrt(getInventorySize()); panelSyncManager.registerSlotGroup("item_inv", rowSize); 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 31511ae2cb6..a3b042b7411 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMachineHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMachineHatch.java @@ -10,6 +10,8 @@ import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.api.util.GTUtility; import gregtech.api.util.ItemStackHashStrategy; import gregtech.client.renderer.texture.Textures; @@ -25,7 +27,6 @@ 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.screen.UISettings; @@ -38,8 +39,8 @@ import java.util.List; -public class MetaTileEntityMachineHatch extends MetaTileEntityMultiblockNotifiablePart - implements IMultiblockAbilityPart { +public class MetaTileEntityMachineHatch extends MetaTileEntityMultiblockNotifiablePart implements + IMultiblockAbilityPart, IMetaTileEntityGuiHolder { private final IItemHandlerModifiable machineHandler; @@ -70,12 +71,8 @@ protected IItemHandlerModifiable createImportItemHandler() { } @Override - public boolean usesMui2() { - return true; - } - - @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager guiSyncManager, + UISettings settings) { guiSyncManager.registerSlotGroup("item_inv", 1); // TODO: Change the position of the name when it's standardized. diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMaintenanceHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMaintenanceHatch.java index 8f6a37b55c2..1572b7dd4f3 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMaintenanceHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMaintenanceHatch.java @@ -2,86 +2,99 @@ import gregtech.api.GTValues; import gregtech.api.capability.IMaintenanceHatch; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.Widget; -import gregtech.api.gui.widgets.AdvancedTextWidget; -import gregtech.api.gui.widgets.ClickButtonWidget; -import gregtech.api.gui.widgets.SlotWidget; -import gregtech.api.items.itemhandlers.GTItemStackHandler; +import gregtech.api.capability.impl.FilteredItemHandler; import gregtech.api.items.toolitem.ItemGTToolbelt; -import gregtech.api.items.toolitem.ToolClasses; import gregtech.api.items.toolitem.ToolHelper; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.*; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuis; +import gregtech.api.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; +import gregtech.api.mui.widget.FlappyGreg; import gregtech.api.util.GTUtility; import gregtech.client.renderer.texture.Textures; import gregtech.client.utils.TooltipHelper; import gregtech.common.ConfigHolder; -import gregtech.common.gui.widget.among_us.FixWiringTaskWidget; -import gregtech.common.inventory.handlers.TapeItemStackHandler; import gregtech.common.items.MetaItems; import net.minecraft.client.resources.I18n; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; import net.minecraft.util.*; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.Style; -import net.minecraft.util.text.TextComponentTranslation; -import net.minecraft.util.text.event.HoverEvent; import net.minecraft.world.World; import net.minecraftforge.common.util.Constants; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.ItemStackHandler; import codechicken.lib.raytracer.CuboidRayTraceResult; import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; -import org.jetbrains.annotations.ApiStatus; +import com.cleanroommc.modularui.api.drawable.IDrawable; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.drawable.Rectangle; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.utils.Color; +import com.cleanroommc.modularui.value.DoubleValue; +import com.cleanroommc.modularui.value.sync.DoubleSyncValue; +import com.cleanroommc.modularui.value.sync.InteractionSyncHandler; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.SyncHandlers; +import com.cleanroommc.modularui.widget.ParentWidget; +import com.cleanroommc.modularui.widget.Widget; +import com.cleanroommc.modularui.widgets.ButtonWidget; +import com.cleanroommc.modularui.widgets.SliderWidget; +import com.cleanroommc.modularui.widgets.SlotGroupWidget; +import com.cleanroommc.modularui.widgets.layout.Flow; +import com.cleanroommc.modularui.widgets.slot.ItemSlot; +import it.unimi.dsi.fastutil.doubles.DoubleArrayList; +import it.unimi.dsi.fastutil.doubles.DoubleList; +import it.unimi.dsi.fastutil.doubles.DoubleLists; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.util.Arrays; +import java.util.Iterator; import java.util.List; -import java.util.Objects; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Supplier; +import java.util.Set; +import java.util.function.DoubleUnaryOperator; import static gregtech.api.capability.GregtechDataCodes.*; public class MetaTileEntityMaintenanceHatch extends MetaTileEntityMultiblockPart - implements IMultiblockAbilityPart, IMaintenanceHatch { + implements IMultiblockAbilityPart, IMaintenanceHatch, + IMetaTileEntityGuiHolder { private final boolean isConfigurable; - private GTItemStackHandler itemStackHandler; + private TapeStackHandler tapeHandler; private boolean isTaped; // Used to store state temporarily if the Controller is broken private byte maintenanceProblems = -1; private int timeActive = -1; - private BigDecimal durationMultiplier = BigDecimal.ONE; - // Some stats used for the Configurable Maintenance Hatch - private static final BigDecimal MAX_DURATION_MULTIPLIER = BigDecimal.valueOf(1.1); - private static final BigDecimal MIN_DURATION_MULTIPLIER = BigDecimal.valueOf(0.9); - private static final BigDecimal DURATION_ACTION_AMOUNT = BigDecimal.valueOf(0.01); - private static final Function TIME_ACTION = (d) -> { - if (d < 1.0) - return -20.0 * d + 21; - else - return -8.0 * d + 9; + private double durationMultiplier = 1.0f; + private static final double MIN_DURATION_MULTIPLIER = 0.9d; + private static final double MAX_DURATION_MULTIPLIER = 1.1d; + private static final DoubleUnaryOperator TIME_ACTION = t -> { + if (t < 1.0f) { + return -20.0f * t + 21.0f; + } else { + return -8.0f * t + 9.0f; + } }; + private static final DoubleList SLIDER_STOPPER_STOPS = DoubleLists.unmodifiable( + new DoubleArrayList(new double[] { 0.9d, 0.91d, 0.92d, 0.93d, 0.94d, 0.95d, 0.96d, 0.97d, 0.98d, 0.99d, + 1.0d, 1.01d, 1.02d, 1.03d, 1.04d, 1.05d, 1.06d, 1.07d, 1.08d, 1.09d, 1.1d })); + public MetaTileEntityMaintenanceHatch(ResourceLocation metaTileEntityId, boolean isConfigurable) { super(metaTileEntityId, isConfigurable ? 3 : 1); this.isConfigurable = isConfigurable; @@ -106,14 +119,14 @@ public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, @Override protected void initializeInventory() { super.initializeInventory(); - this.itemStackHandler = new TapeItemStackHandler(this, 1); - this.itemInventory = itemStackHandler; + this.tapeHandler = new TapeStackHandler(this); + this.itemInventory = tapeHandler; } @Override public void clearMachineInventory(@NotNull List<@NotNull ItemStack> itemBuffer) { super.clearMachineInventory(itemBuffer); - clearInventory(itemBuffer, itemStackHandler); + clearInventory(itemBuffer, tapeHandler); } /** @@ -178,177 +191,125 @@ public boolean startWithoutProblems() { public void update() { super.update(); if (!getWorld().isRemote && getOffsetTimer() % 20 == 0) { - MultiblockControllerBase controller = getController(); - if (controller instanceof IMaintenance) { - if (((IMaintenance) controller).hasMaintenanceProblems()) { - if (consumeDuctTape(this.itemInventory, 0)) { - fixAllMaintenanceProblems(); - setTaped(true); - } - } + if (getController() instanceof IMaintenance iMaintenance && + iMaintenance.hasMaintenanceProblems() && tapeHandler.tryConsumeTape()) { + iMaintenance.fixAllMaintenance(); + setTaped(true); } } } + protected void fixAllProblems() { + if (getController() instanceof IMaintenance iMaintenance) { + iMaintenance.fixAllMaintenance(); + } + } + /** * Fixes the maintenance problems of this hatch's Multiblock Controller * - * @param entityPlayer the player performing the fixing + * @param player the player performing the fixing */ - private void fixMaintenanceProblems(@Nullable EntityPlayer entityPlayer) { - if (!(this.getController() instanceof IMaintenance)) + private void fixMaintenanceProblems(@NotNull EntityPlayer player) { + if (!(this.getController() instanceof IMaintenance controller)) { return; - - if (!((IMaintenance) this.getController()).hasMaintenanceProblems()) + } else if (!controller.hasMaintenanceProblems()) { return; + } else if (player.capabilities.isCreativeMode) { + controller.fixAllMaintenance(); + return; + } + + List playerItems = new ObjectArrayList<>(player.inventory.mainInventory); + playerItems.removeIf(ItemStack::isEmpty); - if (entityPlayer != null) { - // Fix automatically on slot click by player in Creative Mode - if (entityPlayer.capabilities.isCreativeMode) { - fixAllMaintenanceProblems(); + // Try to tape this hatch from the player's inventory first + Iterator tapeIterator = playerItems.iterator(); + while (tapeIterator.hasNext()) { + ItemStack stack = tapeIterator.next(); + if (consumeDuctTape(stack, true)) { + tapeIterator.remove(); + controller.fixAllMaintenance(); + setTaped(true); return; } - // Then for every slot in the player's main inventory, try to duct tape fix - for (int i = 0; i < entityPlayer.inventory.mainInventory.size(); i++) { - if (consumeDuctTape(new ItemStackHandler(entityPlayer.inventory.mainInventory), i)) { - fixAllMaintenanceProblems(); - setTaped(true); - return; - } - } - // Lastly for each problem the multi has, try to fix with tools - fixProblemsWithTools(((IMaintenance) this.getController()).getMaintenanceProblems(), entityPlayer); } - } - /** - * - * Handles duct taping for manual and auto-taping use - * - * @param handler is the handler to get duct tape from - * @param slot is the inventory slot to check for tape - * @return true if tape was consumed, else false - */ - private boolean consumeDuctTape(@Nullable IItemHandler handler, int slot) { - if (handler == null) - return false; - return consumeDuctTape(null, handler.getStackInSlot(slot)); - } - - private boolean consumeDuctTape(@Nullable EntityPlayer player, ItemStack itemStack) { - if (!itemStack.isEmpty() && itemStack.isItemEqual(MetaItems.DUCT_TAPE.getStackForm())) { - if (player == null || !player.capabilities.isCreativeMode) { - itemStack.shrink(1); - } - return true; + ItemStack cursorStack = player.inventory.getItemStack(); + if (!cursorStack.isEmpty()) { + // If player clicked "slot" with item, only attempt fixing with that + playerItems.clear(); + playerItems.add(cursorStack); } - return false; + + fixMaintenanceProblemsWithTools(player, playerItems); } /** - * Attempts to fix a provided maintenance problem with a tool in the player's - * inventory, if the tool exists. + * Fix maintenance issues on the multiblock this maintenance hatch is attached to. * - * @param problems Problem Flags - * @param entityPlayer Target Player which their inventory would be scanned for tools to fix + * @param player the player doing the fixing + * @param stacks a list of item stacks to attempt fixing the problems with. The list will be mutated when this + * filters out non-tools! */ - private void fixProblemsWithTools(byte problems, EntityPlayer entityPlayer) { - List toolsToMatch = Arrays.asList(new String[6]); - boolean proceed = false; - for (byte index = 0; index < 6; index++) { - if (((problems >> index) & 1) == 0) { - proceed = true; - switch (index) { - case 0 -> toolsToMatch.set(0, ToolClasses.WRENCH); - case 1 -> toolsToMatch.set(1, ToolClasses.SCREWDRIVER); - case 2 -> toolsToMatch.set(2, ToolClasses.SOFT_MALLET); - case 3 -> toolsToMatch.set(3, ToolClasses.HARD_HAMMER); - case 4 -> toolsToMatch.set(4, ToolClasses.WIRE_CUTTER); - case 5 -> toolsToMatch.set(5, ToolClasses.CROWBAR); - } + public void fixMaintenanceProblemsWithTools(@NotNull EntityPlayer player, @NotNull List stacks) { + if (!(getController() instanceof IMaintenance controller) || !controller.hasMaintenanceProblems()) return; + + // Reduce items and unwrap toolbelts into usable tools + int index = 0; + while (index < stacks.size()) { + ItemStack stack = stacks.get(index); + Item item = stack.getItem(); + + if (item instanceof ItemGTToolbelt toolbelt) { + stacks.remove(index); + toolbelt.iterateSlots(stack, stacks::add); + continue; } - } - if (!proceed) { - return; + + if (item.getToolClasses(stack).isEmpty()) { + stacks.remove(index); + continue; + } + + index++; } - mainfor: - for (int i = 0; i < toolsToMatch.size(); i++) { - String toolToMatch = toolsToMatch.get(i); - if (toolToMatch != null) { - // Try to use the item in the player's "hand" (under the cursor) - ItemStack heldItem = entityPlayer.inventory.getItemStack(); - if (heldItem.getItem() instanceof ItemGTToolbelt toolbelt) { - if (toolbelt.damageAgainstMaintenanceProblem(heldItem, toolToMatch, entityPlayer)) { - ((IMaintenance) getController()).setMaintenanceFixed(i); - setTaped(false); - continue; - } - } else if (ToolHelper.isTool(heldItem, toolToMatch)) { - fixProblemWithTool(i, heldItem, entityPlayer); - - if (toolsToMatch.stream().allMatch(Objects::isNull)) { - return; - } - continue; - } - - // Then try all the remaining inventory slots - for (ItemStack itemStack : entityPlayer.inventory.mainInventory) { - if (itemStack.getItem() instanceof ItemGTToolbelt toolbelt) { - if (toolbelt.damageAgainstMaintenanceProblem(itemStack, toolToMatch, entityPlayer)) { - ((IMaintenance) getController()).setMaintenanceFixed(i); - setTaped(false); - continue mainfor; - } - } else if (ToolHelper.isTool(itemStack, toolToMatch)) { - fixProblemWithTool(i, itemStack, entityPlayer); - - if (toolsToMatch.stream().allMatch(Objects::isNull)) { - return; - } - continue mainfor; - } - } + Set> toolEntries = controller.getToolsForMaintenance(); + for (ItemStack toolStack : stacks) { + if (toolEntries.isEmpty()) return; + + Int2ObjectMap.Entry entry = findMatchingClass(toolEntries, + toolStack.getItem().getToolClasses(toolStack)); + if (entry != null) { + ToolHelper.damageItemWhenCrafting(toolStack, player); + controller.setMaintenanceFixed(entry.getIntKey()); + toolEntries.remove(entry); + setTaped(false); } } } - @ApiStatus.Internal - public void fixMaintenanceProblemsWithToolbelt(@NotNull EntityPlayer entityPlayer, ItemGTToolbelt toolbelt, - ItemStack toolbeltStack) { - byte problems = ((IMaintenance) this.getController()).getMaintenanceProblems(); - for (byte index = 0; index < 6; index++) { - if (((problems >> index) & 1) == 0) { - String toolToMatch = switch (index) { - case 0 -> ToolClasses.WRENCH; - case 1 -> ToolClasses.SCREWDRIVER; - case 2 -> ToolClasses.SOFT_MALLET; - case 3 -> ToolClasses.HARD_HAMMER; - case 4 -> ToolClasses.WIRE_CUTTER; - case 5 -> ToolClasses.CROWBAR; - default -> null; - }; - if (toolbelt.damageAgainstMaintenanceProblem(toolbeltStack, toolToMatch, entityPlayer)) { - ((IMaintenance) getController()).setMaintenanceFixed(index); - setTaped(false); - } + @Nullable + private static Int2ObjectMap.Entry findMatchingClass(@NotNull Set> toolEntries, + @NotNull Set findIn) { + for (Int2ObjectMap.Entry entry : toolEntries) { + if (findIn.contains(entry.getValue())) { + return entry; } } - } - private void fixProblemWithTool(int problemIndex, ItemStack stack, EntityPlayer player) { - ((IMaintenance) getController()).setMaintenanceFixed(problemIndex); - ToolHelper.damageItemWhenCrafting(stack, player); - setTaped(false); + return null; } - /** - * Fixes every maintenance problem of the controller - */ - public void fixAllMaintenanceProblems() { - if (this.getController() instanceof IMaintenance) - for (int i = 0; i < 6; i++) ((IMaintenance) this.getController()).setMaintenanceFixed(i); + private static boolean consumeDuctTape(@NotNull ItemStack itemStack, boolean consumeTape) { + if (!itemStack.isEmpty() && TapeStackHandler.isStackTape(itemStack)) { + if (consumeTape) { + itemStack.shrink(1); + } + return true; + } + return false; } @Override @@ -358,104 +319,158 @@ public boolean isFullAuto() { @Override public double getDurationMultiplier() { - return durationMultiplier.doubleValue(); + return durationMultiplier; } - @Override - public double getTimeMultiplier() { - return BigDecimal.valueOf(TIME_ACTION.apply(durationMultiplier.doubleValue())) - .setScale(2, RoundingMode.HALF_UP) - .doubleValue(); - } - - private void incInternalMultiplier(Widget.ClickData data) { - if (durationMultiplier.compareTo(MAX_DURATION_MULTIPLIER) == 0) return; - durationMultiplier = durationMultiplier.add(DURATION_ACTION_AMOUNT); - writeCustomData(MAINTENANCE_MULTIPLIER, b -> b.writeDouble(durationMultiplier.doubleValue())); + protected void setDurationMultiplier(double multiplier) { + this.durationMultiplier = multiplier; } - private void decInternalMultiplier(Widget.ClickData data) { - if (durationMultiplier.compareTo(MIN_DURATION_MULTIPLIER) == 0) return; - durationMultiplier = durationMultiplier.subtract(DURATION_ACTION_AMOUNT); - writeCustomData(MAINTENANCE_MULTIPLIER, b -> b.writeDouble(durationMultiplier.doubleValue())); + @Override + public double getTimeMultiplier() { + return TIME_ACTION.applyAsDouble(durationMultiplier); } @Override public void onRemoval() { - if (getController() instanceof IMaintenance) { - IMaintenance controller = (IMaintenance) getController(); - if (!getWorld().isRemote && controller != null) - controller.storeTaped(isTaped); + if (getController() instanceof IMaintenance iMaintenance) { + if (!getWorld().isRemote) { + iMaintenance.storeTaped(isTaped); + } } + super.onRemoval(); } @Override public boolean onRightClick(EntityPlayer playerIn, EnumHand hand, EnumFacing facing, CuboidRayTraceResult hitResult) { - if (getController() instanceof IMaintenance && ((IMaintenance) getController()).hasMaintenanceProblems()) { - if (consumeDuctTape(playerIn, playerIn.getHeldItem(hand))) { - fixAllMaintenanceProblems(); + if (getController() instanceof IMaintenance iMaintenance && iMaintenance.hasMaintenanceProblems()) { + if (consumeDuctTape(playerIn.getHeldItem(hand), !playerIn.capabilities.isCreativeMode)) { + iMaintenance.fixAllMaintenance(); setTaped(true); return true; } } + return super.onRightClick(playerIn, hand, facing, hitResult); } @Override - protected ModularUI createUI(EntityPlayer entityPlayer) { - ModularUI.Builder builder = ModularUI.builder(GuiTextures.BACKGROUND, 176, 18 * 3 + 98) - .label(5, 5, getMetaFullName()) - .bindPlayerInventory(entityPlayer.inventory, GuiTextures.SLOT, 7, 18 * 3 + 16); - - if (!isConfigurable && GTValues.FOOLS.get()) { - builder.widget(new FixWiringTaskWidget(48, 15, 80, 50) - .setOnFinished(this::fixAllMaintenanceProblems) - .setCanInteractPredicate(this::isAttachedToMultiBlock)); - } else { - builder.widget(new SlotWidget(itemStackHandler, 0, 89 - 10, 18 - 1) - .setBackgroundTexture(GuiTextures.SLOT, GuiTextures.DUCT_TAPE_OVERLAY) - .setTooltipText("gregtech.machine.maintenance_hatch_tape_slot.tooltip")) - .widget(new ClickButtonWidget(89 - 10 - 1, 18 * 2 + 3, 20, 20, "", - data -> fixMaintenanceProblems(entityPlayer)) - .setButtonTexture(GuiTextures.MAINTENANCE_ICON) - .setTooltipText("gregtech.machine.maintenance_hatch_tool_slot.tooltip")); - } - if (isConfigurable) { - builder.widget( - new AdvancedTextWidget(5, 25, getTextWidgetText("duration", this::getDurationMultiplier), 0x404040)) - .widget(new AdvancedTextWidget(5, 39, getTextWidgetText("time", this::getTimeMultiplier), 0x404040)) - .widget(new ClickButtonWidget(9, 18 * 3 + 16 - 18, 12, 12, "-", this::decInternalMultiplier)) - .widget(new ClickButtonWidget(9 + 18 * 2, 18 * 3 + 16 - 18, 12, 12, "+", - this::incInternalMultiplier)); - } - return builder.build(getHolder(), entityPlayer); + public void writeExtraGuiData(@NotNull PacketBuffer buffer) { + buffer.writeBoolean(GTValues.isAprilFools()); } - private static Consumer> getTextWidgetText(String type, Supplier multiplier) { - return (list) -> { - ITextComponent tooltip; - if (multiplier.get() == 1.0) { - tooltip = new TextComponentTranslation( - "gregtech.maintenance.configurable_" + type + ".unchanged_description"); - } else { - tooltip = new TextComponentTranslation( - "gregtech.maintenance.configurable_" + type + ".changed_description", multiplier.get()); - } - list.add(new TextComponentTranslation("gregtech.maintenance.configurable_" + type, multiplier.get()) - .setStyle(new Style().setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, tooltip)))); - }; + @Override + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager panelSyncManager, + UISettings settings) { + panelSyncManager.registerServerSyncedAction("game_finish", + packet -> fixMaintenanceProblems(guiData.getPlayer())); + InteractionSyncHandler maintenanceClickSync = new InteractionSyncHandler() + .setOnMousePressed(mouse -> { + if (panelSyncManager.isClient()) return; + fixMaintenanceProblems(guiData.getPlayer()); + }); + DoubleSyncValue multiplierSync = SyncHandlers.doubleNumber(this::getDurationMultiplier, + this::setDurationMultiplier); + panelSyncManager.syncValue("multiplierSync", 0, multiplierSync); + panelSyncManager.registerSlotGroup("tape_slot", 1); + + boolean aprilFools = guiData.getBuffer().readBoolean(); + return GTGuis.createPanel(this, 176, aprilFools ? 202 : 152) + .child(IKey.lang(getMetaFullName()) + .asWidget() + .pos(5, 5)) + .childIf(!isConfigurable && aprilFools, () -> new FlappyGreg() + .alignX(0.5f) + .top(5 + 9 + 7) + .size(150, 45 + 25 + 25) + // TODO: MUI 3.0.6 remove empty packet consumer + .onFinish(() -> panelSyncManager.callSyncedAction("game_finish", buf -> {}))) + .childIf(!aprilFools, () -> Flow.column() + .top(17) + .widthRel(1.0f) + .coverChildrenHeight() + .child(new ItemSlot() + .slot(SyncHandlers.itemSlot(tapeHandler, 0) + .slotGroup("tape_slot")) + .background(GTGuiTextures.SLOT, GTGuiTextures.DUCT_TAPE_OVERLAY) + .addTooltipLine(IKey.lang("gregtech.machine.maintenance_hatch_tape_slot.tooltip"))) + .child(new ButtonWidget<>() + .marginTop(4) + .size(20) + .syncHandler(maintenanceClickSync) + .overlay(GTGuiTextures.MAINTENANCE_ICON) + .addTooltipLine(IKey.lang("gregtech.machine.maintenance_hatch_tool_slot.tooltip")))) + .childIf(isConfigurable, () -> { + Widget durationText = IKey.lang("gregtech.maintenance.configurable_duration", + () -> new Object[] { String.format("%.2f", multiplierSync.getDoubleValue()) }) + .asWidget() + .tooltipBuilder(tooltip -> { + double multiplier = multiplierSync.getDoubleValue(); + if (multiplier == 1.0f) { + tooltip.addLine(IKey + .lang("gregtech.maintenance.configurable_duration.unchanged_description")); + } else { + tooltip.addLine( + IKey.lang("gregtech.maintenance.configurable_duration.changed_description", + String.format("%.2f", multiplier))); + } + }); + Widget timeText = IKey.lang("gregtech.maintenance.configurable_time", + () -> new Object[] { + String.format("%.2f", TIME_ACTION.applyAsDouble(multiplierSync.getDoubleValue())) }) + .asWidget() + .tooltipBuilder(tooltip -> { + double multiplier = TIME_ACTION.applyAsDouble(multiplierSync.getDoubleValue()); + if (multiplier == 1.0f) { + tooltip.addLine( + IKey.lang("gregtech.maintenance.configurable_time.unchanged_description")); + } else { + tooltip.addLine( + IKey.lang("gregtech.maintenance.configurable_time.changed_description", + String.format("%.2f", multiplier))); + } + }); + + return new ParentWidget<>() + .pos(5, 25) + .coverChildren() + .child(durationText) + .child(timeText.top(14)) + .child(new SliderWidget() + .width(67 - 8) + .pos(4, 27) + .bounds(MIN_DURATION_MULTIPLIER, MAX_DURATION_MULTIPLIER) + .stopper(SLIDER_STOPPER_STOPS) + .value(new DoubleValue.Dynamic(multiplierSync::getDoubleValue, val -> { + multiplierSync.setDoubleValue(val); + durationText.markTooltipDirty(); + timeText.markTooltipDirty(); + })) + .background(new Rectangle() + .setColor(Color.BLACK.brighter(2)) + .asIcon() + .height(2)) + .stopperSize(1, 4) + .stopperTexture(IDrawable.EMPTY) + .sliderHeight(8)); + }) + .child(SlotGroupWidget.playerInventory(false) + .left(7) + .bottom(7)); } @Override public NBTTagCompound writeToNBT(NBTTagCompound data) { super.writeToNBT(data); data.setBoolean("IsTaped", isTaped); - data.setTag("tapeInventory", itemStackHandler.serializeNBT()); + data.setTag("tapeInventory", tapeHandler.serializeNBT()); + if (isConfigurable) { - data.setDouble("DurationMultiplier", durationMultiplier.doubleValue()); + data.setDouble("DurationMultiplier", durationMultiplier); } + return data; } @@ -463,15 +478,18 @@ public NBTTagCompound writeToNBT(NBTTagCompound data) { public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); isTaped = data.getBoolean("IsTaped"); + if (data.hasKey("tapeInventory", Constants.NBT.TAG_COMPOUND)) { - this.itemStackHandler.deserializeNBT(data.getCompoundTag("tapeInventory")); + this.tapeHandler.deserializeNBT(data.getCompoundTag("tapeInventory")); } + if (isConfigurable) { - durationMultiplier = BigDecimal.valueOf(data.getDouble("DurationMultiplier")); + durationMultiplier = data.getDouble("DurationMultiplier"); } + // Legacy Inventory Handler Support if (data.hasKey("ImportInventory", Constants.NBT.TAG_COMPOUND)) { - GTUtility.readItems(itemStackHandler, "ImportInventory", data); + GTUtility.readItems(tapeHandler, "ImportInventory", data); data.removeTag("ImportInventory"); } } @@ -480,14 +498,12 @@ public void readFromNBT(NBTTagCompound data) { public void writeInitialSyncData(PacketBuffer buf) { super.writeInitialSyncData(buf); buf.writeBoolean(isTaped); - if (isConfigurable) buf.writeDouble(durationMultiplier.doubleValue()); } @Override public void receiveInitialSyncData(PacketBuffer buf) { super.receiveInitialSyncData(buf); isTaped = buf.readBoolean(); - if (isConfigurable) durationMultiplier = BigDecimal.valueOf(buf.readDouble()); } @Override @@ -501,9 +517,6 @@ public void receiveCustomData(int dataId, PacketBuffer buf) { this.isTaped = buf.readBoolean(); scheduleRenderUpdate(); markDirty(); - } else if (dataId == MAINTENANCE_MULTIPLIER) { - this.durationMultiplier = BigDecimal.valueOf(buf.readDouble()); - markDirty(); } } @@ -552,4 +565,23 @@ public void addToolUsages(ItemStack stack, @Nullable World world, List t super.addToolUsages(stack, world, tooltip, advanced); tooltip.add(I18n.format("gregtech.tool_action.tape")); } + + private static class TapeStackHandler extends FilteredItemHandler { + + public TapeStackHandler(MetaTileEntity metaTileEntity) { + super(metaTileEntity, 1, TapeStackHandler::isStackTape); + } + + public boolean tryConsumeTape() { + ItemStack slotStack = getStackInSlot(0); + // There *should* be no need to check if the stack is tape + if (slotStack.isEmpty()) return false; + slotStack.shrink(1); + return true; + } + + public static boolean isStackTape(@NotNull ItemStack itemStack) { + return MetaItems.DUCT_TAPE.isItemEqual(itemStack); + } + } } 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 dda4c982efc..ba71f12cee4 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java @@ -11,6 +11,8 @@ import gregtech.api.metatileentity.multiblock.IMultiblockAbilityPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleOverlayRenderer; import gregtech.common.mui.widget.GTFluidSlot; @@ -30,7 +32,6 @@ 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.network.NetworkUtils; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.screen.UISettings; @@ -43,7 +44,8 @@ import java.util.List; public class MetaTileEntityMultiFluidHatch extends MetaTileEntityMultiblockNotifiablePart - implements IMultiblockAbilityPart, IControllable { + implements IMultiblockAbilityPart, IControllable, + IMetaTileEntityGuiHolder { private static final int BASE_TANK_SIZE = 8000; @@ -204,12 +206,8 @@ public void registerAbilities(@NotNull AbilityInstances abilityInstances) { } @Override - public boolean usesMui2() { - return true; - } - - @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager guiSyncManager, + UISettings settings) { int rowSize = (int) Math.sqrt(numSlots); List fluidSlots = new ArrayList<>(); 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 a486765725c..bb41ffe14fd 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityObjectHolder.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityObjectHolder.java @@ -15,6 +15,8 @@ import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleOverlayRenderer; @@ -32,7 +34,6 @@ 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.UISettings; import com.cleanroommc.modularui.value.sync.PanelSyncManager; @@ -45,7 +46,8 @@ import java.util.List; public class MetaTileEntityObjectHolder extends MetaTileEntityMultiblockNotifiablePart - implements IMultiblockAbilityPart, IObjectHolder { + implements IMultiblockAbilityPart, IObjectHolder, + IMetaTileEntityGuiHolder { // purposefully not exposed to automation or capabilities private final ObjectHolderHandler heldItems; @@ -63,12 +65,8 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) { } @Override - public boolean usesMui2() { - return true; - } - - @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager guiSyncManager, + UISettings settings) { guiSyncManager.registerSlotGroup("item_inv", 2); // TODO: Change the position of the name when it's standardized. diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityPassthroughHatchFluid.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityPassthroughHatchFluid.java index a047127d832..40f58be397a 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityPassthroughHatchFluid.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityPassthroughHatchFluid.java @@ -15,6 +15,8 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.client.renderer.texture.Textures; import gregtech.common.mui.widget.GTFluidSlot; @@ -35,7 +37,6 @@ 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.screen.UISettings; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; @@ -50,8 +51,8 @@ import java.util.List; public class MetaTileEntityPassthroughHatchFluid extends MetaTileEntityMultiblockPart implements IPassthroughHatch, - IMultiblockAbilityPart, - IControllable { + IMultiblockAbilityPart, IControllable, + IMetaTileEntityGuiHolder { private static final int TANK_SIZE = 16_000; @@ -134,12 +135,8 @@ protected IItemHandlerModifiable createImportItemHandler() { } @Override - public boolean usesMui2() { - return true; - } - - @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager guiSyncManager, + UISettings settings) { int rowSize = (int) Math.sqrt(getTier() + 1); int backgroundWidth = 9 * 18 + 14; diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityPassthroughHatchItem.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityPassthroughHatchItem.java index 4d02dba1e66..072e83cdd0c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityPassthroughHatchItem.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityPassthroughHatchItem.java @@ -14,6 +14,8 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.client.renderer.texture.Textures; import net.minecraft.client.resources.I18n; @@ -34,7 +36,6 @@ 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.screen.UISettings; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; @@ -50,9 +51,9 @@ import java.util.ArrayList; import java.util.List; -public class MetaTileEntityPassthroughHatchItem extends MetaTileEntityMultiblockPart implements IPassthroughHatch, - IMultiblockAbilityPart, - IControllable { +public class MetaTileEntityPassthroughHatchItem extends MetaTileEntityMultiblockPart + implements IPassthroughHatch, IMultiblockAbilityPart, + IControllable, IMetaTileEntityGuiHolder { private ItemStackHandler itemStackHandler; @@ -136,12 +137,8 @@ protected IItemHandlerModifiable createImportItemHandler() { } @Override - public boolean usesMui2() { - return true; - } - - @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager guiSyncManager, + UISettings settings) { int rowSize = (int) Math.sqrt(getInventorySize()); guiSyncManager.registerSlotGroup("item_inv", rowSize); 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 00241591cf8..f52babc8149 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityReservoirHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityReservoirHatch.java @@ -14,6 +14,8 @@ import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.api.mui.sync.GTFluidSyncHandler; import gregtech.api.mui.widget.GhostCircuitSlotWidget; import gregtech.client.renderer.texture.Textures; @@ -40,7 +42,6 @@ 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.screen.UISettings; import com.cleanroommc.modularui.utils.Alignment; @@ -57,8 +58,8 @@ import java.util.List; public class MetaTileEntityReservoirHatch extends MetaTileEntityMultiblockNotifiablePart - implements IMultiblockAbilityPart, - IGhostSlotConfigurable { + implements IMultiblockAbilityPart, IGhostSlotConfigurable, + IMetaTileEntityGuiHolder { private static final int FLUID_AMOUNT = 2_000_000_000; private final InfiniteWaterTank fluidTank; @@ -121,7 +122,7 @@ protected FluidTankList createImportFluidHandler() { @Override protected IItemHandlerModifiable createImportItemHandler() { - return new FilteredItemHandler(this).setFillPredicate( + return new FilteredItemHandler(this, 1, FilteredItemHandler.getCapabilityFilter(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY)); } @@ -145,12 +146,8 @@ else if (abilityInstances.isKey(MultiblockAbility.IMPORT_ITEMS)) { } @Override - public boolean usesMui2() { - return true; - } - - @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager guiSyncManager, + UISettings settings) { guiSyncManager.registerSlotGroup("item_inv", 2); GTFluidSyncHandler tankSyncHandler = GTFluidSlot.sync(this.fluidTank) 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 d82088dc81a..a51d9067910 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityRotorHolder.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityRotorHolder.java @@ -13,6 +13,8 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.api.util.RelativeDirection; import gregtech.client.renderer.texture.Textures; import gregtech.common.items.behaviors.AbstractMaterialPartBehavior; @@ -39,7 +41,6 @@ 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.screen.UISettings; import com.cleanroommc.modularui.value.sync.PanelSyncManager; @@ -51,8 +52,8 @@ import java.util.List; -public class MetaTileEntityRotorHolder extends MetaTileEntityMultiblockNotifiablePart - implements IMultiblockAbilityPart, IRotorHolder { +public class MetaTileEntityRotorHolder extends MetaTileEntityMultiblockNotifiablePart implements + IMultiblockAbilityPart, IRotorHolder, IMetaTileEntityGuiHolder { static final int SPEED_INCREMENT = 1; static final int SPEED_DECREMENT = 3; @@ -82,12 +83,8 @@ public IItemHandlerModifiable getImportItems() { } @Override - public boolean usesMui2() { - return true; - } - - @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager guiSyncManager, + UISettings settings) { guiSyncManager.registerSlotGroup("item_inv", 1); // TODO: Change the position of the name when it's standardized. return GTGuis.createPanel(this, 176, 166) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index 120b25e8827..4efec4b33c4 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -168,7 +168,7 @@ protected ModularUI.Builder createUITemplate(EntityPlayer player) { // GT Logo, cause there's some free real estate builder.widget(new ImageWidget(7 + 18 * 4, 25 + 18 * 3, 17, 17, - GTValues.XMAS.get() ? GuiTextures.GREGTECH_LOGO_XMAS : GuiTextures.GREGTECH_LOGO) + GTValues.isXMAS() ? GuiTextures.GREGTECH_LOGO_XMAS : GuiTextures.GREGTECH_LOGO) .setIgnoreColor(true)); builder.bindPlayerInventory(player.inventory, GuiTextures.SLOT, 7, 18 + 18 * 4 + 12); diff --git a/src/main/java/gregtech/common/metatileentities/steam/SteamMiner.java b/src/main/java/gregtech/common/metatileentities/steam/SteamMiner.java index cbe9ae2aa7a..e616c05ac1d 100644 --- a/src/main/java/gregtech/common/metatileentities/steam/SteamMiner.java +++ b/src/main/java/gregtech/common/metatileentities/steam/SteamMiner.java @@ -11,10 +11,7 @@ import gregtech.api.metatileentity.IDataInfoProvider; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; -import gregtech.api.mui.GTGuiTextures; -import gregtech.api.mui.GTGuiTheme; -import gregtech.api.mui.GTGuis; -import gregtech.api.mui.TextStandards; +import gregtech.api.mui.*; import gregtech.api.util.GTUtility; import gregtech.api.util.KeyUtil; import gregtech.client.renderer.texture.Textures; @@ -48,7 +45,6 @@ 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.screen.UISettings; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; @@ -63,7 +59,8 @@ import java.util.Collections; import java.util.List; -public class SteamMiner extends MetaTileEntity implements IMiner, IControllable, IVentable, IDataInfoProvider { +public class SteamMiner extends MetaTileEntity + implements IMiner, IControllable, IVentable, IDataInfoProvider, IMetaTileEntityGuiHolder { private boolean needsVenting = false; private boolean ventingStuck = false; @@ -120,11 +117,6 @@ public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, minerLogic.renderPipe(renderState, translation, pipeline); } - @Override - public boolean usesMui2() { - return true; - } - @Override public GTGuiTheme getUITheme() { return GTGuiTheme.BRONZE; @@ -132,7 +124,8 @@ public GTGuiTheme getUITheme() { @SuppressWarnings("DuplicatedCode") @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager, UISettings settings) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager panelSyncManager, + UISettings settings) { IntSyncValue radiusSync = new IntSyncValue(() -> getWorkingArea(minerLogic.getCurrentRadius())); BooleanSyncValue isDoneSync = new BooleanSyncValue(minerLogic::isDone); BooleanSyncValue isWorkingSync = new BooleanSyncValue(minerLogic::isWorking); diff --git a/src/main/java/gregtech/common/metatileentities/steam/boiler/SteamBoiler.java b/src/main/java/gregtech/common/metatileentities/steam/boiler/SteamBoiler.java index f322cfbc4b8..30ef64b6fcf 100644 --- a/src/main/java/gregtech/common/metatileentities/steam/boiler/SteamBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/steam/boiler/SteamBoiler.java @@ -370,7 +370,7 @@ public void addToolUsages(ItemStack stack, @Nullable World world, List t } @Override - public SoundEvent getSound() { + public @Nullable SoundEvent getSound() { return GTSoundEvents.BOILER; } 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 879cb9c2da0..0724cbba682 100644 --- a/src/main/java/gregtech/common/metatileentities/steam/multiblockpart/MetaTileEntitySteamHatch.java +++ b/src/main/java/gregtech/common/metatileentities/steam/multiblockpart/MetaTileEntitySteamHatch.java @@ -14,6 +14,8 @@ import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuiTheme; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.api.mui.sync.GTFluidSyncHandler; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; @@ -37,7 +39,6 @@ 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.screen.UISettings; import com.cleanroommc.modularui.utils.Alignment; @@ -53,7 +54,7 @@ import java.util.List; public class MetaTileEntitySteamHatch extends MetaTileEntityMultiblockPart - implements IMultiblockAbilityPart { + implements IMultiblockAbilityPart, IMetaTileEntityGuiHolder { private static final int INVENTORY_SIZE = 64000; private static final boolean IS_STEEL = ConfigHolder.machines.steelSteamMultiblocks; @@ -116,7 +117,7 @@ protected FluidTankList createImportFluidHandler() { @Override protected IItemHandlerModifiable createImportItemHandler() { - return new FilteredItemHandler(this, 1).setFillPredicate( + return new FilteredItemHandler(this, 1, FilteredItemHandler.getCapabilityFilter(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY)); } @@ -136,12 +137,8 @@ public void registerAbilities(@NotNull AbilityInstances abilityInstances) { } @Override - public boolean usesMui2() { - return true; - } - - @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager guiSyncManager, + UISettings settings) { guiSyncManager.registerSlotGroup("item_inv", 2); GTFluidSyncHandler tankSyncHandler = GTFluidSlot.sync(this.importFluids.getTankAt(0)) diff --git a/src/main/java/gregtech/common/metatileentities/steam/multiblockpart/MetaTileEntitySteamItemBus.java b/src/main/java/gregtech/common/metatileentities/steam/multiblockpart/MetaTileEntitySteamItemBus.java index 6734a00616a..5ab32b7d8be 100644 --- a/src/main/java/gregtech/common/metatileentities/steam/multiblockpart/MetaTileEntitySteamItemBus.java +++ b/src/main/java/gregtech/common/metatileentities/steam/multiblockpart/MetaTileEntitySteamItemBus.java @@ -7,6 +7,7 @@ import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; import gregtech.api.mui.GTGuiTheme; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleOverlayRenderer; @@ -25,7 +26,6 @@ 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.screen.UISettings; import com.cleanroommc.modularui.value.sync.PanelSyncManager; @@ -88,7 +88,8 @@ public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, } @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager, UISettings settings) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager panelSyncManager, + UISettings settings) { panelSyncManager.registerSlotGroup("item_inv", 2); List> widgets = new ArrayList<>(); diff --git a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityBuffer.java b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityBuffer.java index 353cdf406c3..53b735cff55 100644 --- a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityBuffer.java +++ b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityBuffer.java @@ -7,6 +7,8 @@ import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.api.util.GTUtility; import gregtech.client.renderer.texture.Textures; import gregtech.common.mui.widget.GTFluidSlot; @@ -28,7 +30,6 @@ 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.screen.UISettings; import com.cleanroommc.modularui.value.sync.PanelSyncManager; @@ -44,7 +45,7 @@ import java.util.ArrayList; import java.util.List; -public class MetaTileEntityBuffer extends MetaTileEntity implements ITieredMetaTileEntity { +public class MetaTileEntityBuffer extends MetaTileEntity implements ITieredMetaTileEntity, IMetaTileEntityGuiHolder { private static final int TANK_SIZE = 64000; private final int tier; @@ -81,12 +82,8 @@ public Pair getParticleTexture() { } @Override - public boolean usesMui2() { - return true; - } - - @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager guiSyncManager, + UISettings settings) { int invTier = tier + 2; guiSyncManager.registerSlotGroup("item_inv", invTier); diff --git a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCrate.java b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCrate.java index 5c6948c5ffc..061713e942f 100644 --- a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCrate.java +++ b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCrate.java @@ -5,6 +5,8 @@ import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.api.recipes.ModHandler; import gregtech.api.unification.material.Material; import gregtech.api.util.GTUtility; @@ -33,7 +35,6 @@ 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.screen.UISettings; import com.cleanroommc.modularui.value.sync.PanelSyncManager; @@ -49,7 +50,7 @@ import static gregtech.api.capability.GregtechDataCodes.IS_TAPED; -public class MetaTileEntityCrate extends MetaTileEntity { +public class MetaTileEntityCrate extends MetaTileEntity implements IMetaTileEntityGuiHolder { private final Material material; private final int inventorySize; @@ -137,12 +138,8 @@ public int getDefaultPaintingColor() { } @Override - public boolean usesMui2() { - return true; - } - - @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager, UISettings settings) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager panelSyncManager, + UISettings settings) { panelSyncManager.registerSlotGroup("item_inv", rowSize); int rows = inventorySize / rowSize; diff --git a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCreativeChest.java b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCreativeChest.java index 469d5e3df4e..c497fb125e2 100644 --- a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCreativeChest.java +++ b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCreativeChest.java @@ -5,13 +5,13 @@ import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.api.util.GTTransferUtils; import gregtech.api.util.GTUtility; import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.custom.QuantumStorageRenderer; import gregtech.client.utils.TooltipHelper; -import net.minecraft.client.resources.I18n; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; @@ -29,7 +29,6 @@ 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.screen.UISettings; import com.cleanroommc.modularui.value.BoolValue; @@ -89,7 +88,8 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) { } @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager guiSyncManager, + UISettings settings) { guiSyncManager.syncValue("handler", this.modifiableHandler); return appendCreativeUI(GTGuis.createPanel(this, 176, 166), false, new BoolValue.Dynamic(() -> active, b -> active = b), @@ -179,8 +179,7 @@ public void writeItemStackData(NBTTagCompound tag) { @Override public void addInformation(ItemStack stack, @Nullable World player, List tooltip, boolean advanced) { - tooltip.add(I18n.format("gregtech.creative_tooltip.1") + TooltipHelper.RAINBOW + - I18n.format("gregtech.creative_tooltip.2") + I18n.format("gregtech.creative_tooltip.3")); + tooltip.add(TooltipHelper.CREATIVE_TOOLTIP.get()); // do not append the normal tooltips } @@ -255,7 +254,7 @@ protected int getStackLimit(int slot, ItemStack stack) { } @Override - public void setStackInSlot(int slot, ItemStack stack) { + public void setStackInSlot(int slot, @NotNull ItemStack stack) { modifiableHandler.setStackInSlot(slot, stack); } diff --git a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCreativeEnergy.java b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCreativeEnergy.java index 33e9469453d..17392b4174b 100644 --- a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCreativeEnergy.java +++ b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCreativeEnergy.java @@ -7,26 +7,26 @@ import gregtech.api.capability.IControllable; import gregtech.api.capability.IEnergyContainer; import gregtech.api.capability.ILaserContainer; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.widgets.ClickButtonWidget; -import gregtech.api.gui.widgets.CycleButtonWidget; -import gregtech.api.gui.widgets.ImageWidget; -import gregtech.api.gui.widgets.TextFieldWidget2; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuis; +import gregtech.api.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.api.util.GTUtility; +import gregtech.api.util.KeyUtil; +import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.texture.Textures; import gregtech.client.utils.TooltipHelper; 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.network.PacketBuffer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; +import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fml.relauncher.Side; @@ -37,26 +37,45 @@ import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.drawable.IDrawable; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.value.IDoubleValue; +import com.cleanroommc.modularui.api.value.IIntValue; +import com.cleanroommc.modularui.drawable.GuiTextures; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.utils.Alignment; +import com.cleanroommc.modularui.value.sync.BooleanSyncValue; +import com.cleanroommc.modularui.value.sync.LongSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.SyncHandlers; +import com.cleanroommc.modularui.widgets.ButtonWidget; +import com.cleanroommc.modularui.widgets.SliderWidget; +import com.cleanroommc.modularui.widgets.ToggleButton; +import com.cleanroommc.modularui.widgets.layout.Flow; +import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; 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.List; -import java.util.function.Function; +import java.util.function.IntConsumer; +import java.util.function.IntSupplier; -import static gregtech.api.GTValues.MAX; -import static gregtech.api.GTValues.V; import static gregtech.api.capability.GregtechDataCodes.UPDATE_ACTIVE; import static gregtech.api.capability.GregtechDataCodes.UPDATE_IO_SPEED; -public class MetaTileEntityCreativeEnergy extends MetaTileEntity implements ILaserContainer, IControllable { +public class MetaTileEntityCreativeEnergy extends MetaTileEntity implements ILaserContainer, IControllable, + IMetaTileEntityGuiHolder { - private long voltage = 0; - private int amps = 1; + private long sourceVoltage = GTValues.V[GTValues.ULV]; + private long sourceAmperage = 1; - private int setTier = 0; - private boolean active = false; + private long sinkVoltage = GTValues.V[GTValues.MAX]; + private long sinkAmperage = Integer.MAX_VALUE; + + private boolean workingEnabled = false; private boolean source = true; private long lastEnergyIOPerSec = 0; @@ -65,8 +84,13 @@ public class MetaTileEntityCreativeEnergy extends MetaTileEntity implements ILas private long ampsReceived = 0; private boolean doExplosion = false; - public MetaTileEntityCreativeEnergy() { - super(GTUtility.gregtechId("infinite_energy")); + public MetaTileEntityCreativeEnergy(ResourceLocation metaTileEntityId) { + super(metaTileEntityId); + } + + @Override + public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) { + return new MetaTileEntityCreativeEnergy(metaTileEntityId); } @Override @@ -82,12 +106,8 @@ public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, @Override @SideOnly(Side.CLIENT) public Pair getParticleTexture() { - return Pair.of(Textures.VOLTAGE_CASINGS[this.setTier].getParticleSprite(), this.getPaintingColorForRendering()); - } - - @Override - public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) { - return new MetaTileEntityCreativeEnergy(); + int tier = GTUtility.getTierByVoltage(source ? sourceVoltage : sinkVoltage); + return Pair.of(Textures.VOLTAGE_CASINGS[tier].getParticleSprite(), this.getPaintingColorForRendering()); } @Override @@ -104,61 +124,103 @@ public T getCapability(Capability capability, EnumFacing side) { } @Override - protected ModularUI createUI(EntityPlayer entityPlayer) { - ModularUI.Builder builder = ModularUI.defaultBuilder() - .widget(new CycleButtonWidget(7, 7, 30, 20, GTValues.VNF, () -> setTier, tier -> { - setTier = tier; - voltage = GTValues.V[setTier]; - })); - builder.label(7, 32, "gregtech.creative.energy.voltage"); - builder.widget(new ImageWidget(7, 44, 156, 20, GuiTextures.DISPLAY)); - builder.widget(new TextFieldWidget2(9, 50, 152, 16, () -> String.valueOf(voltage), value -> { - if (!value.isEmpty()) { - voltage = Long.parseLong(value); - setTier = GTUtility.getTierByVoltage(voltage); - } - }).setAllowedChars(TextFieldWidget2.NATURAL_NUMS).setMaxLength(19).setValidator(getTextFieldValidator())); - - builder.label(7, 74, "gregtech.creative.energy.amperage"); - builder.widget(new ClickButtonWidget(7, 87, 20, 20, "-", data -> amps = --amps == -1 ? 0 : amps)); - builder.widget(new ImageWidget(29, 87, 118, 20, GuiTextures.DISPLAY)); - builder.widget(new TextFieldWidget2(31, 93, 114, 16, () -> String.valueOf(amps), value -> { - if (!value.isEmpty()) { - amps = Integer.parseInt(value); - } - }).setMaxLength(10).setNumbersOnly(0, Integer.MAX_VALUE)); - builder.widget(new ClickButtonWidget(149, 87, 20, 20, "+", data -> { - if (amps < Integer.MAX_VALUE) { - amps++; + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager panelSyncManager, + UISettings settings) { + LongSyncValue voltageSync = SyncHandlers.longNumber(() -> source ? sourceVoltage : sinkVoltage, val -> { + if (source) { + sourceVoltage = val; + } else { + sinkVoltage = val; } - })); - - builder.dynamicLabel(7, 110, () -> "Energy I/O per sec: " + this.lastEnergyIOPerSec, 0x232323); - - builder.widget(new CycleButtonWidget(7, 139, 77, 20, () -> active, this::setActive, - "gregtech.creative.activity.off", "gregtech.creative.activity.on")); - builder.widget(new CycleButtonWidget(85, 139, 77, 20, () -> source, value -> { - source = value; + }); + LongSyncValue ampSync = new LongSyncValue(() -> source ? sourceAmperage : sinkAmperage, val -> { if (source) { - voltage = 0; - amps = 0; - setTier = 0; + sourceAmperage = val; } else { - voltage = V[MAX]; - amps = Integer.MAX_VALUE; - setTier = MAX; + sinkAmperage = val; } - }, "gregtech.creative.energy.sink", "gregtech.creative.energy.source")); - - return builder.build(getHolder(), entityPlayer); - } - - public void setActive(boolean active) { - this.active = active; - if (!getWorld().isRemote) { - writeCustomData(GregtechDataCodes.UPDATE_ACTIVE, buf -> buf.writeBoolean(active)); - markDirty(); - } + }); + DynamicIntValue tierValue = new DynamicIntValue(() -> GTUtility.getTierByVoltage(voltageSync.getLongValue()), + tier -> voltageSync.setLongValue(GTValues.V[tier])); + BooleanSyncValue activeSync = new BooleanSyncValue(this::isWorkingEnabled, this::setWorkingEnabled); + BooleanSyncValue sourceSync = new BooleanSyncValue(this::isSource, this::setSource); + + return GTGuis.createPanel(this, 176, 143) + .child(Flow.column() + .margin(7) + // .crossAxisAlignment(Alignment.CrossAxis.START) + .childPadding(4) + .child(new SliderWidget() + .widthRel(1.0f) + .sliderWidth(30) + .bounds(0, GTValues.V.length - 1) + .stopper(1) + .value(tierValue) + .background(GTGuiTextures.FLUID_SLOT.asIcon() + .margin(7, 0)) + .sliderTexture(IDrawable.of(GuiTextures.BUTTON_CLEAN, + IKey.dynamic(() -> GTValues.VNF[tierValue.getIntValue()])))) + .child(IKey.lang("gregtech.creative.energy.voltage") + .asWidget()) + .child(new TextFieldWidget() + .widthRel(1.0f) + .height(20) + .value(voltageSync) + .setNumbersLong(() -> 0L, () -> Long.MAX_VALUE) + .setMaxLength(19) + .background(GTGuiTextures.DISPLAY)) + .child(IKey.lang("gregtech.creative.energy.amperage") + .asWidget()) + .child(Flow.row() + .widthRel(1.0f) + .coverChildrenHeight() + .child(new ButtonWidget<>() + .size(20) + .onMousePressed(mouse -> { + long amps = ampSync.getLongValue(); + if (amps == 0) return false; + amps = Math.max(0, amps - GTUtility.getButtonIncrementValue()); + ampSync.setLongValue(amps); + return true; + }) + .overlay(KeyUtil.createMultiplierKey(false))) + .child(new TextFieldWidget() + .height(20) + .expanded() + .margin(4, 0) + .value(ampSync) + .setNumbersLong(() -> 0L, () -> Long.MAX_VALUE) + .setMaxLength(19) + .background(GTGuiTextures.DISPLAY)) + .child(new ButtonWidget<>() + .size(20) + .onMousePressed(mouse -> { + long amps = ampSync.getLongValue(); + if (amps == Long.MAX_VALUE) return false; + long canAdd = Long.MAX_VALUE - amps; + amps += Math.min(GTUtility.getButtonIncrementValue(), canAdd); + ampSync.setLongValue(amps); + return true; + }) + .overlay(KeyUtil.createMultiplierKey(true)))) + .child(IKey.lang("gregtech.creative.energy.io", + () -> new Object[] { TextFormattingUtil.formatNumbers(lastEnergyIOPerSec) }) + .asWidget()) + .child(Flow.row() + .coverChildrenHeight() + .child(new ToggleButton() + .size(77, 20) + .value(activeSync) + .overlay(IKey.lang(() -> activeSync.getBoolValue() ? + "gregtech.creative.activity.on" : + "gregtech.creative.activity.off"))) + .child(new ToggleButton() + .size(77, 20) + .align(Alignment.CenterRight) + .value(sourceSync) + .overlay(IKey.lang(() -> sourceSync.getBoolValue() ? + "gregtech.creative.energy.source" : + "gregtech.creative.energy.sink"))))); } @Override @@ -169,8 +231,7 @@ public void addToolUsages(ItemStack stack, @Nullable World world, List t @Override public void addInformation(ItemStack stack, @Nullable World world, List tooltip, boolean advanced) { - tooltip.add(I18n.format("gregtech.creative_tooltip.1") + TooltipHelper.RAINBOW + - I18n.format("gregtech.creative_tooltip.2") + I18n.format("gregtech.creative_tooltip.3")); + tooltip.add(TooltipHelper.CREATIVE_TOOLTIP.get()); } @Override @@ -191,8 +252,9 @@ public void update() { doExplosion = false; } } + ampsReceived = 0; - if (!active || !source || voltage <= 0 || amps <= 0) return; + if (!workingEnabled || !source || sourceVoltage <= 0 || sourceAmperage <= 0) return; long ampsUsed = 0; for (EnumFacing facing : EnumFacing.values()) { EnumFacing opposite = facing.getOpposite(); @@ -201,25 +263,31 @@ public void update() { IEnergyContainer container = tile.getCapability(GregtechCapabilities.CAPABILITY_ENERGY_CONTAINER, opposite); // Try to get laser capability - if (container == null) + if (container == null) { container = tile.getCapability(GregtechTileCapabilities.CAPABILITY_LASER, opposite); + } - if (container == null || !container.inputsEnergy(opposite) || container.getEnergyCanBeInserted() == 0) + if (container == null || !container.inputsEnergy(opposite) || container.getEnergyCanBeInserted() == 0) { continue; - ampsUsed += container.acceptEnergyFromNetwork(opposite, voltage, amps - ampsUsed); - if (ampsUsed >= amps) + } + + ampsUsed += container.acceptEnergyFromNetwork(opposite, sourceVoltage, sourceAmperage - ampsUsed); + if (ampsUsed >= sourceAmperage) { break; + } } } - energyIOPerSec += ampsUsed * voltage; + + energyIOPerSec += ampsUsed * sourceVoltage; } @Override public NBTTagCompound writeToNBT(NBTTagCompound data) { - data.setLong("Voltage", voltage); - data.setInteger("Amps", amps); - data.setByte("Tier", (byte) setTier); - data.setBoolean("Active", active); + data.setLong("SourceV", sourceVoltage); + data.setLong("SourceA", sourceAmperage); + data.setLong("SinkV", sinkVoltage); + data.setLong("SinkA", sinkAmperage); + data.setBoolean("Active", workingEnabled); data.setBoolean("Source", source); data.setLong("EnergyIOPerSec", lastEnergyIOPerSec); return super.writeToNBT(data); @@ -227,10 +295,18 @@ public NBTTagCompound writeToNBT(NBTTagCompound data) { @Override public void readFromNBT(NBTTagCompound data) { - voltage = data.getLong("Voltage"); - amps = data.getInteger("Amps"); - setTier = data.getByte("Tier"); - active = data.getBoolean("Active"); + // Old format + if (data.hasKey("Voltage")) { + sourceVoltage = data.getLong("Voltage"); + sourceAmperage = data.getLong("Amps"); + } else { + sourceVoltage = data.getLong("SourceV"); + sourceAmperage = data.getLong("SourceA"); + sinkVoltage = data.getLong("SinkV"); + sinkAmperage = data.getLong("SinkA"); + } + + workingEnabled = data.getBoolean("Active"); source = data.getBoolean("Source"); if (data.hasKey("EnergyIOPerSec")) lastEnergyIOPerSec = data.getLong("EnergyIOPerSec"); @@ -239,21 +315,24 @@ public void readFromNBT(NBTTagCompound data) { @Override public long acceptEnergyFromNetwork(EnumFacing side, long voltage, long amperage) { - if (source || !active || ampsReceived >= amps) { + if (source || !workingEnabled || ampsReceived >= sinkAmperage) { return 0; } - if (voltage > this.voltage) { + + if (voltage > this.sourceVoltage) { if (doExplosion) return 0; doExplosion = true; return Math.min(amperage, getInputAmperage() - ampsReceived); } + long amperesAccepted = Math.min(amperage, getInputAmperage() - ampsReceived); if (amperesAccepted > 0) { ampsReceived += amperesAccepted; energyIOPerSec += amperesAccepted * voltage; return amperesAccepted; } + return 0; } @@ -269,7 +348,7 @@ public boolean outputsEnergy(EnumFacing side) { @Override public long changeEnergy(long differenceAmount) { - if (source || !active) { + if (source || !workingEnabled) { return 0; } energyIOPerSec += differenceAmount; @@ -278,32 +357,32 @@ public long changeEnergy(long differenceAmount) { @Override public long getEnergyStored() { - return 69; + return source ? Long.MAX_VALUE : 0; } @Override public long getEnergyCapacity() { - return 420; + return Long.MAX_VALUE; } @Override public long getInputAmperage() { - return source ? 0 : amps; + return source ? 0 : sinkAmperage; } @Override public long getInputVoltage() { - return source ? 0 : voltage; + return source ? 0 : sinkVoltage; } @Override public long getOutputVoltage() { - return source ? voltage : 0; + return source ? sourceVoltage : 0; } @Override public long getOutputAmperage() { - return source ? amps : 0; + return source ? sourceAmperage : 0; } public void setIOSpeed(long energyIOPerSec) { @@ -319,47 +398,88 @@ public void receiveCustomData(int dataId, @NotNull PacketBuffer buf) { if (dataId == UPDATE_IO_SPEED) { this.lastEnergyIOPerSec = buf.readLong(); } else if (dataId == UPDATE_ACTIVE) { - this.active = buf.readBoolean(); + this.workingEnabled = buf.readBoolean(); } } @Override public void writeInitialSyncData(@NotNull PacketBuffer buf) { super.writeInitialSyncData(buf); - buf.writeBoolean(active); + buf.writeBoolean(workingEnabled); } @Override public void receiveInitialSyncData(@NotNull PacketBuffer buf) { super.receiveInitialSyncData(buf); - this.active = buf.readBoolean(); - } - - public static Function getTextFieldValidator() { - return val -> { - if (val.isEmpty()) { - return "0"; - } - long num; - try { - num = Long.parseLong(val); - } catch (NumberFormatException ignored) { - return "0"; - } - if (num < 0) { - return "0"; - } - return val; - }; + this.workingEnabled = buf.readBoolean(); } @Override public boolean isWorkingEnabled() { - return active; + return workingEnabled; } @Override public void setWorkingEnabled(boolean isWorkingAllowed) { - setActive(isWorkingAllowed); + this.workingEnabled = isWorkingAllowed; + if (!getWorld().isRemote) { + writeCustomData(GregtechDataCodes.UPDATE_ACTIVE, buf -> buf.writeBoolean(workingEnabled)); + markDirty(); + } + } + + public boolean isSource() { + return source; + } + + public void setSource(boolean source) { + this.source = source; + } + + @SuppressWarnings("ClassCanBeRecord") + private static class DynamicIntValue implements IIntValue, IDoubleValue { + + private final IntSupplier getter; + private final IntConsumer setter; + + public DynamicIntValue(IntSupplier getter, IntConsumer setter) { + this.getter = getter; + this.setter = setter; + } + + @Override + public int getIntValue() { + return this.getter.getAsInt(); + } + + @Override + public void setIntValue(int val) { + this.setter.accept(val); + } + + @Override + public double getDoubleValue() { + return getIntValue(); + } + + @Override + public void setDoubleValue(double val) { + setIntValue((int) val); + } + + @Override + public Integer getValue() { + return getIntValue(); + } + + @Override + public void setValue(Integer value) { + setIntValue(value); + } + + @Override + public Class getValueType() { + return Integer.class; + } } } diff --git a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCreativeTank.java b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCreativeTank.java index 843e7387bdc..394220196d3 100644 --- a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCreativeTank.java +++ b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCreativeTank.java @@ -4,13 +4,13 @@ import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.api.util.GTUtility; import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.custom.QuantumStorageRenderer; import gregtech.client.utils.TooltipHelper; import gregtech.common.mui.widget.GTFluidSlot; -import net.minecraft.client.resources.I18n; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -30,13 +30,13 @@ 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.screen.UISettings; import com.cleanroommc.modularui.value.BoolValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import org.apache.commons.lang3.ArrayUtils; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -89,7 +89,8 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) { } @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager guiSyncManager, + UISettings settings) { return appendCreativeUI(GTGuis.createPanel(this, 176, 166), true, new BoolValue.Dynamic(() -> active, b -> active = b), new IntSyncValue(() -> mBPerCycle, v -> mBPerCycle = v), @@ -153,8 +154,7 @@ public void writeItemStackData(NBTTagCompound itemStack) { @Override public void addInformation(ItemStack stack, @Nullable World player, List tooltip, boolean advanced) { - tooltip.add(I18n.format("gregtech.creative_tooltip.1") + TooltipHelper.RAINBOW + - I18n.format("gregtech.creative_tooltip.2") + I18n.format("gregtech.creative_tooltip.3")); + tooltip.add(TooltipHelper.CREATIVE_TOOLTIP.get()); // do not append the normal tooltips } diff --git a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumStorage.java b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumStorage.java index 440c4290075..1bd0ebebba1 100644 --- a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumStorage.java +++ b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumStorage.java @@ -7,6 +7,8 @@ import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.api.util.GTUtility; import gregtech.client.renderer.handler.BlockPosHighlightRenderer; import gregtech.client.renderer.texture.Textures; @@ -33,7 +35,6 @@ import com.cleanroommc.modularui.animation.Animator; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.drawable.DynamicDrawable; -import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.screen.UISettings; import com.cleanroommc.modularui.utils.Alignment; @@ -63,7 +64,7 @@ import static gregtech.api.capability.GregtechDataCodes.*; public abstract class MetaTileEntityQuantumStorage extends MetaTileEntity implements IQuantumStorage, - IActiveOutputSide { + IActiveOutputSide, IMetaTileEntityGuiHolder { /** not synced, server only. lazily initialized from pos */ private WeakReference controller = new WeakReference<>(null); @@ -169,12 +170,8 @@ public void onPlacement(@Nullable EntityLivingBase placer) { } @Override - public boolean usesMui2() { - return true; - } - - @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager guiSyncManager, + UISettings settings) { var panel = GTGuis.createPanel(this, 176, 166); createWidgets(panel, guiSyncManager); return panel.padding(4) diff --git a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumTank.java b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumTank.java index 36b141fdf86..3fd890f68f9 100644 --- a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumTank.java +++ b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumTank.java @@ -242,7 +242,7 @@ protected FluidTankList createExportFluidHandler() { @Override protected IItemHandlerModifiable createImportItemHandler() { - return new FilteredItemHandler(this, 1).setFillPredicate( + return new FilteredItemHandler(this, 1, FilteredItemHandler.getCapabilityFilter(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY)); } diff --git a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityWorkbench.java b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityWorkbench.java index 3483c603223..7293e1ac768 100644 --- a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityWorkbench.java +++ b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityWorkbench.java @@ -7,6 +7,8 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.IMetaTileEntityGuiHolder; +import gregtech.api.mui.MetaTileEntityGuiData; import gregtech.api.mui.sync.PagedWidgetSyncHandler; import gregtech.api.util.GTUtility; import gregtech.api.util.TextFormattingUtil; @@ -72,7 +74,7 @@ import java.util.Collections; import java.util.List; -public class MetaTileEntityWorkbench extends MetaTileEntity { +public class MetaTileEntityWorkbench extends MetaTileEntity implements IMetaTileEntityGuiHolder { private static final IDrawable CHEST = new ItemDrawable(new ItemStack(Blocks.CHEST)) .asIcon().size(16); @@ -213,12 +215,8 @@ public void clearMachineInventory(@NotNull List<@NotNull ItemStack> itemBuffer) } @Override - public boolean usesMui2() { - return true; - } - - @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager syncManager, UISettings settings) { + public @NotNull ModularPanel buildUI(MetaTileEntityGuiData guiData, PanelSyncManager syncManager, + UISettings settings) { getCraftingRecipeLogic().updateCurrentRecipe(); this.recipeLogic.clearSlotMap(); diff --git a/src/main/java/gregtech/core/CoreModule.java b/src/main/java/gregtech/core/CoreModule.java index 9fa5c6c7edf..f388bf7afac 100644 --- a/src/main/java/gregtech/core/CoreModule.java +++ b/src/main/java/gregtech/core/CoreModule.java @@ -51,6 +51,7 @@ import gregtech.common.items.MetaItems; import gregtech.common.items.ToolItems; import gregtech.common.metatileentities.MetaTileEntities; +import gregtech.common.metatileentities.electric.MetaTileEntityAlarm; import gregtech.common.worldgen.LootTableHelper; import gregtech.core.advancement.AdvancementTriggers; import gregtech.core.advancement.internal.AdvancementManager; @@ -79,6 +80,7 @@ import gregtech.modules.GregTechModules; import net.minecraft.block.state.IBlockState; +import net.minecraft.init.SoundEvents; import net.minecraft.world.World; import net.minecraftforge.classloading.FMLForgePlugin; import net.minecraftforge.common.MinecraftForge; @@ -140,6 +142,10 @@ public void preInit(FMLPreInitializationEvent event) { GregTechAPI.soundManager = SoundManager.getInstance(); GTSoundEvents.register(); + MetaTileEntityAlarm.addSound(GTSoundEvents.DEFAULT_ALARM); + MetaTileEntityAlarm.addSound(GTSoundEvents.ARC); + MetaTileEntityAlarm.addSound(SoundEvents.ENTITY_WOLF_HOWL); + MetaTileEntityAlarm.addSound(SoundEvents.ENTITY_ENDERMEN_DEATH); /* MUI Initialization */ GTGuis.registerFactories(); diff --git a/src/main/java/gregtech/core/sound/GTSoundEvents.java b/src/main/java/gregtech/core/sound/GTSoundEvents.java index 80f5caccd3b..9cf6d1ac524 100644 --- a/src/main/java/gregtech/core/sound/GTSoundEvents.java +++ b/src/main/java/gregtech/core/sound/GTSoundEvents.java @@ -44,9 +44,6 @@ public class GTSoundEvents { public static SoundEvent MORTAR_TOOL; public static SoundEvent SOFT_MALLET_TOOL; - // Record Sounds - public static SoundEvent SUS_RECORD; - // Entity Sounds public static SoundEvent PORTAL_OPENING; public static SoundEvent PORTAL_CLOSING; @@ -95,7 +92,6 @@ public static void register() { SPRAY_CAN_TOOL = soundManager.registerSound("use.spray_can"); TRICORDER_TOOL = soundManager.registerSound("use.tricorder"); MORTAR_TOOL = soundManager.registerSound("use.mortar"); - SUS_RECORD = soundManager.registerSound("record.sus"); PORTAL_OPENING = soundManager.registerSound("entity.portal_opening"); PORTAL_CLOSING = soundManager.registerSound("entity.portal_closing"); diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index 3429aad9618..656a2a64724 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -1223,9 +1223,6 @@ metaarmor.energy_share.disable=Energy Supply: Gadgets charging disabled metaarmor.energy_share.tooltip=Supply mode: %s metaarmor.energy_share.tooltip.guide=To change mode shift-right click when holding item -metaitem.record.sus.name=Music Disc -metaitem.record.sus.tooltip=§7Leonz - Among Us Drip - metaitem.nan.certificate.name=Certificate of Not Being a Noob Anymore metaitem.nan.certificate.tooltip=Challenge Accepted! @@ -5362,14 +5359,18 @@ gregtech.machine.maintenance_hatch_cleanroom_auto.tooltip.1=For automatically ma gregtech.machine.maintenance_hatch.cleanroom_auto.tooltip.2=Cleans as: gregtech.machine.maintenance_hatch_tool_slot.tooltip=Click slot with empty hand when required tools are in inventory to solve problems gregtech.machine.maintenance_hatch_tape_slot.tooltip=Insert Tape to prevent problems +gregtech.machine.maintenance_hatch.fools.start=Click to start! +gregtech.machine.maintenance_hatch.fools.dead=You died! +gregtech.machine.maintenance_hatch.fools.respawn=Click to restart +gregtech.machine.maintenance_hatch.fools.won=You won! -gregtech.maintenance.configurable_duration=Duration: %fx +gregtech.maintenance.configurable_duration=Duration: %sx gregtech.maintenance.configurable_duration.unchanged_description=Recipes will run at normal speed. Change configuration to update. -gregtech.maintenance.configurable_duration.changed_description=Recipes will run with %fx duration, applied before overclocking. +gregtech.maintenance.configurable_duration.changed_description=Recipes will run with %sx duration, applied before overclocking. -gregtech.maintenance.configurable_time=Time: %fx +gregtech.maintenance.configurable_time=Time: %sx gregtech.maintenance.configurable_time.unchanged_description=Maintenance problems will occur at normal rate. Change configuration to update. -gregtech.maintenance.configurable_time.changed_description=Maintenance problems will occur at %fx the normal rate. +gregtech.maintenance.configurable_time.changed_description=Maintenance problems will occur at %sx the normal rate. gregtech.maintenance.configurable.tooltip_basic=Speeds up machine processing time at the cost of more frequent maintenance problems gregtech.maintenance.configurable.tooltip_more_info=Hold SHIFT for special interactions @@ -5421,6 +5422,8 @@ gregtech.machine.data_access_hatch.tooltip.1=Data Access for Multiblocks gregtech.machine.data_access_hatch.tooltip.2=Adds §a%s§7 slots for Data Items gregtech.machine.data_access_hatch.advanced.name=Advanced Data Access Hatch gregtech.machine.data_access_hatch.creative.name=Creative Data Access Hatch +gregtech.machine.data_access_hatch.recipes=Providing recipes: +gregtech.machine.data_access_hatch.no_recipes=Providing no recipes gregtech.machine.data_access_hatch.optical.receiver.name=Optical Data Reception Hatch gregtech.machine.data_access_hatch.optical.receiver.tooltip=Research Data Input for Multiblocks @@ -5689,7 +5692,11 @@ gregtech.gui.config_slot.remove=§7Right click to §4clear§7 config slot.§r gregtech.gui.config_slot.auto_pull_managed=§4Disabled:§7 Managed by Auto-Pull gregtech.gui.me_bus.extra_slot=Extra Slot/n§7Put extra items for recipes here, like Molds or Lenses gregtech.gui.me_bus.auto_pull_button=Click to toggle automatic item pulling from ME -gregtech.gui.alarm.radius=Radius: +gregtech.gui.alarm.radius=Alarm Radius: +gregtech.gui.alarm.sounds_popup_button=Select sound to play +gregtech.gui.alarm.sounds_preview_button=Click to preview selected sound +gregtech.gui.alarm.sounds=Sounds +gregtech.gui.alarm.selected_sound=Selected sound gregtech.gui.item_passthrough.enabled=Item Passthough Enabled gregtech.gui.item_passthrough.disabled=Item Passthough Disabled gregtech.gui.fluid_passthrough.enabled=Fluid Passthough Enabled @@ -6046,6 +6053,7 @@ gregtech.creative.energy.amperage=Amperage gregtech.creative.energy.voltage=Voltage gregtech.creative.energy.sink=Sink gregtech.creative.energy.source=Source +gregtech.creative.energy.io=Energy I/O per sec: %s gregtech.creative.activity.on=Active gregtech.creative.activity.off=Not active @@ -6329,7 +6337,6 @@ gregtech.subtitle.use.wirecutter=Wires snip gregtech.subtitle.use.spray_can=Paint sprays gregtech.subtitle.use.tricorder=Beep beep gregtech.subtitle.use.mortar=Grinding -gregtech.subtitle.record.sus=Sus gregtech.subtitle.entity.portal_opening=Portal opens gregtech.subtitle.entity.portal_closing=Portal closes gregtech.subtitle.maintenance.electrical=Electrical breakdown @@ -6540,6 +6547,4 @@ gregtech.scanner.forestry.caterpillar=§oScanned Caterpillar gregtech.scanner.forestry.pollen=§oScanned Pollen # Mutation -gregtech.mutation.block_of=Block of %s - -record.sus=Leonz - Among Us Drip +gregtech.mutation.block_of=Block of % diff --git a/src/main/resources/assets/gregtech/lang/ja_jp.lang b/src/main/resources/assets/gregtech/lang/ja_jp.lang index 846a51bd8f6..f656280193f 100644 --- a/src/main/resources/assets/gregtech/lang/ja_jp.lang +++ b/src/main/resources/assets/gregtech/lang/ja_jp.lang @@ -1203,9 +1203,6 @@ metaarmor.energy_share.disable=電力供給: 装備への電力供給を無効 metaarmor.energy_share.tooltip=供給モード: %s metaarmor.energy_share.tooltip.guide=手に持ちながらShift+右クリックでモードを変更 -metaitem.record.sus.name=音楽ディスク -metaitem.record.sus.tooltip=§7Leonz - Among Us Drip - metaitem.nan.certificate.name=もう初心者ではないという証明 metaitem.nan.certificate.tooltip=挑戦を受けました! @@ -6249,7 +6246,6 @@ gregtech.subtitle.use.wirecutter=ワイヤーが切断される gregtech.subtitle.use.spray_can=スプレーをする gregtech.subtitle.use.tricorder=スキャンする gregtech.subtitle.use.mortar=粉々にする -gregtech.subtitle.record.sus=Sus gregtech.subtitle.entity.portal_opening=ポータルが開く gregtech.subtitle.entity.portal_closing=ポータルが閉じる gregtech.subtitle.maintenance.electrical=電気的故障 @@ -6460,5 +6456,3 @@ gregtech.scanner.forestry.pollen=§o解析済みの花粉 # Mutation gregtech.mutation.block_of=%sブロック - -record.sus=Leonz - Among Us Drip diff --git a/src/main/resources/assets/gregtech/lang/ru_ru.lang b/src/main/resources/assets/gregtech/lang/ru_ru.lang index b6cc61eb30b..ff79b933eb8 100644 --- a/src/main/resources/assets/gregtech/lang/ru_ru.lang +++ b/src/main/resources/assets/gregtech/lang/ru_ru.lang @@ -1044,8 +1044,6 @@ metaarmor.energy_share.enable=Энергоснабжение: включена metaarmor.energy_share.disable=Энергоснабжение: выключена зарядка гаджетов metaarmor.energy_share.tooltip=Режим снабжения: %s metaarmor.energy_share.tooltip.guide=Чтобы изменить режим, щелкните правой кнопкой мыши, удерживая предмет -metaitem.record.sus.name=Музыкальный диск -metaitem.record.sus.tooltip=§7Leonz - Among Us Drip metaitem.nan.certificate.name=Сертификат о том, что я больше не нуб metaitem.nan.certificate.tooltip=Вызов принят! metaitem.fertilizer.name=Удобрение @@ -5309,7 +5307,6 @@ gregtech.subtitle.use.wirecutter=Щелчок проводов gregtech.subtitle.use.spray_can=Краска распыляется gregtech.subtitle.use.tricorder=Бип-бип gregtech.subtitle.use.mortar=Измельчение -gregtech.subtitle.record.sus=Sus gregtech.subtitle.entity.portal_opening=Портал открывается gregtech.subtitle.entity.portal_closing=Портал закрывается gregtech.subtitle.maintenance.electrical=Электрическая поломка @@ -5895,7 +5892,6 @@ gregtech.machine.me_import_fluid_hatch.configs.tooltip=Держит 16 жидк gregtech.machine.me.item_export.tooltip.2=Может удерживать в себе бесконечное количество предмета gregtech.machine.me.fluid_export.tooltip.2=Может удерживать в себе бесконечное количество жидкости gregtech.machine.me.stocking_auto_pull_disabled=Авто-вытягивание выкл -record.sus=Leonz - Among Us Drip option.gregtech.diode=Диоды cover.robotic_arm.exact=§7Пред. cover.bucket.mode.milli_bucket_exact=Л diff --git a/src/main/resources/assets/gregtech/lang/uk_ua.lang b/src/main/resources/assets/gregtech/lang/uk_ua.lang index e1da7e1cddf..5870275f16d 100644 --- a/src/main/resources/assets/gregtech/lang/uk_ua.lang +++ b/src/main/resources/assets/gregtech/lang/uk_ua.lang @@ -999,8 +999,6 @@ metaarmor.energy_share.enable=Енергопостачання: Увімкнен metaarmor.energy_share.disable=Енергопостачання: Вимкнено зарядку пристроїв metaarmor.energy_share.tooltip=Режим постачання: %s metaarmor.energy_share.tooltip.guide=Щоб змінити режим, клацніть SHIFT-ПКМ, утримуючи предмет -metaitem.record.sus.name=Музичний диск -metaitem.record.sus.tooltip=§7Leonz - Among Us Drip metaitem.nan.certificate.name=Сертифікат про те, що ви більше не новачок metaitem.nan.certificate.tooltip=Виклик прийнято! metaitem.fertilizer.name=Добриво diff --git a/src/main/resources/assets/gregtech/lang/zh_cn.lang b/src/main/resources/assets/gregtech/lang/zh_cn.lang index c64e1093d9a..5d4f865ab65 100644 --- a/src/main/resources/assets/gregtech/lang/zh_cn.lang +++ b/src/main/resources/assets/gregtech/lang/zh_cn.lang @@ -1223,8 +1223,6 @@ metaarmor.energy_share.disable=能量供给:装置充能已禁用 metaarmor.energy_share.tooltip=供能模式:%s metaarmor.energy_share.tooltip.guide=持握物品并潜行右击以更换模式 -metaitem.record.sus.name=音乐唱片 -metaitem.record.sus.tooltip=§7Leonz - Among Us Drip metaitem.nan.certificate.name=不再是菜鸟的证明 metaitem.nan.certificate.tooltip=已接受挑战! @@ -6329,7 +6327,6 @@ gregtech.subtitle.use.wirecutter=剪线钳:剪断 gregtech.subtitle.use.spray_can=喷漆罐:喷涂 gregtech.subtitle.use.tricorder=三录仪:哔哔 gregtech.subtitle.use.mortar=研钵:研磨 -gregtech.subtitle.record.sus=唱片:你有嫌疑 gregtech.subtitle.entity.portal_opening=传送门:开启 gregtech.subtitle.entity.portal_closing=传送门:关闭 gregtech.subtitle.maintenance.electrical=机器:电网瘫痪 @@ -6541,5 +6538,3 @@ gregtech.scanner.forestry.pollen=§o花粉(已扫描) # Mutation gregtech.mutation.block_of=%s块 - -record.sus=Leonz - Among Us Drip diff --git a/src/main/resources/assets/gregtech/models/item/metaitems/record.sus.json b/src/main/resources/assets/gregtech/models/item/metaitems/record.sus.json deleted file mode 100644 index a344328af30..00000000000 --- a/src/main/resources/assets/gregtech/models/item/metaitems/record.sus.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "gregtech:items/metaitems/record.sus" - } -} diff --git a/src/main/resources/assets/gregtech/sounds.json b/src/main/resources/assets/gregtech/sounds.json index 1b48b5e5953..9bdf7dfbb1c 100644 --- a/src/main/resources/assets/gregtech/sounds.json +++ b/src/main/resources/assets/gregtech/sounds.json @@ -338,16 +338,6 @@ } ] }, - "record.sus": { - "subtitle" : "gregtech.subtitle.record.sus", - "category": "block", - "sounds": [ - { - "name": "gregtech:sus", - "stream": true - } - ] - }, "entity.portal_opening": { "subtitle" : "gregtech.subtitle.entity.portal_opening", "category": "block", diff --git a/src/main/resources/assets/gregtech/sounds/sus.ogg b/src/main/resources/assets/gregtech/sounds/sus.ogg deleted file mode 100644 index f0b9e4f21b2..00000000000 Binary files a/src/main/resources/assets/gregtech/sounds/sus.ogg and /dev/null differ diff --git a/src/main/resources/assets/gregtech/textures/gui/widget/electricity_wires.png b/src/main/resources/assets/gregtech/textures/gui/widget/electricity_wires.png deleted file mode 100644 index 588236f86a3..00000000000 Binary files a/src/main/resources/assets/gregtech/textures/gui/widget/electricity_wires.png and /dev/null differ diff --git a/src/main/resources/assets/gregtech/textures/gui/widget/electricity_wires_base.png b/src/main/resources/assets/gregtech/textures/gui/widget/electricity_wires_base.png deleted file mode 100644 index 75a78ddad03..00000000000 Binary files a/src/main/resources/assets/gregtech/textures/gui/widget/electricity_wires_base.png and /dev/null differ diff --git a/src/main/resources/assets/gregtech/textures/gui/widget/electricity_wires_baseback.png b/src/main/resources/assets/gregtech/textures/gui/widget/electricity_wires_baseback.png deleted file mode 100644 index c3d7a31865c..00000000000 Binary files a/src/main/resources/assets/gregtech/textures/gui/widget/electricity_wires_baseback.png and /dev/null differ diff --git a/src/main/resources/assets/gregtech/textures/gui/widget/speaker.png b/src/main/resources/assets/gregtech/textures/gui/widget/speaker.png new file mode 100644 index 00000000000..a86ba0aa6c7 Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/gui/widget/speaker.png differ