AudioCategory class

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

Файл: com/hypixel/hytale/server/core/asset/type/audiocategory/config/AudioCategory.java

implements: JsonAssetWithMap<String, IndexedLookupTableAssetMap<String, AudioCategory>>, NetworkSerializable<com.hypixel.hytale.protocol.AudioCategory>

Поля (18)

МодификаторыТипИмя
ASSET_STORE
final int EMPTY_ID
return
return
return
return
com.hypixel.hytale.protocol.AudioCategory var1
AssetStore var1
HashSet var2
Object var2
float var2
String var2
AssetExtraInfo.Data var3
var3
int var3
IndexedLookupTableAssetMap var4
String var6
AudioCategory var7

Методы (22)

МодификаторыВозвратСигнатура
for for(int var5 = 0; var5 < 128; var5++)
static IndexedLookupTableAssetMap<String, AudioCategory> getAssetMapIndexedLookupTableAssetMap<String, AudioCategory> getAssetMap()
static AssetStore<String, AudioCategory, IndexedLookupTableAssetMap<String, AudioCategory>> getAssetStoreAssetStore<String, AudioCategory, IndexedLookupTableAssetMap<String, AudioCategory>> getAssetStore()
public String getIdString getId()
public float getVolumefloat getVolume()
if if(var0.data != null)
if if(var6 == null)
if if(var7 == null)
if if(var3 == null)
if if(var0.data != null)
if if(var2 != null)
if if(ASSET_STORE == null)
if if(this.data == null)
if if(var2 == null)
static void processConfigvoid processConfig(@Nonnull AudioCategory var0)
private int resolveParentIndexint resolveParentIndex()
static void validateParentChainvoid validateParentChain(@Nonnull AudioCategory var0, @Nonnull ValidationResults var1)
abstract validateParentChain validateParentChain(var0, var1)
static void validateWellKnownRootHasNoParentvoid validateWellKnownRootHasNoParent(@Nonnull AudioCategory var0, @Nonnull ValidationResults var1)
abstract validateWellKnownRootHasNoParent validateWellKnownRootHasNoParent(var0, var1)
static void validateWellKnownRootHasUnityVolumevoid validateWellKnownRootHasUnityVolume(@Nonnull AudioCategory var0, @Nonnull ValidationResults var1)
abstract validateWellKnownRootHasUnityVolume validateWellKnownRootHasUnityVolume(var0, var1)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.asset.type.audiocategory.config;

