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); }