Fix broken recipe caching

This commit is contained in:
thedarkcolour 2026-05-15 11:21:14 -07:00
parent 964c82b709
commit 5c913be4b6
2 changed files with 40 additions and 13 deletions

View File

@ -27,10 +27,12 @@ import net.minecraft.world.level.levelgen.presets.WorldPreset;
import net.neoforged.bus.api.IEventBus; import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.ModList; import net.neoforged.fml.ModList;
import net.neoforged.fml.event.config.ModConfigEvent; import net.neoforged.fml.event.config.ModConfigEvent;
import net.neoforged.fml.loading.FMLEnvironment;
import net.neoforged.neoforge.client.event.*; import net.neoforged.neoforge.client.event.*;
import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsEvent; import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsEvent;
import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.common.NeoForge;
import net.minecraft.server.packs.resources.ResourceManagerReloadListener; import net.minecraft.server.packs.resources.ResourceManagerReloadListener;
import net.neoforged.neoforge.server.ServerLifecycleHooks;
import thedarkcolour.exdeorum.ExDeorum; import thedarkcolour.exdeorum.ExDeorum;
import thedarkcolour.exdeorum.asm.ASMHooks; import thedarkcolour.exdeorum.asm.ASMHooks;
import thedarkcolour.exdeorum.client.screen.MechanicalHammerScreen; import thedarkcolour.exdeorum.client.screen.MechanicalHammerScreen;
@ -121,7 +123,9 @@ public class ClientHandler {
} }
private static void onRecipesReceived(RecipesReceivedEvent event) { private static void onRecipesReceived(RecipesReceivedEvent event) {
RecipeUtil.reload(event.getRecipeMap()); if (ServerLifecycleHooks.getCurrentServer() == null) {
RecipeUtil.reload(event.getRecipeMap());
}
} }
public static void disableVoidFogRendering() { public static void disableVoidFogRendering() {

View File

@ -33,6 +33,7 @@ import net.minecraft.util.RandomSource;
import net.minecraft.util.Unit; import net.minecraft.util.Unit;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items; import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.level.gamerules.GameRules; import net.minecraft.world.level.gamerules.GameRules;
import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
@ -50,15 +51,17 @@ import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent;
import net.neoforged.neoforge.client.event.ClientChatEvent; import net.neoforged.neoforge.client.event.ClientChatEvent;
import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.common.NeoForgeMod; import net.neoforged.neoforge.common.NeoForgeMod;
import net.neoforged.neoforge.event.AddServerReloadListenersEvent; import net.neoforged.neoforge.event.OnDatapackSyncEvent;
import net.neoforged.neoforge.event.TagsUpdatedEvent;
import net.neoforged.neoforge.event.entity.player.PlayerEvent; import net.neoforged.neoforge.event.entity.player.PlayerEvent;
import net.neoforged.neoforge.event.level.LevelEvent; import net.neoforged.neoforge.event.level.LevelEvent;
import net.neoforged.neoforge.event.server.ServerStartedEvent;
import net.neoforged.neoforge.event.server.ServerStoppingEvent; import net.neoforged.neoforge.event.server.ServerStoppingEvent;
import net.neoforged.neoforge.event.tick.ServerTickEvent; import net.neoforged.neoforge.event.tick.ServerTickEvent;
import net.neoforged.neoforge.fluids.FluidInteractionRegistry; import net.neoforged.neoforge.fluids.FluidInteractionRegistry;
import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent;
import net.minecraft.server.packs.resources.ResourceManagerReloadListener; import net.neoforged.neoforge.registries.DeferredHolder;
import net.neoforged.neoforge.resource.VanillaServerListeners; import net.neoforged.neoforge.server.ServerLifecycleHooks;
import thedarkcolour.exdeorum.ExDeorum; import thedarkcolour.exdeorum.ExDeorum;
import thedarkcolour.exdeorum.blockentity.AbstractCrucibleBlockEntity; import thedarkcolour.exdeorum.blockentity.AbstractCrucibleBlockEntity;
import thedarkcolour.exdeorum.blockentity.AbstractMachineBlockEntity; import thedarkcolour.exdeorum.blockentity.AbstractMachineBlockEntity;
@ -76,6 +79,7 @@ import thedarkcolour.exdeorum.recipe.RecipeUtil;
import thedarkcolour.exdeorum.registry.EBlockEntities; import thedarkcolour.exdeorum.registry.EBlockEntities;
import thedarkcolour.exdeorum.registry.EFluids; import thedarkcolour.exdeorum.registry.EFluids;
import thedarkcolour.exdeorum.registry.EItems; import thedarkcolour.exdeorum.registry.EItems;
import thedarkcolour.exdeorum.registry.ERecipeTypes;
import thedarkcolour.exdeorum.tag.EBiomeTags; import thedarkcolour.exdeorum.tag.EBiomeTags;
import thedarkcolour.exdeorum.transfer.LegacyEnergyStorageTransfer; import thedarkcolour.exdeorum.transfer.LegacyEnergyStorageTransfer;
import thedarkcolour.exdeorum.transfer.LegacyFluidItemAccessTransfer; import thedarkcolour.exdeorum.transfer.LegacyFluidItemAccessTransfer;
@ -86,12 +90,16 @@ import thedarkcolour.exdeorum.voidworld.VoidChunkGenerator;
import java.util.Locale; import java.util.Locale;
public final class EventHandler { public final class EventHandler {
private static boolean reloadRecipesNextTick;
public static void register(IEventBus modBus) { public static void register(IEventBus modBus) {
var fmlBus = NeoForge.EVENT_BUS; var fmlBus = NeoForge.EVENT_BUS;
fmlBus.addListener(EventHandler::onPlayerLogin); fmlBus.addListener(EventHandler::onPlayerLogin);
fmlBus.addListener(EventHandler::addReloadListeners);
fmlBus.addListener(EventHandler::createSpawnTree); fmlBus.addListener(EventHandler::createSpawnTree);
fmlBus.addListener(EventHandler::serverStarted);
fmlBus.addListener(EventHandler::tagsUpdated);
fmlBus.addListener(EventHandler::onDataPackSync);
modBus.addListener(EventHandler::interModEnqueue); modBus.addListener(EventHandler::interModEnqueue);
modBus.addListener(EventHandler::onCommonSetup); modBus.addListener(EventHandler::onCommonSetup);
modBus.addListener(EventHandler::registerPayloadHandler); modBus.addListener(EventHandler::registerPayloadHandler);
@ -105,9 +113,26 @@ public final class EventHandler {
} }
private static void serverShutdown(ServerStoppingEvent event) { private static void serverShutdown(ServerStoppingEvent event) {
reloadRecipesNextTick = false;
RecipeUtil.unload(); RecipeUtil.unload();
} }
private static void serverStarted(ServerStartedEvent event) {
reloadRecipesNextTick = false;
RecipeUtil.reload(event.getServer().getRecipeManager().recipeMap());
}
private static void tagsUpdated(TagsUpdatedEvent event) {
if (event.getUpdateCause() == TagsUpdatedEvent.UpdateCause.SERVER_DATA_LOAD && ServerLifecycleHooks.getCurrentServer() != null) {
reloadRecipesNextTick = true;
}
}
private static void onDataPackSync(OnDatapackSyncEvent event) {
// sync all recipes
event.sendRecipes(ERecipeTypes.RECIPE_TYPES.getEntries().stream().map(DeferredHolder::get).toArray(RecipeType[]::new));
}
private static void handleDebugCommands(ClientChatEvent event) { private static void handleDebugCommands(ClientChatEvent event) {
if (event.getMessage().equals(".compost_colors")) { if (event.getMessage().equals(".compost_colors")) {
event.setCanceled(true); event.setCanceled(true);
@ -198,7 +223,7 @@ public final class EventHandler {
private static void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) { private static void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) {
if (event.getEntity() instanceof ServerPlayer player) { if (event.getEntity() instanceof ServerPlayer player) {
var generator = ((ServerLevel) player.level()).getChunkSource().getGenerator(); var generator = player.level().getChunkSource().getGenerator();
// tries to account for other SkyBlock generator mods like SkyBlockBuilder // tries to account for other SkyBlock generator mods like SkyBlockBuilder
if (generator instanceof VoidChunkGenerator || generator.getClass().getName().toLowerCase(Locale.ROOT).contains("skyblock")) { if (generator instanceof VoidChunkGenerator || generator.getClass().getName().toLowerCase(Locale.ROOT).contains("skyblock")) {
@ -233,14 +258,12 @@ public final class EventHandler {
} }
} }
private static void addReloadListeners(AddServerReloadListenersEvent event) {
var recipeManager = event.getServerResources().getRecipeManager();
var listenerId = ExDeorum.loc("recipes");
event.addListener(listenerId, (ResourceManagerReloadListener) resourceManager -> RecipeUtil.reload(recipeManager.recipeMap()));
event.addDependency(listenerId, VanillaServerListeners.RECIPES);
}
private static void serverTick(ServerTickEvent.Post event) { private static void serverTick(ServerTickEvent.Post event) {
if (reloadRecipesNextTick) {
reloadRecipesNextTick = false;
RecipeUtil.reload(event.getServer().getRecipeManager().recipeMap());
}
VisualUpdateTracker.syncVisualUpdates(event.getServer()); VisualUpdateTracker.syncVisualUpdates(event.getServer());
} }