Skip to content

Commit cc1ee0c

Browse files
authored
Merge pull request #2 from SimpeClient/feature-config-1.19.4
Added Feature Configs
2 parents a70447d + 992ed93 commit cc1ee0c

File tree

15 files changed

+292
-40
lines changed

15 files changed

+292
-40
lines changed

simpleclient-1.19.4/build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ dependencies {
2121
include "io.github.ladysnake:satin:${project.satin_version}"
2222
}
2323

24+
sourceSets {
25+
main.resources.srcDirs += "${project(':simpleclient-core').projectDir}/src/main/resources"
26+
}
27+
2428
processResources {
2529
filesMatching('fabric.mod.json') {
2630
expand 'version': version, 'minecraft_version': project.minecraft_version, 'fabric_loader_version': project.fabric_loader_version, 'fabric_api_version': project.fabric_api_version

simpleclient-1.19.4/src/main/java/simpleclient/feature/FeatureManagerImpl.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,10 @@
1616
public class FeatureManagerImpl extends FeatureManager {
1717
@Override
1818
public void init() {
19-
Minecraft mc = Minecraft.getInstance();
2019
KeyMapping editFeaturesKey = KeyBindingHelper.registerKeyBinding(new KeyMapping("simpleclient.edit_features", InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_RIGHT_SHIFT, "key.categories.simpleclient"));
21-
ClientTickEvents.END_CLIENT_TICK.register(c -> {
22-
if (editFeaturesKey.consumeClick() && mc.screen == null && mc.level != null) {
23-
mc.setScreen(new EditFeaturesScreen());
20+
ClientTickEvents.END_CLIENT_TICK.register(minecraft -> {
21+
if (editFeaturesKey.consumeClick() && minecraft.screen == null && minecraft.level != null) {
22+
minecraft.setScreen(new EditFeaturesScreen());
2423
}
2524
});
2625
addFeature(new FPS());

simpleclient-1.19.4/src/main/java/simpleclient/feature/Motionblur.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
11
package simpleclient.feature;
22

3-
import com.google.gson.JsonObject;
43
import ladysnake.satin.api.event.ShaderEffectRenderCallback;
54
import ladysnake.satin.api.managed.ManagedShaderEffect;
65
import ladysnake.satin.api.managed.ShaderEffectManager;
6+
import net.minecraft.network.chat.Component;
77
import net.minecraft.resources.ResourceLocation;
8+
import net.minecraft.util.Mth;
9+
import simpleclient.feature.config.PercentConfigEntry;
810

911
public class Motionblur extends EnableableFeature {
1012
private final ManagedShaderEffect shader = ShaderEffectManager.getInstance().manage(new ResourceLocation("simpleclient", "shaders/post/motionblur.json"), shader -> {});
13+
private final PercentConfigEntry strength = new PercentConfigEntry("strength", Component.translatable("simpleclient.motionblur.strength"), 0.25F, 0);
1114

1215
public Motionblur() {
1316
super(FeatureType.MOTIONBLUR);
17+
addConfigEntry(strength);
1418
ShaderEffectRenderCallback.EVENT.register(tickDelta -> {
1519
if (isEnabled()) {
16-
JsonObject data = getData();
17-
if (!data.has("strength")) data.addProperty("strength", 0.2F);
18-
float strength = log(Math.pow(100.0F, 0.01F), data.get("strength").getAsFloat() * 100) / 100;
19-
shader.setUniformValue("strength", strength);
20+
float strengthValue = log(Math.pow(100.0F, 0.01F), getConfigValue(strength) * 100) / 100;
21+
shader.setUniformValue("strength", Math.max(0, Math.min(strengthValue, 1)));
2022
shader.render(tickDelta);
2123
}
2224
});
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package simpleclient.feature.config;
2+
3+
import com.google.gson.JsonObject;
4+
import net.minecraft.client.gui.components.AbstractWidget;
5+
import net.minecraft.client.gui.components.Button;
6+
import net.minecraft.network.chat.CommonComponents;
7+
import net.minecraft.network.chat.Component;
8+
import simpleclient.feature.Feature;
9+
10+
import java.util.function.Function;
11+
import java.util.function.Supplier;
12+
13+
public class EnableConfigEntry implements ConfigEntry<Boolean> {
14+
private String key;
15+
private boolean defaultValue;
16+
private Component displayText;
17+
18+
public EnableConfigEntry(String key, Component displayText, boolean defaultValue) {
19+
this.key = key;
20+
this.defaultValue = defaultValue;
21+
this.displayText = displayText;
22+
}
23+
24+
@Override
25+
public Boolean load(JsonObject json) {
26+
if (!json.has(key)) json.addProperty(key, defaultValue);
27+
return json.get(key).getAsBoolean();
28+
}
29+
30+
@Override
31+
public void save(JsonObject json, Boolean value) {
32+
json.addProperty(key, value);
33+
}
34+
35+
@Override
36+
public AbstractWidget createWidget(Feature feature) {
37+
Function<Boolean, Component> text = value -> displayText.copy().append(": ").append(value ? CommonComponents.OPTION_ON : CommonComponents.OPTION_OFF);
38+
return Button.builder(text.apply(feature.getConfigValue(this)), button -> {
39+
boolean value = feature.getConfigValue(this);
40+
feature.setConfigValue(this, !value);
41+
button.setMessage(text.apply(!value));
42+
}).size(200, 20).build();
43+
}
44+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package simpleclient.feature.config;
2+
3+
import com.google.gson.JsonObject;
4+
import net.minecraft.client.gui.components.AbstractOptionSliderButton;
5+
import net.minecraft.client.gui.components.AbstractSliderButton;
6+
import net.minecraft.client.gui.components.AbstractWidget;
7+
import net.minecraft.client.gui.components.Button;
8+
import net.minecraft.network.chat.CommonComponents;
9+
import net.minecraft.network.chat.Component;
10+
import simpleclient.feature.Feature;
11+
12+
import java.util.function.Function;
13+
14+
public class FloatConfigEntry implements ConfigEntry<Float> {
15+
private String key;
16+
private float defaultValue;
17+
private Component displayText;
18+
private Function<Float, Component> valueText;
19+
20+
public FloatConfigEntry(String key, Component displayText, float defaultValue, Function<Float, Component> valueText) {
21+
this.key = key;
22+
this.defaultValue = defaultValue;
23+
this.displayText = displayText;
24+
this.valueText = valueText;
25+
}
26+
27+
@Override
28+
public Float load(JsonObject json) {
29+
if (!json.has(key)) json.addProperty(key, defaultValue);
30+
return json.get(key).getAsFloat();
31+
}
32+
33+
@Override
34+
public void save(JsonObject json, Float value) {
35+
json.addProperty(key, value);
36+
}
37+
38+
@Override
39+
public AbstractWidget createWidget(Feature feature) {
40+
Function<Float, Component> text = value -> displayText.copy().append(": ").append(valueText.apply(value));
41+
float value = feature.getConfigValue(this);
42+
return new AbstractSliderButton(0, 0, 200, 20, text.apply(value), value) {
43+
@Override
44+
protected void updateMessage() {
45+
setMessage(text.apply((float) value));
46+
}
47+
48+
@Override
49+
protected void applyValue() {
50+
feature.setConfigValue(FloatConfigEntry.this, (float) value);
51+
}
52+
};
53+
}
54+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package simpleclient.feature.config;
2+
3+
import net.minecraft.network.chat.Component;
4+
5+
import java.util.function.Function;
6+
7+
public class PercentConfigEntry extends FloatConfigEntry {
8+
public PercentConfigEntry(String key, Component displayText, float defaultValue, int digits) {
9+
super(key, displayText, defaultValue, v -> Component.literal((float) (int) (v * Math.pow(10, digits + 2)) / Math.pow(10, digits) + "%"));
10+
}
11+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package simpleclient.gui;
2+
3+
import com.mojang.blaze3d.vertex.PoseStack;
4+
import net.minecraft.client.gui.Gui;
5+
import net.minecraft.client.gui.GuiComponent;
6+
import net.minecraft.client.gui.components.AbstractSliderButton;
7+
import net.minecraft.client.gui.components.AbstractWidget;
8+
import net.minecraft.client.gui.components.Button;
9+
import net.minecraft.client.gui.screens.Screen;
10+
import net.minecraft.network.chat.CommonComponents;
11+
import net.minecraft.network.chat.Component;
12+
import simpleclient.feature.Feature;
13+
14+
import java.util.ArrayList;
15+
import java.util.List;
16+
17+
public class EditFeatureConfigScreen extends Screen {
18+
private final Feature feature;
19+
private final Screen parent;
20+
21+
public EditFeatureConfigScreen(Feature feature, Screen parent) {
22+
super(Component.translatable("simpleclient.edit_feature_config"));
23+
this.feature = feature;
24+
this.parent = parent;
25+
}
26+
27+
@Override
28+
protected void init() {
29+
List<AbstractWidget> widgets = new ArrayList<>();
30+
int y = 20 + font.lineHeight;
31+
widgets.add(Button.builder(CommonComponents.GUI_DONE, button -> minecraft.setScreen(parent)).size(200, 20).build());
32+
feature.getConfig().forEach(e -> widgets.add((AbstractWidget) e.createWidget(feature)));
33+
for (int i = 0; i < widgets.size(); i++) {
34+
AbstractWidget widget = widgets.get(i);
35+
widget.setX((width - widget.getWidth()) / 2);
36+
widget.setY(y);
37+
y += widget.getHeight() + 2;
38+
addRenderableWidget(widget);
39+
}
40+
}
41+
42+
@Override
43+
public void render(PoseStack poseStack, int mouseX, int mouseY, float delta) {
44+
renderBackground(poseStack);
45+
Component text = Component.translatable("simpleclient.edit_config_of", feature.getName());
46+
GuiComponent.drawCenteredString(poseStack, font, text, width / 2, 10, 0xFFFFFFFF);
47+
super.render(poseStack, mouseX, mouseY, delta);
48+
}
49+
50+
@Override
51+
public void onClose() {
52+
minecraft.setScreen(parent);
53+
}
54+
}

simpleclient-1.19.4/src/main/java/simpleclient/gui/EditFeaturesScreen.java

Lines changed: 69 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,25 @@
11
package simpleclient.gui;
22

3+
import com.mojang.blaze3d.systems.RenderSystem;
34
import com.mojang.blaze3d.vertex.PoseStack;
5+
import com.mojang.math.Axis;
6+
import net.minecraft.client.gui.Gui;
7+
import net.minecraft.client.gui.GuiComponent;
48
import net.minecraft.client.gui.screens.Screen;
9+
import net.minecraft.client.renderer.GameRenderer;
510
import net.minecraft.network.chat.Component;
11+
import net.minecraft.resources.ResourceLocation;
12+
import org.joml.AxisAngle4d;
13+
import org.joml.AxisAngle4f;
14+
import org.joml.Quaternionf;
615
import simpleclient.adapter.ItemRendererAdapter;
716
import simpleclient.adapter.ItemRendererAdapterImpl;
817
import simpleclient.adapter.TextRendererAdapter;
918
import simpleclient.adapter.TextRendererAdapterImpl;
1019
import simpleclient.feature.*;
1120
import simpleclient.text.Text;
1221

22+
import java.io.IOException;
1323
import java.util.List;
1424

1525
public class EditFeaturesScreen extends Screen {
@@ -26,7 +36,7 @@ public EditFeaturesScreen() {
2636
public void render(PoseStack poseStack, int mouseX, int mouseY, float delta) {
2737
TextRendererAdapter textRenderer = new TextRendererAdapterImpl(poseStack, font);
2838
ItemRendererAdapter itemRenderer = new ItemRendererAdapterImpl(poseStack);
29-
// Render Features
39+
// Render Renderable Features
3040
for (Feature feature : FeatureManager.INSTANCE.getFeatures()) {
3141
if (feature instanceof RenderableFeature rf && rf.isEnabled()) {
3242
rf.renderDummy(textRenderer, itemRenderer, width, height);
@@ -35,32 +45,54 @@ public void render(PoseStack poseStack, int mouseX, int mouseY, float delta) {
3545
int y1 = df.getYPos(height) - 1;
3646
int x2 = df.getXPos(width) + df.getWidth(textRenderer, itemRenderer, width, height) + 1;
3747
int y2 = df.getYPos(height) + df.getHeight(textRenderer, itemRenderer, width, height) + 1;
38-
fill(poseStack, x1 - 1, y1 - 1, x2 + 1, y1, 0xFFAAAAAA);
39-
fill(poseStack, x1 - 1, y2, x2 + 1, y2 + 1, 0xFFAAAAAA);
40-
fill(poseStack, x1 - 1, y1 - 1, x1, y2 + 1, 0xFFAAAAAA);
41-
fill(poseStack, x2, y1 - 1, x2 + 1, y2 + 1, 0xFFAAAAAA);
48+
GuiComponent.fill(poseStack, x1 - 1, y1 - 1, x2 + 1, y1, 0xFFAAAAAA);
49+
GuiComponent.fill(poseStack, x1 - 1, y2, x2 + 1, y2 + 1, 0xFFAAAAAA);
50+
GuiComponent.fill(poseStack, x1 - 1, y1 - 1, x1, y2 + 1, 0xFFAAAAAA);
51+
GuiComponent.fill(poseStack, x2, y1 - 1, x2 + 1, y2 + 1, 0xFFAAAAAA);
4252
}
4353
}
4454
}
45-
// Render Buttons
46-
fill(poseStack, 0, 0, width / 4, height, 0x77000000);
47-
List<EnableableFeature> enableableFeatures = FeatureManager.INSTANCE.getEnableableFeatures();
48-
for (int i = 0; i < enableableFeatures.size(); i++) {
49-
EnableableFeature feature = enableableFeatures.get(i);
50-
int x = i % 3;
51-
int y = i / 3;
52-
int wSize = (width / 4 - 8) / 3;
55+
// Render Enableable Features
56+
GuiComponent.fill(poseStack, 0, 0, width / 4, height, 0x77000000);
57+
List<Feature> features = FeatureManager.INSTANCE.getFeatures();
58+
for (int i = 0; i < features.size(); i++) {
59+
Feature feature = features.get(i);
60+
int count = (int) Math.ceil((double) width / 4 / 100);
61+
int x = i % count;
62+
int y = i / count;
63+
int wSize = (width / 4 - 2 - count * 2) / count;
5364
int wX1 = 2 + (2 + wSize) * x;
5465
int wY1 = 2 + 2 + (2 + wSize) * y;
5566
int wX2 = (2 + wSize) * x + wSize;
5667
int wY2 = 2 + (2 + wSize) * y + wSize;
57-
fill(poseStack, wX1, scroll + wY1, wX2, scroll + wY2, 0xff555555);
58-
fill(poseStack, wX1 + wSize / 10, scroll + wY2 - wSize / 10 - wSize / 3 / 2, wX1 + wSize / 10 + wSize / 3, scroll + wY2 - wSize / 10, feature.isEnabled() ? 0xff00ff00 : 0xffff0000);
59-
if (feature.isEnabled()) {
60-
fill(poseStack, wX1 + wSize / 10 + wSize / 3 / 2 + wSize / 20, scroll + wY2 - wSize / 10 - wSize / 3 / 2 + wSize / 20, wX1 + wSize / 10 + wSize / 3 - wSize / 20, scroll + wY2 - wSize / 10 - wSize / 20, 0xff000000);
61-
} else {
62-
fill(poseStack, wX1 + wSize / 10 + wSize / 20, scroll + wY2 - wSize / 10 - wSize / 3 / 2 + wSize / 20, wX1 + wSize / 10 + wSize / 3 / 2 - wSize / 20, scroll + wY2 - wSize / 10 - wSize / 20, 0xff000000);
68+
// Background
69+
GuiComponent.fill(poseStack, wX1, scroll + wY1, wX2, scroll + wY2, 0xff555555);
70+
// Enable Button
71+
if (feature instanceof EnableableFeature ef) {
72+
GuiComponent.fill(poseStack, wX1 + wSize / 10, scroll + wY2 - wSize / 10 - wSize / 3 / 2, wX1 + wSize / 10 + wSize / 3, scroll + wY2 - wSize / 10, ef.isEnabled() ? 0xff00ff00 : 0xffff0000);
73+
if (ef.isEnabled()) {
74+
GuiComponent.fill(poseStack, wX1 + wSize / 10 + wSize / 3 / 2 + wSize / 20, scroll + wY2 - wSize / 10 - wSize / 3 / 2 + wSize / 20, wX1 + wSize / 10 + wSize / 3 - wSize / 20, scroll + wY2 - wSize / 10 - wSize / 20, 0xff000000);
75+
} else {
76+
GuiComponent.fill(poseStack, wX1 + wSize / 10 + wSize / 20, scroll + wY2 - wSize / 10 - wSize / 3 / 2 + wSize / 20, wX1 + wSize / 10 + wSize / 3 / 2 - wSize / 20, scroll + wY2 - wSize / 10 - wSize / 20, 0xff000000);
77+
}
78+
}
79+
// Config Button
80+
if (feature.hasConfig()) {
81+
poseStack.pushPose();
82+
int h = wSize / 3 / 2;
83+
int cogwheelX = wX1 + wSize / 10 * 4 + wSize / 3;
84+
int cogwheelY = scroll + wY2 - wSize / 10 - wSize / 3 / 2;
85+
if (cogwheelX <= mouseX && mouseX <= cogwheelX + h &&
86+
cogwheelY <= mouseY && mouseY <= cogwheelY + h) {
87+
poseStack.rotateAround(Axis.ZP.rotation((float) (System.currentTimeMillis() % 4000) / 400), cogwheelX + h / 2, cogwheelY + h / 2, 0.0F);
88+
}
89+
RenderSystem.setShader(GameRenderer::getPositionTexShader);
90+
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
91+
RenderSystem.setShaderTexture(0, new ResourceLocation("simpleclient", "textures/settings.png"));
92+
GuiComponent.blit(poseStack, cogwheelX, cogwheelY, 0, 0, h, h, h, h);
93+
poseStack.popPose();
6394
}
95+
// Name
6496
poseStack.pushPose();
6597
float scaleX = (((float) wSize) * 0.8F) / textRenderer.getWidth(feature.getName().split(" - ")[0]);
6698
float scaleY = (((float) wSize) * 0.3F) / textRenderer.getHeight();
@@ -98,19 +130,28 @@ public void mouseMoved(double mouseX, double mouseY) {
98130
@Override
99131
public boolean mouseReleased(double mouseX, double mouseY, int button) {
100132
if (active == null) {
101-
List<EnableableFeature> enableableFeatures = FeatureManager.INSTANCE.getEnableableFeatures();
102-
for (int i = 0; i < enableableFeatures.size(); i++) {
103-
EnableableFeature feature = enableableFeatures.get(i);
104-
int x = i % 3;
105-
int y = i / 3;
106-
int wSize = (width / 4 - 8) / 3;
133+
List<Feature> features = FeatureManager.INSTANCE.getFeatures();
134+
for (int i = 0; i < features.size(); i++) {
135+
Feature feature = features.get(i);
136+
int count = (int) Math.ceil((double) width / 4 / 100);
137+
int x = i % count;
138+
int y = i / count;
139+
int wSize = (width / 4 - 2 - count * 2) / count;
107140
int wX1 = 2 + (2 + wSize) * x;
108141
int wY1 = 2 + 2 + (2 + wSize) * y;
109142
int wX2 = (2 + wSize) * x + wSize;
110143
int wY2 = 2 + (2 + wSize) * y + wSize;
111-
if (wX1 <= mouseX && mouseX <= wX2 &&
144+
int h = wSize / 3 / 2;
145+
int cogwheelX = wX1 + wSize / 10 * 4 + wSize / 3;
146+
int cogwheelY = scroll + wY2 - wSize / 10 - wSize / 3 / 2;
147+
if (feature.hasConfig() &&
148+
cogwheelX <= mouseX && mouseX <= cogwheelX + h &&
149+
cogwheelY <= mouseY && mouseY <= cogwheelY + h) {
150+
minecraft.setScreen(new EditFeatureConfigScreen(feature, this));
151+
} else if (feature instanceof EnableableFeature ef &&
152+
wX1 <= mouseX && mouseX <= wX2 &&
112153
wY1 + scroll <= mouseY && mouseY <= wY2 + scroll) {
113-
feature.setEnabled(!feature.isEnabled());
154+
ef.setEnabled(!ef.isEnabled());
114155
}
115156
}
116157
} else active = null;
@@ -138,7 +179,7 @@ public void removed() {
138179

139180
@Override
140181
public boolean mouseScrolled(double mouseX, double mouseY, double amount) {
141-
scroll += amount * height / 50;
182+
scroll += amount * height / 30;
142183
return super.mouseScrolled(mouseX, mouseY, amount);
143184
}
144185

simpleclient-1.19.4/src/main/resources/fabric.mod.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"sources": "https://github.com/SimpeClient"
1414
},
1515
"license": "MIT",
16-
"icon": "assets/simpleclient/icon.png",
16+
"icon": "icon.png",
1717
"environment": "*",
1818
"entrypoints": {
1919
"client": [

0 commit comments

Comments
 (0)