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

Commit

Permalink
refactor: send all cached messages as system messages
Browse files Browse the repository at this point in the history
I could not figure out how to resend signed chat messages without causing a validation error on the client, so I figured it'd be good enough to simply resend both game messages and player chat messages as a system.
  • Loading branch information
Giggitybyte committed Apr 20, 2023
1 parent 3f10de3 commit c6fc4e7
Show file tree
Hide file tree
Showing 6 changed files with 25 additions and 80 deletions.
5 changes: 2 additions & 3 deletions src/main/java/me/thegiggitybyte/chathistory/ChatHistory.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package me.thegiggitybyte.chathistory;

import com.google.common.collect.EvictingQueue;
import me.thegiggitybyte.chathistory.message.Message;
import me.thegiggitybyte.chathistory.message.PlayerMessage;
import me.thegiggitybyte.chathistory.message.CachedMessage;
import net.darktree.simpleconfig.SimpleConfig;
import net.fabricmc.api.DedicatedServerModInitializer;
import net.fabricmc.api.EnvType;
Expand All @@ -12,7 +11,7 @@

@Environment(EnvType.SERVER)
public class ChatHistory implements DedicatedServerModInitializer {
public static Queue<Message> MESSAGE_CACHE;
public static Queue<CachedMessage> MESSAGE_CACHE;

@Override
public void onInitializeServer() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package me.thegiggitybyte.chathistory.message;

import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.Text;

public class CachedMessage {
private final Text message;

public CachedMessage(Text message) {
this.message = message;
}

public void send(ServerPlayerEntity player) {
player.sendMessage(message, false);
}
}

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,9 @@


import me.thegiggitybyte.chathistory.ChatHistory;
import me.thegiggitybyte.chathistory.message.GameMessage;
import me.thegiggitybyte.chathistory.message.PlayerMessage;
import me.thegiggitybyte.chathistory.message.CachedMessage;
import net.minecraft.network.ClientConnection;
import net.minecraft.network.message.MessageType;
import net.minecraft.network.message.SentMessage;
import net.minecraft.network.message.SignedMessage;
import net.minecraft.server.PlayerManager;
import net.minecraft.server.network.ServerPlayerEntity;
Expand All @@ -23,27 +21,24 @@

@Mixin(PlayerManager.class)
public class PlayerManagerMixin {

@Inject(method = "broadcast(Lnet/minecraft/text/Text;Ljava/util/function/Function;Z)V",
at = @At("HEAD"))
public void cacheGameMessage(Text message, Function<ServerPlayerEntity, Text> playerMessageFactory, boolean overlay, CallbackInfo ci) {
ChatHistory.MESSAGE_CACHE.add(new GameMessage(message, overlay));
if (overlay == true) return;
ChatHistory.MESSAGE_CACHE.add(new CachedMessage(message));
}

@Inject(method = "broadcast(Lnet/minecraft/network/message/SignedMessage;Ljava/util/function/Predicate;Lnet/minecraft/server/network/ServerPlayerEntity;Lnet/minecraft/network/message/MessageType$Parameters;)V",
at = @At("HEAD"))
public void cachePlayerMessage(SignedMessage message, Predicate<ServerPlayerEntity> shouldSendFiltered, @Nullable ServerPlayerEntity sender, MessageType.Parameters params, CallbackInfo ci) {
ChatHistory.MESSAGE_CACHE.add(new PlayerMessage(message, shouldSendFiltered, params));
public void cachePlayerMessage(SignedMessage message, Predicate<ServerPlayerEntity> filterPredicate, @Nullable ServerPlayerEntity sender, MessageType.Parameters params, CallbackInfo ci) {
var decoratedMessage = params.applyChatDecoration(message.getContent());
ChatHistory.MESSAGE_CACHE.add(new CachedMessage(decoratedMessage));
}

@Inject(method = "onPlayerConnect", at = @At(value = "TAIL", target = "Lnet/minecraft/server/network/ServerPlayerEntity;onSpawn()V"))
public void sendCachedMessages(ClientConnection connection, ServerPlayerEntity player, CallbackInfo ci) {
for (var message : ChatHistory.MESSAGE_CACHE) {
if (message instanceof PlayerMessage playerMessage) {
player.sendChatMessage(SentMessage.of(playerMessage.getMessage()), playerMessage.getShouldSendFiltered().test(player), playerMessage.getParams());
} else if (message instanceof GameMessage gameMessage) {
player.sendMessage(gameMessage.getMessage(), gameMessage.isOverlay());
}
message.send(player);
}
}
}

0 comments on commit c6fc4e7

Please sign in to comment.