minecraft-src/net/minecraft/world/level/gameevent/vibrations/VibrationSelector.java
2025-07-04 01:41:11 +03:00

66 lines
2.3 KiB
Java

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<VibrationSelector> 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<Pair<VibrationInfo, Long>> currentVibrationData;
public VibrationSelector(Optional<VibrationInfo> 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<VibrationInfo, Long> pair = (Pair<VibrationInfo, Long>)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<VibrationInfo> 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();
}
}