Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > Transfert d'inventaire dans un corps
Transfert d'inventaire dans un corps
Par Verchanal le 12/2/2003 à 0:20:25 (#3218590)
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)
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)
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)
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é çaobject 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)
Par Verchanal le 12/2/2003 à 10:12:33 (#3220106)
Par Azrael07 le 12/2/2003 à 22:04:13 (#3225969)
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