EnergonRelics/src/main/java/com/thebrokenrail/energonrelics/api/energy/tick/EnergyTicker.java

102 lines
2.9 KiB
Java

package com.thebrokenrail.energonrelics.api.energy.tick;
import com.thebrokenrail.energonrelics.EnergonRelics;
import com.thebrokenrail.energonrelics.component.NetworkComponent;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.world.World;
import org.jetbrains.annotations.ApiStatus;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
/**
* Energy Ticker
*/
public final class EnergyTicker {
private static final List<EnergyTickable> scheduled = new ArrayList<>();
private static List<EnergyTickable> allLoaded = Collections.emptyList();
/**
* Get All Loaded Energy Tickers
*
* Only Usable In {@link EnergyTickable#logicTick()}
* @return List Of All Loaded Energy Tickers
*/
public static List<EnergyTickable> getAllLoaded() {
return allLoaded;
}
/**
* Schedule For Next Energy Tick
* @param tickable Object To Tick
*/
@ApiStatus.Internal
public static void schedule(EnergyTickable tickable) {
scheduled.add(tickable);
}
/**
* Tick Energy
* @param world World
*/
@ApiStatus.Internal
public static void tick(World world) {
if (Objects.requireNonNull(world.getServer()).getThread() == Thread.currentThread()) {
world.getProfiler().push(EnergonRelics.NAMESPACE);
NetworkComponent.getInstance((ServerWorld) world).clearCache();
world.getProfiler().push("startTick");
List<EnergyTickable> started = new ArrayList<>();
List<EnergyTickable> temp = new ArrayList<>(scheduled);
List<EnergyTickable> temp2 = new ArrayList<>();
while (!temp.isEmpty()) {
for (EnergyTickable tickable : temp) {
if (!started.contains(tickable)) {
world.getProfiler().push(tickable::getID);
temp2.addAll(tickable.startTick());
started.add(tickable);
world.getProfiler().pop();
}
}
List<EnergyTickable> temp3 = temp;
temp = temp2;
temp2 = temp3;
temp2.clear();
}
allLoaded = Collections.unmodifiableList(started);
world.getProfiler().push("shuffle");
Collections.shuffle(started, world.random);
world.getProfiler().pop();
world.getProfiler().pop();
world.getProfiler().push("logicTick");
for (EnergyTickable tickable : started) {
world.getProfiler().push(tickable::getID);
tickable.logicTick();
world.getProfiler().pop();
}
world.getProfiler().pop();
world.getProfiler().pop();
}
scheduled.clear();
allLoaded = Collections.emptyList();
}
}