mirror of
https://github.com/MCCTeam/Minecraft-Console-Client
synced 2026-08-15 13:04:36 +00:00
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:
parent
c6b9121a59
commit
d05e3148f1
1 changed files with 53 additions and 25 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue