package net.minecraft.world.level.gameevent.vibrations; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder.Instance; import java.util.Optional; import org.apache.commons.lang3.tuple.Pair; public class VibrationSelector { public static final Codec CODEC = RecordCodecBuilder.create( p_327443_ -> p_327443_.group( VibrationInfo.CODEC.lenientOptionalFieldOf("event").forGetter(p_251862_ -> p_251862_.currentVibrationData.map(Pair::getLeft)), Codec.LONG.fieldOf("tick").forGetter(p_251458_ -> p_251458_.currentVibrationData.map(Pair::getRight).orElse(-1L)) ) .apply(p_327443_, VibrationSelector::new) ); private Optional> currentVibrationData; public VibrationSelector(Optional p_251736_, long p_251649_) { this.currentVibrationData = p_251736_.map(p_251571_ -> Pair.of(p_251571_, p_251649_)); } public VibrationSelector() { this.currentVibrationData = Optional.empty(); } public void addCandidate(VibrationInfo p_250149_, long p_249749_) { if (this.shouldReplaceVibration(p_250149_, p_249749_)) { this.currentVibrationData = Optional.of(Pair.of(p_250149_, p_249749_)); } } private boolean shouldReplaceVibration(VibrationInfo p_248697_, long p_249040_) { if (this.currentVibrationData.isEmpty()) { return true; } else { Pair pair = this.currentVibrationData.get(); long i = pair.getRight(); if (p_249040_ != i) { return false; } else { VibrationInfo vibrationinfo = pair.getLeft(); if (p_248697_.distance() < vibrationinfo.distance()) { return true; } else { return p_248697_.distance() > vibrationinfo.distance() ? false : VibrationSystem.getGameEventFrequency(p_248697_.gameEvent()) > VibrationSystem.getGameEventFrequency(vibrationinfo.gameEvent()); } } } } public Optional chosenCandidate(long p_250251_) { if (this.currentVibrationData.isEmpty()) { return Optional.empty(); } else { return this.currentVibrationData.get().getRight() < p_250251_ ? Optional.of(this.currentVibrationData.get().getLeft()) : Optional.empty(); } } public void startOver() { this.currentVibrationData = Optional.empty(); } }