Update mod compatibility fix

Update compatibility fix for mod "Discord Integration" and "Dynmap" to ensure proper functionality.
This commit is contained in:
CPTProgrammer 2025-01-25 20:28:01 +08:00
parent a94415e427
commit 6a84f79d69

View File

@ -45,7 +45,7 @@ public abstract class MixinChat extends ServerCommonNetworkHandler {
public ServerPlayerEntity player; public ServerPlayerEntity player;
// @Shadow protected abstract Optional<LastSeenMessageList> validateMessage(LastSeenMessageList.Acknowledgment acknowledgment); // @Shadow protected abstract Optional<LastSeenMessageList> validateMessage(LastSeenMessageList.Acknowledgment acknowledgment);
@Shadow protected abstract Optional<LastSeenMessageList> validateAcknowledgment(LastSeenMessageList.Acknowledgment acknowledgment); @Shadow protected abstract Optional<LastSeenMessageList> validateAcknowledgment(LastSeenMessageList.Acknowledgment acknowledgment);
@Shadow protected abstract SignedMessage getSignedMessage(ChatMessageC2SPacket packet, LastSeenMessageList lastSeenMessages) throws MessageChain.MessageChainException; @Shadow protected abstract SignedMessage getSignedMessage(ChatMessageC2SPacket packet, LastSeenMessageList lastSeenMessages) throws MessageChain.MessageChainException;
@ -63,7 +63,8 @@ public abstract class MixinChat extends ServerCommonNetworkHandler {
if (hasIllegalCharacter(packet.chatMessage())) { if (hasIllegalCharacter(packet.chatMessage())) {
disconnect(Text.translatable("multiplayer.disconnect.illegal_characters")); disconnect(Text.translatable("multiplayer.disconnect.illegal_characters"));
} else { } else {
Optional<LastSeenMessageList> optional = this.validateAcknowledgment(packet.acknowledgment()); if (optional.isPresent()) { Optional<LastSeenMessageList> optional = this.validateAcknowledgment(packet.acknowledgment());
if (optional.isPresent()) {
if (!packet.chatMessage().startsWith("/")){ if (!packet.chatMessage().startsWith("/")){
String changedMessage = packet.chatMessage().replace('&', '§'); String changedMessage = packet.chatMessage().replace('&', '§');
@ -99,35 +100,41 @@ public abstract class MixinChat extends ServerCommonNetworkHandler {
try { try {
SignedMessage signedMessage = getSignedMessage(packet, (LastSeenMessageList) optional.get()); SignedMessage signedMessage = getSignedMessage(packet, (LastSeenMessageList) optional.get());
server.getPlayerManager().broadcast(signedMessage.withUnsignedContent( server.getPlayerManager().broadcast(signedMessage.withUnsignedContent(
changedText changedText
), player, MessageType.params(MessageType.CHAT, player)); ), player, MessageType.params(MessageType.CHAT, player));
// Compatible with mod "Discord Integration" // Compatible with mod "Discord Integration"
try { try {
Class<?> DiscordIntegrationMod = Class.forName("de.erdbeerbaerlp.dcintegration.fabric.DiscordIntegrationMod"); Class<?> DiscordIntegrationMod = Class.forName("de.erdbeerbaerlp.dcintegration.architectury.DiscordIntegrationMod");
Method handleChatMessage = DiscordIntegrationMod.getMethod("handleChatMessage", SignedMessage.class, ServerPlayerEntity.class); Method handleChatMessage = DiscordIntegrationMod.getMethod("handleChatMessage", SignedMessage.class, ServerPlayerEntity.class);
handleChatMessage.invoke(null, signedMessage.withUnsignedContent(changedText), player); handleChatMessage.invoke(null, signedMessage.withUnsignedContent(changedText), player);
} catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException | } catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException |
IllegalAccessException ignored) { } IllegalAccessException ignored) { }
// Compatible with mod "Dynmap" // Compatible with mod "Dynmap"
try { String[] minecraftVersion = MinecraftVersion.CURRENT.getName().split("\\.");
/* int minecraftPatchVersion = minecraftVersion.length == 3 ? Integer.parseInt(minecraftVersion[2]) : 0;
Warning: Using reflection can make the code harder to maintain, debug, and understand. for (int i = minecraftPatchVersion; i >= 0; i--){
Statement: DynmapMod.plugin.chathandler.handleChat() String version = minecraftVersion[0] + "." + minecraftVersion[1] + (i == 0 ? "" : ("." + i));
*/ try {
Class<?> DynmapMod = Class.forName("org.dynmap.fabric_" + MinecraftVersion.CURRENT.getName().replaceAll("\\.", "_") + ".DynmapMod"); /*
Field pluginField = DynmapMod.getField("plugin"); Warning: Using reflection can make the code harder to maintain, debug, and understand.
Object plugin = pluginField.get(null); Statement: DynmapMod.plugin.chathandler.handleChat()
Class<?> pluginClass = plugin.getClass(); */
Field chatHandlerField = pluginClass.getDeclaredField("chathandler"); Class<?> DynmapMod = Class.forName("org.dynmap.fabric_" + version.replaceAll("\\.", "_") + ".DynmapMod");
chatHandlerField.setAccessible(true); Field pluginField = DynmapMod.getField("plugin");
Object chatHandler = chatHandlerField.get(plugin); Object plugin = pluginField.get(null);
Class<?> chatHandlerClass = chatHandler.getClass(); Class<?> pluginClass = plugin.getClass();
Method handleChat = chatHandlerClass.getMethod("handleChat", ServerPlayerEntity.class, String.class); Field chatHandlerField = pluginClass.getDeclaredField("chathandler");
handleChat.invoke(chatHandler, player, signedMessage.withUnsignedContent(changedText).getContent().getString()); chatHandlerField.setAccessible(true);
} catch (ClassNotFoundException | NoSuchMethodException | NoSuchFieldException | NullPointerException | Object chatHandler = chatHandlerField.get(plugin);
IllegalAccessException | InvocationTargetException ignored) { } Class<?> chatHandlerClass = chatHandler.getClass();
Method handleChat = chatHandlerClass.getMethod("handleChat", ServerPlayerEntity.class, String.class);
handleChat.invoke(chatHandler, player, signedMessage.withUnsignedContent(changedText).getContent().getString());
break;
} catch (ClassNotFoundException | NoSuchMethodException | NoSuchFieldException | NullPointerException |
IllegalAccessException | InvocationTargetException ignored) { }
}
} catch (MessageChain.MessageChainException e) { } catch (MessageChain.MessageChainException e) {
handleMessageChainException(e); handleMessageChainException(e);