Bienvenue sur JeuxOnLine - MMO, MMORPG et MOBA !
Les sites de JeuxOnLine...
 

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Transfert d'inventaire dans un corps

Par Verchanal le 12/2/2003 à 0:20:25 (#3218590)

Je voudrais que, à l'arrivée dans une zone précise, l'inventaire du PJ qui vient de mourir soit transféré dans un corps mort (Tag contenant).

Actuellement, le transfert ne s'opère pas avec le script suivant dans le OnEnter de la zone...

object cible=GetLastPlayerDied();
object contenant=GetObjectByTag("contenant");
void main()
{
object item;
object copiItem;
{
copiItem=CreateItemOnObject(GetTag(item),contenant);
SetPlotFlag(copiItem, GetPlotFlag(item));
SetIdentified(copiItem, GetIdentified(item));
}
DestroyObject(item);
}





la tentative de bidouillage de script n'a pas marché du tout.

Par Azrael07 le 12/2/2003 à 0:57:13 (#3218768)

alors voyons voir...


copiItem=CreateItemOnObject(GetTag(item),contenant);


item n'est initialisé nul part plus haut :/, tu l'as juste définis en mettant :
object item;
mais aucune valeur ne lui a été donné

ensuite la fonction CreateItemOnObject utlise le blueprint et non pas le tag (j'ai pas de fonction en tête pour renvonyer le blueprint et j'ai fermé aurora pour ce soir)

de plus, le mettre dans le OnEnter est un peu embettant, dans le sens ou si un autre joueur meurt avant que quelqu'un change d'area, le changement ne s'effectura pas.
Met le plutot dans le OnPlayerDying

je continue :
plutot que de créer un objet pour détruire l'ancien, tu peux tout simplement le déplacer (pour la fonction, comme ci dessus j'ai pas de nom en tete)

ensuite il n'y a la le script pour ne déplacer qu'un seul item de l'inventaire, il te faut faire une boucle (voir MON tut sur les boucles dans les persistants, vi Jedai je fait de la pub pour mon tut, chaqun pour soi t'avais qu'a en faire un toi :p mdr) qui passe en revue tout les items dans l'inventaires

{
copiItem=CreateItemOnObject(GetTag(item),contenant);
SetPlotFlag(copiItem, GetPlotFlag(item));
SetIdentified(copiItem, GetIdentified(item));
}


tu ouvre des crochets dans le vent la, en ouvrir ne sert que si tu ouvre quelque chose comme une condition (if), une boucle(while, for, do), un switch, ou une fonction. (bon y'a d'autres trucs aussi mais on va s'arreter la)

Résultats des courses : 2/20 (pour les deux premières lignes qui sont quand meme juste ^^)

si tu ne t'en ai pas sortis d'ici la je te ferais une fonction demain, mais la c dodo time...

Par Reyan le 12/2/2003 à 1:07:40 (#3218811)

ce qui t'aiderai p-e c'est la fonction vider-inventaire dont il est question ici :)
elle est très simple d'utilisation et fait exactement ce que tu veux, je crois ;)

Par Verchanal le 12/2/2003 à 1:20:08 (#3218875)

Et là, j'ai combien mon chaton?


object cible=GetEnteringObject();
object contenant=GetObjectByTag("contenant");
object item=GetFirstItemInInventory(cible);
int nStack=0;
void main()
{
while(GetIsObjectValid(item))
{
nStack=GetNumStackedItems(item);
CreateItemOnObject(GetTag(item), contenant,nStack);
DestroyObject(item);
item=GetNextItemInInventory(cible);
}
}




ensuite j'ai essayé ça
object cible=GetEnteringObject();
object contenant=GetObjectByTag("contenant");
object item=GetFirstItemInInventory(cible);
object equitem1=GetItemInSlot(INVENTORY_SLOT_CHEST,cible);
object equitem2=GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,cible);
object equitem3=GetItemInSlot(INVENTORY_SLOT_LEFTHAND,cible);
object equitem4=GetItemInSlot(INVENTORY_SLOT_HEAD,cible);
int nStack=0;
void main()
{
{
ActionUnequipItem(equitem1);
ActionUnequipItem(equitem2);
ActionUnequipItem(equitem3);
ActionUnequipItem(equitem4);
}
{
while(GetIsObjectValid(item))
{
nStack=GetNumStackedItems(item);
CreateItemOnObject(GetTag(item), contenant,nStack);
DestroyObject(item);
item=GetNextItemInInventory(cible);
}
}
}

mais ça ne marche pas et là, il est 3h30 du mat....

Par eMRaistlin le 12/2/2003 à 9:39:21 (#3219923)

Pourquoi tu met autant de {} ?

Par Verchanal le 12/2/2003 à 10:12:33 (#3220106)

Pour séparer les actions.....

Par Azrael07 le 12/2/2003 à 22:04:13 (#3225969)

alors voici ta fonction, ne la copie pas betement essaye de voir comment elle fonctionne :

Dans le OnPlayerDying :


void main()
{
object oPJ = GetLastPlayerDied();

object oCorpse = CreateObject(OBJECT_TYPE_PLACEABLE, "corpse002", GetLocation(oPJ));//Création du corp destiné a resevoir les objets(petit bonus ct pas dans ton script de départ ^^)

object oItem = GetFirstItemInInventory(oPJ);
while(GetIsObjectValid(oPJ))//On passe en revue tout les objets
{
AssignCommand(oCorpse, ActionTakeItem(oItem, oPJ));
oPJ = GetNextItemInInventory();//Et le corp les prend au joueur
}
}


un petit problème : je ne suis pas sur que un placeable puisse alègrement prendre un objet a quelqu'un, sous forme d'action. Il existe surement une autre solution sans passer par le Destroy/ Create si celle ci ne marche pas.

par contre, selon ce script les objets seront transférés même si ton pj respawn.
tu peux ajouter un EffectDeath a la fin pour être sur qu'il ne respawn pas :p

Bon courage et dis moi si ca marche pas, ce script est compilé mais pas testé ;)

JOL Archives 1.0.1
@ JOL / JeuxOnLine