diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/widget/list/AEListGridWidget.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/widget/list/AEListGridWidget.java index fe52076fd6..d4868bf36d 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/widget/list/AEListGridWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/widget/list/AEListGridWidget.java @@ -71,21 +71,21 @@ protected void writeListChange(FriendlyByteBuf buffer) { this.changeMap.clear(); // Remove - var cachedIt = cached.storage.object2LongEntrySet().iterator(); + var cachedIt = cached.storage.entrySet().iterator(); while (cachedIt.hasNext()) { var entry = cachedIt.next(); var cachedKey = entry.getKey(); if (!list.storage.containsKey(cachedKey)) { - this.changeMap.put(cachedKey, -entry.getLongValue()); + this.changeMap.put(cachedKey, -entry.getValue()); cachedIt.remove(); } } // Change/Add - for (var entry : list.storage.object2LongEntrySet()) { + for (var entry : list.storage.entrySet()) { var key = entry.getKey(); - long value = entry.getLongValue(); - long cacheValue = cached.storage.getOrDefault(key, 0); + long value = entry.getValue(); + long cacheValue = cached.storage.getOrDefault(key, 0L); if (cacheValue == 0) { // Add this.changeMap.put(key, value); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java index 2f891183fa..a8e21953c7 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java @@ -6,20 +6,40 @@ import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; +import com.gregtechceu.gtceu.api.mui.drawable.DynamicDrawable; +import com.gregtechceu.gtceu.api.mui.drawable.ItemDrawable; +import com.gregtechceu.gtceu.api.mui.drawable.text.TextRenderer; +import com.gregtechceu.gtceu.api.mui.factory.PosGuiData; +import com.gregtechceu.gtceu.api.mui.utils.Alignment; +import com.gregtechceu.gtceu.api.mui.value.sync.GenericMapSyncHandler; +import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; +import com.gregtechceu.gtceu.api.mui.widget.Widget; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Column; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Row; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; +import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; +import com.gregtechceu.gtceu.client.mui.screen.UISettings; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; +import com.gregtechceu.gtceu.common.mui.GTGuis; import com.gregtechceu.gtceu.integration.ae2.utils.KeyStorage; import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; +import com.gregtechceu.gtceu.utils.ICopy; import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; import appeng.api.config.Actionable; import appeng.api.stacks.AEItemKey; +import appeng.api.stacks.AEKey; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.List; +import java.util.Objects; import javax.annotation.ParametersAreNonnullByDefault; @@ -52,7 +72,7 @@ public void onMachineRemoved() { var grid = getMainNode().getGrid(); if (grid != null && !internalBuffer.isEmpty()) { for (var entry : internalBuffer) { - grid.getStorageService().getInventory().insert(entry.getKey(), entry.getLongValue(), + grid.getStorageService().getInventory().insert(entry.getKey(), entry.getValue(), Actionable.MODULATE, actionSource); } } @@ -99,6 +119,71 @@ public void autoIO() { * } */ + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + int panelWidth = 176; + int panelHeight = 118; + + var panel = GTGuis.createPanel(this, panelWidth, panelHeight); + + var displayItem = this.getDefinition().asStack(); + String hatchName = displayItem.getHoverName().getString(); + hatchName = hatchName.replaceAll("ยง.", "").trim(); + + int borderRadius = 5; + int iconSize = 16; + int minPanelWidth = (int) (panelWidth * 0.8f) - (iconSize + (borderRadius * 2)); + int textTitleWidth = TextRenderer.getFont().width(hatchName) + iconSize + (borderRadius * 2); + + int textRows = (int) Math.ceil((double) textTitleWidth / minPanelWidth); + int textHeightPerRow = (int) (IKey.renderer.getFontHeight()); + int textHeight = textHeightPerRow * textRows + borderRadius; + + var keyStorageSyncHandler = new GenericMapSyncHandler<>(() -> internalBuffer.storage, + (map) -> internalBuffer.storage = map, + AEKey::readKey, FriendlyByteBuf::readLong, + AEKey::writeKey, FriendlyByteBuf::writeLong, + Objects::equals, ICopy.immutable(), ICopy.immutable()); + + syncManager.syncValue("keyStorage", keyStorageSyncHandler); + + panel.child(new Row() + .coverChildrenHeight() + .mainAxisAlignment(Alignment.MainAxis.CENTER) + .widthRel(.8f) + .top(-(textHeight + borderRadius)) + .rightRel(0.5f) + .background(GTGuiTextures.BACKGROUND) + .child(new ItemDrawable(displayItem) + .asIcon().size(iconSize) + .asWidget() + .marginLeft(borderRadius)) + .mainAxisAlignment(Alignment.MainAxis.START) + .child(IKey.str(hatchName) + .asWidget() + .paddingTop(1) + .margin(borderRadius, borderRadius, borderRadius, 1) + .size(textTitleWidth, textHeight))); + + var widget = new Column().name("ae_list"); + for (var entry : keyStorageSyncHandler.getValue().entrySet()) { + AEKey key = entry.getKey(); + + var drawable = new ItemDrawable(); + widget.child(new Row() + .child(new Widget<>() + .overlay(new DynamicDrawable(() -> drawable.setItem(key.wrapForDisplayOrFilter())))) + .child(IKey.dynamic(() -> { + ItemStack stack = key.wrapForDisplayOrFilter(); + return Component.literal(stack.getDisplayName().getString() + " " + entry.getValue()); + }).asWidget())); + } + + panel.child(widget); + + return panel; + } + private class InaccessibleInfiniteHandler extends NotifiableItemStackHandler { public InaccessibleInfiniteHandler(MetaMachine holder) { @@ -154,7 +239,7 @@ public void setStackInSlot(int slot, ItemStack stack) { public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { var key = AEItemKey.of(stack); int count = stack.getCount(); - long oldValue = internalBuffer.storage.getOrDefault(key, 0); + long oldValue = internalBuffer.storage.getOrDefault(key, 0L); long changeValue = Math.min(Long.MAX_VALUE - oldValue, count); if (changeValue > 0) { if (!simulate) { diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java index b288a16029..fdbfff5162 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java @@ -51,7 +51,7 @@ public void onMachineRemoved() { var grid = getMainNode().getGrid(); if (grid != null && !internalBuffer.isEmpty()) { for (var entry : internalBuffer) { - grid.getStorageService().getInventory().insert(entry.getKey(), entry.getLongValue(), + grid.getStorageService().getInventory().insert(entry.getKey(), entry.getValue(), Actionable.MODULATE, actionSource); } } @@ -194,10 +194,10 @@ public void setFluid(FluidStack fluid) { public int fill(FluidStack resource, FluidAction action) { var key = AEFluidKey.of(resource.getFluid(), resource.getTag()); int amount = resource.getAmount(); - int oldValue = GTMath.saturatedCast(internalBuffer.storage.getOrDefault(key, 0)); + int oldValue = GTMath.saturatedCast(internalBuffer.storage.getOrDefault(key, 0L)); int changeValue = Math.min(Integer.MAX_VALUE - oldValue, amount); if (changeValue > 0 && action.execute()) { - internalBuffer.storage.put(key, oldValue + changeValue); + internalBuffer.storage.put(key, (long) (oldValue + changeValue)); internalBuffer.onChanged(); } return changeValue; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/utils/KeyStorage.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/utils/KeyStorage.java index 27d9cf26db..a52c297411 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/utils/KeyStorage.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/utils/KeyStorage.java @@ -9,13 +9,13 @@ import appeng.api.networking.security.IActionSource; import appeng.api.stacks.AEKey; import appeng.api.storage.MEStorage; -import it.unimi.dsi.fastutil.objects.Object2LongMap; import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap; import lombok.Getter; import lombok.Setter; import org.jetbrains.annotations.Nullable; import java.util.Iterator; +import java.util.Map; /** * Used to store {@link appeng.api.stacks.GenericStack } in a way that associates key and amount. @@ -23,9 +23,9 @@ */ @MethodsReturnNonnullByDefault public class KeyStorage implements INBTSerializable, - Iterable> { + Iterable> { - public final Object2LongMap storage = new Object2LongOpenHashMap<>(); // TODO trim periodically or not + public Map storage = new Object2LongOpenHashMap<>(); // TODO trim periodically or not @Nullable @Getter @@ -44,7 +44,7 @@ public void insertInventory(MEStorage inventory, IActionSource source) { while (it.hasNext()) { var entry = it.next(); var key = entry.getKey(); - var amount = entry.getLongValue(); + var amount = entry.getValue(); long inserted = inventory.insert(key, amount, Actionable.MODULATE, source); if (inserted > 0) { @@ -70,10 +70,10 @@ public void onChanged() { @Override public ListTag serializeNBT() { var list = new ListTag(); - for (var entry : storage.object2LongEntrySet()) { + for (var entry : storage.entrySet()) { var tag = new CompoundTag(); tag.put("key", entry.getKey().toTagGeneric()); - tag.putLong("value", entry.getLongValue()); + tag.putLong("value", entry.getValue()); list.add(tag); } return list; @@ -90,8 +90,8 @@ public void deserializeNBT(ListTag tags) { } @Override - public Iterator> iterator() { - return storage.object2LongEntrySet().iterator(); + public Iterator> iterator() { + return storage.entrySet().iterator(); } public boolean isEmpty() {