DeclareCommand: Fix 1.19.4 crash (#2474)

This commit is contained in:
ReinforceZwei 2023-04-08 21:24:00 +08:00 committed by GitHub
parent 0ff64910f7
commit 09b3ec1a81
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -25,57 +25,58 @@ namespace MinecraftClient.Protocol.Handlers.packet.s2c
string? name = ((flags & 0x03) == 1 || (flags & 0x03) == 2) ? dataTypes.ReadNextString(packetData) : null; string? name = ((flags & 0x03) == 1 || (flags & 0x03) == 2) ? dataTypes.ReadNextString(packetData) : null;
int paserId = ((flags & 0x03) == 2) ? dataTypes.ReadNextVarInt(packetData) : -1; int parserId = ((flags & 0x03) == 2) ? dataTypes.ReadNextVarInt(packetData) : -1;
Paser? paser = null; Parser? parser = null;
if ((flags & 0x03) == 2) if ((flags & 0x03) == 2)
{ {
if (protocolVersion <= Protocol18Handler.MC_1_19_2_Version) if (protocolVersion <= Protocol18Handler.MC_1_19_2_Version)
paser = paserId switch parser = parserId switch
{ {
1 => new PaserFloat(dataTypes, packetData), 1 => new ParserFloat(dataTypes, packetData),
2 => new PaserDouble(dataTypes, packetData), 2 => new ParserDouble(dataTypes, packetData),
3 => new PaserInteger(dataTypes, packetData), 3 => new ParserInteger(dataTypes, packetData),
4 => new PaserLong(dataTypes, packetData), 4 => new ParserLong(dataTypes, packetData),
5 => new PaserString(dataTypes, packetData), 5 => new ParserString(dataTypes, packetData),
6 => new PaserEntity(dataTypes, packetData), 6 => new ParserEntity(dataTypes, packetData),
8 => new PaserBlockPos(dataTypes, packetData), 8 => new ParserBlockPos(dataTypes, packetData),
9 => new PaserColumnPos(dataTypes, packetData), 9 => new ParserColumnPos(dataTypes, packetData),
10 => new PaserVec3(dataTypes, packetData), 10 => new ParserVec3(dataTypes, packetData),
11 => new PaserVec2(dataTypes, packetData), 11 => new ParserVec2(dataTypes, packetData),
18 => new PaserMessage(dataTypes, packetData), 18 => new ParserMessage(dataTypes, packetData),
27 => new PaserRotation(dataTypes, packetData), 27 => new ParserRotation(dataTypes, packetData),
29 => new PaserScoreHolder(dataTypes, packetData), 29 => new ParserScoreHolder(dataTypes, packetData),
43 => new PaserResourceOrTag(dataTypes, packetData), 43 => new ParserResourceOrTag(dataTypes, packetData),
44 => new PaserResource(dataTypes, packetData), 44 => new ParserResource(dataTypes, packetData),
_ => new PaserEmpty(dataTypes, packetData), _ => new ParserEmpty(dataTypes, packetData),
}; };
else // protocolVersion >= MC_1_19_3_Version else // protocolVersion >= MC_1_19_3_Version
paser = paserId switch parser = parserId switch
{ {
1 => new PaserFloat(dataTypes, packetData), 1 => new ParserFloat(dataTypes, packetData),
2 => new PaserDouble(dataTypes, packetData), 2 => new ParserDouble(dataTypes, packetData),
3 => new PaserInteger(dataTypes, packetData), 3 => new ParserInteger(dataTypes, packetData),
4 => new PaserLong(dataTypes, packetData), 4 => new ParserLong(dataTypes, packetData),
5 => new PaserString(dataTypes, packetData), 5 => new ParserString(dataTypes, packetData),
6 => new PaserEntity(dataTypes, packetData), 6 => new ParserEntity(dataTypes, packetData),
8 => new PaserBlockPos(dataTypes, packetData), 8 => new ParserBlockPos(dataTypes, packetData),
9 => new PaserColumnPos(dataTypes, packetData), 9 => new ParserColumnPos(dataTypes, packetData),
10 => new PaserVec3(dataTypes, packetData), 10 => new ParserVec3(dataTypes, packetData),
11 => new PaserVec2(dataTypes, packetData), 11 => new ParserVec2(dataTypes, packetData),
18 => new PaserMessage(dataTypes, packetData), 18 => new ParserMessage(dataTypes, packetData),
27 => new PaserRotation(dataTypes, packetData), 27 => new ParserRotation(dataTypes, packetData),
29 => new PaserScoreHolder(dataTypes, packetData), 29 => new ParserScoreHolder(dataTypes, packetData),
41 => new PaserResourceOrTag(dataTypes, packetData), 40 => new ParserTime(dataTypes, packetData),
42 => new PaserResourceOrTag(dataTypes, packetData), 41 => new ParserResourceOrTag(dataTypes, packetData),
43 => new PaserResource(dataTypes, packetData), 42 => new ParserResourceOrTag(dataTypes, packetData),
44 => new PaserResource(dataTypes, packetData), 43 => new ParserResource(dataTypes, packetData),
_ => new PaserEmpty(dataTypes, packetData), 44 => new ParserResource(dataTypes, packetData),
_ => new ParserEmpty(dataTypes, packetData),
}; };
} }
string? suggestionsType = ((flags & 0x10) == 0x10) ? dataTypes.ReadNextString(packetData) : null; string? suggestionsType = ((flags & 0x10) == 0x10) ? dataTypes.ReadNextString(packetData) : null;
Nodes[i] = new(flags, childs, redirectNode, name, paser, suggestionsType); Nodes[i] = new(flags, childs, redirectNode, name, parser, suggestionsType);
} }
RootIdx = dataTypes.ReadNextVarInt(packetData); RootIdx = dataTypes.ReadNextVarInt(packetData);
@ -149,7 +150,7 @@ namespace MinecraftClient.Protocol.Handlers.packet.s2c
public int[] Clildren; public int[] Clildren;
public int RedirectNode; public int RedirectNode;
public string? Name; public string? Name;
public Paser? Paser; public Parser? Paser;
public string? SuggestionsType; public string? SuggestionsType;
@ -157,7 +158,7 @@ namespace MinecraftClient.Protocol.Handlers.packet.s2c
int[] Clildren, int[] Clildren,
int RedirectNode = -1, int RedirectNode = -1,
string? Name = null, string? Name = null,
Paser? Paser = null, Parser? Paser = null,
string? SuggestionsType = null) string? SuggestionsType = null)
{ {
this.Flags = Flags; this.Flags = Flags;
@ -169,7 +170,7 @@ namespace MinecraftClient.Protocol.Handlers.packet.s2c
} }
} }
internal abstract class Paser internal abstract class Parser
{ {
public abstract string GetName(); public abstract string GetName();
@ -178,10 +179,10 @@ namespace MinecraftClient.Protocol.Handlers.packet.s2c
public abstract bool Check(string text); public abstract bool Check(string text);
} }
internal class PaserEmpty : Paser internal class ParserEmpty : Parser
{ {
public PaserEmpty(DataTypes dataTypes, Queue<byte> packetData) { } public ParserEmpty(DataTypes dataTypes, Queue<byte> packetData) { }
public override bool Check(string text) public override bool Check(string text)
{ {
@ -199,12 +200,12 @@ namespace MinecraftClient.Protocol.Handlers.packet.s2c
} }
} }
internal class PaserFloat : Paser internal class ParserFloat : Parser
{ {
private byte Flags; private byte Flags;
private float Min = float.MinValue, Max = float.MaxValue; private float Min = float.MinValue, Max = float.MaxValue;
public PaserFloat(DataTypes dataTypes, Queue<byte> packetData) public ParserFloat(DataTypes dataTypes, Queue<byte> packetData)
{ {
Flags = dataTypes.ReadNextByte(packetData); Flags = dataTypes.ReadNextByte(packetData);
if ((Flags & 0x01) > 0) if ((Flags & 0x01) > 0)
@ -229,12 +230,12 @@ namespace MinecraftClient.Protocol.Handlers.packet.s2c
} }
} }
internal class PaserDouble : Paser internal class ParserDouble : Parser
{ {
private byte Flags; private byte Flags;
private double Min = double.MinValue, Max = double.MaxValue; private double Min = double.MinValue, Max = double.MaxValue;
public PaserDouble(DataTypes dataTypes, Queue<byte> packetData) public ParserDouble(DataTypes dataTypes, Queue<byte> packetData)
{ {
Flags = dataTypes.ReadNextByte(packetData); Flags = dataTypes.ReadNextByte(packetData);
if ((Flags & 0x01) > 0) if ((Flags & 0x01) > 0)
@ -259,12 +260,12 @@ namespace MinecraftClient.Protocol.Handlers.packet.s2c
} }
} }
internal class PaserInteger : Paser internal class ParserInteger : Parser
{ {
private byte Flags; private byte Flags;
private int Min = int.MinValue, Max = int.MaxValue; private int Min = int.MinValue, Max = int.MaxValue;
public PaserInteger(DataTypes dataTypes, Queue<byte> packetData) public ParserInteger(DataTypes dataTypes, Queue<byte> packetData)
{ {
Flags = dataTypes.ReadNextByte(packetData); Flags = dataTypes.ReadNextByte(packetData);
if ((Flags & 0x01) > 0) if ((Flags & 0x01) > 0)
@ -289,12 +290,12 @@ namespace MinecraftClient.Protocol.Handlers.packet.s2c
} }
} }
internal class PaserLong : Paser internal class ParserLong : Parser
{ {
private byte Flags; private byte Flags;
private long Min = long.MinValue, Max = long.MaxValue; private long Min = long.MinValue, Max = long.MaxValue;
public PaserLong(DataTypes dataTypes, Queue<byte> packetData) public ParserLong(DataTypes dataTypes, Queue<byte> packetData)
{ {
Flags = dataTypes.ReadNextByte(packetData); Flags = dataTypes.ReadNextByte(packetData);
if ((Flags & 0x01) > 0) if ((Flags & 0x01) > 0)
@ -319,13 +320,13 @@ namespace MinecraftClient.Protocol.Handlers.packet.s2c
} }
} }
internal class PaserString : Paser internal class ParserString : Parser
{ {
private StringType Type; private StringType Type;
private enum StringType { SINGLE_WORD, QUOTABLE_PHRASE, GREEDY_PHRASE }; private enum StringType { SINGLE_WORD, QUOTABLE_PHRASE, GREEDY_PHRASE };
public PaserString(DataTypes dataTypes, Queue<byte> packetData) public ParserString(DataTypes dataTypes, Queue<byte> packetData)
{ {
Type = (StringType)dataTypes.ReadNextVarInt(packetData); Type = (StringType)dataTypes.ReadNextVarInt(packetData);
} }
@ -346,11 +347,11 @@ namespace MinecraftClient.Protocol.Handlers.packet.s2c
} }
} }
internal class PaserEntity : Paser internal class ParserEntity : Parser
{ {
private byte Flags; private byte Flags;
public PaserEntity(DataTypes dataTypes, Queue<byte> packetData) public ParserEntity(DataTypes dataTypes, Queue<byte> packetData)
{ {
Flags = dataTypes.ReadNextByte(packetData); Flags = dataTypes.ReadNextByte(packetData);
} }
@ -371,10 +372,10 @@ namespace MinecraftClient.Protocol.Handlers.packet.s2c
} }
} }
internal class PaserBlockPos : Paser internal class ParserBlockPos : Parser
{ {
public PaserBlockPos(DataTypes dataTypes, Queue<byte> packetData) { } public ParserBlockPos(DataTypes dataTypes, Queue<byte> packetData) { }
public override bool Check(string text) public override bool Check(string text)
{ {
@ -392,10 +393,10 @@ namespace MinecraftClient.Protocol.Handlers.packet.s2c
} }
} }
internal class PaserColumnPos : Paser internal class ParserColumnPos : Parser
{ {
public PaserColumnPos(DataTypes dataTypes, Queue<byte> packetData) { } public ParserColumnPos(DataTypes dataTypes, Queue<byte> packetData) { }
public override bool Check(string text) public override bool Check(string text)
{ {
@ -413,10 +414,10 @@ namespace MinecraftClient.Protocol.Handlers.packet.s2c
} }
} }
internal class PaserVec3 : Paser internal class ParserVec3 : Parser
{ {
public PaserVec3(DataTypes dataTypes, Queue<byte> packetData) { } public ParserVec3(DataTypes dataTypes, Queue<byte> packetData) { }
public override bool Check(string text) public override bool Check(string text)
{ {
@ -434,10 +435,10 @@ namespace MinecraftClient.Protocol.Handlers.packet.s2c
} }
} }
internal class PaserVec2 : Paser internal class ParserVec2 : Parser
{ {
public PaserVec2(DataTypes dataTypes, Queue<byte> packetData) { } public ParserVec2(DataTypes dataTypes, Queue<byte> packetData) { }
public override bool Check(string text) public override bool Check(string text)
{ {
@ -455,10 +456,10 @@ namespace MinecraftClient.Protocol.Handlers.packet.s2c
} }
} }
internal class PaserRotation : Paser internal class ParserRotation : Parser
{ {
public PaserRotation(DataTypes dataTypes, Queue<byte> packetData) { } public ParserRotation(DataTypes dataTypes, Queue<byte> packetData) { }
public override bool Check(string text) public override bool Check(string text)
{ {
@ -476,9 +477,9 @@ namespace MinecraftClient.Protocol.Handlers.packet.s2c
} }
} }
internal class PaserMessage : Paser internal class ParserMessage : Parser
{ {
public PaserMessage(DataTypes dataTypes, Queue<byte> packetData) { } public ParserMessage(DataTypes dataTypes, Queue<byte> packetData) { }
public override bool Check(string text) public override bool Check(string text)
{ {
@ -496,11 +497,11 @@ namespace MinecraftClient.Protocol.Handlers.packet.s2c
} }
} }
internal class PaserScoreHolder : Paser internal class ParserScoreHolder : Parser
{ {
private byte Flags; private byte Flags;
public PaserScoreHolder(DataTypes dataTypes, Queue<byte> packetData) public ParserScoreHolder(DataTypes dataTypes, Queue<byte> packetData)
{ {
Flags = dataTypes.ReadNextByte(packetData); Flags = dataTypes.ReadNextByte(packetData);
} }
@ -521,11 +522,11 @@ namespace MinecraftClient.Protocol.Handlers.packet.s2c
} }
} }
internal class PaserRange : Paser internal class ParserRange : Parser
{ {
private bool Decimals; private bool Decimals;
public PaserRange(DataTypes dataTypes, Queue<byte> packetData) public ParserRange(DataTypes dataTypes, Queue<byte> packetData)
{ {
Decimals = dataTypes.ReadNextBool(packetData); Decimals = dataTypes.ReadNextBool(packetData);
} }
@ -546,11 +547,11 @@ namespace MinecraftClient.Protocol.Handlers.packet.s2c
} }
} }
internal class PaserResourceOrTag : Paser internal class ParserResourceOrTag : Parser
{ {
private string Registry; private string Registry;
public PaserResourceOrTag(DataTypes dataTypes, Queue<byte> packetData) public ParserResourceOrTag(DataTypes dataTypes, Queue<byte> packetData)
{ {
Registry = dataTypes.ReadNextString(packetData); Registry = dataTypes.ReadNextString(packetData);
} }
@ -571,11 +572,11 @@ namespace MinecraftClient.Protocol.Handlers.packet.s2c
} }
} }
internal class PaserResource : Paser internal class ParserResource : Parser
{ {
private string Registry; private string Registry;
public PaserResource(DataTypes dataTypes, Queue<byte> packetData) public ParserResource(DataTypes dataTypes, Queue<byte> packetData)
{ {
Registry = dataTypes.ReadNextString(packetData); Registry = dataTypes.ReadNextString(packetData);
} }
@ -595,5 +596,31 @@ namespace MinecraftClient.Protocol.Handlers.packet.s2c
return "minecraft:resource"; return "minecraft:resource";
} }
} }
/// <summary>
/// Undocumented parser type for 1.19.4+
/// </summary>
internal class ParserTime : Parser
{
public ParserTime(DataTypes dataTypes, Queue<byte> packetData)
{
dataTypes.ReadNextInt(packetData);
}
public override bool Check(string text)
{
return true;
}
public override int GetArgCnt()
{
return 1;
}
public override string GetName()
{
return "minecraft:time";
}
}
} }
} }