class="kw">import com.hypixel.hytale.assetstore.AssetExtraInfo;
class="kw">import com.hypixel.hytale.assetstore.AssetKeyValidator;
class="kw">import com.hypixel.hytale.assetstore.AssetRegistry;
class="kw">import com.hypixel.hytale.assetstore.AssetStore;
class="kw">import com.hypixel.hytale.assetstore.codec.AssetBuilderCodec;
class="kw">import com.hypixel.hytale.assetstore.map.IndexedLookupTableAssetMap;
class="kw">import com.hypixel.hytale.assetstore.map.JsonAssetWithMap;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.schema.metadata.ui.UIEditor;
class="kw">import com.hypixel.hytale.codec.validation.ValidationResults;
class="kw">import com.hypixel.hytale.codec.validation.ValidatorCache;
class="kw">import com.hypixel.hytale.codec.validation.Validators;
class="kw">import com.hypixel.hytale.common.util.AudioUtil;
class="kw">import com.hypixel.hytale.server.core.asset.type.audiostate.config.AudioStateResolver;
class="kw">import com.hypixel.hytale.server.core.asset.type.audiostate.config.StateBindingConfig;
class="kw">import com.hypixel.hytale.server.core.io.NetworkSerializable;
class="kw">import java.util.HashSet;
class="kw">import java.util.List;
class="kw">import java.util.Set;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class AudioCategory
   class="kw">implements JsonAssetWithMap<String, IndexedLookupTableAssetMap<String, AudioCategory>>,
   NetworkSerializable<com.hypixel.hytale.protocol.AudioCategory> {
   class="kw">public class="kw">static class="kw">final int EMPTY_ID = 0;
   class="kw">public class="kw">static class="kw">final String EMPTY = "EMPTY";
   class="kw">public class="kw">static class="kw">final String MUSIC = "AudioCat_Music";
   class="kw">public class="kw">static class="kw">final String AMBIENT = "AudioCat_Ambient";
   class="kw">public class="kw">static class="kw">final String SFX = "AudioCat_SFX";
   class="kw">public class="kw">static class="kw">final String VOICE = "AudioCat_Voice";
   class="kw">public class="kw">static class="kw">final String UI = "AudioCat_UI";
   class="kw">public class="kw">static class="kw">final AudioCategory EMPTY_AUDIO_CATEGORY = new AudioCategory("EMPTY");
   class="kw">public class="kw">static class="kw">final AudioCategory MUSIC_AUDIO_CATEGORY = new AudioCategory("AudioCat_Music");
   class="kw">public class="kw">static class="kw">final AudioCategory AMBIENT_AUDIO_CATEGORY = new AudioCategory("AudioCat_Ambient");
   class="kw">public class="kw">static class="kw">final AudioCategory SFX_AUDIO_CATEGORY = new AudioCategory("AudioCat_SFX");
   class="kw">public class="kw">static class="kw">final AudioCategory VOICE_AUDIO_CATEGORY = new AudioCategory("AudioCat_Voice");
   class="kw">public class="kw">static class="kw">final AudioCategory UI_AUDIO_CATEGORY = new AudioCategory("AudioCat_UI");
   class="kw">public class="kw">static class="kw">final List<AudioCategory> PRELOAD_ORDER = List.of(
      EMPTY_AUDIO_CATEGORY, MUSIC_AUDIO_CATEGORY, AMBIENT_AUDIO_CATEGORY, SFX_AUDIO_CATEGORY, VOICE_AUDIO_CATEGORY, UI_AUDIO_CATEGORY
   );
   class="kw">public class="kw">static class="kw">final Set<String> WELL_KNOWN_ROOT_NAMES = Set.of("AudioCat_Music", "AudioCat_Ambient", "AudioCat_SFX", "AudioCat_Voice", "AudioCat_UI");
   class="kw">private class="kw">static class="kw">final int MAX_PARENT_DEPTH = 128;
   class="kw">public class="kw">static class="kw">final AssetBuilderCodec<String, AudioCategory> CODEC = AssetBuilderCodec.<String, AudioCategory>builder(
         AudioCategory.class,
         AudioCategory::new,
         Codec.STRING,
         (var0, var1) -> var0.id = var1,
         var0 -> var0.id,
         (var0, var1) -> var0.data = var1,
         var0 -> var0.data
      )
      .documentation(
         "An asset used to define an audio category. Can be used to adjust the volume of all sound events that reference a given category. Note: categories form a hierarchy via the generic JSON parent mechanism, acting as an audio bus. e.g. if the category's volume is 4dB and the parent is -2dB, the class="kw">final volume will be 2dB."
      )
      .<Float>append(
         new KeyedCodec<>("Volume", Codec.FLOAT),
         (var0, var1) -> var0.volume = AudioUtil.decibelsToLinearGain(var1),
         var0 -> AudioUtil.linearGainToDecibels(var0.volume)
      )
      .metadata(new UIEditor(new UIEditor.FormattedNumber(null, " dB", null)))
      .addValidator(Validators.range(-100.0F, 10.0F))
      .documentation("Volume adjustment for this audio category in decibels.")
      .add()
      .<StateBindingConfig[]>append(
         new KeyedCodec<>("StateBindings", StateBindingConfig.CODEC_ARRAY), (var0, var1) -> var0.stateBindings = var1, var0 -> var0.stateBindings
      )
      .documentation(
         "Subscribe this AudioCategory to one or more AudioState axes. Per-state volume deltas drive the category's volume modifier and cascade to voices in descendant categories."
      )
      .add()
      .<AudioCategoryDuckingRuleConfig[]>append(
         new KeyedCodec<>("DuckingRules", AudioCategoryDuckingRuleConfig.CODEC_ARRAY), (var0, var1) -> var0.duckingRules = var1, var0 -> var0.duckingRules
      )
      .documentation(
         "Per-bus class="kw">default duck rules. When any voice is routed through this category (or any descendant category), each rule attenuates its TargetCategory."
      )
      .add()
      .<Float>append(new KeyedCodec<>("MaxDuckingDb", Codec.FLOAT), (var0, var1) -> var0.maxDuckingDb = var1, var0 -> var0.maxDuckingDb)
      .addValidator(Validators.range(-100.0F, 0.0F))
      .documentation("Ceiling on how much this category can be ducked.")
      .add()
      .afterDecode(AudioCategory::processConfig)
      .validator((var0, var1) -> {
         validateParentChain(var0, var1);
         validateWellKnownRootHasNoParent(var0, var1);
         validateWellKnownRootHasUnityVolume(var0, var1);
         AudioStateResolver.validateBindings(var0.stateBindings, "AudioCategory '" + var0.id + "'", var1);
         AudioCategoryDuckingRuleConfig.validateUniqueTargets(var0.duckingRules, "AudioCategory '" + var0.id + "'", var1);
      })
      .build();
   class="kw">public class="kw">static class="kw">final ValidatorCache<String> VALIDATOR_CACHE = new ValidatorCache<>(new AssetKeyValidator<>(AudioCategory::getAssetStore));
   class="kw">private class="kw">static AssetStore<String, AudioCategory, IndexedLookupTableAssetMap<String, AudioCategory>> ASSET_STORE;
   class="kw">protected AssetExtraInfo.Data data;
   class="kw">protected String id;
   class="kw">protected float volume = AudioUtil.decibelsToLinearGain(0.0F);
   @Nullable
   class="kw">protected StateBindingConfig[] stateBindings;
   @Nullable
   class="kw">protected AudioCategoryDuckingRuleConfig[] duckingRules;
   class="kw">protected float maxDuckingDb = -100.0F;

   class="kw">private class="kw">static void validateParentChain(@Nonnull AudioCategory var0, @Nonnull ValidationResults var1) {
      if (var0.data != null) {
         HashSet var2 = new HashSet<>();
         var2.add(var0.id);
         AssetExtraInfo.Data var3 = var0.data;
         IndexedLookupTableAssetMap var4 = getAssetMap();

         for (int var5 = 0; var5 < 128; var5++) {
            String var6 = getAssetStore().transformKey(var3.getParentKey());
            if (var6 == null) {
               class="kw">return;
            }

            if (!var2.add(var6)) {
               var1.fail("AudioCategory '" + var0.id + "' parent chain contains a cycle through '" + var6 + "'");
               class="kw">return;
            }

            AudioCategory var7 = var4.getAsset(var6);
            if (var7 == null) {
               class="kw">return;
            }

            var3 = var7.data;
            if (var3 == null) {
               class="kw">return;
            }
         }

         var1.fail("AudioCategory '" + var0.id + "' parent chain exceeds max depth 128 - likely a cycle or pathological hierarchy");
      }
   }

   class="kw">private class="kw">static void validateWellKnownRootHasNoParent(@Nonnull AudioCategory var0, @Nonnull ValidationResults var1) {
      if (WELL_KNOWN_ROOT_NAMES.contains(var0.id)) {
         if (var0.data != null) {
            Object var2 = var0.data.getParentKey();
            if (var2 != null) {
               var1.fail(
                  "Well-known root AudioCategory '"
                     + var0.id
                     + "' cannot have a Parent (got '"
                     + var2
                     + "'). The 5 well-known roots (AudioCat_Music, AudioCat_Ambient, AudioCat_SFX, AudioCat_Voice, AudioCat_UI) must remain top-level - they occupy reserved indices 1-5 used by client routing."
               );
            }
         }
      }
   }

   class="kw">private class="kw">static void validateWellKnownRootHasUnityVolume(@Nonnull AudioCategory var0, @Nonnull ValidationResults var1) {
      if (WELL_KNOWN_ROOT_NAMES.contains(var0.id)) {
         if (Math.abs(var0.volume - 1.0F) > 1.0E-4F) {
            float var2 = AudioUtil.linearGainToDecibels(var0.volume);
            var1.fail("Well-known root AudioCategory '" + var0.id + "' must author Volume = 0 dB (got " + var2 + " dB).");
         }
      }
   }

   class="kw">public class="kw">static AssetStore<String, AudioCategory, IndexedLookupTableAssetMap<String, AudioCategory>> getAssetStore() {
      if (ASSET_STORE == null) {
         ASSET_STORE = AssetRegistry.getAssetStore(AudioCategory.class);
      }

      class="kw">return ASSET_STORE;
   }

   class="kw">public class="kw">static IndexedLookupTableAssetMap<String, AudioCategory> getAssetMap() {
      class="kw">return (IndexedLookupTableAssetMap<String, AudioCategory>)getAssetStore().getAssetMap();
   }

   class="kw">protected class="kw">static void processConfig(@Nonnull AudioCategory var0) {
      AudioStateResolver.resolveBindings(var0.stateBindings);
   }

   class="kw">public AudioCategory(String var1) {
      this.id = var1;
   }

   class="kw">protected AudioCategory() {
   }

   class="kw">public String getId() {
      class="kw">return this.id;
   }

   class="kw">public float getVolume() {
      class="kw">return this.volume;
   }

   @Nullable
   class="kw">public AudioCategoryDuckingRuleConfig[] getDuckingRules() {
      class="kw">return this.duckingRules;
   }

   @Nonnull
   @Override
   class="kw">public String toString() {
      class="kw">return "AudioCategory{id='" + this.id + "', volume=" + this.volume + "}";
   }

   @Nonnull
   class="kw">public com.hypixel.hytale.protocol.AudioCategory toPacket() {
      com.hypixel.hytale.protocol.AudioCategory var1 = new com.hypixel.hytale.protocol.AudioCategory();
      var1.id = this.id;
      var1.volume = this.volume;
      var1.parentAudioCategoryIndex = this.resolveParentIndex();
      var1.stateBindings = AudioStateResolver.toPacketArray(this.stateBindings);
      var1.duckingRules = AudioCategoryDuckingRuleConfig.toPacketArray(this.duckingRules);
      var1.maxDuckingDb = this.maxDuckingDb;
      class="kw">return var1;
   }

   class="kw">private int resolveParentIndex() {
      if (this.data == null) {
         class="kw">return -1;
      }

      AssetStore var1 = getAssetStore();
      String var2 = var1.transformKey(this.data.getParentKey());
      if (var2 == null) {
         class="kw">return -1;
      }

      int var3 = ((IndexedLookupTableAssetMap)var1.getAssetMap()).getIndex(var2);
      class="kw">return var3 == Integer.MIN_VALUE ? -1 : var3;
   }
}