La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 17/05/2024 03:56:11


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Fantome
Ecuyer
Inscrit le: 06 Nov 2002
Messages: 63
Répondre en citant
Posté le : 12/01/2004 12:03:11 Sujet du message : Script - Prendre un objets à plusieurs joueurs ...

Bonjour à tous,

j'ai posté il y aquelques jours ce post sur un autre forum mais sans trop de succès... bref je suis toujours avec mon pb, aussi je me permet de vous l'exposer et voir si aupres de vous je peux trouver une solution.

J'aimerais réaliser la mise en scene de cette quete :
Un groupe de joueurs rencontre un pnj. Ce pnj au cours de la discution décide de prendre à chacun des joueurs un objet qu'il posséde en leur lancant un sort. Puis le PNJ disparait. Lesdit objets pris sont alors transféré dans un contenant et les joueurs doivent se débrouiller pour le retrouver et récupérer leur matos (peut etre en rajoutant une option de limite de durer pour récup leur matos, par exemple 1 heure).

Savez vous si un tel script existe déjà ou s'en rapproche. J'ai cherché mais j'ai rien trouvé d'approchant.

Peut etre que parmi vous, certains savent comment s'y prendre pour :
- prendre un objet sur chacun des pjs (et si possible un objet qu'il porte(arme, armure, botte, bracelet, ou anneau).
- placer ces objets dans un contenant pour une durée d'une heure (avec sauvegarde des objets dans le contenant).
- je précise que pour simplifier, le pnj serait dans une et une seule piece avec tous les joueurs: il faudrait donc qu'il prenne un objet à tous les pjs présents dans la pieces (qu'ils soient visibles ou non).

Merci pour votre aide.

A+
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Longbow
Grand Sage du Conseil
Inscrit le: 10 Déc 2003
Messages: 638
Localisation: Orléans
Répondre en citant
Posté le : 12/01/2004 22:18:43 Sujet du message :

Hum... Hum...

Alors là c'est effectivement du lourd car il y a plusieurs choses à prendre en compte... Essayons...

1. Créer un journal avec un Tag "Quest" 10: L'annonce de la quête// 20: la quête a échouée // 30: la quête a réussi

2. Créer un coffre avec le tag CoffreBase

3. Placer le script suivant dans le HeartBeat du coffre
NWScript :
// a placer dans le Heart Beat du coffre
void main()
{
int iActuel = GetTimeHour();
int iTest = GetLocalInt(GetModule(), "Rebour");


if ((iActuel >= iTest) && (GetLocalInt(GetModule(), "Coffre_Quest") >= 10 ))
    {

AddJournalQuestEntry("Quest", 20, GetFirstPC(), TRUE,TRUE,FALSE);
    DestroyObject(OBJECT_SELF,1.0);
    }
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


4. Créer un dialogue et mettre ce script dans l'onglet "Actions Conséquentes" du PNJ

NWScript :
// A mettre dans le "Actions Consequentes" du PNJ !!!!!!
void main()
{
    object oPC = GetFirstPC();
    object oCoffre = GetObjectByTag("CoffreBase");
    // L'heure de test = l'heure du dialogue + 12 heures
    int iRebour = (GetTimeHour()+12);
    SetLocalInt(GetModule(), "Rebour", iRebour);



    ActionPauseConversation();

// Une mise a niveau du journal des joueurs
    AddJournalQuestEntry("Quest", 10, GetPCSpeaker(), TRUE,TRUE,FALSE);

//  Une mise a niveau de la variable locale qui va gerer cette quete et le temps.
    SetLocalInt(GetModule(), "Coffre_Quest", 10);

//  Petite invocation
    ActionCastFakeSpellAtObject(SPELL_CREEPING_DOOM,GetPCSpeaker());
  while(GetIsObjectValid(oPC)==TRUE)
    {
    //object oItem = GetFirstItemInInventory(oPC);

    object oItem = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC);
    CopyItem(oItem, oCoffre);
    DestroyObject(oItem, 1.0);
    DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectKnockdown(),oPC,10.0));
    DelayCommand(3.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect (VFX_IMP_DOOM),oPC));

    }
