En règle générale, je laisse les sources des scripts dans mes mods histoire que les moddeurs puissent regarder comment c'est fait.
Le script vient d'être remanié pour modifier la prise en compte des objets permettant de porter des potions. Il faut que ceux-ci soient équipés. Je teste et je posterai le nouveau.
Pour les parchemins, certains objets permettront den porter plus sans être équipés.
Le lisez-moi essaiera d'être le plus complet possible afin d'éviter tout soucis.
EDIT : le script remanié pour les curieux.
Une petite explication :
► Afficher le texte
La mise à jour de la liste des types de potions détenues ainsi que le suivi de l'éventuel bonus en emport de potion est suivi même si la gestion des potions est désactivée.
la variable modelgestpotion sert à savoir si la fonction est activée ou non par le menu.
la variable modelgestpotionAUT correspond au nombre max de potions que le joueur peut porter sans accessoires. Cette valeur est réglée dans le menu.
la variable modelPotionsBONUS correspond au nombre de potions supplémentaires pouvant être portées. Cette valeur est modifiée quand on équipe ou déséquipe un objet possédant un des mots-clés apportant ce bonus.
la formlist modelPOTIONSvanilla contient toutes les potions, boissons et la nourriture du jeu vanilla. Elle sert, au moment de l'initialisation, à remplir le tableau POTIONS avec les form des potions vanilla dans l'inventaire. Cela permet une activation du mod sur une partie déjà en cours (en considérant que le joueur ne porte pas que des potions moddées).
Quand on ajoute ou retire une potion de l'inventaire, le tableau est mis à jour.
Ce tableau ne sert que dans le cas où la valeur max + bonus de potions portées diminue et passe en-dessous du nombre de potions détenues. Dans ce cas, le script balaie la liste et retire assez de potions pour repasser à un nombre cohérent de potions.
Le script :
► Afficher le texte
Code : Tout sélectionner
Scriptname modelpotionsscript extends ReferenceAlias
actor property playerref auto
globalvariable property modelgestpotion auto
globalvariable property modelgestpotionAUT auto
globalvariable property modelPotionsBONUS auto
Formlist property modelPOTIONSvanilla auto
Form[] Property POTIONS Auto
keyword property SEI_potions5 auto
keyword property SEI_potions10 auto
keyword property SEI_potions15 auto
keyword property SEI_potions30 auto
int lance = 0
int nbpotions = 0
int nb
int retrait
int initialisation = 0
import debug
import utility
function posepotion(form akbaseitem, int nbr, objectreference aksourcecontainer)
retrait = 1
if !aksourcecontainer || aksourcecontainer as actor
objectreference droppotion = playerref.dropobject(akbaseitem, nbr)
droppotion.moveto(playerref, 0, 10,10)
else
playerref.removeitem(akbaseitem, nbr, true, aksourcecontainer)
endif
wait(0.1)
retrait = 0
endfunction
function MAJliste(form akbaseitem)
int x = 0
int trouv = 0
while (x < potions.length)
if potions[x] == akbaseitem
trouv = 1
endif
x += 1
endwhile
if trouv == 0 && nb < potions.length
;if potions[nb] == none
potions[nb] = akbaseitem
nb += 1
if nb == potions.length
nb = 0
endif
;endif
endif
endfunction
function SUPlist(form akbaseitem)
int x = 0
int trouv = 0
while (x < potions.length)
if potions[x] == akbaseitem
trouv = x
endif
x += 1
endwhile
if trouv != 0
potions[trouv] = none
endif
endfunction
function TROPpotions(objectreference destination)
if modelgestpotion.getvalueint() == 1
int x = potions.length - 1
while (nbpotions > (modelgestpotionAUT.getvalueint() + modelPotionsBONUS.getvalueint())) || x != -1
int trop = nbpotions - (modelgestpotionAUT.getvalueint() + modelPotionsBONUS.getvalueint())
int vire = 0
if potions[x] != none && playerref.getitemcount(potions[x]) > 0
if trop > playerref.getitemcount(potions[x])
vire = playerref.getitemcount(potions[x])
else
vire = trop
endif
posepotion(potions[x], vire, destination)
nbpotions = nbpotions - vire
if nbpotions < 0
nbpotions = 0
endif
endif
x -= 1
endwhile
endif
endfunction
function affich()
int nbp = modelgestpotionAUT.getvalueint() + modelPotionsBONUS.getvalueint()
notification(nbpotions + "/" + nbp + " potions.")
endfunction
event oninit()
if initialisation == 0 && modelgestpotion.getvalueint() == 1
initialisation = 1
int index = 0
nb = 0
nbpotions = 0
While (index < modelPOTIONSvanilla.GetSize())
if playerref.getitemcount(modelPOTIONSvanilla.GetAt(index)) > 0
nbpotions = nbpotions + playerref.getitemcount(modelPOTIONSvanilla.GetAt(index))
potions[nb] = modelPOTIONSvanilla.GetAt(index)
nb += 1
if nb == potions.length
nb = 0
endif
endif
index = index + 1
EndWhile
int nbp = modelgestpotionAUT.getvalueint() + modelPotionsBONUS.getvalueint()
if nbpotions > 0
messagebox("SEI - Gestion des potions - " + nbpotions + " potions détectées. Initialisation incorrecte. Fonction désactivée. VEUILLEZ RETIRER TOUTES LES POTIONS, POISONS, BOISSONS AINSI QUE LA NOURRITURE DE L'INVENTAIRE AVANT D'ACTIVER CETTE FONCTIONNALITE.")
modelgestpotion.setvalueint(0)
initialisation = 0
else
notification("SEI - Gestion des potions initialisée.")
endif
endif
endevent
Event OnItemAdded(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer)
if akbaseitem as potion
int trop = 0
if (nbpotions == (modelgestpotionAUT.getvalueint() + modelPotionsBONUS.getvalueint())) && modelgestpotion.getvalueint() == 1
posepotion(akbaseitem, aiitemcount, aksourcecontainer)
trop = 1
if (nbpotions > modelgestpotionAUT.getvalueint() + modelPotionsBONUS.getvalueint())
TROPpotions(none)
endif
affich()
elseif ((nbpotions + aiitemcount) > (modelgestpotionAUT.getvalueint() + modelPotionsBONUS.getvalueint())) && modelgestpotion.getvalueint() == 1
int nbu = ((aiItemCount + nbpotions) - (modelgestpotionAUT.getvalueint() + modelPotionsBONUS.getvalueint()))
nbpotions = modelgestpotionAUT.getvalueint() + modelPotionsBONUS.getvalueint()
posepotion(akbaseitem, nbu, aksourcecontainer)
affich()
else
nbpotions = nbpotions + aiitemcount
endif
if trop == 0
MAJliste(akbaseitem)
else
trop = 0
endif
;if modelgestpotion.getvalueint() == 1
; affich()
;endif
endif
endEvent
Event OnObjectEquipped(Form akBaseObject, ObjectReference akReference)
if akBaseObject.haskeyword(SEI_potions5)
modelPotionsBONUS.setvalueint(modelPotionsBONUS.getvalueint() + 5)
affich()
endif
if akBaseObject.haskeyword(SEI_potions10)
modelPotionsBONUS.setvalueint(modelPotionsBONUS.getvalueint() + 10)
affich()
endif
if akBaseObject.haskeyword(SEI_potions15)
modelPotionsBONUS.setvalueint(modelPotionsBONUS.getvalueint() + 15)
affich()
endif
if akBaseObject.haskeyword(SEI_potions30)
modelPotionsBONUS.setvalueint(modelPotionsBONUS.getvalueint() + 30)
affich()
endif
endEvent
Event OnItemRemoved(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer)
if akbaseitem as potion && retrait == 0
nbpotions = nbpotions - aiItemCount
if nbpotions < 0
nbpotions = 0
endif
if playerref.getitemcount(akbaseitem) == 0
SUPlist(akbaseitem)
endif
if (nbpotions > modelgestpotionAUT.getvalueint() + modelPotionsBONUS.getvalueint()) && modelgestpotion.getvalueint() == 1
TROPpotions(none)
endif
;if modelgestpotion.getvalueint() == 1
; affich()
;endif
endif
endevent
Event OnObjectUnequipped(Form akBaseObject, ObjectReference akReference)
if akBaseObject.haskeyword(SEI_potions5)
wait(0.2)
modelPotionsBONUS.setvalueint(modelPotionsBONUS.getvalueint() - 5)
if nbpotions > modelgestpotionAUT.getvalueint() + modelPotionsBONUS.getvalueint()
TROPpotions(none)
endif
affich()
endif
if akBaseObject.haskeyword(SEI_potions10)
wait(0.2)
modelPotionsBONUS.setvalueint(modelPotionsBONUS.getvalueint() - 10)
if nbpotions > modelgestpotionAUT.getvalueint() + modelPotionsBONUS.getvalueint()
TROPpotions(none)
endif
affich()
endif
if akBaseObject.haskeyword(SEI_potions15)
wait(0.2)
modelPotionsBONUS.setvalueint(modelPotionsBONUS.getvalueint() - 15)
if nbpotions > modelgestpotionAUT.getvalueint() + modelPotionsBONUS.getvalueint()
TROPpotions(none)
endif
affich()
endif
if akBaseObject.haskeyword(SEI_potions30)
wait(0.2)
modelPotionsBONUS.setvalueint(modelPotionsBONUS.getvalueint() - 30)
if nbpotions > modelgestpotionAUT.getvalueint() + modelPotionsBONUS.getvalueint()
TROPpotions(none)
endif
affich()
endif
if modelPotionsBONUS.getvalueint() < 0
modelPotionsBONUS.setvalueint(0)
endif
endevent
Toujours pas testé en jeu. Il faut que je bascule les variables globales et les mots-clés dans l'esm du mod et qu'ensuite je rajoute ces mots-clés aux bandoulières, sacs et autres...
EDIT : j'ai encore amélioré ce script. Toujours pas testé en jeu.
Sinon, pour SEF - Skyrim Enhanced Fire, il faut poster les idées là :
http://www.confrerie-des-traducteurs.fr ... ef#p211696
EDIT2 : le script présente quelques bugs donc je corrige tout ça tranquillement. Le même genre de script sera utilisé pour les parchemins, les ingrédients et sans doute pour les gemmes.
EDIT3 : le script fonctionne bien. Les form des potions détenues sont ien stockées dans le tableau, ce qui fait que quand on baisse la valeur maximale de potions portées dans le menu, les potions surnuméraires sont bien droppées après action du joueur sur les potions.
Je vais ajouter une routine de détection de changement de valeur dans le menu pour que l'ajustement soit lancé de manière automatique.
Il sera tout de même conseillé de démarrer la prise en compte des potions sans en avoir dans l'inventaire (en les plaçant dans un coffre le temps de la première initialisation). Les potions des mods et craftées pouvant éventuellement fausser le compte à l'initialisation. Une fois l'initialisation passée, les potions issues des mods ainsi que les potions craftées ne posent plus de soucis.
La plage de réglage des potions pouvant être portées sans rien varie de 2 à 40 dans le menu. La limite peut être désactivée à tout moment et remise par la suite.
Je vais pouvoir attaquer les parchemins et les ingrédients sereinement.
TRES IMPORTANT : le script testera l'absence de potions, poisons, boissons, nourriture à l'initialisation. S'il en détecte, un message apparaitra et la fonction sera désactivée. Dans le cas contraire, une notification apparaitra en hau à gauche de l'écran au bout de 15 à 20 secondes environ.
Ce sera également ajouté dans le lisez-moi.
Le fait d'initialiser sans avoir d'objets concernés dans l'inventaire permet de prendre en compte les ajouts des mods sans avoir à modifier ces derniers.