Weapon attack callbacks, timer cancellation, Staff mesh

  • Add Weapon::attackCb and timeOfAttack for per-weapon attack logic
  • Move BHS projectile spawn into Bhs::attackCb lambda
  • Add Timer::cancel with CancellationToken to abort deferred calls
  • Add Player::onAttack: validates weapon slot still active before firing
  • Store attackCancellationToken in Player; cancel on weapon switch
  • Cancel attack timer on setCurWeapon to prevent stale callbacks
  • Add Staff mesh (alara/Staff/OneBone as SkMeshAsset) and StillAnim
  • Wire Staff idle and attack anims to StillAnim placeholder
  • Remove weapon position offset from setCurWeapon (handled by socket)
  • Assert mesh non-null in Player::tick instead of early return
  • Clean up Player::tick: remove redundant mesh lock, simplify branches
  • Fix weapon.cpp: remove stray #pragma once

Previous