Refactor explosion packet handling for protocol version updates

- Updated explosion packet processing to accommodate changes in Minecraft protocol versions, specifically for versions 1.21.2 and 1.20.4.
- Removed obsolete fields such as explosion strength and block records for newer versions, and added support for optional knockback and particle data.
- Enhanced backward compatibility for earlier versions by maintaining existing logic for explosion data retrieval.
This commit is contained in:
BruceChen 2026-03-29 22:38:39 +08:00
parent c6b9121a59
commit d05e3148f1

View file

@ -2822,43 +2822,71 @@ namespace MinecraftClient.Protocol.Handlers
break;
case PacketTypesIn.Explosion:
Location explosionLocation;
if (protocolVersion >= MC_1_19_3_Version)
float explosionStrength;
int explosionBlockCount;
if (protocolVersion >= MC_1_21_2_Version)
{
// 1.21.2+: removed strength, block records, and player motion floats;
// added optional knockback (doubles) and single particle
explosionLocation = new(dataTypes.ReadNextDouble(packetData),
dataTypes.ReadNextDouble(packetData), dataTypes.ReadNextDouble(packetData));
else
explosionLocation = new(dataTypes.ReadNextFloat(packetData),
dataTypes.ReadNextFloat(packetData), dataTypes.ReadNextFloat(packetData));
explosionStrength = 0;
explosionBlockCount = 0;
var explosionStrength = dataTypes.ReadNextFloat(packetData);
var explosionBlockCount = protocolVersion >= MC_1_17_Version
? dataTypes.ReadNextVarInt(packetData)
: dataTypes.ReadNextInt(packetData); // Record count
if (dataTypes.ReadNextBool(packetData)) // Has player knockback
{
dataTypes.ReadNextDouble(packetData); // Knockback X
dataTypes.ReadNextDouble(packetData); // Knockback Y
dataTypes.ReadNextDouble(packetData); // Knockback Z
}
// Records
for (var i = 0; i < explosionBlockCount; i++)
dataTypes.ReadNextByteArray(packetData, 3);
dataTypes.ReadParticleData(packetData, itemPalette); // Explosion particle
dataTypes.ReadNextFloat(packetData); // Player Motion X
dataTypes.ReadNextFloat(packetData); // Player Motion Y
dataTypes.ReadNextFloat(packetData); // Player Motion Z
if (protocolVersion >= MC_1_20_4_Version)
{
dataTypes.ReadNextVarInt(packetData); // Block Interaction (enum ordinal)
dataTypes.ReadParticleData(packetData, itemPalette); // Small Explosion Particles
dataTypes.ReadParticleData(packetData, itemPalette); // Large Explosion Particles
// Explosion Sound: Holder<SoundEvent> via ByteBufCodecs.holder()
// VarInt id: 0 = inline (read DIRECT_STREAM_CODEC), >0 = registry ref (id-1)
var soundHolderId = dataTypes.ReadNextVarInt(packetData);
if (soundHolderId == 0)
{
dataTypes.ReadNextString(packetData); // Sound ResourceLocation
var hasFixedRange = dataTypes.ReadNextBool(packetData);
if (hasFixedRange)
if (dataTypes.ReadNextBool(packetData))
dataTypes.ReadNextFloat(packetData); // Fixed range
}
}
else
{
if (protocolVersion >= MC_1_19_3_Version)
explosionLocation = new(dataTypes.ReadNextDouble(packetData),
dataTypes.ReadNextDouble(packetData), dataTypes.ReadNextDouble(packetData));
else
explosionLocation = new(dataTypes.ReadNextFloat(packetData),
dataTypes.ReadNextFloat(packetData), dataTypes.ReadNextFloat(packetData));
explosionStrength = dataTypes.ReadNextFloat(packetData);
explosionBlockCount = protocolVersion >= MC_1_17_Version
? dataTypes.ReadNextVarInt(packetData)
: dataTypes.ReadNextInt(packetData);
for (var i = 0; i < explosionBlockCount; i++)
dataTypes.ReadNextByteArray(packetData, 3);
dataTypes.ReadNextFloat(packetData); // Player Motion X
dataTypes.ReadNextFloat(packetData); // Player Motion Y
dataTypes.ReadNextFloat(packetData); // Player Motion Z
if (protocolVersion >= MC_1_20_4_Version)
{
dataTypes.ReadNextVarInt(packetData); // Block Interaction
dataTypes.ReadParticleData(packetData, itemPalette); // Small Explosion Particles
dataTypes.ReadParticleData(packetData, itemPalette); // Large Explosion Particles
var soundHolderId = dataTypes.ReadNextVarInt(packetData);
if (soundHolderId == 0)
{
dataTypes.ReadNextString(packetData); // Sound ResourceLocation
if (dataTypes.ReadNextBool(packetData))
dataTypes.ReadNextFloat(packetData); // Fixed range
}
}
}
handler.OnExplosion(explosionLocation, explosionStrength, explosionBlockCount);
break;