Skip to content

Commit 00cb018

Browse files
committed
feat: Improve extensibility for other mods (version 2.0.0)
1 parent 8b480a2 commit 00cb018

File tree

4 files changed

+53
-35
lines changed

4 files changed

+53
-35
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## 2.0.0+1.20.5 - 2025-07-29
4+
5+
### Added
6+
7+
- Internal refactoring to allow for interoperability with other mods
8+
39
## 1.2.0+1.20.5 - 2024-04-26
410

511
### Added

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Mod version
2-
mod_version=1.2.0
2+
mod_version=2.0.0
33

44
# Minecraft/Java version
55
# Also hardcoded in fabric.mod.json and *.mixin.json
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package se.icus.mag.statuseffecttimer;
2+
3+
import net.minecraft.client.MinecraftClient;
4+
import net.minecraft.client.gui.DrawContext;
5+
import net.minecraft.client.resource.language.I18n;
6+
import net.minecraft.entity.effect.StatusEffectInstance;
7+
import net.minecraft.util.math.MathHelper;
8+
9+
public class StatusEffectTimerRenderer {
10+
public void drawStatusEffectOverlay(MinecraftClient client, DrawContext context, StatusEffectInstance statusEffectInstance, int x, int y) {
11+
String duration = getDurationAsString(statusEffectInstance);
12+
int durationLength = client.textRenderer.getWidth(duration);
13+
context.drawTextWithShadow(client.textRenderer, duration, x + 13 - (durationLength / 2), y + 14, 0x99FFFFFF);
14+
15+
int amplifier = statusEffectInstance.getAmplifier();
16+
if (amplifier > 0) {
17+
// Convert to roman numerals if possible
18+
String amplifierString = (amplifier < 10) ? I18n.translate("enchantment.level." + (amplifier + 1)) : "**";
19+
int amplifierLength = client.textRenderer.getWidth(amplifierString);
20+
context.drawTextWithShadow(client.textRenderer, amplifierString, x + 22 - amplifierLength, y + 3, 0x99FFFFFF);
21+
}
22+
}
23+
24+
private String getDurationAsString(StatusEffectInstance statusEffectInstance) {
25+
if (statusEffectInstance.isInfinite()) {
26+
return I18n.translate("effect.duration.infinite");
27+
}
28+
29+
int ticks = MathHelper.floor((float) statusEffectInstance.getDuration());
30+
int seconds = ticks / 20;
31+
32+
if (seconds >= 3600) {
33+
return seconds / 3600 + "h";
34+
} else if (seconds >= 60) {
35+
return seconds / 60 + "m";
36+
} else {
37+
return String.valueOf(seconds);
38+
}
39+
}
40+
}

src/main/java/se/icus/mag/statuseffecttimer/mixin/StatusEffectTimerMixin.java

Lines changed: 6 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,25 @@
66
import net.minecraft.client.MinecraftClient;
77
import net.minecraft.client.gui.DrawContext;
88
import net.minecraft.client.gui.hud.InGameHud;
9-
import net.minecraft.client.resource.language.I18n;
109
import net.minecraft.entity.effect.StatusEffectInstance;
11-
import net.minecraft.util.math.MathHelper;
1210
import org.spongepowered.asm.mixin.Final;
1311
import org.spongepowered.asm.mixin.Mixin;
1412
import org.spongepowered.asm.mixin.Shadow;
13+
import org.spongepowered.asm.mixin.Unique;
1514
import org.spongepowered.asm.mixin.injection.At;
1615
import org.spongepowered.asm.mixin.injection.Inject;
1716
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
17+
import se.icus.mag.statuseffecttimer.StatusEffectTimerRenderer;
1818

1919
import java.util.List;
2020

2121
// Set priority to 500, to load before default at 1000. This is to better cooperate with HUDTweaks.
2222
@Environment(EnvType.CLIENT)
2323
@Mixin(value = InGameHud.class, priority = 500)
2424
public abstract class StatusEffectTimerMixin {
25+
@Unique
26+
private StatusEffectTimerRenderer renderer = new StatusEffectTimerRenderer();
27+
2528
@Shadow @Final
2629
private MinecraftClient client;
2730

@@ -31,38 +34,7 @@ private void appendOverlayDrawing(DrawContext context, float tickDelta, Callback
3134
@Local List<Runnable> list, @Local StatusEffectInstance statusEffectInstance,
3235
@Local(ordinal = 4) int x, @Local(ordinal = 3) int y) {
3336
list.add(() -> {
34-
drawStatusEffectOverlay(context, statusEffectInstance, x, y);
37+
renderer.drawStatusEffectOverlay(client, context, statusEffectInstance, x, y);
3538
});
3639
}
37-
38-
private void drawStatusEffectOverlay(DrawContext context, StatusEffectInstance statusEffectInstance, int x, int y) {
39-
String duration = getDurationAsString(statusEffectInstance);
40-
int durationLength = client.textRenderer.getWidth(duration);
41-
context.drawTextWithShadow(client.textRenderer, duration, x + 13 - (durationLength / 2), y + 14, 0x99FFFFFF);
42-
43-
int amplifier = statusEffectInstance.getAmplifier();
44-
if (amplifier > 0) {
45-
// Convert to roman numerals if possible
46-
String amplifierString = (amplifier < 10) ? I18n.translate("enchantment.level." + (amplifier + 1)) : "**";
47-
int amplifierLength = client.textRenderer.getWidth(amplifierString);
48-
context.drawTextWithShadow(client.textRenderer, amplifierString, x + 22 - amplifierLength, y + 3, 0x99FFFFFF);
49-
}
50-
}
51-
52-
private String getDurationAsString(StatusEffectInstance statusEffectInstance) {
53-
if (statusEffectInstance.isInfinite()) {
54-
return I18n.translate("effect.duration.infinite");
55-
}
56-
57-
int ticks = MathHelper.floor((float) statusEffectInstance.getDuration());
58-
int seconds = ticks / 20;
59-
60-
if (seconds >= 3600) {
61-
return seconds / 3600 + "h";
62-
} else if (seconds >= 60) {
63-
return seconds / 60 + "m";
64-
} else {
65-
return String.valueOf(seconds);
66-
}
67-
}
6840
}

0 commit comments

Comments
 (0)