diff options
Diffstat (limited to 'src/main/java/gregtech/api/task')
5 files changed, 194 insertions, 0 deletions
diff --git a/src/main/java/gregtech/api/task/TaskHost.java b/src/main/java/gregtech/api/task/TaskHost.java new file mode 100644 index 0000000000..d6377949c1 --- /dev/null +++ b/src/main/java/gregtech/api/task/TaskHost.java @@ -0,0 +1,18 @@ +package gregtech.api.task; + +import javax.annotation.Nonnull; + +import org.jetbrains.annotations.ApiStatus; + +/** + * Classes implementing this interface can have {@link TickableTask} to run. Tasks with conflicting name should not be + * allowed, to prevent them from overwriting others' NBT load/save. + */ +public interface TaskHost { + + /** + * This method should be called ONLY by {@link TickableTask} constructor. + */ + @ApiStatus.OverrideOnly + void registerTask(@Nonnull TickableTask<?> task); +} diff --git a/src/main/java/gregtech/api/task/TickableTask.java b/src/main/java/gregtech/api/task/TickableTask.java new file mode 100644 index 0000000000..3bbeb216e7 --- /dev/null +++ b/src/main/java/gregtech/api/task/TickableTask.java @@ -0,0 +1,48 @@ +package gregtech.api.task; + +import javax.annotation.Nonnull; + +import net.minecraft.nbt.NBTTagCompound; + +/** + * This class aims at separating logic run on {@link TaskHost}, rather than using interface layers. + * It has two main functionalities: Run tick and Save/Load. + * + * @param <T> Type of the host + */ +public abstract class TickableTask<T extends TaskHost> { + + @Nonnull + protected final T taskHost; + + public TickableTask(@Nonnull T taskHost) { + this.taskHost = taskHost; + taskHost.registerTask(this); + } + + /** + * @return Name of this task. Tasks with conflicting name cannot be registered to the same machine. + */ + @Nonnull + public abstract String getName(); + + /** + * Called once per world tick. + */ + public abstract void update(long tick, boolean isServerSide); + + /** + * Save info to NBT. + */ + public void writeToNBT(@Nonnull NBTTagCompound nbt) {} + + /** + * Read info from NBT. + */ + public void readFromNBT(@Nonnull NBTTagCompound nbt) {} + + @Override + public String toString() { + return "TickableTask{" + "name=" + getName() + ", taskHost=" + taskHost + "}"; + } +} diff --git a/src/main/java/gregtech/api/task/tasks/PollutionTask.java b/src/main/java/gregtech/api/task/tasks/PollutionTask.java new file mode 100644 index 0000000000..060a91acab --- /dev/null +++ b/src/main/java/gregtech/api/task/tasks/PollutionTask.java @@ -0,0 +1,45 @@ +package gregtech.api.task.tasks; + +import javax.annotation.Nonnull; + +import net.minecraft.tileentity.TileEntity; + +import gregtech.api.enums.TickTime; +import gregtech.api.interfaces.tileentity.IMachineProgress; +import gregtech.api.task.TaskHost; +import gregtech.api.task.TickableTask; +import gregtech.common.GT_Pollution; + +public class PollutionTask<T extends TaskHost & IMachineProgress> extends TickableTask<T> { + + private int pollutionPerSecond; + private static final int POLLUTION_TICK = TickTime.SECOND; + + public PollutionTask(@Nonnull T taskHost) { + super(taskHost); + } + + public PollutionTask<T> setPollutionPerSecond(int pollutionPerSecond) { + this.pollutionPerSecond = pollutionPerSecond; + return this; + } + + public int getPollutionPerSecond() { + return pollutionPerSecond; + } + + @Nonnull + @Override + public String getName() { + return "pollution"; + } + + @Override + public void update(long tick, boolean isServerSide) { + if (isServerSide && tick % POLLUTION_TICK == 0 && taskHost.hasThingsToDo()) { + if (taskHost instanceof final TileEntity entity) { + GT_Pollution.addPollution(entity, getPollutionPerSecond()); + } + } + } +} diff --git a/src/main/java/gregtech/api/task/tasks/PowerOutputTask.java b/src/main/java/gregtech/api/task/tasks/PowerOutputTask.java new file mode 100644 index 0000000000..ef800635fb --- /dev/null +++ b/src/main/java/gregtech/api/task/tasks/PowerOutputTask.java @@ -0,0 +1,32 @@ +package gregtech.api.task.tasks; + +import javax.annotation.Nonnull; + +import gregtech.api.interfaces.tileentity.IMachineProgress; +import gregtech.api.logic.interfaces.PowerLogicHost; +import gregtech.api.task.TaskHost; +import gregtech.api.task.TickableTask; + +public class PowerOutputTask<T extends PowerLogicHost & TaskHost & IMachineProgress> extends TickableTask<T> { + + private static final String NAME = "powerOutput"; + + public PowerOutputTask(@Nonnull T taskHost) { + super(taskHost); + } + + @Override + @Nonnull + public String getName() { + return NAME; + } + + @Override + public void update(long tick, boolean isServerSide) { + if (!isServerSide) return; + if (!taskHost.isActive()) return; + if (!taskHost.isEnergyEmitter()) return; + taskHost.emitEnergyFromLogic(); + } + +} diff --git a/src/main/java/gregtech/api/task/tasks/ProcessingTask.java b/src/main/java/gregtech/api/task/tasks/ProcessingTask.java new file mode 100644 index 0000000000..410c8d7a6f --- /dev/null +++ b/src/main/java/gregtech/api/task/tasks/ProcessingTask.java @@ -0,0 +1,51 @@ +package gregtech.api.task.tasks; + +import javax.annotation.Nonnull; + +import gregtech.api.interfaces.tileentity.IMachineProgress; +import gregtech.api.logic.MuTEProcessingLogic; +import gregtech.api.logic.interfaces.ProcessingLogicHost; +import gregtech.api.task.TaskHost; +import gregtech.api.task.TickableTask; + +public class ProcessingTask<T extends TaskHost & ProcessingLogicHost<P> & IMachineProgress, P extends MuTEProcessingLogic<P>> + extends TickableTask<T> { + + public ProcessingTask(@Nonnull T taskHost) { + super(taskHost); + } + + private static final String NAME = "processing"; + + @Override + @Nonnull + public String getName() { + return NAME; + } + + @Override + public void update(long tick, boolean isServerSide) { + if (!isServerSide) return; + if (!taskHost.isAllowedToWork()) return; + final P logic = taskHost.getProcessingLogic(); + if (taskHost.needsUpdate()) { + taskHost.updateProcessingLogic(logic); + taskHost.setProcessingUpdate(false); + } + if (logic.canWork() && tick % 100 == 0) { + taskHost.setProcessingLogicPower(logic); + logic.startCheck(); + if (logic.getResult() + .wasSuccessful()) { + taskHost.setActive(true); + } + } + + if (taskHost.hasThingsToDo()) { + logic.progress(); + } else { + taskHost.setActive(false); + } + } + +} |