Files
Applied-Energistics-2/src/main/java/appeng/helpers/MultiCraftingTracker.java
T
Sebastian Hartte 1e20cd8c08 Merge remote-tracking branch 'origin/master' into fabric-1.16
# Conflicts:
#	build.gradle
#	gradle.properties
#	src/api/java/appeng/api/config/Upgrades.java
#	src/api/java/appeng/api/recipes/ResolverResult.java
#	src/main/java/appeng/block/AEBaseBlockItemChargeable.java
#	src/main/java/appeng/block/crafting/CraftingStorageItem.java
#	src/main/java/appeng/block/misc/ChargerBlock.java
#	src/main/java/appeng/block/networking/CableBusBlock.java
#	src/main/java/appeng/block/storage/ChestBlock.java
#	src/main/java/appeng/block/storage/DriveSlotCellType.java
#	src/main/java/appeng/capabilities/Capabilities.java
#	src/main/java/appeng/client/me/ItemRepo.java
#	src/main/java/appeng/client/render/cablebus/FacadeBuilder.java
#	src/main/java/appeng/client/render/effects/ChargedOreFX.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/LightningArcFX.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/spatial/SpatialPylonRendering.java
#	src/main/java/appeng/client/render/tesr/DriveLedTileEntityRenderer.java
#	src/main/java/appeng/container/AEBaseContainer.java
#	src/main/java/appeng/container/implementations/CellWorkbenchContainer.java
#	src/main/java/appeng/container/implementations/MolecularAssemblerContainer.java
#	src/main/java/appeng/container/implementations/PatternTermContainer.java
#	src/main/java/appeng/container/implementations/QuartzKnifeContainer.java
#	src/main/java/appeng/core/AEConfig.java
#	src/main/java/appeng/core/AEItemGroup.java
#	src/main/java/appeng/core/Api.java
#	src/main/java/appeng/core/AppEng.java
#	src/main/java/appeng/core/Registration.java
#	src/main/java/appeng/core/api/definitions/ApiBlocks.java
#	src/main/java/appeng/core/api/definitions/ApiParts.java
#	src/main/java/appeng/core/features/registries/MovableTileRegistry.java
#	src/main/java/appeng/core/features/registries/P2PTunnelRegistry.java
#	src/main/java/appeng/core/features/registries/WirelessRegistry.java
#	src/main/java/appeng/core/features/registries/WorldGenRegistry.java
#	src/main/java/appeng/core/features/registries/cell/BasicItemCellGuiHandler.java
#	src/main/java/appeng/core/sync/BasePacketHandler.java
#	src/main/java/appeng/core/sync/packets/ClickPacket.java
#	src/main/java/appeng/core/sync/packets/PatternSlotPacket.java
#	src/main/java/appeng/crafting/CraftingTreeProcess.java
#	src/main/java/appeng/debug/ReplicatorCardItem.java
#	src/main/java/appeng/entity/ChargedQuartzEntity.java
#	src/main/java/appeng/entity/SingularityEntity.java
#	src/main/java/appeng/entity/TinyTNTPrimedEntity.java
#	src/main/java/appeng/fluids/helper/DualityFluidInterface.java
#	src/main/java/appeng/fluids/helper/FluidCellConfig.java
#	src/main/java/appeng/fluids/parts/FluidFormationPlanePart.java
#	src/main/java/appeng/fluids/parts/FluidHandlerAdapter.java
#	src/main/java/appeng/forge/data/providers/IAE2DataProvider.java
#	src/main/java/appeng/forge/data/providers/recipes/SlabStairRecipes.java
#	src/main/java/appeng/helpers/CraftingPatternDetails.java
#	src/main/java/appeng/helpers/DualityInterface.java
#	src/main/java/appeng/helpers/WirelessTerminalGuiObject.java
#	src/main/java/appeng/hooks/IBlockTool.java
#	src/main/java/appeng/hooks/TickHandler.java
#	src/main/java/appeng/integration/modules/jei/CondenserCategory.java
#	src/main/java/appeng/integration/modules/jei/JEIPlugin.java
#	src/main/java/appeng/items/misc/EncodedPatternItem.java
#	src/main/java/appeng/items/parts/FacadeItem.java
#	src/main/java/appeng/items/parts/PartItem.java
#	src/main/java/appeng/items/storage/AbstractStorageCell.java
#	src/main/java/appeng/items/storage/CreativeStorageCellItem.java
#	src/main/java/appeng/items/tools/powered/ColorApplicatorItem.java
#	src/main/java/appeng/items/tools/powered/EntropyManipulatorItem.java
#	src/main/java/appeng/items/tools/powered/MatterCannonItem.java
#	src/main/java/appeng/items/tools/powered/WirelessTerminalItem.java
#	src/main/java/appeng/me/cluster/implementations/CraftingCPUCluster.java
#	src/main/java/appeng/me/storage/MEMonitorIFluidHandler.java
#	src/main/java/appeng/parts/PartPlacement.java
#	src/main/java/appeng/parts/automation/FormationPlanePart.java
#	src/main/java/appeng/parts/p2p/FluidP2PTunnelPart.java
#	src/main/java/appeng/parts/reporting/PatternTerminalPart.java
#	src/main/java/appeng/spatial/CachedPlane.java
#	src/main/java/appeng/spatial/StorageChunkGenerator.java
#	src/main/java/appeng/spatial/StorageHelper.java
#	src/main/java/appeng/tile/crafting/CraftingBlockEntity.java
#	src/main/java/appeng/tile/crafting/CraftingStorageBlockEntity.java
#	src/main/java/appeng/tile/crafting/MolecularAssemblerBlockEntity.java
#	src/main/java/appeng/tile/inventory/AppEngInternalAEInventory.java
#	src/main/java/appeng/tile/misc/ChargerBlockEntity.java
#	src/main/java/appeng/tile/misc/CondenserBlockEntity.java
#	src/main/java/appeng/tile/misc/InscriberBlockEntity.java
#	src/main/java/appeng/tile/misc/InscriberRecipes.java
#	src/main/java/appeng/tile/qnb/QuantumBridgeBlockEntity.java
#	src/main/java/appeng/tile/storage/ChestBlockEntity.java
#	src/main/java/appeng/tile/storage/DriveBlockEntity.java
#	src/main/java/appeng/util/Platform.java
#	src/main/java/team/chisel/ctm/api/IFacade.java
#	src/main/resources/assets/appliedenergistics2/models/block/chest/base.json
#	src/unported/java/appeng/client/render/FacadeItemModel.java
#	src/unported/java/appeng/client/render/model/DriveBakedModel.java
#	src/unported/java/appeng/client/render/model/DriveModel.java
#	src/unported/java/appeng/core/PluginLoader.java
2020-07-18 01:45:43 +02:00

