aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/multitileentity/multiblock/base
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/api/multitileentity/multiblock/base')
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/ComplexParallelController.java198
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java2013
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java688
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/PowerController.java92
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/StackableController.java43
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/StackableModularController.java77
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/WallShareablePart.java32
7 files changed, 844 insertions, 2299 deletions
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/ComplexParallelController.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/ComplexParallelController.java
index 808c16a200..cdcb77d6e5 100644
--- a/src/main/java/gregtech/api/multitileentity/multiblock/base/ComplexParallelController.java
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/ComplexParallelController.java
@@ -2,7 +2,8 @@ package gregtech.api.multitileentity.multiblock.base;
import java.util.ArrayList;
import java.util.List;
-import java.util.stream.LongStream;
+
+import javax.annotation.Nonnull;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
@@ -12,206 +13,58 @@ import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
-import net.minecraftforge.fluids.FluidStack;
-import gregtech.api.enums.GT_Values;
import gregtech.api.logic.ComplexParallelProcessingLogic;
-import gregtech.api.logic.interfaces.PollutionLogicHost;
import gregtech.api.util.GT_Utility;
import gregtech.api.util.GT_Waila;
import mcp.mobius.waila.api.IWailaConfigHandler;
import mcp.mobius.waila.api.IWailaDataAccessor;
-public abstract class ComplexParallelController<T extends ComplexParallelController<T>> extends PowerController<T> {
+public abstract class ComplexParallelController<C extends ComplexParallelController<C, P>, P extends ComplexParallelProcessingLogic<P>>
+ extends Controller<C, P> {
- protected ComplexParallelProcessingLogic processingLogic;
protected int maxComplexParallels = 0;
protected int currentComplexParallels = 0;
- protected long[] maxProgressTimes = new long[0];
- protected long[] progressTimes = new long[0];
public ComplexParallelController() {
isSimpleMachine = false;
}
- protected void setMaxComplexParallels(int parallel) {
- if (parallel != maxComplexParallels) {
- if (maxComplexParallels != 0) {
- stopMachine(false);
- }
- maxProgressTimes = new long[parallel];
- progressTimes = new long[parallel];
+ protected void setMaxComplexParallels(int parallel, boolean stopMachine) {
+ if (parallel != maxComplexParallels && maxComplexParallels != 0 && stopMachine) {
+ stopMachine(false);
}
maxComplexParallels = parallel;
- }
-
- @Override
- protected void runMachine(long tick) {
- if (acceptsFuel() && isActive()) {
- if (!consumeFuel()) {
- stopMachine(true);
- return;
- }
- }
-
- if (hasThingsToDo()) {
- markDirty();
- runningTick(tick);
- }
- if ((tick % TICKS_BETWEEN_RECIPE_CHECKS == 0 || hasWorkJustBeenEnabled() || hasInventoryBeenModified())
- && maxComplexParallels != currentComplexParallels) {
- if (isAllowedToWork() && maxComplexParallels > currentComplexParallels) {
- wasEnabled = false;
- boolean started = false;
- for (int i = 0; i < maxComplexParallels; i++) {
- if (maxProgressTimes[i] <= 0 && checkRecipe(i)) {
- currentComplexParallels++;
- started = true;
- }
- }
- if (started) {
- setActive(true);
- updateSlots();
- markDirty();
- issueClientUpdate();
- }
- }
- }
- }
-
- @Override
- protected void runningTick(long tick) {
- consumeEnergy();
- boolean allStopped = true;
- for (int i = 0; i < maxComplexParallels; i++) {
- if (maxProgressTimes[i] > 0 && ++progressTimes[i] >= maxProgressTimes[i]) {
- progressTimes[i] = 0;
- maxProgressTimes[i] = 0;
- outputItems(i);
- outputFluids(i);
- if (isAllowedToWork()) {
- if (checkRecipe(i)) {
- allStopped = false;
- } else {
- currentComplexParallels--;
- }
- }
- updateSlots();
- } else if (maxProgressTimes[i] > 0) {
- allStopped = false;
- }
- }
- if (allStopped) {
- setActive(false);
- issueClientUpdate();
- }
-
- if (this instanceof PollutionLogicHost && tick % POLLUTION_TICK == 0) {
- doPollution();
- }
- emitEnergy();
- }
-
- protected boolean checkRecipe(int index) {
- ComplexParallelProcessingLogic processingLogic = getComplexProcessingLogic();
- if (processingLogic == null || index < 0 || index >= maxComplexParallels) {
- return false;
- }
- processingLogic.clear(index);
- boolean result = processingLogic.setInputItems(index, getInputItems(index))
- .setInputFluids(index, getInputFluids(index))
- .setTileEntity(this)
- .setVoidProtection(index, isVoidProtectionEnabledForItem(index), isVoidProtectionEnabledForFluid(index))
- .setEut(index, getEutForComplexParallel(index))
- .setPerfectOverclock(hasPerfectOverclock())
- .process(index);
- setDuration(index, processingLogic.getDuration(index));
- setEut(processingLogic.getTotalEU());
- return result;
- }
-
- protected void outputItems(int index) {
- ComplexParallelProcessingLogic processingLogic = getComplexProcessingLogic();
- if (processingLogic != null && index >= 0 && index < maxComplexParallels) {
- outputItems(processingLogic.getOutputItems(index));
- }
- }
-
- protected void outputFluids(int index) {
- ComplexParallelProcessingLogic processingLogic = getComplexProcessingLogic();
- if (processingLogic != null && index >= 0 && index < maxComplexParallels) {
- outputFluids(processingLogic.getOutputFluids(index));
- }
- }
-
- protected ComplexParallelProcessingLogic getComplexProcessingLogic() {
- return processingLogic;
- }
-
- @Override
- public boolean hasThingsToDo() {
- return LongStream.of(maxProgressTimes)
- .sum() > 0;
+ setProcessingUpdate(true);
}
@Override
protected void stopMachine(boolean powerShutDown) {
super.stopMachine(powerShutDown);
- for (int i = 0; i < maxComplexParallels; i++) {
- maxProgressTimes[i] = 0;
- }
- }
-
- protected void setDuration(int index, long duration) {
- if (duration < 0) {
- duration = -duration;
- }
- if (index >= 0 && index < maxComplexParallels) {
- maxProgressTimes[index] = duration;
- }
- }
-
- protected ItemStack[] getInputItems(int index) {
- return getInputItems();
- }
-
- protected FluidStack[] getInputFluids(int index) {
- return getInputFluids();
- }
-
- protected boolean isVoidProtectionEnabledForItem(int index) {
- return protectsExcessItem();
- }
-
- protected boolean isVoidProtectionEnabledForFluid(int index) {
- return protectsExcessFluid();
}
protected boolean hasPerfectOverclock() {
return false;
}
- protected long getEutForComplexParallel(int index) {
- // As default behavior we'll give the parallel all remaining EU we have
- return GT_Values.V[tier] - eut;
- }
-
@Override
protected void addProgressStringToScanner(EntityPlayer player, int logLevel, ArrayList<String> list) {
+ P processing = getProcessingLogic();
for (int i = 0; i < maxComplexParallels; i++) {
list.add(
StatCollector.translateToLocal("GT5U.multiblock.Progress") + " "
+ (i + 1)
+ ": "
+ EnumChatFormatting.GREEN
- + GT_Utility.formatNumbers(progressTimes[i] > 20 ? progressTimes[i] / 20 : progressTimes[i])
+ + GT_Utility.formatNumbers(
+ processing.getProgress(i) > 20 ? processing.getProgress(i) / 20 : processing.getProgress(i))
+ EnumChatFormatting.RESET
- + (progressTimes[i] > 20 ? " s / " : " ticks / ")
+ + (processing.getProgress(i) > 20 ? " s / " : " ticks / ")
+ EnumChatFormatting.YELLOW
- + GT_Utility
- .formatNumbers(maxProgressTimes[i] > 20 ? maxProgressTimes[i] / 20 : maxProgressTimes[i])
+ + GT_Utility.formatNumbers(
+ processing.getDuration(i) > 20 ? processing.getDuration(i) / 20 : processing.getDuration(i))
+ EnumChatFormatting.RESET
- + (maxProgressTimes[i] > 20 ? " s" : " ticks"));
+ + (processing.getDuration(i) > 20 ? " s" : " ticks"));
}
}
@@ -219,10 +72,11 @@ public abstract class ComplexParallelController<T extends ComplexParallelControl
public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
int z) {
super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ P processing = getProcessingLogic();
tag.setInteger("maxComplexParallels", maxComplexParallels);
for (int i = 0; i < maxComplexParallels; i++) {
- tag.setLong("maxProgress" + i, maxProgressTimes[i]);
- tag.setLong("progress" + i, progressTimes[i]);
+ tag.setInteger("maxProgress" + i, processing.getDuration(i));
+ tag.setInteger("progress" + i, processing.getProgress(i));
}
}
@@ -233,8 +87,8 @@ public abstract class ComplexParallelController<T extends ComplexParallelControl
final NBTTagCompound tag = accessor.getNBTData();
maxComplexParallels = tag.getInteger("maxComplexParallels");
for (int i = 0; i < maxComplexParallels; i++) {
- long maxProgress = tag.getLong("maxProgress" + i);
- long progress = tag.getLong("progress" + i);
+ long maxProgress = tag.getInteger("maxProgress" + i);
+ long progress = tag.getInteger("progress" + i);
currentTip.add(
"Process " + (i + 1)
+ ": "
@@ -242,4 +96,16 @@ public abstract class ComplexParallelController<T extends ComplexParallelControl
.getMachineProgressString(maxProgress > 0 && maxProgress >= progress, maxProgress, progress));
}
}
+
+ @Override
+ public void setProcessingLogicPower(@Nonnull P processingLogic) {
+ processingLogic.setAmperageOC(true);
+ processingLogic.setAvailableAmperage(getPowerLogic().getMaxAmperage() / maxComplexParallels);
+ processingLogic.setAvailableVoltage(getPowerLogic().getVoltage() / maxComplexParallels);
+ }
+
+ @Override
+ public void updateProcessingLogic(@Nonnull P processingLogic) {
+ processingLogic.setMaxComplexParallel(maxComplexParallels);
+ }
}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java
index 606d957fd6..8ac908be12 100644
--- a/src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java
@@ -1,261 +1,109 @@
package gregtech.api.multitileentity.multiblock.base;
-import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
-import static gregtech.GT_Mod.GT_FML_LOGGER;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.EV_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.EV_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.EV_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.EV_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.EV_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.EV_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.EV_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.EV_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.HV_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.HV_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.HV_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.HV_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.HV_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.HV_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.HV_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.HV_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.IV_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.IV_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.IV_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.IV_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.IV_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.IV_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.IV_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.IV_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LV_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LV_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LV_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LV_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LV_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LV_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LV_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LV_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LuV_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LuV_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LuV_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LuV_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LuV_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LuV_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LuV_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LuV_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MAX_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MAX_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MAX_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MAX_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MAX_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MAX_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MAX_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MAX_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MV_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MV_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MV_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MV_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MV_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MV_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MV_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MV_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UEV_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UEV_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UEV_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UEV_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UEV_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UEV_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UEV_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UEV_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UHV_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UHV_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UHV_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UHV_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UHV_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UHV_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UHV_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UHV_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UIV_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UIV_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UIV_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UIV_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UIV_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UIV_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UIV_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UIV_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UMV_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UMV_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UMV_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UMV_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UMV_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UMV_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UMV_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UMV_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UV_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UV_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UV_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UV_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UV_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UV_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UV_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UV_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UXV_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UXV_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UXV_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UXV_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UXV_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UXV_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UXV_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UXV_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.ZPM_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.ZPM_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.ZPM_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.ZPM_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.ZPM_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.ZPM_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.ZPM_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.ZPM_Sensor;
-import static gregtech.loaders.preload.GT_Loader_MultiTileEntities.COMPONENT_CASING_REGISTRY_NAME;
-import static mcp.mobius.waila.api.SpecialChars.GREEN;
-import static mcp.mobius.waila.api.SpecialChars.RED;
-import static mcp.mobius.waila.api.SpecialChars.RESET;
+import static gregtech.api.util.GT_Utility.moveMultipleItemStacks;
+import static gregtech.common.misc.WirelessNetworkManager.strongCheckOrAddUser;
+import static mcp.mobius.waila.api.SpecialChars.*;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
-import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
-import net.minecraft.block.Block;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity;
-import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
-import net.minecraftforge.common.util.Constants;
import net.minecraftforge.common.util.ForgeDirection;
-import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
-import net.minecraftforge.fluids.FluidTankInfo;
-import net.minecraftforge.fluids.IFluidTank;
-import org.apache.commons.lang3.tuple.ImmutablePair;
-import org.apache.commons.lang3.tuple.Pair;
import org.lwjgl.input.Keyboard;
import com.gtnewhorizon.structurelib.StructureLibAPI;
import com.gtnewhorizon.structurelib.alignment.IAlignment;
import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
-import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable;
import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing;
import com.gtnewhorizon.structurelib.alignment.enumerable.Flip;
import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation;
import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
-import com.gtnewhorizon.structurelib.structure.IStructureElement;
-import com.gtnewhorizon.structurelib.structure.IStructureElementChain;
import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
import com.gtnewhorizon.structurelib.util.Vec3Impl;
-import com.gtnewhorizons.modularui.api.ModularUITextures;
-import com.gtnewhorizons.modularui.api.drawable.ItemDrawable;
-import com.gtnewhorizons.modularui.api.forge.IItemHandler;
-import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable;
-import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
-import com.gtnewhorizons.modularui.api.forge.ListItemHandler;
-import com.gtnewhorizons.modularui.api.math.Pos2d;
import com.gtnewhorizons.modularui.api.screen.ModularWindow;
-import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
-import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder;
-import com.gtnewhorizons.modularui.api.widget.Widget;
-import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
-import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget;
-import com.gtnewhorizons.modularui.common.widget.MultiChildWidget;
-import com.gtnewhorizons.modularui.common.widget.Scrollable;
-import com.gtnewhorizons.modularui.common.widget.SlotWidget;
-import com.gtnewhorizons.modularui.common.widget.TabButton;
-import com.gtnewhorizons.modularui.common.widget.TabContainer;
import cpw.mods.fml.common.network.NetworkRegistry;
-import gnu.trove.list.TIntList;
-import gnu.trove.list.array.TIntArrayList;
-import gregtech.api.enums.GT_Values;
import gregtech.api.enums.GT_Values.NBT;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.enums.TextureSet;
+import gregtech.api.enums.InventoryType;
import gregtech.api.enums.VoidingMode;
-import gregtech.api.fluid.FluidTankGT;
-import gregtech.api.gui.modularui.GT_UITextures;
import gregtech.api.interfaces.IDescribable;
import gregtech.api.interfaces.fluid.IFluidStore;
-import gregtech.api.interfaces.modularui.ControllerWithOptionalFeatures;
+import gregtech.api.logic.ControllerFluidLogic;
+import gregtech.api.logic.ControllerItemLogic;
+import gregtech.api.logic.FluidInventoryLogic;
+import gregtech.api.logic.ItemInventoryLogic;
+import gregtech.api.logic.MuTEProcessingLogic;
import gregtech.api.logic.PowerLogic;
-import gregtech.api.logic.ProcessingLogic;
-import gregtech.api.logic.interfaces.PowerLogicHost;
-import gregtech.api.logic.interfaces.ProcessingLogicHost;
-import gregtech.api.multitileentity.MultiTileEntityContainer;
-import gregtech.api.multitileentity.MultiTileEntityRegistry;
+import gregtech.api.multitileentity.enums.MultiTileCasingPurpose;
import gregtech.api.multitileentity.interfaces.IMultiBlockController;
import gregtech.api.multitileentity.interfaces.IMultiBlockPart;
-import gregtech.api.multitileentity.interfaces.IMultiTileEntity;
import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_AddToolTips;
import gregtech.api.multitileentity.machine.MultiTileBasicMachine;
import gregtech.api.multitileentity.multiblock.casing.FunctionalCasing;
import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing;
+import gregtech.api.net.GT_Packet_MultiTileEntity;
import gregtech.api.objects.GT_ItemStack;
-import gregtech.api.recipe.RecipeMap;
-import gregtech.api.recipe.check.CheckRecipeResult;
-import gregtech.api.recipe.check.CheckRecipeResultRegistry;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
import gregtech.api.util.GT_Utility;
import gregtech.api.util.GT_Waila;
-import gregtech.common.tileentities.casings.upgrade.Inventory;
import mcp.mobius.waila.api.IWailaConfigHandler;
import mcp.mobius.waila.api.IWailaDataAccessor;
/**
* Multi Tile Entities - or MuTEs - don't have dedicated hatches, but their casings can become hatches.
*/
-public abstract class Controller<T extends Controller<T>> extends MultiTileBasicMachine
- implements IAlignment, IConstructable, IMultiBlockController, IDescribable, IMTE_AddToolTips,
- ISurvivalConstructable, ControllerWithOptionalFeatures {
+public abstract class Controller<C extends Controller<C, P>, P extends MuTEProcessingLogic<P>>
+ extends MultiTileBasicMachine<P>
+ implements IAlignment, IMultiBlockController, IDescribable, IMTE_AddToolTips, ISurvivalConstructable {
public static final String ALL_INVENTORIES_NAME = "all";
+ protected static final int AUTO_OUTPUT_FREQUENCY_TICK = 20;
private static final Map<Integer, GT_Multiblock_Tooltip_Builder> tooltip = new ConcurrentHashMap<>();
private final List<UpgradeCasing> upgradeCasings = new ArrayList<>();
private final List<FunctionalCasing> functionalCasings = new ArrayList<>();
protected BuildState buildState = new BuildState();
- protected Map<String, String> multiBlockInputInventoryNames = new LinkedHashMap<>();
- protected Map<String, String> multiBlockOutputInventoryNames = new LinkedHashMap<>();
- protected Map<String, String> multiBlockInputInventoryToTankLink = new LinkedHashMap<>();
- protected Map<String, IItemHandlerModifiable> multiBlockInputInventory = new LinkedHashMap<>();
- protected Map<String, IItemHandlerModifiable> multiBlockOutputInventory = new LinkedHashMap<>();
-
- protected Map<String, String> multiBlockInputTankNames = new LinkedHashMap<>();
- protected Map<String, String> multiBlockOutputTankNames = new LinkedHashMap<>();
- protected Map<String, FluidTankGT[]> multiBlockInputTank = new LinkedHashMap<>();
- protected Map<String, FluidTankGT[]> multiBlockOutputTank = new LinkedHashMap<>();
-
private boolean structureOkay = false, structureChanged = false;
private ExtendedFacing extendedFacing = ExtendedFacing.DEFAULT;
private IAlignmentLimits limits = getInitialAlignmentLimits();
- private String inventoryName;
- private String tankName;
protected boolean separateInputs = getDefaultInputSeparationMode();
protected VoidingMode voidingMode = getDefaultVoidingMode();
protected boolean batchMode = getDefaultBatchMode();
protected boolean recipeLock = getDefaultRecipeLockingMode();
+ protected boolean shouldSort = false;
/** If this is set to true, the machine will get default WAILA behavior */
protected boolean isSimpleMachine = true;
+ protected boolean isCleanroom = false;
+ protected ControllerItemLogic controllerItemInput = new ControllerItemLogic();
+ protected ControllerItemLogic controllerItemOutput = new ControllerItemLogic();
+ protected ControllerFluidLogic controllerFluidInput = new ControllerFluidLogic();
+ protected ControllerFluidLogic controllerFluidOutput = new ControllerFluidLogic();
+
// A list of sides
// Each side has a list of parts that have a cover that need to be ticked
protected List<LinkedList<WeakReference<IMultiBlockPart>>> registeredCoveredParts = Arrays.asList(
@@ -266,6 +114,15 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
new LinkedList<>(),
new LinkedList<>());
+ // A list for each purpose that a casing can register to, to be ticked
+ protected List<LinkedList<WeakReference<IMultiBlockPart>>> registeredTickableParts = new ArrayList<>();
+
+ public Controller() {
+ for (int i = 0; i < MultiTileCasingPurpose.values().length; i++) {
+ registeredTickableParts.add(new LinkedList<>());
+ }
+ }
+
/** Registry ID of the required casing */
public abstract short getCasingRegistryID();
@@ -288,7 +145,7 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
* other instances, even for those of the same class.
*/
@Override
- public abstract IStructureDefinition<T> getStructureDefinition();
+ public abstract IStructureDefinition<C> getStructureDefinition();
/**
* Checks the Machine.
@@ -296,16 +153,20 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
* NOTE: If using `buildState` be sure to `startBuilding()` and either `endBuilding()` or `failBuilding()`
*/
public boolean checkMachine() {
+ calculateTier();
+ updatePowerLogic();
+ return tier > 0;
+ }
+
+ protected void calculateTier() {
double sum = 0;
if (functionalCasings == null || functionalCasings.size() == 0) {
- return false;
+ return;
}
for (FunctionalCasing casing : functionalCasings) {
sum += casing.getPartTier() * casing.getPartModifier();
}
- tier = (int) Math.floor(sum / functionalCasings.size());
- // Maximum Energy stores will have a cap of 2 minute work time of current voltage
- return tier > 0;
+ tier = (int) Math.min(Math.floor(sum / functionalCasings.size()), 14);
}
@Override
@@ -322,77 +183,26 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
(byte) extendedFacing.getFlip()
.getIndex());
- saveUpgradeInventoriesToNBT(nbt);
- saveUpgradeTanksToNBT(nbt);
-
nbt.setString(NBT.VOIDING_MODE, voidingMode.name);
nbt.setBoolean(NBT.SEPARATE_INPUTS, separateInputs);
nbt.setBoolean(NBT.RECIPE_LOCK, recipeLock);
nbt.setBoolean(NBT.BATCH_MODE, batchMode);
}
- private void saveUpgradeInventoriesToNBT(NBTTagCompound nbt) {
- final NBTTagList inputInvList = new NBTTagList();
- multiBlockInputInventory.forEach((id, inv) -> {
- if (!id.equals("controller")) {
- final NBTTagCompound tTag = new NBTTagCompound();
- tTag.setString(NBT.UPGRADE_INVENTORY_UUID, id);
- tTag.setString(NBT.UPGRADE_INVENTORY_NAME, multiBlockInputInventoryNames.get(id));
- tTag.setInteger(NBT.UPGRADE_INVENTORY_SIZE, inv.getSlots());
- writeInventory(tTag, inv, NBT.INV_INPUT_LIST);
- inputInvList.appendTag(tTag);
- }
- });
- final NBTTagList outputInvList = new NBTTagList();
- multiBlockOutputInventory.forEach((id, inv) -> {
- if (!id.equals("controller")) {
- final NBTTagCompound tTag = new NBTTagCompound();
- tTag.setString(NBT.UPGRADE_INVENTORY_UUID, id);
- tTag.setString(NBT.UPGRADE_INVENTORY_NAME, multiBlockOutputInventoryNames.get(id));
- tTag.setInteger(NBT.UPGRADE_INVENTORY_SIZE, inv.getSlots());
- writeInventory(tTag, inv, NBT.INV_OUTPUT_LIST);
- outputInvList.appendTag(tTag);
- }
- });
- nbt.setTag(NBT.UPGRADE_INVENTORIES_INPUT, inputInvList);
- nbt.setTag(NBT.UPGRADE_INVENTORIES_OUTPUT, outputInvList);
- }
-
- private void saveUpgradeTanksToNBT(NBTTagCompound nbt) {
- final NBTTagList inputTankList = new NBTTagList();
- multiBlockInputTank.forEach((id, tanks) -> {
- if (!id.equals("controller") && tanks != null && tanks.length > 0) {
- final NBTTagCompound tTag = new NBTTagCompound();
- tTag.setString(NBT.UPGRADE_TANK_UUID, id);
- tTag.setString(NBT.UPGRADE_TANK_NAME, multiBlockInputTankNames.get(id));
- // We assume all tanks in the tank-array are equally sized
- tTag.setLong(NBT.UPGRADE_TANK_CAPACITY, tanks[0].capacity());
- tTag.setLong(NBT.UPGRADE_TANK_CAPACITY_MULTIPLIER, tanks[0].getCapacityMultiplier());
- tTag.setInteger(NBT.UPGRADE_TANKS_COUNT, tanks.length);
- for (int i = 0; i < tanks.length; i++) {
- tanks[i].writeToNBT(tTag, NBT.UPGRADE_TANKS_PREFIX + i);
- }
- inputTankList.appendTag(tTag);
- }
- });
- final NBTTagList outputTankList = new NBTTagList();
- multiBlockOutputTank.forEach((id, tanks) -> {
- if (!id.equals("controller") && tanks != null && tanks.length > 0) {
- final NBTTagCompound tTag = new NBTTagCompound();
- tTag.setString(NBT.UPGRADE_TANK_UUID, id);
- tTag.setString(NBT.UPGRADE_TANK_NAME, multiBlockInputTankNames.get(id));
- // We assume all tanks in the tank-array are equally sized
- tTag.setLong(NBT.UPGRADE_TANK_CAPACITY, tanks[0].capacity());
- tTag.setLong(NBT.UPGRADE_TANK_CAPACITY_MULTIPLIER, tanks[0].getCapacityMultiplier());
- tTag.setInteger(NBT.UPGRADE_TANKS_COUNT, tanks.length);
- for (int i = 0; i < tanks.length; i++) {
- tanks[i].writeToNBT(tTag, NBT.UPGRADE_TANKS_PREFIX + i);
- }
- outputTankList.appendTag(tTag);
- }
- });
- nbt.setTag(NBT.UPGRADE_TANKS_INPUT, inputTankList);
- nbt.setTag(NBT.UPGRADE_TANKS_OUTPUT, outputTankList);
+ @Override
+ protected void saveItemLogic(NBTTagCompound nbt) {
+ NBTTagCompound itemInputNBT = controllerItemInput.saveToNBT();
+ nbt.setTag(NBT.INV_INPUT_LIST, itemInputNBT);
+ NBTTagCompound itemOutputNBT = controllerItemOutput.saveToNBT();
+ nbt.setTag(NBT.INV_OUTPUT_LIST, itemOutputNBT);
+ }
+
+ @Override
+ protected void saveFluidLogic(NBTTagCompound nbt) {
+ NBTTagCompound fluidInputNBT = controllerFluidInput.saveToNBT();
+ nbt.setTag(NBT.TANK_IN, fluidInputNBT);
+ NBTTagCompound fluidOutputNBT = controllerFluidOutput.saveToNBT();
+ nbt.setTag(NBT.TANK_OUT, fluidOutputNBT);
}
@Override
@@ -401,83 +211,37 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
// Multiblock inventories are a collection of inventories. The first inventory is the default internal
// inventory, and the others are added by inventory extending blocks.
- if (inputInventory != null) registerInventory("controller", "controller", inputInventory, Inventory.INPUT);
- if (outputInventory != null) registerInventory("controller", "controller", outputInventory, Inventory.OUTPUT);
-
- if (inputTanks != null) registerFluidInventory("controller", "controller", inputTanks, Inventory.INPUT);