Clean up entity metadata palette

This commit is contained in:
ReinforceZwei 2023-03-24 20:51:10 +08:00
parent c36dec435d
commit 750295b1e3
10 changed files with 67 additions and 139 deletions

View file

@ -11,24 +11,63 @@ public enum EntityMetaDataType
OptionalChat,
Slot,
Boolean,
/// <summary>
/// Float x3
/// </summary>
Rotation,
Position,
OptionalPosition,
/// <summary>
/// VarInt
/// </summary>
Direction,
OptionalUuid,
/// <summary>
/// VarInt
/// </summary>
BlockId,
/// <summary>
/// VarInt (0 for absent)
/// </summary>
OptionalBlockId,
Nbt,
Particle,
/// <summary>
/// VarInt x3
/// </summary>
VillagerData,
OptionalVarInt,
/// <summary>
/// VarInt
/// </summary>
Pose,
/// <summary>
/// VarInt
/// </summary>
CatVariant,
FrogVariant,
/// <summary>
/// String + Position
/// </summary>
GlobalPosition,
/// <summary>
/// Boolean + String + Position
/// </summary>
OptionalGlobalPosition,
/// <summary>
/// VarInt
/// </summary>
PaintingVariant,
/// <summary>
/// VarInt
/// </summary>
SnifferState,
/// <summary>
/// Float x3
/// </summary>
Vector3,
/// <summary>
/// Float x4
/// </summary>
Quaternion
}

View file

@ -16,20 +16,16 @@ public abstract class EntityMetadataPalette
public static EntityMetadataPalette GetPalette(int protocolVersion)
{
if (protocolVersion < Protocol18Handler.MC_1_9_1_Version)
return new EntityMetadataPalette19();
else if (protocolVersion <= Protocol18Handler.MC_1_11_2_Version)
return new EntityMetadataPalette111();
else if (protocolVersion <= Protocol18Handler.MC_1_13_2_Version)
return new EntityMetadataPalette113();
else if (protocolVersion <= Protocol18Handler.MC_1_14_Version)
return new EntityMetadataPalette114();
if (protocolVersion < Protocol18Handler.MC_1_9_Version)
throw new NotImplementedException();
else if (protocolVersion <= Protocol18Handler.MC_1_12_2_Version)
return new EntityMetadataPalette1122(); // 1.9 - 1.12.2
else if (protocolVersion <= Protocol18Handler.MC_1_19_2_Version)
return new EntityMetadataPalette1191();
return new EntityMetadataPalette1191(); // 1.13 - 1.19.2
else if (protocolVersion <= Protocol18Handler.MC_1_19_3_Version)
return new EntityMetadataPalette1193();
return new EntityMetadataPalette1193(); // 1.19.3
else if (protocolVersion <= Protocol18Handler.MC_1_19_4_Version)
return new EntityMetadataPalette1194();
return new EntityMetadataPalette1194(); // 1.19.4
else
throw new NotImplementedException();
}

View file

