From f0d814649e4a83e3d9b74c446814be1a8eef40ee Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 18 Feb 2025 19:36:52 -0700 Subject: [PATCH 1/8] update to rc4 --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 7a1dea7d03f..74ea3cf0e06 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -40,7 +40,7 @@ dependencies { // Published dependencies api("codechicken:codechickenlib:3.2.3.358") - api("com.cleanroommc:modularui:2.5.0-rc3") { transitive = false } + api("com.cleanroommc:modularui:2.5.0-rc4") { transitive = false } api("com.cleanroommc:groovyscript:1.2.0-hotfix1") { transitive = false } api("curse.maven:inventory-bogosorter-632327:4951607-deobf-4951608-sources-4951609") api("CraftTweaker2:CraftTweaker2-MC1120-Main:1.12-4.1.20.700") From 5fbf2d4a8cf52c3696336007e776fb902fd99b73 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 18 Feb 2025 20:07:34 -0700 Subject: [PATCH 2/8] remove/simplify mixins --- .../java/gregtech/api/mui/LocaleAccessor.java | 20 --- .../gregtech/mixins/minecraft/L18nMixin.java | 21 --- .../mixins/minecraft/LocaleMixin.java | 23 --- .../java/gregtech/mixins/mui2/InputMixin.java | 64 ------- .../gregtech/mixins/mui2/LangKeyMixin.java | 15 +- .../mixins/mui2/ModularPanelMixin.java | 164 ++---------------- .../resources/mixins.gregtech.minecraft.json | 2 - src/main/resources/mixins.gregtech.mui2.json | 1 - 8 files changed, 18 insertions(+), 292 deletions(-) delete mode 100644 src/main/java/gregtech/api/mui/LocaleAccessor.java delete mode 100644 src/main/java/gregtech/mixins/minecraft/L18nMixin.java delete mode 100644 src/main/java/gregtech/mixins/minecraft/LocaleMixin.java delete mode 100644 src/main/java/gregtech/mixins/mui2/InputMixin.java diff --git a/src/main/java/gregtech/api/mui/LocaleAccessor.java b/src/main/java/gregtech/api/mui/LocaleAccessor.java deleted file mode 100644 index 2fee169f215..00000000000 --- a/src/main/java/gregtech/api/mui/LocaleAccessor.java +++ /dev/null @@ -1,20 +0,0 @@ -package gregtech.api.mui; - -import net.minecraft.client.resources.Locale; - -// todo remove in next mui2 version -public interface LocaleAccessor { - - String gregtech$getRawKey(String s); - - ThreadLocal accessor = new ThreadLocal<>(); - - static String getRawKey(String s) { - if (accessor.get() == null) return s; - return accessor.get().gregtech$getRawKey(s); - } - - static void setLocale(Locale locale) { - accessor.set((LocaleAccessor) locale); - } -} diff --git a/src/main/java/gregtech/mixins/minecraft/L18nMixin.java b/src/main/java/gregtech/mixins/minecraft/L18nMixin.java deleted file mode 100644 index 26d67c82e0b..00000000000 --- a/src/main/java/gregtech/mixins/minecraft/L18nMixin.java +++ /dev/null @@ -1,21 +0,0 @@ -package gregtech.mixins.minecraft; - -import gregtech.api.mui.LocaleAccessor; - -import net.minecraft.client.resources.I18n; -import net.minecraft.client.resources.Locale; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -// todo remove in next mui2 version -@Mixin(I18n.class) -public abstract class L18nMixin { - - @Inject(method = "setLocale", at = @At("HEAD")) - private static void getLocale(Locale i18nLocaleIn, CallbackInfo ci) { - LocaleAccessor.setLocale(i18nLocaleIn); - } -} diff --git a/src/main/java/gregtech/mixins/minecraft/LocaleMixin.java b/src/main/java/gregtech/mixins/minecraft/LocaleMixin.java deleted file mode 100644 index b93f29b02e6..00000000000 --- a/src/main/java/gregtech/mixins/minecraft/LocaleMixin.java +++ /dev/null @@ -1,23 +0,0 @@ -package gregtech.mixins.minecraft; - -import gregtech.api.mui.LocaleAccessor; - -import net.minecraft.client.resources.Locale; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; - -import java.util.Map; - -// todo remove in next mui2 version -@Mixin(Locale.class) -public abstract class LocaleMixin implements LocaleAccessor { - - @Shadow - Map properties; - - @Override - public String gregtech$getRawKey(String s) { - return this.properties.get(s); - } -} diff --git a/src/main/java/gregtech/mixins/mui2/InputMixin.java b/src/main/java/gregtech/mixins/mui2/InputMixin.java deleted file mode 100644 index 0e1d3febacf..00000000000 --- a/src/main/java/gregtech/mixins/mui2/InputMixin.java +++ /dev/null @@ -1,64 +0,0 @@ -package gregtech.mixins.mui2; - -import gregtech.api.mui.InputAccessor; - -import com.cleanroommc.modularui.api.widget.Interactable; -import com.cleanroommc.modularui.screen.viewport.LocatedWidget; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; - -// todo remove on next mui2 update -@Mixin(targets = "com.cleanroommc.modularui.screen.ModularPanel$Input", remap = false) -public abstract class InputMixin implements InputAccessor { - - @Shadow - private boolean held; - - @Shadow - private long timeHeld; - - @Shadow - private @Nullable LocatedWidget lastPressed; - - @Shadow - private int lastButton; - - @Shadow - protected abstract void addAcceptedInteractable(Interactable interactable); - - @Override - public boolean held() { - return this.held; - } - - @Override - public void held(boolean held) { - this.held = held; - } - - @Override - public void timeHeld(long a) { - timeHeld = a; - } - - @Override - public LocatedWidget lastPressed() { - return this.lastPressed; - } - - @Override - public void lastPressed(LocatedWidget last) { - this.lastPressed = last; - } - - @Override - public void lastButton(int b) { - this.lastButton = b; - } - - @Override - public void addInteractable(Interactable i) { - addAcceptedInteractable(i); - } -} diff --git a/src/main/java/gregtech/mixins/mui2/LangKeyMixin.java b/src/main/java/gregtech/mixins/mui2/LangKeyMixin.java index 7c219710609..2e5e1a3f8ce 100644 --- a/src/main/java/gregtech/mixins/mui2/LangKeyMixin.java +++ b/src/main/java/gregtech/mixins/mui2/LangKeyMixin.java @@ -1,23 +1,20 @@ package gregtech.mixins.mui2; -import gregtech.api.mui.LocaleAccessor; - import com.cleanroommc.modularui.drawable.text.BaseKey; import com.cleanroommc.modularui.drawable.text.LangKey; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; -// todo remove in next mui2 version +// all this mixin does is switch newlines to the expected format @Mixin(value = LangKey.class, remap = false) public abstract class LangKeyMixin extends BaseKey { - @Redirect(method = "getFormatted", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/resources/I18n;format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;")) - public String getTranslateKey(String translateKey, Object[] parameters) { - return LocaleAccessor.getRawKey(translateKey) + @ModifyExpressionValue(method = "getFormatted", + at = @At(value = "INVOKE", + target = "Lcom/cleanroommc/modularui/drawable/text/FontRenderHelper;formatArgs([Ljava/lang/Object;Lcom/cleanroommc/modularui/drawable/text/FormattingState;Ljava/lang/String;Z)Ljava/lang/String;")) + public String getTranslateKey(String original) { + return original .replace("\\n", "\n") .replace("/n", "\n"); } diff --git a/src/main/java/gregtech/mixins/mui2/ModularPanelMixin.java b/src/main/java/gregtech/mixins/mui2/ModularPanelMixin.java index 16e4a2b6b8c..78cec0e56bb 100644 --- a/src/main/java/gregtech/mixins/mui2/ModularPanelMixin.java +++ b/src/main/java/gregtech/mixins/mui2/ModularPanelMixin.java @@ -1,167 +1,27 @@ package gregtech.mixins.mui2; -import gregtech.api.mui.InputAccessor; -import gregtech.api.util.Mods; -import gregtech.integration.jei.JustEnoughItemsModule; -import gregtech.mixins.jei.DragManagerAccessor; -import gregtech.mixins.jei.GhostDragAccessor; - -import net.minecraft.client.Minecraft; - import com.cleanroommc.modularui.api.layout.IViewport; -import com.cleanroommc.modularui.api.widget.IFocusedWidget; -import com.cleanroommc.modularui.api.widget.Interactable; -import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; +import com.cleanroommc.modularui.integration.jei.ModularUIJeiPlugin; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.screen.viewport.LocatedWidget; -import com.cleanroommc.modularui.utils.ObjectList; import com.cleanroommc.modularui.widget.ParentWidget; -import mezz.jei.gui.ghost.GhostIngredientDrag; -import mezz.jei.gui.ghost.GhostIngredientDragManager; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(value = ModularPanel.class, remap = false) public abstract class ModularPanelMixin extends ParentWidget implements IViewport { - @Shadow - @Final - private ObjectList hovering; - - @Shadow - public abstract boolean closeOnOutOfBoundsClick(); - - @Shadow - public abstract void animateClose(); - - @Unique - InputAccessor gregTech$mouse = null; - - /** - * @author Ghzdude - GTCEu - * @reason Implement fixes to phantom slot handling from Mui2 master - */ - // this looks really cursed in mixin.out, but it works - @Overwrite - private boolean lambda$onMousePressed$3(int mouseButton) { - LocatedWidget pressed = LocatedWidget.EMPTY; - boolean result = false; - - if (gregTech$mouse == null) { - // reflection because the type is a private inner class - try { - gregTech$mouse = (InputAccessor) ModularPanel.class.getDeclaredField("mouse").get(this); - } catch (IllegalAccessException | NoSuchFieldException e) { - throw new RuntimeException(e); - } - } - - if (this.hovering.isEmpty()) { - if (closeOnOutOfBoundsClick()) { - animateClose(); - result = true; - } - } else { - loop: - for (LocatedWidget widget : this.hovering) { - widget.applyMatrix(getContext()); - GhostIngredientDrag drag = gregTech$getGhostDrag(); - if (widget.getElement() instanceof JeiGhostIngredientSlotghostSlot && - Mods.JustEnoughItems.isModLoaded()) { - if (drag != null && gregTech$insertGhostIngredient(drag, ghostSlot)) { - gregTech$stopDrag(); - pressed = LocatedWidget.EMPTY; - result = true; - widget.unapplyMatrix(getContext()); - break; - } - } - if (drag == null && widget.getElement() instanceof Interactable interactable) { - switch (interactable.onMousePressed(mouseButton)) { - case IGNORE: - break; - case ACCEPT: { - if (!gregTech$mouse.held()) { - gregTech$mouse.addInteractable(interactable); - } - pressed = widget; - // result = false; - break; - } - case STOP: { - pressed = LocatedWidget.EMPTY; - result = true; - widget.unapplyMatrix(getContext()); - break loop; - } - case SUCCESS: { - if (!gregTech$mouse.held()) { - gregTech$mouse.addInteractable(interactable); - } - pressed = widget; - result = true; - widget.unapplyMatrix(getContext()); - break loop; - } - } - } - if (getContext().onHoveredClick(mouseButton, widget)) { - pressed = LocatedWidget.EMPTY; - result = true; - widget.unapplyMatrix(getContext()); - break; - } - widget.unapplyMatrix(getContext()); - if (widget.getElement().canHover()) { - result = true; - break; - } - } + @Redirect(method = "lambda$onMousePressed$3", + at = @At(value = "INVOKE", + target = "Lcom/cleanroommc/modularui/screen/viewport/LocatedWidget;getElement()Ljava/lang/Object;", + ordinal = 1)) + private Object checkDrag(LocatedWidget instance) { + // if we're dragging something, prevent interaction + if (ModularUIJeiPlugin.hasDraggingGhostIngredient()) { + return null; } - if (result && pressed.getElement() instanceof IFocusedWidget) { - getContext().focus(pressed); - } else { - getContext().removeFocus(); - } - if (!gregTech$mouse.held()) { - gregTech$mouse.lastPressed(pressed); - if (gregTech$mouse.lastPressed().getElement() != null) { - gregTech$mouse.timeHeld(Minecraft.getSystemTime()); - } - gregTech$mouse.lastButton(mouseButton); - gregTech$mouse.held(true); - } - return result; - } - - @Unique - private static GhostIngredientDrag gregTech$getGhostDrag() { - GhostIngredientDragManager manager = ((DragManagerAccessor) JustEnoughItemsModule.jeiRuntime - .getIngredientListOverlay()).getManager(); - return ((GhostDragAccessor) manager).getDrag(); - } - - @Unique - @SuppressWarnings("rawtypes") - private static boolean gregTech$insertGhostIngredient(GhostIngredientDrag drag, - JeiGhostIngredientSlot slot) { - Object object = slot.castGhostIngredientIfValid(drag.getIngredient()); - if (object != null) { - // noinspection unchecked - slot.setGhostIngredient(object); - return true; - } - return false; - } - - @Unique - private static void gregTech$stopDrag() { - GhostIngredientDragManager manager = ((DragManagerAccessor) JustEnoughItemsModule.jeiRuntime - .getIngredientListOverlay()).getManager(); - manager.stopDrag(); + return instance.getElement(); } } diff --git a/src/main/resources/mixins.gregtech.minecraft.json b/src/main/resources/mixins.gregtech.minecraft.json index 41a4c44b26e..85676f99055 100644 --- a/src/main/resources/mixins.gregtech.minecraft.json +++ b/src/main/resources/mixins.gregtech.minecraft.json @@ -18,10 +18,8 @@ "client": [ "BlockMixin", "EntityRendererMixin", - "L18nMixin", "LayerArmorBaseMixin", "LayerCustomHeadMixin", - "LocaleMixin", "RecipeRepairItemMixin", "RegionRenderCacheBuilderMixin", "RenderChunkMixin", diff --git a/src/main/resources/mixins.gregtech.mui2.json b/src/main/resources/mixins.gregtech.mui2.json index 41f64f92ed4..f313fa2b32d 100644 --- a/src/main/resources/mixins.gregtech.mui2.json +++ b/src/main/resources/mixins.gregtech.mui2.json @@ -8,7 +8,6 @@ "maxShiftBy": 10 }, "mixins": [ - "InputMixin", "ModularPanelMixin" ], "client": [ From f1277e9c3a0c66eff591bc267af10f1eb96ff75b Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 20 Feb 2025 12:28:01 -0700 Subject: [PATCH 3/8] close ui on invalidation --- .../api/metatileentity/MetaTileEntity.java | 5 +++- .../mui/factory/MetaTileEntityGuiFactory.java | 30 +++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java index eada02187ab..58cb65300a7 100644 --- a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java @@ -1427,8 +1427,11 @@ public final void onPlacement() { public void onRemoval() {} public void invalidate() { - if (getWorld() != null && getWorld().isRemote) { + if (getWorld() == null) return; + if (getWorld().isRemote) { GregTechAPI.soundManager.stopTileSound(getPos()); + } else { + MetaTileEntityGuiFactory.close(getPos(), getWorld()); } } diff --git a/src/main/java/gregtech/api/mui/factory/MetaTileEntityGuiFactory.java b/src/main/java/gregtech/api/mui/factory/MetaTileEntityGuiFactory.java index 0363476a987..250bad880c5 100644 --- a/src/main/java/gregtech/api/mui/factory/MetaTileEntityGuiFactory.java +++ b/src/main/java/gregtech/api/mui/factory/MetaTileEntityGuiFactory.java @@ -8,19 +8,28 @@ import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; 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 it.unimi.dsi.fastutil.longs.Long2ObjectArrayMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import org.jetbrains.annotations.NotNull; +import java.util.Iterator; import java.util.Objects; +import java.util.Set; +import java.util.UUID; public class MetaTileEntityGuiFactory extends AbstractUIFactory { public static final MetaTileEntityGuiFactory INSTANCE = new MetaTileEntityGuiFactory(); + private static final Long2ObjectMap> openedUIs = new Long2ObjectArrayMap<>(); + private MetaTileEntityGuiFactory() { super("gregtech:mte"); } @@ -35,8 +44,25 @@ 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); + Set players = openedUIs.computeIfAbsent(pos.toLong(), key -> new ObjectOpenHashSet<>()); + if (players.add(player.getUniqueID())) { + PosGuiData data = new PosGuiData(player, pos.getX(), pos.getY(), pos.getZ()); + GuiManager.open(INSTANCE, data, (EntityPlayerMP) player); + } + } + + public static void close(BlockPos pos, World world) { + if (world.isRemote) { + return; + } + Iterator iterator = openedUIs.get(pos.toLong()).iterator(); + while (iterator.hasNext()) { + var p = world.getPlayerEntityByUUID(iterator.next()); + if (p != null) { + p.closeScreen(); + iterator.remove(); + } + } } @Override From 32ef9f5d58840b11bf6ebe76fa22334c7a8f930d Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 20 Feb 2025 16:31:45 -0700 Subject: [PATCH 4/8] better way to handle closing ui on invalidate --- .../api/metatileentity/MetaTileEntity.java | 31 ++++++++++++++++++- .../mui/factory/MetaTileEntityGuiFactory.java | 30 ++---------------- 2 files changed, 32 insertions(+), 29 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java index 58cb65300a7..e8364242d03 100644 --- a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java @@ -18,6 +18,7 @@ import gregtech.api.cover.CoverRayTracer; import gregtech.api.cover.CoverSaveHandler; import gregtech.api.cover.CoverUtil; +import gregtech.api.cover.CoverWithUI; import gregtech.api.gui.ModularUI; import gregtech.api.items.itemhandlers.GTItemStackHandler; import gregtech.api.items.toolitem.ToolClasses; @@ -101,6 +102,7 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectArraySet; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.tuple.Pair; import org.jetbrains.annotations.ApiStatus; @@ -110,8 +112,10 @@ import java.util.ArrayList; import java.util.Collections; import java.util.EnumMap; +import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.UUID; import java.util.function.BiConsumer; @@ -167,12 +171,17 @@ public abstract class MetaTileEntity implements ISyncedTileEntity, CoverHolder, @Nullable private UUID owner = null; + private Set uiPlayers = new ObjectOpenHashSet<>(); + private EnumMap> uiCoverPlayers = new EnumMap<>(EnumFacing.class); private final Set creativeTabs = new ObjectArraySet<>(); { creativeTabs.add(CreativeTabs.SEARCH); creativeTabs.add(GTCreativeTabs.TAB_GREGTECH_MACHINES); + for (EnumFacing facing : EnumFacing.VALUES) { + uiCoverPlayers.put(facing, new ObjectOpenHashSet<>()); + } } protected MetaTileEntity(@NotNull ResourceLocation metaTileEntityId) { @@ -520,6 +529,7 @@ public boolean onRightClick(EntityPlayer playerIn, EnumHand hand, EnumFacing fac if (!playerIn.isSneaking() && openGUIOnRightClick()) { if (getWorld() != null && !getWorld().isRemote) { if (usesMui2()) { + uiPlayers.add(playerIn.getUniqueID()); MetaTileEntityGuiFactory.open(playerIn, this); } else { MetaTileEntityUIFactory.INSTANCE.openUI(getHolder(), (EntityPlayerMP) playerIn); @@ -558,6 +568,9 @@ public boolean onRightClick(EntityPlayer playerIn, EnumHand hand, EnumFacing fac EnumFacing gridSideHit = CoverRayTracer.determineGridSideHit(hitResult); cover = gridSideHit == null ? null : getCoverAtSide(gridSideHit); if (cover != null && playerIn.isSneaking() && playerIn.getHeldItemMainhand().isEmpty()) { + if (cover instanceof CoverWithUI) { + uiCoverPlayers.get(gridSideHit).add(playerIn.getUniqueID()); + } return cover.onScrewdriverClick(playerIn, hand, hitResult) == EnumActionResult.SUCCESS; } } @@ -640,6 +653,11 @@ public boolean onCrowbarClick(EntityPlayer playerIn, EnumHand hand, EnumFacing f CuboidRayTraceResult hitResult) { if (getCoverAtSide(facing) != null) { removeCover(facing); + Iterator iterator = uiCoverPlayers.get(facing).iterator(); + while (iterator.hasNext()) { + Objects.requireNonNull(getWorld().getPlayerEntityByUUID(iterator.next())).closeScreen(); + iterator.remove(); + } return true; } return false; @@ -1431,7 +1449,18 @@ public void invalidate() { if (getWorld().isRemote) { GregTechAPI.soundManager.stopTileSound(getPos()); } else { - MetaTileEntityGuiFactory.close(getPos(), getWorld()); + Iterator iterator = uiPlayers.iterator(); + while (iterator.hasNext()) { + Objects.requireNonNull(getWorld().getPlayerEntityByUUID(iterator.next())).closeScreen(); + iterator.remove(); + } + for (Set value : uiCoverPlayers.values()) { + iterator = value.iterator(); + while (iterator.hasNext()) { + Objects.requireNonNull(getWorld().getPlayerEntityByUUID(iterator.next())).closeScreen(); + iterator.remove(); + } + } } } diff --git a/src/main/java/gregtech/api/mui/factory/MetaTileEntityGuiFactory.java b/src/main/java/gregtech/api/mui/factory/MetaTileEntityGuiFactory.java index 250bad880c5..0363476a987 100644 --- a/src/main/java/gregtech/api/mui/factory/MetaTileEntityGuiFactory.java +++ b/src/main/java/gregtech/api/mui/factory/MetaTileEntityGuiFactory.java @@ -8,28 +8,19 @@ import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; 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 it.unimi.dsi.fastutil.longs.Long2ObjectArrayMap; -import it.unimi.dsi.fastutil.longs.Long2ObjectMap; -import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import org.jetbrains.annotations.NotNull; -import java.util.Iterator; import java.util.Objects; -import java.util.Set; -import java.util.UUID; public class MetaTileEntityGuiFactory extends AbstractUIFactory { public static final MetaTileEntityGuiFactory INSTANCE = new MetaTileEntityGuiFactory(); - private static final Long2ObjectMap> openedUIs = new Long2ObjectArrayMap<>(); - private MetaTileEntityGuiFactory() { super("gregtech:mte"); } @@ -44,25 +35,8 @@ public static > void open(Enti throw new IllegalArgumentException("MetaTileEntity must be in same dimension as the player!"); } BlockPos pos = mte.getPos(); - Set players = openedUIs.computeIfAbsent(pos.toLong(), key -> new ObjectOpenHashSet<>()); - if (players.add(player.getUniqueID())) { - PosGuiData data = new PosGuiData(player, pos.getX(), pos.getY(), pos.getZ()); - GuiManager.open(INSTANCE, data, (EntityPlayerMP) player); - } - } - - public static void close(BlockPos pos, World world) { - if (world.isRemote) { - return; - } - Iterator iterator = openedUIs.get(pos.toLong()).iterator(); - while (iterator.hasNext()) { - var p = world.getPlayerEntityByUUID(iterator.next()); - if (p != null) { - p.closeScreen(); - iterator.remove(); - } - } + PosGuiData data = new PosGuiData(player, pos.getX(), pos.getY(), pos.getZ()); + GuiManager.open(INSTANCE, data, (EntityPlayerMP) player); } @Override From e7f45ed2b7376db3bac9c3f93bfc7bd96a24cc58 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 24 Feb 2025 10:31:21 -0700 Subject: [PATCH 5/8] improve GhostCircuitSlotWidget popup --- .../mui/widget/GhostCircuitSlotWidget.java | 104 ++++++++++-------- 1 file changed, 58 insertions(+), 46 deletions(-) diff --git a/src/main/java/gregtech/api/mui/widget/GhostCircuitSlotWidget.java b/src/main/java/gregtech/api/mui/widget/GhostCircuitSlotWidget.java index 991f65e7d05..9a654922a8b 100644 --- a/src/main/java/gregtech/api/mui/widget/GhostCircuitSlotWidget.java +++ b/src/main/java/gregtech/api/mui/widget/GhostCircuitSlotWidget.java @@ -1,11 +1,14 @@ package gregtech.api.mui.widget; +import com.cleanroommc.modularui.value.sync.SyncHandler; + import gregtech.api.capability.impl.GhostCircuitItemStackHandler; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; import gregtech.api.recipes.ingredients.IntCircuitIngredient; import gregtech.client.utils.TooltipHelper; +import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; import net.minecraftforge.items.IItemHandler; @@ -23,6 +26,7 @@ import com.cleanroommc.modularui.widgets.layout.Grid; import com.cleanroommc.modularui.widgets.slot.ModularSlot; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.util.ArrayList; @@ -31,6 +35,9 @@ public class GhostCircuitSlotWidget extends ItemSlot { private static final int SYNC_CIRCUIT_INDEX = 10; + @Nullable + private IPanelHandler selectorPanel; + private GhostCircuitSyncHandler syncHandler; public GhostCircuitSlotWidget() { super(); @@ -41,7 +48,7 @@ public GhostCircuitSlotWidget() { public @NotNull Result onMousePressed(int mouseButton) { if (!isSelectorPanelOpen()) { if (mouseButton == 0 && TooltipHelper.isShiftDown()) { - createSelectorPanel(); + this.getSelectorPanel().openPanel(); } else { MouseData mouseData = MouseData.create(mouseButton); getSyncHandler().syncToServer(2, mouseData::writeToPacket); @@ -58,17 +65,24 @@ public boolean onMouseScroll(ModularScreen.UpOrDown scrollDirection, int amount) return true; } + @Override + public boolean isValidSyncHandler(SyncHandler syncHandler) { + this.syncHandler = castIfTypeElseNull(syncHandler, GhostCircuitSyncHandler.class); + if (this.syncHandler == null) return false; + return super.isValidSyncHandler(syncHandler); + } + @Override public ItemSlot slot(ModularSlot slot) { - ItemSlotSH sh = new GhostCircuitSyncHandler(slot); - isValidSyncHandler(sh); - setSyncHandler(sh); + this.syncHandler = new GhostCircuitSyncHandler(slot); + isValidSyncHandler(this.syncHandler); + setSyncHandler(this.syncHandler); return this; } protected void getCircuitSlotTooltip(@NotNull RichTooltip tooltip) { String configString; - int value = getSyncHandler().getGhostCircuitHandler().getCircuitValue(); + int value = this.syncHandler.getCircuitValue(); if (value == GhostCircuitItemStackHandler.NO_CONFIG) { configString = IKey.lang("gregtech.gui.configurator_slot.no_value").get(); } else { @@ -78,11 +92,6 @@ protected void getCircuitSlotTooltip(@NotNull RichTooltip tooltip) { tooltip.addLine(IKey.lang("gregtech.gui.configurator_slot.tooltip", configString)); } - @Override - public @NotNull GhostCircuitSyncHandler getSyncHandler() { - return (GhostCircuitSyncHandler) super.getSyncHandler(); - } - @Override public void onMouseDrag(int mouseButton, long timeSinceClick) {} @@ -92,44 +101,39 @@ public boolean onMouseRelease(int mouseButton) { } private boolean isSelectorPanelOpen() { - return getPanel().getScreen().isPanelOpen("circuit_selector"); + return this.getSelectorPanel().isPanelOpen(); } - private void createSelectorPanel() { - ItemDrawable circuitPreview = new ItemDrawable(getSyncHandler().getSlot().getStack()); - - IPanelHandler.simple(getPanel(), (mainPanel, player) -> { - var panel = GTGuis.createPopupPanel("circuit_selector", 176, 120); - List> options = new ArrayList<>(); - for (int i = 0; i < 4; i++) { - options.add(new ArrayList<>()); - for (int j = 0; j < 9; j++) { - int index = i * 9 + j; - if (index > 32) break; - options.get(i).add(new ButtonWidget<>() - .size(18) - .background(GTGuiTextures.SLOT, new ItemDrawable( - IntCircuitIngredient.getIntegratedCircuit(index)).asIcon()) - .disableHoverBackground() - .onMousePressed(mouseButton -> { - getSyncHandler().syncToServer(SYNC_CIRCUIT_INDEX, buf -> buf.writeShort(index)); - circuitPreview.setItem(IntCircuitIngredient.getIntegratedCircuit(index)); - if (Interactable.hasShiftDown()) panel.animateClose(); - return true; - })); - } - } - return panel.child(IKey.lang("metaitem.circuit.integrated.gui").asWidget().pos(5, 5)) - .child(circuitPreview.asIcon().size(16).asWidget() - .size(18) - .top(19).alignX(0.5f) - .background(GTGuiTextures.SLOT, GTGuiTextures.INT_CIRCUIT_OVERLAY)) - .child(new Grid() - .left(7).right(7).top(41).height(4 * 18) - .matrix(options) - .minColWidth(18).minRowHeight(18) - .minElementMargin(0, 0)); - }, true).openPanel(); + @NotNull + private IPanelHandler getSelectorPanel() { + if (this.selectorPanel == null) { + this.selectorPanel = IPanelHandler.simple(getPanel(), (mainPanel, player) -> { + ItemDrawable circuitPreview = new ItemDrawable(this.syncHandler.getCircuitStack()); + + return GTGuis.createPopupPanel("circuit_selector", 176, 120) + .child(IKey.lang("metaitem.circuit.integrated.gui").asWidget().pos(5, 5)) + .child(circuitPreview.asIcon().size(16).asWidget() + .size(18) + .top(19).alignX(0.5f) + .background(GTGuiTextures.SLOT, GTGuiTextures.INT_CIRCUIT_OVERLAY)) + .child(new Grid() + .left(7).right(7).top(41).height(4 * 18) + .mapTo(9, 33, value -> new ButtonWidget<>() + .size(18) + .background(GTGuiTextures.SLOT, new ItemDrawable( + IntCircuitIngredient.getIntegratedCircuit(value)).asIcon()) + .disableHoverBackground() + .onMousePressed(mouseButton -> { + getSyncHandler().syncToServer(SYNC_CIRCUIT_INDEX, buf -> buf.writeShort(value)); + circuitPreview.setItem(IntCircuitIngredient.getIntegratedCircuit(value)); + if (Interactable.hasShiftDown()) this.selectorPanel.closePanel(); + return true; + })) + .minColWidth(18).minRowHeight(18) + .minElementMargin(0, 0)); + }, true); + } + return this.selectorPanel; } private static class GhostCircuitSyncHandler extends ItemSlotSH { @@ -169,6 +173,14 @@ private void setCircuitValue(int value) { } } + public int getCircuitValue() { + return getGhostCircuitHandler().getCircuitValue(); + } + + public ItemStack getCircuitStack() { + return getSlot().getStack(); + } + @Override public void readOnServer(int id, PacketBuffer buf) throws IOException { if (id == SYNC_CIRCUIT_INDEX) { From 2c8712750671e75d72017ebb809c7ec7c5bea0ce Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 24 Feb 2025 10:39:19 -0700 Subject: [PATCH 6/8] simplify circuit preview + spotless --- .../api/mui/widget/GhostCircuitSlotWidget.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/gregtech/api/mui/widget/GhostCircuitSlotWidget.java b/src/main/java/gregtech/api/mui/widget/GhostCircuitSlotWidget.java index 9a654922a8b..5a498360404 100644 --- a/src/main/java/gregtech/api/mui/widget/GhostCircuitSlotWidget.java +++ b/src/main/java/gregtech/api/mui/widget/GhostCircuitSlotWidget.java @@ -1,7 +1,5 @@ package gregtech.api.mui.widget; -import com.cleanroommc.modularui.value.sync.SyncHandler; - import gregtech.api.capability.impl.GhostCircuitItemStackHandler; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; @@ -14,13 +12,14 @@ import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.ItemDrawable; import com.cleanroommc.modularui.screen.ModularScreen; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.utils.MouseData; import com.cleanroommc.modularui.value.sync.ItemSlotSH; +import com.cleanroommc.modularui.value.sync.SyncHandler; +import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widgets.ButtonWidget; import com.cleanroommc.modularui.widgets.ItemSlot; import com.cleanroommc.modularui.widgets.layout.Grid; @@ -29,8 +28,6 @@ import org.jetbrains.annotations.Nullable; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; public class GhostCircuitSlotWidget extends ItemSlot { @@ -112,9 +109,10 @@ private IPanelHandler getSelectorPanel() { return GTGuis.createPopupPanel("circuit_selector", 176, 120) .child(IKey.lang("metaitem.circuit.integrated.gui").asWidget().pos(5, 5)) - .child(circuitPreview.asIcon().size(16).asWidget() + .child(new Widget<>() .size(18) .top(19).alignX(0.5f) + .overlay(circuitPreview.asIcon().margin(1)) .background(GTGuiTextures.SLOT, GTGuiTextures.INT_CIRCUIT_OVERLAY)) .child(new Grid() .left(7).right(7).top(41).height(4 * 18) @@ -124,7 +122,8 @@ private IPanelHandler getSelectorPanel() { IntCircuitIngredient.getIntegratedCircuit(value)).asIcon()) .disableHoverBackground() .onMousePressed(mouseButton -> { - getSyncHandler().syncToServer(SYNC_CIRCUIT_INDEX, buf -> buf.writeShort(value)); + getSyncHandler().syncToServer(SYNC_CIRCUIT_INDEX, + buf -> buf.writeShort(value)); circuitPreview.setItem(IntCircuitIngredient.getIntegratedCircuit(value)); if (Interactable.hasShiftDown()) this.selectorPanel.closePanel(); return true; From 3c28ada7bdeea2d9355e22fda24bad69f2a6b7f0 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 25 Feb 2025 19:22:10 -0700 Subject: [PATCH 7/8] add todos --- src/main/java/gregtech/api/metatileentity/MetaTileEntity.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java index e8364242d03..40ba4617bf2 100644 --- a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java @@ -529,6 +529,7 @@ public boolean onRightClick(EntityPlayer playerIn, EnumHand hand, EnumFacing fac if (!playerIn.isSneaking() && openGUIOnRightClick()) { if (getWorld() != null && !getWorld().isRemote) { if (usesMui2()) { + // todo remove when fixed in mui2 uiPlayers.add(playerIn.getUniqueID()); MetaTileEntityGuiFactory.open(playerIn, this); } else { @@ -568,6 +569,7 @@ public boolean onRightClick(EntityPlayer playerIn, EnumHand hand, EnumFacing fac EnumFacing gridSideHit = CoverRayTracer.determineGridSideHit(hitResult); cover = gridSideHit == null ? null : getCoverAtSide(gridSideHit); if (cover != null && playerIn.isSneaking() && playerIn.getHeldItemMainhand().isEmpty()) { + // todo remove when fixed in mui2 if (cover instanceof CoverWithUI) { uiCoverPlayers.get(gridSideHit).add(playerIn.getUniqueID()); } @@ -653,6 +655,7 @@ public boolean onCrowbarClick(EntityPlayer playerIn, EnumHand hand, EnumFacing f CuboidRayTraceResult hitResult) { if (getCoverAtSide(facing) != null) { removeCover(facing); + // todo remove when fixed in mui2 Iterator iterator = uiCoverPlayers.get(facing).iterator(); while (iterator.hasNext()) { Objects.requireNonNull(getWorld().getPlayerEntityByUUID(iterator.next())).closeScreen(); @@ -1449,6 +1452,7 @@ public void invalidate() { if (getWorld().isRemote) { GregTechAPI.soundManager.stopTileSound(getPos()); } else { + // todo remove when fixed in mui2 Iterator iterator = uiPlayers.iterator(); while (iterator.hasNext()) { Objects.requireNonNull(getWorld().getPlayerEntityByUUID(iterator.next())).closeScreen(); From 2e642c023651d10c57e60d559951db37f8de72fb Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 25 Feb 2025 19:28:39 -0700 Subject: [PATCH 8/8] r/notmyjob --- .../api/metatileentity/MetaTileEntity.java | 38 +------------------ 1 file changed, 1 insertion(+), 37 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java index 40ba4617bf2..eada02187ab 100644 --- a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java @@ -18,7 +18,6 @@ import gregtech.api.cover.CoverRayTracer; import gregtech.api.cover.CoverSaveHandler; import gregtech.api.cover.CoverUtil; -import gregtech.api.cover.CoverWithUI; import gregtech.api.gui.ModularUI; import gregtech.api.items.itemhandlers.GTItemStackHandler; import gregtech.api.items.toolitem.ToolClasses; @@ -102,7 +101,6 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectArraySet; -import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.tuple.Pair; import org.jetbrains.annotations.ApiStatus; @@ -112,10 +110,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.EnumMap; -import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Set; import java.util.UUID; import java.util.function.BiConsumer; @@ -171,17 +167,12 @@ public abstract class MetaTileEntity implements ISyncedTileEntity, CoverHolder, @Nullable private UUID owner = null; - private Set uiPlayers = new ObjectOpenHashSet<>(); - private EnumMap> uiCoverPlayers = new EnumMap<>(EnumFacing.class); private final Set creativeTabs = new ObjectArraySet<>(); { creativeTabs.add(CreativeTabs.SEARCH); creativeTabs.add(GTCreativeTabs.TAB_GREGTECH_MACHINES); - for (EnumFacing facing : EnumFacing.VALUES) { - uiCoverPlayers.put(facing, new ObjectOpenHashSet<>()); - } } protected MetaTileEntity(@NotNull ResourceLocation metaTileEntityId) { @@ -529,8 +520,6 @@ public boolean onRightClick(EntityPlayer playerIn, EnumHand hand, EnumFacing fac if (!playerIn.isSneaking() && openGUIOnRightClick()) { if (getWorld() != null && !getWorld().isRemote) { if (usesMui2()) { - // todo remove when fixed in mui2 - uiPlayers.add(playerIn.getUniqueID()); MetaTileEntityGuiFactory.open(playerIn, this); } else { MetaTileEntityUIFactory.INSTANCE.openUI(getHolder(), (EntityPlayerMP) playerIn); @@ -569,10 +558,6 @@ public boolean onRightClick(EntityPlayer playerIn, EnumHand hand, EnumFacing fac EnumFacing gridSideHit = CoverRayTracer.determineGridSideHit(hitResult); cover = gridSideHit == null ? null : getCoverAtSide(gridSideHit); if (cover != null && playerIn.isSneaking() && playerIn.getHeldItemMainhand().isEmpty()) { - // todo remove when fixed in mui2 - if (cover instanceof CoverWithUI) { - uiCoverPlayers.get(gridSideHit).add(playerIn.getUniqueID()); - } return cover.onScrewdriverClick(playerIn, hand, hitResult) == EnumActionResult.SUCCESS; } } @@ -655,12 +640,6 @@ public boolean onCrowbarClick(EntityPlayer playerIn, EnumHand hand, EnumFacing f CuboidRayTraceResult hitResult) { if (getCoverAtSide(facing) != null) { removeCover(facing); - // todo remove when fixed in mui2 - Iterator iterator = uiCoverPlayers.get(facing).iterator(); - while (iterator.hasNext()) { - Objects.requireNonNull(getWorld().getPlayerEntityByUUID(iterator.next())).closeScreen(); - iterator.remove(); - } return true; } return false; @@ -1448,23 +1427,8 @@ public final void onPlacement() { public void onRemoval() {} public void invalidate() { - if (getWorld() == null) return; - if (getWorld().isRemote) { + if (getWorld() != null && getWorld().isRemote) { GregTechAPI.soundManager.stopTileSound(getPos()); - } else { - // todo remove when fixed in mui2 - Iterator iterator = uiPlayers.iterator(); - while (iterator.hasNext()) { - Objects.requireNonNull(getWorld().getPlayerEntityByUUID(iterator.next())).closeScreen(); - iterator.remove(); - } - for (Set value : uiCoverPlayers.values()) { - iterator = value.iterator(); - while (iterator.hasNext()) { - Objects.requireNonNull(getWorld().getPlayerEntityByUUID(iterator.next())).closeScreen(); - iterator.remove(); - } - } } }