AssetModule class
Пакет: com.hypixel.hytale.server.core.asset
Файл: com/hypixel/hytale/server/core/asset/AssetModule.java
extends: JavaPlugin
Поля (77)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
PluginManifest |
MANIFEST |
|
|
break |
|
|
break |
|
|
break |
|
|
instance |
|
|
return |
|
|
return |
|
|
return |
|
|
return |
|
long |
var1 |
|
Message |
var10 |
|
String |
var10 |
|
AssetPack |
var11 |
|
List |
var11 |
|
ArrayList |
var12 |
|
Message |
var13 |
|
Path |
var15 |
|
String |
var16 |
|
Path |
var17 |
|
char[] |
var19 |
|
PlayerRef |
var2 |
|
StringBuilder |
var2 |
|
AssetPack |
var2 |
|
String |
var2 |
|
AssetPack |
var2 |
|
HashMap |
var2 |
|
AssetStore |
var2 |
|
List |
var2 |
|
RawJsonReader |
var20 |
|
ExtraInfo |
var21 |
|
PluginManifest |
var22 |
|
StringBuilder |
var3 |
|
AssetStore[] |
var3 |
|
PluginManifest |
var3 |
|
|
var3 |
|
String |
var3 |
|
AssetLoadResult |
var3 |
|
IWorldGenProvider |
var3 |
|
String |
var4 |
|
Path |
var4 |
|
PluginIdentifier |
var4 |
|
IWorldGen |
var4 |
|
Message |
var5 |
|
AssetStore |
var5 |
|
Path |
var5 |
|
String |
var5 |
|
AssetPack |
var5 |
|
Path |
var5 |
|
boolean |
var5 |
|
PluginManifest |
var6 |
|
String |
var6 |
|
char[] |
var6 |
|
AssetPack.PackSource |
var6 |
|
Path |
var6 |
|
|
var6 |
|
Path |
var6 |
|
String |
var6 |
|
IWorldMap |
var6 |
|
SemverRange |
var7 |
|
int |
var7 |
|
RawJsonReader |
var7 |
|
HytaleServerConfig |
var7 |
|
Path |
var7 |
|
Path |
var7 |
|
PluginManifest.ServerVersionCheck |
var8 |
|
ExtraInfo |
var8 |
|
ModConfig |
var8 |
|
FileSystem |
var8 |
|
|
var8 |
|
AssetLoadResult |
var8 |
|
PluginManifest |
var9 |
|
boolean |
var9 |
|
|
var9 |
|
|
var9 |
|
boolean |
var9 |
|
|
var9 |
|
|
var9 |
Методы (48)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
abstract |
throw new |
IllegalStateExceptionthrow new IllegalStateException("unreachable") |
abstract |
throw new |
IllegalStateExceptionthrow new IllegalStateException("LoadAssetEvent has already been dispatched") |
abstract |
throw new |
IllegalStateExceptionthrow new IllegalStateException("Failed to calculate asset pack load order", var9) |
|
|
for for(AssetPack var18 : this.assetPacks) |
|
|
for for(String var5 : var12) |
|
|
for for(int var4 = var3.length - 1; var4 >= 0; var4--) |
|
|
for for(AssetPack var2 : this.assetPacks) |
|
|
for for(AssetPack var3 : this.assetPacks) |
|
|
for for(AssetPack var4 : this.assetPacks) |
|
|
for for(Path var4 : var2) |
|
|
for for(AssetPack var4 : this.assetPacks) |
|
|
for for(AssetPack var5 : this.assetPacks) |
|
|
for for(AssetPack var3 : this.assetPacks) |
|
|
for for(AssetPack var5 : this.assetPacks) |
|
|
for for(AssetPack var4 : this.assetPacks) |
abstract |
|
for for(int var1 = 0; var1 < this.pendingAssetStores.size() |
static |
AssetModule |
getAssetModule get() |
public |
AssetPack |
getAssetPackAssetPack getAssetPack(@Nonnull String var1) |
|
|
if if(var8 != PluginManifest.ServerVersionCheck.COMPATIBLE) |
|
|
if if(this.assetMonitor != null) |
|
|
if if(var3 == null) |
|
|
if if(var9) |
|
|
if if(var5 != null) |
|
|
if if(!this.hasLoaded) |
|
|
if if(var2 == null) |
|
|
if if(this.hasLoaded) |
|
|
if if(var3 != null) |
|
|
if if(AssetRegistry.HAS_INIT) |
|
|
if if(var6 != null) |
|
|
if if(var6 != null) |
|
|
if if(var4 instanceof ValidatableWorldGen) |
|
|
if if(!var5) |
|
|
if if(var4 instanceof IWorldMapProvider var9) |
public |
void |
initPendingStoresvoid initPendingStores() |
private |
void |
initStorevoid initStore(@Nonnull AssetStore<?, ?, ?> var1) |
public |
boolean |
isAssetPathImmutableboolean isAssetPathImmutable(@Nonnull Path var1) |
public |
boolean |
isWithinPackSubDirboolean isWithinPackSubDir(@Nonnull Path var1, @Nonnull String var2) |
private |
void |
loadAllAssetPacksvoid loadAllAssetPacks(LoadAssetEvent var1) |
private |
void |
loadAndRegisterPackvoid loadAndRegisterPack(Path var1, boolean var2) |
private |
void |
loadPacksFromDirectoryvoid loadPacksFromDirectory(Path var1) |
private |
void |
onNewStorevoid onNewStore(@Nonnull RegisterAssetStoreEvent var1) |
private |
void |
onRemoveStorevoid onRemoveStore(@Nonnull RemoveAssetStoreEvent var1) |
public |
boolean |
registerPackboolean registerPack(@Nonnull String var1, @Nonnull Path var2, @Nonnull PluginManifest var3, @Nonnull AssetPack.PackSource var4) |
abstract |
|
super super(var1) |
|
|
switch switch(var8) |
public |
void |
unregisterPackvoid unregisterPack(@Nonnull String var1) |
public |
boolean |
validatePackExistsOnDiskboolean validatePackExistsOnDisk(@Nonnull AssetPack var1) |
static |
void |
validateWorldGenvoid validateWorldGen(@Nonnull LoadAssetEvent var0) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.asset;
class="kw">import com.hypixel.hytale.assetstore.AssetLoadResult;
class="kw">import com.hypixel.hytale.assetstore.AssetMap;
class="kw">import com.hypixel.hytale.assetstore.AssetPack;
class="kw">import com.hypixel.hytale.assetstore.AssetRegistry;
class="kw">import com.hypixel.hytale.assetstore.AssetStore;
class="kw">import com.hypixel.hytale.assetstore.event.RegisterAssetStoreEvent;
class="kw">import com.hypixel.hytale.assetstore.event.RemoveAssetStoreEvent;
class="kw">import com.hypixel.hytale.assetstore.map.JsonAssetWithMap;
class="kw">import com.hypixel.hytale.codec.ExtraInfo;
class="kw">import com.hypixel.hytale.codec.util.RawJsonReader;
class="kw">import com.hypixel.hytale.common.plugin.Mod;
class="kw">import com.hypixel.hytale.common.plugin.ModLoadOrderException;
class="kw">import com.hypixel.hytale.common.plugin.PluginIdentifier;
class="kw">import com.hypixel.hytale.common.plugin.PluginManifest;
class="kw">import com.hypixel.hytale.common.semver.SemverRange;
class="kw">import com.hypixel.hytale.common.util.FormatUtil;
class="kw">import com.hypixel.hytale.common.util.PathUtil;
class="kw">import com.hypixel.hytale.common.util.java.ManifestUtil;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.logger.sentry.SkipSentryException;
class="kw">import com.hypixel.hytale.server.core.HytaleServer;
class="kw">import com.hypixel.hytale.server.core.HytaleServerConfig;
class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.Options;
class="kw">import com.hypixel.hytale.server.core.ShutdownReason;
class="kw">import com.hypixel.hytale.server.core.asset.monitor.AssetMonitor;
class="kw">import com.hypixel.hytale.server.core.asset.type.gameplay.respawn.HomeOrSpawnPoint;
class="kw">import com.hypixel.hytale.server.core.asset.type.gameplay.respawn.RespawnController;
class="kw">import com.hypixel.hytale.server.core.asset.type.gameplay.respawn.WorldSpawnPoint;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.DroplistCommand;
class="kw">import com.hypixel.hytale.server.core.config.ModConfig;
class="kw">import com.hypixel.hytale.server.core.event.events.BootEvent;
class="kw">import com.hypixel.hytale.server.core.event.events.player.AddPlayerToWorldEvent;
class="kw">import com.hypixel.hytale.server.core.permissions.HytalePermissions;
class="kw">import com.hypixel.hytale.server.core.plugin.JavaPlugin;
class="kw">import com.hypixel.hytale.server.core.plugin.JavaPluginInit;
class="kw">import com.hypixel.hytale.server.core.plugin.PluginManager;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldgen.IWorldGen;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldgen.ValidatableWorldGen;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldgen.WorldGenLoadException;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldgen.provider.IWorldGenProvider;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldmap.IWorldMap;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldmap.provider.IWorldMapProvider;
class="kw">import com.hypixel.hytale.sneakythrow.SneakyThrow;
class="kw">import java.awt.Color;
class="kw">import java.io.BufferedReader;
class="kw">import java.io.FileReader;
class="kw">import java.io.IOException;
class="kw">import java.nio.charset.StandardCharsets;
class="kw">import java.nio.file.DirectoryStream;
class="kw">import java.nio.file.FileSystem;
class="kw">import java.nio.file.FileSystems;
class="kw">import java.nio.file.Files;
class="kw">import java.nio.file.Path;
class="kw">import java.util.ArrayList;
class="kw">import java.util.Arrays;
class="kw">import java.util.Comparator;
class="kw">import java.util.HashMap;
class="kw">import java.util.List;
class="kw">import java.util.Locale;
class="kw">import java.util.Set;
class="kw">import java.util.concurrent.ConcurrentHashMap;
class="kw">import java.util.concurrent.CopyOnWriteArrayList;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">public class AssetModule class="kw">extends JavaPlugin {
class="kw">public class="kw">static class="kw">final PluginManifest MANIFEST = PluginManifest.corePlugin(AssetModule.class).build();
class="kw">private class="kw">static AssetModule instance;
@Nullable
class="kw">private AssetMonitor assetMonitor;
@Nonnull
class="kw">private List<AssetPack> assetPacks = new CopyOnWriteArrayList<>();
class="kw">private boolean hasLoaded = false;
class="kw">private class="kw">final List<AssetStore<?, ?, ?>> pendingAssetStores = new CopyOnWriteArrayList<>();
class="kw">private class="kw">final Set<String> missingPackWarnings = ConcurrentHashMap.newKeySet();
class="kw">public class="kw">static AssetModule get() {
class="kw">return instance;
}
class="kw">public AssetModule(@Nonnull JavaPluginInit var1) {
super(var1);
instance = this;
}
@Override
class="kw">protected void setup() {
if (Options.getOptionSet().has(Options.DISABLE_FILE_WATCHER)) {
this.getLogger().at(Level.WARNING).log("Not running asset watcher because --disable-file-watcher was set");
} else {
try {
this.assetMonitor = new AssetMonitor();
this.getLogger().at(Level.INFO).log("Asset monitor enabled!");
} catch (IOException var9) {
((HytaleLogger.Api)this.getLogger().at(Level.SEVERE).withCause(var9)).log("Failed to create asset monitor!");
}
}
for (Path var3 : Options.getOptionSet().valuesOf(Options.ASSET_DIRECTORY)) {
this.loadAndRegisterPack(var3, false);
}
for (PluginManager.ClasspathAssetPack var14 : PluginManager.get().consumeClasspathAssetPacks()) {
String var4 = new PluginIdentifier(var14.manifest()).toString();
if (!this.registerPack(var4, var14.path(), var14.manifest(), AssetPack.PackSource.CLASSPATH)) {
Message var5 = Message.translation("client.disconnection.shutdownReason.packDuplicate").param("pack", var4);
HytaleServer.get().shutdownServer(ShutdownReason.MOD_ERROR.withMessage(var5));
class="kw">return;
}
}
this.loadPacksFromDirectory(PluginManager.MODS_PATH);
for (Path var15 : Options.getOptionSet().valuesOf(Options.MODS_DIRECTORIES)) {
this.loadPacksFromDirectory(var15);
}
if (this.assetPacks.isEmpty()) {
Message var13 = Message.translation("client.disconnection.shutdownReason.missingAssets.failedToLoad");
HytaleServer.get().shutdownServer(ShutdownReason.MISSING_ASSETS.withMessage(var13));
} else {
ArrayList var12 = new ArrayList<>();
String var16 = ManifestUtil.getVersion();
for (AssetPack var18 : this.assetPacks) {
if (!var18.getName().equals("Hytale:Hytale")) {
PluginManifest var6 = var18.getManifest();
SemverRange var7 = var6.getServerVersion();
PluginManifest.ServerVersionCheck var8 = PluginManifest.checkServerVersionCompatibility(var7, var16);
if (var8 != PluginManifest.ServerVersionCheck.COMPATIBLE) {
var12.add(var18.getName());
class="kw">switch (var8) {
case MISSING:
this.getLogger()
.at(Level.WARNING)
.log(
"Plugin '%s' does not specify a target server version. You may encounter issues, please check for plugin updates. This will be a hard error in the future",
var18.getName()
);
break;
case PARSE_FAILED:
this.getLogger()
.at(Level.WARNING)
.log(
"Plugin '%s' targets server version range '%s' but the running server version '%s' could not be parsed.",
var18.getName(),
var7,
var16
);
break;
case INCOMPATIBLE:
this.getLogger()
.at(Level.WARNING)
.log(
"Plugin '%s' targets server version range '%s' which does not match the running server version '%s'. You may encounter issues, please check for plugin updates.",
var18.getName(),
var7,
var16
);
break;
case COMPATIBLE:
throw new IllegalStateException("unreachable");
}
}
}
}
if (!var12.isEmpty() && System.getProperty("hytale.allow_outdated_mods") == null) {
this.getLogger()
.at(Level.SEVERE)
.log("One or more asset packs are targeting an older server version. It is recommended to update these plugins to ensure compatibility.");
HytaleServer.get()
.getEventBus()
.registerGlobal(
AddPlayerToWorldEvent.class,
var1 -> {
PlayerRef var2 = var1.getHolder().getComponent(PlayerRef.getComponentType());
if (var2 != null && var2.hasPermission(HytalePermissions.MODS_OUTDATED_NOTIFY)) {
StringBuilder var3 = new StringBuilder();
for (String var5 : var12) {
var3.append("\n - ").append(var5);
}
var2.sendMessage(
Message.translation("server.assetModule.outOfDatePacks")
.param("count", var12.size())
.param("mods", var3.toString())
.color(Color.RED)
);
}
}
);
}
this.getEventRegistry().register((short)-16, LoadAssetEvent.class, this::loadAllAssetPacks);
this.getEventRegistry().register((short)-16, AssetPackRegisterEvent.class, var0 -> AssetRegistryLoader.loadAssets(null, var0.getAssetPack()));
this.getEventRegistry().register(AssetPackUnregisterEvent.class, var0 -> {
for (AssetStore var2 : AssetRegistry.getStoreMap().values()) {
var2.removeAssetPack(var0.getAssetPack().getName());
}
});
this.getEventRegistry().register(LoadAssetEvent.class, AssetModule::validateWorldGen);
this.getEventRegistry().register(RegisterAssetStoreEvent.class, this::onNewStore);
this.getEventRegistry().register(RemoveAssetStoreEvent.class, this::onRemoveStore);
this.getEventRegistry().registerGlobal(BootEvent.class, var1 -> {
StringBuilder var2 = new StringBuilder("Total Loaded Assets: ");
AssetStore[] var3 = AssetRegistry.getStoreMap().values().toArray(AssetStore[]::new);
Arrays.sort(var3, Comparator.comparingInt(var0 -> var0.getAssetMap().getAssetCount()));
for (int var4 = var3.length - 1; var4 >= 0; var4--) {
AssetStore var5 = var3[var4];
String var6 = var5.getAssetClass().getSimpleName();
int var7 = var5.getAssetMap().getAssetCount();
var2.append(var6).append(": ").append(var7).append(", ");
}
var2.setLength(var2.length() - 2);
this.getLogger().at(Level.INFO).log("%s", var2.toString());
});
RespawnController.CODEC.register("HomeOrSpawnPoint", HomeOrSpawnPoint.class, HomeOrSpawnPoint.CODEC);
RespawnController.CODEC.register("WorldSpawnPoint", WorldSpawnPoint.class, WorldSpawnPoint.CODEC);
this.getCommandRegistry().registerCommand(new DroplistCommand());
}
}
@Override
class="kw">protected void shutdown() {
if (this.assetMonitor != null) {
this.assetMonitor.shutdown();
this.assetMonitor = null;
}
for (AssetPack var2 : this.assetPacks) {
if (var2.getFileSystem() != null) {
try {
var2.getFileSystem().close();
} catch (IOException var4) {
((HytaleLogger.Api)this.getLogger().at(Level.WARNING).withCause(var4)).log("Failed to close asset pack filesystem: %s", var2.getName());
}
}
}
this.assetPacks.clear();
}
@Nonnull
class="kw">public AssetPack getBaseAssetPack() {
class="kw">return this.assetPacks.getFirst();
}
@Nonnull
class="kw">public List<AssetPack> getAssetPacks() {
class="kw">return this.assetPacks;
}
@Nullable
class="kw">public AssetMonitor getAssetMonitor() {
class="kw">return this.assetMonitor;
}
@Nullable
class="kw">public AssetPack findAssetPackForPath(Path var1) {
for (AssetPack var3 : this.assetPacks) {
if (var3.contains(var1)) {
class="kw">return var3;
}
}
class="kw">return null;
}
class="kw">public boolean isWithinPackSubDir(@Nonnull Path var1, @Nonnull String var2) {
for (AssetPack var4 : this.assetPacks) {
Path var5 = var4.getRoot().resolve(var2);
if (PathUtil.isChildOf(var5, var1)) {
class="kw">return true;
}
}
class="kw">return false;
}
class="kw">public boolean isAssetPathImmutable(@Nonnull Path var1) {
AssetPack var2 = this.findAssetPackForPath(var1);
class="kw">return var2 != null && var2.isImmutable();
}
@Nullable
class="kw">private PluginManifest loadPackManifest(Path var1) class="kw">throws IOException {
String var2 = var1.getFileName().toString().toLowerCase(Locale.ROOT);
if (!var2.endsWith(".zip") && !var2.endsWith(".jar")) {
if (Files.isDirectory(var1)) {
Path var17 = var1.resolve("manifest.json");
if (Files.exists(var17)) {
try (FileReader var18 = new FileReader(var17.toFile(), StandardCharsets.UTF_8)) {
char[] var19 = RawJsonReader.READ_BUFFER.get();
RawJsonReader var20 = new RawJsonReader(var18, var19);
ExtraInfo var21 = ExtraInfo.THREAD_LOCAL.get();
PluginManifest var22 = PluginManifest.CODEC.decodeJson(var20, var21);
var21.getValidationResults().logOrThrowValidatorExceptions(this.getLogger());
class="kw">return var22;
}
}
}
} else {
try (FileSystem var3 = FileSystems.newFileSystem(var1, (ClassLoader)null)) {
Path var4 = var3.getPath("manifest.json");
if (Files.exists(var4)) {
try (BufferedReader var5 = Files.newBufferedReader(var4, StandardCharsets.UTF_8)) {
char[] var6 = RawJsonReader.READ_BUFFER.get();
RawJsonReader var7 = new RawJsonReader(var5, var6);
ExtraInfo var8 = ExtraInfo.THREAD_LOCAL.get();
PluginManifest var9 = PluginManifest.CODEC.decodeJson(var7, var8);
var8.getValidationResults().logOrThrowValidatorExceptions(this.getLogger());
class="kw">return var9;
}
}
}
}
class="kw">return null;
}
class="kw">private void loadPacksFromDirectory(Path var1) {
if (Files.isDirectory(var1)) {
this.getLogger().at(Level.INFO).log("Loading packs from directory: %s", var1);
try (DirectoryStream var2 = Files.newDirectoryStream(var1)) {
for (Path var4 : var2) {
if (var4.getFileName() != null) {
this.loadAndRegisterPack(var4, true);
}
}
} catch (IOException var7) {
((HytaleLogger.Api)this.getLogger().at(Level.SEVERE).withCause(var7)).log("Failed to load mods from: %s", var1);
}
}
}
class="kw">private void loadAndRegisterPack(Path var1, boolean var2) {
PluginManifest var3;
try {
var3 = this.loadPackManifest(var1);
if (var3 == null) {
this.getLogger().at(Level.WARNING).log("Skipping pack at %s: missing or invalid manifest.json", var1.getFileName());
class="kw">return;
}
} catch (Exception var11) {
((HytaleLogger.Api)this.getLogger().at(Level.WARNING).withCause(new SkipSentryException(var11))).log("Failed to load manifest for pack at %s", var1);
class="kw">return;
}
if (var1.getFileName().toString().toLowerCase(Locale.ROOT).endsWith(".jar") && !var3.includesAssetPack()) {
this.getLogger().at(Level.FINE).log("Skipping jar without asset pack: %s", var1.getFileName());
} else {
PluginIdentifier var4 = new PluginIdentifier(var3);
String var5 = var4.toString();
AssetPack.PackSource var6 = var2 ? AssetPack.PackSource.MODS : AssetPack.PackSource.CLI;
HytaleServerConfig var7 = HytaleServer.get().getConfig();
ModConfig var8 = var7.getModConfig().get(var4);
boolean var9;
if (var8 != null && var8.getEnabled() != null) {
var9 = var8.getEnabled();
} else {
var9 = !var3.isDisabledByDefault() && (!var2 || var7.getDefaultModsEnabled());
}
if (var9) {
if (!this.registerPack(var5, var1, var3, var6)) {
Message var10 = Message.translation("client.disconnection.shutdownReason.packDuplicate").param("pack", var5);
HytaleServer.get().shutdownServer(ShutdownReason.MOD_ERROR.withMessage(var10));
class="kw">return;
}
this.getLogger().at(Level.INFO).log("Loaded pack: %s from %s", var5, var1.getFileName());
} else {
this.getLogger().at(Level.INFO).log("Skipped disabled pack: %s", var5);
}
}
}
class="kw">public boolean registerPack(@Nonnull String var1, @Nonnull Path var2, @Nonnull PluginManifest var3, @Nonnull AssetPack.PackSource var4) {
AssetPack var5 = this.getAssetPack(var1);
if (var5 != null) {
if (var5.getSource().overrides(var4)) {
this.getLogger().at(Level.WARNING).log("Asset pack '%s' already registered (%s), skipping %s: %s", var1, var5.getSource(), var4, var2);
class="kw">return true;
}
if (!var4.overrides(var5.getSource())) {
this.getLogger()
.at(Level.SEVERE)
.log("Duplicate asset pack '%s' at %s (already loaded from %s). Remove the duplicate.", var1, var2, var5.getPackLocation());
class="kw">return false;
}
this.getLogger().at(Level.WARNING).log("Asset pack '%s' overriding %s with %s: %s", var1, var5.getSource(), var4, var2);
this.unregisterPack(var1);
}
Path var6 = var2.toAbsolutePath().normalize();
Path var7 = var6;
FileSystem var8 = null;
boolean var9 = false;
String var10 = var6.getFileName().toString().toLowerCase(Locale.ROOT);
if (!var10.endsWith(".zip") && !var10.endsWith(".jar")) {
var9 = Files.isRegularFile(var6.resolve("CommonAssetsIndex.hashes"));
} else {
try {
var8 = FileSystems.newFileSystem(var6, (ClassLoader)null);
var6 = var8.getPath("").toAbsolutePath().normalize();
var9 = true;
} catch (IOException var16) {
throw SneakyThrow.sneakyThrow(var16);
}
}
AssetPack var11 = new AssetPack(var7, var1, var6, var8, var9, var3, var4);
this.assetPacks.add(var11);
AssetRegistry.ASSET_LOCK.writeLock().lock();
try {
if (!this.hasLoaded) {
class="kw">return true;
}
HytaleServer.get().getEventBus().<Void, AssetPackRegisterEvent>dispatchFor(AssetPackRegisterEvent.class).dispatch(new AssetPackRegisterEvent(var11));
} class="kw">finally {
AssetRegistry.ASSET_LOCK.writeLock().unlock();
}
class="kw">return true;
}
class="kw">public void unregisterPack(@Nonnull String var1) {
AssetPack var2 = this.getAssetPack(var1);
if (var2 == null) {
this.getLogger().at(Level.WARNING).log("Tried to unregister non-existent asset pack: %s", var1);
} else {
this.assetPacks.remove(var2);
if (var2.getFileSystem() != null) {
try {
var2.getFileSystem().close();
} catch (IOException var8) {
throw SneakyThrow.sneakyThrow(var8);
}
}
AssetRegistry.ASSET_LOCK.writeLock().lock();
try {
HytaleServer.get()
.getEventBus()
.<Void, AssetPackUnregisterEvent>dispatchFor(AssetPackUnregisterEvent.class)
.dispatch(new AssetPackUnregisterEvent(var2));
} class="kw">finally {
AssetRegistry.ASSET_LOCK.writeLock().unlock();
}
}
}
class="kw">private void loadAllAssetPacks(LoadAssetEvent var1) {
if (this.hasLoaded) {
throw new IllegalStateException("LoadAssetEvent has already been dispatched");
}
AssetRegistry.ASSET_LOCK.writeLock().lock();
try {
this.hasLoaded = true;
AssetRegistryLoader.preLoadAssets(var1);
HashMap var2 = new HashMap<>();
for (AssetPack var4 : this.assetPacks) {
var2.put(PluginIdentifier.fromString(var4.getName()), var4);
}
List var11 = List.of(HytaleServer.get().getConfig().getModLoadOrder());
try {
this.assetPacks = new CopyOnWriteArrayList<>(Mod.calculateLoadOrder(var2, (var0, var1x) -> PluginManager.get().hasPlugin(var0, var1x), var11));
} catch (ModLoadOrderException var9) {
throw new IllegalStateException("Failed to calculate asset pack load order", var9);
}
for (AssetPack var5 : this.assetPacks) {
AssetRegistryLoader.loadAssets(var1, var5);
}
} class="kw">finally {
AssetRegistry.ASSET_LOCK.writeLock().unlock();
}
}
class="kw">public boolean validatePackExistsOnDisk(@Nonnull AssetPack var1) {
if (!var1.existsOnDisk()) {
if (this.missingPackWarnings.add(var1.getName())) {
this.getLogger().at(Level.WARNING).log("Asset pack '%s' no longer exists on disk", var1.getName());
}
class="kw">return false;
} else {
this.missingPackWarnings.remove(var1.getName());
class="kw">return true;
}
}
class="kw">public AssetPack getAssetPack(@Nonnull String var1) {
for (AssetPack var3 : this.assetPacks) {
if (var1.equals(var3.getName())) {
class="kw">return var3;
}
}
class="kw">return null;
}
class="kw">private void onRemoveStore(@Nonnull RemoveAssetStoreEvent var1) {
AssetStore var2 = (AssetStore<?, ? class="kw">extends JsonAssetWithMap<?, ? class="kw">extends AssetMap<?, ?>>, ? class="kw">extends AssetMap<?, ? class="kw">extends JsonAssetWithMap<?, ?>>>)var1.getAssetStore();
String var3 = var2.getPath();
if (var3 != null) {
for (AssetPack var5 : this.assetPacks) {
if (!var5.isImmutable()) {
Path var6 = var5.getRoot().resolve("Server").resolve(var3);
if (Files.isDirectory(var6)) {
var2.removeFileMonitor(var6);
}
}
}
}
}
class="kw">private void onNewStore(@Nonnull RegisterAssetStoreEvent var1) {
if (AssetRegistry.HAS_INIT) {
this.pendingAssetStores.add(var1.getAssetStore());
}
}
class="kw">public void initPendingStores() {
for (int var1 = 0; var1 < this.pendingAssetStores.size(); var1++) {
this.initStore(this.pendingAssetStores.get(var1));
}
this.pendingAssetStores.clear();
}
class="kw">private void initStore(@Nonnull AssetStore<?, ?, ?> var1) {
AssetRegistry.ASSET_LOCK.writeLock().lock();
try {
List var2 = var1.getPreAddedAssets();
if (var2 != null && !var2.isEmpty()) {
AssetLoadResult var3 = var1.loadAssets("Hytale:Hytale", var2);
if (var3.hasFailed()) {
throw new RuntimeException("Failed to load asset store: " + var1.getAssetClass());
}
}
for (AssetPack var4 : this.assetPacks) {
Path var5 = var4.getRoot().resolve("Server");
String var6 = var1.getPath();
if (var6 != null) {
Path var7 = var5.resolve(var6);
if (Files.isDirectory(var7)) {
AssetLoadResult var8 = (AssetLoadResult<?, ? class="kw">extends JsonAssetWithMap<?, ? class="kw">extends AssetMap<?, ?>>>)var1.loadAssetsFromDirectory(
var4.getName(), var7
);
if (var8.hasFailed()) {
throw new RuntimeException("Failed to load asset store: " + var1.getAssetClass());
}
} else {
this.getLogger().at(Level.SEVERE).log("Path for %s isn't a directory or doesn't exist: %s", var1.getAssetClass().getSimpleName(), var7);
}
}
var1.validateCodecDefaults();
if (var6 != null) {
Path var15 = var5.resolve(var6);
if (Files.isDirectory(var15)) {
var1.addFileMonitor(var4.getName(), var15);
}
}
}
} catch (IOException var12) {
throw SneakyThrow.sneakyThrow(var12);
} class="kw">finally {
AssetRegistry.ASSET_LOCK.writeLock().unlock();
}
}
class="kw">private class="kw">static void validateWorldGen(@Nonnull LoadAssetEvent var0) {
if (Options.getOptionSet().has(Options.VALIDATE_WORLD_GEN)) {
long var1 = System.nanoTime();
try {
IWorldGenProvider var3 = IWorldGenProvider.CODEC.getDefault();
IWorldGen var4 = var3.getGenerator();
var4.getDefaultSpawnProvider(0);
if (var4 class="kw">instanceof ValidatableWorldGen) {
boolean var5 = ((ValidatableWorldGen)var4).validate();
if (!var5) {
var0.failed(true, "failed to validate world gen");
}
}
if (var4 class="kw">instanceof IWorldMapProvider var9) {
IWorldMap var6 = var9.getGenerator(null);
var6.getWorldMapSettings();
}
} catch (WorldGenLoadException var7) {
((HytaleLogger.Api)HytaleLogger.getLogger().at(Level.SEVERE).withCause(var7)).log("Failed to load class="kw">default world gen!");
HytaleLogger.getLogger().at(Level.SEVERE).log("\n%s", var7.getTraceMessage("\n"));
var0.failed(true, "failed to validate world gen: " + var7.getTraceMessage(" -> "));
} catch (Throwable var8) {
((HytaleLogger.Api)HytaleLogger.getLogger().at(Level.SEVERE).withCause(var8)).log("Failed to load class="kw">default world gen!");
var0.failed(true, "failed to validate world gen");
}
HytaleLogger.getLogger()
.at(Level.INFO)
.log(
"Validate world gen phase completed! Boot time %s, Took %s",
FormatUtil.nanosToString(System.nanoTime() - var0.getBootStart()),
FormatUtil.nanosToString(System.nanoTime() - var1)
);
}
}
}