SegmentMusicContainer class

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

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

extends: MusicContainer

Поля (15)

МодификаторыТипИмя
break
String[] var1
com.hypixel.hytale.protocol.SegmentMusicContainer var1
float var12
float var13
float var14
HashSet var15
float var2
IndexedAssetMap var2
int var3
boolean var4
var4
var4
LayerPlacement var4
com.hypixel.hytale.protocol.LayerPlacement var5

Методы (17)

МодификаторыВозвратСигнатура
for for(LayerPlacement var8 : var0.layers)
for for(LayerPlacement var11 : var0.layers)
for for(LayerPlacement var4 : var0.layers)
for for(int var2 = 0; var2 < this.layers.length; var2++)
for for(int var3 = 0; var3 < this.layers.length; var3++)
if if(var0.layers != null)
if if(var4 && var0.tempo == null)
if if(var13 < 0.0F)
if if(var0.exitMarker != null)
if if(var14 <= 0.0F)
if if(var0.layers != null)
if if(var11.clipStart != null)
if if(var12 > 0.0F)
if if(var0.layers != null)
if if(this.layers != null && this.layers.length != 0)
if if(this.layers != null && this.layers.length > 0)
abstract super super(var1)

Исходный код

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

class="kw">import com.hypixel.hytale.assetstore.map.IndexedAssetMap;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
class="kw">import com.hypixel.hytale.codec.validation.Validators;
class="kw">import com.hypixel.hytale.common.util.ArrayUtil;
class="kw">import com.hypixel.hytale.server.core.asset.type.audiostate.config.AudioStateResolver;
class="kw">import java.util.HashSet;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class SegmentMusicContainer class="kw">extends MusicContainer {
   @Nonnull
   class="kw">public class="kw">static class="kw">final BuilderCodec<SegmentMusicContainer> CODEC = BuilderCodec.<MusicContainer>builder(
         SegmentMusicContainer.class, SegmentMusicContainer::new, MusicContainer.ABSTRACT_CODEC
      )
      .documentation("A music container with parallel layers on a shared timeline. EntryMarker is the downbeat and ExitMarker is the loop/transition point.")
      .<LayerPlacement[]>appendInherited(
         new KeyedCodec<>("Layers", new ArrayCodec<>(LayerPlacement.CODEC, LayerPlacement[]::new)),
         (var0, var1) -> var0.layers = var1,
         var0 -> var0.layers,
         (var0, var1) -> var0.layers = var1.layers
      )
      .addValidator(Validators.nonEmptyArray())
      .add()
      .<BarBeatDuration>appendInherited(
         new KeyedCodec<>("EntryMarker", BarBeatDuration.CODEC),
         (var0, var1) -> var0.entryMarker = var1,
         var0 -> var0.entryMarker,
         (var0, var1) -> var0.entryMarker = var1.entryMarker
      )
      .documentation(
         "Position of the downbeat on the timeline from segment-time 0. All layers that start at segment-time 0 (no ClipStart) get this much pre-entry material before the downbeat."
      )
      .add()
      .<BarBeatDuration>appendInherited(
         new KeyedCodec<>("ExitMarker", BarBeatDuration.CODEC, true),
         (var0, var1) -> var0.exitMarker = var1,
         var0 -> var0.exitMarker,
         (var0, var1) -> var0.exitMarker = var1.exitMarker
      )
      .documentation(
         "Exit position on the timeline from segment-time 0. The active region is [EntryMarker, ExitMarker]. For looping Segments, this is the loop point. For play-once Segments in a Sequence, this is the transition trigger to the next child."
      )
      .add()
      .validator(
         (var0, var1) -> {
            float var2 = var0.tempo != null ? var0.tempo.bpm : 0.0F;
            int var3 = var0.tempo != null ? var0.tempo.beatsPerBar : 4;
            boolean var4 = var0.entryMarker != null && (var0.entryMarker.bars != 0 || var0.entryMarker.beats != 0);
            if (var0.exitMarker != null && (var0.exitMarker.bars != 0 || var0.exitMarker.beats != 0)) {
               var4 = true;
            }

            if (var0.layers != null) {
               for (LayerPlacement var8 : var0.layers) {
                  if (var8.clipStart != null && (var8.clipStart.bars != 0 || var8.clipStart.beats != 0)) {
                     var4 = true;
                     break;
                  }
               }
            }

            if (var4 && var0.tempo == null) {
               var1.fail("Segment requires a Tempo when EntryMarker, ExitMarker, or ClipStart use bar/beat components");
            } else {
               float var13 = var0.entryMarker != null ? var0.entryMarker.toMs(var2, var3) : 0.0F;
               float var14 = var0.exitMarker != null ? var0.exitMarker.toMs(var2, var3) : 0.0F;
               if (var13 < 0.0F) {
                  var1.fail("EntryMarker resolves to " + var13 + " ms; must be non-negative");
               }

               if (var0.exitMarker != null) {
                  if (var14 <= 0.0F) {
                     var1.fail("ExitMarker resolves to " + var14 + " ms; must be positive");
                  } else if (var14 <= var13) {
                     var1.fail("ExitMarker (" + var14 + " ms) must be after EntryMarker (" + var13 + " ms)");
                  }
               }

               HashSet var15 = new HashSet<>();
               if (var0.layers != null) {
                  for (LayerPlacement var11 : var0.layers) {
                     if (var11.name != null && !var11.name.isBlank()) {
                        if (!var15.add(var11.name)) {
                           var1.fail("Duplicate layer name '" + var11.name + "' in Layers array");
                        }

                        if (var11.clipStart != null) {
                           float var12 = var11.clipStart.toMs(var2, var3);
                           if (var12 > 0.0F) {
                              var1.fail(
                                 "Layer '" + var11.name + "' ClipStart resolves to " + var12 + " ms (positive). Layers must start at or before segment-time 0"
                              );
                           }
                        }

                        AudioStateResolver.validateBindings(var11.stateBindings, "Segment '" + var0.id + "' Layer '" + var11.name + "'", var1);
                     } else {
                        var1.fail("Every layer must have a Name");
                     }
                  }
               }
            }
         }
      )
      .afterDecode(var0 -> {
         if (var0.layers != null) {
            for (LayerPlacement var4 : var0.layers) {
               AudioStateResolver.resolveBindings(var4.stateBindings);
            }
         }
      })
      .build();
   @Nullable
   class="kw">protected LayerPlacement[] layers;
   @Nullable
   class="kw">protected BarBeatDuration entryMarker;
   @Nullable
   class="kw">protected BarBeatDuration exitMarker;