@ -2,9 +2,9 @@ using System.Collections.Generic;
namespace MinecraftClient.Mapping.EntityMetadataPalettes;
public class EntityMetadataPalette111 : EntityMetadataPalette
public class EntityMetadataPalette1122 : EntityMetadataPalette
{
// 1.11 : https://wiki.vg/index.php?title=Entity_metadata&oldid=8269
// 1.9 - 1.12.2
private readonly Dictionary<int, EntityMetaDataType> entityMetadataMappings = new()
{
{ 0, EntityMetaDataType.Byte },
@ -19,7 +19,8 @@ public class EntityMetadataPalette111 : EntityMetadataPalette
{ 9, EntityMetaDataType.OptionalPosition },
{ 10, EntityMetaDataType.Direction },
{ 11, EntityMetaDataType.OptionalUuid },
{ 12, EntityMetaDataType.OptionalBlockId }
{ 12, EntityMetaDataType.OptionalBlockId },
{ 13, EntityMetaDataType.Nbt },
};
public override Dictionary<int, EntityMetaDataType> GetEntityMetadataMappingsList()

View file

@ -1,32 +0,0 @@
using System.Collections.Generic;
namespace MinecraftClient.Mapping.EntityMetadataPalettes;
public class EntityMetadataPalette113 : EntityMetadataPalette
{
// 1.13 : https://wiki.vg/index.php?title=Entity_metadata&oldid=14539
private readonly Dictionary<int, EntityMetaDataType> entityMetadataMappings = new()
{
{ 0, EntityMetaDataType.Byte },
{ 1, EntityMetaDataType.VarInt },
{ 2, EntityMetaDataType.Float },
{ 3, EntityMetaDataType.String },
{ 4, EntityMetaDataType.Chat },
{ 5, EntityMetaDataType.OptionalChat },
{ 6, EntityMetaDataType.Slot },
{ 7, EntityMetaDataType.Boolean },
{ 8, EntityMetaDataType.Rotation },
{ 9, EntityMetaDataType.Position },
{ 10, EntityMetaDataType.OptionalPosition },
{ 11, EntityMetaDataType.Direction },
{ 12, EntityMetaDataType.OptionalUuid },
{ 13, EntityMetaDataType.OptionalBlockId },
{ 14, EntityMetaDataType.Nbt },
{ 15, EntityMetaDataType.Particle }
};
public override Dictionary<int, EntityMetaDataType> GetEntityMetadataMappingsList()
{
return entityMetadataMappings;
}
}

View file

@ -1,34 +0,0 @@
using System.Collections.Generic;
namespace MinecraftClient.Mapping.EntityMetadataPalettes;
public class EntityMetadataPalette114 : EntityMetadataPalette
{
private readonly Dictionary<int, EntityMetaDataType> entityMetadataMappings = new()
{
{ 0, EntityMetaDataType.Byte },
{ 1, EntityMetaDataType.VarInt },
{ 2, EntityMetaDataType.Float },
{ 3, EntityMetaDataType.String },
{ 4, EntityMetaDataType.Chat },
{ 5, EntityMetaDataType.OptionalChat },
{ 6, EntityMetaDataType.Slot },
{ 7, EntityMetaDataType.Boolean },
{ 8, EntityMetaDataType.Rotation },
{ 9, EntityMetaDataType.Position },
{ 10, EntityMetaDataType.OptionalPosition },
{ 11, EntityMetaDataType.Direction },
{ 12, EntityMetaDataType.OptionalUuid },
{ 13, EntityMetaDataType.OptionalBlockId },
{ 14, EntityMetaDataType.Nbt },
{ 15, EntityMetaDataType.Particle },
{ 16, EntityMetaDataType.VillagerData },
{ 17, EntityMetaDataType.OptionalVarInt },
{ 18, EntityMetaDataType.Pose }
};
public override Dictionary<int, EntityMetaDataType> GetEntityMetadataMappingsList()
{
return entityMetadataMappings;
}
}

View file

@ -2,6 +2,9 @@ using System.Collections.Generic;
namespace MinecraftClient.Mapping.EntityMetadataPalettes;
/// <summary>
/// 1.13 - 1.19.2
/// </summary>
public class EntityMetadataPalette1191 : EntityMetadataPalette
{
private readonly Dictionary<int, EntityMetaDataType> entityMetadataMappings = new()
@ -27,7 +30,7 @@ public class EntityMetadataPalette1191 : EntityMetadataPalette
{ 18, EntityMetaDataType.Pose },
{ 19, EntityMetaDataType.CatVariant },
{ 20, EntityMetaDataType.FrogVariant },
{ 21, EntityMetaDataType.GlobalPosition },
{ 21, EntityMetaDataType.OptionalGlobalPosition },
{ 22, EntityMetaDataType.PaintingVariant }
};

View file

@ -2,6 +2,9 @@ using System.Collections.Generic;
namespace MinecraftClient.Mapping.EntityMetadataPalettes;
/// <summary>
/// For 1.19.3
/// </summary>
public class EntityMetadataPalette1193 : EntityMetadataPalette
{
private readonly Dictionary<int, EntityMetaDataType> entityMetadataMappings = new()
@ -28,7 +31,7 @@ public class EntityMetadataPalette1193 : EntityMetadataPalette
{ 19, EntityMetaDataType.Pose },
{ 20, EntityMetaDataType.CatVariant },
{ 21, EntityMetaDataType.FrogVariant },
{ 22, EntityMetaDataType.GlobalPosition },
{ 22, EntityMetaDataType.OptionalGlobalPosition },
{ 23, EntityMetaDataType.PaintingVariant }
};

View file

@ -2,6 +2,9 @@ using System.Collections.Generic;
namespace MinecraftClient.Mapping.EntityMetadataPalettes;
/// <summary>
/// For 1.19.4
/// </summary>
public class EntityMetadataPalette1194 : EntityMetadataPalette
{
private readonly Dictionary<int, EntityMetaDataType> entityMetadataMappings = new()

View file

@ -2,6 +2,7 @@ using System.Collections.Generic;
namespace MinecraftClient.Mapping.EntityMetadataPalettes;
// TODO: Use this for 1.8
public class EntityMetadataPalette19 : EntityMetadataPalette
{
// 1.8 : https://wiki.vg/index.php?title=Entity_metadata&oldid=6220 (Requires a different algorithm)

View file

@ -681,62 +681,8 @@ namespace MinecraftClient.Protocol.Handlers
value = ReadNextNbt(cache);
break;
case EntityMetaDataType.Particle: // Particle
// Currently not handled. Reading data only
int ParticleID = ReadNextVarInt(cache);
// TODO: Go through wiki history and write for every version
// 1.19.3 - https://wiki.vg/index.php?title=Data_types&oldid=17986
// 1.18 - https://wiki.vg/index.php?title=Data_types&oldid=17180
// 1.17 - https://wiki.vg/index.php?title=Data_types&oldid=16740
// 1.15 - https://wiki.vg/index.php?title=Data_types&oldid=15338
// 1.13 - https://wiki.vg/index.php?title=Data_types&oldid=14271
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 25:
ReadNextVarInt(cache);
break;
case 30:
ReadNextFloat(cache);
break;
case 39:
ReadNextItemSlot(cache, itemPalette);
break;
case 40:
string positionSourceType = ReadNextString(cache);
if (positionSourceType == "minecraft:block")
{
ReadNextLocation(cache);
}
else if (positionSourceType == "minecraft:entity")
{
ReadNextVarInt(cache);
ReadNextFloat(cache);
}
ReadNextVarInt(cache);
break;
}
// Skip data only, not used
ReadParticleData(cache, itemPalette);
break;
case EntityMetaDataType.VillagerData: // Villager Data (3x VarInt)
value = new List<int>
@ -766,8 +712,11 @@ namespace MinecraftClient.Protocol.Handlers
value = new Tuple<string, Location>(ReadNextString(cache), ReadNextLocation(cache));
break;
case EntityMetaDataType.OptionalGlobalPosition:
// FIXME: wiki.vg is bool + string + location
// but minecraft-data is bool + string
if (ReadNextBool(cache))
{
// Dimension and blockPos, currently not in use
value = new Tuple<string, Location>(ReadNextString(cache), ReadNextLocation(cache));
}
break;
@ -799,7 +748,6 @@ namespace MinecraftClient.Protocol.Handlers
data[key] = value;
key = ReadNextByte(cache);
}
ConsoleIO.WriteLine($"Entity MetaData finished {data.Count}");
return data;
}