Starfield
0 of 0

File information

Last updated

Original upload

Created by

1000101

Uploaded by

1000101

Virus scan

Safe to use

Tags for this mod

Documentation

Readme

View as plain text

Looter Shooter - Shooter Looter
v0010
A QoL mod for Starfield.
Automagically loots, hacks terminals, picks locks, harvests flora, can send the loot directly back to the ship.
Fully configurable and Hotkey ready.




Install:

AFTER you install Plugins.txt Enabler (https://www.nexusmods.com/starfield/mods/4157) and make sure it's working properly...

If upgrading, you should "park" the mod so the current status is "IDLE" or "SCHEDULED". The easiest way is to turn on the hand scanner requirement and wait for the current scan to complete.

It is recommended you remove a previous version first to avoid having any left over obsoleted files.

Unpack the enclosed \Data\ and it's contents into the games \Data\ overwriting any previous versions files. Your mod manager should do this for you.

Enable the mod in Plugins.txt:

Locate the file in...
...Windows users: %LOCALAPPDATA%\Starfield\
...Other platforms: ?

1) Add a line reading:
*LooterShooter-ShooterLooter.esm

2) Make sure archive invalidation is enabled (see StarfieldCustom.ini edits section of this document)

3) Profit




Console/Hotkey commands:

See the bottom of this file for a Hotkey example config.

Console commands are given below, replace "asControl", "asFilter" and, "asAction" as appropriate from the tables below. float means a number such as 1.0 and bool means true/false.

Example:
Set the scan range to 25.0 meters.

Use the "SetFloatControl" function which reads as follows:
cgf "LSSL:Interface.SetFloatControl" "asControl" float

Replace "asControl" with "ScanRadius" and float with 25.0:
cgf "LSSL:Interface.SetFloatControl" "ScanRadius" 25.0




General Mod Control Functions:

Query Control states:
cgf "LSSL:Interface.QueryState" "asControl"

Cancel a scan currently in progress. The game is not fast at times. Nothing can be done about that.
cgf "LSSL:Interface.CancelScan"

Change int Control values:
cgf "LSSL:Interface.SetIntControl" "asControl" int
cgf "LSSL:Interface.ModIntControl" "asControl" int

Change float Control values:
cgf "LSSL:Interface.SetFloatControl" "asControl" float
cgf "LSSL:Interface.ModFloatControl" "asControl" float

Change bool Control values:
cgf "LSSL:Interface.SetBoolControl" "asControl" bool
cgf "LSSL:Interface.ToggleBoolControl" "asControl"

Try and scan the area right meow!
cgf "LSSL:Interface.TryScanNow" abSkipLocationTest abSkipScannerTest
abSkipLocationTest [bool] Skip Location exclusion tests
abSkipScannerTest [bool] Skip the hand scanner requirement




Change Filter States (enable/disable):

Set all Filters Actions:
cgf "LSSL:Interface.SetAllFilters" bool
cgf "LSSL:Interface.SetFilter" "asFilter" bool
cgf "LSSL:Interface.ToggleFilter" "asFilter"

Set specific Filter Actions:
cgf "LSSL:Interface.SetFilterAction" "asFilter" "asAction" bool
cgf "LSSL:Interface.SetAllFiltersByAction" "asAction" bool




Add/Remove Forms and References To/From Filters and Exclusions:

Add a Form or (the Base Object of) a Reference to a Filter: Sometimes a fish slips the net.
cgf "LSSL:Interface.AddToFilter" "asFilter" [FormID or RefID]
"asFilter" The Filter to add to.
[FormID or RefID] Will usually be a RefID unless you know the specific base form you want to add.
When a RefID is supplied the Base Object for it will be added to the Filter list, not the individual Object Reference.

