diff --git a/dependencies.gradle b/dependencies.gradle index 91d6a5d5c7e..ec6767e637c 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -40,7 +40,7 @@ dependencies { // Published dependencies api("codechicken:codechickenlib:3.2.3.358") - api("com.cleanroommc:modularui:2.5.0-rc2") { transitive = false } + api("com.cleanroommc:modularui:2.5.0-rc3") { transitive = false } api("com.cleanroommc:groovyscript:1.2.0-hotfix1") { transitive = false } api("CraftTweaker2:CraftTweaker2-MC1120-Main:1.12-4.1.20.700") api("appeng:ae2-uel:v0.56.4") { transitive = false } diff --git a/src/main/java/gregtech/GregTechMod.java b/src/main/java/gregtech/GregTechMod.java index 04fcd09786c..5334d5afe13 100644 --- a/src/main/java/gregtech/GregTechMod.java +++ b/src/main/java/gregtech/GregTechMod.java @@ -31,7 +31,8 @@ acceptedMinecraftVersions = "[1.12.2,1.13)", version = GTInternalTags.VERSION, dependencies = "required:forge@[14.23.5.2847,);" + "required-after:codechickenlib@[3.2.3,);" + - "required-after:modularui@[2.3,);" + "required-after:mixinbooter@[8.0,);" + "after:appliedenergistics2;" + + "required-after:modularui@[2.5.0-rc,);" + "required-after:mixinbooter@[8.0,);" + + "after:appliedenergistics2;" + "after:forestry;" + "after:extrabees;" + "after:extratrees;" + "after:genetics;" + "after:magicbees;" + "after:jei@[4.15.0,);" + "after:crafttweaker@[4.1.20,);" + "after:groovyscript@[1.2.0,);" + "after:theoneprobe;" + "after:hwyla;") diff --git a/src/main/java/gregtech/api/mui/GTGuis.java b/src/main/java/gregtech/api/mui/GTGuis.java index 9f9989b2601..568f925cb6f 100644 --- a/src/main/java/gregtech/api/mui/GTGuis.java +++ b/src/main/java/gregtech/api/mui/GTGuis.java @@ -9,6 +9,7 @@ import net.minecraft.item.ItemStack; +import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.factory.GuiManager; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Alignment; @@ -103,6 +104,9 @@ public PopupPanel(@NotNull String name, int width, int height, boolean disableBe .onMousePressed(mouseButton -> { if (mouseButton == 0 || mouseButton == 1) { this.closeIfOpen(true); + if (isSynced() && getSyncHandler() instanceof IPanelHandler handler) { + handler.deleteCachedPanel(); + } return true; } return false; diff --git a/src/main/java/gregtech/api/mui/LocaleAccessor.java b/src/main/java/gregtech/api/mui/LocaleAccessor.java new file mode 100644 index 00000000000..2fee169f215 --- /dev/null +++ b/src/main/java/gregtech/api/mui/LocaleAccessor.java @@ -0,0 +1,20 @@ +package gregtech.api.mui; + +import net.minecraft.client.resources.Locale; + +// todo remove in next mui2 version +public interface LocaleAccessor { + + String gregtech$getRawKey(String s); + + ThreadLocal accessor = new ThreadLocal<>(); + + static String getRawKey(String s) { + if (accessor.get() == null) return s; + return accessor.get().gregtech$getRawKey(s); + } + + static void setLocale(Locale locale) { + accessor.set((LocaleAccessor) locale); + } +} diff --git a/src/main/java/gregtech/api/mui/StateOverlay.java b/src/main/java/gregtech/api/mui/StateOverlay.java deleted file mode 100644 index fefdc7fc477..00000000000 --- a/src/main/java/gregtech/api/mui/StateOverlay.java +++ /dev/null @@ -1,22 +0,0 @@ -package gregtech.api.mui; - -import com.cleanroommc.modularui.api.drawable.IDrawable; -import com.cleanroommc.modularui.widgets.ToggleButton; - -import java.util.function.Consumer; - -public interface StateOverlay { - - StateOverlay overlay(boolean selected, IDrawable... overlay); - - StateOverlay hoverOverlay(boolean selected, IDrawable... overlay); - - static ToggleButton cast(ToggleButton button, Consumer function) { - function.accept((StateOverlay) button); - return button; - } - - static ToggleButton create(Consumer function) { - return cast(new ToggleButton(), function); - } -} diff --git a/src/main/java/gregtech/api/mui/UnboxFix.java b/src/main/java/gregtech/api/mui/UnboxFix.java deleted file mode 100644 index 48f1bda2f20..00000000000 --- a/src/main/java/gregtech/api/mui/UnboxFix.java +++ /dev/null @@ -1,8 +0,0 @@ -package gregtech.api.mui; - -public interface UnboxFix { - - void gregTech$useDefaultTextColor(boolean b); - - void gregTech$useDefaultShadow(boolean b); -} diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index 1886be86d31..4571c26e93d 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -52,11 +52,10 @@ public GTFluidSyncHandler(IFluidTank tank) { @Override public void detectAndSendChanges(boolean init) { var current = getFluid(); - if (current == null && lastFluid == null) return; - if (current == null || lastFluid == null || lastFluid.getFluid() != current.getFluid()) { + if (init || current == null || lastFluid == null || current.isFluidEqual(lastFluid)) { lastFluid = current == null ? null : current.copy(); syncToClient(UPDATE_TANK, buffer -> NetworkUtils.writeFluidStack(buffer, current)); - } else if (current.amount != lastFluid.amount) { + } else if (lastFluid != null && current.amount != lastFluid.amount) { lastFluid.amount = current.amount; syncToClient(UPDATE_AMOUNT, buffer -> buffer.writeInt(current.amount)); } diff --git a/src/main/java/gregtech/common/covers/CoverConveyor.java b/src/main/java/gregtech/common/covers/CoverConveyor.java index 1fa4e43dffe..b037492f993 100644 --- a/src/main/java/gregtech/common/covers/CoverConveyor.java +++ b/src/main/java/gregtech/common/covers/CoverConveyor.java @@ -43,7 +43,6 @@ import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IDrawable; -import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.factory.GuiData; import com.cleanroommc.modularui.factory.SidedPosGuiData; @@ -545,7 +544,6 @@ protected ParentWidget createUI(GuiData data, PanelSyncManager guiSyncMana .onMousePressed(mouseButton -> { int val = throughput.getValue() - getIncrementValue(MouseData.create(mouseButton)); throughput.setValue(val, true, true); - Interactable.playButtonClickSound(); return true; }) .onUpdateListener(w -> w.overlay(createAdjustOverlay(false)))) @@ -560,7 +558,6 @@ protected ParentWidget createUI(GuiData data, PanelSyncManager guiSyncMana .onMousePressed(mouseButton -> { int val = throughput.getValue() + getIncrementValue(MouseData.create(mouseButton)); throughput.setValue(val, true, true); - Interactable.playButtonClickSound(); return true; }) .onUpdateListener(w -> w.overlay(createAdjustOverlay(true))))); diff --git a/src/main/java/gregtech/common/covers/CoverPump.java b/src/main/java/gregtech/common/covers/CoverPump.java index b57e5a33545..659b916e80b 100644 --- a/src/main/java/gregtech/common/covers/CoverPump.java +++ b/src/main/java/gregtech/common/covers/CoverPump.java @@ -41,7 +41,6 @@ import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IDrawable; -import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.factory.GuiData; import com.cleanroommc.modularui.factory.SidedPosGuiData; @@ -226,7 +225,6 @@ protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { .onMousePressed(mouseButton -> { int val = throughput.getValue() - getIncrementValue(MouseData.create(mouseButton)); throughput.setValue(val); - Interactable.playButtonClickSound(); return true; }) .onUpdateListener(w -> w.overlay(createAdjustOverlay(false)))) @@ -241,7 +239,6 @@ protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { .onMousePressed(mouseButton -> { int val = throughput.getValue() + getIncrementValue(MouseData.create(mouseButton)); throughput.setValue(val); - Interactable.playButtonClickSound(); return true; }) .onUpdateListener(w -> w.overlay(createAdjustOverlay(true))))); diff --git a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java index 4ed97afcc0e..552c6bb4075 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java @@ -26,7 +26,6 @@ import codechicken.lib.raytracer.CuboidRayTraceResult; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.IWidget; -import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.drawable.GuiTextures; import com.cleanroommc.modularui.drawable.Rectangle; @@ -50,8 +49,9 @@ import org.jetbrains.annotations.Nullable; import org.lwjgl.input.Keyboard; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; -import java.util.Set; import java.util.UUID; import java.util.regex.Pattern; @@ -149,8 +149,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan protected Flow createWidgets(GuiData data, PanelSyncManager syncManager) { var name = new StringSyncValue(this::getColorStr, this::updateColor); - // todo unneeded cast in mui2 rc3 - var entrySelectorSH = (PanelSyncHandler) syncManager.panel("entry_selector", entrySelector(getType()), true); + var entrySelectorSH = syncManager.panel("entry_selector", entrySelector(getType()), true); return Flow.column().coverChildrenHeight().top(24) .margin(7, 0).widthRel(1f) @@ -173,6 +172,7 @@ protected Flow createWidgets(GuiData data, PanelSyncManager syncManager) { .onMousePressed(i -> { if (entrySelectorSH.isPanelOpen()) { entrySelectorSH.closePanel(); + entrySelectorSH.deleteCachedPanel(); } else { entrySelectorSH.openPanel(); } @@ -284,14 +284,19 @@ public void writeToNBT(@NotNull NBTTagCompound nbt) { protected PanelSyncHandler.IPanelBuilder entrySelector(EntryTypes type) { return (syncManager, syncHandler) -> { - Set names = VirtualEnderRegistry.getEntryNames(getOwner(), type); + List rows = new ArrayList<>(); + for (String name : VirtualEnderRegistry.getEntryNames(getOwner(), type)) { + rows.add(createRow(name, syncManager, type)); + } return GTGuis.createPopupPanel("entry_selector", 168, 112) .child(IKey.lang("cover.generic.ender.known_channels") .color(UI_TITLE_COLOR) .asWidget() .top(6) .left(4)) - .child(ListWidget.builder(names, name -> createRow(name, syncManager, type)) + .child(new ListWidget<>() + .children(rows) + // .builder(names, name -> createRow(name, syncManager, type)) .background(GTGuiTextures.DISPLAY.asIcon() .width(168 - 8) .height(112 - 20)) @@ -391,7 +396,6 @@ protected IWidget createRow(final String name, final PanelSyncManager syncManage getOwner() == null ? "null" : getOwner().toString()); NetworkUtils.writeStringSafe(buffer, name); }); - Interactable.playButtonClickSound(); return true; })); } diff --git a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java index 7bb6c7473e3..524998ec460 100644 --- a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java +++ b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java @@ -10,12 +10,13 @@ import net.minecraft.util.math.MathHelper; import net.minecraftforge.items.ItemStackHandler; +import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.drawable.GuiTextures; import com.cleanroommc.modularui.factory.GuiData; +import com.cleanroommc.modularui.network.NetworkUtils; import com.cleanroommc.modularui.utils.Alignment; -import com.cleanroommc.modularui.value.sync.PanelSyncHandler; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.SyncHandlers; import com.cleanroommc.modularui.widgets.ButtonWidget; @@ -24,8 +25,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.io.IOException; - public abstract class BaseFilterContainer extends ItemStackHandler { private int maxTransferSize = 1; @@ -213,7 +212,7 @@ public void handleLegacyNBT(NBTTagCompound nbt) { /** Uses Cleanroom MUI */ public IWidget initUI(GuiData data, PanelSyncManager manager) { - PanelSyncHandler panel = (PanelSyncHandler) manager.panel("filter_panel", (syncManager, syncHandler) -> { + IPanelHandler panel = manager.panel("filter_panel", (syncManager, syncHandler) -> { var filter = hasFilter() ? getFilter() : BaseFilter.ERROR_FILTER; filter.setMaxTransferSize(getMaxTransferSize()); return filter.createPopupPanel(syncManager); @@ -253,17 +252,13 @@ public IWidget initUI(GuiData data, PanelSyncManager manager) { } public void writeInitialSyncData(PacketBuffer packetBuffer) { - packetBuffer.writeItemStack(this.getFilterStack()); + NetworkUtils.writeItemStack(packetBuffer, this.getFilterStack()); packetBuffer.writeInt(this.maxTransferSize); packetBuffer.writeInt(this.transferSize); } public void readInitialSyncData(@NotNull PacketBuffer packetBuffer) { - var stack = ItemStack.EMPTY; - try { - stack = packetBuffer.readItemStack(); - } catch (IOException ignore) {} - this.setFilterStack(stack); + this.setFilterStack(NetworkUtils.readItemStack(packetBuffer)); this.setMaxTransferSize(packetBuffer.readInt()); this.setTransferSize(packetBuffer.readInt()); } diff --git a/src/main/java/gregtech/mixins/minecraft/L18nMixin.java b/src/main/java/gregtech/mixins/minecraft/L18nMixin.java new file mode 100644 index 00000000000..26d67c82e0b --- /dev/null +++ b/src/main/java/gregtech/mixins/minecraft/L18nMixin.java @@ -0,0 +1,21 @@ +package gregtech.mixins.minecraft; + +import gregtech.api.mui.LocaleAccessor; + +import net.minecraft.client.resources.I18n; +import net.minecraft.client.resources.Locale; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +// todo remove in next mui2 version +@Mixin(I18n.class) +public abstract class L18nMixin { + + @Inject(method = "setLocale", at = @At("HEAD")) + private static void getLocale(Locale i18nLocaleIn, CallbackInfo ci) { + LocaleAccessor.setLocale(i18nLocaleIn); + } +} diff --git a/src/main/java/gregtech/mixins/minecraft/LocaleMixin.java b/src/main/java/gregtech/mixins/minecraft/LocaleMixin.java new file mode 100644 index 00000000000..b93f29b02e6 --- /dev/null +++ b/src/main/java/gregtech/mixins/minecraft/LocaleMixin.java @@ -0,0 +1,23 @@ +package gregtech.mixins.minecraft; + +import gregtech.api.mui.LocaleAccessor; + +import net.minecraft.client.resources.Locale; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Map; + +// todo remove in next mui2 version +@Mixin(Locale.class) +public abstract class LocaleMixin implements LocaleAccessor { + + @Shadow + Map properties; + + @Override + public String gregtech$getRawKey(String s) { + return this.properties.get(s); + } +} diff --git a/src/main/java/gregtech/mixins/mui2/ClientEventHandlerMixin.java b/src/main/java/gregtech/mixins/mui2/ClientEventHandlerMixin.java deleted file mode 100644 index 678de031802..00000000000 --- a/src/main/java/gregtech/mixins/mui2/ClientEventHandlerMixin.java +++ /dev/null @@ -1,79 +0,0 @@ -package gregtech.mixins.mui2; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiScreen; -import net.minecraftforge.client.event.GuiScreenEvent; - -import com.cleanroommc.modularui.ClientEventHandler; -import com.cleanroommc.modularui.api.IMuiScreen; -import com.cleanroommc.modularui.core.mixin.GuiScreenAccessor; -import com.cleanroommc.modularui.screen.ClientScreenHandler; -import com.cleanroommc.modularui.screen.ModularScreen; -import org.lwjgl.input.Keyboard; -import org.lwjgl.input.Mouse; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.io.IOException; - -@Mixin(value = ClientEventHandler.class, remap = false) -@SuppressWarnings("UnstableApiUsage") -public abstract class ClientEventHandlerMixin { - - @Redirect(method = "onGuiInput(Lnet/minecraftforge/client/event/GuiScreenEvent$MouseInputEvent$Pre;)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiScreen;handleMouseInput()V")) - private static void fixMouseInput(GuiScreen instance) { - int button = Mouse.getEventButton(); - if (instance instanceof IMuiScreen screen && instance instanceof GuiScreenAccessor acc) { - ModularScreen ms = screen.getScreen(); - if (Mouse.getEventButtonState()) { - acc.setEventButton(button); - acc.setLastMouseEvent(Minecraft.getSystemTime()); - ms.onMousePressed(button); - - } else if (button != -1) { - acc.setEventButton(-1); - ms.onMouseRelease(button); - - } else if (acc.getEventButton() != -1 && acc.getLastMouseEvent() > 0L) { - long l = Minecraft.getSystemTime() - acc.getLastMouseEvent(); - ms.onMouseDrag(button, l); - } - } - } - - @Inject(method = "onGuiInput(Lnet/minecraftforge/client/event/GuiScreenEvent$MouseInputEvent$Pre;)V", - at = @At("TAIL")) - private static void fixScrollJei(GuiScreenEvent.MouseInputEvent.Pre event, CallbackInfo ci) throws IOException { - if (!event.isCanceled()) - ClientScreenHandler.onGuiInputLow(event); - } - - @Unique - private static Character gregTech$lastChar = null; - - @Redirect(method = "onGuiInput(Lnet/minecraftforge/client/event/GuiScreenEvent$KeyboardInputEvent$Pre;)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiScreen;handleKeyboardInput()V")) - private static void fixKeyInput(GuiScreen instance) { - if (instance instanceof IMuiScreen screen && instance instanceof GuiScreenAccessor acc) { - char c0 = Keyboard.getEventCharacter(); - int key = Keyboard.getEventKey(); - boolean state = Keyboard.getEventKeyState(); - if (state) { - gregTech$lastChar = c0; - screen.getScreen().onKeyPressed(c0, key); - } else { - // releasing a key - // for some reason when you press E after joining a world the button will not trigger the press event, - // but only the release event, causing this to be null - if (gregTech$lastChar == null) return; - // when the key is released, the event char is empty - screen.getScreen().onKeyRelease(gregTech$lastChar, key); - } - } - } -} diff --git a/src/main/java/gregtech/mixins/mui2/ItemSlotSHMixin.java b/src/main/java/gregtech/mixins/mui2/ItemSlotSHMixin.java deleted file mode 100644 index 5d53a35d3d0..00000000000 --- a/src/main/java/gregtech/mixins/mui2/ItemSlotSHMixin.java +++ /dev/null @@ -1,141 +0,0 @@ -package gregtech.mixins.mui2; - -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketBuffer; -import net.minecraftforge.items.ItemHandlerHelper; - -import com.cleanroommc.modularui.network.NetworkUtils; -import com.cleanroommc.modularui.screen.ModularContainer; -import com.cleanroommc.modularui.utils.MouseData; -import com.cleanroommc.modularui.value.sync.ItemSlotSH; -import com.cleanroommc.modularui.value.sync.SyncHandler; -import com.cleanroommc.modularui.widgets.slot.ModularSlot; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.io.IOException; - -@Mixin(value = ItemSlotSH.class, remap = false) -public abstract class ItemSlotSHMixin extends SyncHandler { - - @Unique - private boolean gregTech$registered; - - @Shadow - protected abstract void phantomScroll(MouseData mouseData); - - @Shadow - public abstract void setEnabled(boolean enabled, boolean sync); - - @Shadow - public abstract boolean isPhantom(); - - @Shadow - private ItemStack lastStoredPhantomItem; - - @Shadow - public abstract ModularSlot getSlot(); - - @Shadow - public abstract void incrementStackCount(int amount); - - @WrapOperation(method = "init", - at = @At(value = "INVOKE", - target = "Lcom/cleanroommc/modularui/screen/ModularContainer;registerSlot(Ljava/lang/String;Lcom/cleanroommc/modularui/widgets/slot/ModularSlot;)V")) - protected void wrapRegister(ModularContainer instance, String slotGroup, ModularSlot modularSlot, - Operation original) { - if (!gregTech$registered) { - original.call(instance, slotGroup, modularSlot); - gregTech$registered = true; - } - } - - /** - * @author GTCEu - Ghzdude - * @reason Implement MUI2 PR#90 - */ - @Overwrite - public void readOnServer(int id, PacketBuffer buf) throws IOException { - if (id == 2) { - phantomClick(MouseData.readPacket(buf)); - } else if (id == 3) { - phantomScroll(MouseData.readPacket(buf)); - } else if (id == 4) { - setEnabled(buf.readBoolean(), false); - } else if (id == 5) { - if (!isPhantom()) return; - gregTech$phantomClick(MouseData.create(0), buf.readItemStack()); - } - } - - @Inject(method = "readOnClient", at = @At("HEAD")) - protected void handlePhantomScroll(int id, PacketBuffer buf, CallbackInfo ci) { - if (id == 3) { - this.lastStoredPhantomItem = NetworkUtils.readItemStack(buf); - getSlot().putStack(this.lastStoredPhantomItem.copy()); - } - } - - @Inject(method = "phantomScroll", at = @At("TAIL")) - protected void syncPhantomScroll(MouseData mouseData, CallbackInfo ci) { - syncToClient(3, buffer -> NetworkUtils.writeItemStack(buffer, this.lastStoredPhantomItem)); - } - - /** - * @author GTCEu - Ghzdude - * @reason Implement MUI2 PR#90 - */ - @Overwrite - protected void phantomClick(MouseData mouseData) { - gregTech$phantomClick(mouseData, getSyncManager().getCursorItem()); - } - - @Unique - protected void gregTech$phantomClick(MouseData mouseData, ItemStack cursorStack) { - ItemStack slotStack = getSlot().getStack(); - ItemStack stackToPut; - if (!cursorStack.isEmpty() && !slotStack.isEmpty() && - !ItemHandlerHelper.canItemStacksStack(cursorStack, slotStack)) { - stackToPut = cursorStack.copy(); - if (mouseData.mouseButton == 1) { - stackToPut.setCount(1); - } - stackToPut.setCount(Math.min(stackToPut.getCount(), getSlot().getItemStackLimit(stackToPut))); - getSlot().putStack(stackToPut); - this.lastStoredPhantomItem = stackToPut.copy(); - } else if (slotStack.isEmpty()) { - if (cursorStack.isEmpty()) { - if (mouseData.mouseButton == 1 && !this.lastStoredPhantomItem.isEmpty()) { - stackToPut = this.lastStoredPhantomItem.copy(); - } else { - return; - } - } else { - stackToPut = cursorStack.copy(); - } - if (mouseData.mouseButton == 1) { - stackToPut.setCount(1); - } - stackToPut.setCount(Math.min(stackToPut.getCount(), getSlot().getItemStackLimit(stackToPut))); - getSlot().putStack(stackToPut); - this.lastStoredPhantomItem = stackToPut.copy(); - } else { - if (mouseData.mouseButton == 0) { - if (mouseData.shift) { - getSlot().putStack(ItemStack.EMPTY); - } else { - incrementStackCount(-1); - } - } else if (mouseData.mouseButton == 1) { - incrementStackCount(1); - } - } - } -} diff --git a/src/main/java/gregtech/mixins/mui2/LangKeyMixin.java b/src/main/java/gregtech/mixins/mui2/LangKeyMixin.java new file mode 100644 index 00000000000..7c219710609 --- /dev/null +++ b/src/main/java/gregtech/mixins/mui2/LangKeyMixin.java @@ -0,0 +1,31 @@ +package gregtech.mixins.mui2; + +import gregtech.api.mui.LocaleAccessor; + +import com.cleanroommc.modularui.drawable.text.BaseKey; +import com.cleanroommc.modularui.drawable.text.LangKey; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +// todo remove in next mui2 version +@Mixin(value = LangKey.class, remap = false) +public abstract class LangKeyMixin extends BaseKey { + + @Redirect(method = "getFormatted", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/resources/I18n;format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;")) + public String getTranslateKey(String translateKey, Object[] parameters) { + return LocaleAccessor.getRawKey(translateKey) + .replace("\\n", "\n") + .replace("/n", "\n"); + } + + @ModifyExpressionValue(method = "get", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/resources/I18n;format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;")) + public String switchNewLines(String original) { + return original.replace("/n", "\n"); + } +} diff --git a/src/main/java/gregtech/mixins/mui2/PanelSyncHandlerMixin.java b/src/main/java/gregtech/mixins/mui2/PanelSyncHandlerMixin.java deleted file mode 100644 index 99a850b1c10..00000000000 --- a/src/main/java/gregtech/mixins/mui2/PanelSyncHandlerMixin.java +++ /dev/null @@ -1,47 +0,0 @@ -package gregtech.mixins.mui2; - -import com.cleanroommc.modularui.api.widget.ISynced; -import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.value.sync.ModularSyncManager; -import com.cleanroommc.modularui.value.sync.PanelSyncHandler; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.widget.WidgetTree; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.concurrent.atomic.AtomicInteger; - -@Mixin(value = PanelSyncHandler.class, remap = false) -public abstract class PanelSyncHandlerMixin { - - @Shadow - private PanelSyncManager syncManager; - - @Shadow - public abstract boolean isPanelOpen(); - - @Redirect(method = "openPanel(Z)V", - at = @At(value = "INVOKE", - target = "Lcom/cleanroommc/modularui/widget/WidgetTree;collectSyncValues(Lcom/cleanroommc/modularui/value/sync/PanelSyncManager;Lcom/cleanroommc/modularui/screen/ModularPanel;)V")) - protected void redirectCollectValues(PanelSyncManager syncManager, ModularPanel panel) { - AtomicInteger id = new AtomicInteger(0); - String syncKey = ModularSyncManager.AUTO_SYNC_PREFIX + panel.getName(); - WidgetTree.foreachChildBFS(panel, widget -> { - if (widget instanceof ISyncedsynced) { - if (synced.isSynced() && !this.syncManager.hasSyncHandler(synced.getSyncHandler())) { - this.syncManager.syncValue(syncKey, id.getAndIncrement(), synced.getSyncHandler()); - } - } - return true; - }, false); - } - - @Inject(method = "openPanel(Z)V", at = @At("HEAD"), cancellable = true) - protected void openCheck(boolean syncToServer, CallbackInfo ci) { - if (isPanelOpen()) ci.cancel(); - } -} diff --git a/src/main/java/gregtech/mixins/mui2/PanelSyncManagerMixin.java b/src/main/java/gregtech/mixins/mui2/PanelSyncManagerMixin.java deleted file mode 100644 index 9bea0ab1af2..00000000000 --- a/src/main/java/gregtech/mixins/mui2/PanelSyncManagerMixin.java +++ /dev/null @@ -1,36 +0,0 @@ -package gregtech.mixins.mui2; - -import gregtech.api.util.GTLog; - -import net.minecraft.network.PacketBuffer; - -import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.value.sync.SyncHandler; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.Map; - -@Mixin(value = PanelSyncManager.class, remap = false) -public abstract class PanelSyncManagerMixin { - - @Shadow - @Final - private Map syncHandlers; - - @Shadow - private String panelName; - - @Inject(method = "receiveWidgetUpdate", at = @At("HEAD"), cancellable = true) - public void injectCheck(String mapKey, int id, PacketBuffer buf, CallbackInfo ci) { - if (!this.syncHandlers.containsKey(mapKey)) { - GTLog.logger.warn("[ModularUI] SyncHandler \"{}\" does not exist for panel \"{}\"! ID was {}.", mapKey, - panelName, id); - ci.cancel(); - } - } -} diff --git a/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java b/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java deleted file mode 100644 index 41c269111ab..00000000000 --- a/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java +++ /dev/null @@ -1,119 +0,0 @@ -package gregtech.mixins.mui2; - -import gregtech.api.mui.UnboxFix; - -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.drawable.text.AnimatedText; -import com.cleanroommc.modularui.drawable.text.StyledText; -import com.cleanroommc.modularui.theme.WidgetTheme; -import com.cleanroommc.modularui.utils.Alignment; -import com.cleanroommc.modularui.widgets.TextWidget; -import com.llamalad7.mixinextras.sugar.Local; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyArg; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -@Mixin(value = StyledText.class, remap = false) -public abstract class StyledTextMixin implements UnboxFix { - - @Shadow - @Final - private IKey key; - - @Shadow - private Alignment alignment; - - @Shadow - private Integer color; - - @Shadow - private float scale; - - @Shadow - private Boolean shadow; - - @Unique - private boolean gregTech$defaultTextColor = true; - - @Unique - private boolean gregTech$defaultShadow = true; - - @Override - public void gregTech$useDefaultTextColor(boolean b) { - gregTech$defaultTextColor = b; - } - - @Override - public void gregTech$useDefaultShadow(boolean b) { - gregTech$defaultShadow = b; - } - - @Inject(method = "color", at = @At("HEAD")) - private void setDefault(int color, CallbackInfoReturnable cir) { - gregTech$useDefaultTextColor(false); - } - - @Inject(method = "shadow", at = @At("HEAD")) - private void setDefault(boolean shadow, CallbackInfoReturnable cir) { - gregTech$useDefaultShadow(false); - } - - /** - * @author GTCEu - Ghzdude - * @reason Implement MUI2 PR#86 - */ - @Overwrite - public TextWidget asWidget() { - var text = new TextWidget(this.key) - .alignment(this.alignment) - .scale(this.scale); - - ((UnboxFix) text).gregTech$useDefaultTextColor(this.gregTech$defaultTextColor); - ((UnboxFix) text).gregTech$useDefaultShadow(this.gregTech$defaultShadow); - - return text.color(color == null ? 0 : color) - .shadow(shadow != null && shadow); - } - - /** - * @author GTCEu - Ghzdude - * @reason Implement MUI2 PR#86 - */ - @Overwrite - public AnimatedText withAnimation() { - var text = new AnimatedText(this.key) - .alignment(this.alignment) - .scale(this.scale); - - ((UnboxFix) text).gregTech$useDefaultTextColor(this.gregTech$defaultTextColor); - ((UnboxFix) text).gregTech$useDefaultShadow(this.gregTech$defaultShadow); - - return text.color(color == null ? 0 : color) - .shadow(shadow != null && shadow); - } - - @SideOnly(Side.CLIENT) - @ModifyArg(method = "draw", - at = @At(value = "INVOKE", - target = "Lcom/cleanroommc/modularui/drawable/text/TextRenderer;setColor(I)V")) - public int fixColor(int color, @Local(argsOnly = true) WidgetTheme theme) { - return gregTech$defaultTextColor ? theme.getTextColor() : color; - } - - @SideOnly(Side.CLIENT) - @ModifyArg(method = "draw", - at = @At(value = "INVOKE", - target = "Lcom/cleanroommc/modularui/drawable/text/TextRenderer;setShadow(Z)V")) - public boolean fixShadow(boolean shadow, @Local(argsOnly = true) WidgetTheme theme) { - return gregTech$defaultShadow ? theme.getTextShadow() : shadow; - } -} diff --git a/src/main/java/gregtech/mixins/mui2/TextWidgetMixin.java b/src/main/java/gregtech/mixins/mui2/TextWidgetMixin.java deleted file mode 100644 index 40320a51020..00000000000 --- a/src/main/java/gregtech/mixins/mui2/TextWidgetMixin.java +++ /dev/null @@ -1,57 +0,0 @@ -package gregtech.mixins.mui2; - -import gregtech.api.mui.UnboxFix; - -import com.cleanroommc.modularui.theme.WidgetTheme; -import com.cleanroommc.modularui.widget.Widget; -import com.cleanroommc.modularui.widgets.TextWidget; -import com.llamalad7.mixinextras.injector.ModifyReturnValue; -import com.llamalad7.mixinextras.sugar.Local; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyArg; - -@Mixin(value = TextWidget.class, remap = false) -public abstract class TextWidgetMixin extends Widget implements UnboxFix { - - @Unique - private boolean gregTech$defaultTextColor = true; - - @Unique - private boolean gregTech$defaultShadow = true; - - @Override - public void gregTech$useDefaultTextColor(boolean b) { - gregTech$defaultTextColor = b; - } - - @Override - public void gregTech$useDefaultShadow(boolean b) { - gregTech$defaultShadow = b; - } - - @Override - public boolean canHover() { - return hasTooltip(); - } - - @ModifyReturnValue(method = { "getDefaultHeight", "getDefaultWidth" }, at = @At("TAIL")) - public int clamp(int r) { - return Math.max(1, r); - } - - @ModifyArg(method = "draw", - at = @At(value = "INVOKE", - target = "Lcom/cleanroommc/modularui/drawable/text/TextRenderer;setColor(I)V")) - public int fixColor(int color, @Local(argsOnly = true) WidgetTheme theme) { - return gregTech$defaultTextColor ? theme.getTextColor() : color; - } - - @ModifyArg(method = "draw", - at = @At(value = "INVOKE", - target = "Lcom/cleanroommc/modularui/drawable/text/TextRenderer;setShadow(Z)V")) - public boolean fixShadow(boolean shadow, @Local(argsOnly = true) WidgetTheme theme) { - return gregTech$defaultShadow ? theme.getTextShadow() : shadow; - } -} diff --git a/src/main/java/gregtech/mixins/mui2/ToggleButtonMixin.java b/src/main/java/gregtech/mixins/mui2/ToggleButtonMixin.java deleted file mode 100644 index 3838ecf5805..00000000000 --- a/src/main/java/gregtech/mixins/mui2/ToggleButtonMixin.java +++ /dev/null @@ -1,22 +0,0 @@ -package gregtech.mixins.mui2; - -import gregtech.api.mui.StateOverlay; - -import com.cleanroommc.modularui.api.drawable.IDrawable; -import com.cleanroommc.modularui.widgets.AbstractCycleButtonWidget; -import com.cleanroommc.modularui.widgets.ToggleButton; -import org.spongepowered.asm.mixin.Mixin; - -@Mixin(value = ToggleButton.class, remap = false) -public class ToggleButtonMixin extends AbstractCycleButtonWidget implements StateOverlay { - - public StateOverlay overlay(boolean selected, IDrawable... overlay) { - this.overlay = addToArray(this.overlay, overlay, selected ? 1 : 0); - return (StateOverlay) getThis(); - } - - public StateOverlay hoverOverlay(boolean selected, IDrawable... overlay) { - this.hoverOverlay = addToArray(this.hoverOverlay, overlay, selected ? 1 : 0); - return (StateOverlay) getThis(); - } -} diff --git a/src/main/java/gregtech/mixins/mui2/TooltipMixin.java b/src/main/java/gregtech/mixins/mui2/TooltipMixin.java deleted file mode 100644 index 7883e8b12de..00000000000 --- a/src/main/java/gregtech/mixins/mui2/TooltipMixin.java +++ /dev/null @@ -1,100 +0,0 @@ -package gregtech.mixins.mui2; - -import com.cleanroommc.modularui.drawable.text.RichText; -import com.cleanroommc.modularui.screen.RichTooltip; -import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; -import com.cleanroommc.modularui.theme.WidgetTheme; -import com.cleanroommc.modularui.widget.Widget; -import com.cleanroommc.modularui.widgets.RichTextWidget; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; - -import java.util.function.Consumer; - -@Mixin(value = RichTooltip.class, remap = false) -public abstract class TooltipMixin { - - @Shadow - private boolean dirty; - - @Shadow - @Final - private RichText text; - - @Shadow - private Consumer tooltipBuilder; - - @Shadow - public abstract RichTooltip getThis(); - - @Shadow - public abstract void markDirty(); - - /** - * @author GTCEu - Ghzdude - * @reason Implement MUI2 PR#83 - */ - @Overwrite - public void buildTooltip() { - this.dirty = false; - if (this.tooltipBuilder != null) { - this.text.clearText(); - this.tooltipBuilder.accept(getThis()); - } - } - - /** - * @author GTCEu - Ghzdude - * @reason Implement MUI2 PR#83 - */ - @Overwrite - public RichTooltip tooltipBuilder(Consumer tooltipBuilder) { - Consumer existingBuilder = this.tooltipBuilder; - if (existingBuilder != null) { - this.tooltipBuilder = tooltip -> { - existingBuilder.accept(getThis()); - tooltipBuilder.accept(getThis()); - }; - } else { - this.tooltipBuilder = tooltipBuilder; - } - markDirty(); - return getThis(); - } - - @Mixin(value = RichTextWidget.class, remap = false) - private static abstract class RichTextWidgetMixin extends Widget { - - @Shadow - private boolean autoUpdate; - - @Shadow - private boolean dirty; - - @Shadow - @Final - private RichText text; - - @Shadow - private Consumer builder; - - /** - * @author GTCEu - Ghzdude - * @reason Implement MUI2 PR#83 - */ - @Overwrite - public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { - super.draw(context, widgetTheme); - if (this.autoUpdate || this.dirty) { - if (this.builder != null) { - this.text.clearText(); - this.builder.accept(this.text); - } - this.dirty = false; - } - this.text.drawAtZero(context, getArea(), widgetTheme); - } - } -} diff --git a/src/main/resources/mixins.gregtech.minecraft.json b/src/main/resources/mixins.gregtech.minecraft.json index 85676f99055..41a4c44b26e 100644 --- a/src/main/resources/mixins.gregtech.minecraft.json +++ b/src/main/resources/mixins.gregtech.minecraft.json @@ -18,8 +18,10 @@ "client": [ "BlockMixin", "EntityRendererMixin", + "L18nMixin", "LayerArmorBaseMixin", "LayerCustomHeadMixin", + "LocaleMixin", "RecipeRepairItemMixin", "RegionRenderCacheBuilderMixin", "RenderChunkMixin", diff --git a/src/main/resources/mixins.gregtech.mui2.json b/src/main/resources/mixins.gregtech.mui2.json index cb97f2be00c..427113e6ac8 100644 --- a/src/main/resources/mixins.gregtech.mui2.json +++ b/src/main/resources/mixins.gregtech.mui2.json @@ -7,18 +7,9 @@ "injectors": { "maxShiftBy": 10 }, - "mixins": [ - "ItemSlotSHMixin", - "PanelSyncHandlerMixin", - "PanelSyncManagerMixin", - "StyledTextMixin", - "TextWidgetMixin", - "ToggleButtonMixin", - "TooltipMixin", - "TooltipMixin$RichTextWidgetMixin" - ], + "mixins": [], "client": [ - "ClientEventHandlerMixin" + "LangKeyMixin" ], "server": [] }