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