v1.2.4.b1
This commit is contained in:
parent
7ad753e3b5
commit
dcf4020981
39 changed files with 434 additions and 204 deletions
|
|
@ -12,7 +12,7 @@ namespace src.player.skills
|
|||
private const Skills skillName = Skills.TrueArmor;
|
||||
|
||||
private static readonly ConcurrentDictionary<uint, byte> holders = [];
|
||||
private static readonly ConcurrentDictionary<uint, int> pending = [];
|
||||
private static readonly ConcurrentDictionary<uint, PendingArmor> pending = [];
|
||||
|
||||
public static void LoadSkill()
|
||||
{
|
||||
|
|
@ -62,13 +62,16 @@ namespace src.player.skills
|
|||
|
||||
info.Damage = damage - absorbed;
|
||||
|
||||
pending[victim.Index] = (int)MathF.Round(armor - absorbed);
|
||||
int restoredArmor = (int)MathF.Round(armor - absorbed);
|
||||
bool hadHelmet = victimPawn.ItemServices?.As<CCSPlayer_ItemServices>()?.HasHelmet ?? false;
|
||||
|
||||
pending[victim.Index] = new PendingArmor(restoredArmor, hadHelmet);
|
||||
victimPawn.ArmorValue = 0;
|
||||
|
||||
Utilities.SetStateChanged(victimPawn, "CCSPlayerPawn", "m_ArmorValue");
|
||||
|
||||
Debug.WriteToDebug($"[TrueArmor] {victim.PlayerName}: raw={damage:0.#} absorbed={absorbed:0.#} " +
|
||||
$"passed={info.Damage:0.#} armor={armor}->{pending[victim.Index]} hp={victimPawn.Health}", DebugCategory.Damage);
|
||||
$"passed={info.Damage:0.#} armor={armor}->{restoredArmor} helmet={hadHelmet} hp={victimPawn.Health}", DebugCategory.Damage);
|
||||
}
|
||||
|
||||
public static void OnTakeDamagePost(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo, CTakeDamageResult damageResult)
|
||||
|
|
@ -76,12 +79,22 @@ namespace src.player.skills
|
|||
if (pending.IsEmpty) return;
|
||||
|
||||
if (!TryResolveVictim(damagedEntity, damageInfo, out var victim, out var victimPawn, out _)) return;
|
||||
if (!pending.TryRemove(victim!.Index, out int restored)) return;
|
||||
if (!pending.TryRemove(victim!.Index, out var restored)) return;
|
||||
|
||||
victimPawn!.ArmorValue = restored;
|
||||
victimPawn!.ArmorValue = restored.Armor;
|
||||
Utilities.SetStateChanged(victimPawn, "CCSPlayerPawn", "m_ArmorValue");
|
||||
|
||||
if (!restored.HasHelmet) return;
|
||||
|
||||
var itemServices = victimPawn.ItemServices?.As<CCSPlayer_ItemServices>();
|
||||
if (itemServices == null || itemServices.HasHelmet) return;
|
||||
|
||||
itemServices.HasHelmet = true;
|
||||
Utilities.SetStateChanged(victim, "CCSPlayerController", "m_bPawnHasHelmet");
|
||||
}
|
||||
|
||||
private readonly record struct PendingArmor(int Armor, bool HasHelmet);
|
||||
|
||||
private static bool TryResolveVictim(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo, out CCSPlayerController? victim, out CCSPlayerPawn? pawn, out CTakeDamageInfo? info)
|
||||
{
|
||||
victim = null;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue