From e99117ed8b258bdb20a3b13933deb2924f41538e Mon Sep 17 00:00:00 2001 From: Eddoursul Date: Thu, 20 Mar 2025 01:38:58 +0100 Subject: [PATCH] Split base removal chance for world-placed and container items --- mod/Unfound Loot.esp | Bin 133929 -> 135495 bytes src/EULxINILoadSettings.gek | 2 +- src/EULxINISaveSettings.gek | 2 +- src/EULxOnGameLoad.gek | 14 ++++++++ src/EULxOnGameMode.gek | 2 +- src/EULxOnSeen.gek | 30 +++++++++-------- src/EULxPrecalculateRemovalChance.gek | 5 +-- src/EULxPresetSetterFUNCTION.gek | 7 ++-- src/EULxQuestScript.gek | 46 ++++++++++++++------------ 9 files changed, 65 insertions(+), 43 deletions(-) diff --git a/mod/Unfound Loot.esp b/mod/Unfound Loot.esp index a00fe745f6a947a43bacd4f6487780d4d2307e96..dafdbec6f8a795e9b48f5df96213ad446dbd3984 100644 GIT binary patch delta 4261 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 HzAyb3fRZ;3 delta 3566 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 F@IRYupIra| diff --git a/src/EULxINILoadSettings.gek b/src/EULxINILoadSettings.gek index 657b69a..f6ddc18 100644 --- a/src/EULxINILoadSettings.gek +++ b/src/EULxINILoadSettings.gek @@ -25,8 +25,8 @@ begin function {} ; World - set EULxWorldLootRemovalEnabled to GetINIFloat "World:LootRemovalEnabled" $sFile set EULxWorldBaseRemovalChance to GetINIFloat "World:BaseRemovalChance" $sFile + set EULxWorldContRemovalChance to GetINIFloat "World:ContRemovalChance" $sFile set EULxWorldSkipLocked to GetINIFloat "World:SkipLocked" $sFile set EULxWorldWeaponRemovalMod to GetINIFloat "World:WeaponRemovalMod" $sFile diff --git a/src/EULxINISaveSettings.gek b/src/EULxINISaveSettings.gek index 64ecbbe..8d331f8 100644 --- a/src/EULxINISaveSettings.gek +++ b/src/EULxINISaveSettings.gek @@ -19,8 +19,8 @@ begin function {} ; World - SetINIFloat "World:LootRemovalEnabled" EULxWorldLootRemovalEnabled $sFile SetINIFloat "World:BaseRemovalChance" EULxWorldBaseRemovalChance $sFile + SetINIFloat "World:ContRemovalChance" EULxWorldContRemovalChance $sFile SetINIFloat "World:SkipLocked" EULxWorldSkipLocked $sFile SetINIFloat "World:WeaponRemovalMod" EULxWorldWeaponRemovalMod $sFile diff --git a/src/EULxOnGameLoad.gek b/src/EULxOnGameLoad.gek index b7863dc..f139ea3 100644 --- a/src/EULxOnGameLoad.gek +++ b/src/EULxOnGameLoad.gek @@ -41,4 +41,18 @@ begin function { iSuccess } endif endif + if EULxVersion < 4 + set EULxVersion to 4 + + set EULxWorldContRemovalChance to EULxWorldBaseRemovalChance + + if EULxSaveToINI + if FileExists "config\Unfound Loot.ini" + if GetINIFloat "General:Saved" "Unfound Loot.ini" + SetINIFloat "World:ContRemovalChance" EULxWorldContRemovalChance "Unfound Loot.ini" + endif + endif + endif + endif + end diff --git a/src/EULxOnGameMode.gek b/src/EULxOnGameMode.gek index 6e8a1bc..1156a41 100644 --- a/src/EULxOnGameMode.gek +++ b/src/EULxOnGameMode.gek @@ -8,7 +8,7 @@ begin function {} SetJohnnyOnLimbGoneEventHandler EULxActorBreakOnDecapitation EULxOnLimbGone 0 if IsModLoaded "JIP MiniMap.esp" == 0 - SetJohnnySeenDataEventHandler EULxWorldLootRemovalEnabled EULxOnSeen 0 + SetJohnnySeenDataEventHandler 1 EULxOnSeen 0 endif if GetGameRestarted diff --git a/src/EULxOnSeen.gek b/src/EULxOnSeen.gek index 717c9dd..703a01d 100644 --- a/src/EULxOnSeen.gek +++ b/src/EULxOnSeen.gek @@ -4,7 +4,6 @@ ref rCell ref rTemp ref rItem int iTemp -int iPrecalc int bSkip int bUniquesLoaded @@ -12,7 +11,7 @@ array_var aUniques begin function { rCell } - if EULxWorldLootRemovalEnabled == 0 + if EULxWorldBaseRemovalChance == 0 && EULxWorldContRemovalChance == 0 return endif @@ -32,14 +31,18 @@ begin function { rCell } ; Do not call EULxDelootifyCellItems if the cell has no items - if GetFirstRefInCell rCell 201 0 0 - set iPrecalc to 1 - call EULxPrecalculateRemovalChance - let bUniquesLoaded := 1 - let aUniques := UnfoundLootUniqueStorageRef.GetAllItems - call EULxDelootifyCellItems rCell aUniques + if EULxWorldBaseRemovalChance != 0 + if GetFirstRefInCell rCell 201 0 0 + call EULxPrecalculateRemovalChance EULxWorldBaseRemovalChance + let bUniquesLoaded := 1 + let aUniques := UnfoundLootUniqueStorageRef.GetAllItems + call EULxDelootifyCellItems rCell aUniques + endif + endif + + if EULxWorldContRemovalChance == 0 + return endif - DebugPrint "Scanning %n (%i) for containers" rCell rCell @@ -47,6 +50,10 @@ begin function { rCell } set rTemp to GetFirstRefInCell rCell 27 0 0 + if rTemp + call EULxPrecalculateRemovalChance EULxWorldContRemovalChance + endif + while rTemp set bSkip to 0 @@ -97,11 +104,6 @@ begin function { rCell } continue endif - if iPrecalc == 0 - set iPrecalc to 1 - call EULxPrecalculateRemovalChance - endif - if bUniquesLoaded == 0 let bUniquesLoaded := 1 let aUniques := UnfoundLootUniqueStorageRef.GetAllItems diff --git a/src/EULxPrecalculateRemovalChance.gek b/src/EULxPrecalculateRemovalChance.gek index 61f52cb..99bcd1b 100644 --- a/src/EULxPrecalculateRemovalChance.gek +++ b/src/EULxPrecalculateRemovalChance.gek @@ -1,12 +1,13 @@ scn EULxPrecalculateRemovalChance +int iBaseRemovalChance float fTemp -begin function {} +begin function { iBaseRemovalChance } set fTemp to (( EULxLuckModifier / 10 ) * playerRef.getAV luck) / 100 set fTemp to 1 - fTemp - set fTemp to EULxWorldBaseRemovalChance * fTemp + set fTemp to iBaseRemovalChance * fTemp set fTemp to fTemp / 100 ;DebugPrint "Base removal chance %g, luck effect %g%% - new base removal chance %g%%" EULxWorldBaseRemovalChance EULxLuckModifier fTemp diff --git a/src/EULxPresetSetterFUNCTION.gek b/src/EULxPresetSetterFUNCTION.gek index c1b91dc..85df731 100644 --- a/src/EULxPresetSetterFUNCTION.gek +++ b/src/EULxPresetSetterFUNCTION.gek @@ -22,8 +22,8 @@ begin function { iPreset, bAll } ; World-placed Items - set EULxWorldLootRemovalEnabled to 1 set EULxWorldBaseRemovalChance to 85 + set EULxWorldContRemovalChance to 85 set EULxWorldSkipLocked to 1 set EULxWorldWeaponRemovalMod to 1.0 @@ -81,6 +81,7 @@ begin function { iPreset, bAll } set EULxMaxArmorCondition to 30 set EULxWorldBaseRemovalChance to 95 + set EULxWorldContRemovalChance to 95 set EULxWorldArmorRemovalMod to 1.0 set EULxWorldMiscRemovalMod to .80 ;sparse interiors set EULxWorldAmmoRemovalMod to 2.0 ;too much ammo as is @@ -111,6 +112,7 @@ begin function { iPreset, bAll } set EULxWorldSkipLocked to 0 set EULxWorldBaseRemovalChance to 95 + set EULxWorldContRemovalChance to 95 set EULxWorldWeaponRemovalMod to 1.5 set EULxWorldArmorRemovalMod to 0.6 set EULxWorldMiscRemovalMod to 0.33 ; junk doesnt get picked up @@ -140,6 +142,7 @@ begin function { iPreset, bAll } set EULxMaxArmorCondition to 35 set EULxWorldBaseRemovalChance to 66 + set EULxWorldContRemovalChance to 66 set EULxWorldWeaponRemovalMod to 1.5 set EULxWorldCurrencyRemovalMod to 2.0 @@ -159,6 +162,4 @@ begin function { iPreset, bAll } endif - call EULxPrecalculateRemovalChance - end \ No newline at end of file diff --git a/src/EULxQuestScript.gek b/src/EULxQuestScript.gek index 34543d7..42ff9e5 100644 --- a/src/EULxQuestScript.gek +++ b/src/EULxQuestScript.gek @@ -131,11 +131,12 @@ begin MenuMode 1013 SetMCMFloat 1 0 "_columns" 2 - call EULxMCMAddElement 4 "Enabled" EULxWorldLootRemovalEnabled - call EULxMCMAddElement 2 "Base removal chance" EULxWorldBaseRemovalChance - call EULxMCMAddElement 5 "Skip locked containers" EULxWorldSkipLocked + call EULxMCMAddElement 0 "Base removal chance" 0 call EULxMCMAddElement 0 "" 0 + call EULxMCMAddElement 2 "World-placed items" EULxWorldBaseRemovalChance + call EULxMCMAddElement 2 "Container items" EULxWorldContRemovalChance + call EULxMCMAddElement 0 "" 0 call EULxMCMAddElement 0 "" 0 @@ -151,6 +152,8 @@ begin MenuMode 1013 call EULxMCMAddElement 2.5 "Meds" EULxWorldMedsRemovalMod call EULxMCMAddElement 2.5 "Food" EULxWorldFoodRemovalMod call EULxMCMAddElement 2.5 "Misc items" EULxWorldMiscRemovalMod + call EULxMCMAddElement 5 "Skip locked containers" EULxWorldSkipLocked + elseif iSubMenu == 3 @@ -254,14 +257,10 @@ begin MenuMode 1013 elseif iSubMenu == 2 - if iOption == 1 - set EULxWorldLootRemovalEnabled to fValue - SetJohnnySeenDataEventHandler fValue EULxOnSeen 0 - - elseif iOption == 2 + if iOption == 3 set EULxWorldBaseRemovalChance to fValue - elseif iOption == 3 - set EULxWorldSkipLocked to fValue + elseif iOption == 4 + set EULxWorldContRemovalChance to fValue elseif iOption == 9 set EULxWorldWeaponRemovalMod to fValue @@ -281,6 +280,8 @@ begin MenuMode 1013 set EULxWorldFoodRemovalMod to fValue elseif iOption == 17 set EULxWorldMiscRemovalMod to fValue + elseif iOption == 18 + set EULxWorldSkipLocked to fValue endif elseif iSubMenu == 3 @@ -335,8 +336,6 @@ begin MenuMode 1013 endif - call EULxPrecalculateRemovalChance - if EULxSaveToINI call EULxINISaveSettings endif @@ -401,8 +400,10 @@ begin MenuMode 1013 elseif iSubMenu == 2 - if iOption == 2 - call EULxMCMAddScale "Base removal chance" EULxWorldBaseRemovalChance "%" 0 100 0 1 + if iOption == 3 + call EULxMCMAddScale "Base removal chance - world items" EULxWorldBaseRemovalChance "%" 0 100 0 1 + elseif iOption == 4 + call EULxMCMAddScale "Base removal chance - containers" EULxWorldContRemovalChance "%" 0 100 0 1 elseif iOption == 9 call EULxMCMAddScale "Weapon multiplier" EULxWorldWeaponRemovalMod "x" 0 10 1 0.1 @@ -490,7 +491,9 @@ begin MenuMode 1013 elseif iSubMenu == 2 - if iOption == 2 + if iOption == 3 + SetUIFloat "StartMenu/MCM/_Value" 85 + elseif iOption == 4 SetUIFloat "StartMenu/MCM/_Value" 85 elseif iOption == 9 ; weapons @@ -600,12 +603,10 @@ begin MenuMode 1013 SetUIFloat "StartMenu/MCM/*:9/visible" 1 - if iMouseover == 1 - SetUIString "StartMenu/MCM/*:9/string" "Enable or disable world items reduction." - elseif iMouseover == 2 - SetUIString "StartMenu/MCM/*:9/string" "Removal chance for world-placed and container items. We get a random number between 0 and 100 and compare it with 100. If the number is smaller, the item gets removed." - elseif iMouseover == 3 - SetUIString "StartMenu/MCM/*:9/string" "Do not remove items from locked containers." + if iMouseover == 3 + SetUIString "StartMenu/MCM/*:9/string" "Removal chance for world-placed items. We get a random number between 0 and 100 and compare it with 100. If the number is smaller, the item gets removed. Set to 0 to disable." + elseif iMouseover == 4 + SetUIString "StartMenu/MCM/*:9/string" "Removal chance for container items. We get a random number between 0 and 100 and compare it with 100. If the number is smaller, the item gets removed. Set to 0 to disable." elseif iMouseover == 9 SetUIStringEx "StartMenu/MCM/*:9/string" "Removal chance multiplier for weapons. Higher = greater chance of these items being removed." @@ -628,6 +629,9 @@ begin MenuMode 1013 elseif iMouseover == 17 SetUIString "StartMenu/MCM/*:9/string" "Removal chance multiplier for misc items. Higher = greater chance of these items being removed." + elseif iMouseover == 18 + SetUIString "StartMenu/MCM/*:9/string" "Do not remove items from locked containers." + else SetUIFloat "StartMenu/MCM/*:9/visible" 0 endif