Server Data and Profileless Chat message packets implemented. ChatPreview packet removed. Message Header packet set only to 1.19.2. Chat Message packet partially implemented.

This commit is contained in:
Milutinke 2022-12-21 12:51:27 +01:00
parent d81a67762e
commit bb160d6d84
2 changed files with 143 additions and 80 deletions

View file

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MinecraftClient.Mapping
{
public enum MessageFilterType
{
PassThrough = 0,
FullyFiltered,
PartiallyFiltered
}
}

View file

@ -521,6 +521,51 @@ namespace MinecraftClient.Protocol.Handlers
handler.OnTextReceived(chat); handler.OnTextReceived(chat);
} }
else // 1.19.1 + else // 1.19.1 +
{
if (protocolVersion >= MC_1_19_3_Version)
{
// Header section
Guid senderUUID = dataTypes.ReadNextUUID(packetData);
int index = dataTypes.ReadNextVarInt(packetData);
byte[]? messageSignature = dataTypes.ReadNextBool(packetData) ? dataTypes.ReadNextByteArray(packetData) : null;
// Body
string message = dataTypes.ReadNextString(packetData);
long timestamp = dataTypes.ReadNextLong(packetData);
long salt = dataTypes.ReadNextLong(packetData);
// Previous Messages
int totalPreviousMessages = dataTypes.ReadNextVarInt(packetData);
List<Byte[]> previousMessageSignatures = new();
for (int i = 0; i < totalPreviousMessages; i++)
{
int messageId = dataTypes.ReadNextVarInt(packetData);
if (messageId > 0)
previousMessageSignatures.Add(dataTypes.ReadNextByteArray(packetData));
}
// Other
string? unsignedChatContent = dataTypes.ReadNextBool(packetData) ? dataTypes.ReadNextString(packetData) : null;
MessageFilterType filterType = (MessageFilterType)dataTypes.ReadNextVarInt(packetData);
if (filterType == MessageFilterType.PartiallyFiltered)
dataTypes.ReadNextULongArray(packetData);
// Network Target
int chatType = dataTypes.ReadNextInt(packetData);
string networkName = dataTypes.ReadNextString(packetData);
bool networkTargetNamePresent = dataTypes.ReadNextBool(packetData);
string? networkTargetName = null;
if (networkTargetNamePresent)
networkTargetName = dataTypes.ReadNextString(packetData);
// TODO
}
else
{ {
byte[]? precedingSignature = dataTypes.ReadNextBool(packetData) ? dataTypes.ReadNextByteArray(packetData) : null; byte[]? precedingSignature = dataTypes.ReadNextBool(packetData) ? dataTypes.ReadNextByteArray(packetData) : null;
Guid senderUUID = dataTypes.ReadNextUUID(packetData); Guid senderUUID = dataTypes.ReadNextUUID(packetData);
@ -544,8 +589,8 @@ namespace MinecraftClient.Protocol.Handlers
string? unsignedChatContent = dataTypes.ReadNextBool(packetData) ? dataTypes.ReadNextString(packetData) : null; string? unsignedChatContent = dataTypes.ReadNextBool(packetData) ? dataTypes.ReadNextString(packetData) : null;
int filterEnum = dataTypes.ReadNextVarInt(packetData); MessageFilterType filterEnum = (MessageFilterType)dataTypes.ReadNextVarInt(packetData);
if (filterEnum == 2) // PARTIALLY_FILTERED if (filterEnum == MessageFilterType.PartiallyFiltered)
dataTypes.ReadNextULongArray(packetData); dataTypes.ReadNextULongArray(packetData);
int chatTypeId = dataTypes.ReadNextVarInt(packetData); int chatTypeId = dataTypes.ReadNextVarInt(packetData);
@ -597,6 +642,7 @@ namespace MinecraftClient.Protocol.Handlers
Acknowledge(chat); Acknowledge(chat);
handler.OnTextReceived(chat); handler.OnTextReceived(chat);
} }
}
break; break;
case PacketTypesIn.CombatEvent: case PacketTypesIn.CombatEvent:
// 1.8 - 1.16.5 // 1.8 - 1.16.5
@ -625,8 +671,8 @@ namespace MinecraftClient.Protocol.Handlers
); );
break; break;
case PacketTypesIn.MessageHeader: case PacketTypesIn.MessageHeader: // 1.19.2 only
if (protocolVersion >= MC_1_19_2_Version) if (protocolVersion == MC_1_19_2_Version)
{ {
byte[]? precedingSignature = dataTypes.ReadNextBool(packetData) ? dataTypes.ReadNextByteArray(packetData) : null; byte[]? precedingSignature = dataTypes.ReadNextBool(packetData) ? dataTypes.ReadNextByteArray(packetData) : null;
Guid senderUUID = dataTypes.ReadNextUUID(packetData); Guid senderUUID = dataTypes.ReadNextUUID(packetData);
@ -654,6 +700,7 @@ namespace MinecraftClient.Protocol.Handlers
} }
} }
} }
break; break;
case PacketTypesIn.Respawn: case PacketTypesIn.Respawn:
string? dimensionTypeNameRespawn = null; string? dimensionTypeNameRespawn = null;
@ -1104,7 +1151,11 @@ namespace MinecraftClient.Protocol.Handlers
if (hasIcon) if (hasIcon)
iconBase64 = dataTypes.ReadNextString(packetData); iconBase64 = dataTypes.ReadNextString(packetData);
bool previewsChat = dataTypes.ReadNextBool(packetData);
bool previewsChat = false;
if (protocolVersion < MC_1_19_3_Version)
dataTypes.ReadNextBool(packetData);
handler.OnServerDataRecived(hasMotd, motd, hasIcon, iconBase64, previewsChat); handler.OnServerDataRecived(hasMotd, motd, hasIcon, iconBase64, previewsChat);
break; break;
@ -1134,25 +1185,22 @@ namespace MinecraftClient.Protocol.Handlers
case PacketTypesIn.SetDisplayChatPreview: case PacketTypesIn.SetDisplayChatPreview:
bool previewsChatSetting = dataTypes.ReadNextBool(packetData); bool previewsChatSetting = dataTypes.ReadNextBool(packetData);
handler.OnChatPreviewSettingUpdate(previewsChatSetting); handler.OnChatPreviewSettingUpdate(previewsChatSetting);
break;
case PacketTypesIn.ChatPreview:
int queryID = dataTypes.ReadNextInt(packetData);
bool componentIsPresent = dataTypes.ReadNextBool(packetData);
// Currently noy implemented
log.Debug("New chat preview: ");
log.Debug(">> Query ID: " + queryID);
log.Debug(">> Component is present: " + componentIsPresent);
if (componentIsPresent)
{
string message = dataTypes.ReadNextString(packetData);
log.Debug(">> Component: " + ChatParser.ParseText(message));
//handler.OnTextReceived(message, true);
}
break; break;
case PacketTypesIn.ChatSuggestions: case PacketTypesIn.ChatSuggestions:
break; break;
case PacketTypesIn.ProfilelessChatMessage:
string message_ = dataTypes.ReadNextString(packetData);
int messageType_ = dataTypes.ReadNextVarInt(packetData);
string messageName = dataTypes.ReadNextString(packetData);
bool hasTargetName = dataTypes.ReadNextBool(packetData);
string? targetName_ = null;
if (hasTargetName)
targetName_ = dataTypes.ReadNextString(packetData);
// Not clear for what this is used as the time of writting
break;
case PacketTypesIn.MapChunkBulk: case PacketTypesIn.MapChunkBulk:
if (protocolVersion < MC_1_9_Version && handler.GetTerrainEnabled()) if (protocolVersion < MC_1_9_Version && handler.GetTerrainEnabled())
{ {