Skip to content

Commit 3764a6a

Browse files
authored
Merge pull request #3 from rettichlp/feature/wanted-color-nametags
feature/wanted-color-nametags
2 parents ca667be + 941081a commit 3764a6a

4 files changed

Lines changed: 124 additions & 19 deletions

File tree

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,65 @@
11
package de.rettichlp.common.manager;
22

33
import com.mojang.brigadier.Message;
4+
import de.rettichlp.common.storage.schema.WantedEntry;
45
import lombok.NoArgsConstructor;
56
import net.minecraft.client.MinecraftClient;
67
import net.minecraft.client.network.ClientPlayNetworkHandler;
78

9+
import java.util.regex.Matcher;
10+
import java.util.regex.Pattern;
11+
12+
import static de.rettichlp.PKUtilsClient.storage;
13+
import static java.lang.Integer.parseInt;
14+
import static java.lang.System.currentTimeMillis;
15+
import static java.util.Optional.ofNullable;
16+
import static java.util.regex.Pattern.compile;
17+
818
@NoArgsConstructor
919
public class MessageManager {
1020

11-
private ClientPlayNetworkHandler networkHandler;
21+
private final static Pattern WELCOME_BACK_PATTERN = compile("Willkommen zurück!");
22+
private final static Pattern ONLINE_WANTED_PLAYERS_HEADER_PATTERN = compile("Online Spieler mit WantedPunkten:");
23+
private final static Pattern ONLINE_WANTED_PLAYERS_ENTRY_PATTERN = compile("- (?<playerName>[A-Za-z0-9_]+) \\| (?<wantedPointAmount>\\d+) \\| (?<reason>.+)(?<afk> \\| AFK|)");
24+
1225
private String rawMessage;
26+
private ClientPlayNetworkHandler networkHandler;
27+
private long activeWantedCheck = 0;
1328

1429
public void process(Message message) {
15-
this.networkHandler = MinecraftClient.getInstance().player.networkHandler;
1630
this.rawMessage = message.getString();
31+
this.networkHandler = ofNullable(MinecraftClient.getInstance().player)
32+
.map(clientPlayerEntity -> clientPlayerEntity.networkHandler)
33+
.orElseThrow();
34+
35+
executeJoinCommands();
36+
readWantedPoints();
37+
}
38+
39+
private void executeJoinCommands() {
40+
Matcher welcomeBackMatcher = WELCOME_BACK_PATTERN.matcher(this.rawMessage);
41+
if (welcomeBackMatcher.find()) {
42+
43+
this.networkHandler.sendChatCommand("wanteds");
44+
}
45+
}
46+
47+
public void readWantedPoints() {
48+
Matcher onlineWantedPlayersHeaderMatcher = ONLINE_WANTED_PLAYERS_HEADER_PATTERN.matcher(this.rawMessage);
49+
if (onlineWantedPlayersHeaderMatcher.find()) {
50+
this.activeWantedCheck = currentTimeMillis();
51+
storage.resetWantedEntries();
52+
return;
53+
}
54+
55+
Matcher onlineWantedPlayersEntryMatcher = ONLINE_WANTED_PLAYERS_ENTRY_PATTERN.matcher(this.rawMessage);
56+
if (onlineWantedPlayersEntryMatcher.find() && (currentTimeMillis() - this.activeWantedCheck < 2000)) {
57+
String playerName = onlineWantedPlayersEntryMatcher.group("playerName");
58+
int wantedPointAmount = parseInt(onlineWantedPlayersEntryMatcher.group("wantedPointAmount"));
59+
String reason = onlineWantedPlayersEntryMatcher.group("reason");
60+
61+
WantedEntry wantedEntry = new WantedEntry(playerName, wantedPointAmount, reason);
62+
storage.addWantedEntry(wantedEntry);
63+
}
1764
}
1865
}

src/client/java/de/rettichlp/mixin/client/ExampleClientMixin.java

Lines changed: 0 additions & 16 deletions
This file was deleted.
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package de.rettichlp.mixin.client;
2+
3+
import de.rettichlp.common.storage.schema.WantedEntry;
4+
import net.minecraft.client.render.entity.EntityRenderer;
5+
import net.minecraft.client.render.entity.state.EntityRenderState;
6+
import net.minecraft.client.render.entity.state.PlayerEntityRenderState;
7+
import net.minecraft.entity.Entity;
8+
import net.minecraft.text.Text;
9+
import net.minecraft.util.Formatting;
10+
import org.jetbrains.annotations.Contract;
11+
import org.jetbrains.annotations.NotNull;
12+
import org.spongepowered.asm.mixin.Mixin;
13+
import org.spongepowered.asm.mixin.Unique;
14+
import org.spongepowered.asm.mixin.injection.At;
15+
import org.spongepowered.asm.mixin.injection.ModifyVariable;
16+
17+
import java.util.Optional;
18+
19+
import static de.rettichlp.PKUtilsClient.storage;
20+
import static java.util.Objects.nonNull;
21+
import static net.minecraft.util.Formatting.*;
22+
import static net.minecraft.util.Formatting.DARK_RED;
23+
import static net.minecraft.util.Formatting.RED;
24+
25+
@Mixin(EntityRenderer.class)
26+
public abstract class NametagColorMixin<S extends Entity, T extends EntityRenderState> {
27+
28+
@ModifyVariable(
29+
method = "renderLabelIfPresent(Lnet/minecraft/client/render/entity/state/EntityRenderState;Lnet/minecraft/text/Text;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V",
30+
at = @At("HEAD"),
31+
argsOnly = true
32+
)
33+
private Text changeNameColor(Text original, EntityRenderState state) {
34+
if (state instanceof PlayerEntityRenderState playerState && nonNull(playerState.displayName)) {
35+
Text displayName = playerState.displayName;
36+
String displayNameString = displayName.getString();
37+
38+
Optional<WantedEntry> optionalWantedEntry = storage.getWantedEntries().stream()
39+
.filter(wantedEntry -> wantedEntry.getPlayerName().equals(displayNameString))
40+
.findAny();
41+
42+
if (optionalWantedEntry.isEmpty()) {
43+
return original;
44+
}
45+
46+
Formatting color = getWantedPointColor(optionalWantedEntry.get());
47+
return displayName.copy().styled(style -> style.withColor(color));
48+
}
49+
50+
return original;
51+
}
52+
53+
@Unique
54+
@Contract(pure = true)
55+
private @NotNull Formatting getWantedPointColor(@NotNull WantedEntry wantedEntry) {
56+
int wantedPointAmount = wantedEntry.getWantedPointAmount();
57+
Formatting color;
58+
59+
if (wantedPointAmount >= 60) {
60+
color = DARK_RED;
61+
} else if (wantedPointAmount >= 50) {
62+
color = RED;
63+
} else if (wantedPointAmount >= 25) {
64+
color = GOLD;
65+
} else if (wantedPointAmount >= 15) {
66+
color = YELLOW;
67+
} else if (wantedPointAmount >= 2) {
68+
color = GREEN;
69+
} else {
70+
color = DARK_GREEN;
71+
}
72+
return color;
73+
}
74+
}

src/client/resources/pkutils.client.mixins.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"package": "de.rettichlp.mixin.client",
44
"compatibilityLevel": "JAVA_21",
55
"client": [
6-
"ExampleClientMixin"
6+
"NametagColorMixin"
77
],
88
"injectors": {
99
"defaultRequire": 1

0 commit comments

Comments
 (0)