Fix entity handle & Try fix message singing again

This commit is contained in:
BruceChen 2023-01-16 03:00:37 +08:00
parent 50dd5a3ba3
commit 950d9bcfdc
3 changed files with 198 additions and 130 deletions

View file

@ -684,23 +684,73 @@ namespace MinecraftClient.Protocol.Handlers
case 15: // Particle
// Currecutly not handled. Reading data only
int ParticleID = ReadNextVarInt(cache);
switch (ParticleID)
// Need to check the exact version where the change occurred!!!!!
if (protocolversion >= Protocol18Handler.MC_1_19_3_Version)
{
case 3:
ReadNextVarInt(cache);
break;
case 14:
ReadNextFloat(cache);
ReadNextFloat(cache);
ReadNextFloat(cache);
ReadNextFloat(cache);
break;
case 23:
ReadNextVarInt(cache);
break;
case 32:
ReadNextItemSlot(cache, itemPalette);
break;
switch (ParticleID)
{
case 2:
ReadNextVarInt(cache);
break;
case 3:
ReadNextVarInt(cache);
break;
case 14:
ReadNextFloat(cache);
ReadNextFloat(cache);
ReadNextFloat(cache);
ReadNextFloat(cache);
break;
case 15:
ReadNextFloat(cache);
ReadNextFloat(cache);
ReadNextFloat(cache);
ReadNextFloat(cache);
ReadNextFloat(cache);
ReadNextFloat(cache);
ReadNextFloat(cache);
break;
case 24:
ReadNextVarInt(cache);
break;
case 35:
ReadNextItemSlot(cache, itemPalette);
break;
case 36:
string positionSourceType = ReadNextString(cache);
if (positionSourceType == "minecraft:block")
{
ReadNextLocation(cache);
}
else if (positionSourceType == "minecraft:entity")
{
ReadNextVarInt(cache);
ReadNextFloat(cache);
}
ReadNextVarInt(cache);
break;
}
}
else
{
switch (ParticleID)
{
case 3:
ReadNextVarInt(cache);
break;
case 14:
ReadNextFloat(cache);
ReadNextFloat(cache);
ReadNextFloat(cache);
ReadNextFloat(cache);
break;
case 23:
ReadNextVarInt(cache);
break;
case 32:
ReadNextItemSlot(cache, itemPalette);
break;
}
}
break;
case 16: // Villager Data (3x VarInt)
@ -730,7 +780,10 @@ namespace MinecraftClient.Protocol.Handlers
if (protocolversion <= Protocol18Handler.MC_1_19_Version)
value = ReadNextVarInt(cache);
else
value = null; // Dimension and blockPos, currently not in use
{
// Dimension and blockPos, currently not in use
value = new Tuple<string, Location>(ReadNextString(cache), ReadNextLocation(cache));
}
break;
case 22: // Painting Variant
value = ReadNextVarInt(cache);

View file

