1
0
forked from Clones/Controlify

server support

This commit is contained in:
isXander
2023-06-11 20:25:55 +01:00
parent d81e0dabf8
commit 5d4cc1232d
40 changed files with 599 additions and 112 deletions

View File

@ -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);
};
}
}

View File

@ -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() {

View File

@ -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);
}