Skip to content

Commit 64e3f7e

Browse files
authored
Merge pull request #4 from stacode123/Config-Implementation
Config implementation
2 parents ea0596e + cbfc5a6 commit 64e3f7e

13 files changed

Lines changed: 236 additions & 25 deletions

File tree

common/build.gradle

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ repositories {
2323

2424
maven { url = "https://api.modrinth.com/maven" } // LazyDFU
2525
maven { url = "https://maven.terraformersmc.com/releases" } // Mod Menu, EMI
26+
maven { url = "https://raw.githubusercontent.com/Fuzss/modresources/main/maven/" }
27+
2628
}
2729

2830
dependencies {
@@ -35,4 +37,7 @@ dependencies {
3537
// All dependencies except Flywheel and Registrate are NOT safe to use!
3638
// Flywheel and Registrate must also be used carefully due to differences across loaders.
3739
modCompileOnly("com.simibubi.create:create-fabric-$minecraft_version:$create_fabric_version")
38-
}
40+
41+
// ForgeConfigAPIPort dependency for configs
42+
modImplementation("fuzs.forgeconfigapiport:forgeconfigapiport-fabric:8.0.2")
43+
}
Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,18 @@
11
package net.Realism;
22

3+
import dev.architectury.injectables.annotations.ExpectPlatform;
4+
5+
36
import dev.architectury.injectables.annotations.ExpectPlatform;
47

58
public class RealismExpectPlatform {
6-
/**
7-
* an example of {@link ExpectPlatform}.
8-
* <p>
9-
* This must be a <b>public static</b> method. The platform-implemented solution must be placed under a
10-
* platform sub-package, with its class suffixed with {@code Impl}.
11-
* <p>
12-
* Example:
13-
* Expect: net.examplemod.ExampleExpectPlatform#platformName()
14-
* Actual Fabric: net.examplemod.fabric.ExampleExpectPlatformImpl#platformName()
15-
* Actual Forge: net.examplemod.forge.ExampleExpectPlatformImpl#platformName()
16-
* <p>
17-
* <a href="https://plugins.jetbrains.com/plugin/16210-architectury">You should also get the IntelliJ plugin to help with @ExpectPlatform.</a>
18-
*/
199
@ExpectPlatform
2010
public static String platformName() {
21-
// Just throw an error, the content should get replaced at runtime.
11+
throw new AssertionError();
12+
}
13+
14+
@ExpectPlatform
15+
public static boolean isForge() {
2216
throw new AssertionError();
2317
}
2418
}

common/src/main/java/net/Realism/RealismMod.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import net.minecraft.resources.ResourceLocation;
55
import org.slf4j.Logger;
66
import org.slf4j.LoggerFactory;
7+
import net.Realism.config.RealismConfig;
8+
79

