diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/AsyncResourcePackCacheEvent.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/AsyncResourcePackCacheEvent.java new file mode 100644 index 000000000..56776f611 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/AsyncResourcePackCacheEvent.java @@ -0,0 +1,31 @@ +package net.momirealms.craftengine.bukkit.api.event; + +import net.momirealms.craftengine.core.pack.PackCacheData; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +public class AsyncResourcePackCacheEvent extends Event { + private static final HandlerList HANDLER_LIST = new HandlerList(); + private final PackCacheData cacheData; + + public AsyncResourcePackCacheEvent(@NotNull PackCacheData cacheData) { + super(true); + this.cacheData = cacheData; + } + + @NotNull + public PackCacheData cacheData() { + return cacheData; + } + + @NotNull + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } + + @NotNull + public HandlerList getHandlers() { + return getHandlerList(); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java index 5b2e36c6b..823071d54 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.bukkit.pack; import net.momirealms.craftengine.bukkit.api.BukkitAdaptors; +import net.momirealms.craftengine.bukkit.api.event.AsyncResourcePackCacheEvent; import net.momirealms.craftengine.bukkit.api.event.AsyncResourcePackGenerateEvent; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.command.feature.ReloadCommand; @@ -28,10 +29,17 @@ public class BukkitPackManager extends AbstractPackManager implements Listener { private final BukkitCraftEngine plugin; public BukkitPackManager(BukkitCraftEngine plugin) { - super(plugin, (rf, zp) -> { - AsyncResourcePackGenerateEvent endEvent = new AsyncResourcePackGenerateEvent(rf, zp); - EventUtils.fireAndForget(endEvent); - }); + super( + plugin, + (cd) -> { + AsyncResourcePackCacheEvent cacheEvent = new AsyncResourcePackCacheEvent(cd); + EventUtils.fireAndForget(cacheEvent); + }, + (rf, zp) -> { + AsyncResourcePackGenerateEvent endEvent = new AsyncResourcePackGenerateEvent(rf, zp); + EventUtils.fireAndForget(endEvent); + } + ); this.plugin = plugin; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java index a080cae06..db2c41535 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java @@ -85,6 +85,7 @@ public abstract class AbstractPackManager implements PackManager { } private final CraftEngine plugin; + private final Consumer cacheEventDispatcher; private final BiConsumer eventDispatcher; private final Map loadedPacks = new HashMap<>(); private final Map sectionParsers = new HashMap<>(); @@ -94,8 +95,9 @@ public abstract class AbstractPackManager implements PackManager { protected BiConsumer zipGenerator; protected ResourcePackHost resourcePackHost; - public AbstractPackManager(CraftEngine plugin, BiConsumer eventDispatcher) { + public AbstractPackManager(CraftEngine plugin, Consumer cacheEventDispatcher, BiConsumer eventDispatcher) { this.plugin = plugin; + this.cacheEventDispatcher = cacheEventDispatcher; this.eventDispatcher = eventDispatcher; this.zipGenerator = (p1, p2) -> {}; Path resourcesFolder = this.plugin.dataFolderPath().resolve("resources"); @@ -267,7 +269,9 @@ public abstract class AbstractPackManager implements PackManager { @Override public void initCachedAssets() { try { - this.updateCachedAssets(null); + PackCacheData cacheData = new PackCacheData(plugin); + this.cacheEventDispatcher.accept(cacheData); + this.updateCachedAssets(cacheData, null); } catch (Exception e) { this.plugin.logger().warn("Failed to update cached assets", e); } @@ -658,11 +662,15 @@ public abstract class AbstractPackManager implements PackManager { this.plugin.logger().info("Generating resource pack..."); long time1 = System.currentTimeMillis(); + // Create cache data + PackCacheData cacheData = new PackCacheData(plugin); + this.cacheEventDispatcher.accept(cacheData); + // get the target location try (FileSystem fs = Jimfs.newFileSystem(Configuration.forCurrentPlatform())) { // firstly merge existing folders Path generatedPackPath = fs.getPath("resource_pack"); - List>> duplicated = this.updateCachedAssets(fs); + List>> duplicated = this.updateCachedAssets(cacheData, fs); if (!duplicated.isEmpty()) { plugin.logger().severe(AdventureHelper.miniMessage().stripTags(TranslationManager.instance().miniMessageTranslation("warning.config.pack.duplicated_files"))); int x = 1; @@ -2136,7 +2144,7 @@ public abstract class AbstractPackManager implements PackManager { } } - private List>> updateCachedAssets(@Nullable FileSystem fs) throws IOException { + private List>> updateCachedAssets(@NotNull PackCacheData generateData, @Nullable FileSystem fs) throws IOException { Map> conflictChecker = new Object2ObjectOpenHashMap<>(Math.max(128, this.cachedAssetFiles.size())); Map previousFiles = this.cachedAssetFiles; this.cachedAssetFiles = new Object2ObjectOpenHashMap<>(Math.max(128, this.cachedAssetFiles.size())); @@ -2146,10 +2154,7 @@ public abstract class AbstractPackManager implements PackManager { .filter(Pack::enabled) .map(Pack::resourcePackFolder) .toList()); - folders.addAll(Config.foldersToMerge().stream() - .map(it -> this.plugin.dataFolderPath().getParent().resolve(it)) - .filter(Files::exists) - .toList()); + folders.addAll(generateData.externalFolders()); for (Path sourceFolder : folders) { if (Files.exists(sourceFolder)) { Files.walkFileTree(sourceFolder, EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE, new SimpleFileVisitor<>() { @@ -2161,13 +2166,7 @@ public abstract class AbstractPackManager implements PackManager { }); } } - List externalZips = Config.zipsToMerge().stream() - .map(it -> this.plugin.dataFolderPath().getParent().resolve(it)) - .filter(Files::exists) - .filter(Files::isRegularFile) - .filter(file -> file.getFileName().toString().endsWith(".zip")) - .toList(); - for (Path zip : externalZips) { + for (Path zip : generateData.externalZips()) { processZipFile(zip, zip.getParent(), fs, conflictChecker, previousFiles); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/PackCacheData.java b/core/src/main/java/net/momirealms/craftengine/core/pack/PackCacheData.java new file mode 100644 index 000000000..11a5379c6 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/PackCacheData.java @@ -0,0 +1,39 @@ +package net.momirealms.craftengine.core.pack; + +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.config.Config; +import org.jetbrains.annotations.NotNull; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Set; +import java.util.stream.Collectors; + +public class PackCacheData { + + private final Set externalZips; + private final Set externalFolders; + + PackCacheData(@NotNull CraftEngine plugin) { + externalFolders = Config.foldersToMerge().stream() + .map(it -> plugin.dataFolderPath().getParent().resolve(it)) + .filter(Files::exists) + .collect(Collectors.toSet()); + externalZips = Config.zipsToMerge().stream() + .map(it -> plugin.dataFolderPath().getParent().resolve(it)) + .filter(Files::exists) + .filter(Files::isRegularFile) + .filter(file -> file.getFileName().toString().endsWith(".zip")) + .collect(Collectors.toSet()); + } + + @NotNull + public Set externalFolders() { + return externalFolders; + } + + @NotNull + public Set externalZips() { + return externalZips; + } +}