Author SHA1 Message Date
CPTProgrammer a924921a77 Update build.gradle 2024-01-25 20:07:02 +08:00
OffsetMonkey538 886761f03e Update to 1.20.4 (#4)
* Update gradle

* Update loom

* Use 1.20.4 to build

* Update to 1.20.4
2024-01-25 19:52:34 +08:00
CPTProgrammer 7b88d13069 Update gradle.properties 2023-09-28 18:50:18 +08:00
CPTProgrammer 3e3e5f9797 Fixed Item display feature not working
Fixed #3: Item display feature not working properly with "Discord Integration"
2023-09-28 18:50:13 +08:00
CPTProgrammer 68d4e2e250 Update gradle.properties 2023-09-25 23:50:40 +08:00
CPTProgrammer 0f398308dd Fixed conflict with "Discord Integration"
Fixed #1
2023-09-25 23:50:28 +08:00
CPTProgrammer c7728cdc78 Update icon.png 2023-07-07 11:06:06 +08:00
6 changed files with 34 additions and 52 deletions
+2 -2
View File
@@ -1,9 +1,9 @@
plugins { plugins {
id 'fabric-loom' version '1.3-SNAPSHOT' id 'fabric-loom' version '1.5-SNAPSHOT'
id 'maven-publish' id 'maven-publish'
} }
version = project.mod_version version = project.mod_version + "-mc" + project.minecraft_version
group = project.maven_group group = project.maven_group
base { base {
+5 -5
View File
@@ -4,14 +4,14 @@ org.gradle.parallel=true
# Fabric Properties # Fabric Properties
# check these on https://fabricmc.net/develop # check these on https://fabricmc.net/develop
minecraft_version=1.20.1 minecraft_version=1.20.4
yarn_mappings=1.20.1+build.9 yarn_mappings=1.20.4+build.3
loader_version=0.14.21 loader_version=0.15.6
# Mod Properties # Mod Properties
mod_version=0.20.0 mod_version=0.20.2
maven_group=cn.revaria.chatplus maven_group=cn.revaria.chatplus
archives_base_name=chat-plus archives_base_name=chat-plus
# Dependencies # Dependencies
fabric_version=0.85.0+1.20.1 fabric_version=0.95.1+1.20.4
+1 -1
View File
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
networkTimeout=10000 networkTimeout=10000
validateDistributionUrl=true validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
Vendored Regular → Executable
View File
@@ -1,15 +1,8 @@
package cn.revaria.chatplus.mixin; package cn.revaria.chatplus.mixin;
import io.netty.util.internal.StringUtil;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.minecraft.SharedConstants; import net.minecraft.SharedConstants;
import net.minecraft.block.AbstractBlock;
import net.minecraft.block.AirBlock;
import net.minecraft.block.Block;
import net.minecraft.entity.EquipmentSlot;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.Items; import net.minecraft.network.ClientConnection;
import net.minecraft.network.message.LastSeenMessageList; import net.minecraft.network.message.LastSeenMessageList;
import net.minecraft.network.message.MessageChain; import net.minecraft.network.message.MessageChain;
import net.minecraft.network.message.MessageType; import net.minecraft.network.message.MessageType;
@@ -17,59 +10,43 @@ import net.minecraft.network.message.SignedMessage;
import net.minecraft.network.message.MessageChainTaskQueue; import net.minecraft.network.message.MessageChainTaskQueue;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.network.packet.c2s.play.ChatMessageC2SPacket; import net.minecraft.network.packet.c2s.play.ChatMessageC2SPacket;
import net.minecraft.network.listener.ServerPlayPacketListener;
import net.minecraft.server.filter.FilteredMessage; import net.minecraft.server.filter.FilteredMessage;
import net.minecraft.server.network.ConnectedClientData;
import net.minecraft.server.network.ServerCommonNetworkHandler;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.server.network.ServerPlayNetworkHandler; import net.minecraft.server.network.ServerPlayNetworkHandler;
import net.minecraft.text.LiteralTextContent;
import net.minecraft.text.MutableText; import net.minecraft.text.MutableText;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.item.AirBlockItem;
import net.minecraft.text.TextContent;
import net.minecraft.util.Formatting;
import net.minecraft.nbt.NbtCompound;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.core.jmx.Server;
import org.slf4j.Logger;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At; 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 com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.time.Instant; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayDeque; import java.util.ArrayDeque;
import java.util.Deque; import java.util.Deque;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@Mixin(ServerPlayNetworkHandler.class) @Mixin(ServerPlayNetworkHandler.class)
public abstract class MixinChat { public abstract class MixinChat extends ServerCommonNetworkHandler {
@Shadow @Final public MixinChat(MinecraftServer server, ClientConnection connection, ConnectedClientData clientData) {
static Logger LOGGER; super(server, connection, clientData);
}
@Final
@Shadow
private MinecraftServer server;
@Shadow
public abstract void disconnect(Text reason);
@Final @Final
@Shadow @Shadow
private MessageChainTaskQueue messageChainTaskQueue; private MessageChainTaskQueue messageChainTaskQueue;
@Shadow @Shadow
private ServerPlayerEntity player; public ServerPlayerEntity player;
@Shadow protected abstract Optional<LastSeenMessageList> validateMessage(String message, Instant timestamp, LastSeenMessageList.Acknowledgment acknowledgment); @Shadow protected abstract Optional<LastSeenMessageList> validateMessage(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;
@@ -86,7 +63,7 @@ public abstract class MixinChat {
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.validateMessage(packet.chatMessage(), packet.timestamp(), packet.acknowledgment()); Optional<LastSeenMessageList> optional = this.validateMessage(packet.acknowledgment());
if (optional.isPresent()) { if (optional.isPresent()) {
if (!packet.chatMessage().startsWith("/")){ if (!packet.chatMessage().startsWith("/")){
@@ -105,9 +82,9 @@ public abstract class MixinChat {
} }
} }
MutableText changedText = MutableText.of(TextContent.EMPTY); MutableText changedText = Text.empty();
for (int i = 0; i < messages.length; i++) { for (String message : messages) {
changedText.append(Text.of(messages[i])); changedText.append(Text.of(message));
if (!itemDeque.isEmpty()) { if (!itemDeque.isEmpty()) {
ItemStack itemStack; ItemStack itemStack;
if (itemDeque.getFirst() == -1) { if (itemDeque.getFirst() == -1) {
@@ -125,6 +102,13 @@ public abstract class MixinChat {
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));
try {
Class<?> DiscordIntegrationMod = Class.forName("de.erdbeerbaerlp.dcintegration.fabric.DiscordIntegrationMod");
Method handleChatMessage = DiscordIntegrationMod.getMethod("handleChatMessage", SignedMessage.class, ServerPlayerEntity.class);
handleChatMessage.invoke(null, signedMessage.withUnsignedContent(changedText), player);
} catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException |
IllegalAccessException ignored) { }
} catch (MessageChain.MessageChainException e) { } catch (MessageChain.MessageChainException e) {
handleMessageChainException(e); handleMessageChainException(e);
} }
@@ -139,12 +123,10 @@ public abstract class MixinChat {
} }
CompletableFuture<FilteredMessage> completableFuture = filterText(signedMessage.getSignedContent()); CompletableFuture<FilteredMessage> completableFuture = filterText(signedMessage.getSignedContent());
CompletableFuture<Text> completableFuture2 = this.server.getMessageDecorator().decorate(this.player, signedMessage.getContent()); Text decoratedMessage = this.server.getMessageDecorator().decorate(this.player, signedMessage.getContent());
messageChainTaskQueue.append((executor) -> { messageChainTaskQueue.append(completableFuture, filteredMessage -> {
return CompletableFuture.allOf(completableFuture, completableFuture2).thenAcceptAsync((void_) -> { SignedMessage message = signedMessage.withUnsignedContent(decoratedMessage).withFilterMask(filteredMessage.mask());
SignedMessage signedMessage2 = signedMessage.withUnsignedContent((Text) completableFuture2.join()).withFilterMask(((FilteredMessage) completableFuture.join()).mask()); this.handleDecoratedMessage(message);
handleDecoratedMessage(signedMessage2);
}, executor);
}); });
}); });
} }
Binary file not shown.

Before

Width:  |  Height:  |  Size: 453 B

After

Width:  |  Height:  |  Size: 3.6 KiB