Added config options!
This commit is contained in:
parent
c00b2444bd
commit
73cbdf7b58
|
@ -1,3 +1,5 @@
|
||||||
# Speed Carts
|
# Speed Carts
|
||||||
|
|
||||||
This mod adds the ability to control minecarts with signs.
|
This mod adds the ability to control minecarts with signs.
|
||||||
|
|
||||||
|
All you need to do is place a sign beside the rail, and put a number on the first line of the sign that indicates the desired speed of carts, in meters per second.
|
||||||
|
|
10
build.gradle
10
build.gradle
|
@ -27,8 +27,14 @@ dependencies {
|
||||||
// Fabric API. This is technically optional, but you probably want it anyway.
|
// Fabric API. This is technically optional, but you probably want it anyway.
|
||||||
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
|
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
|
||||||
|
|
||||||
// PSA: Some older mods, compiled on Loom 0.2.1, might have outdated Maven POMs.
|
// Jackson API for config file parsing.
|
||||||
// You may need to force-disable transitiveness on them.
|
implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.12.4'
|
||||||
|
include group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.12.4'
|
||||||
|
// Include Jackson dependencies since include directive is not transitive:
|
||||||
|
include group: 'org.yaml', name: 'snakeyaml', version: '1.27'
|
||||||
|
include group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.12.4'
|
||||||
|
include group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.12.4'
|
||||||
|
include group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.12.4'
|
||||||
}
|
}
|
||||||
|
|
||||||
processResources {
|
processResources {
|
||||||
|
|
|
@ -8,7 +8,7 @@ org.gradle.jvmargs=-Xmx1G
|
||||||
loader_version=0.11.6
|
loader_version=0.11.6
|
||||||
|
|
||||||
# Mod Properties
|
# Mod Properties
|
||||||
mod_version = 1.0.0
|
mod_version = 1.1.0
|
||||||
maven_group = nl.andrewlalis
|
maven_group = nl.andrewlalis
|
||||||
archives_base_name = speed-carts
|
archives_base_name = speed-carts
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,65 @@
|
||||||
|
package nl.andrewlalis.speed_carts;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.UncheckedIOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contains all configuration options and the logic for loading config.
|
||||||
|
*/
|
||||||
|
public class Config {
|
||||||
|
private static final Path CONFIG_FILE = Path.of("config", "speed_carts.yaml");
|
||||||
|
|
||||||
|
private final double defaultSpeed;
|
||||||
|
private final double minimumSpeed;
|
||||||
|
private final double maximumSpeed;
|
||||||
|
private final String signRegex;
|
||||||
|
|
||||||
|
public Config() {
|
||||||
|
try {
|
||||||
|
this.ensureConfigExists();
|
||||||
|
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
|
||||||
|
JsonNode configJson = mapper.readTree(Files.newInputStream(CONFIG_FILE));
|
||||||
|
this.defaultSpeed = configJson.get("defaultSpeed").asDouble();
|
||||||
|
this.minimumSpeed = configJson.get("minimumSpeed").asDouble();
|
||||||
|
this.maximumSpeed = configJson.get("maximumSpeed").asDouble();
|
||||||
|
this.signRegex = configJson.get("signRegex").asText();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new UncheckedIOException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ensureConfigExists() throws IOException {
|
||||||
|
if (!Files.exists(CONFIG_FILE)) {
|
||||||
|
var out = Files.newOutputStream(CONFIG_FILE);
|
||||||
|
var defaultConfigInputStream = SpeedCarts.class.getClassLoader().getResourceAsStream("default_config.yaml");
|
||||||
|
if (defaultConfigInputStream == null) {
|
||||||
|
throw new IOException("Could not load default_config.yaml");
|
||||||
|
}
|
||||||
|
defaultConfigInputStream.transferTo(out);
|
||||||
|
defaultConfigInputStream.close();
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getDefaultSpeed() {
|
||||||
|
return defaultSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getMinimumSpeed() {
|
||||||
|
return minimumSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getMaximumSpeed() {
|
||||||
|
return maximumSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSignRegex() {
|
||||||
|
return signRegex;
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,8 +3,11 @@ package nl.andrewlalis.speed_carts;
|
||||||
import net.fabricmc.api.ModInitializer;
|
import net.fabricmc.api.ModInitializer;
|
||||||
|
|
||||||
public class SpeedCarts implements ModInitializer {
|
public class SpeedCarts implements ModInitializer {
|
||||||
|
public static Config config;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onInitialize() {
|
public void onInitialize() {
|
||||||
|
config = new Config();
|
||||||
System.out.println("Speed Carts initialized.");
|
System.out.println("Speed Carts initialized.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@ import net.minecraft.util.math.Direction;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraft.util.math.Vec3i;
|
import net.minecraft.util.math.Vec3i;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
import nl.andrewlalis.speed_carts.SpeedCarts;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
@ -29,6 +30,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mixin which overrides the default minecart behavior so that we can define a
|
* Mixin which overrides the default minecart behavior so that we can define a
|
||||||
|
@ -36,9 +38,16 @@ import java.util.List;
|
||||||
*/
|
*/
|
||||||
@Mixin(AbstractMinecartEntity.class)
|
@Mixin(AbstractMinecartEntity.class)
|
||||||
public abstract class AbstractMinecartMixin extends Entity {
|
public abstract class AbstractMinecartMixin extends Entity {
|
||||||
private static final double DEFAULT_SPEED = 8.0;
|
private static final double DEFAULT_SPEED = SpeedCarts.config.getDefaultSpeed();
|
||||||
private static final double MIN_SPEED = 1.0;
|
private static final double MIN_SPEED = SpeedCarts.config.getMinimumSpeed();
|
||||||
private static final double MAX_SPEED = 128.0;
|
private static final double MAX_SPEED = SpeedCarts.config.getMaximumSpeed();
|
||||||
|
private static final Pattern SIGN_PATTERN = Pattern.compile(SpeedCarts.config.getSignRegex());
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Time in game ticks, to wait before attempting to update the cart's speed
|
||||||
|
* from the same position, after that block/sign has already updated the
|
||||||
|
* cart's speed just before.
|
||||||
|
*/
|
||||||
private static final long SPEED_UPDATE_COOLDOWN = 20 * 3;
|
private static final long SPEED_UPDATE_COOLDOWN = 20 * 3;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -130,6 +139,9 @@ public abstract class AbstractMinecartMixin extends Entity {
|
||||||
private boolean updateSpeedForSign(SignBlockEntity sign) {
|
private boolean updateSpeedForSign(SignBlockEntity sign) {
|
||||||
Text text = sign.getTextOnRow(0, false);
|
Text text = sign.getTextOnRow(0, false);
|
||||||
String s = text.asString();
|
String s = text.asString();
|
||||||
|
if (!SIGN_PATTERN.matcher(s).matches()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
double speed = Double.parseDouble(s);
|
double speed = Double.parseDouble(s);
|
||||||
if (speed >= MIN_SPEED && speed <= MAX_SPEED) {
|
if (speed >= MIN_SPEED && speed <= MAX_SPEED) {
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
# Configuration for Speed Carts
|
||||||
|
# -----------------------------
|
||||||
|
# A server restart is required to apply changes.
|
||||||
|
|
||||||
|
# The default speed for all carts in the world, in meters per second.
|
||||||
|
defaultSpeed: 8
|
||||||
|
|
||||||
|
# The minimum allowable speed limit that can be set, in meters per second.
|
||||||
|
minimumSpeed: 1
|
||||||
|
|
||||||
|
# The maximum allowable speed limit that can be set, in meters per second.
|
||||||
|
# Note: when a player is riding the cart, it cannot exceed 32 m/s regardless of the maximum set here.
|
||||||
|
maximumSpeed: 128
|
||||||
|
|
||||||
|
# The regular expression that's used to determine if a sign should affect the cart's speed.
|
||||||
|
# By default, it matches any positive decimal number.
|
||||||
|
signRegex: \d+(\.\d+)?
|
Loading…
Reference in New Issue