   @Nullable
   class="kw">public LayerPlacement[] getLayers() {
      class="kw">return this.layers;
   }

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

   class="kw">public SegmentMusicContainer(@Nonnull String var1) {
      super(var1);
   }

   @Nonnull
   @Override
   class="kw">public String[] getChildIds() {
      if (this.layers != null && this.layers.length != 0) {
         String[] var1 = new String[this.layers.length];

         for (int var2 = 0; var2 < this.layers.length; var2++) {
            var1[var2] = this.layers[var2].container;
         }

         class="kw">return var1;
      } else {
         class="kw">return ArrayUtil.EMPTY_STRING_ARRAY;
      }
   }

   @Nonnull
   class="kw">public com.hypixel.hytale.protocol.MusicContainer toPacket() {
      com.hypixel.hytale.protocol.SegmentMusicContainer var1 = new com.hypixel.hytale.protocol.SegmentMusicContainer();
      this.fillBasePacketFields(var1);
      var1.entryMarker = this.entryMarker != null ? this.entryMarker.toProtocol() : null;
      var1.exitMarker = this.exitMarker != null ? this.exitMarker.toProtocol() : null;
      if (this.layers != null && this.layers.length > 0) {
         IndexedAssetMap var2 = MusicContainer.getAssetMap();
         var1.layers = new com.hypixel.hytale.protocol.LayerPlacement[this.layers.length];

         for (int var3 = 0; var3 < this.layers.length; var3++) {
            LayerPlacement var4 = this.layers[var3];
            com.hypixel.hytale.protocol.LayerPlacement var5 = new com.hypixel.hytale.protocol.LayerPlacement();
            var5.containerIndex = var4.container != null ? var2.getIndex(var4.container) : 0;
            var5.name = var4.name;
            var5.clipStart = var4.clipStart != null ? var4.clipStart.toProtocol() : null;
            var5.stateBindings = AudioStateResolver.toPacketArray(var4.stateBindings);
            var1.layers[var3] = var5;
         }
      }

      class="kw">return var1;
   }
}