AssetRegistryLoader class

Пакет: com.hypixel.hytale.server.core.asset

Файл: com/hypixel/hytale/server/core/asset/AssetRegistryLoader.java

Поля (35)

МодификаторыТипИмя
final HytaleLogger LOGGER
return
BlockTypeAssetMap var0
Collection var1
Consumer var1
long var10
long var11
Path var11
Class var12
String var13
long var14
AssetLoadResult var15
boolean var16
var16
long var16
AssetStoreIterator var17
AssetLoadResult var18
boolean var2
Path var2
Consumer var2
long var22
String var25
long var26
Path var27
long var3
AssetStore var4
long var5
boolean var5
boolean var6
var6
Class var7
Collection var7
List var8
long var9
AssetStore var9

Методы (19)

МодификаторыВозвратСигнатура
abstract throw new CircularDependencyExceptionthrow new CircularDependencyException(var1, var17)
abstract throw new CircularDependencyExceptionthrow new CircularDependencyException(var7, var8)
for for(AssetStore var3 : var1)
for for(AssetStore var24 : var7)
if if(var0 != null)
if if(var4 == null)
if if(var16)
if if(var9 == null)
if if(var13 != null)
if if(var0 != null)
if if(var25 != null)
if if(var6 && var0 != null)
static void initvoid init()
static boolean loadAssetsboolean loadAssets(@Nullable LoadAssetEvent var0, @Nonnull AssetPack var1)
static boolean loadAssets0boolean loadAssets0(@Nullable LoadAssetEvent var0, @Nonnull AssetPack var1)
static void preLoadAssetsvoid preLoadAssets(@Nonnull LoadAssetEvent var0)
static void preLoadAssets0void preLoadAssets0(@Nonnull LoadAssetEvent var0)
abstract preLoadAssets0 preLoadAssets0(var0)
static void sendAssetsvoid sendAssets(@Nonnull PacketHandler 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.iterator.AssetStoreIterator;
class="kw">import com.hypixel.hytale.assetstore.iterator.CircularDependencyException;
class="kw">import com.hypixel.hytale.assetstore.map.BlockTypeAssetMap;
class="kw">import com.hypixel.hytale.assetstore.map.DefaultAssetMap;
class="kw">import com.hypixel.hytale.assetstore.map.IndexedAssetMap;
class="kw">import com.hypixel.hytale.assetstore.map.IndexedLookupTableAssetMap;
class="kw">import com.hypixel.hytale.assetstore.map.JsonAssetWithMap;
class="kw">import com.hypixel.hytale.common.util.FormatUtil;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.protocol.ToClientPacket;
class="kw">import com.hypixel.hytale.server.core.HytaleServer;
class="kw">import com.hypixel.hytale.server.core.Options;
class="kw">import com.hypixel.hytale.server.core.asset.type.ambiencefx.AmbienceFXPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.ambiencefx.config.AmbienceFX;
class="kw">import com.hypixel.hytale.server.core.asset.type.audiocategory.AudioCategoryPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.audiocategory.config.AudioCategory;
class="kw">import com.hypixel.hytale.server.core.asset.type.audiostate.AudioStatePacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.audiostate.config.AudioState;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockbreakingdecal.BlockBreakingDecalPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockbreakingdecal.config.BlockBreakingDecal;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockhitbox.BlockBoundingBoxes;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockhitbox.BlockBoundingBoxesPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockparticle.BlockParticleSetPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockparticle.config.BlockParticleSet;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockset.BlockSetPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockset.config.BlockSet;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocksound.BlockSoundSetPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocksound.config.BlockSoundSet;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.BlockGroupPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.BlockTypePacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockMigration;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.asset.type.buildertool.config.BlockTypeListAsset;
class="kw">import com.hypixel.hytale.server.core.asset.type.buildertool.config.PrefabListAsset;
class="kw">import com.hypixel.hytale.server.core.asset.type.camera.CameraEffect;
class="kw">import com.hypixel.hytale.server.core.asset.type.entityeffect.EntityEffectPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.entityeffect.config.EntityEffect;
class="kw">import com.hypixel.hytale.server.core.asset.type.environment.EnvironmentPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.environment.config.Environment;
class="kw">import com.hypixel.hytale.server.core.asset.type.equalizereffect.EqualizerEffectPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.equalizereffect.config.EqualizerEffect;
class="kw">import com.hypixel.hytale.server.core.asset.type.fluid.Fluid;
class="kw">import com.hypixel.hytale.server.core.asset.type.fluid.FluidTypePacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.fluidfx.FluidFXPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.fluidfx.config.FluidFX;
class="kw">import com.hypixel.hytale.server.core.asset.type.gamemode.GameModeType;
class="kw">import com.hypixel.hytale.server.core.asset.type.gameplay.GameplayConfig;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.FieldcraftCategoryPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.ItemCategoryPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.ResourceTypePacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.BlockGroup;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.BuilderToolItemReferenceAsset;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.CraftingRecipe;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.FieldcraftCategory;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.Item;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.ItemCategory;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.ItemDropList;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.ItemQuality;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.ItemReticleConfig;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.ItemToolSpec;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.ResourceType;
class="kw">import com.hypixel.hytale.server.core.asset.type.itemanimation.ItemPlayerAnimationsPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.itemanimation.config.ItemPlayerAnimations;
class="kw">import com.hypixel.hytale.server.core.asset.type.itemsound.ItemSoundSetPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.itemsound.config.ItemSoundSet;
class="kw">import com.hypixel.hytale.server.core.asset.type.model.config.ModelAsset;
class="kw">import com.hypixel.hytale.server.core.asset.type.modelvfx.ModelVFXPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.modelvfx.config.ModelVFX;
class="kw">import com.hypixel.hytale.server.core.asset.type.musiccontainer.MusicContainerPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.musiccontainer.config.MusicContainer;
class="kw">import com.hypixel.hytale.server.core.asset.type.musiccontainer.config.SingleTrackMusicContainer;
class="kw">import com.hypixel.hytale.server.core.asset.type.particle.ParticleSpawnerPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.particle.ParticleSystemPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.particle.config.ParticleSpawner;
class="kw">import com.hypixel.hytale.server.core.asset.type.particle.config.ParticleSystem;
class="kw">import com.hypixel.hytale.server.core.asset.type.physicalmaterial.PhysicalMaterialPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.physicalmaterial.config.PhysicalMaterial;
class="kw">import com.hypixel.hytale.server.core.asset.type.portalworld.PortalType;
class="kw">import com.hypixel.hytale.server.core.asset.type.projectile.config.Projectile;
class="kw">import com.hypixel.hytale.server.core.asset.type.responsecurve.config.ExponentialResponseCurve;
class="kw">import com.hypixel.hytale.server.core.asset.type.responsecurve.config.ResponseCurve;
class="kw">import com.hypixel.hytale.server.core.asset.type.reverbeffect.ReverbEffectPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.reverbeffect.config.ReverbEffect;
class="kw">import com.hypixel.hytale.server.core.asset.type.soundevent.SoundEventPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.soundevent.config.SoundEvent;
class="kw">import com.hypixel.hytale.server.core.asset.type.soundset.SoundSetPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.soundset.config.SoundSet;
class="kw">import com.hypixel.hytale.server.core.asset.type.tagpattern.TagPatternPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.tagpattern.config.AndPatternOp;
class="kw">import com.hypixel.hytale.server.core.asset.type.tagpattern.config.EqualsTagOp;
class="kw">import com.hypixel.hytale.server.core.asset.type.tagpattern.config.NotPatternOp;
class="kw">import com.hypixel.hytale.server.core.asset.type.tagpattern.config.OrPatternOp;
class="kw">import com.hypixel.hytale.server.core.asset.type.tagpattern.config.TagPattern;
class="kw">import com.hypixel.hytale.server.core.asset.type.trail.TrailPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.trail.config.Trail;
class="kw">import com.hypixel.hytale.server.core.asset.type.weather.WeatherPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.asset.type.weather.config.Weather;
class="kw">import com.hypixel.hytale.server.core.asset.type.wordlist.WordList;
class="kw">import com.hypixel.hytale.server.core.inventory.ItemStack;
class="kw">import com.hypixel.hytale.server.core.io.PacketHandler;
class="kw">import com.hypixel.hytale.server.core.modules.entity.damage.DamageCause;
class="kw">import com.hypixel.hytale.server.core.modules.entity.hitboxcollision.HitboxCollisionConfig;
class="kw">import com.hypixel.hytale.server.core.modules.entity.repulsion.RepulsionConfig;
class="kw">import com.hypixel.hytale.server.core.modules.entitystats.asset.EntityStatType;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.UnarmedInteractions;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.Interaction;
class="kw">import com.hypixel.hytale.server.core.modules.item.CraftingRecipePacketGenerator;
class="kw">import com.hypixel.hytale.server.core.modules.item.ItemPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.modules.item.ItemQualityPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.modules.item.ItemReticleConfigPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.modules.projectile.config.ProjectileConfig;
class="kw">import com.hypixel.hytale.server.core.modules.projectile.config.ProjectileConfigPacketGenerator;
class="kw">import com.hypixel.hytale.server.core.universe.world.connectedblocks.CustomConnectedBlockTemplateAsset;
class="kw">import com.hypixel.hytale.sneakythrow.SneakyThrow;
class="kw">import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap;
class="kw">import java.nio.file.Files;
class="kw">import java.nio.file.Path;
class="kw">import java.util.Arrays;
class="kw">import java.util.Collection;
class="kw">import java.util.Collections;
class="kw">import java.util.List;
class="kw">import java.util.function.Consumer;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class AssetRegistryLoader {
   class="kw">public class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();

   class="kw">public AssetRegistryLoader() {
   }

   class="kw">public class="kw">static void init() {
   }

   class="kw">public class="kw">static void preLoadAssets(@Nonnull LoadAssetEvent var0) {
      try {
         preLoadAssets0(var0);
      } catch (Throwable var2) {
         var0.failed(true, "failed to validate assets");
         throw SneakyThrow.sneakyThrow(var2);
      }
   }

   class="kw">public class="kw">static boolean loadAssets(@Nullable LoadAssetEvent var0, @Nonnull AssetPack var1) {
      AssetRegistry.ASSET_LOCK.writeLock().lock();

      try {
         boolean var2 = loadAssets0(var0, var1);
         AssetRegistry.HAS_INIT = true;
         class="kw">return var2;
      } catch (Throwable var7) {
         if (var0 != null) {
            var0.failed(true, "failed to validate assets");
         }

         throw SneakyThrow.sneakyThrow(var7);
      } class="kw">finally {
         AssetRegistry.ASSET_LOCK.writeLock().unlock();
      }
   }

   class="kw">private class="kw">static void preLoadAssets0(@Nonnull LoadAssetEvent var0) {
      AssetStore.DISABLE_DYNAMIC_DEPENDENCIES = true;
      Collection var1 = AssetRegistry.getStoreMap().values();
      LOGGER.at(Level.INFO).log("Loading %s asset stores...", var1.size());

      for (AssetStore var3 : var1) {
         var3.simplifyLoadBeforeDependencies();
      }

      boolean var16 = false;
      LOGGER.at(Level.INFO).log("Pre-adding assets...");
      AssetStoreIterator var17 = new AssetStoreIterator(var1);

      label71: {
         try {
            while (var17.hasNext()) {
               if (HytaleServer.get().isShuttingDown()) {
                  LOGGER.at(Level.INFO).log("Aborted asset loading due to server shutdown!");
                  break label71;
               }

               AssetStore var4 = (AssetStore<?, ? class="kw">extends JsonAssetWithMap<?, ? class="kw">extends AssetMap<?, ?>>, ? class="kw">extends AssetMap<?, ? class="kw">extends JsonAssetWithMap<?, ?>>>)var17.next();
               if (var4 == null) {
                  throw new CircularDependencyException(var1, var17);
               }

               long var5 = System.nanoTime();
               Class var7 = var4.getAssetClass();

               try {
                  List var8 = var4.getPreAddedAssets();
                  if (var8 != null && !var8.isEmpty()) {
                     AssetLoadResult var18 = var4.loadAssets("Hytale:Hytale", var8);
                     var16 |= var18.hasFailed();
                  }
               } catch (Exception var14) {
                  var16 = true;
                  long var9 = System.nanoTime();
                  long var11 = var9 - var5;
                  if (var17.isBeingWaitedFor(var4)) {
                     throw new RuntimeException(String.format("Failed to pre-add %s took %s", var7.getSimpleName(), FormatUtil.nanosToString(var11)), var14);
                  }

                  ((HytaleLogger.Api)LOGGER.at(Level.SEVERE).withCause(var14))
                     .log("Failed to pre-add %s took %s", var7.getSimpleName(), FormatUtil.nanosToString(var11));
               }
            }
         } catch (Throwable var15) {
            try {
               var17.close();
            } catch (Throwable var13) {
               var15.addSuppressed(var13);
            }

            throw var15;
         }

         var17.close();
         if (var16) {
            var0.failed(Options.getOptionSet().has(Options.VALIDATE_ASSETS), "failed to validate internal assets");
         }

         class="kw">return;
      }

      var17.close();
   }

   class="kw">private class="kw">static boolean loadAssets0(@Nullable LoadAssetEvent var0, @Nonnull AssetPack var1) {
      AssetStore.DISABLE_DYNAMIC_DEPENDENCIES = true;
      Path var2 = var1.getRoot().resolve("Server");
      HytaleLogger.getLogger().at(Level.INFO).log("Loading assets from: %s", var2);
      long var3 = System.nanoTime();
      boolean var5 = Options.getOptionSet().has(Options.VALIDATE_ASSETS) || var1.isImmutable() && !Options.getOptionSet().has(Options.IGNORE_BROKEN_MODS);
      boolean var6 = false;
      LOGGER.at(Level.INFO).log("Loading assets from %s", var2);
      Collection var7 = AssetRegistry.getStoreMap().values();

      try (AssetStoreIterator var8 = new AssetStoreIterator(var7)) {
         while (var8.hasNext()) {
            if (HytaleServer.get().isShuttingDown()) {
               LOGGER.at(Level.INFO).log("Aborted asset loading due to server shutdown!");
               class="kw">return var6;
            }

            AssetStore var9 = (AssetStore<?, ? class="kw">extends JsonAssetWithMap<?, ? class="kw">extends AssetMap<?, ?>>, ? class="kw">extends AssetMap<?, ? class="kw">extends JsonAssetWithMap<?, ?>>>)var8.next();
            if (var9 == null) {
               throw new CircularDependencyException(var7, var8);
            }

            long var10 = System.nanoTime();
            Class var12 = var9.getAssetClass();

            try {
               String var13 = var9.getPath();
               if (var13 != null) {
                  Path var27 = var2.resolve(var13);
                  if (Files.isDirectory(var27)) {
                     AssetLoadResult var15 = var9.loadAssetsFromDirectory(var1.getName(), var27);
                     var6 |= var15.hasFailed();
                  }
               }
            } catch (Exception var19) {
               var6 = true;
               if (var0 != null) {
                  var0.failed(var5, "Asset pack " + var1.getName() + " failed to load " + var12.getSimpleName() + " - " + var19.getMessage());
               }

               long var14 = System.nanoTime();
               long var16 = var14 - var10;
               if (var8.isBeingWaitedFor(var9)) {
                  throw new RuntimeException(
                     String.format("Failed to load %s from path '%s' took %s", var12.getSimpleName(), var9.getPath(), FormatUtil.nanosToString(var16)), var19
                  );
               }

               ((HytaleLogger.Api)LOGGER.at(Level.SEVERE).withCause(var19))
                  .log("Failed to load %s from path '%s' took %s", var12.getSimpleName(), var9.getPath(), FormatUtil.nanosToString(var16));
            }
         }
      }

      for (AssetStore var24 : var7) {
         if (var1.getName().equals("Hytale:Hytale")) {
            var24.validateCodecDefaults();
         }

         String var25 = var24.getPath();
         if (var25 != null) {
            Path var11 = var2.resolve(var25);
            if (Files.isDirectory(var11) && !var1.isImmutable()) {
               var24.addFileMonitor(var1.getName(), var11);
            }
         }
      }

      long var22 = System.nanoTime();
      long var26 = var22 - var3;
      LOGGER.at(Level.INFO).log("Took %s to load all assets", FormatUtil.nanosToString(var26));
      if (var6 && var0 != null) {
         if ("Hytale:Hytale".equals(var1.getName())) {
            var0.failed(var5, "Assets " + var1.getName() + " failed to load.");
         } else {
            var0.failed(var5, "Mod " + var1.getName() + " failed to load. Check for mod updates or contact the mod author.");
         }
      }

      class="kw">return var6;
   }

   class="kw">public class="kw">static void sendAssets(@Nonnull PacketHandler var0) {
      Consumer var1 = var0::write;
      Consumer var2 = var0::write;
      HytaleAssetStore.SETUP_PACKET_CONSUMERS.add(var2);

      try {
         for (AssetStore var4 : AssetRegistry.getStoreMap().values()) {
            ((HytaleAssetStore)var4).sendAssets(var1);
         }
      } class="kw">finally {
         HytaleAssetStore.SETUP_PACKET_CONSUMERS.remove(var2);
      }
   }

   class="kw">static {
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                                    MusicContainer.class, new IndexedAssetMap()
                                 )
                                 .setPath("Audio/MusicContainers"))
                              .setCodec(MusicContainer.CODEC))
                           .setKeyFunction(MusicContainer::getId))
                        .setReplaceOnRemove(var0x -> new SingleTrackMusicContainer(var0x)))
                     .setPacketGenerator(new MusicContainerPacketGenerator())
                     .loadsBefore(AmbienceFX.class))
                  .loadsAfter(AudioCategory.class, AudioState.class))
               .preLoadAssets(Collections.singletonList(MusicContainer.EMPTY)))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                                 AmbienceFX.class, new IndexedAssetMap()
                              )
                              .setPath("Audio/AmbienceFX"))
                           .setCodec(AmbienceFX.CODEC))
                        .setKeyFunction(AmbienceFX::getId))
                     .setReplaceOnRemove(AmbienceFX::new))
                  .setPacketGenerator(new AmbienceFXPacketGenerator())
                  .loadsAfter(
                     Weather.class,
                     Environment.class,
                     FluidFX.class,
                     SoundEvent.class,
                     BlockSoundSet.class,
                     TagPattern.class,
                     AudioCategory.class,
                     ReverbEffect.class,
                     EqualizerEffect.class,
                     PhysicalMaterial.class,
                     AudioState.class
                  ))
               .preLoadAssets(Collections.singletonList(AmbienceFX.EMPTY)))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                              BlockBoundingBoxes.class, new IndexedLookupTableAssetMap<>(BlockBoundingBoxes[]::new)
                           )
                           .setPath("Item/Block/Hitboxes"))
                        .setCodec(BlockBoundingBoxes.CODEC))
                     .setKeyFunction(BlockBoundingBoxes::getId))
                  .setReplaceOnRemove(BlockBoundingBoxes::getUnitBoxFor))
               .setPacketGenerator(new BlockBoundingBoxesPacketGenerator())
               .preLoadAssets(Collections.singletonList(BlockBoundingBoxes.UNIT_BOX)))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                              BlockSet.class, new IndexedLookupTableAssetMap<>(BlockSet[]::new)
                           )
                           .setPath("Item/Block/Sets"))
                        .setCodec(BlockSet.CODEC))
                     .setKeyFunction(BlockSet::getId))
                  .setReplaceOnRemove(BlockSet::new))
               .setPacketGenerator(new BlockSetPacketGenerator())
               .loadsBefore(Item.class))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                                 BlockSoundSet.class, new IndexedLookupTableAssetMap<>(BlockSoundSet[]::new)
                              )
                              .setPath("Item/Block/Sounds"))
                           .setCodec(BlockSoundSet.CODEC))
                        .setKeyFunction(BlockSoundSet::getId))
                     .setReplaceOnRemove(BlockSoundSet::new))
                  .setPacketGenerator(new BlockSoundSetPacketGenerator())
                  .loadsAfter(SoundEvent.class))
               .preLoadAssets(Collections.singletonList(BlockSoundSet.EMPTY_BLOCK_SOUND_SET)))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                              PhysicalMaterial.class, new IndexedLookupTableAssetMap<>(PhysicalMaterial[]::new)
                           )
                           .setPath("Item/Block/PhysicalMaterials"))
                        .setCodec(PhysicalMaterial.CODEC))
                     .setKeyFunction(PhysicalMaterial::getId))
                  .setReplaceOnRemove(PhysicalMaterial::new))
               .setPacketGenerator(new PhysicalMaterialPacketGenerator())
               .preLoadAssets(Collections.singletonList(PhysicalMaterial.EMPTY_PHYSICAL_MATERIAL)))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                              ItemSoundSet.class, new IndexedLookupTableAssetMap<>(ItemSoundSet[]::new)
                           )
                           .setPath("Audio/ItemSounds"))
                        .setCodec(ItemSoundSet.CODEC))
                     .setKeyFunction(ItemSoundSet::getId))
                  .setReplaceOnRemove(ItemSoundSet::new))
               .setPacketGenerator(new ItemSoundSetPacketGenerator())
               .loadsAfter(SoundEvent.class))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                           BlockParticleSet.class, new DefaultAssetMap()
                        )
                        .setPath("Item/Block/Particles"))
                     .setCodec(BlockParticleSet.CODEC))
                  .setKeyFunction(BlockParticleSet::getId))
               .setPacketGenerator(new BlockParticleSetPacketGenerator())
               .loadsAfter(ParticleSystem.class))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                        BlockBreakingDecal.class, new DefaultAssetMap()
                     )
                     .setPath("Item/Block/BreakingDecals"))
                  .setCodec(BlockBreakingDecal.CODEC))
               .setKeyFunction(BlockBreakingDecal::getId))
            .setPacketGenerator(new BlockBreakingDecalPacketGenerator())
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                        Integer.class, BlockMigration.class, new DefaultAssetMap()
                     )
                     .setPath("Item/Block/Migrations"))
                  .setCodec(BlockMigration.CODEC))
               .setKeyFunction(BlockMigration::getId))
            .build()
      );
      BlockTypeAssetMap var0 = new BlockTypeAssetMap<>(BlockType[]::new, BlockType::getGroup);
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                                    BlockType.class, var0
                                 )
                                 .setPath("Item/Block/Blocks"))
                              .setCodec(BlockType.CODEC))
                           .setKeyFunction(BlockType::getId))
                        .setPacketGenerator(new BlockTypePacketGenerator())
                        .loadsAfter(
                           BlockBoundingBoxes.class,
                           BlockSoundSet.class,
                           PhysicalMaterial.class,
                           SoundEvent.class,
                           AmbienceFX.class,
                           BlockParticleSet.class,
                           BlockBreakingDecal.class,
                           CustomConnectedBlockTemplateAsset.class,
                           PrefabListAsset.class,
                           BlockTypeListAsset.class
                        ))
                     .setNotificationItemFunction(var0x -> new ItemStack(var0x, 1).toPacket())
                     .setReplaceOnRemove(BlockType::getUnknownFor))
                  .preLoadAssets(Arrays.asList(BlockType.EMPTY, BlockType.UNKNOWN, BlockType.DEBUG_CUBE, BlockType.DEBUG_MODEL)))
               .setIdProvider(Item.class))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                                 Fluid.class, new IndexedLookupTableAssetMap<>(Fluid[]::new)
                              )
                              .setPath("Item/Block/Fluids"))
                           .setCodec(Fluid.CODEC))
                        .setKeyFunction(Fluid::getId))
                     .setReplaceOnRemove(Fluid::getUnknownFor))
                  .setPacketGenerator(new FluidTypePacketGenerator())
                  .loadsAfter(FluidFX.class, BlockSoundSet.class, BlockParticleSet.class, SoundEvent.class))
               .preLoadAssets(List.of(Fluid.EMPTY, Fluid.UNKNOWN)))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                        ItemPlayerAnimations.class, new DefaultAssetMap()
                     )
                     .setPath("Item/Animations"))
                  .setCodec(ItemPlayerAnimations.CODEC))
               .setKeyFunction(ItemPlayerAnimations::getId))
            .setPacketGenerator(new ItemPlayerAnimationsPacketGenerator())
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                                 Environment.class, new IndexedLookupTableAssetMap<>(Environment[]::new)
                              )
                              .setPath("Environments"))
                           .setCodec(Environment.CODEC))
                        .setKeyFunction(Environment::getId))
                     .setReplaceOnRemove(Environment::getUnknownFor))
                  .setPacketGenerator(new EnvironmentPacketGenerator())
                  .loadsAfter(Weather.class, FluidFX.class, ParticleSystem.class))
               .preLoadAssets(Collections.singletonList(Environment.UNKNOWN)))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                                 FluidFX.class, new IndexedLookupTableAssetMap<>(FluidFX[]::new)
                              )
                              .setPath("Item/Block/FluidFX"))
                           .setCodec(FluidFX.CODEC))
                        .setKeyFunction(FluidFX::getId))
                     .setReplaceOnRemove(FluidFX::getUnknownFor))
                  .setPacketGenerator(new FluidFXPacketGenerator())
                  .loadsAfter(ParticleSystem.class))
               .preLoadAssets(Collections.singletonList(FluidFX.EMPTY_FLUID_FX)))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                        ItemCategory.class, new DefaultAssetMap(Collections.synchronizedMap(new Object2ObjectLinkedOpenHashMap()))
                     )
                     .setPath("Item/Category/CreativeLibrary"))
                  .setCodec(ItemCategory.CODEC))
               .setKeyFunction(ItemCategory::getId))
            .setPacketGenerator(new ItemCategoryPacketGenerator())
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                        FieldcraftCategory.class, new DefaultAssetMap(Collections.synchronizedMap(new Object2ObjectLinkedOpenHashMap()))
                     )
                     .setPath("Item/Category/Fieldcraft"))
                  .setCodec(FieldcraftCategory.CODEC))
               .setKeyFunction(FieldcraftCategory::getId))
            .setPacketGenerator(new FieldcraftCategoryPacketGenerator())
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(ItemDropList.class, new DefaultAssetMap())
                     .setPath("Drops"))
                  .setCodec(ItemDropList.CODEC))
               .setKeyFunction(ItemDropList::getId))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(WordList.class, new DefaultAssetMap())
                     .setPath("WordLists"))
                  .setCodec(WordList.CODEC))
               .setKeyFunction(WordList::getId))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                              ItemReticleConfig.class, new IndexedLookupTableAssetMap<>(ItemReticleConfig[]::new)
                           )
                           .setPath("Item/Reticles"))
                        .setCodec(ItemReticleConfig.CODEC))
                     .setKeyFunction(ItemReticleConfig::getId))
                  .setReplaceOnRemove(ItemReticleConfig::new))
               .setPacketGenerator(new ItemReticleConfigPacketGenerator())
               .preLoadAssets(Collections.singletonList(ItemReticleConfig.DEFAULT)))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                           ItemToolSpec.class, new DefaultAssetMap()
                        )
                        .setPath("Item/Unarmed/Gathering"))
                     .setCodec(ItemToolSpec.CODEC))
                  .setKeyFunction(ItemToolSpec::getGatherType))
               .loadsAfter(SoundEvent.class))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(PortalType.class, new DefaultAssetMap())
                     .setPath("PortalTypes"))
                  .setCodec(PortalType.CODEC))
               .setKeyFunction(PortalType::getId))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                              Item.class, new DefaultAssetMap()
                           )
                           .setPath("Item/Items"))
                        .setCodec(Item.CODEC))
                     .setKeyFunction(Item::getId))
                  .setPacketGenerator(new ItemPacketGenerator())
                  .loadsAfter(
                     ItemCategory.class,
                     ItemPlayerAnimations.class,
                     UnarmedInteractions.class,
                     ResourceType.class,
                     BlockType.class,
                     EntityEffect.class,
                     ItemQuality.class,
                     ItemReticleConfig.class,
                     SoundEvent.class,
                     PortalType.class,
                     ItemSoundSet.class
                  ))
               .setNotificationItemFunction(var0x -> new ItemStack(var0x, 1).toPacket())
               .preLoadAssets(Collections.singletonList(Item.UNKNOWN)))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                           CraftingRecipe.class, new DefaultAssetMap()
                        )
                        .setPath("Item/Recipes"))
                     .setCodec(CraftingRecipe.CODEC))
                  .setKeyFunction(CraftingRecipe::getId))
               .setPacketGenerator(new CraftingRecipePacketGenerator())
               .loadsAfter(Item.class, BlockType.class))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                              ModelAsset.class, new DefaultAssetMap()
                           )
                           .setPath("Models"))
                        .setCodec(ModelAsset.CODEC))
                     .setKeyFunction(ModelAsset::getId))
                  .loadsAfter(ParticleSystem.class, SoundEvent.class, Trail.class))
               .preLoadAssets(List.of(ModelAsset.DEBUG)))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                           ParticleSpawner.class, new DefaultAssetMap()
                        )
                        .setPath("Particles"))
                     .setExtension(".particlespawner"))
                  .setCodec(ParticleSpawner.CODEC))
               .setKeyFunction(ParticleSpawner::getId))
            .setPacketGenerator(new ParticleSpawnerPacketGenerator())
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                              ParticleSystem.class, new DefaultAssetMap()
                           )
                           .setPath("Particles"))
                        .setExtension(".particlesystem"))
                     .setCodec(ParticleSystem.CODEC))
                  .setKeyFunction(ParticleSystem::getId))
               .setPacketGenerator(new ParticleSystemPacketGenerator())
               .loadsAfter(ParticleSpawner.class))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(Trail.class, new DefaultAssetMap())
                     .setPath("Entity/Trails"))
                  .setCodec(Trail.CODEC))
               .setKeyFunction(Trail::getId))
            .setPacketGenerator(new TrailPacketGenerator())
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                           Projectile.class, new DefaultAssetMap()
                        )
                        .setPath("Projectiles"))
                     .setCodec(Projectile.CODEC))
                  .setKeyFunction(Projectile::getId))
               .loadsAfter(SoundEvent.class, ModelAsset.class, ParticleSystem.class))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                              EntityEffect.class, new IndexedLookupTableAssetMap<>(EntityEffect[]::new)
                           )
                           .setPath("Entity/Effects"))
                        .setCodec(EntityEffect.CODEC))
                     .setKeyFunction(EntityEffect::getId))
                  .setReplaceOnRemove(EntityEffect::new))
               .setPacketGenerator(new EntityEffectPacketGenerator())
               .loadsAfter(
                  ModelAsset.class, ParticleSystem.class, EntityStatType.class, ModelVFX.class, DamageCause.class, CameraEffect.class, SoundEvent.class
               ))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                           ModelVFX.class, new IndexedLookupTableAssetMap<>(ModelVFX[]::new)
                        )
                        .setPath("Entity/ModelVFX"))
                     .setCodec(ModelVFX.CODEC))
                  .setKeyFunction(ModelVFX::getId))
               .setReplaceOnRemove(ModelVFX::new))
            .setPacketGenerator(new ModelVFXPacketGenerator())
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                           GameModeType.class, new DefaultAssetMap()
                        )
                        .setPath("Entity/GameMode"))
                     .setCodec(GameModeType.CODEC))
                  .setKeyFunction(GameModeType::getId))
               .loadsAfter(Interaction.class))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(ResourceType.class, new DefaultAssetMap())
                     .setPath("Item/ResourceTypes"))
                  .setCodec(ResourceType.CODEC))
               .setKeyFunction(ResourceType::getId))
            .setPacketGenerator(new ResourceTypePacketGenerator())
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                                 Weather.class, new IndexedLookupTableAssetMap<>(Weather[]::new)
                              )
                              .setPath("Weathers"))
                           .setCodec(Weather.CODEC))
                        .setKeyFunction(Weather::getId))
                     .setReplaceOnRemove(Weather::new))
                  .setPacketGenerator(new WeatherPacketGenerator())
                  .loadsAfter(ParticleSystem.class))
               .preLoadAssets(Collections.singletonList(Weather.UNKNOWN)))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                           GameplayConfig.class, new DefaultAssetMap()
                        )
                        .setPath("GameplayConfigs"))
                     .setCodec(GameplayConfig.CODEC))
                  .setKeyFunction(GameplayConfig::getId))
               .loadsAfter(
                  Item.class,
                  SoundEvent.class,
                  SoundSet.class,
                  BlockType.class,
                  EntityEffect.class,
                  HitboxCollisionConfig.class,
                  DamageCause.class,
                  RepulsionConfig.class,
                  ParticleSystem.class,
                  MusicContainer.class
               ))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                                 SoundEvent.class, new IndexedLookupTableAssetMap<>(SoundEvent[]::new)
                              )
                              .setPath("Audio/SoundEvents"))
                           .setCodec(SoundEvent.CODEC))
                        .setKeyFunction(SoundEvent::getId))
                     .setReplaceOnRemove(SoundEvent::new))
                  .setPacketGenerator(new SoundEventPacketGenerator())
                  .preLoadAssets(Collections.singletonList(SoundEvent.EMPTY_SOUND_EVENT)))
               .loadsAfter(AudioCategory.class, AudioState.class))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                                 SoundSet.class, new IndexedLookupTableAssetMap<>(SoundSet[]::new)
                              )
                              .setPath("Audio/SoundSets"))
                           .setCodec(SoundSet.CODEC))
                        .setKeyFunction(SoundSet::getId))
                     .setReplaceOnRemove(SoundSet::new))
                  .setPacketGenerator(new SoundSetPacketGenerator())
                  .loadsAfter(SoundEvent.class))
               .preLoadAssets(Collections.singletonList(SoundSet.EMPTY_SOUND_SET)))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                              AudioState.class, new IndexedLookupTableAssetMap<>(AudioState[]::new)
                           )
                           .setPath("Audio/AudioStates"))
                        .setCodec(AudioState.CODEC))
                     .setKeyFunction(AudioState::getId))
                  .setReplaceOnRemove(AudioState::new))
               .setPacketGenerator(new AudioStatePacketGenerator())
               .preLoadAssets(Collections.singletonList(AudioState.EMPTY_AUDIO_STATE)))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                                 AudioCategory.class, new IndexedLookupTableAssetMap<>(AudioCategory[]::new)
                              )
                              .setPath("Audio/AudioCategories"))
                           .setCodec(AudioCategory.CODEC))
                        .setKeyFunction(AudioCategory::getId))
                     .setReplaceOnRemove(AudioCategory::new))
                  .setPacketGenerator(new AudioCategoryPacketGenerator())
                  .preLoadAssets(AudioCategory.PRELOAD_ORDER))
               .loadsAfter(AudioState.class))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                              ReverbEffect.class, new IndexedLookupTableAssetMap<>(ReverbEffect[]::new)
                           )
                           .setPath("Audio/Reverb"))
                        .setCodec(ReverbEffect.CODEC))
                     .setKeyFunction(ReverbEffect::getId))
                  .setReplaceOnRemove(ReverbEffect::new))
               .setPacketGenerator(new ReverbEffectPacketGenerator())
               .preLoadAssets(Collections.singletonList(ReverbEffect.EMPTY_REVERB_EFFECT)))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                              EqualizerEffect.class, new IndexedLookupTableAssetMap<>(EqualizerEffect[]::new)
                           )
                           .setPath("Audio/EQ"))
                        .setCodec(EqualizerEffect.CODEC))
                     .setKeyFunction(EqualizerEffect::getId))
                  .setReplaceOnRemove(EqualizerEffect::new))
               .setPacketGenerator(new EqualizerEffectPacketGenerator())
               .preLoadAssets(Collections.singletonList(EqualizerEffect.EMPTY_EQUALIZER_EFFECT)))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                           ResponseCurve.class, new IndexedLookupTableAssetMap<>(ResponseCurve[]::new)
                        )
                        .setPath("ResponseCurves"))
                     .setCodec(ResponseCurve.CODEC))
                  .setKeyFunction(ResponseCurve::getId))
               .setReplaceOnRemove(ExponentialResponseCurve::new))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                                 ItemQuality.class, new IndexedLookupTableAssetMap<>(ItemQuality[]::new)
                              )
                              .setPath("Item/Qualities"))
                           .setCodec(ItemQuality.CODEC))
                        .setKeyFunction(ItemQuality::getId))
                     .setPacketGenerator(new ItemQualityPacketGenerator())
                     .setReplaceOnRemove(ItemQuality::new))
                  .loadsAfter(ParticleSystem.class))
               .preLoadAssets(Collections.singletonList(ItemQuality.DEFAULT_ITEM_QUALITY)))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                              DamageCause.class, new IndexedLookupTableAssetMap<>(DamageCause[]::new)
                           )
                           .setPath("Entity/Damage"))
                        .setCodec(DamageCause.CODEC))
                     .setKeyFunction(DamageCause::getId))
                  .setReplaceOnRemove(DamageCause::new))
               .loadsBefore(Item.class, Interaction.class))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                           ProjectileConfig.class, new DefaultAssetMap()
                        )
                        .setPath("ProjectileConfigs"))
                     .setCodec(ProjectileConfig.CODEC))
                  .setKeyFunction(ProjectileConfig::getId))
               .loadsAfter(Interaction.class, SoundEvent.class, ModelAsset.class, ParticleSystem.class))
            .setPacketGenerator(new ProjectileConfigPacketGenerator())
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                           BlockGroup.class, new DefaultAssetMap()
                        )
                        .setPath("Item/Groups"))
                     .setCodec(BlockGroup.CODEC))
                  .setKeyFunction(BlockGroup::getId))
               .loadsAfter(BlockType.class, Item.class))
            .setPacketGenerator(new BlockGroupPacketGenerator())
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                           BuilderToolItemReferenceAsset.class, new DefaultAssetMap()
                        )
                        .setPath("Item/PlayerToolsMenuConfig"))
                     .setCodec(BuilderToolItemReferenceAsset.CODEC))
                  .setKeyFunction(BuilderToolItemReferenceAsset::getId))
               .loadsAfter(BlockType.class, Item.class))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                        BlockTypeListAsset.class, new DefaultAssetMap()
                     )
                     .setPath("BlockTypeList"))
                  .setKeyFunction(BlockTypeListAsset::getId))
               .setCodec(BlockTypeListAsset.CODEC))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(PrefabListAsset.class, new DefaultAssetMap())
                     .setPath("PrefabList"))
                  .setKeyFunction(PrefabListAsset::getId))
               .setCodec(PrefabListAsset.CODEC))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                              CameraEffect.class, new IndexedLookupTableAssetMap<>(CameraEffect[]::new)
                           )
                           .loadsBefore(GameplayConfig.class, Interaction.class))
                        .setPath("Camera/CameraEffect"))
                     .setCodec(CameraEffect.CODEC))
                  .setKeyFunction(CameraEffect::getId))
               .setReplaceOnRemove(CameraEffect.MissingCameraEffect::new))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                           TagPattern.class, new IndexedLookupTableAssetMap<>(TagPattern[]::new)
                        )
                        .setPath("TagPatterns"))
                     .setCodec(TagPattern.CODEC))
                  .setKeyFunction(TagPattern::getId))
               .setReplaceOnRemove(EqualsTagOp::new))
            .setPacketGenerator(new TagPatternPacketGenerator())
            .build()
      );
      TagPattern.CODEC.register("Equals", EqualsTagOp.class, EqualsTagOp.CODEC);
      TagPattern.CODEC.register("And", AndPatternOp.class, AndPatternOp.CODEC);
      TagPattern.CODEC.register("Or", OrPatternOp.class, OrPatternOp.CODEC);
      TagPattern.CODEC.register("Not", NotPatternOp.class, NotPatternOp.CODEC);
   }
}