Page 1 sur 1
Retirer des objets de l'inventaire du joueur
Posté : 13 janv. 2013, 17:27
par claustro
Bonjour à tous,
Voici le problème que je rencontre :
Je veux faire un script qui enlève tous les ingrédients de l'inventaire du joueur et les envoie dans un container. J'ai crée une liste avec les ingrédients en question.
Code : Tout sélectionner
ScriptName AdsScriptTriIng Extends activemagiceffect
Actor Property PlayerREF Auto
ObjectReference Property AdsConTestAb Auto
FormLIST property AdsListIng auto
Int AdsVarCompteur
Event OnEffectStart(Actor akTarget, Actor akCaster)
{Les ingrédients sont retirés de L'inventaire du joueur}
AdsVarCompteur =PlayerREF.getItemCount(AdsListIng)
PlayerREF.RemoveItem(AdsListIng,AdsVarCompteur,true,AdsConTestAb)
EndEvent
Malheureusement ça ne marche pas .... Quelqu'un aurait il une idée lumineuse ???
MErci
Edit : mauvaise version du script
Re: [Script] Opérations sur l'inventaire
Posté : 13 janv. 2013, 17:50
par Gerauld
Bien sûr.
Tout d'abord, les petits trucs généraux : ne pas utiliser game.getplayer() dans un script, cette instruction est très lente à être exécutée. Il vaut mieux ajouter la propriété suivante (remplie avec un auto-fill) :
actor property playerref auto (d'ailleurs, elle est déjà dans ton script...)
et remplacer game.getplayer() par playerref qui est environ 20 fois plus rapide à exécuter.
L'event oneffectstart() n'existe normalement que pour les scripts du type extends activemagiceffect (1ère ligne du script) et doivent donc être placés dans un effet magique.
Ensuite, il faut comprendre la manière dont fonctionnent les formlists.
Tu ne peux appliquer une instruction sur la formlist en espérant agir sur tous les éléments présents à l'intérieur. Il faut aller les chercher un par un et agir sur eux au fur et à mesure.
Pour cela, il faut utiliser la fonction getat sur cette list.
formlist1.getat(2) correspond à l'élément numéroté 2 de la fomlist formlist1 par exemple.
Code : Tout sélectionner
ScriptName AdsScriptTriIng Extends activemagiceffect
Actor Property Playerref Auto
ObjectReference Property AdsConTestAb Auto
FormLIST property AdsListIng auto
Event OnEffectStart(Actor akTarget, Actor akCaster)
int index = 0 ;l'index qui va parcourir la liste
while index < AdsListIng.getsize() ;boucle tant que ma liste n'a pas été balayée
playerref.RemoveItem(AdsListIng.getat(index),playerref.getitemcount(AdsListIng.getat(index)),true,AdsConTestAb)
index += 1 ;j'ajoute 1 à l'index
endwhile ; la fin de la boucle
EndEvent
Je ne l'ai pas compilé ni même tapé dans un éditeur mais directement ici. En cas de soucis de compilation, n'hésite pas à reposter.
Ensuite, il faut savoir que bosser avec un tableau en propriété est souvent mieux qu'une formlist...
Il suffit de regarder un peu ce qui a été fait dans ce sujet :
http://www.confrerie-des-traducteurs.fr ... 19&t=14580
Re: [Script] Opérations sur l'inventaire
Posté : 13 janv. 2013, 18:06
par claustro
Que du bonheur !! ça marche impec !!!
Je vais regarder le lien que tu m'as donné
merci encore
Re: [Résolu] [Script] Opérations sur l'inventaire
Posté : 13 janv. 2013, 18:09
par Gerauld
Hors-sujet
De rien. Ça fait du bien d'avoir des questions sur les scripts... La 3D et les textures n'étant pas ma spécialité.

Re: [Résolu] [Script] Opérations sur l'inventaire
Posté : 15 janv. 2013, 13:28
par claustro
Finalement je reviens avec ce script....
La nuit portant conseil, je me suis dit que pour rendre la demeure plus RP, il me faudrait un contenant pour chaque ingrédients ...
Je me suis appuyé sur le script précédant et profitant que les ingrédients sont déjà dans un contenant j'ai pondu ceci :
Code : Tout sélectionner
ScriptName adsscriptessai Extends activemagiceffect
Actor Property Playerref Auto
ObjectReference Property AdsConTestAb Auto
ObjectReference Property AdsConIngAbeille Auto
ObjectReference Property CritterBeeIngredient Auto
FormLIST property AdsListIng auto
Event OnEffectStart(Actor akTarget, Actor akCaster)
int index = 0 ;l'index qui va parcourir la liste
while index < AdsListIng.getsize() ;boucle tant que ma liste n'a pas été balayée
playerref.RemoveItem(AdsListIng.getat(index),playerref.getitemcount(AdsListIng.getat(index)),true,AdsConTestAb)
index += 1 ;j'ajoute 1 à l'index
endwhile ; la fin de la boucle
EndEvent
Event OnEffectFinish(Actor akTarget, Actor akCaster)
Int AdsVarCompteur2
If AdsConTestAb.getitemcount(CritterBeeIngredient)>0
AdsVarCompteur2 = AdsConTestAb.getitemcount(CritterBeeIngredient)
AdsConIngAbeille.AddItem(CritterBeeIngredient, AdsVarCompteur2, true)
;Ici le elseif pour l'ingrédient suivant et son contenant respectif
EndIf
EndEvent
sauf que mon con d'ingrédient ne veux pas bouger ....
... bref me revoilà bloquer .... de plus je me pose la question de savoir si ça ne serait pas plus simple de faire cette opération directement dans l'inventaire du joueur ? ?
Re: [Script] Opérations sur l'inventaire
Posté : 16 janv. 2013, 21:57
par claustro
un petit détail sur la boucle me chiffonne ....
Code : Tout sélectionner
Event OnEffectStart(Actor akTarget, Actor akCaster)
int index = 0 ;l'index qui va parcourir la liste
while index < AdsListIng.getsize() ;boucle tant que ma liste n'a pas été balayée
playerref.RemoveItem(AdsListIng.getat(index),playerref.getitemcount(AdsListIng.getat(index)),true,AdsConTestAb)
index += 1 ;j'ajoute 1 à l'index
endwhile ; la fin de la boucle
EndEvent
pourquoi rajouter plus 1 à l'index ???? Je ne comprends pas ....
Re: [Script] Opérations sur l'inventaire
Posté : 16 janv. 2013, 22:13
par ced909
c'est simple...
le script commence par faire :
int index = 0 ;départ
ensuite tant qu'index < au nombre maximum indexé dans le AdsListIng.getsize()
on incrémente de 1 (index += 1)
l'incrémentation de l'index est primordial au bon fonctionnement de ta boucle While, il vérifie à chaque n° d'index, le type d'objet et son nombre à supprimer.
Re: [Script] Opérations sur l'inventaire
Posté : 17 janv. 2013, 10:18
par claustro
effectivement, en plis j'avais vu l'index quand j'ai fait la liste .....
merci !!!
je replonge dans mon code
Re: [Script] Opérations sur l'inventaire
Posté : 19 janv. 2013, 10:47
par Gerauld
Si tu retire l'index, ta boucle while ne se terminera jamais donc ton instance de script restera en mémoire. A chaque fois que l'event sera déclenché, une nouvelle instance viendra s'ajouter aux précédentes. Ses instances sont sauvegardées. Il faut donc faire très attention avec l'emploi de boucles dans les scripts.