Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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);
}
}
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Expand Down Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,23 +9,23 @@
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.
* Provides methods for serialization and deserialization.
*/
@MethodsReturnNonnullByDefault
public class KeyStorage implements INBTSerializable<ListTag>,
Iterable<Object2LongMap.Entry<AEKey>> {
Iterable<Map.Entry<AEKey, Long>> {

public final Object2LongMap<AEKey> storage = new Object2LongOpenHashMap<>(); // TODO trim periodically or not
public Map<AEKey, Long> storage = new Object2LongOpenHashMap<>(); // TODO trim periodically or not

@Nullable
@Getter
Expand All @@ -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) {
Expand All @@ -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;
Expand All @@ -90,8 +90,8 @@ public void deserializeNBT(ListTag tags) {
}

@Override
public Iterator<Object2LongMap.Entry<AEKey>> iterator() {
return storage.object2LongEntrySet().iterator();
public Iterator<Map.Entry<AEKey, Long>> iterator() {
return storage.entrySet().iterator();
}

public boolean isEmpty() {
Expand Down
Loading