


A BepInEx 5 mod for SULFUR that selectively removes undesirable weapon-oil traits while preserving positive effects and the original localized descriptions.
Every supported trait has its own config switch.
The default profile only removes effects that have relatively little impact on weapon balance:
The following stronger stat-changing removals are available but default to disabled:
The signed-value rules only suppress modifiers that reduce the stat:
ProjectileTimeScale < 0: negative bullet speed;Damage or DamageModifier < 0: negative damage, for both Flat and percentage modifier types;ProjectileScale < 0: negative bullet size;RPM < 0: negative fire rate.Positive bullet-speed, damage, bullet-size, and RPM modifiers remain active.
More Bullet Drop also suppresses its same-oil reduced-speed or increased-mass companion modifiers. Because reduced projectile speed belongs to both categories, it is removed when either RemoveMoreBulletDrop or RemoveNegativeBulletSpeed is enabled.
The game still shows the original oil effects. Lines for traits currently disabled by Perfect Oils are wrapped in TextMeshPro's strikethrough tag.
This works for:
The tooltip and runtime suppression use the same trait classifier and the same config values, so their states remain consistent.
Perfect Oils keeps EnchantmentDefinition.modifiersApplied intact. At database load it indexes exact modifier signatures by:
ItemAttributes value;StatModType;A targeted prefix on ItemStats.AddModifier(ItemAttributes, StatModifier) ignores only a matching oil modifier whose corresponding config option is enabled. No weapon, loot, movement, aiming, projectile, or damage consumer is replaced.
The index contains every known negative signature regardless of the current settings, so config changes do not require rebuilding the asset database. Existing weapon stats may need the game to rebuild/resync the item, or a restart, before a changed modifier setting is reflected. Tooltip changes are evaluated whenever the tooltip is rebuilt. The durability-cost setting updates the shared oil definitions immediately.
5.4.2305LocalPaths.props.example to LocalPaths.props.SulfurManagedDir and BepInExCoreDir.PerfectOils.csproj in Release mode.PerfectOils.dll to BepInEx/plugins/PerfectOils/.No game DLLs, Unity assemblies, or BepInEx binaries are included in this source package.
Generated at:
BepInEx/config/com.ryuka.sulfur.perfectoils.cfg
Enabled = trueRemoveExtraDurabilityCost = falseEnabled by default:
RemoveDisableAiming = trueRemoveExtraAmmoConsumeChance = trueRemoveDecreaseAccuracyWhenMoving = trueRemoveDecreaseMoveSpeed = trueRemoveDecreaseJumpPower = trueRemoveDecreaseLootChanceMultiplier = trueRemoveDisableMoneyDrops = trueRemoveDisableOrganDrops = trueDisabled by default:
RemoveMoreBulletDrop = falseRemoveMoreDrag = falseRemoveNegativeBulletSpeed = falseRemoveNegativeDamage = falseRemoveNegativeBulletSize = falseRemoveNegativeRpm = falseShowRemovedTraitsWithStrikethrough = trueDetailedLogging = falseThe existing General.RemoveExtraDurabilityCost key is retained for compatibility with v1.1.x configuration files.
The initialization log reports separate counts for:
This verifies the actual Addressables data loaded by the current game build, which is not stored in the managed DLLs.
ryuka