233 lines
6.7 KiB
Java

/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
*
* Applied Energistics 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Applied Energistics 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
package appeng.helpers;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import com.google.common.collect.ImmutableSet;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.World;
import appeng.api.networking.IGrid;
import appeng.api.networking.crafting.ICraftingGrid;
import appeng.api.networking.crafting.ICraftingJob;
import appeng.api.networking.crafting.ICraftingLink;
import appeng.api.networking.crafting.ICraftingRequester;
import appeng.api.networking.security.IActionSource;
import appeng.api.storage.data.IAEItemStack;
import appeng.core.Api;
import appeng.util.InventoryAdaptor;
public class MultiCraftingTracker {
private final int size;
private final ICraftingRequester owner;
private Future<ICraftingJob>[] jobs = null;
private ICraftingLink[] links = null;
public MultiCraftingTracker(final ICraftingRequester o, final int size) {
this.owner = o;
this.size = size;
}
public void readFromNBT(final CompoundTag extra) {
for (int x = 0; x < this.size; x++) {
final CompoundTag link = extra.getCompound("links-" + x);
if (link != null && !link.isEmpty()) {
this.setLink(x, Api.instance().storage().loadCraftingLink(link, this.owner));
}
}
}
public void writeToNBT(final CompoundTag extra) {
for (int x = 0; x < this.size; x++) {
final ICraftingLink link = this.getLink(x);
if (link != null) {
final CompoundTag ln = new CompoundTag();
link.writeToNBT(ln);
extra.put("links-" + x, ln);
}
}
}
public boolean handleCrafting(final int x, final long itemToCraft, final IAEItemStack ais, final InventoryAdaptor d,
final World w, final IGrid g, final ICraftingGrid cg, final IActionSource mySrc) {
if (ais != null && d.simulateAdd(ais.createItemStack()).isEmpty()) {
final Future<ICraftingJob> craftingJob = this.getJob(x);
if (this.getLink(x) != null) {
return false;
} else if (craftingJob != null) {
try {
ICraftingJob job = null;
if (craftingJob.isDone()) {
job = craftingJob.get();
}
if (job != null) {
final ICraftingLink link = cg.submitJob(job, this.owner, null, false, mySrc);
this.setJob(x, null);
if (link != null) {
this.setLink(x, link);
return true;
}
}
} catch (final InterruptedException e) {
// :P
} catch (final ExecutionException e) {
// :P
}
} else {
if (this.getLink(x) == null) {
final IAEItemStack aisC = ais.copy();
aisC.setStackSize(itemToCraft);
this.setJob(x, cg.beginCraftingJob(w, g, mySrc, aisC, null));
}
}
}
return false;
}
public ImmutableSet<ICraftingLink> getRequestedJobs() {
if (this.links == null) {
return ImmutableSet.of();
}
return ImmutableSet.copyOf(new NonNullArrayIterator<>(this.links));
}
public void jobStateChange(final ICraftingLink link) {
if (this.links != null) {
for (int x = 0; x < this.links.length; x++) {
if (this.links[x] == link) {
this.setLink(x, null);
return;
}
}
}
}
int getSlot(final ICraftingLink link) {
if (this.links != null) {
for (int x = 0; x < this.links.length; x++) {
if (this.links[x] == link) {
return x;
}
}
}
return -1;
}
void cancel() {
if (this.links != null) {
for (final ICraftingLink l : this.links) {
if (l != null) {
l.cancel();
}
}
this.links = null;
}
if (this.jobs != null) {
for (final Future<ICraftingJob> l : this.jobs) {
if (l != null) {
l.cancel(true);
}
}
this.jobs = null;
}
}
boolean isBusy(final int slot) {
return this.getLink(slot) != null || this.getJob(slot) != null;
}
private ICraftingLink getLink(final int slot) {
if (this.links == null) {
return null;
}
return this.links[slot];
}
private void setLink(final int slot, final ICraftingLink l) {
if (this.links == null) {
this.links = new ICraftingLink[this.size];
}
this.links[slot] = l;
boolean hasStuff = false;
for (int x = 0; x < this.links.length; x++) {
final ICraftingLink g = this.links[x];
if (g == null || g.isCanceled() || g.isDone()) {
this.links[x] = null;
} else {
hasStuff = true;
}
}
if (!hasStuff) {
this.links = null;
}
}
private Future<ICraftingJob> getJob(final int slot) {
if (this.jobs == null) {
return null;
}
return this.jobs[slot];
}
private void setJob(final int slot, final Future<ICraftingJob> l) {
if (this.jobs == null) {
this.jobs = new Future[this.size];
}
this.jobs[slot] = l;
boolean hasStuff = false;
for (final Future<ICraftingJob> job : this.jobs) {
if (job != null) {
hasStuff = true;
}
}
if (!hasStuff) {
this.jobs = null;
}
}
}