diff --git a/src/main/java/dan200/computercraft/core/filesystem/ResourceMount.java b/src/main/java/dan200/computercraft/core/filesystem/ResourceMount.java index bb7491e51..1017c24d2 100644 --- a/src/main/java/dan200/computercraft/core/filesystem/ResourceMount.java +++ b/src/main/java/dan200/computercraft/core/filesystem/ResourceMount.java @@ -12,12 +12,12 @@ import dan200.computercraft.ComputerCraft; import dan200.computercraft.api.filesystem.IMount; import dan200.computercraft.core.apis.handles.ArrayByteChannel; import dan200.computercraft.shared.util.IoUtil; +import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener; +import net.fabricmc.fabric.api.resource.SimpleResourceReloadListener; import net.minecraft.ResourceLocationException; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.resources.PreparableReloadListener; import net.minecraft.server.packs.resources.Resource; import net.minecraft.server.packs.resources.ResourceManager; -import net.minecraft.server.packs.resources.SimplePreparableReloadListener; import net.minecraft.util.profiling.ProfilerFiller; import javax.annotation.Nonnull; @@ -30,6 +30,8 @@ import java.nio.channels.ReadableByteChannel; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; import java.util.concurrent.TimeUnit; public final class ResourceMount implements IMount @@ -282,30 +284,37 @@ public final class ResourceMount implements IMount } /** - * A {@link PreparableReloadListener} which reloads any associated mounts and correctly updates the resource manager + * An {@link IdentifiableResourceReloadListener} which reloads any associated mounts and correctly updates the resource manager * they point to. */ - public static final SimplePreparableReloadListener RELOAD_LISTENER = new SimplePreparableReloadListener<>() + public static final IdentifiableResourceReloadListener RELOAD_LISTENER = new SimpleResourceReloadListener() { - @Nonnull @Override - protected Void prepare( @Nonnull ResourceManager manager, @Nonnull ProfilerFiller profiler ) + public ResourceLocation getFabricId() { - profiler.push( "Reloading ComputerCraft mounts" ); - try - { - for( ResourceMount mount : MOUNT_CACHE.values() ) mount.load( manager ); - } - finally - { - profiler.pop(); - } - return null; + return new ResourceLocation( ComputerCraft.MOD_ID, "resource_mount_reload_listener" ); } @Override - protected void apply( @Nonnull Void result, @Nonnull ResourceManager manager, @Nonnull ProfilerFiller profiler ) + public CompletableFuture load( ResourceManager manager, ProfilerFiller profiler, Executor executor ) { + return CompletableFuture.runAsync( () -> { + profiler.push( "Reloading ComputerCraft mounts" ); + try + { + for( ResourceMount mount : MOUNT_CACHE.values() ) mount.load( manager ); + } + finally + { + profiler.pop(); + } + }, executor ); + } + + @Override + public CompletableFuture apply( Void data, ResourceManager manager, ProfilerFiller profiler, Executor executor ) + { + return CompletableFuture.runAsync( () -> {}, executor ); } }; } diff --git a/src/main/java/dan200/computercraft/shared/proxy/ComputerCraftProxyCommon.java b/src/main/java/dan200/computercraft/shared/proxy/ComputerCraftProxyCommon.java index d04c517f7..e3f251d0a 100644 --- a/src/main/java/dan200/computercraft/shared/proxy/ComputerCraftProxyCommon.java +++ b/src/main/java/dan200/computercraft/shared/proxy/ComputerCraftProxyCommon.java @@ -11,6 +11,7 @@ import dan200.computercraft.api.media.IMedia; import dan200.computercraft.api.peripheral.IPeripheralTile; import dan200.computercraft.api.turtle.event.TurtleEvent; import dan200.computercraft.core.computer.MainThread; +import dan200.computercraft.core.filesystem.ResourceMount; import dan200.computercraft.core.tracking.Tracking; import dan200.computercraft.shared.TurtlePermissions; import dan200.computercraft.shared.command.CommandComputerCraft; @@ -34,9 +35,11 @@ import net.fabricmc.fabric.api.event.lifecycle.v1.ServerBlockEntityEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents; +import net.fabricmc.fabric.api.resource.ResourceManagerHelper; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.packs.PackType; import net.minecraft.world.item.Item; import net.minecraft.world.item.RecordItem; import net.minecraft.world.level.block.entity.BlockEntity; @@ -137,6 +140,8 @@ public final class ComputerCraftProxyCommon TurtleEvent.EVENT_BUS.register( FurnaceRefuelHandler.INSTANCE ); TurtleEvent.EVENT_BUS.register( new TurtlePermissions() ); + + ResourceManagerHelper.get( PackType.SERVER_DATA ).registerReloadListener( ResourceMount.RELOAD_LISTENER ); } public static void registerLoot()