Je cherche à exécuter un script en arrière-plan qui détecte les différents acteurs morts autour du joueur (plus de détails ici).
Le script est terminé (à quelques ajustements près), mais malheureusement, je ne vois pas sur quoi "attacher" ce script, n'y même d'ailleurs de quoi je dois l'hériter.
J'ai essayé depuis un sort, mais cela ne fonctionne pas. Le sort se terminant aussitôt, l'event OnUpdate() n'est jamais appelé (enfin, c'est ce que j'en ai déduit).
J'ai essayé avec une quête.
Cela fonctionne très bien, mais à la moindre mise à jour ou changement dans le mod, des problème surviennent (modifications non prises en compte la plupart du temps) réduisant à néant l'intérêt du mod.
De plus, impossible de le désinstaller par la suite ! Ceci dit, j'ai peut-être louper un détail.
Donc voilà, j'aimerai avoir l'avis de personnes qui ont plus de connaissances sur Papyrus.
Voici la version actuelle du script (basé sur ActiveMagicEffect) :
Scriptname AutoPicker extends ActiveMagicEffect Actor Property PlayerRef Auto FormList Property Items Auto GlobalVariable Property CheckingEnabled Auto GlobalVariable Property CheckingDelay Auto GlobalVariable Property CheckingRadius Auto GlobalVariable Property AutoLootEnabled Auto Event OnEffectStart(Actor akTarget, Actor akCaster) If ( CheckingEnabled.GetValue() != 0 ) Debug.Notification("AutoPicker CheckingEnabled") CheckingEnabled.SetValue(1) RegisterForSingleUpdate(CheckingDelay.GetValue()) Else Debug.Notification("AutoPicker disabled") CheckingEnabled.SetValue(0) EndIf EndEvent Event OnUpdate() Actor actorRef = GetNearestActor() If ( CanBeLoot(actorRef) && HasLoot(actorRef) ) Debug.Notification("Actor has loot") If (AutoLootEnabled.GetValue() != 0) TransferItems(Items, actorRef, PlayerRef) EndIf EndIf If ( CheckingEnabled.GetValue() != 0) RegisterForSingleUpdate(CheckingDelay.GetValue()) EndIf EndEvent Actor Function GetNearestActor() Return Game.FindRandomActorFromRef(PlayerRef, CheckingRadius.GetValue()) EndFunction Bool Function CanBeLoot(Actor akActor) ;If (akActor == None) ; Return False ;Else ; If (akActor.IsDead()) ; Return True ; Else ; Return False ; EndIf ;EndIf Return (akActor != None && akActor.IsDead()) EndFunction Bool Function HasLoot(Actor akActor) Return akActor.GetItemCount(Items) > 0 EndFunction Function TransferItems(FormList akItems, Actor akOrigin, Actor akDestination) Int itemCount = 0 Int i = akItems.GetSize() While i > 0 i -= 1 Form item = akItems.GetAt(i) itemCount = akOrigin.GetItemCount(item) If ( itemCount > 0) akOrigin.RemoveItem(item, itemCount) akDestination.AddItem(item, itemCount) EndIf EndWhile EndFunction
Merci d'avance