mirror of
https://github.com/MCCTeam/Minecraft-Console-Client
synced 2025-11-07 17:36:07 +00:00
Implement entity metadata protocol handling
This commit is contained in:
parent
c3ace103c6
commit
44270ab394
6 changed files with 154 additions and 1 deletions
|
|
@ -2111,6 +2111,16 @@ namespace MinecraftClient
|
||||||
{
|
{
|
||||||
DispatchBotEvent(bot => bot.OnUpdateScore(entityname, action, objectivename, value));
|
DispatchBotEvent(bot => bot.OnUpdateScore(entityname, action, objectivename, value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Called when entity metadata added/updated
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="entityID">Target entity's ID</param>
|
||||||
|
/// <param name="metadata">Metadata</param>
|
||||||
|
public void OnEntityMetadata(int entityID, Dictionary<int, object> metadata)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -494,6 +494,126 @@ namespace MinecraftClient.Protocol.Handlers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Dictionary<int, object> ReadNextMetadata(Queue<byte> cache)
|
||||||
|
{
|
||||||
|
Dictionary<int, object> data = new Dictionary<int, object>();
|
||||||
|
byte Key = ReadNextByte(cache);
|
||||||
|
while (Key != 0xff)
|
||||||
|
{
|
||||||
|
int Type = ReadNextVarInt(cache);
|
||||||
|
// Value's data type is depended on Type
|
||||||
|
object Value = null;
|
||||||
|
|
||||||
|
// We need to go through every data in order to get all fields in the packet
|
||||||
|
// Store the value as needed
|
||||||
|
switch (Type)
|
||||||
|
{
|
||||||
|
case 0: // byte
|
||||||
|
Value = ReadNextByte(cache);
|
||||||
|
break;
|
||||||
|
case 1: // VarInt
|
||||||
|
Value = ReadNextVarInt(cache);
|
||||||
|
break;
|
||||||
|
case 2: // Float
|
||||||
|
Value = ReadNextFloat(cache);
|
||||||
|
break;
|
||||||
|
case 3: // String
|
||||||
|
Value = ReadNextString(cache);
|
||||||
|
break;
|
||||||
|
case 4: // Chat
|
||||||
|
Value = ReadNextString(cache);
|
||||||
|
break;
|
||||||
|
case 5: // Optional Chat
|
||||||
|
if (ReadNextBool(cache))
|
||||||
|
{
|
||||||
|
Value = ReadNextString(cache);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 6: // Slot
|
||||||
|
Value = ReadNextItemSlot(cache);
|
||||||
|
break;
|
||||||
|
case 7: // Boolean
|
||||||
|
Value = ReadNextBool(cache);
|
||||||
|
break;
|
||||||
|
case 8: // Rotation (3x floats)
|
||||||
|
List<float> t = new List<float>();
|
||||||
|
t.Add(ReadNextFloat(cache));
|
||||||
|
t.Add(ReadNextFloat(cache));
|
||||||
|
t.Add(ReadNextFloat(cache));
|
||||||
|
Value = t;
|
||||||
|
break;
|
||||||
|
case 9: // Position
|
||||||
|
Value = ReadNextLocation(cache);
|
||||||
|
break;
|
||||||
|
case 10: // Optional Position
|
||||||
|
if (ReadNextBool(cache))
|
||||||
|
{
|
||||||
|
Value = ReadNextLocation(cache);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 11: // Direction (VarInt)
|
||||||
|
Value = ReadNextVarInt(cache);
|
||||||
|
break;
|
||||||
|
case 12: // Optional UUID
|
||||||
|
if (ReadNextBool(cache))
|
||||||
|
{
|
||||||
|
Value = ReadNextUUID(cache);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 13: // Optional BlockID (VarInt)
|
||||||
|
if (ReadNextBool(cache))
|
||||||
|
{
|
||||||
|
Value = ReadNextVarInt(cache);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 14: // NBT
|
||||||
|
Value = ReadNextNbt(cache);
|
||||||
|
break;
|
||||||
|
case 15: // Particle
|
||||||
|
// Currecutly not handled. Reading data only
|
||||||
|
int ParticleID = ReadNextVarInt(cache);
|
||||||
|
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);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 16: // Villager Data (3x VarInt)
|
||||||
|
List<int> d = new List<int>();
|
||||||
|
d.Add(ReadNextVarInt(cache));
|
||||||
|
d.Add(ReadNextVarInt(cache));
|
||||||
|
d.Add(ReadNextVarInt(cache));
|
||||||
|
Value = d;
|
||||||
|
break;
|
||||||
|
case 17: // Optional VarInt
|
||||||
|
if (ReadNextBool(cache))
|
||||||
|
{
|
||||||
|
Value = ReadNextVarInt(cache);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 18: // Pose
|
||||||
|
Value = ReadNextVarInt(cache);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
data.Add(Key, Value);
|
||||||
|
Key = ReadNextByte(cache);
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Build an uncompressed Named Binary Tag blob for sending over the network
|
/// Build an uncompressed Named Binary Tag blob for sending over the network
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,7 @@ namespace MinecraftClient.Protocol.Handlers
|
||||||
EntityEquipment,
|
EntityEquipment,
|
||||||
EntityVelocity,
|
EntityVelocity,
|
||||||
EntityEffect,
|
EntityEffect,
|
||||||
|
EntityMetadata,
|
||||||
TimeUpdate,
|
TimeUpdate,
|
||||||
UpdateHealth,
|
UpdateHealth,
|
||||||
SetExperience,
|
SetExperience,
|
||||||
|
|
|
||||||
|
|
@ -861,6 +861,14 @@ namespace MinecraftClient.Protocol.Handlers
|
||||||
handler.OnEntityProperties(EntityID, keys);
|
handler.OnEntityProperties(EntityID, keys);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case PacketIncomingType.EntityMetadata:
|
||||||
|
if (handler.GetEntityHandlingEnabled())
|
||||||
|
{
|
||||||
|
int EntityID = dataTypes.ReadNextVarInt(packetData);
|
||||||
|
Dictionary<int, object> metadata = dataTypes.ReadNextMetadata(packetData);
|
||||||
|
handler.OnEntityMetadata(EntityID, metadata);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case PacketIncomingType.TimeUpdate:
|
case PacketIncomingType.TimeUpdate:
|
||||||
long WorldAge = dataTypes.ReadNextLong(packetData);
|
long WorldAge = dataTypes.ReadNextLong(packetData);
|
||||||
long TimeOfday = dataTypes.ReadNextLong(packetData);
|
long TimeOfday = dataTypes.ReadNextLong(packetData);
|
||||||
|
|
|
||||||
|
|
@ -109,6 +109,7 @@ namespace MinecraftClient.Protocol.Handlers
|
||||||
case 0x3B: return PacketIncomingType.EntityVelocity;
|
case 0x3B: return PacketIncomingType.EntityVelocity;
|
||||||
case 0x3C: return PacketIncomingType.EntityEquipment;
|
case 0x3C: return PacketIncomingType.EntityEquipment;
|
||||||
case 0x4B: return PacketIncomingType.EntityEffect;
|
case 0x4B: return PacketIncomingType.EntityEffect;
|
||||||
|
case 0x39: return PacketIncomingType.EntityMetadata;
|
||||||
case 0x44: return PacketIncomingType.TimeUpdate;
|
case 0x44: return PacketIncomingType.TimeUpdate;
|
||||||
case 0x3E: return PacketIncomingType.UpdateHealth;
|
case 0x3E: return PacketIncomingType.UpdateHealth;
|
||||||
case 0x3D: return PacketIncomingType.SetExperience;
|
case 0x3D: return PacketIncomingType.SetExperience;
|
||||||
|
|
@ -157,6 +158,7 @@ namespace MinecraftClient.Protocol.Handlers
|
||||||
case 0x3D: return PacketIncomingType.EntityVelocity;
|
case 0x3D: return PacketIncomingType.EntityVelocity;
|
||||||
case 0x3E: return PacketIncomingType.EntityEquipment;
|
case 0x3E: return PacketIncomingType.EntityEquipment;
|
||||||
case 0x4E: return PacketIncomingType.EntityEffect;
|
case 0x4E: return PacketIncomingType.EntityEffect;
|
||||||
|
case 0x3B: return PacketIncomingType.EntityMetadata;
|
||||||
case 0x46: return PacketIncomingType.TimeUpdate;
|
case 0x46: return PacketIncomingType.TimeUpdate;
|
||||||
case 0x40: return PacketIncomingType.UpdateHealth;
|
case 0x40: return PacketIncomingType.UpdateHealth;
|
||||||
case 0x3F: return PacketIncomingType.SetExperience;
|
case 0x3F: return PacketIncomingType.SetExperience;
|
||||||
|
|
@ -205,6 +207,7 @@ namespace MinecraftClient.Protocol.Handlers
|
||||||
case 0x3E: return PacketIncomingType.EntityVelocity;
|
case 0x3E: return PacketIncomingType.EntityVelocity;
|
||||||
case 0x3F: return PacketIncomingType.EntityEquipment;
|
case 0x3F: return PacketIncomingType.EntityEquipment;
|
||||||
case 0x4F: return PacketIncomingType.EntityEffect;
|
case 0x4F: return PacketIncomingType.EntityEffect;
|
||||||
|
case 0x3C: return PacketIncomingType.EntityMetadata;
|
||||||
case 0x47: return PacketIncomingType.TimeUpdate;
|
case 0x47: return PacketIncomingType.TimeUpdate;
|
||||||
case 0x41: return PacketIncomingType.UpdateHealth;
|
case 0x41: return PacketIncomingType.UpdateHealth;
|
||||||
case 0x40: return PacketIncomingType.SetExperience;
|
case 0x40: return PacketIncomingType.SetExperience;
|
||||||
|
|
@ -253,6 +256,7 @@ namespace MinecraftClient.Protocol.Handlers
|
||||||
case 0x41: return PacketIncomingType.EntityVelocity;
|
case 0x41: return PacketIncomingType.EntityVelocity;
|
||||||
case 0x42: return PacketIncomingType.EntityEquipment;
|
case 0x42: return PacketIncomingType.EntityEquipment;
|
||||||
case 0x53: return PacketIncomingType.EntityEffect;
|
case 0x53: return PacketIncomingType.EntityEffect;
|
||||||
|
case 0x3F: return PacketIncomingType.EntityMetadata;
|
||||||
case 0x4A: return PacketIncomingType.TimeUpdate;
|
case 0x4A: return PacketIncomingType.TimeUpdate;
|
||||||
case 0x44: return PacketIncomingType.UpdateHealth;
|
case 0x44: return PacketIncomingType.UpdateHealth;
|
||||||
case 0x43: return PacketIncomingType.SetExperience;
|
case 0x43: return PacketIncomingType.SetExperience;
|
||||||
|
|
@ -301,6 +305,7 @@ namespace MinecraftClient.Protocol.Handlers
|
||||||
case 0x41: return PacketIncomingType.EntityVelocity;
|
case 0x41: return PacketIncomingType.EntityVelocity;
|
||||||
case 0x46: return PacketIncomingType.EntityEquipment;
|
case 0x46: return PacketIncomingType.EntityEquipment;
|
||||||
case 0x59: return PacketIncomingType.EntityEffect;
|
case 0x59: return PacketIncomingType.EntityEffect;
|
||||||
|
case 0x43: return PacketIncomingType.EntityMetadata;
|
||||||
case 0x4E: return PacketIncomingType.TimeUpdate;
|
case 0x4E: return PacketIncomingType.TimeUpdate;
|
||||||
case 0x48: return PacketIncomingType.UpdateHealth;
|
case 0x48: return PacketIncomingType.UpdateHealth;
|
||||||
case 0x47: return PacketIncomingType.SetExperience;
|
case 0x47: return PacketIncomingType.SetExperience;
|
||||||
|
|
@ -349,6 +354,7 @@ namespace MinecraftClient.Protocol.Handlers
|
||||||
case 0x46: return PacketIncomingType.EntityVelocity;
|
case 0x46: return PacketIncomingType.EntityVelocity;
|
||||||
case 0x47: return PacketIncomingType.EntityEquipment;
|
case 0x47: return PacketIncomingType.EntityEquipment;
|
||||||
case 0x5A: return PacketIncomingType.EntityEffect;
|
case 0x5A: return PacketIncomingType.EntityEffect;
|
||||||
|
case 0x44: return PacketIncomingType.EntityMetadata;
|
||||||
case 0x4F: return PacketIncomingType.TimeUpdate;
|
case 0x4F: return PacketIncomingType.TimeUpdate;
|
||||||
case 0x49: return PacketIncomingType.UpdateHealth;
|
case 0x49: return PacketIncomingType.UpdateHealth;
|
||||||
case 0x48: return PacketIncomingType.SetExperience;
|
case 0x48: return PacketIncomingType.SetExperience;
|
||||||
|
|
@ -361,7 +367,7 @@ namespace MinecraftClient.Protocol.Handlers
|
||||||
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
switch (packetID)
|
switch (packetID) // MC 1.16+
|
||||||
{
|
{
|
||||||
case 0x20: return PacketIncomingType.KeepAlive;
|
case 0x20: return PacketIncomingType.KeepAlive;
|
||||||
case 0x25: return PacketIncomingType.JoinGame;
|
case 0x25: return PacketIncomingType.JoinGame;
|
||||||
|
|
@ -396,6 +402,7 @@ namespace MinecraftClient.Protocol.Handlers
|
||||||
case 0x46: return PacketIncomingType.EntityVelocity;
|
case 0x46: return PacketIncomingType.EntityVelocity;
|
||||||
case 0x47: return PacketIncomingType.EntityEquipment;
|
case 0x47: return PacketIncomingType.EntityEquipment;
|
||||||
case 0x59: return PacketIncomingType.EntityEffect;
|
case 0x59: return PacketIncomingType.EntityEffect;
|
||||||
|
case 0x44: return PacketIncomingType.EntityMetadata;
|
||||||
case 0x4E: return PacketIncomingType.TimeUpdate;
|
case 0x4E: return PacketIncomingType.TimeUpdate;
|
||||||
case 0x49: return PacketIncomingType.UpdateHealth;
|
case 0x49: return PacketIncomingType.UpdateHealth;
|
||||||
case 0x48: return PacketIncomingType.SetExperience;
|
case 0x48: return PacketIncomingType.SetExperience;
|
||||||
|
|
|
||||||
|
|
@ -192,6 +192,13 @@ namespace MinecraftClient.Protocol
|
||||||
/// <param name="prop">Dictionary of properties</param>
|
/// <param name="prop">Dictionary of properties</param>
|
||||||
void OnEntityProperties(int entityID, Dictionary<string, Double> prop);
|
void OnEntityProperties(int entityID, Dictionary<string, Double> prop);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Called when entity metadata added/updated
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="entityID">Target entity's ID</param>
|
||||||
|
/// <param name="metadata">Metadata</param>
|
||||||
|
void OnEntityMetadata(int entityID, Dictionary<int, object> metadata);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Called when the world age has been updated
|
/// Called when the world age has been updated
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue