-
Notifications
You must be signed in to change notification settings - Fork 1
Temp Fix SystemChat #6
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
3e9fd07
9eabc7f
e4169dc
aa7ccb2
91a2cd6
b8797e6
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -62,7 +62,7 @@ private void initializeModernPacketHandlers() { | |||||||||||||||||||||||||||||||||
packet -> { | ||||||||||||||||||||||||||||||||||
net.kyori.adventure.text.Component nativeComponment = ((WrapperPlayServerDisguisedChat) packet).getMessage(); | ||||||||||||||||||||||||||||||||||
return new PacketAccessorResult( | ||||||||||||||||||||||||||||||||||
nativeComponment != null ? NativeAdventureConverter.componentFromNative(nativeComponment) : Component.empty(), | ||||||||||||||||||||||||||||||||||
(nativeComponment != null && nativeComponment.children().size() > 0) ? NativeAdventureConverter.componentFromNative(nativeComponment) : Component.empty(), | ||||||||||||||||||||||||||||||||||
ChatComponentType.NativeAdventureComponent, | ||||||||||||||||||||||||||||||||||
0, | ||||||||||||||||||||||||||||||||||
false | ||||||||||||||||||||||||||||||||||
|
@@ -81,7 +81,9 @@ private void initializeModernPacketHandlers() { | |||||||||||||||||||||||||||||||||
boolean longerThanMaxLength = InteractiveChat.sendOriginalIfTooLong && json.length() > InteractiveChat.packetStringMaxLength; | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
WrapperPlayServerDisguisedChat chatPacket = (WrapperPlayServerDisguisedChat) packet; | ||||||||||||||||||||||||||||||||||
chatPacket.setMessage((net.kyori.adventure.text.Component) type.convertTo(component, legacyRGB)); | ||||||||||||||||||||||||||||||||||
if (component.children().size() > 0) { | ||||||||||||||||||||||||||||||||||
chatPacket.setMessage((net.kyori.adventure.text.Component) type.convertTo(component, legacyRGB)); | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
Comment on lines
+84
to
+86
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Inconsistent empty component handling The code checks if Consider checking if the component has any content instead: - if (component.children().size() > 0) {
- chatPacket.setMessage((net.kyori.adventure.text.Component) type.convertTo(component, legacyRGB));
- }
+ if (!component.equals(Component.empty())) {
+ chatPacket.setMessage((net.kyori.adventure.text.Component) type.convertTo(component, legacyRGB));
+ } 🤖 Prompt for AI Agents
|
||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
sendDebug("PROCESSED DISGUISED_CHAT Packet:" + | ||||||||||||||||||||||||||||||||||
"NEW COMPONENT MESSAGE: " + PlainTextComponentSerializer.plainText().serialize(component) + | ||||||||||||||||||||||||||||||||||
|
@@ -135,7 +137,12 @@ private void initializeCommonPacketHandlers() { | |||||||||||||||||||||||||||||||||
nativeComponent = ((WrapperPlayServerChatMessage) packet).getMessage().getChatContent(); | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
return new PacketAccessorResult(NativeAdventureConverter.componentFromNative(nativeComponent), ChatComponentType.NativeAdventureComponent, 0, false); | ||||||||||||||||||||||||||||||||||
return new PacketAccessorResult( | ||||||||||||||||||||||||||||||||||
(nativeComponent != null && nativeComponent.children().size() > 0) ? NativeAdventureConverter.componentFromNative(nativeComponent) : Component.empty(), | ||||||||||||||||||||||||||||||||||
ChatComponentType.NativeAdventureComponent, | ||||||||||||||||||||||||||||||||||
0, | ||||||||||||||||||||||||||||||||||
false | ||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||
Comment on lines
+140
to
+145
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same NPE risk in chat handler Similar to line 65, this has the same potential NPE issue with the children() check. Apply the same defensive null check: - return new PacketAccessorResult(
- (nativeComponent != null && nativeComponent.children().size() > 0) ? NativeAdventureConverter.componentFromNative(nativeComponent) : Component.empty(),
- ChatComponentType.NativeAdventureComponent,
- 0,
- false
- );
+ return new PacketAccessorResult(
+ (nativeComponent != null && nativeComponent.children() != null && !nativeComponent.children().isEmpty()) ? NativeAdventureConverter.componentFromNative(nativeComponent) : Component.empty(),
+ ChatComponentType.NativeAdventureComponent,
+ 0,
+ false
+ ); 📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents
|
||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||
(packet, component, type, field, sender) -> { | ||||||||||||||||||||||||||||||||||
boolean legacyRGB = InteractiveChat.version.isLegacyRGB(); | ||||||||||||||||||||||||||||||||||
|
@@ -154,10 +161,12 @@ private void initializeCommonPacketHandlers() { | |||||||||||||||||||||||||||||||||
"LONGER THAN MAX LENGTH: " + longerThanMaxLength + | ||||||||||||||||||||||||||||||||||
"CURRENT MESSAGE: " + net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer.plainText().serialize(chatMessage.getMessage().getChatContent())); | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
if (InteractiveChat.version.isNewerOrEqualTo(MCVersion.V1_19_3)) { | ||||||||||||||||||||||||||||||||||
((ChatMessage_v1_19_3) chatMessage.getMessage()).setUnsignedChatContent((net.kyori.adventure.text.Component) type.convertTo(component, legacyRGB)); | ||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||
chatMessage.getMessage().setChatContent((net.kyori.adventure.text.Component) type.convertTo(component, legacyRGB)); | ||||||||||||||||||||||||||||||||||
if (component.children().size() > 0) { | ||||||||||||||||||||||||||||||||||
if (InteractiveChat.version.isNewerOrEqualTo(MCVersion.V1_19_3)) { | ||||||||||||||||||||||||||||||||||
((ChatMessage_v1_19_3) chatMessage.getMessage()).setUnsignedChatContent((net.kyori.adventure.text.Component) type.convertTo(component, legacyRGB)); | ||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||
chatMessage.getMessage().setChatContent((net.kyori.adventure.text.Component) type.convertTo(component, legacyRGB)); | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
Comment on lines
+164
to
170
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Repeated pattern of checking children().size() > 0 The same pattern of checking
Extract this logic into a helper method: private static boolean hasContent(Component component) {
return component != null && !component.equals(Component.empty());
}
private static boolean hasContent(net.kyori.adventure.text.Component component) {
return component != null &&
(component.children() != null && !component.children().isEmpty() ||
!net.kyori.adventure.text.Component.empty().equals(component));
} Then use it consistently throughout the code. Also applies to: 182-184, 194-203, 253-255, 298-307 🤖 Prompt for AI Agents
|
||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
sendDebug("Processed SERVER_CHAT Packet:" + | ||||||||||||||||||||||||||||||||||
|
@@ -170,7 +179,9 @@ private void initializeCommonPacketHandlers() { | |||||||||||||||||||||||||||||||||
"LONGER THAN MAX LENGTH: " + longerThanMaxLength + | ||||||||||||||||||||||||||||||||||
"CURRENT MESSAGE: " + net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer.plainText().serialize(chatMessage.getMessage())); | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
chatMessage.setMessage((net.kyori.adventure.text.Component) type.convertTo(component, legacyRGB)); | ||||||||||||||||||||||||||||||||||
if (component.children().size() > 0) { | ||||||||||||||||||||||||||||||||||
chatMessage.setMessage((net.kyori.adventure.text.Component) type.convertTo(component, legacyRGB)); | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
sendDebug("Processed SYSTEM_CHAT_MESSAGE Packet:" + | ||||||||||||||||||||||||||||||||||
"NEW COMPONENT: " + PlainTextComponentSerializer.plainText().serialize(component)); | ||||||||||||||||||||||||||||||||||
|
@@ -180,13 +191,15 @@ private void initializeCommonPacketHandlers() { | |||||||||||||||||||||||||||||||||
if (packet instanceof WrapperPlayServerChatMessage) { | ||||||||||||||||||||||||||||||||||
WrapperPlayServerChatMessage chatMessage = (WrapperPlayServerChatMessage) packet; | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
if (InteractiveChat.version.isNewerOrEqualTo(MCVersion.V1_19_3)) { | ||||||||||||||||||||||||||||||||||
((ChatMessage_v1_19_3) chatMessage.getMessage()) | ||||||||||||||||||||||||||||||||||
.setUnsignedChatContent((net.kyori.adventure.text.Component) NativeAdventureConverter.componentToNative(component, legacyRGB)); | ||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||
chatMessage.getMessage().setChatContent( | ||||||||||||||||||||||||||||||||||
(net.kyori.adventure.text.Component) NativeAdventureConverter.componentToNative(component, legacyRGB) | ||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||
if (component.children().size() > 0) { | ||||||||||||||||||||||||||||||||||
if (InteractiveChat.version.isNewerOrEqualTo(MCVersion.V1_19_3)) { | ||||||||||||||||||||||||||||||||||
((ChatMessage_v1_19_3) chatMessage.getMessage()) | ||||||||||||||||||||||||||||||||||
.setUnsignedChatContent((net.kyori.adventure.text.Component) NativeAdventureConverter.componentToNative(component, legacyRGB)); | ||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||
chatMessage.getMessage().setChatContent( | ||||||||||||||||||||||||||||||||||
(net.kyori.adventure.text.Component) NativeAdventureConverter.componentToNative(component, legacyRGB) | ||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||
((WrapperPlayServerSystemChatMessage) packet).setMessageJson(json); | ||||||||||||||||||||||||||||||||||
|
@@ -237,7 +250,9 @@ private void initializeCommonPacketHandlers() { | |||||||||||||||||||||||||||||||||
"LONGER THAN MAX LENGTH: " + longerThanMaxLength + | ||||||||||||||||||||||||||||||||||
"CURRENT TITLE: " + net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer.plainText().serialize(titlePacket.getTitle())); | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
titlePacket.setTitle((net.kyori.adventure.text.Component) type.convertTo(component, legacyRGB)); | ||||||||||||||||||||||||||||||||||
if (component.children().size() > 0) { | ||||||||||||||||||||||||||||||||||
titlePacket.setTitle((net.kyori.adventure.text.Component) type.convertTo(component, legacyRGB)); | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
if (sender == null) sender = UUID_NIL; | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
|
@@ -280,13 +295,15 @@ private PacketHandler createModernTitleHandler() { | |||||||||||||||||||||||||||||||||
"LONGER THAN MAX LENGTH: " + longerThanMaxLength + | ||||||||||||||||||||||||||||||||||
"NEW COMPONENT: " + component); | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
net.kyori.adventure.text.Component nativeComponent = (net.kyori.adventure.text.Component) type.convertTo(component, legacyRGB); | ||||||||||||||||||||||||||||||||||
if (packet instanceof WrapperPlayServerSetTitleText) { | ||||||||||||||||||||||||||||||||||
((WrapperPlayServerSetTitleText) packet).setTitle(nativeComponent); | ||||||||||||||||||||||||||||||||||
} else if (packet instanceof WrapperPlayServerSetTitleSubtitle) { | ||||||||||||||||||||||||||||||||||
((WrapperPlayServerSetTitleSubtitle) packet).setSubtitle(nativeComponent); | ||||||||||||||||||||||||||||||||||
} else if (packet instanceof WrapperPlayServerActionBar) { | ||||||||||||||||||||||||||||||||||
((WrapperPlayServerActionBar) packet).setActionBarText(nativeComponent); | ||||||||||||||||||||||||||||||||||
if (component.children().size() > 0) { | ||||||||||||||||||||||||||||||||||
net.kyori.adventure.text.Component nativeComponent = (net.kyori.adventure.text.Component) type.convertTo(component, legacyRGB); | ||||||||||||||||||||||||||||||||||
if (packet instanceof WrapperPlayServerSetTitleText) { | ||||||||||||||||||||||||||||||||||
((WrapperPlayServerSetTitleText) packet).setTitle(nativeComponent); | ||||||||||||||||||||||||||||||||||
} else if (packet instanceof WrapperPlayServerSetTitleSubtitle) { | ||||||||||||||||||||||||||||||||||
((WrapperPlayServerSetTitleSubtitle) packet).setSubtitle(nativeComponent); | ||||||||||||||||||||||||||||||||||
} else if (packet instanceof WrapperPlayServerActionBar) { | ||||||||||||||||||||||||||||||||||
((WrapperPlayServerActionBar) packet).setActionBarText(nativeComponent); | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
return new PacketWriterResult(longerThanMaxLength, json.length(), sender); | ||||||||||||||||||||||||||||||||||
|
@@ -311,7 +328,7 @@ private int getChatFieldsSize() { | |||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
@Override | ||||||||||||||||||||||||||||||||||
public void onPacketSend(PacketSendEvent event) { | ||||||||||||||||||||||||||||||||||
System.out.println(event.getPacketType()); | ||||||||||||||||||||||||||||||||||
//System.out.println(event.getPacketType()); | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
if (!PACKET_HANDLERS.containsKey(event.getPacketType())) return; | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
|
@@ -327,15 +344,19 @@ private void handlePacketSending(PacketSendEvent event) { | |||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
InteractiveChat.messagesCounter.getAndIncrement(); | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
// Allow only SystemChat - start | ||||||||||||||||||||||||||||||||||
if (event.getPacketType() != PacketType.Play.Server.SYSTEM_CHAT_MESSAGE) { | ||||||||||||||||||||||||||||||||||
return; | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
// Allow only SystemChat - end | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
Player receiver = event.getPlayer(); | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
if (!(event.getLastUsedWrapper() instanceof WrapperPlayServerSystemChatMessage)) { | ||||||||||||||||||||||||||||||||||
event.setCancelled(true); | ||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||
event.setCancelled(true); | ||||||||||||||||||||||||||||||||||
Comment on lines
+347
to
+355
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 💡 Verification agent 🧩 Analysis chainRestrictive packet filtering may cause issues This change restricts processing to only
This aligns with the "temp fix" nature but may break other chat functionality. Given this is described as a temporary fix for ChatControl compatibility, verify if this restrictive filtering affects other chat features: 🏁 Script executed: #!/bin/bash
# Search for other usages of the ignored packet types
echo "=== Searching for CHAT_MESSAGE packet usage ==="
rg -A 5 "PacketType\.Play\.Server\.CHAT_MESSAGE" --type java
echo -e "\n=== Searching for DISGUISED_CHAT packet usage ==="
rg -A 5 "PacketType\.Play\.Server\.DISGUISED_CHAT" --type java
echo -e "\n=== Searching for ChatControl plugin integration ==="
fd -e java -e yml | xargs rg -i "chatcontrol" -A 3 Length of output: 5036 Refine chat packet filtering to preserve other message handlers The current guard in // Allow only SystemChat
if (event.getPacketType() != PacketType.Play.Server.SYSTEM_CHAT_MESSAGE) {
return;
}
Player receiver = event.getPlayer();
event.setCancelled(true); unconditionally skips all non-system chat packets—bypassing existing handlers for:
To avoid breaking other chat features, narrow the early return and cancellation to only the SystemChat case. For example: --- a/src/main/java/net/skullian/listeners/PEOutMessagePacket.java
+++ b/src/main/java/net/skullian/listeners/PEOutMessagePacket.java
@@ -346,9 +346,12 @@
- // Allow only SystemChat
- if (event.getPacketType() != PacketType.Play.Server.SYSTEM_CHAT_MESSAGE) {
- return;
- }
- Player receiver = event.getPlayer();
- event.setCancelled(true);
+ switch (event.getPacketType()) {
+ case SYSTEM_CHAT_MESSAGE -> {
+ Player receiver = event.getPlayer();
+ event.setCancelled(true);
+ // existing SystemChat handling…
+ }
+ default -> {
+ // continue so PACKET_HANDLERS for CHAT_MESSAGE, DISGUISED_CHAT, etc. run
+ }
+ } This ensures other chat packet handlers remain in effect while still isolating the temporary SystemChat fix. 🤖 Prompt for AI Agents
|
||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
event.markForReEncode(true); | ||||||||||||||||||||||||||||||||||
UUID messageUUID = UUID.randomUUID(); | ||||||||||||||||||||||||||||||||||
ICPlayer determinedSender = ICPlayerFactory.getICPlayer((Player) event.getPlayer()); | ||||||||||||||||||||||||||||||||||
ICPlayer determinedSender = packetHandler.getDeterminedSenderFunction().apply(event); | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
PacketSendEvent originalEvent = event.clone(); | ||||||||||||||||||||||||||||||||||
SCHEDULING_SERVICE.execute(() -> { | ||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -9,4 +9,4 @@ LegacyCommandPacketPriority: HIGH | |
BungeecordPingPriority: NORMAL | ||
|
||
# Enable debug? | ||
Debug: true | ||
Debug: false |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Potential NPE when
nativeComponment
is nullThe check
nativeComponment != null && nativeComponment.children().size() > 0
could throw NPE ifchildren()
returns null. Consider using a more defensive approach.Apply this safer null check pattern:
📝 Committable suggestion
🤖 Prompt for AI Agents