Пример #1
0
        private bool?ProcessDecayDamage(BaseCombatEntity entity, HitInfo hitInfo)
        {
            if (entity == null || !hitInfo.damageTypes.Has(Rust.DamageType.Decay))
            {
                return(null);
            }

            float damageMultiplier = 1;

            VehicleConfig    vehicleConfig;
            string           vehicleSpecificNoDecayPerm;
            float            timeSinceLastUsed;
            BaseCombatEntity vehicle;
            ulong            lockOwnerId;

            if (!GetSupportedVehicleInformation(entity, out vehicleConfig, out vehicleSpecificNoDecayPerm, out timeSinceLastUsed, out vehicle))
            {
                return(null);
            }

            if (timeSinceLastUsed != 0 && timeSinceLastUsed < 60 * vehicleConfig.ProtectionMinutesAfterUse)
            {
                if (_pluginConfig.Debug)
                {
                    LogWarning($"{entity.ShortPrefabName}: Nullifying decay damage due to being recently used: {(int)timeSinceLastUsed}s < {60 * vehicleConfig.ProtectionMinutesAfterUse}s.");
                }

                damageMultiplier = 0;
            }
            else if (UserHasPermission(vehicle.OwnerID, vehicleSpecificNoDecayPerm))
            {
                if (_pluginConfig.Debug)
                {
                    LogWarning($"{entity.ShortPrefabName}: Nullifying decay damage due to owner permission. OwnerId: {vehicle.OwnerID}.");
                }

                damageMultiplier = 0;
            }
            else if (LockOwnerHasPermission(vehicle, vehicleSpecificNoDecayPerm, out lockOwnerId))
            {
                if (_pluginConfig.Debug)
                {
                    LogWarning($"{entity.ShortPrefabName}: Nullifying decay damage due to lock owner permission. OwnerId: {lockOwnerId}.");
                }

                damageMultiplier = 0;
            }
            else
            {
                if (vehicleConfig.DecayMultiplierInside != 1.0 && !entity.IsOutside())
                {
                    if (_pluginConfig.Debug)
                    {
                        LogWarning($"{entity.ShortPrefabName}: Multiplying decay damage due to being inside: x{vehicleConfig.DecayMultiplierInside}.");
                    }

                    damageMultiplier = vehicleConfig.DecayMultiplierInside;
                }

                // Skip building privilege check if damage multiplier is already 0.
                if (damageMultiplier != 0 && vehicleConfig.DecayMultiplierNearTC != 1.0 && entity.GetBuildingPrivilege() != null)
                {
                    if (_pluginConfig.Debug)
                    {
                        LogWarning($"{entity.ShortPrefabName}: Multiplying decay damage due to being near TC: x{vehicleConfig.DecayMultiplierNearTC}.");
                    }

                    damageMultiplier *= vehicleConfig.DecayMultiplierNearTC;
                }
            }

            if (damageMultiplier != 1)
            {
                hitInfo.damageTypes.Scale(Rust.DamageType.Decay, damageMultiplier);

                // If no damage, return true to prevent the vehicle being considered attacked (which would have prevented repair).
                if (!hitInfo.hasDamage)
                {
                    return(true);
                }
            }

            return(null);
        }