This repository has been archived on 2023-11-26. You can view files and clone it, but cannot push or open issues or pull requests.
EnergonRelics/src/main/java/com/thebrokenrail/energonrelics/api/energy/tick/EnergyTicker.java

91 lines
2.7 KiB
Java
Raw Normal View History

2020-08-04 17:06:11 +00:00
package com.thebrokenrail.energonrelics.api.energy.tick;
2020-07-24 17:25:50 +00:00
2020-07-30 22:57:20 +00:00
import com.thebrokenrail.energonrelics.EnergonRelics;
2020-07-27 18:06:46 +00:00
import com.thebrokenrail.energonrelics.component.NetworkComponent;
import net.minecraft.server.world.ServerWorld;
2020-07-26 00:09:03 +00:00
import net.minecraft.world.World;
2020-08-06 01:59:47 +00:00
import org.jetbrains.annotations.ApiStatus;
2020-07-24 17:25:50 +00:00
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
2020-07-26 00:09:03 +00:00
import java.util.Objects;
2020-07-24 17:25:50 +00:00
2020-08-04 17:06:11 +00:00
/**
* Energy Ticker
*/
2020-08-06 01:59:47 +00:00
@ApiStatus.Internal
2020-07-24 17:25:50 +00:00
public class EnergyTicker {
2020-07-26 22:31:05 +00:00
private static final List<EnergyTickable> scheduled = new ArrayList<>();
2020-08-16 13:43:06 +00:00
private static List<EnergyTickable> allLoaded = Collections.emptyList();
2020-07-24 17:25:50 +00:00
2020-08-16 03:01:24 +00:00
/**
2020-08-16 13:43:06 +00:00
* Get All Loaded Energy Tickers
*
* Only Usable In {@link EnergyTickable#logicTick()}
* @return List Of All Loaded Energy Tickers
2020-08-16 03:01:24 +00:00
*/
2020-08-16 13:43:06 +00:00
public static List<EnergyTickable> getAllLoaded() {
return allLoaded;
}
2020-08-16 03:01:24 +00:00
2020-08-04 17:06:11 +00:00
/**
* Schedule For Next Energy Tick
* @param tickable Object To Tick
*/
2020-07-26 22:31:05 +00:00
public static void schedule(EnergyTickable tickable) {
scheduled.add(tickable);
2020-07-24 17:25:50 +00:00
}
2020-08-04 17:06:11 +00:00
/**
* Tick Energy
* @param world World
*/
2020-07-26 00:09:03 +00:00
public static void tick(World world) {
2020-07-26 22:31:05 +00:00
if (Objects.requireNonNull(world.getServer()).getThread() == Thread.currentThread()) {
2020-07-30 22:57:20 +00:00
world.getProfiler().push(EnergonRelics.NAMESPACE);
2020-07-27 18:06:46 +00:00
NetworkComponent.getInstance((ServerWorld) world).clearCache();
2020-07-26 22:31:05 +00:00
List<EnergyTickable> started = new ArrayList<>();
2020-07-24 17:25:50 +00:00
2020-07-26 22:31:05 +00:00
List<EnergyTickable> temp = new ArrayList<>(scheduled);
List<EnergyTickable> temp2 = new ArrayList<>();
2020-07-26 00:09:03 +00:00
while (!temp.isEmpty()) {
2020-07-27 18:06:46 +00:00
for (EnergyTickable tickable : temp) {
if (!started.contains(tickable)) {
world.getProfiler().push(() -> tickable.getID() + " startTick");
temp2.addAll(tickable.startTick());
started.add(tickable);
world.getProfiler().pop();
2020-07-26 00:09:03 +00:00
}
2020-07-24 17:25:50 +00:00
}
2020-07-26 00:09:03 +00:00
temp.clear();
temp.addAll(temp2);
temp2.clear();
2020-07-24 17:25:50 +00:00
}
2020-08-16 03:01:24 +00:00
allLoaded = Collections.unmodifiableList(started);
2020-08-16 15:24:03 +00:00
world.getProfiler().visit("shuffle");
2020-07-28 22:22:44 +00:00
Collections.shuffle(started, world.random);
2020-08-16 15:24:03 +00:00
world.getProfiler().pop();
2020-07-27 18:06:46 +00:00
for (EnergyTickable tickable : started) {
world.getProfiler().push(() -> tickable.getID() + " logicTick");
tickable.logicTick();
world.getProfiler().pop();
2020-07-26 00:09:03 +00:00
}
2020-07-27 18:06:46 +00:00
world.getProfiler().pop();
2020-07-24 17:25:50 +00:00
}
2020-07-26 22:31:05 +00:00
scheduled.clear();
2020-08-16 03:01:24 +00:00
allLoaded = Collections.emptyList();
2020-07-24 17:25:50 +00:00
}
}