Пример #1
0
        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);
        }
Пример #2
0
        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;
                }
            }
        }