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


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Flumby
Chevalier
Inscrit le: 01 Juin 2006
Messages: 71
Répondre en citant
Posté le : 10/05/2007 09:49:31 Sujet du message : Un soucis de synchro sur le OnEnter

Bonjour a toutes et a tous.

J'ai un petit soucis, que j'aimerais vous soumettre. J'ai créé un script sur le OnEnter d'un module pour faire des test et divers expériences au niveau de la distribution des point XP. Ce script est sensé de vider tous l'inventaire de la créature. Mettre l'XP à 0, rendre invincible, créer les objets nécessaire et enfin les équiper.

Je pense que les nwscript s'exécute de façon séquentielle et non de façon concurrente. Mais l'expérience me montre un désynchronisation avec les fonctions. Enfin peut-être que le temps d'exécution d'une commande n'est pas pris en compte pour l'exécution de la suivante.

Voici le code que j'ai mis en place :

Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
NWScript :
void CreateIfNeeded(object oPC, string sTag, string sRes)
{
    if (GetItemPossessedBy(oPC, sTag)==OBJECT_INVALID)
        CreateItemOnObject(sRes, oPC);
}

void DestroyAllItems(object oPC)
{


        DestroyObject(GetItemInSlot(INVENTORY_SLOT_ARMS,oPC));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_ARROWS,oPC));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_BELT,oPC));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_BOLTS,oPC));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_BOOTS,oPC));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_BULLETS,oPC));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_CARMOUR,oPC));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_CHEST,oPC));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_CLOAK,oPC));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_CWEAPON_B,oPC));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_CWEAPON_L,oPC));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_CWEAPON_R,oPC));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_HEAD,oPC));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_LEFTRING,oPC));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_NECK,oPC));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_RIGHTRING,oPC));

        object oItem = GetFirstItemInInventory(oPC);
        while(GetIsObjectValid(oItem))
        {
            DestroyObject(oItem);
            oItem = GetNextItemInInventory(oPC);
        }

}

////////////////////////////// ///////////////////////////

void main()
{
  object oMod = GetModule();
  object oPC = GetEnteringObject();

  DestroyAllItems(oPC);

  SendMessageToPC(oPC, "Destruction inventaire");
  WriteTimestampedLogEntry("Destruction inventaire");

  SetXP(oPC,0);

  SetPlotFlag(oPC, TRUE);
  SendMessageToPC(oPC, " Vous etes invincible");
  WriteTimestampedLogEntry("Invincibilite");

  CreateIfNeeded(oPC,"Examen","examenfacteurdep");
  WriteTimestampedLogEntry("Creation Examinateur Creature");
  CreateIfNeeded(oPC,"epertueusedepnj","epertueusedepnj");
  WriteTimestampedLogEntry("Creation tueuse de creature");
  CreateIfNeeded(oPC,"BatNiveauPlus","batniveauplus");
  WriteTimestampedLogEntry("Creation Level Up");
  CreateIfNeeded(oPC,"BatNiveauMoins","batniveaumoins");
  WriteTimestampedLogEntry("Creation Level Down");
  CreateIfNeeded(oPC,"Maniementdetoute","maniementdetoute");
  WriteTimestampedLogEntry("Anneau de maniement de toute arme");

  ActionEquipItem(GetItemPossessedBy(oPC,"BatNiveauPlus"),INVENTORY_SLOT_NECK);
  WriteTimestampedLogEntry("Equipement outil 1");
  ActionEquipItem(GetItemPossessedBy(oPC,"BatNiveauMoins"),INVENTORY_SLOT_RIGHTRING);
  WriteTimestampedLogEntry("Equipement outil 2");
  ActionEquipItem(GetItemPossessedBy(oPC,"Maniementdetoute"),INVENTORY_SLOT_LEFTRING);
  WriteTimestampedLogEntry("Equipement outil 3");
  ActionEquipItem(GetItemPossessedBy(oPC,"Epertueusedepnj"),INVENTORY_SLOT_RIGHTHAND);
  WriteTimestampedLogEntry("Equipement outil 4");
}
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.


parfois les items refusent de se créer, parfois certains n'apparaissent pas. Et en aucun cas l'objet s'équipe...

Le log server me dit pourtant :


Citation :
[Thu May 10 10:37:44] Destruction inventaire
[Thu May 10 10:37:44] Invincibilite
[Thu May 10 10:37:44] Creation Examinateur Creature
[Thu May 10 10:37:44] Creation tueuse de creature
[Thu May 10 10:37:44] Creation Level Up
[Thu May 10 10:37:44] Creation Level Down
[Thu May 10 10:37:44] Anneau de maniement de toute arme
[Thu May 10 10:37:44] Equipement outil 1
[Thu May 10 10:37:44] Equipement outil 2
[Thu May 10 10:37:44] Equipement outil 3
[Thu May 10 10:37:44] Equipement outil 4
Le log client :