Add a Form or Reference to a Filters Exclusion: Sometimes you catch a fish you don't want and need to throw it back.
cgf "LSSL:Interface.AddToExclusion" "asFilter" [FormID or RefID]
"asFilter" The Filter to add to the Exclusion list of.
[FormID or RefID] Will usually be a RefID unless you know the specific base form you want to add.
When a RefID is supplied the individual Object Reference itself will be added to the Exclusion list, not the Object Reference's Base Object.

Remove a Form or (the Base Object of) a Reference from a Filter: Sometimes you add the wrong type of fish!
cgf "LSSL:Interface.RemoveFromFilter" "asFilter" [FormID or RefID]
"asFilter" The Filter to remove from.
[FormID or RefID] Will usually be a RefID unless you know the specific base form you want to remove.
When a RefID is supplied the Base Object for it will be removed to the Filter list, not the individual Object Reference.

Remove a Form or Reference from a Filters Exclusion: Sometimes you add the wrong fish!
cgf "LSSL:Interface.RemoveFromExclusion" "asFilter" [FormID or RefID]
"asFilter" The Filter to remove from the Exclusion list of.
[FormID or RefID] Will usually be a RefID unless you know the specific base form you want to remove.
When a RefID is supplied the individual Object Reference itself will be removed to the Exclusion list, not the Object Reference's Base Object.




Export Settings and Filter modifications:

Must enable Papyrus logging. See "StarfieldCustom.ini Edits" below.

File: LSSL_Settings.0.log

cgf "LSSL:Interface.GenerateSettingsExport"




Object Debugging:

Why isn't that thing being hacked/picked/looted/etc???
The "Dump" functions require enabling Papyrus logging. See "StarfieldCustom.ini Edits" below.

File: LSSL.0.log

Interrogate a specific object:
cgf "LSSL:Debugger.DumpObjectInfo" [FormID or RefID]

Interrogate the filters and exclusions custom additions:
cgf "LSSL:Debugger.DumpExtendedFiltersAndExclusions"

Reset the "already looted flag" on everything in a radius around where the player is currently standing:
cgf "LSSL:Debugger.ResetLootedFlagInArea" float

Remove non-playable weapons, armor and, ammo from the player and home ship:
cgf "LSSL:Debugger.RemoveNonPlayableItems"




HELP! THE MOD IS STUCK AND STOPPED RESONDING!

Starfield loves it's load screens. Load screens r teh devil! They do strange things to scripts as the game pauses the Virtual Machine (VM) and completely changes the game state without a scripts knowledge. This can cause a script to end up looking for things that aren't there or trying to do things it can't in the new state.

The first thing you should do is a general state query to find out what LSSL thinks it's doing. Sometimes a scan just takes a long time. The big culprit in this regard is doors - I was overly generous with the keywords because of the complete inconsistency of doors. In "dense" areas a lot of non-doors will get caught in this net and it just takes time to sift through them all.
cgf "LSSL:Interface.QueryState" "General"

If you just don't want to wait for a long scan to complete, then you can cancel it. Note, it may still take several seconds for all threads to terminate.
cgf "LSSL:Interface.CancelScan"

After all that your game is still acting derpy because of this mod, I'm afraid there isn't much that can be done at this time with the tools available to us and you will have to roll back your save to before it occured. Once we have tools to edit saves I will be able to perform surgery on those files. No software or mod is going to be 100% bug free and this mod is no exception, I try as I might.




Main Control Options:

asControl: Type (Default): Description:

General n/a Only used for QueryState to get the current mod state.

AllowNPCXP bool (True) Allow current followers to gain XP towards increasing their skill ranks with some actions. *7 *8
AutoScan bool (True) Enable automatically scanning for things to loot, if false then scans must be manually triggered.
AllowStealing bool (False) Allow stealing items, may trigger alarms, etc if the player is caught.
CancelScan bool (False) (QueryState only) Has CancelScan() been called?
ClearOwnership bool (False) Clear the ownership of an item before stealing it (requires AllowStealing to be True)
HandScannerOnly bool (True) Only do the magic while the hand scanner is open. Otherwise, do it all the time.
NotifyOnComplete bool (False) Send a notification message saying how long the looting cycle took when it completes.
PauseScan bool (False) Pause scanning while True
SilentInterface bool (False) Silence the LSSL:Interface functions. Be sure to setup your own notifications as you think you may need them.
TeamActions bool (True) Allow current followers to help with some actions. *7, *8
VisualEffect bool (True) Do the Elemental Pull visual effect on things being looted

