Skip to content

Commit 439520d

Browse files
Added mixin mode to receive chat.
1 parent cce0977 commit 439520d

7 files changed

Lines changed: 73 additions & 14 deletions

File tree

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package NoMathExpectation.chatExchange.neoForged.mixin;
2+
3+
import NoMathExpectation.chatExchange.neoForged.*;
4+
import net.minecraft.network.protocol.game.ServerGamePacketListener;
5+
import net.minecraft.network.protocol.game.ServerboundChatPacket;
6+
import net.minecraft.server.level.ServerPlayer;
7+
import net.minecraft.server.network.ServerGamePacketListenerImpl;
8+
import org.spongepowered.asm.mixin.Mixin;
9+
import org.spongepowered.asm.mixin.Shadow;
10+
import org.spongepowered.asm.mixin.injection.At;
11+
import org.spongepowered.asm.mixin.injection.ModifyVariable;
12+
13+
@Mixin(ServerGamePacketListenerImpl.class)
14+
public abstract class ServerGamePacketListenerImplMixin implements ServerGamePacketListener {
15+
@Shadow
16+
public ServerPlayer player;
17+
18+
@ModifyVariable(
19+
method = "handleChat(Lnet/minecraft/network/protocol/game/ServerboundChatPacket;)V",
20+
at = @At("HEAD"),
21+
ordinal = 0,
22+
argsOnly = true
23+
)
24+
private ServerboundChatPacket onHandleChat(ServerboundChatPacket packet) {
25+
if (!ChatExchangeConfig.INSTANCE.getMixinMode().get()) {
26+
return packet;
27+
}
28+
29+
var data = ChatExchangeDataKt.getChatExchangeData(player.server);
30+
var string = packet.message();
31+
if ((!ChatExchangeConfig.INSTANCE.getChat().get() || data.isIgnoredPlayer(player.getUUID())) && !ExchangeServerKt.startsWithBroadcastPrefix(string)) {
32+
return packet;
33+
}
34+
35+
var newString = ExchangeServerKt.removeBroadcastPrefix(string);
36+
ExchangeServer.Companion.sendEvent(
37+
new MessageEvent(
38+
ExchangeServer.Companion.componentToString(player.getName()),
39+
newString
40+
)
41+
);
42+
43+
return new ServerboundChatPacket(newString, packet.timeStamp(), packet.salt(), packet.signature(), packet.lastSeenMessages());
44+
}
45+
}

src/main/kotlin/NoMathExpectation/chatExchange/neoForged/ChatExchangeConfig.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ object ChatExchangeConfig {
3434
.worldRestart()
3535
.define("language", "")
3636

37+
val mixinMode = builder.comment("Whether to use mixin instead of event to listen to server chats.", "If the exchange server isn't sending server chat, try turn this on.")
38+
.translation("modid.config.mixinMode")
39+
.define("mixinMode", false)
40+
3741
val ignoreBotRegex: ModConfigSpec.ConfigValue<String> = builder.comment("The regex to match and ignore the bot players.", "Leave blank to disable.")
3842
.translation("modid.config.ignoreBotRegex")
3943
.define("ignoreBotRegex", "") {

src/main/kotlin/NoMathExpectation/chatExchange/neoForged/ExchangeServer.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,4 +177,16 @@ class ExchangeServer(
177177
}
178178

179179
fun String.toExchangeServerTranslatedLiteral(vararg args: Any?): Component =
180-
toTranslatedLiteral(*args, language = ExchangeServer.language)
180+
toTranslatedLiteral(*args, language = ExchangeServer.language)
181+
182+
fun String.startsWithBroadcastPrefix(): Boolean = startsWith("@广播") || startsWith("@broadcast") || startsWith("@bc")
183+
184+
fun String.removeBroadcastPrefix(): String = if (startsWith("@广播")) {
185+
removePrefix("@广播")
186+
} else if (startsWith("@broadcast")) {
187+
removePrefix("@broadcast")
188+
} else if (startsWith("@bc")) {
189+
removePrefix("@bc")
190+
} else {
191+
this
192+
}.trimStart()

src/main/kotlin/NoMathExpectation/chatExchange/neoForged/NeoForgeEvents.kt

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,28 +32,21 @@ object NeoForgeEvents {
3232

3333
@SubscribeEvent(priority = EventPriority.HIGHEST)
3434
fun onServerChat(event: ServerChatEvent) {
35+
if (ChatExchangeConfig.mixinMode.get()) {
36+
return
37+
}
38+
3539
val data = event.player.server.chatExchangeData
3640
var message = event.message
3741
val string = ExchangeServer.componentToString(message)
38-
if ((!ChatExchangeConfig.chat.get() || data.isIgnoredPlayer(event.player.uuid)) && !(string.startsWith("@广播") || string.startsWith(
39-
"@broadcast"
40-
) || string.startsWith("@bc"))
41-
) {
42+
if ((!ChatExchangeConfig.chat.get() || data.isIgnoredPlayer(event.player.uuid)) && !string.startsWithBroadcastPrefix()) {
4243
return
4344
}
4445

4546
val contents = message.contents
4647
if (contents is PlainTextContents) {
4748
val text = contents.text()
48-
val newText = if (text.startsWith("@广播")) {
49-
text.removePrefix("@广播")
50-
} else if (text.startsWith("@broadcast")) {
51-
text.removePrefix("@broadcast")
52-
} else if (text.startsWith("@bc")) {
53-
text.removePrefix("@bc")
54-
} else {
55-
text
56-
}.trimStart()
49+
val newText = text.removeBroadcastPrefix()
5750
val newMessage = Component.literal(newText)
5851
.setStyle(message.style)
5952
newMessage.siblings += message.siblings

src/main/resources/assets/chatexchange/lang/en_us.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"modid.config.port": "Port",
77
"modid.config.token": "Token",
88
"modid.config.language": "Language",
9+
"modid.config.mixinMode": "Mixin Mode",
910
"modid.config.ignoreBotRegex": "Ignore Bot Regex",
1011
"modid.config.chat": "Enable Chatting",
1112
"modid.config.joinLeave": "Enable Join/Leave",

src/main/resources/assets/chatexchange/lang/zh_cn.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"modid.config.port": "端口",
77
"modid.config.token": "令牌",
88
"modid.config.language": "语言",
9+
"modid.config.mixinMode": "Mixin 模式",
910
"modid.config.ignoreBotRegex": "忽略机器人正则",
1011
"modid.config.chat": "启用聊天消息",
1112
"modid.config.joinLeave": "启用加入/离开消息",

src/main/resources/chatexchange.mixins.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
],
99
"client": [
1010
],
11+
"server": [
12+
"ServerGamePacketListenerImplMixin"
13+
],
1114
"injectors": {
1215
"defaultRequire": 1
1316
}

0 commit comments

Comments
 (0)