package net.minecraft.util.debug; import java.util.Objects; import java.util.Optional; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.util.Util; import org.jspecify.annotations.Nullable; public class DebugSubscription { public static final int DOES_NOT_EXPIRE = 0; @Nullable private final StreamCodec valueStreamCodec; private final int expireAfterTicks; public DebugSubscription(@Nullable final StreamCodec valueStreamCodec, final int expireAfterTicks) { this.valueStreamCodec = valueStreamCodec; this.expireAfterTicks = expireAfterTicks; } public DebugSubscription(@Nullable final StreamCodec valueStreamCodec) { this(valueStreamCodec, 0); } public DebugSubscription.Update packUpdate(@Nullable final T value) { return new DebugSubscription.Update<>(this, Optional.ofNullable(value)); } public DebugSubscription.Update emptyUpdate() { return new DebugSubscription.Update<>(this, Optional.empty()); } public DebugSubscription.Event packEvent(final T value) { return new DebugSubscription.Event<>(this, value); } public String toString() { return Util.getRegisteredName(BuiltInRegistries.DEBUG_SUBSCRIPTION, this); } @Nullable public StreamCodec valueStreamCodec() { return this.valueStreamCodec; } public int expireAfterTicks() { return this.expireAfterTicks; } public record Event(DebugSubscription subscription, T value) { public static final StreamCodec> STREAM_CODEC = ByteBufCodecs.registry(Registries.DEBUG_SUBSCRIPTION) .dispatch(DebugSubscription.Event::subscription, DebugSubscription.Event::streamCodec); private static StreamCodec> streamCodec(final DebugSubscription subscription) { return ((StreamCodec)Objects.requireNonNull(subscription.valueStreamCodec)) .map(value -> new DebugSubscription.Event<>(subscription, (T)value), DebugSubscription.Event::value); } } public record Update(DebugSubscription subscription, Optional value) { public static final StreamCodec> STREAM_CODEC = ByteBufCodecs.registry(Registries.DEBUG_SUBSCRIPTION) .dispatch(DebugSubscription.Update::subscription, DebugSubscription.Update::streamCodec); private static StreamCodec> streamCodec(final DebugSubscription subscription) { return ByteBufCodecs.optional((StreamCodec)Objects.requireNonNull(subscription.valueStreamCodec)) .map(value -> new DebugSubscription.Update<>(subscription, value), DebugSubscription.Update::value); } } }