810
public class RealismMod {
911
public static final String MOD_ID = "realism";
@@ -13,7 +15,7 @@ public class RealismMod {
1315

1416
public static void init() {
1517
LOGGER.info("{} initializing! Create version: {} on platform: {}", NAME, Create.VERSION, RealismExpectPlatform.platformName());
16-
RealismBlocks.init(); // hold registrate in a separate class to avoid loading early on forge
18+
RealismBlocks.init();
1719
}
1820

1921
public static ResourceLocation id(String path) {
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package net.Realism.config;
2+
3+
import net.Realism.RealismMod;
4+
import net.minecraftforge.common.ForgeConfigSpec;
5+
import net.minecraftforge.fml.config.ModConfig;
6+
7+
public class RealismConfig {
8+
// Common Config
9+
public static class Common {
10+
//public final ForgeConfigSpec.BooleanValue enableFeature;
11+
//public final ForgeConfigSpec.IntValue maxProcessingAmount;
12+
//public final ForgeConfigSpec.DoubleValue difficultyMultiplier;
13+
public final ForgeConfigSpec.BooleanValue EnableCustomTrainAcceleration;
14+
public final ForgeConfigSpec.DoubleValue CustomTrainAccelerationMultiplyer;
15+
16+
Common(ForgeConfigSpec.Builder builder) {
17+
builder.push("general");
18+
19+
//enableFeature = builder.comment("Enable the main feature of the mod").define("enableFeature", true);
20+
//maxProcessingAmount = builder.comment("Maximum amount of items that can be processed at once")
21+
// .defineInRange("maxProcessingAmount", 64, 1, 512);
22+
//difficultyMultiplier = builder.comment("Multiplier that affects processing difficulty")
23+
// .defineInRange("difficultyMultiplier", 1.0, 0.1, 5.0);
24+
EnableCustomTrainAcceleration = builder.comment("Enable custom train acceleration based on the number of carriages")
25+
.define("Enable Custom Train Acceleration", true);
26+
CustomTrainAccelerationMultiplyer = builder.comment("Multiplier for custom train acceleration(Higher = slower acceleration per Carrige)")
27+
.defineInRange("Custom Train Acceleration Multiplyer", 1.0, 0.1, 5.0);
28+
builder.pop();
29+
}
30+
}
31+
32+
// Client Config
33+
public static class Client {
34+
//public final ForgeConfigSpec.BooleanValue showParticles;
35+
//public final ForgeConfigSpec.IntValue particleDensity;
36+
//public final ForgeConfigSpec.DoubleValue renderDistance;
37+
public final ForgeConfigSpec.BooleanValue debugMode;
38+
39+
Client(ForgeConfigSpec.Builder builder) {
40+
builder.push("visual");
41+
//showParticles = builder.comment("Enable particle effects").define("showParticles", true);
42+
//particleDensity = builder.comment("Density of particles (higher = more particles)")
43+
// .defineInRange("particleDensity", 2, 0, 5);
44+
//renderDistance = builder.comment("Maximum distance to render special effects")
45+
// .defineInRange("renderDistance", 32.0, 8.0, 64.0);
46+
debugMode = builder.comment("Enable debug mode to see the modified acceleration")
47+
.define("debugMode", false);
48+
builder.pop();
49+
}
50+
}
51+
52+
public static final ForgeConfigSpec COMMON_SPEC;
53+
public static final Common COMMON;
54+
55+
public static final ForgeConfigSpec CLIENT_SPEC;
56+
public static final Client CLIENT;
57+
58+
static {
59+
ForgeConfigSpec.Builder commonBuilder = new ForgeConfigSpec.Builder();
60+
COMMON = new Common(commonBuilder);
61+
COMMON_SPEC = commonBuilder.build();
62+
63+
ForgeConfigSpec.Builder clientBuilder = new ForgeConfigSpec.Builder();
64+
CLIENT = new Client(clientBuilder);
65+
CLIENT_SPEC = clientBuilder.build();
66+
}
67+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package net.Realism.debug;
2+
3+
import net.minecraft.client.Minecraft;
4+
import net.Realism.config.RealismConfig;
5+
import java.util.concurrent.Executors;
6+
import java.util.concurrent.ScheduledExecutorService;
7+
import java.util.concurrent.TimeUnit;
8+
import java.util.LinkedList;
9+
import java.util.Queue;
10+
import java.util.HashSet;
11+
import java.util.Set;
12+
13+
public class RealismDebuger {
14+
private static final RealismDebuger INSTANCE = new RealismDebuger();
15+
private final Queue<String> pendingMessages = new LinkedList<>();
16+
private final Set<String> knownMessages = new HashSet<>();
17+
private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
18+
private boolean isRunning = false;
19+
private boolean hasNewData = false;
20+
21+
private RealismDebuger() {
22+
// Private constructor for singleton
23+
startLogging(); // Auto-start the scheduler
24+
}
25+
26+
public static RealismDebuger getInstance() {
27+
return INSTANCE;
28+
}
29+
30+
public void startLogging() {
31+
if (!isRunning) {
32+
isRunning = true;
33+
scheduler.scheduleAtFixedRate(this::logDebugInfo, 0, 5, TimeUnit.SECONDS);
34+
}
35+
}
36+
37+
public void stopLogging() {
38+
if (isRunning) {
39+
scheduler.shutdown();
40+
isRunning = false;
41+
}
42+
}
43+
44+
public void addDebugInfo(float acceleration, int carriageCount, int locomotiveCount) {
45+
// Only collect debug info if debug mode is enabled
46+
if (RealismConfig.CLIENT.debugMode.get()) {
47+
String message = String.format("Train acceleration: %.5f | Carriages: %d | PowerCars: %d",
48+
acceleration, carriageCount, locomotiveCount);
49+
50+
synchronized (pendingMessages) {
51+
if (!knownMessages.contains(message)) {
52+
// This is a new message we haven't seen before
53+
pendingMessages.offer(message);
54+
knownMessages.add(message);
55+
hasNewData = true;
56+
57+
// Limit the size of knownMessages to prevent memory issues
58+
if (knownMessages.size() > 100) {
59+
// Since we can't easily remove oldest elements from a HashSet,
60+
// clear half of the history when we hit the limit
61+
knownMessages.clear();
62+
knownMessages.addAll(pendingMessages);
63+
}
64+
}
65+
}
66+
}
67+
}
68+
69+
private void logDebugInfo() {
70+
// Check conditions: debug mode is on, there's a world loaded, and we have new data
71+
if (!RealismConfig.CLIENT.debugMode.get() || Minecraft.getInstance().level == null || !hasNewData) {
72+
return;
73+
}
74+
75+
synchronized (pendingMessages) {
76+
if (!pendingMessages.isEmpty()) {
77+
System.out.println("=== REALISM DEBUG INFO ===");
78+
for (String message : pendingMessages) {
79+
System.out.println(message);
80+
}
81+
pendingMessages.clear();
82+
System.out.println("======================");
83+
hasNewData = false;
84+
}
85+
}
86+
}
87+
}

common/src/main/java/net/Realism/mixin/TrainMixin.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,17 @@
66
import org.spongepowered.asm.mixin.Mixin;
77
import org.spongepowered.asm.mixin.Overwrite;
88
import org.spongepowered.asm.mixin.Shadow;
9+
import net.Realism.config.RealismConfig;
10+
import net.Realism.debug.RealismDebuger;
911

1012
import java.util.List;
1113

1214
@Mixin(value = Train.class, remap = false)
1315
public abstract class TrainMixin {
1416
@Shadow
1517
public int fuelTicks;
18+
19+
@Shadow
1620
public List<Carriage> carriages;
1721

1822
/**
@@ -21,6 +25,10 @@ public abstract class TrainMixin {
2125
*/
2226
@Overwrite()
2327
public float acceleration() {
28+
if (!RealismConfig.COMMON.EnableCustomTrainAcceleration.get()) {
29+
return (fuelTicks > 0 ? AllConfigs.server().trains.poweredTrainAcceleration.getF()
30+
: AllConfigs.server().trains.trainAcceleration.getF()) / 400;
31+
}
2432
float ac = (fuelTicks > 0 ? AllConfigs.server().trains.poweredTrainAcceleration.getF() : AllConfigs.server().trains.trainAcceleration.getF()) / 400;
2533
int locomotives = 0;
2634
for (Carriage carriage : carriages) {
@@ -29,11 +37,15 @@ public float acceleration() {
2937
}
3038
}
3139
if (locomotives == 0) locomotives = 1;
32-
float reduce = (carriages.size() * 0.0002f) / locomotives;
40+
float reduce = (float) ((carriages.size() * 0.0002f * RealismConfig.COMMON.CustomTrainAccelerationMultiplyer.get() ) / locomotives);
3341
ac -= reduce;
3442
if (ac < 0) ac = 0.0001f;
35-
return ac;
36-
}
3743

44+
if(RealismConfig.CLIENT.debugMode.get()) {
45+
// Send data to the debug logger instead of printing directly
46+
RealismDebuger.getInstance().addDebugInfo(ac*400, carriages.size(), locomotives );
47+
}
3848

49+
return ac;
50+
}
3951
}
Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package net.Realism.fabric;
22

3-
import net.fabricmc.loader.api.FabricLoader;
4-
53
public class RealismExpectPlatformImpl {
64
public static String platformName() {
7-
return FabricLoader.getInstance().isModLoaded("quilt_loader") ? "Quilt" : "Fabric";
5+
return "Fabric";
6+
}
7+
8+
public static boolean isForge() {
9+
return false;
810
}
9-
}
11+
}

fabric/src/main/java/net/Realism/fabric/RealismFabric.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.github.fabricators_of_create.porting_lib.util.EnvExecutor;
44
import net.Realism.RealismBlocks;
55
import net.Realism.RealismMod;
6+
import net.Realism.fabric.config.FabricConfigRegistration;
67
import net.fabricmc.api.ModInitializer;
78

89
public class RealismFabric implements ModInitializer {
@@ -15,5 +16,6 @@ public void onInitialize() {
1516
), RealismMod.NAME);
1617
// on fabric, Registrates must be explicitly finalized and registered.
1718
RealismBlocks.REGISTRATE.register();
19+
FabricConfigRegistration.register();
1820
}
1921
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// fabric/src/main/java/net/Realism/fabric/config/FabricConfigRegistration.java
2+
package net.Realism.fabric.config;
3+
4+
import fuzs.forgeconfigapiport.api.config.v2.ForgeConfigRegistry;
5+
import net.Realism.RealismMod;
6+
import net.Realism.config.RealismConfig;
7+
import net.minecraftforge.fml.config.ModConfig;
8+
9+
public class FabricConfigRegistration {
10+
public static void register() {
11+
RealismMod.LOGGER.info("Registering configs with ForgeConfigAPIPort");
12+
ForgeConfigRegistry.INSTANCE.register(
13+
RealismMod.MOD_ID, ModConfig.Type.COMMON, RealismConfig.COMMON_SPEC);
14+
ForgeConfigRegistry.INSTANCE.register(
15+
RealismMod.MOD_ID, ModConfig.Type.CLIENT, RealismConfig.CLIENT_SPEC);
16+
}
17+
}

forge/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ dependencies {
4242
modLocalRuntime("mezz.jei:jei-$minecraft_version-forge:$jei_version") { transitive = false }
4343

4444
// if you would like to add integration with JEI, uncomment this line.
45-
// modCompileOnly("mezz.jei:jei-$minecraft_version:$jei_version:api")
45+
// modCompileOnly("mezz.jei:jei-$minecraft_version:$jei_version:api")
4646
}
4747

4848
processResources {

0 commit comments

Comments
 (0)