public virtual bool SharedOnDamage( WeaponFinalCache weaponCache, IWorldObject targetObject, double damagePreMultiplier, out double obstacleBlockDamageCoef, out double damageApplied) { var targetCharacter = (ICharacter)targetObject; var isHit = WeaponDamageSystem.SharedOnDamageToCharacter( targetCharacter, weaponCache, damagePreMultiplier, out damageApplied); if (isHit) { obstacleBlockDamageCoef = this.ObstacleBlockDamageCoef; if (IsClient) { this.PlaySound(CharacterSound.DamageTaken, targetCharacter); } } else { obstacleBlockDamageCoef = 0; } return(isHit); }
protected virtual double SharedCalculateDamageByWeapon( WeaponFinalCache weaponCache, double damagePreMultiplier, IStaticWorldObject targetObject, out double obstacleBlockDamageCoef) { obstacleBlockDamageCoef = this.ObstacleBlockDamageCoef; if (IsClient) { // we don't apply any damage on the Client-side return(0); } if (!weaponCache.ProtoWeapon?.CanDamageStructures ?? false) { // probably a mob weapon obstacleBlockDamageCoef = 1; return(0); } return(WeaponDamageSystem.ServerCalculateTotalDamage( weaponCache, targetObject, this.DefenseStats, damagePreMultiplier, clampDefenseTo1: false)); }
public ViewModelItemTooltipArmorStats(IProtoItemEquipment protoItem) { var effects = protoItem.ProtoEffects; var damageTypes = EnumExtensions.GetValues <DamageType>(); var primaryEntriesCount = 3; var arrayPrimary = new DataDefense[primaryEntriesCount]; var arraySecondary = new DataDefense[damageTypes.Length - primaryEntriesCount]; var hasAnyNonZeroProtection = false; for (var index = 0; index < primaryEntriesCount; index++) { AddEntry(index); } for (var index = primaryEntriesCount; index < damageTypes.Length; index++) { AddEntry(index); } this.DefenseEntriesPrimary = arrayPrimary; this.DefenseEntriesSecondary = arraySecondary; this.HasAnyNonZeroProtection = hasAnyNonZeroProtection; void AddEntry(int index) { var damageType = damageTypes[index]; var defenseStatName = WeaponDamageSystem.SharedGetDefenseStatName(damageType); byte defenseValue = 0; if (effects.Values.TryGetValue(defenseStatName, out var defense)) { defenseValue = (byte)MathHelper.Clamp(defense * 100, 0, 100); } var entry = new DataDefense(damageType, defenseValue); if (index < primaryEntriesCount) { arrayPrimary[index] = entry; } else { arraySecondary[index - primaryEntriesCount] = entry; } if (defenseValue > 0) { hasAnyNonZeroProtection = true; } } }