9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-25 09:59:20 +00:00

feat: make AsyncResourcePackCacheEvent

This commit is contained in:
Yang Seong Mo
2025-09-06 18:53:15 +09:00
parent 7b5d3edc72
commit 66fd22ff49
4 changed files with 96 additions and 19 deletions

View File

@@ -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();
}
}

View File

@@ -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;
}

View File

@@ -85,6 +85,7 @@ public abstract class AbstractPackManager implements PackManager {
}
private final CraftEngine plugin;
private final Consumer<PackCacheData> cacheEventDispatcher;
private final BiConsumer<Path, Path> eventDispatcher;
private final Map<String, Pack> loadedPacks = new HashMap<>();
private final Map<String, ConfigParser> sectionParsers = new HashMap<>();
@@ -94,8 +95,9 @@ public abstract class AbstractPackManager implements PackManager {
protected BiConsumer<Path, Path> zipGenerator;
protected ResourcePackHost resourcePackHost;
public AbstractPackManager(CraftEngine plugin, BiConsumer<Path, Path> eventDispatcher) {
public AbstractPackManager(CraftEngine plugin, Consumer<PackCacheData> cacheEventDispatcher, BiConsumer<Path, Path> 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<Pair<String, List<Path>>> duplicated = this.updateCachedAssets(fs);
List<Pair<String, List<Path>>> 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<Pair<String, List<Path>>> updateCachedAssets(@Nullable FileSystem fs) throws IOException {
private List<Pair<String, List<Path>>> updateCachedAssets(@NotNull PackCacheData generateData, @Nullable FileSystem fs) throws IOException {
Map<String, List<Path>> conflictChecker = new Object2ObjectOpenHashMap<>(Math.max(128, this.cachedAssetFiles.size()));
Map<Path, CachedAssetFile> 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<Path> 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);
}

View File

@@ -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<Path> externalZips;
private final Set<Path> 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<Path> externalFolders() {
return externalFolders;
}
@NotNull
public Set<Path> externalZips() {
return externalZips;
}
}