This repository has been archived by the owner on Nov 22, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Initial mixins for custom chat * More experiment * Custom chat messages support + join, leave, /me * Add custom death message * Bump version
- Loading branch information
Showing
17 changed files
with
420 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
43 changes: 43 additions & 0 deletions
43
src/main/java/cc/reconnected/server/core/CustomNameFormat.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
package cc.reconnected.server.core; | ||
|
||
import cc.reconnected.server.RccServer; | ||
import cc.reconnected.server.util.Components; | ||
import eu.pb4.placeholders.api.PlaceholderContext; | ||
import eu.pb4.placeholders.api.Placeholders; | ||
import net.kyori.adventure.text.minimessage.MiniMessage; | ||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; | ||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | ||
import net.luckperms.api.model.group.Group; | ||
import net.minecraft.server.network.ServerPlayerEntity; | ||
import net.minecraft.text.MutableText; | ||
|
||
public class CustomNameFormat { | ||
private static final MiniMessage miniMessage = MiniMessage.miniMessage(); | ||
public static MutableText getNameForPlayer(ServerPlayerEntity player) { | ||
var formats = RccServer.CONFIG.customName.formats().entrySet(); | ||
var lp = RccServer.getInstance().luckPerms(); | ||
var playerContext = PlaceholderContext.of(player); | ||
|
||
var user = lp.getPlayerAdapter(ServerPlayerEntity.class).getUser(player); | ||
|
||
var groups = user.getInheritedGroups(user.getQueryOptions()).stream().map(Group::getName).toList(); | ||
|
||
String format = null; | ||
for (var entry : formats) { | ||
if (groups.contains(entry.getKey())) { | ||
format = entry.getValue(); | ||
break; | ||
} | ||
} | ||
|
||
if (format == null) { | ||
format = "<username>"; | ||
} | ||
|
||
var displayName = miniMessage.deserialize(format, TagResolver.resolver( | ||
Placeholder.parsed("username", player.getGameProfile().getName()) | ||
)); | ||
|
||
return Placeholders.parseText(Components.toText(displayName), playerContext).copy(); | ||
} | ||
} |
41 changes: 41 additions & 0 deletions
41
src/main/java/cc/reconnected/server/core/customChat/CustomChatMessage.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
package cc.reconnected.server.core.customChat; | ||
|
||
import cc.reconnected.server.RccServer; | ||
import cc.reconnected.server.parser.MarkdownParser; | ||
import cc.reconnected.server.util.Components; | ||
import net.kyori.adventure.text.minimessage.MiniMessage; | ||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; | ||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | ||
import net.minecraft.network.message.MessageType; | ||
import net.minecraft.network.message.SignedMessage; | ||
import net.minecraft.registry.RegistryKeys; | ||
import net.minecraft.server.network.ServerPlayerEntity; | ||
import net.minecraft.text.Text; | ||
|
||
public class CustomChatMessage { | ||
private static final MiniMessage miniMessage = MiniMessage.miniMessage(); | ||
|
||
public static void sendChatMessage(ServerPlayerEntity receiver, SignedMessage message, MessageType.Parameters params) { | ||
var playerUuid = message.link().sender(); | ||
var player = RccServer.server.getPlayerManager().getPlayer(playerUuid); | ||
|
||
Text messageText; | ||
if (RccServer.CONFIG.customChatFormat.enableMarkdown()) { | ||
messageText = MarkdownParser.defaultParser.parseNode(message.getSignedContent()).toText(); | ||
} else { | ||
messageText = message.getContent(); | ||
} | ||
|
||
var component = miniMessage.deserialize(RccServer.CONFIG.customChatFormat.chatFormat(), TagResolver.resolver( | ||
Placeholder.component("display_name", player.getDisplayName()), | ||
Placeholder.component("message", messageText) | ||
)); | ||
|
||
var text = Components.toText(component); | ||
|
||
var msgType = RccServer.server.getRegistryManager().get(RegistryKeys.MESSAGE_TYPE).getOrThrow(RccServer.CHAT_TYPE); | ||
var newParams = new MessageType.Parameters(msgType, text, null); | ||
|
||
receiver.networkHandler.sendChatMessage(message, newParams); | ||
} | ||
} |
41 changes: 41 additions & 0 deletions
41
src/main/java/cc/reconnected/server/core/customChat/CustomConnectionMessage.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
package cc.reconnected.server.core.customChat; | ||
|
||
import cc.reconnected.server.RccServer; | ||
import cc.reconnected.server.util.Components; | ||
import net.kyori.adventure.text.minimessage.MiniMessage; | ||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; | ||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | ||
import net.minecraft.server.network.ServerPlayerEntity; | ||
import net.minecraft.text.Text; | ||
|
||
public class CustomConnectionMessage { | ||
private static final MiniMessage miniMessage = MiniMessage.miniMessage(); | ||
|
||
public static Text onJoin(ServerPlayerEntity player) { | ||
var joinMessage = miniMessage.deserialize(RccServer.CONFIG.customChatFormat.joinFormat(), | ||
TagResolver.resolver( | ||
Placeholder.component("display_name", player.getDisplayName()) | ||
)); | ||
|
||
return Components.toText(joinMessage); | ||
} | ||
|
||
public static Text onJoinRenamed(ServerPlayerEntity player, String previousName) { | ||
var joinMessage = miniMessage.deserialize(RccServer.CONFIG.customChatFormat.joinRenamedFormat(), | ||
TagResolver.resolver( | ||
Placeholder.component("display_name", player.getDisplayName()), | ||
Placeholder.component("previous_name", Text.of(previousName)) | ||
)); | ||
|
||
return Components.toText(joinMessage); | ||
} | ||
|
||
public static Text onLeave(ServerPlayerEntity player) { | ||
var leaveMessage = miniMessage.deserialize(RccServer.CONFIG.customChatFormat.leaveFormat(), | ||
TagResolver.resolver( | ||
Placeholder.component("display_name", player.getDisplayName()) | ||
)); | ||
|
||
return Components.toText(leaveMessage); | ||
} | ||
} |
24 changes: 24 additions & 0 deletions
24
src/main/java/cc/reconnected/server/core/customChat/CustomDeathMessage.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
package cc.reconnected.server.core.customChat; | ||
|
||
import cc.reconnected.server.RccServer; | ||
import cc.reconnected.server.util.Components; | ||
import net.kyori.adventure.text.minimessage.MiniMessage; | ||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; | ||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | ||
import net.minecraft.entity.damage.DamageTracker; | ||
import net.minecraft.server.network.ServerPlayerEntity; | ||
import net.minecraft.text.Text; | ||
|
||
public class CustomDeathMessage { | ||
private static final MiniMessage miniMessage = MiniMessage.miniMessage(); | ||
|
||
public static Text onDeath(ServerPlayerEntity player, DamageTracker instance) { | ||
var deathMessage = instance.getDeathMessage(); | ||
var deathComponent = miniMessage.deserialize(RccServer.CONFIG.customChatFormat.deathFormat(), | ||
TagResolver.resolver( | ||
Placeholder.component("death_message", deathMessage) | ||
)); | ||
|
||
return Components.toText(deathComponent); | ||
} | ||
} |
41 changes: 41 additions & 0 deletions
41
src/main/java/cc/reconnected/server/core/customChat/CustomEmoteMessage.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
package cc.reconnected.server.core.customChat; | ||
|
||
import cc.reconnected.server.RccServer; | ||
import cc.reconnected.server.parser.MarkdownParser; | ||
import cc.reconnected.server.util.Components; | ||
import net.kyori.adventure.text.minimessage.MiniMessage; | ||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; | ||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; | ||
import net.minecraft.network.message.MessageType; | ||
import net.minecraft.network.message.SignedMessage; | ||
import net.minecraft.registry.RegistryKeys; | ||
import net.minecraft.server.network.ServerPlayerEntity; | ||
import net.minecraft.text.Text; | ||
|
||
public class CustomEmoteMessage { | ||
private static final MiniMessage miniMessage = MiniMessage.miniMessage(); | ||
|
||
public static void sendEmoteMessage(ServerPlayerEntity receiver, SignedMessage message, MessageType.Parameters params) { | ||
var playerUuid = message.link().sender(); | ||
var player = RccServer.server.getPlayerManager().getPlayer(playerUuid); | ||
|
||
Text messageText; | ||
if (RccServer.CONFIG.customChatFormat.enableMarkdown()) { | ||
messageText = MarkdownParser.defaultParser.parseNode(message.getSignedContent()).toText(); | ||
} else { | ||
messageText = message.getContent(); | ||
} | ||
|
||
var component = miniMessage.deserialize(RccServer.CONFIG.customChatFormat.emoteFormat(), TagResolver.resolver( | ||
Placeholder.component("display_name", player.getDisplayName()), | ||
Placeholder.component("message", messageText) | ||
)); | ||
|
||
var text = Components.toText(component); | ||
|
||
var msgType = RccServer.server.getRegistryManager().get(RegistryKeys.MESSAGE_TYPE).getOrThrow(RccServer.CHAT_TYPE); | ||
var newParams = new MessageType.Parameters(msgType, text, null); | ||
|
||
receiver.networkHandler.sendChatMessage(message, newParams); | ||
} | ||
} |
36 changes: 36 additions & 0 deletions
36
src/main/java/cc/reconnected/server/core/customChat/CustomSentMessage.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
package cc.reconnected.server.core.customChat; | ||
|
||
import cc.reconnected.server.RccServer; | ||
import net.minecraft.network.message.MessageType; | ||
import net.minecraft.network.message.SentMessage; | ||
import net.minecraft.network.message.SignedMessage; | ||
import net.minecraft.server.network.ServerPlayerEntity; | ||
import net.minecraft.text.Text; | ||
|
||
public record CustomSentMessage(SignedMessage message) implements SentMessage { | ||
|
||
@Override | ||
public Text getContent() { | ||
return this.message.getContent(); | ||
} | ||
|
||
@Override | ||
public void send(ServerPlayerEntity receiver, boolean filterMaskEnabled, MessageType.Parameters params) { | ||
SignedMessage signedMessage = this.message.withFilterMaskEnabled(filterMaskEnabled); | ||
RccServer.LOGGER.info("Message params type: {}", params.type().chat().translationKey()); | ||
if (!signedMessage.isFullyFiltered()) { | ||
switch (params.type().chat().translationKey()) { | ||
case "chat.type.text": | ||
CustomChatMessage.sendChatMessage(receiver, message, params); | ||
break; | ||
case "chat.type.emote": | ||
CustomEmoteMessage.sendEmoteMessage(receiver, message, params); | ||
break; | ||
default: | ||
receiver.networkHandler.sendChatMessage(this.message, params); | ||
break; | ||
} | ||
} | ||
} | ||
|
||
} |
33 changes: 33 additions & 0 deletions
33
src/main/java/cc/reconnected/server/mixin/PlayerEntityMixin.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
package cc.reconnected.server.mixin; | ||
|
||
import cc.reconnected.server.core.CustomNameFormat; | ||
import com.mojang.authlib.GameProfile; | ||
import net.minecraft.entity.player.PlayerEntity; | ||
import net.minecraft.server.network.ServerPlayerEntity; | ||
import net.minecraft.text.MutableText; | ||
import net.minecraft.text.Text; | ||
import org.spongepowered.asm.mixin.Mixin; | ||
import org.spongepowered.asm.mixin.Shadow; | ||
import org.spongepowered.asm.mixin.injection.At; | ||
import org.spongepowered.asm.mixin.injection.Inject; | ||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; | ||
|
||
@Mixin(PlayerEntity.class) | ||
public abstract class PlayerEntityMixin { | ||
@Shadow | ||
private MutableText addTellClickEvent(MutableText component) { | ||
return null; | ||
} | ||
|
||
@Shadow | ||
public abstract Text getName(); | ||
|
||
@Shadow | ||
public abstract GameProfile getGameProfile(); | ||
|
||
@Inject(method = "getDisplayName", at = @At("HEAD"), cancellable = true) | ||
public void getDisplayName(CallbackInfoReturnable<MutableText> cir) { | ||
var name = CustomNameFormat.getNameForPlayer((ServerPlayerEntity) (Object) this); | ||
cir.setReturnValue(addTellClickEvent(name)); | ||
} | ||
} |
42 changes: 42 additions & 0 deletions
42
src/main/java/cc/reconnected/server/mixin/PlayerManagerMixin.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
package cc.reconnected.server.mixin; | ||
|
||
import cc.reconnected.server.core.customChat.CustomConnectionMessage; | ||
import net.minecraft.network.ClientConnection; | ||
import net.minecraft.server.PlayerManager; | ||
import net.minecraft.server.network.ServerPlayerEntity; | ||
import net.minecraft.text.Text; | ||
import net.minecraft.text.TranslatableTextContent; | ||
import org.spongepowered.asm.mixin.Mixin; | ||
import org.spongepowered.asm.mixin.Unique; | ||
import org.spongepowered.asm.mixin.injection.At; | ||
import org.spongepowered.asm.mixin.injection.Inject; | ||
import org.spongepowered.asm.mixin.injection.ModifyArg; | ||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; | ||
|
||
@Mixin(PlayerManager.class) | ||
public class PlayerManagerMixin { | ||
@Unique | ||
private ServerPlayerEntity rccServer$player = null; | ||
|
||
@Inject(method="onPlayerConnect", at = @At("HEAD")) | ||
private void rccServer$onJoin(ClientConnection connection, ServerPlayerEntity player, CallbackInfo ci) { | ||
rccServer$player = player; | ||
} | ||
|
||
@Inject(method="onPlayerConnect", at = @At("RETURN")) | ||
private void rccServer$onJoinReturn(ClientConnection connection, ServerPlayerEntity player, CallbackInfo ci) { | ||
rccServer$player = null; | ||
} | ||
|
||
@ModifyArg(method = "onPlayerConnect", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/PlayerManager;broadcast(Lnet/minecraft/text/Text;Z)V")) | ||
public Text rccServer$getPlayerJoinMessage(Text message) { | ||
var ogText = (TranslatableTextContent) message.getContent(); | ||
var args = ogText.getArgs(); | ||
|
||
if (args.length == 1) { | ||
return CustomConnectionMessage.onJoin(rccServer$player); | ||
} else { | ||
return CustomConnectionMessage.onJoinRenamed(rccServer$player, (String) args[1]); | ||
} | ||
} | ||
} |
Oops, something went wrong.