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