@ -104,6 +104,9 @@ namespace MinecraftClient.Protocol.Handlers.packet.s2c
private static void CollectSignArguments(int NodeIdx, string command, List<Tuple<string, string>> arguments)
{
if (Nodes.Length <= NodeIdx)
return;
CommandNode node = Nodes[NodeIdx];
string last_arg = command;
switch (node.Flags & 0x03)

View file

@ -75,6 +75,7 @@ namespace MinecraftClient.Protocol.Handlers
private readonly BlockingCollection<Tuple<int, Queue<byte>>> packetQueue = new();
private float LastYaw, LastPitch;
private object MessageSigningLock = new();
private Guid chatUuid = Guid.Empty;
private int pendingAcknowledgments = 0, messageIndex = 0;
private LastSeenMessagesCollector lastSeenMessagesCollector;
@ -696,11 +697,15 @@ namespace MinecraftClient.Protocol.Handlers
}
ChatMessage chat = new(message, false, chatTypeId, senderUUID, unsignedChatContent, senderDisplayName, senderTeamName, timestamp, messageSignature, verifyResult);
if (isOnlineMode && !chat.LacksSender() && messageSignature != null)
lock (MessageSigningLock)
Acknowledge(chat);
handler.OnTextReceived(chat);
}
break;
case PacketTypesIn.HideMessage:
byte[] hideMessageSignature = dataTypes.ReadNextByteArray(packetData);
ConsoleIO.WriteLine($"HideMessage was not processed! (SigLen={hideMessageSignature.Length})");
break;
case PacketTypesIn.SystemChat:
string systemMessage = dataTypes.ReadNextString(packetData);
if (protocolVersion >= MC_1_19_3_Version)
@ -2524,13 +2529,14 @@ namespace MinecraftClient.Protocol.Handlers
{
if (protocolVersion >= MC_1_19_3_Version)
{
lastSeenMessagesCollector.Add_1_19_3(entry, true);
lastReceivedMessage = null;
if (lastSeenMessagesCollector.messageCount > 64)
if (lastSeenMessagesCollector.Add_1_19_3(entry, true))
{
int messageCount = lastSeenMessagesCollector.ResetMessageCount();
if (messageCount > 0)
SendMessageAcknowledgment(messageCount);
if (lastSeenMessagesCollector.messageCount > 64)
{
int messageCount = lastSeenMessagesCollector.ResetMessageCount();
if (messageCount > 0)
SendMessageAcknowledgment(messageCount);
}
}
}
else
@ -2561,74 +2567,77 @@ namespace MinecraftClient.Protocol.Handlers
try
{
LastSeenMessageList.Acknowledgment? acknowledgment_1_19_2 =
(protocolVersion == MC_1_19_2_Version) ? ConsumeAcknowledgment() : null;
(LastSeenMessageList.AcknowledgedMessage[] acknowledgment_1_19_3, byte[] bitset_1_19_3, int messageCount_1_19_3) =
(protocolVersion >= MC_1_19_3_Version) ? lastSeenMessagesCollector.Collect_1_19_3() : new(Array.Empty<LastSeenMessageList.AcknowledgedMessage>(), Array.Empty<byte>(), 0);
List<byte> fields = new();
// Command: String
fields.AddRange(dataTypes.GetString(command));
// Timestamp: Instant(Long)
DateTimeOffset timeNow = DateTimeOffset.UtcNow;
fields.AddRange(DataTypes.GetLong(timeNow.ToUnixTimeMilliseconds()));
List<Tuple<string, string>>? needSigned = null; // List< Argument Name, Argument Value >
if (playerKeyPair != null && isOnlineMode && protocolVersion >= MC_1_19_Version
&& Config.Signature.LoginWithSecureProfile && Config.Signature.SignMessageInCommand)
needSigned = DeclareCommands.CollectSignArguments(command);
if (needSigned == null || needSigned!.Count == 0)
lock (MessageSigningLock)
{
fields.AddRange(DataTypes.GetLong(0)); // Salt: Long
fields.AddRange(DataTypes.GetVarInt(0)); // Signature Length: VarInt
}
else
{
Guid uuid = handler.GetUserUuid();
byte[] salt = GenerateSalt();
fields.AddRange(salt); // Salt: Long
fields.AddRange(DataTypes.GetVarInt(needSigned.Count)); // Signature Length: VarInt
foreach ((string argName, string message) in needSigned)
LastSeenMessageList.Acknowledgment? acknowledgment_1_19_2 =
(protocolVersion == MC_1_19_2_Version) ? ConsumeAcknowledgment() : null;
(LastSeenMessageList.AcknowledgedMessage[] acknowledgment_1_19_3, byte[] bitset_1_19_3, int messageCount_1_19_3) =
(protocolVersion >= MC_1_19_3_Version) ? lastSeenMessagesCollector.Collect_1_19_3() : new(Array.Empty<LastSeenMessageList.AcknowledgedMessage>(), Array.Empty<byte>(), 0);
List<byte> fields = new();
// Command: String
fields.AddRange(dataTypes.GetString(command));
// Timestamp: Instant(Long)
DateTimeOffset timeNow = DateTimeOffset.UtcNow;
fields.AddRange(DataTypes.GetLong(timeNow.ToUnixTimeMilliseconds()));
if (needSigned == null || needSigned!.Count == 0)
{
fields.AddRange(dataTypes.GetString(argName)); // Argument name: String
byte[] sign;
if (protocolVersion == MC_1_19_Version)
sign = playerKeyPair!.PrivateKey.SignMessage(message, uuid, timeNow, ref salt);
else if (protocolVersion == MC_1_19_2_Version)
sign = playerKeyPair!.PrivateKey.SignMessage(message, uuid, timeNow, ref salt, acknowledgment_1_19_2!.lastSeen);
else // protocolVersion >= MC_1_19_3_Version
sign = playerKeyPair!.PrivateKey.SignMessage(message, uuid, chatUuid, messageIndex++, timeNow, ref salt, acknowledgment_1_19_3);
if (protocolVersion <= MC_1_19_2_Version)
fields.AddRange(DataTypes.GetVarInt(sign.Length)); // Signature length: VarInt
fields.AddRange(sign); // Signature: Byte Array
fields.AddRange(DataTypes.GetLong(0)); // Salt: Long
fields.AddRange(DataTypes.GetVarInt(0)); // Signature Length: VarInt
}
else
{
Guid uuid = handler.GetUserUuid();
byte[] salt = GenerateSalt();
fields.AddRange(salt); // Salt: Long
fields.AddRange(DataTypes.GetVarInt(needSigned.Count)); // Signature Length: VarInt
foreach ((string argName, string message) in needSigned)
{
fields.AddRange(dataTypes.GetString(argName)); // Argument name: String
byte[] sign;
if (protocolVersion == MC_1_19_Version)
sign = playerKeyPair!.PrivateKey.SignMessage(message, uuid, timeNow, ref salt);
else if (protocolVersion == MC_1_19_2_Version)
sign = playerKeyPair!.PrivateKey.SignMessage(message, uuid, timeNow, ref salt, acknowledgment_1_19_2!.lastSeen);
else // protocolVersion >= MC_1_19_3_Version
sign = playerKeyPair!.PrivateKey.SignMessage(message, uuid, chatUuid, messageIndex++, timeNow, ref salt, acknowledgment_1_19_3);
if (protocolVersion <= MC_1_19_2_Version)
fields.AddRange(DataTypes.GetVarInt(sign.Length)); // Signature length: VarInt
fields.AddRange(sign); // Signature: Byte Array
}
}
if (protocolVersion <= MC_1_19_2_Version)
fields.AddRange(dataTypes.GetBool(false)); // Signed Preview: Boolean
if (protocolVersion == MC_1_19_2_Version)
{
// Message Acknowledgment (1.19.2)
fields.AddRange(dataTypes.GetAcknowledgment(acknowledgment_1_19_2!, isOnlineMode && Config.Signature.LoginWithSecureProfile));
}
else if (protocolVersion >= MC_1_19_3_Version)
{
// message count
fields.AddRange(DataTypes.GetVarInt(messageCount_1_19_3));
// Acknowledged: BitSet
fields.AddRange(bitset_1_19_3);
}
SendPacket(PacketTypesOut.ChatCommand, fields);
}
if (protocolVersion <= MC_1_19_2_Version)
fields.AddRange(dataTypes.GetBool(false)); // Signed Preview: Boolean
if (protocolVersion == MC_1_19_2_Version)
{
// Message Acknowledgment (1.19.2)
fields.AddRange(dataTypes.GetAcknowledgment(acknowledgment_1_19_2!, isOnlineMode && Config.Signature.LoginWithSecureProfile));
}
else if (protocolVersion >= MC_1_19_3_Version)
{
// message count
fields.AddRange(DataTypes.GetVarInt(messageCount_1_19_3));
// Acknowledged: BitSet
fields.AddRange(bitset_1_19_3);
}
SendPacket(PacketTypesOut.ChatCommand, fields);
return true;
}
catch (SocketException) { return false; }
@ -2660,62 +2669,65 @@ namespace MinecraftClient.Protocol.Handlers
if (protocolVersion >= MC_1_19_Version)
{
LastSeenMessageList.Acknowledgment? acknowledgment_1_19_2 =
lock (MessageSigningLock)
{
LastSeenMessageList.Acknowledgment? acknowledgment_1_19_2 =
(protocolVersion == MC_1_19_2_Version) ? ConsumeAcknowledgment() : null;
(LastSeenMessageList.AcknowledgedMessage[] acknowledgment_1_19_3, byte[] bitset_1_19_3, int messageCount_1_19_3) =
(protocolVersion >= MC_1_19_3_Version) ? lastSeenMessagesCollector.Collect_1_19_3() : new(Array.Empty<LastSeenMessageList.AcknowledgedMessage>(), Array.Empty<byte>(), 0);
(LastSeenMessageList.AcknowledgedMessage[] acknowledgment_1_19_3, byte[] bitset_1_19_3, int messageCount_1_19_3) =
(protocolVersion >= MC_1_19_3_Version) ? lastSeenMessagesCollector.Collect_1_19_3() : new(Array.Empty<LastSeenMessageList.AcknowledgedMessage>(), Array.Empty<byte>(), 0);
// Timestamp: Instant(Long)
DateTimeOffset timeNow = DateTimeOffset.UtcNow;
fields.AddRange(DataTypes.GetLong(timeNow.ToUnixTimeMilliseconds()));
// Timestamp: Instant(Long)
DateTimeOffset timeNow = DateTimeOffset.UtcNow;
fields.AddRange(DataTypes.GetLong(timeNow.ToUnixTimeMilliseconds()));
if (!isOnlineMode || playerKeyPair == null || !Config.Signature.LoginWithSecureProfile || !Config.Signature.SignChat)
{
fields.AddRange(DataTypes.GetLong(0)); // Salt: Long
if (protocolVersion < MC_1_19_3_Version)
fields.AddRange(DataTypes.GetVarInt(0)); // Signature Length: VarInt (1.19 - 1.19.2)
if (!isOnlineMode || playerKeyPair == null || !Config.Signature.LoginWithSecureProfile || !Config.Signature.SignChat)
{
fields.AddRange(DataTypes.GetLong(0)); // Salt: Long
if (protocolVersion < MC_1_19_3_Version)
fields.AddRange(DataTypes.GetVarInt(0)); // Signature Length: VarInt (1.19 - 1.19.2)
else
fields.AddRange(dataTypes.GetBool(false)); // Has signature: bool (1.19.3)
}
else
fields.AddRange(dataTypes.GetBool(false)); // Has signature: bool (1.19.3)
}
else
{
// Salt: Long
byte[] salt = GenerateSalt();
fields.AddRange(salt);
{
// Salt: Long
byte[] salt = GenerateSalt();
fields.AddRange(salt);
// Signature Length & Signature: (VarInt) and Byte Array
Guid playerUuid = handler.GetUserUuid();
byte[] sign;
if (protocolVersion == MC_1_19_Version) // 1.19.1 or lower
sign = playerKeyPair.PrivateKey.SignMessage(message, playerUuid, timeNow, ref salt);
else if (protocolVersion == MC_1_19_2_Version) // 1.19.2
sign = playerKeyPair.PrivateKey.SignMessage(message, playerUuid, timeNow, ref salt, acknowledgment_1_19_2!.lastSeen);
else // protocolVersion >= MC_1_19_3_Version
sign = playerKeyPair.PrivateKey.SignMessage(message, playerUuid, chatUuid, messageIndex++, timeNow, ref salt, acknowledgment_1_19_3);
// Signature Length & Signature: (VarInt) and Byte Array
Guid playerUuid = handler.GetUserUuid();
byte[] sign;
if (protocolVersion == MC_1_19_Version) // 1.19.1 or lower
sign = playerKeyPair.PrivateKey.SignMessage(message, playerUuid, timeNow, ref salt);
else if (protocolVersion == MC_1_19_2_Version) // 1.19.2
sign = playerKeyPair.PrivateKey.SignMessage(message, playerUuid, timeNow, ref salt, acknowledgment_1_19_2!.lastSeen);
else // protocolVersion >= MC_1_19_3_Version
sign = playerKeyPair.PrivateKey.SignMessage(message, playerUuid, chatUuid, messageIndex++, timeNow, ref salt, acknowledgment_1_19_3);
if (protocolVersion >= MC_1_19_3_Version)
fields.AddRange(dataTypes.GetBool(true));
else
fields.AddRange(DataTypes.GetVarInt(sign.Length));
fields.AddRange(sign);
}
if (protocolVersion <= MC_1_19_2_Version)
fields.AddRange(dataTypes.GetBool(false)); // Signed Preview: Boolean
if (protocolVersion >= MC_1_19_3_Version)
fields.AddRange(dataTypes.GetBool(true));
else
fields.AddRange(DataTypes.GetVarInt(sign.Length));
fields.AddRange(sign);
}
{
// message count
fields.AddRange(DataTypes.GetVarInt(messageCount_1_19_3));
if (protocolVersion <= MC_1_19_2_Version)
fields.AddRange(dataTypes.GetBool(false)); // Signed Preview: Boolean
if (protocolVersion >= MC_1_19_3_Version)
{
// message count
fields.AddRange(DataTypes.GetVarInt(messageCount_1_19_3));
// Acknowledged: BitSet
fields.AddRange(bitset_1_19_3);
}
else if (protocolVersion == MC_1_19_2_Version)
{
// Message Acknowledgment
fields.AddRange(dataTypes.GetAcknowledgment(acknowledgment_1_19_2!, isOnlineMode && Config.Signature.LoginWithSecureProfile));
// Acknowledged: BitSet
fields.AddRange(bitset_1_19_3);
}
else if (protocolVersion == MC_1_19_2_Version)
{
// Message Acknowledgment
fields.AddRange(dataTypes.GetAcknowledgment(acknowledgment_1_19_2!, isOnlineMode && Config.Signature.LoginWithSecureProfile));
}
}
}
SendPacket(PacketTypesOut.ChatMessage, fields);