aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/task
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/api/task')
-rw-r--r--src/main/java/gregtech/api/task/TaskHost.java18
-rw-r--r--src/main/java/gregtech/api/task/TickableTask.java48
-rw-r--r--src/main/java/gregtech/api/task/tasks/PollutionTask.java45
-rw-r--r--src/main/java/gregtech/api/task/tasks/PowerOutputTask.java32
-rw-r--r--src/main/java/gregtech/api/task/tasks/ProcessingTask.java51
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);
+ }
+ }
+
+}