ScanInterval float (2.0) Time between the end of one scan and start of another (in seconds). *1
ScanRadius float (4.0) Scan for objects in this radius around the player (in meters).
ScanTimeout float (60.0) Maximum time a scan is allowed to run before being terminated. *1

MaxThreads int (50) Maximum number of allowable concurrent scanning threads (so we don't overload the VM in really busy areas)
NPCXPPerSkillRank int (25) Amount of XP an NPC requires per skill rank level: (rank + 1) * NPCXPPerSkillRank
Verbosity int (0) How much do you like log traces? range: 0-3




Filters and Actions:

asFilter: asAction: Default: Details:

Locations n/a n/a Only an exclusion filter, always applied, cannot be disabled only custom additions. *6

Custom Loot True A completely empty list for you to add the specific things you want to loot using the AddToFilter function
Custom ToShip False Send items in this filter to the home ship (if in range)

Terminals Hack True Automagically hack locked terminals. *2, *3, *7, *8
Doors Pick True Automagically pick locked doors. *2, *3, *7, *8

Containers Pick True Automagically pick locked containers. *2, *3, *7, *8
Containers Search True Search containers for loot.

Actors Search True Search dead bodies for loot.

Valuables Loot True Loot digipicks and credits.
Collectables Loot True Loot collectable items.

Contraband Smuggle False Loot contraband items.
Contraband ToShip True Send items in this filter to the home ship (if in range)

ValueJunk Loot True Loot weightless junk items with a non-zero value.
ValueJunk ToShip True Send items in this filter to the home ship (if in range)

Junk Loot False Loot junk items.
Junk ToShip True Send items in this filter to the home ship (if in range)


Resources Loot True Loot all those crafting mats!
Resources ToShip True Send items in this filter to the home ship (if in range)

Flora Harvest True Picks all the pretty flowers - don't forget these crafting mats too!
Flora ToShip True Send items in this filter to the home ship (if in range)

Mining Harvest True Harvest all that ore - Requires the proper tools or powers. *9
Mining ToShip True Send items in this filter to the home ship (if in range)


Keys Loot True Loot keys to locks.
Keys ToShip False Send items in this filter to the home ship (if in range)

Books Loot True Loot data slates and books.
Books Bypass True Bypass normal activation behaviour (opening the book).
Books ToShip True Send items in this filter to the home ship (if in range)

Aid Loot True Loot aid items.
Aid ToShip False Send items in this filter to the home ship (if in range)

Chems Loot True Loot drugs.
Chems ToShip False Send items in this filter to the home ship (if in range)

Food Loot False Loot food items.
Food ToShip True Send items in this filter to the home ship (if in range)

Booze Loot False Loot alchoholic beverages.
Booze ToShip True Send items in this filter to the home ship (if in range)

Drinks Loot False Loot non-alchoholic beverages.
Drinks ToShip True Send items in this filter to the home ship (if in range)

Epic Loot True Loot lengendary items specifically.
Epic ToShip False Send items in this filter to the home ship (if in range)

Apparel Loot False Loot clothing items.
Apparel ToShip True Send items in this filter to the home ship (if in range)

Neuroamps Loot False Loot neuroamps.
Neuroamps ToShip True Send items in this filter to the home ship (if in range)

Helmets Loot False Loot spacesuit helmets.
Helmets ToShip True Send items in this filter to the home ship (if in range)

Packs Loot False Loot spacesuit backpacks.
Packs ToShip True Send items in this filter to the home ship (if in range)

Suits Loot False Loot spacesuits.
Suits ToShip True Send items in this filter to the home ship (if in range)

Ammo Loot True Loot ammunition.
Ammo ToShip False Send items in this filter to the home ship (if in range)

AssaultRifles Loot False Loot assault rifles.
AssaultRifles ToShip True Send items in this filter to the home ship (if in range)

Automatics Loot False Loot automatic weapons.
Automatics ToShip True Send items in this filter to the home ship (if in range)

Ballistics Loot False Loot ballistic weapons.
Ballistics ToShip True Send items in this filter to the home ship (if in range)

Chemical Loot False Loot chemical weapons. *4
Chemical ToShip True Send items in this filter to the home ship (if in range)

Cryo Loot False Loot cryogenic weapons.
Cryo ToShip True Send items in this filter to the home ship (if in range)

EMWeap Loot False Loot electro-magnetic weapons.
EMWeap ToShip True Send items in this filter to the home ship (if in range)

Explosives Loot False Loot explosives.
Explosives ToShip True Send items in this filter to the home ship (if in range)

Fire Loot False Loot incendiary weapons.
Fire ToShip True Send items in this filter to the home ship (if in range)

HeavyGun Loot False Loot heavy guns.
HeavyGun ToShip True Send items in this filter to the home ship (if in range)

Lasers Loot False Loot laser weapons.
Lasers ToShip True Send items in this filter to the home ship (if in range)

Melee Loot False Loot melee weapons.
Melee ToShip True Send items in this filter to the home ship (if in range)

Mines Loot True Loot mines. *5
Mines ToShip False Send items in this filter to the home ship (if in range)

Miniguns Loot False Loot miniguns.
Miniguns ToShip True Send items in this filter to the home ship (if in range)

Particle Loot False Loot partical weapons.
Particle ToShip True Send items in this filter to the home ship (if in range)

Pistols Loot False Loot pistols.
Pistols ToShip True Send items in this filter to the home ship (if in range)

Rifles Loot False Loot rifles.
Rifles ToShip True Send items in this filter to the home ship (if in range)

Shotguns Loot False Loot shotguns.
Shotguns ToShip True Send items in this filter to the home ship (if in range)

Sniper Loot False Loot sniper rifles.
Sniper ToShip True Send items in this filter to the home ship (if in range)

Thrown Loot True Loot thrown weapons.
Thrown ToShip False Send items in this filter to the home ship (if in range)

Toolgrip Loot False Loot toolgrip weapons.
Toolgrip ToShip True Send items in this filter to the home ship (if in range)

Unarmed Loot False Loot unarmed "weapons".
Unarmed ToShip True Send items in this filter to the home ship (if in range)




Notes:

*1 The time it takes the complete a scan is highly variable, in some areas and some cases it can take a few seconds to complete all the different scans, in others it can take more than a minute. Generally speaking, the more densely packed or dynamically generated an area, the longer a scan can take.

*2 Or use the key if possessed.

*3 The player's team requires Digipicks and the appropriate Security or Theft skill level. Additional Digipicks may be used to simulate making mistakes for locks higher level than novice at a rate of 5% per lock level per lock level. For those interested in the breakdown, here it is:
Level: Skill Level: Keys: Determination:
Unlocked: - 0 0
Novice: 1 1 1
Advanced: 2 1-2 1 + 1 (5%)
Expert: 3 1-3 1 + 1 (5%) + 1 (10%)
Master: 4 1-4 1 + 1 (5%) + 1 (10%) + 1 (15%)

*4 This includes toxic, poison, etc.

*5 If placed and armed mines are currently not looted, this is because they are actually "placed hazards" and there is no way to get the mine (weapon) from the "placed hazard" at this time.

*6 Default Locations filter:
Player Home Ship
Player Outposts
New Atlantis - The Lodge
Akila City - The Core Residence
Akila City - The Stretch Apartment
Neon City - Trade Tower: Player Housing

*7 Followers can help with the following actions:

Hacking/Picking
NPCs don't have a Security skill and LSSL will instead use the NPCs Theft skill, if they have at least rank 1.

*8 NPC skills require 25 (NPCXPPerSkillRank) XP per skill rank level to increase their rank.

*9 Mining requires at least one member of the team to have the Starborn Power "Elemental Pull" or a cutter in their inventory.




FAQ / Known Issues:


Q - Location XYZ did not get looted.
A - Some locations are excluded from looting. See notes on the "Locations" filter above.


Q - Location XYZ isn't filtered and it still did not get looted!
A - This mostly happens with interiors of certain POIs and mainly with the mining filter. The nodes are found. The spell is cast on them. The engine just says "eff-ewe!" Not sure what else I can tell you. I have found that sometimes saving, exiting the game (all the way to the desktop) and loading the game will sometimes allow the nodes to be properly harvested. In other situations you will just have to do it manually. There is only so much I can do based on what the engine let's me do, I'm sorry.


Q - Item X got looted by filter Y or Item X did not get looted filter Y.
A - That's not a question however, some items may fall into multiple categories. Aurora is a chem and contraband so it will be looted by either filter.


Q - How do I add X to filter Y?
A - See the "AddToFilter" function outlined above.


Q - How do I exclude X from filter Y?
A - See the "AddToExclusion" function outlined above.


Q - I keep seeing notifications like "Fiber (Stalk) Added" but there is nothing in my inventory - wth?
A - Plant harvesting and mining needs to be done by an actor. That actor is the player. The reason you can't find the item in your inventory is you have the "ToShip" action for the those filters set to true, you are in range of your ship and thus, the item is immediately sent from the players inventory to the ships cargo hold.


Q - How do I change the "ToShip" range?
A - It uses the same game setting as the normal remote ship inventory access. The default is 250.0
SetGS "fMaxShipTransferDistance" float


Q - How do I disable the "ToShip" action?
A - You can use the individual filter "ToShip" action or all filters "ToShip" action functions.
cgf "LSSL:Interface.SetFilterAction" "Books" "ToShip" False
cgf "LSSL:Interface.SetAllFiltersByAction" "ToShip" False


Q - I thought followers were supposed to level up their Theft skill, why aren't they?
A - That's a very good question. The code is "correct", the scripts all "work", the engine just refuses to increase the perk rank - I'm not sure why.


Q - I thought you said the invisible bodies issue was fixed, nya-nya!
A - I thought it was. It's those "not playable" pieces of gear that leave them invisible when looted. I even tried specifically applying a visible skin to those actors if a piece of non-playable armor or apparel is looted and it still did not work. I suspect the engine simply does not give them a visible body mesh as an internal optimization and there may be nothing that can be done about it. I certainly have not found a solution at the time of writing this.


Q - I keep seeing this error in the Papyrus.0.log:
[00:00:00] error: Unbound scripts cannot start timers
stack:
[None].FXScripts:FXResourceCollectionVisuals.StartTimer() - "" Line ?
[None].FXScripts:FXResourceCollectionVisuals.OnEffectStart() - "E:\BuildAgent\work\4c7f7506a0fb268b\Source\Scripts\FXScripts\FXResourceCollectionVisuals.psc" Line 38

A - The mining filter uses the vanilla "Elemental Pull" spell. However, it's invoking it directly and not through the normal Starborn Power action. Bethesda didn't expect it to be used this way and didn't put sanity checks in for this non-standard usage. While annoying, this is a harmless error. I may look into cloning the spell and effect but I need to do more research first on how all these systems fully interact.


Q - I occasionally see errors in the Papyrus.0.log with a common element:
[Item # in container (00000014)].ObjectReference.SomeFunction() - "" Line ?
[ (??00093E)].LSSL:LootEntry.__LootObjects() - "E:\Projects\Starfield\LooterShooter\SF\Data\Scripts\Source\User\LSSL\LootEntry.psc" Line ?
...

Q - I occasionally see errors in the Papyrus.0.log with a common element:
[ (00101CB6)].VisualEffect.Play() - "" Line ?
[ (??00093E)].LSSL:LootEntry.__LootObjects() - "E:\Projects\Starfield\LooterShooter\SF\Data\Scripts\Source\User\LSSL\LootEntry.psc" Line ?
...

A - The TD;LR is - These two particular classes of error are harmless and can be safely ignored.

Now to the long answer...
The Item number isn't important only whether it's "container (00000014)" (the player) and/or that it's the Visual Effect.
What the error is basically telling you is that the object has already been put in the players pocket and the function being called is no longer valid as a result.

The even longer answer...
The multithreaded design of the mod and that some items may be looted by multiple filters - that is to say, one filter will loot it before the other in the same looting cycle.
I try and catch these but multithreading is a hyrda and these things can slip past the methods we have available to us to guard against them.





StarfieldCustom.ini Edits:

First, the file itself can be found in...
...Windows users: %UserProfile%\Documents\My Games\Starfield\
...Other platforms: ?


This must be done:

[Archive]
bInvalidateOlderFiles=1
sResourceDataDirsFinal=


Using sTestFile to enable the mod:

1) Don't
2) Goto Plugins.txt instructions


