public static void ApplyDamage(GameObject go, DamageArgs damage) { var li = new List <DamageArgs>(); li.Add(damage); ApplyDamage(go, li); }
public void Damage(DamageArgs args) { if (isServer) { CmdDamage(args); } }
public void RawDamage(DamageArgs args) { var baseAmount = args.m_Amount; if (baseAmount > 0.0f && Invulnerable) { return; } if (m_Dead) { return; } if (m_InvulnerableWindow > 0.0f) { m_InvulnerableTime = m_InvulnerableWindow; } RawDamageUnchecked(args); }
// Return true if any damage was done public static bool ApplyDamageIfEnemy(GameObject target, GameObject instigator, DamageArgs damage) { if (!Team.IsEnemy(target, instigator)) { return(false); } ApplyDamage(target, damage); return(true); }
//[Command] public void CmdDamage(DamageArgs args) { RawDamage(args); }
public void RawDamageUnchecked(DamageArgs args) { var baseAmount = args.m_Amount; List <ResistanceData> listRd = new List <ResistanceData>(); foreach (var comp in m_ResistanceComponents) { ResistanceData rd = new ResistanceData(); comp.GetResistances(rd); listRd.Add(rd); } listRd.Sort((x, y) => x.m_Priority.CompareTo(y.m_Priority)); float finalPercent = 1.0f; float finalBlock = 0.0f; foreach (var rd in listRd) { foreach (var resist in rd.m_Resistances) { if (resist.m_Type == args.m_Type || resist.m_Type == DamageType.Any) { finalPercent = resist.m_Percent; finalBlock = resist.m_Block; if (resist.m_Type != DamageType.Any) { break; } } } } float oldHealth = m_Health; if (baseAmount > 0.0f) { args.m_FinalAmount = Mathf.Clamp(finalPercent * baseAmount - finalBlock, 0.0f, 99999.0f); if (args.m_Type == DamageType.Radiation) { if (m_RadiationVulnerable) { m_LastRadiationTime = 0.9f; m_Radiation -= args.m_FinalAmount; } } else { m_Health -= args.m_FinalAmount; } } else { args.m_FinalAmount = Mathf.Clamp(finalPercent * baseAmount - finalBlock, -99999.0f, 0.0f); if (args.m_Type == DamageType.Radiation) { if (m_RadiationVulnerable) { m_Radiation -= args.m_FinalAmount; } } else { m_Health -= args.m_FinalAmount; } } DamageNotificationArgs notificationArgs = new DamageNotificationArgs() { m_Args = args, m_InitialHealth = oldHealth, m_FinalHealth = Mathf.Clamp(m_Health, 0.0f, m_MaxHealth) }; foreach (var notification in GetComponents <IDamageNotification>()) { notification.DamageNotification(notificationArgs); } if (m_Health <= 0) { m_Health = 0; m_Dead = true; TwoDee.EasySound.Play("die1", gameObject); foreach (var killable in GetComponents <IKillable>()) { if (isServer) { killable.Kill(); } } } if (m_Health > m_MaxHealth) { m_Health = m_MaxHealth; } if (m_Radiation < 0.0f && m_RadiationVulnerable) { float excess = -m_Radiation; m_Radiation = 0.0f;; RawDamageUnchecked(new DamageArgs(excess, DamageType.Pure, args.m_Hitter, args.m_Location)); } }