package com.hypixel.hytale.server.spawning.jobs; import com.hypixel.hytale.logger.HytaleLogger; import com.hypixel.hytale.server.spawning.ISpawnableWithModel; import com.hypixel.hytale.server.spawning.SpawningContext; import com.hypixel.hytale.server.spawning.SpawningPlugin; import javax.annotation.Nonnull; import javax.annotation.Nullable; public abstract class SpawnJob { protected static final HytaleLogger LOGGER = SpawningPlugin.get().getLogger(); private static int jobIdCounter; protected final int jobId; protected final SpawningContext spawningContext = new SpawningContext(); protected int columnBudget; protected int budgetUsed; protected boolean terminated; public SpawnJob() { this.jobId = jobIdCounter++; } public int getJobId() { return this.jobId; } public int getBudgetUsed() { return this.budgetUsed; } public void setBudgetUsed(int budgetUsed) { this.budgetUsed = budgetUsed; } public int getColumnBudget() { return this.columnBudget; } public void setColumnBudget(int columnBudget) { this.columnBudget = columnBudget; } @Nonnull public SpawningContext getSpawningContext() { return this.spawningContext; } protected void beginProbing() { this.reset(); this.terminated = false; } public void reset() { this.spawningContext.releaseFull(); } public boolean budgetAvailable() { return this.budgetUsed < this.columnBudget; } public boolean isTerminated() { return this.terminated; } public void setTerminated(boolean terminated) { this.terminated = terminated; } @Nullable public abstract ISpawnableWithModel getSpawnable(); public abstract boolean shouldTerminate(); @Nullable public abstract String getSpawnableName(); }