forked from Clones/Controlify
server support
This commit is contained in:
@ -5,7 +5,9 @@ import net.minecraft.util.Mth;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import org.apache.commons.lang3.Validate;
|
||||
|
||||
import java.util.function.BooleanSupplier;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class ContinuousRumbleEffect implements RumbleEffect {
|
||||
private final Function<Integer, RumbleState> stateFunction;
|
||||
@ -14,17 +16,21 @@ public class ContinuousRumbleEffect implements RumbleEffect {
|
||||
private final int minTime;
|
||||
private int tick;
|
||||
private boolean stopped;
|
||||
private BooleanSupplier stopCondition;
|
||||
|
||||
public ContinuousRumbleEffect(Function<Integer, RumbleState> stateFunction, int priority, int timeout, int minTime) {
|
||||
public ContinuousRumbleEffect(Function<Integer, RumbleState> stateFunction, int priority, int timeout, int minTime, BooleanSupplier stopCondition) {
|
||||
this.stateFunction = stateFunction;
|
||||
this.priority = priority;
|
||||
this.timeout = timeout;
|
||||
this.minTime = minTime;
|
||||
this.stopCondition = stopCondition;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
tick++;
|
||||
if (stopCondition.getAsBoolean())
|
||||
stop();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -64,6 +70,7 @@ public class ContinuousRumbleEffect implements RumbleEffect {
|
||||
private int timeout = -1;
|
||||
private int minTime;
|
||||
private InWorldProperties inWorldProperties;
|
||||
private BooleanSupplier stopCondition = () -> false;
|
||||
|
||||
private Builder() {
|
||||
}
|
||||
@ -101,8 +108,15 @@ public class ContinuousRumbleEffect implements RumbleEffect {
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder inWorld(Vec3 sourceLocation, float minMagnitude, float maxMagnitude, float minDistance, float maxDistance, Function<Float, Float> fallofFunction) {
|
||||
this.inWorldProperties = new InWorldProperties(sourceLocation, minMagnitude, maxMagnitude, minDistance, maxDistance, fallofFunction);
|
||||
public Builder inWorld(Supplier<Vec3> sourceLocation, float min, float max, float effectRange, Function<Float, Float> fallofFunction) {
|
||||
this.inWorldProperties = new InWorldProperties(sourceLocation, min, max, effectRange, fallofFunction);
|
||||
stopCondition(() -> Minecraft.getInstance().cameraEntity == null);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder stopCondition(BooleanSupplier stopCondition) {
|
||||
BooleanSupplier oldStopCondition = this.stopCondition;
|
||||
this.stopCondition = () -> stopCondition.getAsBoolean() || oldStopCondition.getAsBoolean();
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -114,15 +128,20 @@ public class ContinuousRumbleEffect implements RumbleEffect {
|
||||
if (inWorldProperties != null)
|
||||
stateFunction = inWorldProperties.modify(stateFunction);
|
||||
|
||||
return new ContinuousRumbleEffect(stateFunction, priority, timeout, minTime);
|
||||
return new ContinuousRumbleEffect(stateFunction, priority, timeout, minTime, stopCondition);
|
||||
}
|
||||
|
||||
private record InWorldProperties(Vec3 sourceLocation, float minMagnitude, float maxMagnitude, float minDistance, float maxDistance, Function<Float, Float> fallofFunction) {
|
||||
private record InWorldProperties(Supplier<Vec3> sourceLocation, float minMagnitude, float maxMagnitude, float effectRange, Function<Float, Float> fallofFunction) {
|
||||
private Function<Integer, RumbleState> modify(Function<Integer, RumbleState> stateFunction) {
|
||||
return tick -> {
|
||||
float distanceSqr = (float) Mth.clamp(Minecraft.getInstance().player.distanceToSqr(sourceLocation), minDistance, maxDistance);
|
||||
float magnitude = Mth.lerp(1f - fallofFunction.apply(distanceSqr / (maxDistance * maxDistance)), minMagnitude, maxMagnitude);
|
||||
return stateFunction.apply(tick).mul(magnitude);
|
||||
if (Minecraft.getInstance().cameraEntity == null)
|
||||
return RumbleState.NONE;
|
||||
|
||||
float distanceSqr = (float) Minecraft.getInstance().cameraEntity.distanceToSqr(sourceLocation.get());
|
||||
float normalizedDistance = Mth.clamp(distanceSqr / (effectRange * effectRange), 0, 1);
|
||||
float multiplier = Mth.lerp(fallofFunction.apply(1f - normalizedDistance), minMagnitude, maxMagnitude);
|
||||
|
||||
return stateFunction.apply(tick).mul(multiplier);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -1,11 +1,12 @@
|
||||
package dev.isxander.controlify.rumble;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import dev.isxander.controlify.utils.Log;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class RumbleSource {
|
||||
public record RumbleSource(ResourceLocation id) {
|
||||
private static final Map<ResourceLocation, RumbleSource> SOURCES = new LinkedHashMap<>();
|
||||
|
||||
public static final RumbleSource
|
||||
@ -19,14 +20,13 @@ public class RumbleSource {
|
||||
MISC = register("misc"),
|
||||
GLOBAL_EVENT = register("global_event");
|
||||
|
||||
private final ResourceLocation id;
|
||||
|
||||
private RumbleSource(ResourceLocation id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public ResourceLocation id() {
|
||||
return id;
|
||||
public static RumbleSource get(ResourceLocation id) {
|
||||
RumbleSource source = SOURCES.get(id);
|
||||
if (source == null) {
|
||||
Log.LOGGER.warn("Unknown rumble source: {}. Using master.", id);
|
||||
return MASTER;
|
||||
}
|
||||
return source;
|
||||
}
|
||||
|
||||
public static Collection<RumbleSource> values() {
|
||||
|
@ -1,6 +1,8 @@
|
||||
package dev.isxander.controlify.rumble;
|
||||
|
||||
public record RumbleState(float strong, float weak) {
|
||||
public static final RumbleState NONE = new RumbleState(0.0F, 0.0F);
|
||||
|
||||
public RumbleState mul(float multiplier) {
|
||||
return new RumbleState(strong * multiplier, weak * multiplier);
|
||||
}
|
||||
|
Reference in New Issue
Block a user