From 249cd4695753ade48d5e75d9cdc7f1d0b1c3b9de Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 10 Sep 2021 12:19:31 +0700 Subject: [PATCH] Fix issues related to ticking events --- .../mc/otm/OverdriveThatMatters.java | 43 +++++++++---------- .../mc/otm/capability/drive/DrivePool.java | 10 +++-- .../capability/matter/IMatterGridCell.java | 27 +++++++----- .../dbotthepony/mc/otm/matter/MatterGrid.java | 9 +++- 4 files changed, 50 insertions(+), 39 deletions(-) diff --git a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java index e3c8809d5..c2d7304a4 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java +++ b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java @@ -5,6 +5,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.InterModComms; import net.minecraftforge.fml.LogicalSide; @@ -14,7 +15,9 @@ import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent; import net.minecraftforge.fml.event.lifecycle.InterModProcessEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fmlserverevents.FMLServerAboutToStartEvent; import net.minecraftforge.fmlserverevents.FMLServerStartedEvent; +import net.minecraftforge.fmlserverevents.FMLServerStartingEvent; import net.minecraftforge.fmlserverevents.FMLServerStoppingEvent; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -52,52 +55,46 @@ public class OverdriveThatMatters { public static CreativeModeTab CREATIVE_TAB; - private static final WeakHashMap>> tick_until = new WeakHashMap<>(); + // why no LinkedList? + // because you can't get nodes directly, which is vital in getting this thing working faster. + private static final WeakHashMap>> tick_until = new WeakHashMap<>(); private static final WeakHashMap>> tick_once = new WeakHashMap<>(); - @SubscribeEvent - public void onServerStarting(FMLServerStartedEvent event) { + @SubscribeEvent(priority = EventPriority.HIGHEST) + public void onServerStarting(FMLServerAboutToStartEvent event) { tick_until.clear(); } - @SubscribeEvent + @SubscribeEvent(priority = EventPriority.HIGHEST) public void onServerStopping(FMLServerStoppingEvent event) { tick_until.clear(); } - @SubscribeEvent + @SubscribeEvent(priority = EventPriority.LOWEST) public void onPreTick(TickEvent.WorldTickEvent event) { if (event.phase != TickEvent.Phase.START || event.side != LogicalSide.SERVER) return; - var set = tick_until.get(event.world); + final var until = tick_until.get(event.world); - if (set != null) { - ArrayList> invalid = new ArrayList<>(); - - for (var ticker : set) { - if (ticker.get()) { - invalid.add(ticker); + if (until != null) { + for (int i = until.size() - 1; i >= 0; i--) { + if (until.get(i).get()) { + until.remove(i); } } - if (invalid.size() != 0) { - for (Supplier cell : invalid) { - set.remove(cell); - } - } - - if (set.size() == 0) { + if (until.size() == 0) { tick_until.remove(event.world); } } - var list = tick_once.get(event.world); + final var once = tick_once.get(event.world); - if (list != null) { + if (once != null) { ArrayList> invalid = new ArrayList<>(); - for (var ticker : list) { + for (var ticker : once) { ticker.accept(event.world); } @@ -106,7 +103,7 @@ public class OverdriveThatMatters { } public static void tickUntil(Level level, Supplier ticker) { - tick_until.computeIfAbsent(level, (k) -> new HashSet<>()).add(ticker); + tick_until.computeIfAbsent(level, (k) -> new ArrayList<>()).add(ticker); } public static void tickOnce(Level level, Consumer ticker) { diff --git a/src/main/java/ru/dbotthepony/mc/otm/capability/drive/DrivePool.java b/src/main/java/ru/dbotthepony/mc/otm/capability/drive/DrivePool.java index b0a1a8e1e..897113c4b 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/capability/drive/DrivePool.java +++ b/src/main/java/ru/dbotthepony/mc/otm/capability/drive/DrivePool.java @@ -8,8 +8,10 @@ import net.minecraft.nbt.NbtIo; import net.minecraft.server.MinecraftServer; import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.world.WorldEvent; +import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fmlserverevents.FMLServerStartedEvent; +import net.minecraftforge.fmlserverevents.FMLServerStartingEvent; import net.minecraftforge.fmlserverevents.FMLServerStoppingEvent; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -138,7 +140,7 @@ public class DrivePool { } } - @SubscribeEvent + @SubscribeEvent(priority = EventPriority.LOWEST) public static void onServerPostTick(TickEvent.ServerTickEvent event) { if (event.phase == TickEvent.Phase.END) { if (exception != null) { @@ -147,8 +149,8 @@ public class DrivePool { } } - @SubscribeEvent - public static void serverStartEvent(FMLServerStartedEvent event) { + @SubscribeEvent(priority = EventPriority.HIGHEST) + public static void serverStartEvent(FMLServerStartingEvent event) { if (thread != null && thread.isAlive()) { LOGGER.error("FMLServerStartedEvent fired twice."); LOGGER.error("Attempting to start another DrivePool I/O thread when already running one!"); @@ -166,7 +168,7 @@ public class DrivePool { thread.start(); } - @SubscribeEvent + @SubscribeEvent(priority = EventPriority.HIGHEST) public static void serverStopEvent(FMLServerStoppingEvent event) { if (thread != null && thread.isAlive()) { stopping = true; diff --git a/src/main/java/ru/dbotthepony/mc/otm/capability/matter/IMatterGridCell.java b/src/main/java/ru/dbotthepony/mc/otm/capability/matter/IMatterGridCell.java index ccd456e70..0dcf9d957 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/capability/matter/IMatterGridCell.java +++ b/src/main/java/ru/dbotthepony/mc/otm/capability/matter/IMatterGridCell.java @@ -7,6 +7,7 @@ import net.minecraft.core.SectionPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.chunk.LevelChunk; +import ru.dbotthepony.mc.otm.capability.MatteryCapability; import ru.dbotthepony.mc.otm.matter.MatterGrid; import javax.annotation.Nullable; @@ -68,19 +69,25 @@ public interface IMatterGridCell extends IMatterGridListener { BlockEntity get_entity = get_chunk.getBlockEntity(offset); - if (get_entity != this && get_entity instanceof IMatterGridCell cell) { - MatterGrid grid = cell.getMatterGrid(); + if (get_entity != null) { + final var cap = get_entity.getCapability(MatteryCapability.MATTER_CELL).resolve(); - if (grid != null && grid != getMatterGrid()) { - if (getMatterGrid() == null) { - grid.track(this); - } else { - grid.mergeWith(getMatterGrid()); + if (cap.isPresent()) { + final var cell = cap.get(); + + MatterGrid grid = cell.getMatterGrid(); + + if (grid != null && grid != getMatterGrid()) { + if (getMatterGrid() == null) { + grid.track(this); + } else { + grid.mergeWith(getMatterGrid()); + } } - } - if (cell.isValidMatterCell()) - onNeighbourMatterCell(pos, level, direction, cell); + if (cell.isValidMatterCell()) + onNeighbourMatterCell(pos, level, direction, cell); + } } } diff --git a/src/main/java/ru/dbotthepony/mc/otm/matter/MatterGrid.java b/src/main/java/ru/dbotthepony/mc/otm/matter/MatterGrid.java index a998a6440..6e151373f 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/matter/MatterGrid.java +++ b/src/main/java/ru/dbotthepony/mc/otm/matter/MatterGrid.java @@ -1,17 +1,22 @@ package ru.dbotthepony.mc.otm.matter; import com.google.common.collect.ImmutableList; +import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.Item; import net.minecraft.world.level.Level; import ru.dbotthepony.mc.otm.OverdriveThatMatters; import ru.dbotthepony.mc.otm.capability.matter.*; import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; import java.math.BigDecimal; import java.util.*; import java.util.function.Predicate; +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault public class MatterGrid implements IMatterGridListener { public static final Set NETWORKS = new HashSet<>(); @@ -19,7 +24,8 @@ public class MatterGrid implements IMatterGridListener { private final Set listeners = new HashSet<>(); public static void scheduleDiscoverNeighbours(IMatterGridCell cell, BlockPos pos, Level level) { - OverdriveThatMatters.tickUntil(level, () -> !cell.isValidMatterCell() || cell.connectOrCreateMatterGrid(pos, level, true)); + if (level instanceof ServerLevel) + OverdriveThatMatters.tickUntil(level, () -> !cell.isValidMatterCell() || cell.connectOrCreateMatterGrid(pos, level, true)); } public MatterGrid() { @@ -314,7 +320,6 @@ public class MatterGrid implements IMatterGridListener { return null; } - @Nullable public boolean notifyTaskCompletion(MatterTask task) { validate();