using AcDream.Core.Combat;
namespace AcDream.Core.Net;
///
/// Routes the local player's server-owned combat-mode quality into
/// . Retail
/// ClientCombatSystem::OnQualityChanged @ 0x0056C1B0 reads
/// PropertyInt 40 and calls SetCombatMode on every change.
///
public static class CombatStateWiring
{
public const uint CombatModePropertyId = 40u;
public static void Wire(WorldSession session, CombatState combat)
{
ArgumentNullException.ThrowIfNull(session);
ArgumentNullException.ThrowIfNull(combat);
session.PlayerIntPropertyUpdated += update =>
ApplyPlayerIntProperty(combat, update.Property, update.Value);
}
///
/// Pure event adapter exposed for conformance tests. Composite or unknown
/// values are ignored: retail's quality contains one concrete mode.
///
public static bool ApplyPlayerIntProperty(
CombatState combat,
uint property,
int value)
{
ArgumentNullException.ThrowIfNull(combat);
if (property != CombatModePropertyId)
return false;
CombatMode mode = (CombatMode)value;
if (mode is not (CombatMode.NonCombat
or CombatMode.Melee
or CombatMode.Missile
or CombatMode.Magic))
return false;
combat.SetCombatMode(mode);
return true;
}
}