Skip to content
This repository was archived by the owner on Nov 20, 2023. It is now read-only.

Commit 6183232

Browse files
committed
Improved message caching.
Caching messages is handled by a mixin which saves messages of every kind; this leads to undesirable output such as console commands to be cached and displayed to the user on login. This commit replaces that single mixin with several precise mixins which cache messages from specific events.
1 parent 7393783 commit 6183232

File tree

8 files changed

+158
-30
lines changed

8 files changed

+158
-30
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ minecraft_version=1.17.1
44
yarn_mappings=1.17.1+build.61
55
loader_version=0.11.7
66

7-
mod_version=1.0.0
7+
mod_version=1.1.0
88
maven_group=me.thegiggitybyte
99
archives_base_name=chathistory

src/main/java/me/thegiggitybyte/chathistory/ChatMessage.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,29 @@
11
package me.thegiggitybyte.chathistory;
22

3+
import net.minecraft.network.MessageType;
34
import net.minecraft.text.Text;
45

56
import java.util.UUID;
67

78
public class ChatMessage {
89
private final Text content;
10+
private final MessageType type;
911
private final UUID senderUuid;
1012

11-
public ChatMessage(Text content, UUID sender) {
13+
public ChatMessage(Text content, MessageType type, UUID sender) {
1214
this.content = content;
15+
this.type = type;
1316
this.senderUuid = sender;
1417
}
1518

1619
public Text getContent() {
1720
return content;
1821
}
1922

23+
public MessageType getType() {
24+
return type;
25+
}
26+
2027
public UUID getSender() {
2128
return senderUuid;
2229
}

src/main/java/me/thegiggitybyte/chathistory/mixin/MinecraftServerMixin.java

Lines changed: 0 additions & 23 deletions
This file was deleted.
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package me.thegiggitybyte.chathistory.mixin;
2+
3+
import me.thegiggitybyte.chathistory.ChatHistory;
4+
import me.thegiggitybyte.chathistory.ChatMessage;
5+
import net.minecraft.advancement.Advancement;
6+
import net.minecraft.advancement.PlayerAdvancementTracker;
7+
import net.minecraft.network.MessageType;
8+
import net.minecraft.server.network.ServerPlayerEntity;
9+
import net.minecraft.text.TranslatableText;
10+
import net.minecraft.util.Util;
11+
import org.spongepowered.asm.mixin.Mixin;
12+
import org.spongepowered.asm.mixin.Shadow;
13+
import org.spongepowered.asm.mixin.injection.At;
14+
import org.spongepowered.asm.mixin.injection.Inject;
15+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
16+
17+
@Mixin(PlayerAdvancementTracker.class)
18+
public class PlayerAdvancementTrackerMixin {
19+
20+
@Shadow
21+
private ServerPlayerEntity owner;
22+
23+
@Inject(
24+
method = "grantCriterion(Lnet/minecraft/advancement/Advancement;Ljava/lang/String;)Z",
25+
at = @At(
26+
value = "INVOKE",
27+
target = "Lnet/minecraft/server/PlayerManager;broadcastChatMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/MessageType;Ljava/util/UUID;)V"
28+
)
29+
)
30+
public void cacheAdvancementMessage(Advancement advancement, String criterionName, CallbackInfoReturnable<Boolean> cir) {
31+
var translationKey = "chat.type.advancement." + advancement.getDisplay().getFrame().getId();
32+
var content = new TranslatableText(translationKey, this.owner.getDisplayName(), advancement.toHoverableText());
33+
var message = new ChatMessage(content, MessageType.SYSTEM, Util.NIL_UUID);
34+
35+
ChatHistory.MESSAGE_CACHE.add(message);
36+
}
37+
}
Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,57 @@
11
package me.thegiggitybyte.chathistory.mixin;
22

3+
import com.mojang.authlib.GameProfile;
34
import me.thegiggitybyte.chathistory.ChatHistory;
5+
import me.thegiggitybyte.chathistory.ChatMessage;
46
import net.fabricmc.api.EnvType;
57
import net.fabricmc.api.Environment;
8+
import net.minecraft.nbt.NbtCompound;
69
import net.minecraft.network.ClientConnection;
710
import net.minecraft.network.MessageType;
811
import net.minecraft.server.PlayerManager;
12+
import net.minecraft.server.network.ServerPlayNetworkHandler;
913
import net.minecraft.server.network.ServerPlayerEntity;
14+
import net.minecraft.server.world.ServerWorld;
15+
import net.minecraft.text.MutableText;
16+
import net.minecraft.util.UserCache;
17+
import net.minecraft.util.Util;
18+
import net.minecraft.util.registry.RegistryKey;
19+
import net.minecraft.world.WorldProperties;
1020
import org.spongepowered.asm.mixin.Mixin;
1121
import org.spongepowered.asm.mixin.injection.At;
1222
import org.spongepowered.asm.mixin.injection.Inject;
1323
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
24+
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
25+
26+
import java.util.Optional;
1427

1528
@Environment(EnvType.SERVER)
1629
@Mixin(PlayerManager.class)
1730
public abstract class PlayerManagerMixin {
1831

19-
@Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayerEntity;onSpawn()V"), method = "onPlayerConnect")
32+
@Inject(
33+
method = "onPlayerConnect",
34+
locals = LocalCapture.CAPTURE_FAILHARD,
35+
at = @At(
36+
value = "INVOKE",
37+
target = "Lnet/minecraft/server/PlayerManager;broadcastChatMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/MessageType;Ljava/util/UUID;)V"
38+
)
39+
)
40+
public void cacheJoinMessage(ClientConnection connection, ServerPlayerEntity player, CallbackInfo ci, GameProfile gameProfile, UserCache userCache, Optional optional, String string, NbtCompound nbtCompound, RegistryKey registryKey, ServerWorld serverWorld, ServerWorld serverWorld3, String string2, WorldProperties worldProperties, ServerPlayNetworkHandler serverPlayNetworkHandler, MutableText content) { // :(
41+
var message = new ChatMessage(content, MessageType.SYSTEM, Util.NIL_UUID);
42+
ChatHistory.MESSAGE_CACHE.add(message);
43+
}
44+
45+
@Inject(
46+
method = "onPlayerConnect",
47+
at = @At(
48+
value = "INVOKE",
49+
target = "Lnet/minecraft/server/network/ServerPlayerEntity;onSpawn()V"
50+
)
51+
)
2052
public void sendCachedMessages(ClientConnection connection, ServerPlayerEntity player, CallbackInfo ci) {
2153
for (var message : ChatHistory.MESSAGE_CACHE) {
2254
player.sendMessage(message.getContent(), MessageType.CHAT, message.getSender());
2355
}
2456
}
25-
2657
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package me.thegiggitybyte.chathistory.mixin;
2+
3+
import me.thegiggitybyte.chathistory.ChatHistory;
4+
import me.thegiggitybyte.chathistory.ChatMessage;
5+
import net.minecraft.network.MessageType;
6+
import net.minecraft.server.filter.TextStream;
7+
import net.minecraft.server.network.ServerPlayNetworkHandler;
8+
import net.minecraft.server.network.ServerPlayerEntity;
9+
import net.minecraft.text.TranslatableText;
10+
import org.spongepowered.asm.mixin.Mixin;
11+
import org.spongepowered.asm.mixin.Shadow;
12+
import org.spongepowered.asm.mixin.injection.At;
13+
import org.spongepowered.asm.mixin.injection.Inject;
14+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
15+
16+
@Mixin(ServerPlayNetworkHandler.class)
17+
public class ServerPlayNetworkHandlerMixin {
18+
19+
@Shadow
20+
public ServerPlayerEntity player;
21+
22+
@Inject(
23+
method = "handleMessage",
24+
at = @At(
25+
value = "INVOKE",
26+
target = "Lnet/minecraft/server/PlayerManager;broadcast(Lnet/minecraft/text/Text;Ljava/util/function/Function;Lnet/minecraft/network/MessageType;Ljava/util/UUID;)V"
27+
)
28+
)
29+
public void cachePlayerMessage(TextStream.Message messageStream, CallbackInfo ci) {
30+
var content = new TranslatableText("chat.type.text", this.player.getDisplayName(), messageStream.getRaw());
31+
var message = new ChatMessage(content, MessageType.CHAT, this.player.getUuid());
32+
33+
ChatHistory.MESSAGE_CACHE.add(message);
34+
}
35+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package me.thegiggitybyte.chathistory.mixin;
2+
3+
import me.thegiggitybyte.chathistory.ChatHistory;
4+
import me.thegiggitybyte.chathistory.ChatMessage;
5+
import net.minecraft.entity.damage.DamageSource;
6+
import net.minecraft.network.MessageType;
7+
import net.minecraft.server.network.ServerPlayerEntity;
8+
import net.minecraft.text.TranslatableText;
9+
import net.minecraft.util.Formatting;
10+
import net.minecraft.util.Util;
11+
import org.spongepowered.asm.mixin.Mixin;
12+
import org.spongepowered.asm.mixin.injection.At;
13+
import org.spongepowered.asm.mixin.injection.Inject;
14+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
15+
16+
@Mixin(ServerPlayerEntity.class)
17+
public class ServerPlayerEntityMixin {
18+
19+
@Inject(at = @At("HEAD"), method = "onDisconnect()V")
20+
public void cacheLeaveMessage(CallbackInfo info) {
21+
var player = (ServerPlayerEntity) (Object) this;
22+
var content = new TranslatableText("multiplayer.player.left", player.getDisplayName()).formatted(Formatting.YELLOW);
23+
var message = new ChatMessage(content, MessageType.SYSTEM, Util.NIL_UUID);
24+
25+
ChatHistory.MESSAGE_CACHE.add(message);
26+
}
27+
28+
@Inject(
29+
method = "onDeath(Lnet/minecraft/entity/damage/DamageSource;)V",
30+
at = @At(
31+
value = "INVOKE",
32+
target = "Lnet/minecraft/server/PlayerManager;broadcastChatMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/MessageType;Ljava/util/UUID;)V"
33+
)
34+
)
35+
public void cacheDeathMessage(DamageSource source, CallbackInfo ci) {
36+
var player = (ServerPlayerEntity) (Object) this;
37+
var message = new ChatMessage(source.getDeathMessage(player), MessageType.SYSTEM, Util.NIL_UUID);
38+
39+
ChatHistory.MESSAGE_CACHE.add(message);
40+
}
41+
}

src/main/resources/chathistory.mixins.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
"minVersion": "0.8",
44
"package": "me.thegiggitybyte.chathistory.mixin",
55
"compatibilityLevel": "JAVA_16",
6-
"mixins": [
7-
],
86
"server": [
97
"PlayerManagerMixin",
10-
"MinecraftServerMixin"
8+
"ServerPlayerEntityMixin",
9+
"ServerPlayNetworkHandlerMixin",
10+
"PlayerAdvancementTrackerMixin"
1111
],
1212
"injectors": {
1313
"defaultRequire": 1

0 commit comments

Comments
 (0)