commit
e331108089
7 changed files with 292 additions and 0 deletions
@ -0,0 +1 @@ |
|||||||
|
/meta.ini |
Binary file not shown.
@ -0,0 +1,9 @@ |
|||||||
|
## Pickup Helper |
||||||
|
|
||||||
|
Picks up loose gold, arrows, ingredients, flora, leather, hides, and ingots of the same type. |
||||||
|
|
||||||
|
Inspired by dylbill's [Take All Loose Gold and Arrows](https://www.nexusmods.com/skyrimspecialedition/mods/22680), but approaches certain tasks differently. Made mainly for personal use, hence the lack of customization. |
||||||
|
|
||||||
|
- Pickup Helper is based on a perk with the Activate entrypoint instead of using [OnItemAdded](https://ck.uesp.net/wiki/OnItemAdded_-_ObjectReference). |
||||||
|
- Picks up wider range of items, becoming a simple autoloot helper as well. |
||||||
|
- Does not rely on pre-defined item lists and uses automatic detection more extensively. |
Binary file not shown.
Binary file not shown.
@ -0,0 +1,194 @@ |
|||||||
|
Scriptname ETAxPlayerAliasScript extends ReferenceAlias |
||||||
|
|
||||||
|
int iFloraCount = 0 |
||||||
|
int iArrowCount = 0 |
||||||
|
|
||||||
|
event OnInit() |
||||||
|
PlayerRef.AddPerk(ETAxTakePerk) |
||||||
|
RegisterForSingleUpdate(10.0) |
||||||
|
endevent |
||||||
|
|
||||||
|
event OnPlayerLoadGame() |
||||||
|
RegisterForSingleUpdate(10.0) |
||||||
|
endevent |
||||||
|
|
||||||
|
event OnUpdate() |
||||||
|
ScanPouches() |
||||||
|
ScanArrows() |
||||||
|
endevent |
||||||
|
|
||||||
|
function ScanArrows() |
||||||
|
|
||||||
|
Form[] aItems = PO3_SKSEfunctions.GetAllForms(42) ; ammo |
||||||
|
int i = aItems.Length |
||||||
|
|
||||||
|
if iArrowCount == i |
||||||
|
return |
||||||
|
endif |
||||||
|
|
||||||
|
iArrowCount = i |
||||||
|
|
||||||
|
Projectile arrowProjectile |
||||||
|
ETAxArrowList.Revert() |
||||||
|
|
||||||
|
while i > 0 |
||||||
|
i -= 1 |
||||||
|
if aItems[i].IsPlayable() |
||||||
|
|
||||||
|
ETAxArrowList.AddForm(aItems[i]) |
||||||
|
|
||||||
|
arrowProjectile = (aItems[i] as Ammo).GetProjectile() |
||||||
|
|
||||||
|
if arrowProjectile && ! ETAxArrowList.HasForm(arrowProjectile) |
||||||
|
ETAxArrowList.AddForm(arrowProjectile) |
||||||
|
endif |
||||||
|
|
||||||
|
endif |
||||||
|
endwhile |
||||||
|
|
||||||
|
endfunction |
||||||
|
|
||||||
|
function ScanPouches() |
||||||
|
|
||||||
|
Form[] aItems = PO3_SKSEfunctions.GetAllForms(39) ; flora |
||||||
|
int i = aItems.Length |
||||||
|
|
||||||
|
if iFloraCount == i |
||||||
|
return |
||||||
|
endif |
||||||
|
|
||||||
|
iFloraCount = i |
||||||
|
|
||||||
|
SoundDescriptor refSound |
||||||
|
ETAxGoldList.Revert() |
||||||
|
|
||||||
|
While i > 0 |
||||||
|
i -= 1 |
||||||
|
refSound = (aItems[i] as Flora).GetHarvestSound() |
||||||
|
if refSound && ETAxPouchSounds.Find(refSound) != -1 && ! ETAxGoldList.HasForm(aItems[i]) |
||||||
|
ETAxGoldList.AddForm(aItems[i]) |
||||||
|
endif |
||||||
|
Endwhile |
||||||
|
|
||||||
|
endfunction |
||||||
|
|
||||||
|
function TakeByArray(ObjectReference[] aRefs, bool bCheckWeight = false) |
||||||
|
|
||||||
|
float fDelay = ETAxPickUpDelay.Value |
||||||
|
int i = aRefs.Length |
||||||
|
|
||||||
|
While i > 0 |
||||||
|
i -= 1 |
||||||
|
if aRefs[i].IsEnabled() && aRefs[i].Is3DLoaded() |
||||||
|
if fDelay > 0 |
||||||
|
Utility.wait(fDelay) |
||||||
|
endif |
||||||
|
if ! bCheckWeight || aRefs[i].GetBaseObject().GetWeight() <= ETAxWeightLimit.Value |
||||||
|
aRefs[i].Activate(PlayerRef) |
||||||
|
endif |
||||||
|
endif |
||||||
|
Endwhile |
||||||
|
|
||||||
|
endfunction |
||||||
|
|
||||||
|
function PickFloraByType(Form rBase) |
||||||
|
|
||||||
|
int iType = rBase.GetType() |
||||||
|
Form pickedIngredient |
||||||
|
|
||||||
|
if iType == 38 ; tree |
||||||
|
pickedIngredient = (rBase as TreeObject).GetIngredient() |
||||||
|
elseif iType == 39 ; flora |
||||||
|
pickedIngredient = (rBase as Flora).GetIngredient() |
||||||
|
else |
||||||
|
return |
||||||
|
endif |
||||||
|
|
||||||
|
ObjectReference[] aRefs = PO3_SKSEfunctions.FindAllReferencesOfFormType(PlayerRef, iType, ETAxPickUpRadius.Value * 1.5) |
||||||
|
int i = aRefs.Length |
||||||
|
float fDelay = ETAxPickUpDelay.Value |
||||||
|
Form refIngredient |
||||||
|
|
||||||
|
while i > 0 |
||||||
|
i -= 1 |
||||||
|
|
||||||
|
if aRefs[i].GetBaseObject() == rBase |
||||||
|
|
||||||
|
if ! aRefs[i].IsHarvested() && aRefs[i].IsEnabled() && aRefs[i].Is3DLoaded() |
||||||
|
if fDelay > 0 |
||||||
|
Utility.wait(fDelay) |
||||||
|
endif |
||||||
|
aRefs[i].Activate(PlayerRef) |
||||||
|
endif |
||||||
|
|
||||||
|
else |
||||||
|
|
||||||
|
if iType == 38 ; tree |
||||||
|
refIngredient = (aRefs[i].GetBaseObject() as TreeObject).GetIngredient() |
||||||
|
else |
||||||
|
refIngredient = (aRefs[i].GetBaseObject() as Flora).GetIngredient() |
||||||
|
endif |
||||||
|
|
||||||
|
if refIngredient == pickedIngredient && ! aRefs[i].IsHarvested() && aRefs[i].IsEnabled() && aRefs[i].Is3DLoaded() |
||||||
|
if fDelay > 0 |
||||||
|
Utility.wait(fDelay) |
||||||
|
endif |
||||||
|
aRefs[i].Activate(PlayerRef) |
||||||
|
endif |
||||||
|
|
||||||
|
endif |
||||||
|
|
||||||
|
endwhile |
||||||
|
|
||||||
|
endfunction |
||||||
|
|
||||||
|
function PickFloraByTypeIdAndIngredient(int iType, Form fIngredient) |
||||||
|
|
||||||
|
ObjectReference[] aRefs = PO3_SKSEfunctions.FindAllReferencesOfFormType(PlayerRef, iType, ETAxPickUpRadius.Value * 1.5) |
||||||
|
int i = aRefs.Length |
||||||
|
float fDelay = ETAxPickUpDelay.Value |
||||||
|
Form refIngredient |
||||||
|
|
||||||
|
while i > 0 |
||||||
|
i -= 1 |
||||||
|
|
||||||
|
if iType == 38 ; tree |
||||||
|
refIngredient = (aRefs[i].GetBaseObject() as TreeObject).GetIngredient() |
||||||
|
else |
||||||
|
refIngredient = (aRefs[i].GetBaseObject() as Flora).GetIngredient() |
||||||
|
endif |
||||||
|
|
||||||
|
if refIngredient == fIngredient && ! aRefs[i].IsHarvested() && aRefs[i].IsEnabled() && aRefs[i].Is3DLoaded() |
||||||
|
if fDelay > 0 |
||||||
|
Utility.wait(fDelay) |
||||||
|
endif |
||||||
|
aRefs[i].Activate(PlayerRef) |
||||||
|
endif |
||||||
|
|
||||||
|
endwhile |
||||||
|
|
||||||
|
endfunction |
||||||
|
|
||||||
|
function TakeByFormOrList(Form formOrList) |
||||||
|
TakeByArray(PO3_SKSEfunctions.FindAllReferencesOfType(PlayerRef, formOrList, ETAxPickUpRadius.Value)) |
||||||
|
endfunction |
||||||
|
|
||||||
|
function TakeByKeyword(Form keywordOrList, bool bCheckWeight = false) |
||||||
|
TakeByArray(PO3_SKSEfunctions.FindAllReferencesWithKeyword(PlayerRef, keywordOrList, ETAxPickUpRadius.Value, false), bCheckWeight) |
||||||
|
endfunction |
||||||
|
|
||||||
|
function TakeByFormType(int iFormType) |
||||||
|
TakeByArray(PO3_SKSEfunctions.FindAllReferencesOfFormType(PlayerRef, iFormType, ETAxPickUpRadius.Value)) |
||||||
|
endfunction |
||||||
|
|
||||||
|
Actor Property PlayerRef Auto |
||||||
|
|
||||||
|
Perk Property ETAxTakePerk Auto |
||||||
|
|
||||||
|
GlobalVariable Property ETAxPickUpDelay Auto |
||||||
|
GlobalVariable Property ETAxPickUpRadius Auto |
||||||
|
GlobalVariable Property ETAxWeightLimit Auto |
||||||
|
|
||||||
|
FormList Property ETAxPouchSounds Auto |
||||||
|
FormList Property ETAxGoldList Auto |
||||||
|
FormList Property ETAxArrowList Auto |
@ -0,0 +1,88 @@ |
|||||||
|
;BEGIN FRAGMENT CODE - Do not edit anything between this and the end comment |
||||||
|
;NEXT FRAGMENT INDEX 36 |
||||||
|
Scriptname PRKF_ETAxTakePerk_02000805 Extends Perk Hidden |
||||||
|
|
||||||
|
;BEGIN FRAGMENT Fragment_33 |
||||||
|
Function Fragment_33(ObjectReference akTargetRef, Actor akActor) |
||||||
|
;BEGIN CODE |
||||||
|
PlayerScript.TakeByKeyword(VendorItemAnimalHide, true) |
||||||
|
;END CODE |
||||||
|
EndFunction |
||||||
|
;END FRAGMENT |
||||||
|
|
||||||
|
;BEGIN FRAGMENT Fragment_15 |
||||||
|
Function Fragment_15(ObjectReference akTargetRef, Actor akActor) |
||||||
|
;BEGIN CODE |
||||||
|
; Ingredients |
||||||
|
; This fails on dropped items, looking for a proper way to detect them |
||||||
|
Form rBase = akTargetRef.GetBaseObject() |
||||||
|
if rBase |
||||||
|
PlayerScript.TakeByFormOrList(rBase) |
||||||
|
;PlayerScript.PickFloraByTypeIdAndIngredient(38, rBase) ; tree |
||||||
|
;PlayerScript.PickFloraByTypeIdAndIngredient(39, rBase) ; flora |
||||||
|
else |
||||||
|
PlayerScript.TakeByFormType(30) |
||||||
|
endif |
||||||
|
;END CODE |
||||||
|
EndFunction |
||||||
|
;END FRAGMENT |
||||||
|
|
||||||
|
;BEGIN FRAGMENT Fragment_6 |
||||||
|
Function Fragment_6(ObjectReference akTargetRef, Actor akActor) |
||||||
|
;BEGIN CODE |
||||||
|
; Arrows and projectiles |
||||||
|
PlayerScript.TakeByFormOrList(ETAxArrowList) |
||||||
|
;END CODE |
||||||
|
EndFunction |
||||||
|
;END FRAGMENT |
||||||
|
|
||||||
|
;BEGIN FRAGMENT Fragment_3 |
||||||
|
Function Fragment_3(ObjectReference akTargetRef, Actor akActor) |
||||||
|
;BEGIN CODE |
||||||
|
PlayerScript.TakeByFormOrList(ETAxGoldList) |
||||||
|
;END CODE |
||||||
|
EndFunction |
||||||
|
;END FRAGMENT |
||||||
|
|
||||||
|
;BEGIN FRAGMENT Fragment_12 |
||||||
|
Function Fragment_12(ObjectReference akTargetRef, Actor akActor) |
||||||
|
;BEGIN CODE |
||||||
|
PlayerScript.TakeByKeyword(VendorItemOreIngot, true) |
||||||
|
;END CODE |
||||||
|
EndFunction |
||||||
|
;END FRAGMENT |
||||||
|
|
||||||
|
;BEGIN FRAGMENT Fragment_18 |
||||||
|
Function Fragment_18(ObjectReference akTargetRef, Actor akActor) |
||||||
|
;BEGIN CODE |
||||||
|
; Flora |
||||||
|
if ! akTargetRef.IsActivationBlocked() |
||||||
|
PlayerScript.PickFloraByType(akTargetRef.GetBaseObject()) |
||||||
|
endif |
||||||
|
;END CODE |
||||||
|
EndFunction |
||||||
|
;END FRAGMENT |
||||||
|
|
||||||
|
;BEGIN FRAGMENT Fragment_31 |
||||||
|
Function Fragment_31(ObjectReference akTargetRef, Actor akActor) |
||||||
|
;BEGIN CODE |
||||||
|
PlayerScript.TakeByFormOrList(Lockpick) |
||||||
|
;END CODE |
||||||
|
EndFunction |
||||||
|
;END FRAGMENT |
||||||
|
|
||||||
|
;END FRAGMENT CODE - Do not edit anything between this and the begin comment |
||||||
|
|
||||||
|
ETAxPlayerAliasScript Property PlayerScript Auto |
||||||
|
|
||||||
|
Actor Property PlayerRef Auto |
||||||
|
|
||||||
|
FormList Property ETAxGoldList Auto |
||||||
|
|
||||||
|
FormList Property ETAxArrowList Auto |
||||||
|
|
||||||
|
Keyword Property VendorItemOreIngot Auto |
||||||
|
|
||||||
|
MiscObject Property Lockpick Auto |
||||||
|
|
||||||
|
Keyword Property VendorItemAnimalHide Auto |
Loading…
Reference in new issue