Citation :
[CHAT WINDOW TEXT] [Thu May 10 10:37:46] Destruction inventaire
[CHAT WINDOW TEXT] [Thu May 10 10:37:46] Vous etes invincible
[CHAT WINDOW TEXT] [Thu May 10 10:37:46] Objet perdu : Examen Facteur de Puissance
[CHAT WINDOW TEXT] [Thu May 10 10:37:46] Objet perdu : Epée tueuse de pnj
[CHAT WINDOW TEXT] [Thu May 10 10:37:46] Objet perdu : Amulette a Niveau
[CHAT WINDOW TEXT] [Thu May 10 10:37:46] Objet perdu : Niveau Moins
[CHAT WINDOW TEXT] [Thu May 10 10:37:46] Objet perdu : Maniement de toutes les armes
Pourrait on m'expliquer, ou tenter, pourquoi ca ne marche pas, erreur de code, faut il que je fasse perdre du temps entre chaque commande ? Genre une boucle for a 100 ou un delay command ? Que je le déporte par un executescript, ou bien par un évenement utilisateur ?
_________________
Premier DM a avoir inauguré la chute d'auberge sur Joueur rebel

Preuve Smile => http:
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Black Knight
Grand Maître Chanteur du Conseil
Inscrit le: 27 Oct 2005
Messages: 1031
Localisation: Fin fond du trou du cul du monde
Répondre en citant
Posté le : 10/05/2007 12:48:38 Sujet du message :

Je remarque bcp de bug, enfaite pas du tout, néanmoins essaye de faire ceci :

-CreateItemOnObject(sRes, oPC); remplace par CreateItemOnObject(sRes, oPC, 1);

- ActionEquipItem(...), rajoute ça avant : AssignCommand(oPC, ActionEquipItem(...));

Ca parait stupide, mais j'ai règler bcp d'erreur en fesant ça, NWN est bizzare =)
_________________
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Flumby
Chevalier
Inscrit le: 01 Juin 2006
Messages: 71
Répondre en citant
Posté le : 10/05/2007 17:09:09 Sujet du message :

Merci beaucoup, prochaine fois je n'oublierais plus d'expliciter l'implicite. Même soit disant pour les parametres pas défaut.

Vrai que pour le AssignCommand je n'y avais pas pensée.
_________________
Premier DM a avoir inauguré la chute d'auberge sur Joueur rebel

Preuve Smile => http:
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Flumby
Chevalier
Inscrit le: 01 Juin 2006
Messages: 71
Répondre en citant
Posté le : 11/05/2007 09:06:09 Sujet du message :

en fait pas sur que le assign command fonctionne, enfin ca ne devrait pas.

si on regarde les prototype de fonction, ca devrait bugger, même pas sur que ce soit compilable.
void AssignCommand(object oActionSubject,action aActionToAssign)

alors que le ActionEquipItem ne renvoie rien:
void ActionEquipItem(object oItem, int nInventorySlot)

du coup qu'est ce qu'il assignera comme action ? Confused
_________________
Premier DM a avoir inauguré la chute d'auberge sur Joueur rebel

Preuve Smile => http:
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Enki
Légende vivante
Inscrit le: 06 Déc 2005
Messages: 432
Répondre en citant
Posté le : 11/05/2007 10:53:31 Sujet du message :

Aïe, aïe, aïe ...

Bien sûr que ça va marcher, c'est même le seul moyen d'y parvenir ...

Là, dans ton script, tu demandes au module de s'équiper des objets que possède le joueur.
Et je ne crois pas que le module ait des slots ni même un inventaire.

Quand on dit que la fonction ne renvoie rien, cela veut dire qu'il ne renvoie aucune variable (int, string, object, etc ... )

J'espère que cela t'aidera Smile
_________________
Module persistant dans l'univers de Star Wars : Dark Time of the Galaxy
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Flumby
Chevalier
Inscrit le: 01 Juin 2006
Messages: 71
Répondre en citant
Posté le : 11/05/2007 12:31:01 Sujet du message :

Je viens de comprendre le pourquoi du refus d'équipement Embarassed merci enki pour l'éclairement.
_________________
Premier DM a avoir inauguré la chute d'auberge sur Joueur rebel

Preuve Smile => http:
 
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 36.336ms