Merge remote-tracking branch 'origin/master' into fabric-1.16

# Conflicts:
#	gradle.properties
#	gradle/wrapper/gradle-wrapper.jar
#	gradle/wrapper/gradle-wrapper.properties
#	src/api/java/appeng/api/features/IWorldGen.java
#	src/api/java/appeng/api/implementations/items/ISpatialStorageCell.java
#	src/api/java/appeng/api/parts/IPart.java
#	src/api/java/appeng/api/storage/ISpatialDimension.java
#	src/api/java/appeng/api/util/DimensionalCoord.java
#	src/datagen/java/appeng/data/providers/IAE2DataProvider.java
#	src/main/java/appeng/block/AEBaseBlockItemChargeable.java
#	src/main/java/appeng/block/misc/ChargerBlock.java
#	src/main/java/appeng/block/misc/QuartzFixtureBlock.java
#	src/main/java/appeng/block/networking/CableBusBlock.java
#	src/main/java/appeng/block/networking/CableBusColor.java
#	src/main/java/appeng/block/networking/ControllerBlock.java
#	src/main/java/appeng/block/networking/WirelessBlock.java
#	src/main/java/appeng/block/paint/PaintSplotchesBakedModel.java
#	src/main/java/appeng/block/paint/PaintSplotchesModel.java
#	src/main/java/appeng/block/qnb/QnbFormedBakedModel.java
#	src/main/java/appeng/block/qnb/QnbFormedModel.java
#	src/main/java/appeng/block/spatial/MatrixFrameBlock.java
#	src/main/java/appeng/block/storage/ChestBlock.java
#	src/main/java/appeng/block/storage/DriveSlotState.java
#	src/main/java/appeng/client/gui/AEBaseMEScreen.java
#	src/main/java/appeng/client/gui/AEBaseScreen.java
#	src/main/java/appeng/client/gui/implementations/AESubScreen.java
#	src/main/java/appeng/client/gui/implementations/CellWorkbenchScreen.java
#	src/main/java/appeng/client/gui/implementations/ChestScreen.java
#	src/main/java/appeng/client/gui/implementations/CondenserScreen.java
#	src/main/java/appeng/client/gui/implementations/CraftAmountScreen.java
#	src/main/java/appeng/client/gui/implementations/CraftConfirmScreen.java
#	src/main/java/appeng/client/gui/implementations/CraftingCPUScreen.java
#	src/main/java/appeng/client/gui/implementations/CraftingStatusScreen.java
#	src/main/java/appeng/client/gui/implementations/CraftingTermScreen.java
#	src/main/java/appeng/client/gui/implementations/DriveScreen.java
#	src/main/java/appeng/client/gui/implementations/FormationPlaneScreen.java
#	src/main/java/appeng/client/gui/implementations/GrinderScreen.java
#	src/main/java/appeng/client/gui/implementations/IOPortScreen.java
#	src/main/java/appeng/client/gui/implementations/InscriberScreen.java
#	src/main/java/appeng/client/gui/implementations/InterfaceScreen.java
#	src/main/java/appeng/client/gui/implementations/InterfaceTerminalScreen.java
#	src/main/java/appeng/client/gui/implementations/LevelEmitterScreen.java
#	src/main/java/appeng/client/gui/implementations/MEMonitorableScreen.java
#	src/main/java/appeng/client/gui/implementations/MolecularAssemblerScreen.java
#	src/main/java/appeng/client/gui/implementations/NetworkStatusScreen.java
#	src/main/java/appeng/client/gui/implementations/NetworkToolScreen.java
#	src/main/java/appeng/client/gui/implementations/NumberEntryWidget.java
#	src/main/java/appeng/client/gui/implementations/PatternTermScreen.java
#	src/main/java/appeng/client/gui/implementations/PriorityScreen.java
#	src/main/java/appeng/client/gui/implementations/QNBScreen.java
#	src/main/java/appeng/client/gui/implementations/QuartzKnifeScreen.java
#	src/main/java/appeng/client/gui/implementations/SecurityStationScreen.java
#	src/main/java/appeng/client/gui/implementations/SkyChestScreen.java
#	src/main/java/appeng/client/gui/implementations/SpatialIOPortScreen.java
#	src/main/java/appeng/client/gui/implementations/StorageBusScreen.java
#	src/main/java/appeng/client/gui/implementations/UpgradeableScreen.java
#	src/main/java/appeng/client/gui/implementations/VibrationChamberScreen.java
#	src/main/java/appeng/client/gui/implementations/WirelessScreen.java
#	src/main/java/appeng/client/gui/widgets/AETextField.java
#	src/main/java/appeng/client/gui/widgets/CustomSlotWidget.java
#	src/main/java/appeng/client/gui/widgets/ITooltip.java
#	src/main/java/appeng/client/gui/widgets/IconButton.java
#	src/main/java/appeng/client/gui/widgets/NumberBox.java
#	src/main/java/appeng/client/gui/widgets/ProgressBar.java
#	src/main/java/appeng/client/gui/widgets/TabButton.java
#	src/main/java/appeng/client/gui/widgets/ToggleButton.java
#	src/main/java/appeng/client/render/ColorableTileBlockColor.java
#	src/main/java/appeng/client/render/DummyFluidDispatcherBakedModel.java
#	src/main/java/appeng/client/render/FacadeItemModel.java
#	src/main/java/appeng/client/render/FacingToRotation.java
#	src/main/java/appeng/client/render/SpatialSkyRender.java
#	src/main/java/appeng/client/render/StackSizeRenderer.java
#	src/main/java/appeng/client/render/StaticBlockColor.java
#	src/main/java/appeng/client/render/TesrRenderHelper.java
#	src/main/java/appeng/client/render/cablebus/CableBuilder.java
#	src/main/java/appeng/client/render/cablebus/CableBusBreakingParticle.java
#	src/main/java/appeng/client/render/cablebus/CableBusModel.java
#	src/main/java/appeng/client/render/cablebus/CableBusRenderState.java
#	src/main/java/appeng/client/render/cablebus/CableCoreType.java
#	src/main/java/appeng/client/render/cablebus/CubeBuilder.java
#	src/main/java/appeng/client/render/cablebus/FacadeBlockAccess.java
#	src/main/java/appeng/client/render/cablebus/FacadeBuilder.java
#	src/main/java/appeng/client/render/cablebus/P2PTunnelFrequencyModel.java
#	src/main/java/appeng/client/render/cablebus/QuadRotator.java
#	src/main/java/appeng/client/render/cablebus/SmartCableTextures.java
#	src/main/java/appeng/client/render/crafting/CraftingCubeModel.java
#	src/main/java/appeng/client/render/crafting/EncodedPatternBakedModel.java
#	src/main/java/appeng/client/render/crafting/EncodedPatternModel.java
#	src/main/java/appeng/client/render/effects/CraftingFx.java
#	src/main/java/appeng/client/render/effects/EnergyFx.java
#	src/main/java/appeng/client/render/effects/LightningArcParticleData.java
#	src/main/java/appeng/client/render/effects/LightningFX.java
#	src/main/java/appeng/client/render/effects/MatterCannonFX.java
#	src/main/java/appeng/client/render/effects/VibrantFX.java
#	src/main/java/appeng/client/render/model/AutoRotatingBakedModel.java
#	src/main/java/appeng/client/render/model/BiometricCardModel.java
#	src/main/java/appeng/client/render/model/ColorApplicatorModel.java
#	src/main/java/appeng/client/render/model/DriveBakedModel.java
#	src/main/java/appeng/client/render/model/DriveModel.java
#	src/main/java/appeng/client/render/model/GlassBakedModel.java
#	src/main/java/appeng/client/render/model/GlassModel.java
#	src/main/java/appeng/client/render/model/MatrixVertexTransformer.java
#	src/main/java/appeng/client/render/model/MemoryCardModel.java
#	src/main/java/appeng/client/render/model/RenderHelper.java
#	src/main/java/appeng/client/render/model/SkyCompassBakedModel.java
#	src/main/java/appeng/client/render/model/SkyCompassModel.java
#	src/main/java/appeng/client/render/renderable/ItemRenderable.java
#	src/main/java/appeng/client/render/spatial/SpatialPylonModel.java
#	src/main/java/appeng/client/render/tesr/CellLedRenderer.java
#	src/main/java/appeng/client/render/tesr/CrankTESR.java
#	src/main/java/appeng/client/render/tesr/DriveLedTileEntityRenderer.java
#	src/main/java/appeng/client/render/tesr/InscriberTESR.java
#	src/main/java/appeng/client/render/tesr/SkyChestTESR.java
#	src/main/java/appeng/container/implementations/PatternTermContainer.java
#	src/main/java/appeng/core/AEConfig.java
#	src/main/java/appeng/core/AppEng.java
#	src/main/java/appeng/core/Registration.java
#	src/main/java/appeng/core/features/registries/MovableTileRegistry.java
#	src/main/java/appeng/core/features/registries/WorldGenRegistry.java
#	src/main/java/appeng/core/localization/GuiText.java
#	src/main/java/appeng/core/sync/BasePacket.java
#	src/main/java/appeng/core/sync/network/NetworkHandler.java
#	src/main/java/appeng/core/sync/network/TargetPoint.java
#	src/main/java/appeng/core/sync/packets/ClickPacket.java
#	src/main/java/appeng/core/sync/packets/ConfigValuePacket.java
#	src/main/java/appeng/core/worlddata/WorldData.java
#	src/main/java/appeng/crafting/CraftingTreeProcess.java
#	src/main/java/appeng/datagen/AE2DataGenerators.java
#	src/main/java/appeng/datagen/providers/IAE2DataProvider.java
#	src/main/java/appeng/datagen/providers/loot/BlockDropProvider.java
#	src/main/java/appeng/datagen/providers/recipes/SlabStairRecipes.java
#	src/main/java/appeng/debug/ChunkLoaderBlockEntity.java
#	src/main/java/appeng/debug/DebugPartPlacerItem.java
#	src/main/java/appeng/debug/ReplicatorCardItem.java
#	src/main/java/appeng/entity/TinyTNTPrimedEntity.java
#	src/main/java/appeng/entity/TinyTNTPrimedRenderer.java
#	src/main/java/appeng/fluids/client/gui/FluidFormationPlaneScreen.java
#	src/main/java/appeng/fluids/client/gui/FluidInterfaceScreen.java
#	src/main/java/appeng/fluids/client/gui/FluidLevelEmitterScreen.java
#	src/main/java/appeng/fluids/client/gui/FluidStorageBusScreen.java
#	src/main/java/appeng/fluids/client/gui/FluidTerminalScreen.java
#	src/main/java/appeng/fluids/client/gui/widgets/FluidSlotWidget.java
#	src/main/java/appeng/fluids/client/gui/widgets/FluidTankWidget.java
#	src/main/java/appeng/fluids/parts/FluidAnnihilationPlanePart.java
#	src/main/java/appeng/fluids/parts/FluidFormationPlanePart.java
#	src/main/java/appeng/fluids/parts/FluidInterfacePart.java
#	src/main/java/appeng/fluids/parts/FluidStorageBusPart.java
#	src/main/java/appeng/fluids/parts/SharedFluidBusPart.java
#	src/main/java/appeng/forge/data/providers/IAE2DataProvider.java
#	src/main/java/appeng/helpers/AEMaterials.java
#	src/main/java/appeng/helpers/CraftingPatternDetails.java
#	src/main/java/appeng/helpers/DualityInterface.java
#	src/main/java/appeng/helpers/Splotch.java
#	src/main/java/appeng/integration/modules/jei/CondenserCategory.java
#	src/main/java/appeng/integration/modules/theoneprobe/part/ChannelInfoProvider.java
#	src/main/java/appeng/integration/modules/theoneprobe/part/P2PStateInfoProvider.java
#	src/main/java/appeng/integration/modules/theoneprobe/part/PowerStateInfoProvider.java
#	src/main/java/appeng/integration/modules/theoneprobe/tile/ChargerInfoProvider.java
#	src/main/java/appeng/integration/modules/theoneprobe/tile/CraftingMonitorInfoProvider.java
#	src/main/java/appeng/integration/modules/theoneprobe/tile/PowerStorageInfoProvider.java
#	src/main/java/appeng/integration/modules/waila/part/PartAccessor.java
#	src/main/java/appeng/integration/modules/waila/part/PartStackWailaDataProvider.java
#	src/main/java/appeng/integration/modules/waila/part/StorageMonitorWailaDataProvider.java
#	src/main/java/appeng/integration/modules/waila/tile/PowerStateWailaDataProvider.java
#	src/main/java/appeng/items/misc/EncodedPatternItem.java
#	src/main/java/appeng/items/parts/FacadeItem.java
#	src/main/java/appeng/items/storage/SpatialStorageCellItem.java
#	src/main/java/appeng/items/tools/BiometricCardItem.java
#	src/main/java/appeng/items/tools/MemoryCardItem.java
#	src/main/java/appeng/items/tools/powered/ColorApplicatorItem.java
#	src/main/java/appeng/items/tools/powered/MatterCannonItem.java
#	src/main/java/appeng/items/tools/quartz/QuartzCuttingKnifeItem.java
#	src/main/java/appeng/items/tools/quartz/QuartzHoeItem.java
#	src/main/java/appeng/me/cluster/MBCalculator.java
#	src/main/java/appeng/me/cluster/implementations/QuantumCluster.java
#	src/main/java/appeng/parts/AEBasePart.java
#	src/main/java/appeng/parts/CableBusContainer.java
#	src/main/java/appeng/parts/ICableBusContainer.java
#	src/main/java/appeng/parts/NullCableBusContainer.java
#	src/main/java/appeng/parts/PartPlacement.java
#	src/main/java/appeng/parts/automation/AnnihilationPlanePart.java
#	src/main/java/appeng/parts/automation/ExportBusPart.java
#	src/main/java/appeng/parts/automation/FormationPlanePart.java
#	src/main/java/appeng/parts/automation/ImportBusPart.java
#	src/main/java/appeng/parts/automation/PlaneModel.java
#	src/main/java/appeng/parts/misc/CableAnchorPart.java
#	src/main/java/appeng/parts/misc/InterfacePart.java
#	src/main/java/appeng/parts/misc/StorageBusPart.java
#	src/main/java/appeng/parts/p2p/P2PTunnelPart.java
#	src/main/java/appeng/parts/reporting/AbstractMonitorPart.java
#	src/main/java/appeng/parts/reporting/AbstractReportingPart.java
#	src/main/java/appeng/parts/reporting/AbstractTerminalPart.java
#	src/main/java/appeng/parts/reporting/ConversionMonitorPart.java
#	src/main/java/appeng/parts/reporting/InterfaceTerminalPart.java
#	src/main/java/appeng/parts/reporting/PatternTerminalPart.java
#	src/main/java/appeng/recipes/handlers/GrinderRecipeSerializer.java
#	src/main/java/appeng/recipes/handlers/InscriberRecipeSerializer.java
#	src/main/java/appeng/server/subcommands/TestMeteoritesCommand.java
#	src/main/java/appeng/server/subcommands/TestOreGenCommand.java
#	src/main/java/appeng/services/CompassService.java
#	src/main/java/appeng/spatial/SpatialDimensionManager.java
#	src/main/java/appeng/spatial/StorageCellDimension.java
#	src/main/java/appeng/thirdparty/codechicken/lib/model/Quad.java
#	src/main/java/appeng/thirdparty/codechicken/lib/model/pipeline/transformers/QuadCornerKicker.java
#	src/main/java/appeng/thirdparty/codechicken/lib/model/pipeline/transformers/QuadMatrixTransformer.java
#	src/main/java/appeng/tile/AEBaseBlockEntity.java
#	src/main/java/appeng/tile/AEBaseInvTileEntity.java
#	src/main/java/appeng/tile/crafting/CraftingBlockEntity.java
#	src/main/java/appeng/tile/crafting/CraftingMonitorBlockEntity.java
#	src/main/java/appeng/tile/crafting/MolecularAssemblerBlockEntity.java
#	src/main/java/appeng/tile/grid/AENetworkBlockEntity.java
#	src/main/java/appeng/tile/grid/AENetworkInvBlockEntity.java
#	src/main/java/appeng/tile/grid/AENetworkPowerBlockEntity.java
#	src/main/java/appeng/tile/misc/CellWorkbenchBlockEntity.java
#	src/main/java/appeng/tile/misc/CondenserBlockEntity.java
#	src/main/java/appeng/tile/misc/InscriberBlockEntity.java
#	src/main/java/appeng/tile/misc/InterfaceBlockEntity.java
#	src/main/java/appeng/tile/misc/PaintSplotchesBlockEntity.java
#	src/main/java/appeng/tile/misc/SecurityStationBlockEntity.java
#	src/main/java/appeng/tile/misc/VibrationChamberBlockEntity.java
#	src/main/java/appeng/tile/networking/CableBusBlockEntity.java
#	src/main/java/appeng/tile/networking/EnergyCellBlockEntity.java
#	src/main/java/appeng/tile/powersink/AEBasePoweredBlockEntity.java
#	src/main/java/appeng/tile/spatial/SpatialIOPortBlockEntity.java
#	src/main/java/appeng/tile/storage/ChestBlockEntity.java
#	src/main/java/appeng/tile/storage/DriveBlockEntity.java
#	src/main/java/appeng/tile/storage/IOPortBlockEntity.java
#	src/main/java/appeng/util/Platform.java
#	src/main/java/appeng/worldgen/ChargedQuartzOreConfig.java
#	src/main/java/appeng/worldgen/ChargedQuartzOreFeature.java
#	src/main/java/appeng/worldgen/meteorite/MeteoriteStructure.java
#	src/main/java/appeng/worldgen/meteorite/MeteoriteStructureStart.java
#	src/main/java/appeng/worldgen/meteorite/debug/MeteoriteSpawner.java
#	src/unported/java/appeng/client/ClientHelper.java
#	src/unported/java/appeng/client/render/DummyFluidItemModel.java
#	src/unported/java/appeng/client/render/model/UVLModelLoader.java
This commit is contained in:
Sebastian Hartte
2020-07-27 19:07:35 +02:00
33 changed files with 967 additions and 236 deletions
@@ -22,10 +22,13 @@
package appeng.client.gui.implementations;
import com.mojang.blaze3d.matrix.MatrixStack;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.text.Text;
import net.minecraft.util.text.StringTextComponent;
import appeng.container.implementations.CraftingStatusContainer;
import appeng.core.localization.GuiText;
@@ -81,7 +84,7 @@ public class CraftingStatusScreen extends CraftingCPUScreen<CraftingStatusContai
btnTextText = GuiText.NoCraftingJobs.text();
}
this.selectCPU.setMessage(btnTextText);
this.selectCPU.setMessage(new StringTextComponent(btnTextText));
}
@Override
@@ -296,12 +296,15 @@ public class MEMonitorableScreen<T extends MEMonitorableContainer> extends AEBas
@Override
public boolean mouseClicked(final double xCoord, final double yCoord, final int btn) {
if (this.searchField.mouseClicked(xCoord, yCoord, btn)) {
if (btn == 1 && this.searchField.isMouseOver(xCoord, yCoord)) {
this.searchField.setText("");
this.repo.setSearchString("");
this.repo.updateView();
this.setScrollBar();
}
return true;
}
// Right-clicking on the search field should clear it
if (this.searchField.isMouseOver(xCoord, yCoord) && btn == 1) {
this.searchField.setText("");
this.repo.setSearchString("");
this.repo.updateView();
this.setScrollBar();
return true;
}
@@ -38,7 +38,7 @@ public class NumberBox extends TextFieldWidget {
final Class<?> type, LongConsumer changeListener) {
super(fontRenderer, x, y, width, height, new LiteralText("0"));
this.setText("0");
setChangedListener(this::onTextChanged);
setChangedListener(this::handleTextChanged);
this.lastValue = 0;
this.changeListener = changeListener;
if (type == int.class || type == Integer.class) {
@@ -48,7 +48,11 @@ public class NumberBox extends TextFieldWidget {
}
}
private void onTextChanged(String text) {
// NOTE: This method MUST NOT BE NAMED like a method in the superclass because
// of a ForgeGradle remapping bug
// since it'll not remap this method's name, but it will remap the name of the
// method reference above.
private void handleTextChanged(String text) {
if (text.isEmpty()) {
setText("0"); // Will call onTextChanged recursively
return;
@@ -273,21 +273,13 @@ public class PatternTermContainer extends MEMonitorableContainer
return new ItemStack[] { out };
}
} else {
final List<ItemStack> list = new ArrayList<>(3);
boolean hasValue = false;
final ItemStack[] list = new ItemStack[3];
for (final OptionalFakeSlot outputSlot : this.outputSlots) {
final ItemStack out = outputSlot.getStack();
if (!out.isEmpty() && out.getCount() > 0) {
list.add(out);
hasValue = true;
}
}
if (hasValue) {
return list.toArray(new ItemStack[list.size()]);
for (int i = 0; i < this.outputSlots.length; i++) {
final ItemStack out = this.outputSlots[i].getStack();
list[i] = out;
}
return list;
}
return null;
+1 -1
View File
@@ -89,7 +89,7 @@ public final class AEConfig {
private boolean useColoredCraftingStatus;
private boolean disableColoredCableRecipesInJEI;
private int craftingCalculationTimePerTick;
private PowerUnits selectedPowerUnit;
private PowerUnits selectedPowerUnit = PowerUnits.AE;
// GUI Buttons
private final int[] craftByStacks = new int[4];
@@ -32,6 +32,14 @@ import net.minecraft.util.Identifier;
public abstract class BasePacket {
/**
* Sadly {@link PacketBuffer#readString()} gets inlined by Proguard which means
* it's not available on the Server. This field has the default string length
* that is used for writeString, which then also should be used for readString
* when it has no special length requirements.
*/
public static final int MAX_STRING_LENGTH = 32767;
// KEEP THIS SHORT. It's serialized as a string!
public static final Identifier CHANNEL = new Identifier("ae2:m");
@@ -45,8 +45,8 @@ public class ConfigValuePacket extends BasePacket {
private final String Value;
public ConfigValuePacket(final PacketByteBuf stream) {
this.Name = stream.readString();
this.Value = stream.readString();
this.Name = stream.readString(MAX_STRING_LENGTH);
this.Value = stream.readString(MAX_STRING_LENGTH);
}
// api
@@ -85,7 +85,7 @@ public class CraftingTreeNode {
}
boolean notRecursive(final ICraftingPatternDetails details) {
IAEItemStack[] o = details.getCondensedOutputs();
Collection<IAEItemStack> o = details.getOutputs();
for (final IAEItemStack i : o) {
if (i.equals(this.what)) {
@@ -93,7 +93,7 @@ public class CraftingTreeNode {
}
}
o = details.getCondensedInputs();
o = details.getInputs();
for (final IAEItemStack i : o) {
if (i.equals(this.what)) {
@@ -62,10 +62,10 @@ public class CraftingTreeProcess {
final World world = job.getWorld();
if (details.isCraftable()) {
final IAEItemStack[] list = details.getInputs();
final IAEItemStack[] list = details.getSparseInputs();
final CraftingInventory ic = new CraftingInventory(new ContainerNull(), 3, 3);
final IAEItemStack[] is = details.getInputs();
final IAEItemStack[] is = details.getSparseInputs();
for (int x = 0; x < ic.size(); x++) {
ic.setStack(x, is[x] == null ? ItemStack.EMPTY : is[x].createItemStack());
}
@@ -81,11 +81,11 @@ public class CraftingTreeProcess {
}
}
for (final IAEItemStack part : details.getCondensedInputs()) {
for (final IAEItemStack part : details.getInputs()) {
final ItemStack g = part.createItemStack();
boolean isAnInput = false;
for (final IAEItemStack a : details.getCondensedOutputs()) {
for (final IAEItemStack a : details.getOutputs()) {
if (!g.isEmpty() && a != null && a.equals(g)) {
isAnInput = true;
}
@@ -113,7 +113,7 @@ public class CraftingTreeProcess {
} else {
// this is minor different then below, this slot uses the pattern, but kinda
// fudges it.
for (final IAEItemStack part : details.getCondensedInputs()) {
for (final IAEItemStack part : details.getInputs()) {
for (int x = 0; x < list.length; x++) {
final IAEItemStack comparePart = list[x];
if (part != null && part.equals(comparePart)) {
@@ -126,11 +126,11 @@ public class CraftingTreeProcess {
}
}
} else {
for (final IAEItemStack part : details.getCondensedInputs()) {
for (final IAEItemStack part : details.getInputs()) {
final ItemStack g = part.createItemStack();
boolean isAnInput = false;
for (final IAEItemStack a : details.getCondensedOutputs()) {
for (final IAEItemStack a : details.getOutputs()) {
if (!g.isEmpty() && a != null && a.equals(g)) {
isAnInput = true;
}
@@ -141,7 +141,7 @@ public class CraftingTreeProcess {
}
}
for (final IAEItemStack part : details.getCondensedInputs()) {
for (final IAEItemStack part : details.getInputs()) {
this.nodes.put(new CraftingTreeNode(cc, job, part.copy(), this, -1, depth + 1), part.getStackSize());
}
}
@@ -208,7 +208,7 @@ public class CraftingTreeProcess {
// assume its possible.
// add crafting results..
for (final IAEItemStack out : this.details.getCondensedOutputs()) {
for (final IAEItemStack out : this.details.getOutputs()) {
final IAEItemStack o = out.copy();
o.setStackSize(o.getStackSize() * i);
inv.injectItems(o, Actionable.MODULATE, src);
@@ -227,7 +227,7 @@ public class CraftingTreeProcess {
}
IAEItemStack getAmountCrafted(IAEItemStack what2) {
for (final IAEItemStack is : this.details.getCondensedOutputs()) {
for (final IAEItemStack is : this.details.getOutputs()) {
if (is.equals(what2)) {
what2 = what2.copy();
what2.setStackSize(is.getStackSize());
@@ -236,7 +236,7 @@ public class CraftingTreeProcess {
}
// more fuzzy!
for (final IAEItemStack is : this.details.getCondensedOutputs()) {
for (final IAEItemStack is : this.details.getOutputs()) {
if (is.getItem() == what2.getItem()
&& (is.getItem().isDamageable() || is.getItemDamage() == what2.getItemDamage())) {
what2 = is.copy();
@@ -263,12 +263,15 @@ public class FluidTerminalScreen extends AEBaseMEScreen<FluidTerminalContainer>
@Override
public boolean mouseClicked(final double xCoord, final double yCoord, final int btn) {
if (this.searchField.mouseClicked(xCoord, yCoord, btn)) {
if (btn == 1 && this.searchField.isMouseOver(xCoord, yCoord)) {
this.searchField.setText("");
this.repo.setSearchString("");
this.repo.updateView();
this.setScrollBar();
}
return true;
}
// Right-clicking on the search field should clear it
if (this.searchField.isMouseOver(xCoord, yCoord) && btn == 1) {
this.searchField.setText("");
this.repo.setSearchString("");
this.repo.updateView();
this.setScrollBar();
return true;
}
@@ -329,4 +332,5 @@ public class FluidTerminalScreen extends AEBaseMEScreen<FluidTerminalContainer>
protected String getBackground() {
return "guis/terminal.png";
}
}
@@ -11,7 +11,7 @@ import net.minecraft.particle.DustParticleEffect;
import net.minecraft.util.Hand;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.World;
import appeng.api.config.RedstoneMode;
@@ -281,7 +281,7 @@ public class FluidLevelEmitterPart extends UpgradeablePart
}
@Override
public boolean onPartActivate(final PlayerEntity player, final Hand hand, final Vec3d pos) {
public boolean onPartActivate(final PlayerEntity player, final Hand hand, final Vector3d pos) {
if (Platform.isServer()) {
ContainerOpener.openContainer(FluidLevelEmitterContainer.TYPE, player, ContainerLocator.forPart(this));
}
@@ -19,13 +19,17 @@
package appeng.helpers;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import net.minecraft.inventory.CraftingInventory;
import net.minecraft.item.Item;
@@ -46,14 +50,21 @@ import appeng.util.Platform;
public class CraftingPatternDetails implements ICraftingPatternDetails, Comparable<CraftingPatternDetails> {
private static final int ALL_INPUT_LIMIT = 9;
private static final int CRAFTING_OUTPUT_LIMIT = 1;
private static final int PROCESSING_OUTPUT_LIMIT = 3;
private static final Comparator<IAEItemStack> COMPARE_BY_STACKSIZE = (left, right) -> Long
.compare(right.getStackSize(), left.getStackSize());
private final CraftingInventory crafting = new CraftingInventory(new ContainerNull(), 3, 3);
private final CraftingInventory testFrame = new CraftingInventory(new ContainerNull(), 3, 3);
private final ItemStack correctOutput;
private final CraftingRecipe standardRecipe;
private final IAEItemStack[] condensedInputs;
private final IAEItemStack[] condensedOutputs;
private final IAEItemStack[] inputs;
private final IAEItemStack[] outputs;
private final List<IAEItemStack> inputs;
private final List<IAEItemStack> outputs;
private final IAEItemStack[] sparseInputs;
private final IAEItemStack[] sparseOutputs;
private final boolean isCraftable;
private final boolean canSubstitute;
private final Set<TestLookup> failCache = new HashSet<>();
@@ -79,7 +90,7 @@ public class CraftingPatternDetails implements ICraftingPatternDetails, Comparab
final List<IAEItemStack> in = new ArrayList<>();
final List<IAEItemStack> out = new ArrayList<>();
for (int x = 0; x < 9; x++) {
for (int x = 0; x < ALL_INPUT_LIMIT; x++) {
final IAEItemStack ais = ingredients.get(x);
final ItemStack gs = ais != null ? ais.createItemStack() : ItemStack.EMPTY;
@@ -109,70 +120,19 @@ public class CraftingPatternDetails implements ICraftingPatternDetails, Comparab
this.standardRecipe = null;
this.correctOutput = ItemStack.EMPTY;
for (int x = 0; x < 3; x++) {
for (int x = 0; x < PROCESSING_OUTPUT_LIMIT; x++) {
final IAEItemStack ais = products.get(x);
final ItemStack gs = ais.createItemStack();
if (!gs.isEmpty()) {
out.add(ais.copy());
}
out.add(ais != null ? ais.copy() : null);
}
}
this.inputs = in.toArray(new IAEItemStack[0]);
this.outputs = out.toArray(new IAEItemStack[0]);
final int outputLength = this.isCraftable ? CRAFTING_OUTPUT_LIMIT : PROCESSING_OUTPUT_LIMIT;
this.sparseInputs = in.toArray(new IAEItemStack[ALL_INPUT_LIMIT]);
this.sparseOutputs = out.toArray(new IAEItemStack[outputLength]);
final Map<IAEItemStack, IAEItemStack> tmpOutputs = new HashMap<>();
for (final IAEItemStack io : this.outputs) {
if (io == null) {
continue;
}
final IAEItemStack g = tmpOutputs.get(io);
if (g == null) {
tmpOutputs.put(io, io.copy());
} else {
g.add(io);
}
}
final Map<IAEItemStack, IAEItemStack> tmpInputs = new HashMap<>();
for (final IAEItemStack io : this.inputs) {
if (io == null) {
continue;
}
final IAEItemStack g = tmpInputs.get(io);
if (g == null) {
tmpInputs.put(io, io.copy());
} else {
g.add(io);
}
}
if (tmpOutputs.isEmpty() || tmpInputs.isEmpty()) {
throw new IllegalStateException("No pattern here!");
}
this.condensedInputs = new IAEItemStack[tmpInputs.size()];
int offset = 0;
for (final IAEItemStack io : tmpInputs.values()) {
this.condensedInputs[offset] = io;
offset++;
}
offset = 0;
this.condensedOutputs = new IAEItemStack[tmpOutputs.size()];
for (final IAEItemStack io : tmpOutputs.values()) {
this.condensedOutputs[offset] = io;
offset++;
}
this.inputs = this.condenseStacks(in);
this.outputs = this.condenseStacks(out);
}
private void markItemAs(final int slotIndex, final ItemStack i, final TestStatus b) {
@@ -213,8 +173,8 @@ public class CraftingPatternDetails implements ICraftingPatternDetails, Comparab
this.testFrame.setStack(slotIndex, i);
// If we cannot substitute, the items must match exactly
if (!canSubstitute && slotIndex < inputs.length) {
if (!inputs[slotIndex].isSameType(i)) {
if (!canSubstitute && slotIndex < sparseInputs.length) {
if (!sparseInputs[slotIndex].isSameType(i)) {
this.markItemAs(slotIndex, i, TestStatus.DECLINE);
return false;
}
@@ -240,25 +200,25 @@ public class CraftingPatternDetails implements ICraftingPatternDetails, Comparab
}
@Override
public IAEItemStack[] getInputs() {
public IAEItemStack[] getSparseInputs() {
return this.sparseInputs;
}
@Override
public List<IAEItemStack> getInputs() {
return this.inputs;
}
@Override
public IAEItemStack[] getCondensedInputs() {
return this.condensedInputs;
}
@Override
public IAEItemStack[] getCondensedOutputs() {
return this.condensedOutputs;
}
@Override
public IAEItemStack[] getOutputs() {
public List<IAEItemStack> getOutputs() {
return this.outputs;
}
@Override
public IAEItemStack[] getSparseOutputs() {
return this.sparseOutputs;
}
@Override
public boolean canSubstitute() {
return this.canSubstitute;
@@ -276,8 +236,8 @@ public class CraftingPatternDetails implements ICraftingPatternDetails, Comparab
}
}
if (this.outputs != null && this.outputs.length > 0) {
return this.outputs[0].createItemStack();
if (this.sparseOutputs != null && this.sparseOutputs.length > 0) {
return this.sparseOutputs[0].createItemStack();
}
return ItemStack.EMPTY;
@@ -344,6 +304,29 @@ public class CraftingPatternDetails implements ICraftingPatternDetails, Comparab
return false;
}
/**
* Merges all equal entries into a single one while adding their total stack
* sizes.
*
* @throws IllegalStateException if the result would be empty.
*
* @param collection the collection to condense
*
* @return a non empty list of condensed stacks.
*/
private List<IAEItemStack> condenseStacks(Collection<IAEItemStack> collection) {
final List<IAEItemStack> merged = collection.stream().filter(Objects::nonNull)
.collect(Collectors.toMap(Function.identity(), IAEItemStack::copy,
(left, right) -> left.setStackSize(left.getStackSize() + right.getStackSize())))
.values().stream().sorted(COMPARE_BY_STACKSIZE).collect(ImmutableList.toImmutableList());
if (merged.isEmpty()) {
throw new IllegalStateException("No pattern here!");
}
return merged;
}
private enum TestStatus {
ACCEPT, DECLINE, TEST
}
@@ -19,6 +19,7 @@
package appeng.items.misc;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.WeakHashMap;
@@ -152,8 +153,8 @@ public class EncodedPatternItem extends AEBaseItem implements AEToolItem {
final boolean isCrafting = details.isCraftable();
final boolean substitute = details.canSubstitute();
final IAEItemStack[] in = details.getCondensedInputs();
final IAEItemStack[] out = details.getCondensedOutputs();
final Collection<IAEItemStack> in = details.getInputs();
final Collection<IAEItemStack> out = details.getOutputs();
final Text label = (isCrafting ? GuiText.Crafts.text() : GuiText.Creates.text())
.copy().append(": ");
@@ -200,7 +201,7 @@ public class EncodedPatternItem extends AEBaseItem implements AEToolItem {
final ICraftingPatternDetails details = Api.instance().crafting().decodePattern(item, w);
out = details != null ? details.getOutputs()[0].createItemStack() : ItemStack.EMPTY;
out = details != null ? details.getOutputs().get(0).createItemStack() : ItemStack.EMPTY;
SIMPLE_CACHE.put(item, out);
return out;
@@ -218,7 +219,9 @@ public class EncodedPatternItem extends AEBaseItem implements AEToolItem {
final CompoundTag tag = itemStack.getTag();
Preconditions.checkArgument(tag != null, "itemStack missing a NBT tag");
return new Identifier(tag.getString(NBT_RECIPE_ID));
return tag.contains(NBT_RECIPE_ID, Constants.NBT.TAG_STRING)
? new Identifier(tag.getString(NBT_RECIPE_ID))
: null;
}
public List<IAEItemStack> getIngredients(ItemStack itemStack) {
@@ -271,7 +274,7 @@ public class EncodedPatternItem extends AEBaseItem implements AEToolItem {
Preconditions.checkArgument(tag != null, "itemStack missing a NBT tag");
return getCraftingRecipeId(itemStack) == null && tag.getBoolean(NBT_SUBSITUTE);
return getCraftingRecipeId(itemStack) != null && tag.getBoolean(NBT_SUBSITUTE);
}
/**
@@ -18,7 +18,12 @@
package appeng.me.cluster.implementations;
import java.util.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.google.common.collect.ImmutableList;
@@ -36,9 +41,15 @@ import appeng.api.config.FuzzyMode;
import appeng.api.config.PowerMultiplier;
import appeng.api.crafting.ICraftingHelper;
import appeng.api.networking.IGrid;
import appeng.api.networking.IGridHost;
import appeng.api.networking.IGridNode;
import appeng.api.networking.crafting.*;
import appeng.api.networking.crafting.CraftingItemList;
import appeng.api.networking.crafting.ICraftingCPU;
import appeng.api.networking.crafting.ICraftingGrid;
import appeng.api.networking.crafting.ICraftingJob;
import appeng.api.networking.crafting.ICraftingLink;
import appeng.api.networking.crafting.ICraftingMedium;
import appeng.api.networking.crafting.ICraftingPatternDetails;
import appeng.api.networking.crafting.ICraftingRequester;
import appeng.api.networking.energy.IEnergyGrid;
import appeng.api.networking.events.MENetworkCraftingCpuChange;
import appeng.api.networking.security.IActionSource;
@@ -51,7 +62,11 @@ import appeng.api.storage.data.IItemList;
import appeng.container.ContainerNull;
import appeng.core.AELog;
import appeng.core.Api;
import appeng.crafting.*;
import appeng.crafting.CraftBranchFailure;
import appeng.crafting.CraftingJob;
import appeng.crafting.CraftingLink;
import appeng.crafting.CraftingWatcher;
import appeng.crafting.MECraftingInventory;
import appeng.me.cache.CraftingGridCache;
import appeng.me.cluster.IAECluster;
import appeng.me.cluster.MBCalculator;
@@ -427,7 +442,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU {
return null;
}
private boolean canCraft(final ICraftingPatternDetails details, final IAEItemStack[] condensedInputs) {
private boolean canCraft(final ICraftingPatternDetails details, final Collection<IAEItemStack> condensedInputs) {
for (IAEItemStack g : condensedInputs) {
if (details.isCraftable()) {
@@ -555,7 +570,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU {
final ICraftingPatternDetails details = e.getKey();
if (this.canCraft(details, details.getCondensedInputs())) {
if (this.canCraft(details, details.getInputs())) {
CraftingInventory ic = null;
for (final ICraftingMedium m : cc.getMediums(e.getKey())) {
@@ -565,7 +580,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU {
if (!m.isBusy()) {
if (ic == null) {
final IAEItemStack[] input = details.getInputs();
final IAEItemStack[] input = details.getSparseInputs();
double sum = 0;
for (final IAEItemStack anInput : input) {
@@ -661,7 +676,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU {
this.somethingChanged = true;
this.remainingOperations--;
for (final IAEItemStack out : details.getCondensedOutputs()) {
for (final IAEItemStack out : details.getOutputs()) {
this.postChange(out, this.machineSrc);
this.waitingFor.add(out.copy());
this.postCraftingStatusChange(out.copy());
@@ -894,7 +909,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU {
break;
case PENDING:
for (final Entry<ICraftingPatternDetails, TaskProgress> t : this.tasks.entrySet()) {
for (IAEItemStack ais : t.getKey().getCondensedOutputs()) {
for (IAEItemStack ais : t.getKey().getOutputs()) {
ais = ais.copy();
ais.setStackSize(ais.getStackSize() * t.getValue().value);
list.add(ais);
@@ -913,7 +928,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU {
}
for (final Entry<ICraftingPatternDetails, TaskProgress> t : this.tasks.entrySet()) {
for (IAEItemStack ais : t.getKey().getCondensedOutputs()) {
for (IAEItemStack ais : t.getKey().getOutputs()) {
ais = ais.copy();
ais.setStackSize(ais.getStackSize() * t.getValue().value);
list.add(ais);
@@ -958,7 +973,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU {
is.setStackSize(0);
for (final Entry<ICraftingPatternDetails, TaskProgress> t : this.tasks.entrySet()) {
for (final IAEItemStack ais : t.getKey().getCondensedOutputs()) {
for (final IAEItemStack ais : t.getKey().getOutputs()) {
if (ais.equals(is)) {
is.setStackSize(is.getStackSize() + ais.getStackSize() * t.getValue().value);
}
@@ -31,7 +31,7 @@ import net.minecraft.block.entity.BlockEntity;
import net.minecraft.util.Hand;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.World;
import appeng.api.config.FuzzyMode;
@@ -402,7 +402,7 @@ public class LevelEmitterPart extends UpgradeablePart implements IEnergyWatcherH
}
@Override
public boolean onPartActivate(final PlayerEntity player, final Hand hand, final Vec3d pos) {
public boolean onPartActivate(final PlayerEntity player, final Hand hand, final Vector3d pos) {
if (Platform.isServer()) {
ContainerOpener.openContainer(LevelEmitterContainer.TYPE, player, ContainerLocator.forPart(this));
}
@@ -28,7 +28,7 @@ import net.minecraft.block.entity.BlockEntity;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.BlockView;
import net.minecraft.world.World;
@@ -171,7 +171,7 @@ public abstract class AbstractReportingPart extends AEBasePart implements IMonit
}
@Override
public boolean onPartActivate(final PlayerEntity player, final Hand hand, final Vec3d pos) {
public boolean onPartActivate(final PlayerEntity player, final Hand hand, final Vector3d pos) {
final BlockEntity te = this.getTile();
if (Platform.isWrench(player, player.inventory.getMainHandStack(), te.getPos())) {
@@ -26,7 +26,7 @@ import net.minecraft.screen.ScreenHandlerType;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.util.Hand;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.vector.Vector3d;
import appeng.api.config.Settings;
import appeng.api.config.SortDir;
@@ -104,7 +104,7 @@ public abstract class AbstractTerminalPart extends AbstractDisplayPart
}
@Override
public boolean onPartActivate(final PlayerEntity player, final Hand hand, final Vec3d pos) {
public boolean onPartActivate(final PlayerEntity player, final Hand hand, final Vector3d pos) {
if (!super.onPartActivate(player, hand, pos)) {
if (!player.world.isClient) {
ContainerOpener.openContainer(getContainerType(player), player, ContainerLocator.forPart(this));
@@ -111,13 +111,13 @@ public class PatternTerminalPart extends AbstractTerminalPart {
this.setCraftingRecipe(details.isCraftable());
this.setSubstitution(details.canSubstitute());
for (int x = 0; x < this.crafting.getSlotCount() && x < details.getInputs().length; x++) {
final IAEItemStack item = details.getInputs()[x];
for (int x = 0; x < this.crafting.getSlotCount() && x < details.getSparseInputs().length; x++) {
final IAEItemStack item = details.getSparseInputs()[x];
this.crafting.forceSetInvStack(x, item == null ? ItemStack.EMPTY : item.createItemStack());
}
for (int x = 0; x < this.output.getSlotCount() && x < details.getOutputs().length; x++) {
final IAEItemStack item = details.getOutputs()[x];
for (int x = 0; x < this.output.getSlotCount() && x < details.getSparseOutputs().length; x++) {
final IAEItemStack item = details.getSparseOutputs()[x];
this.output.forceSetInvStack(x, item == null ? ItemStack.EMPTY : item.createItemStack());
}
}
@@ -19,6 +19,7 @@ import net.minecraft.util.Identifier;
import net.minecraft.util.JsonHelper;
import appeng.core.AEConfig;
import appeng.core.sync.BasePacket;
public class GrinderRecipeSerializer implements RecipeSerializer<GrinderRecipe> {
@@ -63,7 +64,7 @@ public class GrinderRecipeSerializer implements RecipeSerializer<GrinderRecipe>
@Override
public GrinderRecipe read(Identifier recipeId, PacketByteBuf buffer) {
String group = buffer.readString();
String group = buffer.readString(BasePacket.MAX_STRING_LENGTH);
Ingredient ingredient = Ingredient.fromPacket(buffer);
int ingredientCount = buffer.readVarInt();
ItemStack result = buffer.readItemStack();
@@ -13,6 +13,7 @@ import net.minecraft.util.Identifier;
import net.minecraft.util.JsonHelper;
import appeng.api.features.InscriberProcessType;
import appeng.core.sync.BasePacket;
public class InscriberRecipeSerializer implements RecipeSerializer<InscriberRecipe> {
@@ -60,7 +61,7 @@ public class InscriberRecipeSerializer implements RecipeSerializer<InscriberReci
@Nullable
@Override
public InscriberRecipe read(Identifier recipeId, PacketByteBuf buffer) {
String group = buffer.readString();
String group = buffer.readString(BasePacket.MAX_STRING_LENGTH);
Ingredient middle = Ingredient.fromPacket(buffer);
ItemStack result = buffer.readItemStack();
Ingredient top = Ingredient.fromPacket(buffer);
@@ -61,6 +61,7 @@ import appeng.api.util.DimensionalCoord;
import appeng.block.storage.DriveSlotsState;
import appeng.container.implementations.DriveContainer;
import appeng.core.Api;
import appeng.core.sync.BasePacket;
import appeng.helpers.IPriorityHost;
import appeng.me.GridAccessException;
import appeng.me.helpers.MachineSource;
@@ -183,7 +184,7 @@ public class DriveBlockEntity extends AENetworkInvBlockEntity implements IChestO
int uniqueIdCount = data.readByte();
int[] uniqueIds = new int[uniqueIdCount];
for (int i = 0; i < uniqueIdCount; i++) {
uniqueIds[i] = data.readVarInt();
uniqueIds[i] = data.readVarInt(BasePacket.MAX_STRING_LENGTH);
}
boolean changed = false;
+6 -6
View File
@@ -18,23 +18,23 @@
package appeng.util;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.vector.Vector3d;
public class LookDirection {
private final Vec3d a;
private final Vec3d b;
private final Vector3d a;
private final Vector3d b;
public LookDirection(final Vec3d a, final Vec3d b) {
public LookDirection(final Vector3d a, final Vector3d b) {
this.a = a;
this.b = b;
}
public Vec3d getA() {
public Vector3d getA() {
return this.a;
}
public Vec3d getB() {
public Vector3d getB() {
return this.b;
}
}