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-07-24 17:25:50 +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-07-28 22:22:44 +00:00
|
|
|
Collections.shuffle(started, world.random);
|
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-07-24 17:25:50 +00:00
|
|
|
}
|
|
|
|
}
|