//  "GetNextPC" avant ou apres la } ???
    oPC = GetNextPC();
// La conversation reprend...
    ActionResumeConversation();

}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Plusieurs interrogations...
a/ oPC = GetNextPC() doit-il être avant ou après le "}" à essayer si ca marche pas ainsi...

b/ La gestion du temps.. A essayer en modifiant le 12 par 1 pour tester. Si ca marche en 1 heure, ca fonctionnera en 12 !!

Beaucoup de sources d'erreur... Tiens-moi au courant... Mais c'était stimulant...
_________________
Rex illeteratus
Quasi Asinus Coronatus
Jean de Salisbury
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Fantome
Ecuyer
Inscrit le: 06 Nov 2002
Messages: 63
Répondre en citant
Posté le : 13/01/2004 09:03:56 Sujet du message :

Merci Longbow de t'être penché sur mon probleme. Je vais tester ta solution ce week end et je te tiendrais au courant.(j'ai pas le jeu avec moi durant la semaine)

J'aurais aimé une précision:
comment fonctionne la ligne de code suivante :
NWScript :Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


ca prend: un objet porté par le joueur mais sur quel emplacement ? Ou est ce un objet porté sur le pj de facon aléatoire?


Pourquoi dis tu que c'est source de beaucoup d'erreur ?

Encore Merci, je suis impatient de tester ...
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
lendraste
Grand Maître Chanteur du Conseil
Inscrit le: 20 Fév 2003
Messages: 1403
Localisation: Quelque part ailleurs
Répondre en citant
Posté le : 13/01/2004 09:26:52 Sujet du message :


Fantome a écrit :
comment fonctionne la ligne de code suivante :
NWScript :Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


ca prend: un objet porté par le joueur mais sur quel emplacement ? Ou est ce un objet porté sur le pj de facon aléatoire?
INVENTORY_SLOT_CHEST est une constante donnée par Bioware. Elle représente, dans le cadre de la fonction utilisée GetItemInSlot, l'emplacement Armure/Vêtement du personnage. Si tu désires faire appel au hasard, il faut déterminer aléatoirement la valeur de la constante utilisée dans la commande. A noter, par ailleurs, qu'une détermination au hasard n'est pas forcément évidente, surtout si le joueur n'a aucun (ou presque) objet équipé sur lui. Il faudrait d'abord s'assurer de ce qu'il porte avant de décider de lui enlever quoi que ce soit. Par rapport à ce que tu demandais, le choix de l'Armure est assez arbitraire.



Citation :
pourquoi dis tu que c'est source de beaucoup d'erreur ?
Car Longbow laisse un doute planer sur l'emplacement d'une commande ( oPC=GetNextPC() ) laquelle doit d'ailleurs figurer dans la boucle (avant le } ) et non en dehors. L'idée de la boucle étant de parcourir la liste de tous les PJs présent dans le module pour leur enlever leur armure et la mettre dans un coffre. Ce n'est donc pas tout à fait ce que tu attendais, car tous les PJs seront affectés dans le module et non seulement les PJs présent dans la "pièce" ou se trouve le PNJ.

Je vais voir si je peux arranger cela, à moins que Longbow ait le temps de le faire Mr. Green
_________________
Lendraste de Loreval
Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel.
La cité des mensonges - 1
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Numéro ICQ Ignorer l'utilisateur
 
Fantome
Ecuyer
Inscrit le: 06 Nov 2002
Messages: 63
Répondre en citant
Posté le : 13/01/2004 11:28:18 Sujet du message :

Merci Lendraste pour ta réponse.

En fait, en ce qui concerne la prise de l'armure/vetement d'un pj, j'ai un peu peur, qu'avec le temps, les joueurs se rendent finallement compte qu'il suffit de ne pas porter d'armure/vetement pour éviter d'être affecté par ce petit emprunt momentanée Smile . C'est pourquoi je pense qu'un tirage aléatoire est plus adapté, et j'irais même plus loin en disant qu'il faudrait que si le pj porte rien (y aura toujours un petit malin pour tout oter ! ) alors on prends directement dans le reste de l'inventaire.

