fix(net): Phase L.1c conform combat wire events
This commit is contained in:
parent
460f95cb42
commit
29afc94b94
8 changed files with 241 additions and 177 deletions
|
|
@ -147,56 +147,34 @@ public static class GameEvents
|
|||
|
||||
// ── Combat notifications ────────────────────────────────────────────────
|
||||
|
||||
/// <summary>0x01AC VictimNotification — "you got hit for X".</summary>
|
||||
public readonly record struct VictimNotification(
|
||||
string AttackerName,
|
||||
uint AttackerGuid,
|
||||
uint DamageType,
|
||||
uint Damage,
|
||||
uint HitQuadrant,
|
||||
uint Critical,
|
||||
uint AttackType);
|
||||
/// <summary>0x01AC VictimNotification - death message for the victim.</summary>
|
||||
public readonly record struct VictimNotification(string DeathMessage);
|
||||
|
||||
public static VictimNotification? ParseVictimNotification(ReadOnlySpan<byte> payload)
|
||||
{
|
||||
int pos = 0;
|
||||
try
|
||||
{
|
||||
string name = ReadString16L(payload, ref pos);
|
||||
if (payload.Length - pos < 24) return null;
|
||||
uint guid = BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(pos)); pos += 4;
|
||||
uint damageType = BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(pos)); pos += 4;
|
||||
uint damage = BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(pos)); pos += 4;
|
||||
uint quad = BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(pos)); pos += 4;
|
||||
uint crit = BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(pos)); pos += 4;
|
||||
uint atkType = BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(pos)); pos += 4;
|
||||
return new VictimNotification(name, guid, damageType, damage, quad, crit, atkType);
|
||||
}
|
||||
try { return new VictimNotification(ReadString16L(payload, ref pos)); }
|
||||
catch { return null; }
|
||||
}
|
||||
|
||||
/// <summary>0x01AD KillerNotification — "you killed X".</summary>
|
||||
public readonly record struct KillerNotification(string VictimName, uint VictimGuid);
|
||||
/// <summary>0x01AD KillerNotification - death message for the killer.</summary>
|
||||
public readonly record struct KillerNotification(string DeathMessage);
|
||||
|
||||
public static KillerNotification? ParseKillerNotification(ReadOnlySpan<byte> payload)
|
||||
{
|
||||
int pos = 0;
|
||||
try
|
||||
{
|
||||
string name = ReadString16L(payload, ref pos);
|
||||
if (payload.Length - pos < 4) return null;
|
||||
uint guid = BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(pos));
|
||||
return new KillerNotification(name, guid);
|
||||
}
|
||||
try { return new KillerNotification(ReadString16L(payload, ref pos)); }
|
||||
catch { return null; }
|
||||
}
|
||||
|
||||
/// <summary>0x01B1 AttackerNotification — "you hit X for Y%".</summary>
|
||||
/// <summary>0x01B1 AttackerNotification - "you hit X".</summary>
|
||||
public readonly record struct AttackerNotification(
|
||||
string DefenderName,
|
||||
uint DamageType,
|
||||
double HealthPercent,
|
||||
uint Damage,
|
||||
float DamagePercent);
|
||||
uint Critical,
|
||||
ulong AttackConditions);
|
||||
|
||||
public static AttackerNotification? ParseAttackerNotification(ReadOnlySpan<byte> payload)
|
||||
{
|
||||
|
|
@ -204,23 +182,26 @@ public static class GameEvents
|
|||
try
|
||||
{
|
||||
string name = ReadString16L(payload, ref pos);
|
||||
if (payload.Length - pos < 12) return null;
|
||||
uint damageType = BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(pos)); pos += 4;
|
||||
uint damage = BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(pos)); pos += 4;
|
||||
float pct = BinaryPrimitives.ReadSingleLittleEndian(payload.Slice(pos)); pos += 4;
|
||||
return new AttackerNotification(name, damageType, damage, pct);
|
||||
if (payload.Length - pos < 28) return null;
|
||||
uint damageType = BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(pos)); pos += 4;
|
||||
double pct = BinaryPrimitives.ReadDoubleLittleEndian(payload.Slice(pos)); pos += 8;
|
||||
uint damage = BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(pos)); pos += 4;
|
||||
uint crit = BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(pos)); pos += 4;
|
||||
ulong cond = BinaryPrimitives.ReadUInt64LittleEndian(payload.Slice(pos)); pos += 8;
|
||||
return new AttackerNotification(name, damageType, pct, damage, crit, cond);
|
||||
}
|
||||
catch { return null; }
|
||||
}
|
||||
|
||||
/// <summary>0x01B2 DefenderNotification — "X hit you for Y".</summary>
|
||||
/// <summary>0x01B2 DefenderNotification - "X hit you".</summary>
|
||||
public readonly record struct DefenderNotification(
|
||||
string AttackerName,
|
||||
uint AttackerGuid,
|
||||
uint DamageType,
|
||||
double HealthPercent,
|
||||
uint Damage,
|
||||
uint HitQuadrant,
|
||||
uint Critical);
|
||||
uint Critical,
|
||||
ulong AttackConditions);
|
||||
|
||||
public static DefenderNotification? ParseDefenderNotification(ReadOnlySpan<byte> payload)
|
||||
{
|
||||
|
|
@ -228,40 +209,42 @@ public static class GameEvents
|
|||
try
|
||||
{
|
||||
string name = ReadString16L(payload, ref pos);
|
||||
if (payload.Length - pos < 20) return null;
|
||||
uint guid = BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(pos)); pos += 4;
|
||||
uint dtype = BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(pos)); pos += 4;
|
||||
uint dmg = BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(pos)); pos += 4;
|
||||
uint quad = BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(pos)); pos += 4;
|
||||
uint crit = BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(pos)); pos += 4;
|
||||
return new DefenderNotification(name, guid, dtype, dmg, quad, crit);
|
||||
if (payload.Length - pos < 32) return null;
|
||||
uint dtype = BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(pos)); pos += 4;
|
||||
double pct = BinaryPrimitives.ReadDoubleLittleEndian(payload.Slice(pos)); pos += 8;
|
||||
uint dmg = BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(pos)); pos += 4;
|
||||
uint quad = BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(pos)); pos += 4;
|
||||
uint crit = BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(pos)); pos += 4;
|
||||
ulong cond = BinaryPrimitives.ReadUInt64LittleEndian(payload.Slice(pos)); pos += 8;
|
||||
return new DefenderNotification(name, dtype, pct, dmg, quad, crit, cond);
|
||||
}
|
||||
catch { return null; }
|
||||
}
|
||||
|
||||
/// <summary>0x01B3 EvasionAttackerNotification — "X evaded".</summary>
|
||||
/// <summary>0x01B3 EvasionAttackerNotification - "X evaded".</summary>
|
||||
public static string? ParseEvasionAttackerNotification(ReadOnlySpan<byte> payload)
|
||||
{
|
||||
int pos = 0;
|
||||
try { return ReadString16L(payload, ref pos); } catch { return null; }
|
||||
}
|
||||
|
||||
/// <summary>0x01B4 EvasionDefenderNotification — "you evaded X".</summary>
|
||||
/// <summary>0x01B4 EvasionDefenderNotification - "you evaded X".</summary>
|
||||
public static string? ParseEvasionDefenderNotification(ReadOnlySpan<byte> payload)
|
||||
{
|
||||
int pos = 0;
|
||||
try { return ReadString16L(payload, ref pos); } catch { return null; }
|
||||
}
|
||||
|
||||
/// <summary>0x01A7 AttackDone — (attackSequence, weenieError).</summary>
|
||||
/// <summary>0x01B8 CombatCommenceAttack - empty payload.</summary>
|
||||
public static bool ParseCombatCommenceAttack(ReadOnlySpan<byte> payload) => payload.Length == 0;
|
||||
|
||||
/// <summary>0x01A7 AttackDone - single WeenieError value.</summary>
|
||||
public readonly record struct AttackDone(uint AttackSequence, uint WeenieError);
|
||||
|
||||
public static AttackDone? ParseAttackDone(ReadOnlySpan<byte> payload)
|
||||
{
|
||||
if (payload.Length < 8) return null;
|
||||
return new AttackDone(
|
||||
BinaryPrimitives.ReadUInt32LittleEndian(payload),
|
||||
BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(4)));
|
||||
if (payload.Length < 4) return null;
|
||||
return new AttackDone(0u, BinaryPrimitives.ReadUInt32LittleEndian(payload));
|
||||
}
|
||||
|
||||
// ── Spell enchantments ──────────────────────────────────────────────────
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue