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, OptionalChat,
Slot, Slot,
Boolean, Boolean,
/// <summary>
/// Float x3
/// </summary>
Rotation, Rotation,
Position, Position,
OptionalPosition, OptionalPosition,
/// <summary>
/// VarInt
/// </summary>
Direction, Direction,
OptionalUuid, OptionalUuid,
/// <summary>
/// VarInt
/// </summary>
BlockId, BlockId,
/// <summary>
/// VarInt (0 for absent)
/// </summary>
OptionalBlockId, OptionalBlockId,
Nbt, Nbt,
Particle, Particle,
/// <summary>
/// VarInt x3
/// </summary>
VillagerData, VillagerData,
OptionalVarInt, OptionalVarInt,
/// <summary>
/// VarInt
/// </summary>
Pose, Pose,
/// <summary>
/// VarInt
/// </summary>
CatVariant, CatVariant,
FrogVariant, FrogVariant,
/// <summary>
/// String + Position
/// </summary>
GlobalPosition, GlobalPosition,
/// <summary>
/// Boolean + String + Position
/// </summary>
OptionalGlobalPosition, OptionalGlobalPosition,
/// <summary>
/// VarInt
/// </summary>
PaintingVariant, PaintingVariant,
/// <summary>
/// VarInt
/// </summary>
SnifferState, SnifferState,
/// <summary>
/// Float x3
/// </summary>
Vector3, Vector3,
/// <summary>
/// Float x4
/// </summary>
Quaternion Quaternion
} }

View file

@ -16,20 +16,16 @@ public abstract class EntityMetadataPalette
public static EntityMetadataPalette GetPalette(int protocolVersion) public static EntityMetadataPalette GetPalette(int protocolVersion)
{ {
if (protocolVersion < Protocol18Handler.MC_1_9_1_Version) if (protocolVersion < Protocol18Handler.MC_1_9_Version)
return new EntityMetadataPalette19(); throw new NotImplementedException();
else if (protocolVersion <= Protocol18Handler.MC_1_11_2_Version) else if (protocolVersion <= Protocol18Handler.MC_1_12_2_Version)
return new EntityMetadataPalette111(); return new EntityMetadataPalette1122(); // 1.9 - 1.12.2
else if (protocolVersion <= Protocol18Handler.MC_1_13_2_Version)
return new EntityMetadataPalette113();
else if (protocolVersion <= Protocol18Handler.MC_1_14_Version)
return new EntityMetadataPalette114();
else if (protocolVersion <= Protocol18Handler.MC_1_19_2_Version) 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) 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) else if (protocolVersion <= Protocol18Handler.MC_1_19_4_Version)
return new EntityMetadataPalette1194(); return new EntityMetadataPalette1194(); // 1.19.4
else else
throw new NotImplementedException(); throw new NotImplementedException();
} }

View file

@ -2,9 +2,9 @@ using System.Collections.Generic;
namespace MinecraftClient.Mapping.EntityMetadataPalettes; 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() private readonly Dictionary<int, EntityMetaDataType> entityMetadataMappings = new()
{ {
{ 0, EntityMetaDataType.Byte }, { 0, EntityMetaDataType.Byte },
@ -19,7 +19,8 @@ public class EntityMetadataPalette111 : EntityMetadataPalette
{ 9, EntityMetaDataType.OptionalPosition }, { 9, EntityMetaDataType.OptionalPosition },
{ 10, EntityMetaDataType.Direction }, { 10, EntityMetaDataType.Direction },
{ 11, EntityMetaDataType.OptionalUuid }, { 11, EntityMetaDataType.OptionalUuid },
{ 12, EntityMetaDataType.OptionalBlockId } { 12, EntityMetaDataType.OptionalBlockId },
{ 13, EntityMetaDataType.Nbt },
}; };
public override Dictionary<int, EntityMetaDataType> GetEntityMetadataMappingsList() 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; namespace MinecraftClient.Mapping.EntityMetadataPalettes;
/// <summary>
/// 1.13 - 1.19.2
/// </summary>
public class EntityMetadataPalette1191 : EntityMetadataPalette public class EntityMetadataPalette1191 : EntityMetadataPalette
{ {
private readonly Dictionary<int, EntityMetaDataType> entityMetadataMappings = new() private readonly Dictionary<int, EntityMetaDataType> entityMetadataMappings = new()
@ -27,7 +30,7 @@ public class EntityMetadataPalette1191 : EntityMetadataPalette
{ 18, EntityMetaDataType.Pose }, { 18, EntityMetaDataType.Pose },
{ 19, EntityMetaDataType.CatVariant }, { 19, EntityMetaDataType.CatVariant },
{ 20, EntityMetaDataType.FrogVariant }, { 20, EntityMetaDataType.FrogVariant },
{ 21, EntityMetaDataType.GlobalPosition }, { 21, EntityMetaDataType.OptionalGlobalPosition },
{ 22, EntityMetaDataType.PaintingVariant } { 22, EntityMetaDataType.PaintingVariant }
}; };

View file

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

View file

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

View file

@ -2,6 +2,7 @@ using System.Collections.Generic;
namespace MinecraftClient.Mapping.EntityMetadataPalettes; namespace MinecraftClient.Mapping.EntityMetadataPalettes;
// TODO: Use this for 1.8
public class EntityMetadataPalette19 : EntityMetadataPalette public class EntityMetadataPalette19 : EntityMetadataPalette
{ {
// 1.8 : https://wiki.vg/index.php?title=Entity_metadata&oldid=6220 (Requires a different algorithm) // 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); value = ReadNextNbt(cache);
break; break;
case EntityMetaDataType.Particle: // Particle case EntityMetaDataType.Particle: // Particle
// Currently not handled. Reading data only // Skip data only, not used
int ParticleID = ReadNextVarInt(cache); ReadParticleData(cache, itemPalette);
// 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;
}
break; break;
case EntityMetaDataType.VillagerData: // Villager Data (3x VarInt) case EntityMetaDataType.VillagerData: // Villager Data (3x VarInt)
value = new List<int> value = new List<int>
@ -766,8 +712,11 @@ namespace MinecraftClient.Protocol.Handlers
value = new Tuple<string, Location>(ReadNextString(cache), ReadNextLocation(cache)); value = new Tuple<string, Location>(ReadNextString(cache), ReadNextLocation(cache));
break; break;
case EntityMetaDataType.OptionalGlobalPosition: case EntityMetaDataType.OptionalGlobalPosition:
// FIXME: wiki.vg is bool + string + location
// but minecraft-data is bool + string
if (ReadNextBool(cache)) if (ReadNextBool(cache))
{ {
// Dimension and blockPos, currently not in use
value = new Tuple<string, Location>(ReadNextString(cache), ReadNextLocation(cache)); value = new Tuple<string, Location>(ReadNextString(cache), ReadNextLocation(cache));
} }
break; break;
@ -799,7 +748,6 @@ namespace MinecraftClient.Protocol.Handlers
data[key] = value; data[key] = value;
key = ReadNextByte(cache); key = ReadNextByte(cache);
} }
ConsoleIO.WriteLine($"Entity MetaData finished {data.Count}");
return data; return data;
} }