diff --git a/dependencies.gradle b/dependencies.gradle index af0a6c3..37fece0 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -37,50 +37,50 @@ def asmVersion = "9.7" dependencies { - implementation("com.github.GTNewHorizons:StructureLib:1.4.23:dev") - implementation("com.github.GTNewHorizons:GTNHLib:0.7.0:dev") - implementation("com.github.GTNewHorizons:ModularUI:1.2.20:dev") - implementation("com.github.GTNewHorizons:ModularUI2:2.2.18-1.7.10:dev") + implementation("com.github.GTNewHorizons:StructureLib:1.4.24:dev") + implementation("com.github.GTNewHorizons:GTNHLib:0.8.32:dev") + implementation("com.github.GTNewHorizons:ModularUI:1.3.1:dev") + implementation("com.github.GTNewHorizons:ModularUI2:2.3.23-1.7.10:dev") - compileOnly("com.github.GTNewHorizons:ae2stuff:0.9.8-GTNH:dev") { transitive = false } - compileOnly("com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-690-GTNH:dev") { transitive = false } - compileOnly("com.github.GTNewHorizons:ArchitectureCraft:1.11.5") { transitive = false } - compileOnly("com.github.GTNewHorizons:Avaritia:1.75:dev") { transitive = false } - compileOnly("com.github.GTNewHorizons:Avaritiaddons:1.9.1-GTNH:dev") { transitive = false } + compileOnly("com.github.GTNewHorizons:ae2stuff:0.10.2-GTNH:dev") { transitive = false } + compileOnly("com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-754-GTNH:dev") { transitive = false } + compileOnly("com.github.GTNewHorizons:ArchitectureCraft:1.12.3") { transitive = false } + compileOnly("com.github.GTNewHorizons:Avaritia:1.78:dev") { transitive = false } + compileOnly("com.github.GTNewHorizons:Avaritiaddons:1.9.3-GTNH:dev") { transitive = false } compileOnly("com.github.GTNewHorizons:bdlib:1.11.0-GTNH:dev") { transitive = false } - compileOnly("com.github.GTNewHorizons:BloodMagic:1.8.0:dev") { transitive = false } + compileOnly("com.github.GTNewHorizons:BloodMagic:1.8.7:dev") { transitive = false } compileOnly("curse.maven:cofh-lib-220333:2388748") { transitive = false } - compileOnly("com.github.GTNewHorizons:EnderIO:2.9.26:dev") { transitive = false } - compileOnly("com.github.GTNewHorizons:EnderStorage:1.7.7:dev") { transitive = false } - compileOnly("com.github.GTNewHorizons:FloodLights:1.5.4:dev") { transitive = false } - compileOnly("com.github.GTNewHorizons:ForgeMultipart:1.6.8:dev") { transitive = false } - compileOnly("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.02:dev") { transitive = false } - compileOnly("com.github.GTNewHorizons:Hodgepodge:2.6.108:dev") { transitive = false } + compileOnly("com.github.GTNewHorizons:EnderIO:2.10.8:dev") { transitive = false } + compileOnly("com.github.GTNewHorizons:EnderStorage:1.8.0:dev") { transitive = false } + compileOnly("com.github.GTNewHorizons:FloodLights:1.5.5:dev") { transitive = false } + compileOnly("com.github.GTNewHorizons:ForgeMultipart:1.7.2:dev") { transitive = false } + compileOnly("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.140:dev") { transitive = false } + compileOnly("com.github.GTNewHorizons:Hodgepodge:2.7.25:dev") { transitive = false } compileOnly("net.industrial-craft:industrialcraft-2:2.2.828-experimental:dev") { transitive = false } compileOnly("curse.maven:mekanism-268560:2475797") { transitive = false } - compileOnly("com.github.GTNewHorizons:NotEnoughItems:2.8.0-GTNH:dev") { transitive = false } - compileOnly("com.github.GTNewHorizons:OpenComputers:1.11.19-GTNH:dev") { transitive = false } + compileOnly("com.github.GTNewHorizons:NotEnoughItems:2.8.40-GTNH:dev") { transitive = false } + compileOnly("com.github.GTNewHorizons:OpenComputers:1.12.8-GTNH:dev") { transitive = false } compileOnly("thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev") { transitive = false } - compileOnly("com.github.GTNewHorizons:waila:1.9.0:dev") { transitive = false } + compileOnly("com.github.GTNewHorizons:waila:1.9.15:dev") { transitive = false } compileOnly rfg.deobf("maven.modrinth:immibis-microblocks:59.1.2") compileOnly rfg.deobf("maven.modrinth:immibis-core:59.1.4") - runtimeOnlyNonPublishable("com.github.GTNewHorizons:ae2stuff:0.9.8-GTNH:dev") - runtimeOnlyNonPublishable("com.github.GTNewHorizons:ArchitectureCraft:1.11.5") - runtimeOnlyNonPublishable('com.github.GTNewHorizons:Angelica:1.0.0-beta57:dev') - runtimeOnlyNonPublishable("com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-690-GTNH:dev") - runtimeOnlyNonPublishable("com.github.GTNewHorizons:Avaritia:1.75:dev") - runtimeOnlyNonPublishable("com.github.GTNewHorizons:Avaritiaddons:1.9.1-GTNH:dev") - runtimeOnlyNonPublishable("com.github.GTNewHorizons:DuraDisplay:1.3.4:dev") - runtimeOnlyNonPublishable('com.github.GTNewHorizons:EnderIO:2.9.26:dev') - runtimeOnlyNonPublishable("com.github.GTNewHorizons:EnderStorage:1.7.7:dev") - runtimeOnlyNonPublishable("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.02:dev") - runtimeOnlyNonPublishable("com.github.GTNewHorizons:FloodLights:1.5.4:dev") - runtimeOnlyNonPublishable("com.github.GTNewHorizons:ForgeMultipart:1.6.8:dev") - runtimeOnlyNonPublishable("com.github.GTNewHorizons:Hodgepodge:2.6.108:dev") + runtimeOnlyNonPublishable("com.github.GTNewHorizons:ae2stuff:0.10.2-GTNH:dev") + runtimeOnlyNonPublishable("com.github.GTNewHorizons:ArchitectureCraft:1.12.3") + runtimeOnlyNonPublishable('com.github.GTNewHorizons:Angelica:1.0.0-beta68a:dev') + runtimeOnlyNonPublishable("com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-754-GTNH:dev") + runtimeOnlyNonPublishable("com.github.GTNewHorizons:Avaritia:1.78:dev") + runtimeOnlyNonPublishable("com.github.GTNewHorizons:Avaritiaddons:1.9.3-GTNH:dev") + runtimeOnlyNonPublishable("com.github.GTNewHorizons:DuraDisplay:1.4.0:dev") + runtimeOnlyNonPublishable('com.github.GTNewHorizons:EnderIO:2.10.8:dev') + runtimeOnlyNonPublishable("com.github.GTNewHorizons:EnderStorage:1.8.0:dev") + runtimeOnlyNonPublishable("com.github.GTNewHorizons:GT5-Unofficial:5.09.52.140:dev") + runtimeOnlyNonPublishable("com.github.GTNewHorizons:FloodLights:1.5.5:dev") + runtimeOnlyNonPublishable("com.github.GTNewHorizons:ForgeMultipart:1.7.2:dev") + runtimeOnlyNonPublishable("com.github.GTNewHorizons:Hodgepodge:2.7.25:dev") runtimeOnlyNonPublishable("net.industrial-craft:industrialcraft-2:2.2.828-experimental:dev") - runtimeOnlyNonPublishable("com.github.GTNewHorizons:NotEnoughItems:2.8.0-GTNH:dev") + runtimeOnlyNonPublishable("com.github.GTNewHorizons:NotEnoughItems:2.8.40-GTNH:dev") runtimeOnlyNonPublishable("thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev") { transitive = false } runtimeOnlyNonPublishable("com.github.GTNewHorizons:WanionLib:1.10.0:dev") @@ -105,7 +105,7 @@ project.getConfigurations() final DependencySubstitutions ds = c.getResolutionStrategy() .getDependencySubstitution(); ds.substitute(ds.module("com.github.GTNewHorizons:Baubles")) - .using(ds.module("com.github.GTNewHorizons:Baubles-Expanded:2.1.15-GTNH")) + .using(ds.module("com.github.GTNewHorizons:Baubles-Expanded:2.2.4-GTNH")) .withClassifier("dev") .because("Baubles-Expanded replaces Baubles"); }); diff --git a/src/main/java/com/recursive_pineapple/matter_manipulator/common/building/providers/AECellItemProvider.java b/src/main/java/com/recursive_pineapple/matter_manipulator/common/building/providers/AECellItemProvider.java index 7b61faf..1eeaae1 100644 --- a/src/main/java/com/recursive_pineapple/matter_manipulator/common/building/providers/AECellItemProvider.java +++ b/src/main/java/com/recursive_pineapple/matter_manipulator/common/building/providers/AECellItemProvider.java @@ -12,6 +12,7 @@ import appeng.api.definitions.IItemDefinition; import appeng.api.storage.ICellWorkbenchItem; import appeng.parts.automation.UpgradeInventory; +import appeng.tile.inventory.IAEStackInventory; import com.recursive_pineapple.matter_manipulator.common.building.IPseudoInventory; import com.recursive_pineapple.matter_manipulator.common.building.PortableItemStack; @@ -42,7 +43,7 @@ public static AECellItemProvider fromWorkbenchItem(ItemStack stack) { cell.mCell = new PortableItemStack(stack); IInventory upgrades = item.getUpgradesInventory(stack); cell.mUpgrades = upgrades == null ? null : MMUtils.fromInventory(upgrades); - IInventory config = item.getConfigInventory(stack); + IAEStackInventory config = item.getConfigAEInventory(stack); cell.mConfig = config == null ? null : MMUtils.fromInventoryNoMerge(config); cell.mFuzzyMode = switch (item.getFuzzyMode(stack)) { case IGNORE_ALL -> 0; @@ -50,6 +51,8 @@ public static AECellItemProvider fromWorkbenchItem(ItemStack stack) { case PERCENT_50 -> 2; case PERCENT_75 -> 3; case PERCENT_99 -> 4; + case PERCENT_10 -> 5; + case PERCENT_1 -> 6; }; IItemDefinition oredictCard = AEApi.instance() @@ -120,6 +123,8 @@ public ItemStack getStack(IPseudoInventory inv, boolean consume) { case 2 -> FuzzyMode.PERCENT_50; case 3 -> FuzzyMode.PERCENT_75; case 4 -> FuzzyMode.PERCENT_99; + case 5 -> FuzzyMode.PERCENT_10; + case 6 -> FuzzyMode.PERCENT_1; default -> FuzzyMode.IGNORE_ALL; }); diff --git a/src/main/java/com/recursive_pineapple/matter_manipulator/common/items/manipulator/ItemMatterManipulator.java b/src/main/java/com/recursive_pineapple/matter_manipulator/common/items/manipulator/ItemMatterManipulator.java index 941a0c9..bbbcd99 100644 --- a/src/main/java/com/recursive_pineapple/matter_manipulator/common/items/manipulator/ItemMatterManipulator.java +++ b/src/main/java/com/recursive_pineapple/matter_manipulator/common/items/manipulator/ItemMatterManipulator.java @@ -98,6 +98,7 @@ import com.recursive_pineapple.matter_manipulator.common.data.WeightedSpecList; import com.recursive_pineapple.matter_manipulator.common.items.MMItemList; import com.recursive_pineapple.matter_manipulator.common.items.MMUpgrades; +import com.recursive_pineapple.matter_manipulator.common.items.manipulator.MMConfig.VoxelAABB; import com.recursive_pineapple.matter_manipulator.common.items.manipulator.MMState.BlockRemoveMode; import com.recursive_pineapple.matter_manipulator.common.items.manipulator.MMState.BlockSelectMode; import com.recursive_pineapple.matter_manipulator.common.items.manipulator.MMState.PendingAction; @@ -108,7 +109,9 @@ import com.recursive_pineapple.matter_manipulator.common.utils.Mods; import com.recursive_pineapple.matter_manipulator.common.utils.Mods.Names; +import org.jetbrains.annotations.NotNull; import org.joml.Vector3i; +import org.joml.Vector3ic; import ic2.api.item.IElectricItemManager; import ic2.api.item.ISpecialElectricItem; @@ -1647,48 +1650,105 @@ public ModularWindow createTransformWindow(UIBuildContext buildContext, ItemStac .setSize(40, 36 + 30)) }; - Widget[] right = { - makeHeader(StatCollector.translateToLocal("mm.transform.header.copy")), - padding(2, 2), - makeCoordinateEditor(buildContext.getPlayer(), -1, 0), - padding(2, 2), - makeCoordinateEditor(buildContext.getPlayer(), -1, 1), - padding(2, 2), - makeCoordinateEditor(buildContext.getPlayer(), -1, 2), - padding(2, 2), - makeHeader(StatCollector.translateToLocal("mm.transform.header.copy_a")), - padding(2, 2), - makeCoordinateEditor(buildContext.getPlayer(), 0, 0), - padding(2, 2), - makeCoordinateEditor(buildContext.getPlayer(), 0, 1), - padding(2, 2), - makeCoordinateEditor(buildContext.getPlayer(), 0, 2), - padding(10, 2), - makeHeader(StatCollector.translateToLocal("mm.transform.header.copy_b")), - padding(2, 2), - makeCoordinateEditor(buildContext.getPlayer(), 1, 0), - padding(2, 2), - makeCoordinateEditor(buildContext.getPlayer(), 1, 1), - padding(2, 2), - makeCoordinateEditor(buildContext.getPlayer(), 1, 2), - padding(10, 2), - makeHeader(StatCollector.translateToLocal("mm.transform.header.paste")), - padding(2, 2), - makeCoordinateEditor(buildContext.getPlayer(), 2, 0), - padding(2, 2), - makeCoordinateEditor(buildContext.getPlayer(), 2, 1), - padding(2, 2), - makeCoordinateEditor(buildContext.getPlayer(), 2, 2), - padding(10, 2), - makeHeader(StatCollector.translateToLocal("mm.transform.header.stacking")), - padding(2, 2), - makeCoordinateEditor(buildContext.getPlayer(), 3, 0), - padding(2, 2), - makeCoordinateEditor(buildContext.getPlayer(), 3, 1), - padding(2, 2), - makeCoordinateEditor(buildContext.getPlayer(), 3, 2), - padding(10, 2) - }; + Widget[] right, lessRight; + + if (Minecraft.getMinecraft().gameSettings.guiScale <= 2) { + right = new Widget[] { + makeHeader(StatCollector.translateToLocal("mm.transform.header.copy")), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.Copy, CoordComponent.X), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.Copy, CoordComponent.Y), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.Copy, CoordComponent.Z), + padding(2, 2), + + makeHeader(StatCollector.translateToLocal("mm.transform.header.copy_a")), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.CopyA, CoordComponent.X), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.CopyA, CoordComponent.Y), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.CopyA, CoordComponent.Z), + padding(10, 2), + + makeHeader(StatCollector.translateToLocal("mm.transform.header.copy_b")), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.CopyB, CoordComponent.X), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.CopyB, CoordComponent.Y), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.CopyB, CoordComponent.Z), + padding(10, 2), + + makeHeader(StatCollector.translateToLocal("mm.transform.header.paste")), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.Paste, CoordComponent.X), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.Paste, CoordComponent.Y), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.Paste, CoordComponent.Z), + padding(10, 2), + + makeHeader(StatCollector.translateToLocal("mm.transform.header.stacking")), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.Stack, CoordComponent.X), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.Stack, CoordComponent.Y), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.Stack, CoordComponent.Z), + padding(10, 2) + }; + + lessRight = new Widget[0]; + } else { + right = new Widget[] { + makeHeader(StatCollector.translateToLocal("mm.transform.header.copy_a")), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.CopyA, CoordComponent.X), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.CopyA, CoordComponent.Y), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.CopyA, CoordComponent.Z), + padding(10, 2), + + makeHeader(StatCollector.translateToLocal("mm.transform.header.copy_b")), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.CopyB, CoordComponent.X), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.CopyB, CoordComponent.Y), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.CopyB, CoordComponent.Z), + padding(10, 2), + + makeHeader(StatCollector.translateToLocal("mm.transform.header.paste")), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.Paste, CoordComponent.X), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.Paste, CoordComponent.Y), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.Paste, CoordComponent.Z), + }; + + lessRight = new Widget[] { + makeHeader(StatCollector.translateToLocal("mm.transform.header.copy")), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.Copy, CoordComponent.X), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.Copy, CoordComponent.Y), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.Copy, CoordComponent.Z), + padding(2, 2), + + makeHeader(StatCollector.translateToLocal("mm.transform.header.stacking")), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.Stack, CoordComponent.X), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.Stack, CoordComponent.Y), + padding(2, 2), + makeCoordinateEditor(buildContext.getPlayer(), Coord.Stack, CoordComponent.Z), + }; + } builder.widget( new Row().widgets( @@ -1697,14 +1757,22 @@ public ModularWindow createTransformWindow(UIBuildContext buildContext, ItemStac .setAlignment(MainAxisAlignment.CENTER, CrossAxisAlignment.START) .widgets(left)).fillParent()); - Column cr; + Column columnRight, columnLessRight; builder.widget( - (cr = new Column()) + (columnRight = new Column()) .setAlignment(MainAxisAlignment.CENTER, CrossAxisAlignment.END) .widgets(right) .setPosProvider((screenSize, window, parent) -> { - return new Pos2d(screenSize.width - cr.getSize().width - 10, 0); + return new Pos2d(screenSize.width - columnRight.getSize().width - 10, 0); + })); + + builder.widget( + (columnLessRight = new Column()) + .setAlignment(MainAxisAlignment.CENTER, CrossAxisAlignment.END) + .widgets(lessRight) + .setPosProvider((screenSize, window, parent) -> { + return new Pos2d(screenSize.width - columnRight.getSize().width - columnLessRight.getSize().width - 20, 0); })); } @@ -1733,180 +1801,54 @@ private static Vector3i getDefaultLocation(EntityPlayer player) { private static final AdaptableUITexture DISPLAY = AdaptableUITexture .of("modularui:gui/background/display", 143, 75, 2); - @SideOnly(Side.CLIENT) - private Row makeCoordinateEditor(EntityPlayer player, int coord, int component) { - IntSupplier getter = () -> { - MMState currState = getState(player.getHeldItem()); + private enum Coord { + Copy, + CopyA, + CopyB, + Paste, + Stack + } - Vector3i l = switch (coord) { - case -1 -> new Vector3i(0); - case 0 -> currState.config.coordA == null ? null : currState.config.coordA.toVec(); - case 1 -> currState.config.coordB == null ? null : currState.config.coordB.toVec(); - case 2 -> currState.config.coordC == null ? null : currState.config.coordC.toVec(); - case 3 -> currState.config.arraySpan; - default -> throw new IllegalArgumentException("coord"); - }; + private enum CoordComponent { + X, + Y, + Z; - if (l == null) { - if (coord == 3) { - l = new Vector3i(0); - } else { - l = getDefaultLocation(player); - } - } + public int get(Vector3ic v) { + return switch (this) { + case X -> v.x(); + case Y -> v.y(); + case Z -> v.z(); + }; + } - return switch (component) { - case 0 -> l.x; - case 1 -> l.y; - case 2 -> l.z; - default -> throw new IllegalArgumentException("component"); + public void set(Vector3i v, int k) { + switch (this) { + case X -> v.x = k; + case Y -> v.y = k; + case Z -> v.z = k; }; - }; + } + } + + @SideOnly(Side.CLIENT) + private Row makeCoordinateEditor(EntityPlayer player, Coord coord, CoordComponent component) { + IntSupplier getter = createGetter(player, coord, component); + IntConsumer setter = createSetter(player, coord, component); + SizeStorage storage = new SizeStorage(player, coord, component); IntSupplier getterVisual = () -> { int k = getter.getAsInt(); - if (coord == 3) { + if (coord == Coord.Stack) { if (k >= 0) k++; } return k; }; - IntConsumer setter = i -> { - MMState currState = getState(player.getHeldItem()); - - Vector3i l = switch (coord) { - case -1 -> new Vector3i(0); - case 0 -> currState.config.coordA == null ? null : currState.config.coordA.toVec(); - case 1 -> currState.config.coordB == null ? null : currState.config.coordB.toVec(); - case 2 -> currState.config.coordC == null ? null : currState.config.coordC.toVec(); - case 3 -> currState.config.arraySpan; - default -> throw new IllegalArgumentException("coord"); - }; - - if (l == null) { - if (coord == 3) { - l = new Vector3i(0); - } else { - l = getDefaultLocation(player); - } - } - - switch (component) { - case 0 -> l.x = i; - case 1 -> l.y = i; - case 2 -> l.z = i; - default -> throw new IllegalArgumentException("component"); - } - - switch (coord) { - case -1 -> { - if (currState.config.coordA != null) { - currState.config.coordA = new Location(player.worldObj, currState.config.coordA.toVec().add(l)); - } - - if (currState.config.coordB != null) { - currState.config.coordB = new Location(player.worldObj, currState.config.coordB.toVec().add(l)); - } - } - case 0 -> currState.config.coordA = new Location(player.worldObj, l); - case 1 -> currState.config.coordB = new Location(player.worldObj, l); - case 2 -> currState.config.coordC = new Location(player.worldObj, l); - case 3 -> currState.config.arraySpan = l; - default -> throw new IllegalArgumentException("coord"); - } - - ItemMatterManipulator.setState(player.getHeldItem(), currState); - - switch (coord) { - case -1 -> { - if (currState.config.coordA != null) { - Messages.SetA.sendToServer(currState.config.coordA.toVec().add(l)); - } - - if (currState.config.coordB != null) { - Messages.SetB.sendToServer(currState.config.coordB.toVec().add(l)); - } - } - case 0 -> { - Messages.SetA.sendToServer(l); - } - case 1 -> { - Messages.SetB.sendToServer(l); - } - case 2 -> { - Messages.SetC.sendToServer(l); - } - case 3 -> { - Messages.SetArray.sendToServer(l); - } - default -> throw new IllegalArgumentException("coord"); - } - }; - - String compName = switch (component) { - case 0 -> "X"; - case 1 -> "Y"; - case 2 -> "Z"; - default -> throw new IllegalArgumentException("component"); - }; - - class SizeStorage { - public int x, y, z; - public boolean present = false; - - public Vector3i get() { - if (!present && GuiScreen.isCtrlKeyDown()) { - MMState currState = getState(player.getHeldItem()); - - Vector3i size; - - if (coord == 2) { - size = currState.config.getPasteVisualDeltas(null, false).size(); - } else { - size = currState.config.getCopyVisualDeltas(null).size(); - } - - x = size.x; - y = size.y; - z = size.z; - present = true; - } - - if (!GuiScreen.isCtrlKeyDown()) { - present = false; - } - - return present ? new Vector3i(x, y, z) : new Vector3i(1); - } - - public int getOffset() { - int offset = 1; - - if (GuiScreen.isShiftKeyDown()) { - offset = 10; - } else if (coord != 3 && GuiScreen.isCtrlKeyDown()) { - Vector3i size = get(); - - offset = switch (component) { - case 0 -> size.x; - case 1 -> size.y; - case 2 -> size.z; - default -> throw new IllegalArgumentException("component"); - }; - } else { - present = false; - } - - return offset; - } - } - - SizeStorage storage = new SizeStorage(); - return new Row().widgets( - new VanillaButtonWidget().setDisplayString(compName + " - 1") + new VanillaButtonWidget().setDisplayString(component.name() + " - 1") .setOnClick( (t, u) -> { int i = getter.getAsInt(); @@ -1918,11 +1860,11 @@ public int getOffset() { .setSynced(false, false) .setSize(40, 18) .setTicker(w -> { - ((VanillaButtonWidget) w).setDisplayString(compName + " - " + storage.getOffset()); + ((VanillaButtonWidget) w).setDisplayString(component.name() + " - " + storage.getOffset()); }), padding(5, 5), new MultiChildWidget() - .addChild(coord != -1 ? ( + .addChild(coord != Coord.Copy ? ( new NumericWidget() .setSynced(false, false) .setIntegerOnly(true) @@ -1949,7 +1891,7 @@ public int getOffset() { )) .setSize(40, 18), padding(5, 5), - new VanillaButtonWidget().setDisplayString(compName + " + 1") + new VanillaButtonWidget().setDisplayString(component.name() + " + 1") .setOnClick( (t, u) -> { int i = getter.getAsInt(); @@ -1961,9 +1903,151 @@ public int getOffset() { .setSynced(false, false) .setSize(40, 18) .setTicker(w -> { - ((VanillaButtonWidget) w).setDisplayString(compName + " + " + storage.getOffset()); + ((VanillaButtonWidget) w).setDisplayString(component.name() + " + " + storage.getOffset()); })); } + + private static @NotNull Vector3i getTransformLocation(EntityPlayer player, Coord coord, MMState currState) { + Vector3i loc = switch (coord) { + case Copy -> new Vector3i(0); + case CopyA -> currState.config.coordA == null ? null : currState.config.coordA.toVec(); + case CopyB -> currState.config.coordB == null ? null : currState.config.coordB.toVec(); + case Paste -> currState.config.coordC == null ? null : currState.config.coordC.toVec(); + case Stack -> currState.config.arraySpan; + }; + + if (loc == null) { + if (coord == Coord.Stack) { + loc = new Vector3i(0); + } else { + loc = getDefaultLocation(player); + } + } + + return loc; + } + + private static @NotNull IntSupplier createGetter(EntityPlayer player, Coord coord, CoordComponent component) { + return () -> { + MMState currState = getState(player.getHeldItem()); + + Vector3i loc = getTransformLocation(player, coord, currState); + + return component.get(loc); + }; + } + + private static @NotNull IntConsumer createSetter(EntityPlayer player, Coord coord, CoordComponent component) { + return i -> { + MMState currState = getState(player.getHeldItem()); + + Vector3i loc = getTransformLocation(player, coord, currState); + + component.set(loc, i); + + switch (coord) { + case Copy -> { + if (currState.config.coordA != null) { + currState.config.coordA = new Location(player.worldObj, currState.config.coordA.toVec().add(loc)); + } + + if (currState.config.coordB != null) { + currState.config.coordB = new Location(player.worldObj, currState.config.coordB.toVec().add(loc)); + } + } + case CopyA -> currState.config.coordA = new Location(player.worldObj, loc); + case CopyB -> currState.config.coordB = new Location(player.worldObj, loc); + case Paste -> currState.config.coordC = new Location(player.worldObj, loc); + case Stack -> currState.config.arraySpan = loc; + } + + ItemMatterManipulator.setState(player.getHeldItem(), currState); + + switch (coord) { + case Copy -> { + if (currState.config.coordA != null) { + Messages.SetA.sendToServer(currState.config.coordA.toVec()); + } + + if (currState.config.coordB != null) { + Messages.SetB.sendToServer(currState.config.coordB.toVec()); + } + } + case CopyA -> { + Messages.SetA.sendToServer(loc); + } + case CopyB -> { + Messages.SetB.sendToServer(loc); + } + case Paste -> { + Messages.SetC.sendToServer(loc); + } + case Stack -> { + Messages.SetArray.sendToServer(loc); + } + } + }; + } + + private static class SizeStorage { + + private final EntityPlayer player; + private final Coord coord; + private final CoordComponent component; + public int x, y, z; + public boolean present; + + SizeStorage(EntityPlayer player, Coord coord, CoordComponent component) { + this.player = player; + this.coord = coord; + this.component = component; + present = false; + } + + public Vector3i get() { + if (!present && GuiScreen.isCtrlKeyDown()) { + MMState currState = getState(player.getHeldItem()); + + Vector3i size; + VoxelAABB deltas; + + if (coord == Coord.Paste) { + deltas = currState.config.getPasteVisualDeltas(null, false); + } else { + deltas = currState.config.getCopyVisualDeltas(null); + } + + size = deltas == null ? new Vector3i(1, 1, 1) : deltas.size(); + + x = size.x; + y = size.y; + z = size.z; + present = true; + } + + if (!GuiScreen.isCtrlKeyDown()) { + present = false; + } + + return present ? new Vector3i(x, y, z) : new Vector3i(1); + } + + public int getOffset() { + int offset = 1; + + if (GuiScreen.isShiftKeyDown()) { + offset = 10; + } else if (coord != Coord.Stack && GuiScreen.isCtrlKeyDown()) { + Vector3i size = get(); + + offset = component.get(size); + } else { + present = false; + } + + return offset; + } + } // spotless:on // #endregion diff --git a/src/main/java/com/recursive_pineapple/matter_manipulator/common/utils/MMUtils.java b/src/main/java/com/recursive_pineapple/matter_manipulator/common/utils/MMUtils.java index 0b3846a..be74904 100644 --- a/src/main/java/com/recursive_pineapple/matter_manipulator/common/utils/MMUtils.java +++ b/src/main/java/com/recursive_pineapple/matter_manipulator/common/utils/MMUtils.java @@ -91,7 +91,10 @@ import appeng.api.parts.IPartItem; import appeng.api.parts.PartItemStack; import appeng.api.storage.ICellWorkbenchItem; +import appeng.api.storage.data.IAEItemStack; +import appeng.api.storage.data.IAEStack; import appeng.parts.automation.UpgradeInventory; +import appeng.tile.inventory.IAEStackInventory; import appeng.util.Platform; import com.google.gson.JsonArray; @@ -790,6 +793,24 @@ public static PortableItemStack[] fromInventoryNoMerge(IInventory inventory) { return out; } + /** + * Doesn't merge stacks and preserves the order of stacks. + * Empty indices will be null. + */ + public static PortableItemStack[] fromInventoryNoMerge(IAEStackInventory inventory) { + PortableItemStack[] out = new PortableItemStack[inventory.getSizeInventory()]; + + for (int i = 0; i < out.length; i++) { + IAEStack stack = inventory.getAEStackInSlot(i); + + if (stack instanceof IAEItemStack itemStack) { + out[i] = new PortableItemStack(itemStack.getItemStack()); + } + } + + return out; + } + /** * Installs upgrades into an AE UpgradeInventory. *