En effet je veux limiter l'effet du 'drop' à seulement la piece où sont les pjs et le pnj , et non à l'ensemble du module.

Merci.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Longbow
Grand Sage du Conseil
Inscrit le: 10 Déc 2003
Messages: 638
Localisation: Orléans
Répondre en citant
Posté le : 13/01/2004 12:10:18 Sujet du message :

HUm... Hum...

Ne t'inquiètes pas pour l'objet à retirer, quand le reste sera clair, on fera un tirage aléatoire...
_________________
Rex illeteratus
Quasi Asinus Coronatus
Jean de Salisbury
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
lendraste
Grand Maître Chanteur du Conseil
Inscrit le: 20 Fév 2003
Messages: 1403
Localisation: Quelque part ailleurs
Répondre en citant
Posté le : 13/01/2004 14:18:35 Sujet du message :

L'une des solutions pourrait consister à marquer les PJs lors de leur entrée dans la salle du PNJs. Pour cela il faut dessiner un trigger invisible qui couvre les dimensions de la salle et écrire les scripts suivant sur le OnEnter et le OnExit :
OnEnter du trigger
NWScript :

void main()
{
  object oCreature = GetEnteringObject();
  if (GetIsPC(oCreature))
  {
    SetLocalInt(oCreature, "VICTIM", 1);
  }
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


OnExit du trigger
NWScript :

void main()
{
  object oCreature = GetExitingObject();
  if (GetIsPC(oCreature))
  {
    DeleteLocalInt(oCreature, "VICTIM");
  }
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Une fois ceci fait, on sait qu'au moment ou le PNJ déclenche son sort, tous les PJs connectés au module portant une variable VICTIM égale à 1, il sont plus facile à repérer (même pour le cas ou le PJ se déco dans le salle, au moment de sa reconnexion le trigger est redéclenché donc il récupérera sa variable VICTIM).

Pour le sort à proprement parler, voici ce que j'écrirai :
NWScript :

object GetRandomItemFromPC(object oPC)
{
  object oItem;
 

  return oItem;
}

void main()
{
  object oItem;
  object oChest = GetObjectByTag("CoffreBase");
  object oPC = GetFirstPC();
  while (GetIsObjectValid(oPC))
  {
    if (GetLocalInt(oPC, "VICTIM")==1)
    {
     
      // ici les fioritures.

     
      oItem = GetRandomItemFromPC(oPC);
      if (GetIsObjectValid(oItem))
      {
        CopyItem(oItem, oChest);
        DestroyObject(oItem);
      }
    }
    oPC = GetNextPC();
  }
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Voilà, j'ai laissé des commentaires pour faire d'éventuels ajouts. Je n'ai pas résolu encore le cas de la sélection aléatoire de l'objet, mais il suffit de compléter la fonction GetRandomItemFromPC .
Pour la durée de vie des objets dans le coffre, il me semble que la méthode était à peu près bonne.
_________________
Lendraste de Loreval
Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel.
La cité des mensonges - 1
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Numéro ICQ Ignorer l'utilisateur
 
Longbow
Grand Sage du Conseil
Inscrit le: 10 Déc 2003
Messages: 638
Localisation: Orléans
Répondre en citant
Posté le : 13/01/2004 15:58:06 Sujet du message :

Hum... Hum...

Citation :
Pour la durée de vie des objets dans le coffre, il me semble que la méthode était à peu près bonne.
Comment ça à peu près bonne ? Soit ca fonctionne soit ca coince... Pour l'heure, j'attend que Fantome teste le script pour lancer la phase Random...
_________________
Rex illeteratus
Quasi Asinus Coronatus
Jean de Salisbury
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
lendraste
Grand Maître Chanteur du Conseil
Inscrit le: 20 Fév 2003
Messages: 1403
Localisation: Quelque part ailleurs
Répondre en citant
Posté le : 13/01/2004 16:33:45 Sujet du message :


Longbow a écrit :
Hum... Hum...

Citation :
Pour la durée de vie des objets dans le coffre, il me semble que la méthode était à peu près bonne.
Comment ça à peu près bonne ? Soit ca fonctionne soit ca coince... Pour l'heure, j'attend que Fantome teste le script pour lancer la phase Random...
Allons, ne t'ennerves pas Mr. Green . Je ne me suis pas apesanti plus de 5 secondes sur cette partie de ton script, je ne peux donc donner qu'une impression (et encore sur la méthode et non sur le script). Je n'ai pas davantage eu le loisir de tester. On verra bien donc. C'était plus une manière de dire que je n'allais pas traiter ce qui l'a déjà été.
_________________
Lendraste de Loreval
Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel.
La cité des mensonges - 1
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Numéro ICQ Ignorer l'utilisateur
 
Longbow
Grand Sage du Conseil
Inscrit le: 10 Déc 2003
Messages: 638
Localisation: Orléans
Répondre en citant
Posté le : 13/01/2004 17:45:50 Sujet du message :

Hum... Hum...

C'est la partie du script qui me tarabuste le plus... Et je n'ai pas le moyen de savoir si ca fonctionne ou non... Super frustrant... Alors Fantome, Au nom du Dieu Fou, est-ce que ca fonctionne ???
_________________
Rex illeteratus
Quasi Asinus Coronatus
Jean de Salisbury
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Fantome
Ecuyer
Inscrit le: 06 Nov 2002
Messages: 63
Répondre en citant
Posté le : 13/01/2004 18:01:26 Sujet du message :

Je pourrais pas tester avant ce week end, désolé je vais devoir vous faire patienter pour tester tout ca.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Fantome
Ecuyer
Inscrit le: 06 Nov 2002
Messages: 63
Répondre en citant
Posté le : 18/01/2004 13:31:22 Sujet du message :

Bonjour ,

j'ai testé le script de Longbow, résultat des courses :

- au début j'ai cru que ca m'avais planté mon PC, l'anime ne s'intérrompait pas
- j'ai bel et bien eu mon armure de droppée
- dans la fenetre j'ai eu l'info comme quoi il y avait trop d'info a éxécuté (j'ai fait un screen mais je sias pas comment vous le montrer j'ai pas de site internet pour poser la photo)
- je suis allé voir dans le coffre, il y aavit bien ma tenue mais le hic c'est qu'elle était présente pour les 25 pages de contenance du coffre, a raison de 3 par pages, ca en faisait 75 ! (c'est à mon avis pour ca que l'anim continuait sans cesse au début.
- ce test j'ai pu le réaliser qu'en solo

voilà je pense pas avoir oublié quoique se soit à vous dire sur ce test. Avez vous des questions ?

Pouvez vous intégrez lefait que l'effet soit limité uniquement aux pjs présent dans la piece avec le pnj?

J'ai pas testé le script de Lendraste, je vais essayer de le faire .... je vous tiens au courant.

Merci pour votre aide.

A+

PS: je sais pas trop comment m'y prendre pour tester ton code Lendraste, si je remplace ta partie dropp aléatoire par celle de longbow je vais avoir le même pb lié au drop des 75 fois, non ?!
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
aldech
Gagnant du Concours Gothic 3
Inscrit le: 25 Nov 2002
Messages: 61
Localisation: Le Havre
Répondre en citant
Posté le : 18/01/2004 20:11:39 Sujet du message :

J'ai testé avec le code de Longbow, cela fonctionne bien !

Pour ton problème de 75 fois, je pense que ton problème vient de là :


Citation :

// "GetNextPC" avant ou apres la } ???
oPC = GetNextPC();
Comme dit Lendraste, il faut le mettre à l'intérieur de la boucle, avant le }


Citation :

Pouvez vous intégrez le fait que l'effet soit limité uniquement aux pjs présent dans la piece avec le pnj?
Pour cela, relit ce que Lendraste a dit sur la variable "VICTIM", tout est expliqué.


Citation :

b/ La gestion du temps.. A essayer en modifiant le 12 par 1 pour tester. Si ca marche en 1 heure, ca fonctionnera en 12 !!
Cela fonctionne avec 1.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Fantome
Ecuyer
Inscrit le: 06 Nov 2002
Messages: 63
Répondre en citant
Posté le : 19/01/2004 13:40:58 Sujet du message :

Désolé Aldech, j'ai effectivement passé sur les points que tu mentionnes.

Je vais re-testé des ce soir....

Et pour le dropp aléatoire, une petite idée ?
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
lendraste
Grand Maître Chanteur du Conseil
Inscrit le: 20 Fév 2003
Messages: 1403
Localisation: Quelque part ailleurs
Répondre en citant
Posté le : 19/01/2004 14:43:29 Sujet du message :

Pour la sélection aléatoire, il faudrait reprendre ma solution et implémenter la fonction GetRandomItemFromPC comme suit :
NWScript :

object GetRandomItemFromPC(object oPC)
{
  object oItem = OBJECT_INVALID;
 
  int nCount = 0;
  int nCnt;
  object oTmp;
  for (nCnt = 0; nCnt <= 17; nCnt++)
  {
    oTmp = GetItemInInventory(nCnt, oPC);
    if (GetIsObjectValid(oTmp))
    {
     
      nCount++;
      SetLocalObject(oPC, "EQUIPED" + IntToString(nCount), oTmp);
    }
  }
  if (nCount > 0)
  {
    int nRanItem = Random(nCount) + 1;
    oItem = GetLocalObject(oPC, "EQUIPED" + IntToString(nCount));
   
    for (nCnt = 1; nCnt <= nCount; nCnt++)
    {
      DeleteLocalObject(oPC, "EQUIPED" + IntToString(nCnt));
    }
  }
  else
  {
   
    nCnt = 0;
    oTmp = GetFirstItemInInventory(oPC); // retrouver le premier objet d'inventaire
    while (GetIsObjectValid(oTmp))
    {
      nCnt++;
      oTmp = GetNextItemInInventory(oPC); // On va chercher l'objet suivant
    }
    if (nCnt>0)
    {
      nCount = Random(nCnt);
      oTmp = GetFirstItemInInventory(oPC); // On initialise un nouveau parcours d'inventaire
      while (nCount > 0)
      {
        nCount--;
        oTmp = GetNextItemInInventory(oPC); // On cherche l'objet d'inventaire suivant
      }
      oItem = oTmp; // Le dernier objet pris dans l'inventaire pour lequel le compteur est 0
    }
  }

  return oItem;
}

Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Cette fonction parcours d'abord les objets équipés pour en choisir un aléatoirement dedans. Si aucun objet équipé n'est trouvé, elle parcoure l'inventaire, une première fois pour les compter, une seconde fois pour trouver celui qu'elle a choisi. La fonction renvoie donc un objet aléatoire de l'équipement pour être traité ensuite dans le reste du code que j'ai donné plus haut.
_________________
Lendraste de Loreval
Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel.
La cité des mensonges - 1
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Numéro ICQ Ignorer l'utilisateur
 
micka
Grand Sage du Conseil
Inscrit le: 29 Aoû 2003
Messages: 884
Localisation: /dev/null
Répondre en citant
Posté le : 19/01/2004 17:19:14 Sujet du message :

Pour le choix de l'objet, on pourrait peut être aussi choisir celui qui a le plus de valeur, en bouclant sur l'inventaire avec GetGoldPieceValue.
Ça mettrait un peu de piment, non?
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Fantome
Ecuyer
Inscrit le: 06 Nov 2002
Messages: 63
Répondre en citant
Posté le : 02/02/2004 10:31:28 Sujet du message :

Bonjour,

j'ai enfin testé (désolé ca été long!, j'avais pas trop le temps).

Et ca marche comme je le souhaite.

Mercie à Tous pour votre participation.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Montrer les messages depuis :
Page 1 sur 1 ¤


Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Sauter vers:
FAQ | Rechercher | Liste des Membres | Groupes d'utilisateurs | S'enregistrer | Profil | Se connecter pour vérifier ses messages privés | Connexion
Powered by phpBB 2.* [m] © 2001, 2002 phpBB Group
Theme rewritten in beautiful XHTML code by Baldurien.
Thème "La Bibliothèque de Neverwinter" crée par Kruger
Traduction par : phpBB-fr.com
Page generated in 44.553ms