Author SHA1 Message Date
CPTProgrammer ed5e4a7ea7 Update gradle.properties 2024-06-25 10:24:29 +08:00
CPTProgrammer 642c890c58 Fixed #5
Fixed incompatibility with mod Dynmap
2024-06-25 08:39:07 +08:00
CPTProgrammer 7ac3c4a802 Details update
- Updated information in fabric.mod.json
- Changed logger prefix
2024-06-25 08:16:10 +08:00
CPTProgrammer ef99035b2d Update README.md 2024-01-25 20:19:21 +08:00
5 changed files with 36 additions and 21 deletions
+2 -2
View File
@@ -2,8 +2,8 @@
A Simple mod add bukkit style with an "&" and "[item]" display for Fabric Server. A Simple mod add bukkit style with an "&" and "[item]" display for Fabric Server.
It's a **server-side** mod and doesn't need to be installed on the client. It's a **server-side** mod and doesn't need to be installed on the client.
Current Minecraft version: 1.20.1 Currently supported Minecraft versions: 1.20.1, 1.20.4
## Screenshot ## Screenshot
![image](https://github.com/CPTProgrammer/ChatPlus/assets/46586216/dcd2ca4b-79e9-4692-a8de-02fddfe4a392) ![image](https://github.com/CPTProgrammer/ChatPlus/assets/46586216/dcd2ca4b-79e9-4692-a8de-02fddfe4a392)
+1 -1
View File
@@ -9,7 +9,7 @@ yarn_mappings=1.20.4+build.3
loader_version=0.15.6 loader_version=0.15.6
# Mod Properties # Mod Properties
mod_version=0.20.2 mod_version=0.20.3
maven_group=cn.revaria.chatplus maven_group=cn.revaria.chatplus
archives_base_name=chat-plus archives_base_name=chat-plus
@@ -1,11 +1,6 @@
package cn.revaria.chatplus; package cn.revaria.chatplus;
import net.fabricmc.api.ModInitializer; import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.message.v1.ServerMessageEvents;
import net.minecraft.network.message.MessageType;
import net.minecraft.network.message.SignedMessage;
import net.minecraft.server.network.ServerPlayerEntity;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -13,7 +8,7 @@ public class ChatPlus implements ModInitializer {
// This logger is used to write text to the console and the log file. // This logger is used to write text to the console and the log file.
// It is considered best practice to use your mod id as the logger's name. // It is considered best practice to use your mod id as the logger's name.
// That way, it's clear which mod wrote info, warnings, and errors. // That way, it's clear which mod wrote info, warnings, and errors.
public static final Logger LOGGER = LoggerFactory.getLogger("chat-plus"); public static final Logger LOGGER = LoggerFactory.getLogger("Chat Plus");
@Override @Override
public void onInitialize() { public void onInitialize() {
@@ -1,20 +1,17 @@
package cn.revaria.chatplus.mixin; package cn.revaria.chatplus.mixin;
import net.minecraft.MinecraftVersion;
import net.minecraft.SharedConstants; import net.minecraft.SharedConstants;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.network.ClientConnection; import net.minecraft.network.ClientConnection;
import net.minecraft.network.message.LastSeenMessageList; import net.minecraft.network.message.*;
import net.minecraft.network.message.MessageChain;
import net.minecraft.network.message.MessageType;
import net.minecraft.network.message.SignedMessage;
import net.minecraft.network.message.MessageChainTaskQueue;
import net.minecraft.server.MinecraftServer;
import net.minecraft.network.packet.c2s.play.ChatMessageC2SPacket; import net.minecraft.network.packet.c2s.play.ChatMessageC2SPacket;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.filter.FilteredMessage; import net.minecraft.server.filter.FilteredMessage;
import net.minecraft.server.network.ConnectedClientData; import net.minecraft.server.network.ConnectedClientData;
import net.minecraft.server.network.ServerCommonNetworkHandler; import net.minecraft.server.network.ServerCommonNetworkHandler;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.server.network.ServerPlayNetworkHandler; import net.minecraft.server.network.ServerPlayNetworkHandler;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.MutableText; import net.minecraft.text.MutableText;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
@@ -24,6 +21,7 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.ArrayDeque; import java.util.ArrayDeque;
@@ -102,13 +100,34 @@ public abstract class MixinChat extends ServerCommonNetworkHandler {
server.getPlayerManager().broadcast(signedMessage.withUnsignedContent( server.getPlayerManager().broadcast(signedMessage.withUnsignedContent(
changedText changedText
), player, MessageType.params(MessageType.CHAT, player)); ), player, MessageType.params(MessageType.CHAT, player));
// handleDecoratedMessage(signedMessage.withUnsignedContent(changedText));
// Compatible with mod "Discord Integration"
try { try {
Class<?> DiscordIntegrationMod = Class.forName("de.erdbeerbaerlp.dcintegration.fabric.DiscordIntegrationMod"); Class<?> DiscordIntegrationMod = Class.forName("de.erdbeerbaerlp.dcintegration.fabric.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"
try {
/*
Warning: Using reflection can make the code harder to maintain, debug, and understand.
Statement: DynmapMod.plugin.chathandler.handleChat()
*/
Class<?> DynmapMod = Class.forName("org.dynmap.fabric_" + MinecraftVersion.CURRENT.getName().replaceAll("\\.", "_") + ".DynmapMod");
Field pluginField = DynmapMod.getField("plugin");
Object plugin = pluginField.get(null);
Class<?> pluginClass = plugin.getClass();
Field chatHandlerField = pluginClass.getDeclaredField("chathandler");
chatHandlerField.setAccessible(true);
Object chatHandler = chatHandlerField.get(plugin);
Class<?> chatHandlerClass = chatHandler.getClass();
Method handleChat = chatHandlerClass.getMethod("handleChat", ServerPlayerEntity.class, String.class);
handleChat.invoke(chatHandler, player, signedMessage.withUnsignedContent(changedText).getContent().getString());
} catch (ClassNotFoundException | NoSuchMethodException | NoSuchFieldException | NullPointerException |
IllegalAccessException | InvocationTargetException ignored) { }
} catch (MessageChain.MessageChainException e) { } catch (MessageChain.MessageChainException e) {
handleMessageChainException(e); handleMessageChainException(e);
} }
@@ -116,7 +135,7 @@ public abstract class MixinChat extends ServerCommonNetworkHandler {
this.server.submit(() -> { this.server.submit(() -> {
SignedMessage signedMessage; SignedMessage signedMessage;
try { try {
signedMessage = this.getSignedMessage(packet, (LastSeenMessageList) optional.get()); signedMessage = this.getSignedMessage(packet, optional.get());
} catch (MessageChain.MessageChainException var6) { } catch (MessageChain.MessageChainException var6) {
handleMessageChainException(var6); handleMessageChainException(var6);
return; return;
+4 -3
View File
@@ -8,8 +8,9 @@
"Rev_Aria" "Rev_Aria"
], ],
"contact": { "contact": {
"homepage": "https://fabricmc.net/", "homepage": "https://modrinth.com/mod/chatplus",
"sources": "https://github.com/FabricMC/fabric-example-mod" "sources": "https://github.com/CPTProgrammer/ChatPlus/",
"issues": "https://github.com/CPTProgrammer/ChatPlus/issues"
}, },
"license": "CC0-1.0", "license": "CC0-1.0",
"icon": "assets/chat-plus/icon.png", "icon": "assets/chat-plus/icon.png",
@@ -28,7 +29,7 @@
], ],
"depends": { "depends": {
"fabricloader": ">=0.14.21", "fabricloader": ">=0.14.21",
"minecraft": "~1.20.1", "minecraft": "~1.20.4",
"java": ">=17", "java": ">=17",
"fabric-api": "*" "fabric-api": "*"
}, },