[Résolu] Retirer des objets de l'inventaire du joueur

Le langage des scripts.
Répondre
claustro
Moddeur aspirant
Moddeur aspirant
Messages : 16

Retirer des objets de l'inventaire du joueur

Message 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
Modifié en dernier par claustro le 15 janv. 2013, 19:47, modifié 3 fois.
Avatar du membre
Gerauld
Confrère
Messages : 2439

Re: [Script] Opérations sur l'inventaire

Message 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
claustro
Moddeur aspirant
Moddeur aspirant
Messages : 16

Re: [Script] Opérations sur l'inventaire

Message par claustro »

Que du bonheur !! ça marche impec !!!
Je vais regarder le lien que tu m'as donné

merci encore
Avatar du membre
Gerauld
Confrère
Messages : 2439

Re: [Résolu] [Script] Opérations sur l'inventaire

Message 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é. :)
claustro
Moddeur aspirant
Moddeur aspirant
Messages : 16

Re: [Résolu] [Script] Opérations sur l'inventaire

Message 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 ? ?
claustro
Moddeur aspirant
Moddeur aspirant
Messages : 16

Re: [Script] Opérations sur l'inventaire

Message 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 ....
Avatar du membre
ced909
Confrère
Messages : 151

Re: [Script] Opérations sur l'inventaire

Message 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.
claustro
Moddeur aspirant
Moddeur aspirant
Messages : 16

Re: [Script] Opérations sur l'inventaire

Message par claustro »

effectivement, en plis j'avais vu l'index quand j'ai fait la liste .....

merci !!!

je replonge dans mon code
Avatar du membre
Gerauld
Confrère
Messages : 2439

Re: [Script] Opérations sur l'inventaire

Message 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.
Répondre

Retourner vers « Entraide sur les scripts »