Enable Papyrus Logging (optional, as required):

Logs themselves will be in a new sub-folder called "Logs" in the same location (after the next time you start the game).

The main script log is : Logs\Script\Papyrus.0.log
The main log LSSL uses will be : Logs\Script\User\LSSL.0.log
Settings exports will be to : Logs\Script\User\LSSL_Settings.0.log

[Papyrus]
bEnableLogging=1
bEnableTrace=1
bLoadDebugInformation=1




Example Hotkeys:

[Macros]
closeLoot=cgf "LSSL:Interface.SetFloatControl" "ScanRadius" 5.0 ; cgf "LSSL:Interface.SetFloatControl" "ScanTimeout" 60.0 ; cgf "Debug.Notification" "Close Loot"
normalLoot=cgf "LSSL:Interface.SetFloatControl" "ScanRadius" 25.0 ; cgf "LSSL:Interface.SetFloatControl" "ScanTimeout" 60.0 ; cgf "Debug.Notification" "Normal Loot"
superLoot=cgf "LSSL:Interface.SetFloatControl" "ScanRadius" 250.0 ; cgf "LSSL:Interface.SetFloatControl" "ScanTimeout" 6000.0 ; cgf "Debug.Notification" "Super Loot"
touchTheft=cgf "LSSL:Interface.SetAllFiltersByAction" "Loot" false ; cgf "LSSL:Interface.SetAllFiltersByAction" "Search" false ; cgf "LSSL:Interface.SetFloatControl" "ScanRadius" 1.5 ; cgf "LSSL:Interface.SetBoolControl" "AllowStealing" True ; cgf "Debug.Notification" "Touch Theft"
restoreNormalLoot=cgf "LSSL:Interface.SetBoolControl" "AllowStealing" False ; cgf "LSSL:Interface.SetAllFiltersByAction" "Loot" true ; cgf "LSSL:Interface.SetAllFiltersByAction" "Search" true ; cgf "Debug.Notification" "Restore Normal Loot"

[Hotkeys]
F2=cgf "LSSL:Interface.TryScanNow" False True ; cgf "Debug.Notification" "Scanning"
Ctrl-F2=closeLoot
Ctrl-F3=normalLoot
Ctrl-F4=superLoot
Shift-F2=cgf "LSSL:Interface.CancelScan"
Shift-F3=cgf "LSSL:Debugger.ResetLootedFlagInArea" 1000.0 ; cgf "Debug.Notification" "Resetting loot flag"
F10=cgf "LSSL:Interface.QueryState" "General"
Ctrl-F10=touchTheft
Ctrl-F11=restoreNormalLoot
Ctrl-F12=cgf "LSSL:Interface.SetAllFilters" True ; cgf "Debug.Notification" "All filters true"