Ore dict scrolling not resets stack size (#59)

This commit is contained in:
Kogepan229 authored and GitHub committed 2026-01-20 22:27:49 +01:00
1 parent 10434f1d18
commit 24954aebd4
2 files changed
+80 -46

No files matched your search

@@ -7,8 +7,6 @@ import static com.github.vfyjxf.nee.utils.GuiUtils.isPatternTerm;
import java.awt.Point;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -36,6 +34,7 @@ import com.github.vfyjxf.nee.utils.ItemUtils;
import com.glodblock.github.client.gui.GuiLevelMaintainer;
import appeng.api.events.GuiScrollEvent;
import appeng.api.storage.data.IAEItemStack;
import appeng.api.storage.data.IAEStack;
import appeng.client.gui.AEBaseGui;
import appeng.client.gui.implementations.GuiInterface;
@@ -46,6 +45,7 @@ import appeng.client.gui.slots.VirtualMESlot;
import appeng.container.AEBaseContainer;
import appeng.container.implementations.ContainerPatternTerm;
import appeng.container.slot.SlotFake;
import appeng.util.item.AEItemStack;
import codechicken.lib.gui.GuiDraw;
import codechicken.nei.NEIClientConfig;
import codechicken.nei.NEIServerUtils;
@@ -58,6 +58,8 @@ import codechicken.nei.recipe.RecipeInfo;
import codechicken.nei.util.NEIMouseUtils;
import cpw.mods.fml.common.Loader;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
public class GuiEventHandler extends INEIGuiAdapter implements IContainerTooltipHandler {
@@ -215,8 +217,9 @@ public class GuiEventHandler extends INEIGuiAdapter implements IContainerTooltip
}
if (sendPacket) {
NEENetworkHandler.getInstance().sendToServer(
new PacketSlotStackChange(copyStack, Collections.singletonList(currentSlot.slotNumber)));
Int2ObjectMap<IAEItemStack> map = new Int2ObjectOpenHashMap<IAEItemStack>();
map.put(currentSlot.slotNumber, AEItemStack.create(copyStack));
NEENetworkHandler.getInstance().sendToServer(new PacketSlotStackChange(map));
if (!NEEConfig.keepGhostitems) {
draggedStack.stackSize = 0;
}
@@ -323,37 +326,64 @@ public class GuiEventHandler extends INEIGuiAdapter implements IContainerTooltip
private void handleRecipeIngredientChange(GuiPatternTerm gui, VirtualMEPatternSlot currentSlot, int dWheel) {
final int currentSlotIndex = currentSlot.getSlotIndex();
final PositionedStack currentIngredients = NEEPatternTerminalHandler.ingredients
.get(INPUT_KEY + currentSlotIndex);
final PositionedStack baseIngredients = NEEPatternTerminalHandler.ingredients.get(INPUT_KEY + currentSlotIndex);
if (currentIngredients != null && currentIngredients.items.length > 1) {
if (baseIngredients != null && baseIngredients.items.length > 1) {
final IAEStack<?> aes = currentSlot.getAEStack();
if (aes == null) return;
final ItemStack slotStack = aes.getItemStackForNEI();
if (slotStack == null) return;
final List<Integer> craftingSlots = new ArrayList<>();
final List<ItemStack> items = currentIngredients.getFilteredPermutations();
final int currentStackIndex = ItemUtils.getPermutationIndex(slotStack, items);
final ItemStack nextStack = items.get((items.size() - dWheel + currentStackIndex) % items.size());
final ItemStack currentStack = currentIngredients.item;
final ItemStack baseSlotStack = aes.getItemStackForNEI();
if (baseSlotStack == null) return;
final List<ItemStack> items = baseIngredients.getFilteredPermutations();
final int currentStackIndex = ItemUtils.getPermutationIndex(baseSlotStack, items);
final ItemStack nextStack = items.get((items.size() - dWheel + currentStackIndex) % items.size()).copy();
final Int2ObjectMap<IAEItemStack> craftingSlotss = new Int2ObjectOpenHashMap<>();
if (NEEConfig.allowSynchronousSwitchIngredient) {
final ItemStack baseStack = baseIngredients.item;
for (VirtualMEPatternSlot slot : gui.getCraftingSlots()) {
IAEStack<?> slotAEStack = slot.getAEStack();
if (!(slotAEStack instanceof IAEItemStack ais)) continue;
final ItemStack slotStack = ais.getItemStackForNEI();
if (slotStack == null) continue;
final PositionedStack slotIngredients = NEEPatternTerminalHandler.ingredients
.get(INPUT_KEY + slot.getSlotIndex());
if (slotIngredients != null && slotIngredients.containsWithNBT(nextStack)
&& NEIServerUtils.areStacksSameTypeCraftingWithNBT(slotIngredients.item, currentStack)) {
&& NEIServerUtils.areStacksSameTypeCraftingWithNBT(slotStack, baseStack)
&& NEIServerUtils.areStacksSameTypeCraftingWithNBT(slotIngredients.item, baseStack)) {
// If the current slot's stack size is a multiple of the recipe's default, apply that multiplier
// to nextStack.
long nextStackAmount;
if (slotStack.stackSize % baseStack.stackSize == 0) {
nextStackAmount = (long) nextStack.stackSize * (slotStack.stackSize / baseStack.stackSize);
} else {
nextStackAmount = slotAEStack.getStackSize();
}
craftingSlotss
.put(slot.getSlotIndex(), AEItemStack.create(nextStack).setStackSize(nextStackAmount));
slotIngredients.setPermutationToRender(nextStack);
craftingSlots.add(slot.getSlotIndex());
}
}
} else {
currentIngredients.setPermutationToRender(nextStack);
craftingSlots.add(currentSlot.getSlotIndex());
// If the current slot's stack size is a multiple of the recipe's default, apply that multiplier to
// nextStack.
long nextStackAmount;
if (baseSlotStack.stackSize % baseIngredients.item.stackSize == 0) {
nextStackAmount = (long) nextStack.stackSize
* (baseSlotStack.stackSize / baseIngredients.item.stackSize);
} else {
nextStackAmount = aes.getStackSize();
}
craftingSlotss
.put(currentSlot.getSlotIndex(), AEItemStack.create(nextStack).setStackSize(nextStackAmount));
baseIngredients.setPermutationToRender(nextStack);
}
NEENetworkHandler.getInstance().sendToServer(new PacketSlotStackChange(nextStack, craftingSlots));
NEENetworkHandler.getInstance().sendToServer(new PacketSlotStackChange(craftingSlotss));
}
}
}
@@ -1,17 +1,16 @@
package com.github.vfyjxf.nee.network.packet;
import java.util.ArrayList;
import java.util.List;
import java.io.IOException;
import net.minecraft.item.ItemStack;
import javax.annotation.Nonnull;
import com.github.vfyjxf.nee.utils.ItemUtils;
import com.github.vfyjxf.nee.NotEnoughEnergistics;
import appeng.api.storage.StorageName;
import appeng.api.storage.data.IAEItemStack;
import appeng.api.storage.data.IAEStack;
import appeng.container.implementations.ContainerPatternTerm;
import appeng.util.item.AEItemStack;
import cpw.mods.fml.common.network.ByteBufUtils;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
import cpw.mods.fml.common.network.simpleimpl.MessageContext;
@@ -24,41 +23,48 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
*/
public class PacketSlotStackChange implements IMessage {
private ItemStack stack;
private List<Integer> craftingSlots;
private IAEItemStack stack;
private Int2ObjectMap<IAEItemStack> slotStacks;
public PacketSlotStackChange() {}
public PacketSlotStackChange(ItemStack stack, List<Integer> craftingSlots) {
this.stack = stack;
this.craftingSlots = craftingSlots;
public PacketSlotStackChange(@Nonnull Int2ObjectMap<IAEItemStack> slotStacks) {
this.slotStacks = slotStacks;
}
public ItemStack getStack() {
public IAEItemStack getStack() {
return stack;
}
public List<Integer> getCraftingSlots() {
return craftingSlots;
public Int2ObjectMap<IAEItemStack> getSlotStacks() {
return slotStacks;
}
@Override
public void fromBytes(ByteBuf buf) {
this.stack = ItemUtils.loadItemStackFromNBT(ByteBufUtils.readTag(buf));
int craftingSlotsSize = buf.readInt();
this.craftingSlots = new ArrayList<>(craftingSlotsSize);
for (int i = 0; i < craftingSlotsSize; i++) {
int mapSize = buf.readInt();
this.slotStacks = new Int2ObjectOpenHashMap<>(mapSize);
for (int i = 0; i < mapSize; i++) {
int slotNumber = buf.readInt();
craftingSlots.add(slotNumber);
try {
IAEItemStack stack = AEItemStack.loadItemStackFromPacket(buf);
this.slotStacks.put(slotNumber, stack);
} catch (IOException e) {
NotEnoughEnergistics.logger.error(e);
}
}
}
@Override
public void toBytes(ByteBuf buf) {
ByteBufUtils.writeTag(buf, ItemUtils.writeItemStackToNBT(this.stack, this.stack.stackSize));
buf.writeInt(this.craftingSlots.size());
for (Integer craftingSlot : this.craftingSlots) {
buf.writeInt(craftingSlot);
buf.writeInt(this.slotStacks.size());
for (Int2ObjectMap.Entry<IAEItemStack> entry : this.slotStacks.int2ObjectEntrySet()) {
buf.writeInt(entry.getIntKey());
try {
entry.getValue().writeToPacket(buf);
} catch (IOException e) {
NotEnoughEnergistics.logger.error(e);
}
}
}
@@ -66,12 +72,10 @@ public class PacketSlotStackChange implements IMessage {
@Override
public IMessage onMessage(PacketSlotStackChange message, MessageContext ctx) {
final IAEStack<?> nextStack = AEItemStack.create(message.getStack());
if (nextStack != null
&& ctx.getServerHandler().playerEntity.openContainer instanceof ContainerPatternTerm cpt) {
if (ctx.getServerHandler().playerEntity.openContainer instanceof ContainerPatternTerm cpt) {
final Int2ObjectMap<IAEStack<?>> temp = new Int2ObjectOpenHashMap<>();
for (int craftingSlot : message.getCraftingSlots()) {
temp.put(craftingSlot, nextStack);
for (Int2ObjectMap.Entry<IAEItemStack> entry : message.getSlotStacks().int2ObjectEntrySet()) {
temp.put(entry.getIntKey(), entry.getValue());
}
cpt.receiveSlotStacks(StorageName.CRAFTING_INPUT, temp);
}