Refactored spec and management

This commit is contained in:
2026-03-24 12:44:29 +01:00
parent bdab6586d4
commit 3d0b95b566
16 changed files with 55 additions and 33 deletions
+21 -9
View File
@@ -1,5 +1,7 @@
package org.saturnclient.mod;
import java.util.function.Supplier;
import org.saturnclient.common.ref.asset.IdentifierRef;
import org.saturnclient.config.ConfigManager;
import org.saturnclient.config.property.NamedProperty;
@@ -7,12 +9,12 @@ import org.saturnclient.ui.RenderScope;
import org.saturnclient.ui.resources.Textures;
public abstract class Mod {
private final ModSpec details;
private final ModSpec spec;
private final ConfigManager configManager;
public Mod(ModSpec details, NamedProperty... props) {
this.details = details;
configManager = new ConfigManager(details.name);
public Mod(ModSpec spec, NamedProperty... props) {
this.spec = spec;
configManager = new ConfigManager(spec.name);
for (NamedProperty prop : props) {
configManager.property(prop.name, prop.prop);
}
@@ -34,11 +36,11 @@ public abstract class Mod {
public abstract void onEnabled(boolean e);
public final String getName() {
return details.name;
return spec.name;
}
public IdentifierRef getIconTexture() {
return Textures.getModIcon(details.namespace);
return Textures.getModIcon(spec.namespace);
}
public ConfigManager getConfig() {
@@ -46,14 +48,24 @@ public abstract class Mod {
}
public String getDescription() {
return details.description;
return spec.description;
}
public String[] getTags() {
return details.tags;
return spec.tags;
}
public String getVersion() {
return details.version;
return spec.version;
}
public boolean isSupported() {
for (Supplier<?> supplier : spec.requiresFeature) {
if (supplier.get() == null) {
return false;
}
}
return true;
}
}
@@ -7,15 +7,15 @@ import org.saturnclient.mod.mods.*;
public class ModManager {
public static List<Mod> ENABLED_MODS = new ArrayList<>();
public static Mod[] MODS = {
public static List<Mod> MODS = new ArrayList<>(List.of(
new ArmorDisplayMod(), new DayCounterMod(), new KeystrokesMod(), new StatusEffectsMod(),
new AutoSprintMod(), new FpsMod(), new NametagsMod(), new TpsMod(),
new ClockMod(), new FreelookMod(), new NoFogMod(), new ZoomMod(),
new CoordinatesMod(), new FullbrightMod(), new PingMod(),
new CrosshairMod(), new HealthDisplayMod(), new SpeedometerMod(),
};
new CrosshairMod(), new HealthDisplayMod(), new SpeedometerMod()));
public static void init() {
MODS.removeIf(mod -> !mod.isSupported());
updateEnabledModules();
}
@@ -1,11 +1,14 @@
package org.saturnclient.mod;
import java.util.function.Supplier;
public class ModSpec {
public String name;
public String namespace;
public String description;
public String version;
public String[] tags = {};
public Supplier<?>[] requiresFeature = {};
public ModSpec(String name, String namespace) {
this.name = name;
@@ -36,4 +39,9 @@ public class ModSpec {
this.tags = tags;
return this;
}
public ModSpec requires(Supplier<?>... suppliers) {
this.requiresFeature = suppliers;
return this;
}
}
@@ -1,6 +1,7 @@
package org.saturnclient.mod.mods;
import org.saturnclient.common.feature.PlayerFeature;
import org.saturnclient.common.provider.FeatureProvider;
import org.saturnclient.common.provider.Providers;
import org.saturnclient.common.ref.game.ItemStackRef;
import org.saturnclient.config.property.BoolProperty;
@@ -28,7 +29,8 @@ public class ArmorDisplayMod extends Mod implements HudMod {
new ModSpec("Armor Display", "armor")
.description("Displays armor durability")
.version("v0.2.0")
.tags("Utility"),
.tags("Utility")
.requires(Providers.feature::player),
enabled.named("Enabled"),
useMainHand.named("Use Main Hand"),
layout.prop());
@@ -40,7 +42,7 @@ public class ArmorDisplayMod extends Mod implements HudMod {
@Override
public void renderHud(RenderScope scope) {
PlayerFeature player = Providers.module.player();
PlayerFeature player = Providers.feature.player();
renderArmor(scope,
player.getMainHand(),
player.getHelmet(),
@@ -51,7 +53,7 @@ public class ArmorDisplayMod extends Mod implements HudMod {
@Override
public void renderDummy(RenderScope scope) {
PlayerFeature player = Providers.module.player();
PlayerFeature player = Providers.feature.player();
renderArmor(scope,
player.getDummyMainHand(),
player.getDummyHelmet(),
@@ -31,8 +31,8 @@ public class AutoSprintMod extends Mod {
@Override
public void tick() {
PlayerFeature player = Providers.module.player();
NetworkFeature network = Providers.module.network();
PlayerFeature player = Providers.feature.player();
NetworkFeature network = Providers.feature.network();
if (!player.hasPlayer() || !network.hasNetwork()) {
return;
@@ -43,9 +43,9 @@ public class CoordinatesMod extends Mod implements HudMod {
@Override
public void renderHud(RenderScope scope) {
renderCoords(
Providers.module.player().getX(),
Providers.module.player().getY(),
Providers.module.player().getZ(),
Providers.feature.player().getX(),
Providers.feature.player().getY(),
Providers.feature.player().getZ(),
scope);
}
@@ -34,11 +34,11 @@ public class CrosshairMod extends Mod {
@Override
public void render(RenderScope scope) {
if (!enabled.value || !Providers.module.entity().isTargetingLivingEntity()) {
if (!enabled.value || !Providers.feature.entity().isTargetingLivingEntity()) {
return;
}
RenderFeature render = Providers.module.render();
RenderFeature render = Providers.feature.render();
int x = (render.getScaledWindowWidth() - CROSSHAIR_SIZE) / 2;
int y = (render.getScaledWindowHeight() - CROSSHAIR_SIZE) / 2;
@@ -36,7 +36,7 @@ public class DayCounterMod extends Mod implements HudMod {
@Override
public void renderHud(RenderScope scope) {
renderDay(Providers.module.world().getDay(), scope);
renderDay(Providers.feature.world().getDay(), scope);
}
@Override
@@ -36,7 +36,7 @@ public class FpsMod extends Mod implements HudMod {
@Override
public void renderHud(RenderScope scope) {
renderFps(Providers.module.render().getFps(), scope);
renderFps(Providers.feature.render().getFps(), scope);
}
@Override
@@ -75,7 +75,7 @@ public class FreelookMod extends Mod {
// ---------------------------------------------------------------
private void startFreelook() {
RenderFeature render = Providers.module.render();
RenderFeature render = Providers.feature.render();
wasFirstPerson = render.isFirstPerson();
render.setThirdPersonBack();
isFreeLooking = true;
@@ -83,7 +83,7 @@ public class FreelookMod extends Mod {
private void stopFreelook() {
if (wasFirstPerson) {
Providers.module.render().setFirstPerson();
Providers.feature.render().setFirstPerson();
}
isFreeLooking = false;
}
@@ -41,7 +41,7 @@ public class HealthDisplayMod extends Mod implements HudMod {
@Override
public void renderHud(RenderScope scope) {
float health = Providers.module.player().getHealth();
float health = Providers.feature.player().getHealth();
if (displayMode.value == 1)
health /= 2f; // convert to hearts
renderHealth(health, scope);
@@ -67,7 +67,7 @@ public class KeystrokesMod extends Mod implements HudMod {
@Override
public void tick() {
PlayerFeature player = Providers.module.player();
PlayerFeature player = Providers.feature.player();
w = player.isForwardPressed();
a = player.isLeftPressed();
s = player.isBackPressed();
@@ -35,7 +35,7 @@ public class PingMod extends Mod implements HudMod {
@Override
public void renderHud(RenderScope scope) {
renderPing(Providers.module.network().getPing(), scope);
renderPing(Providers.feature.network().getPing(), scope);
}
@Override
@@ -45,7 +45,7 @@ public class SpeedometerMod extends Mod implements HudMod {
@Override
public void renderHud(RenderScope scope) {
PlayerFeature player = Providers.module.player();
PlayerFeature player = Providers.feature.player();
PlayerFeature.Velocity v = player.getVelocity();
boolean onGround = player.isOnGround();
@@ -43,12 +43,12 @@ public class StatusEffectsMod extends Mod implements HudMod {
@Override
public void renderHud(RenderScope scope) {
renderEffects(scope, Providers.module.player().getActiveEffects());
renderEffects(scope, Providers.feature.player().getActiveEffects());
}
@Override
public void renderDummy(RenderScope scope) {
renderEffects(scope, Providers.module.player().getDummyEffects());
renderEffects(scope, Providers.feature.player().getDummyEffects());
}
// ---------------------------------------------------------------