La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 23/11/2024 21:55:43


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Allansia
Novice
Inscrit le: 15 Fév 2006
Messages: 5
Répondre en citant
Posté le : 15/02/2006 10:14:13 Sujet du message : [Prob] Identifier un PJ unique ?

Bonjour.

Je passe mon module solo en mode multijoueur et j'ai un probleme sur un script. En fait je ne sais pas comment identifier précisemment un PJ.

Le PJ discute avec un marchand qui moyennant une somme d'argent lui donne un contrat (qui apparait dans son inventaire), fait spawn une mule et celle-ci se met en henchman automatiquement.

Mon script fonctionne parfaitement, mais j'ai du utiliser un GetFirstPC() et qui ne conviens pas au multi car cette fonction liste les PJ présent (et de ce fait ma mule risque d'etre mise sur un autre PJ).

Mon script d'origine (il se situe en fin de queue d'un dialogue quand le PJ termine sa discussion) qui fonctionne :

NWScript :
#include "nw_i0_henchman"
void main()
{
object oPC = GetFirstPC();
location lLoc = GetLocation(OBJECT_SELF);

GiveGoldToCreature(GetPCSpeaker(),5000);
CreateItemOnObject( "contrat2", GetPCSpeaker() );
CreateObject(OBJECT_TYPE_CREATURE, "AnimaldeTransport1", lLoc, TRUE);

    object oHench = GetObjectByTag("AnimaldeTransport1");
    AddHenchman(oPC,oHench);

SetLocalInt(GetPCSpeaker(), "contrat1", 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.


Une tentative (j'ai posté aussi mon prob sur Maskado) mais le script donné par un membre ne fonctionne pas, ca fait bien spawn l'objet dans mon inventaire et la mule apparait bien, mais elle est pas mise en henchman automatiquement) :

NWScript :
#include "nw_i0_henchman"
void main()
{
object oPC = GetPCSpeaker() ;
location lLoc = GetLocation(OBJECT_SELF);
CreateItemOnObject( "contrat1", oPC);
CreateObject(OBJECT_TYPE_CREATURE, "AnimaldeTransport", lLoc, TRUE);
    object oHench = GetObjectByTag("AnimaldeTransport");
    AddHenchman(oPC,oHench);
SetLocalInt(oPC, "contrat1", 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.


Donc mon probleme viens de cette ligne :

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.


Comment faire pour identifier le PJ a qui ira la mule et pas un autre svp ?

Question supp : existe-t-il un moyen pour "taguer" chaque PJ avec un identifiant (variable ou autre comme sa clé ID) pour les rendre unique et les récupérer quand on veut (meme si le joueur se recré un autre perso avec le meme nom, un truc unique et générique de préférence au possible)? J'en ai besoin pour différentes fonctions de mon module Sad mais je trouve pas comment faire.

Merci.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
Répondre en citant
Posté le : 15/02/2006 14:39:23 Sujet du message :

Si c'est un dialogue utilises GetPCSpeaker(), je pige pas bien tu t'en sers ailleurs, ça devrait suffire non ?

Sinon pour l'identifiant unique pour les boulets qui utilisent toujours le même nom pour des persos différents là c'est chaud. Faut trouver un moyen de l'empecher, du genre tu enregistre tous les persos (compte+nom du perso) qui se connectent dans la DB, et à la première connection tu leur file un truc indropable, comme ça tu sais s'ils sont déjà venu. Ensuite, tu vérifies à l'entrée d'un nouveau perso (qui a pas l'objet) si son nom (cad nom de compte+nom perso) est déjà dans la DB. Si oui, tu l'éjectes direct, comme ça un code = un pero et c'est tout. Méthode de bourrin mais méthode qui marche.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Allansia
Novice
Inscrit le: 15 Fév 2006
Messages: 5
Répondre en citant
Posté le : 15/02/2006 15:18:34 Sujet du message :

Le dialogue c'est avec le PNJ marchand (c'est lui qui fait spawn une mule), mais je parle pas a la mule sauf quand elle deviens un henchman pour son inventaire.

Et c'est la que ca cloche avec le GetPCSpeaker() puisqu'il n'est pas initialisé sur la mule et je peux pas pour des raisons pratique lui parler, faut qu'elle passe en henchman automatiquement quand je boucle le dialogue avec le marchand (et que la mule soit attribuée au bon PJ). A l'heure actuel j'ai pas trouvé d'autre moyen que de mettre un GetFirstPC() mais pour le multi cette fonction va pas.

Concernant le fait de "taguer" un PJ de façon unique c'est pas pour les boulet qui deco/reco pour les HP ou la duplication, mais pour des quetes et attribution d'objets dont je peux pas passer par un dialogue.

Mettre un objet indropable sur un PJ je sais faire, ainsi que de mettre des variable a l'objet mais les récupérer via script je sais pas trop s'il faut utiliser que les SetLocalInt et GetLocalInt (ou leur équivalent avec la BDD) ou s'il y a d'autre fonction, mais mon prob reste le meme pas moyen d'identifier un Pj que s'il fait une action précise comme discuter, entrer/sortir d'une zone, se connecter au module, mourir, etc. En gros l'identifier quand il fait rien.

De plus je pense pas que les objets indropable soit unique mais sont tous identique, auquel cas ca reviens au meme si 2 PJ ont le meme objet, restera le prob de les séparer pour les reconnaitre.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
Répondre en citant
Posté le : 15/02/2006 15:29:48 Sujet du message :

Si dans le dialogue avec le marchand tu mets ça :
NWScript :
#include "nw_i0_henchman"
void main()
{
object oPC = GetPCSpeaker() ;
location lLoc = GetLocation(OBJECT_SELF);
CreateItemOnObject( "contrat1", oPC);
object oMule = CreateObject(OBJECT_TYPE_CREATURE, "AnimaldeTransport", lLoc, TRUE);
        AddHenchman(oPC,oMule);
SetLocalInt(oPC, "contrat1", 1);
SetLocalObject(oMule,"MONMAITRE",oPC);
}
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 doit marcher. Et comme ça tu enregistre le joueur propriétaire sur la mule ça peut aider (enfin tu peux le retrouver aussi avec GetMaster() )

Sinon pour l'identifiant unique j'ai bien compris ton problème. Mais il y a toujours le moyen de stocker des variables locales sur un objet indropable pour se souvenir si un joueur a fait des quêtes et tout, ça marche même si un joueur nomme tous ses persos pareil et ça suffit pour beaucoup de choses.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Allansia
Novice
Inscrit le: 15 Fév 2006
Messages: 5
Répondre en citant
Posté le : 15/02/2006 15:49:07 Sujet du message :

Cool ca marche, merci.

Mais je comprend pas la fonction SetLocalObject (étant nul en anglais, le lexicon m'aide pas beaucoup), enfin je comprend ca structure mais pas comment il interragis sur le script et colle la mule en auto-henchman (par rapport a mon script d'origine), ni sur le string "MONMAITRE" ?

PS : pardon pour la question de noob mais je tente a chaque fois de comprendre une fonction ou un script modifié Sad
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
Répondre en citant
Posté le : 15/02/2006 16:41:39 Sujet du message :

En fait je suis pas sur qu'il soit super utile. C'est juste j'avais fait un système de mule un peu pareil et je m'en servais car tu pouvais relacher la bete un certain temps et il fallait qu'elle se souvienne de son maitre.

Dans le script il sert à rien, la mule devient henchman à la ligne AddHenchman(oPC,oMule)

Ensuite, le SetLocalObject crèe une variable locale sur la mule et enregistre le PC dedans, MONMAITRE c'est le nom de la variable. Ce qui te permet de le récupérer par la commande GetLocalObject(oMule,"MONMAITRE"); mais tant que la mule est henchman, la commande GetMaster(oMule) te renvoie le PC, donc c'est pas forcément nécessaire cette commande.

Je sais pas si je suis super clair...
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Allansia
Novice
Inscrit le: 15 Fév 2006
Messages: 5
Répondre en citant
Posté le : 15/02/2006 17:57:05 Sujet du message :

Je peut me tromper mais, j'ai réfléchie a la structure de mon premier script et a la tienne et je crois que mon erreur (le GetFirstPC) viens d'une sorte de conflit engendrais par deux lignes de codes qui definissent la meme chose. Chose que tu as modifié dans le tiens :

NWScript :

CreateObject(OBJECT_TYPE_CREATURE, "AnimaldeTransport1", lLoc, TRUE);

object oHench = GetObjectByTag("AnimaldeTransport1");
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.


Ces deux lignes veulent exactement dire la meme chose, en tout cas pour ce qui concerne l'identification de la mule et a mon avis NWN doit couiller a ce niveau la, car sur ton script tu as mis :


NWScript :

object oMule = CreateObject(OBJECT_TYPE_CREATURE, "AnimaldeTransport", lLoc, TRUE);
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.


J'ai du faire l'oubli quand j'ai créer le script qu'écrire CreateObject directement est jamais bon, et qu'il faut mieu écrire comme toi object oMule = CreateObject (vala pourquoi j'ai du coller un GetObjectByTag pour identifier dans le AddHenchman qui suivait et que ca a tout foiré lol.

J'ai vraiment un mal fou a assimiler le code script d'Aurora, meme depuis la sortie du jeu pff.

Merci en tout cas mais...

Ca répond pas a ma question (enfin en partie) si on peut m'expliquer comment faire un truc pour identifier un PJ d'un autre par variable sur objets (a mon avis c'est le mieu comme tu dis sur objet undrop), mais j'aimerais avoir des exemple si possible.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
Répondre en citant
Posté le : 16/02/2006 03:03:59 Sujet du message :

Le pourquoi du oMule = CreateObject(...); c'est qu'on s'en ressert après, ça évite de le rechercher sur tout le module avec un GetObjectByTag et surtout dans une optique de multi, ça évite de tomber sur la mule d'un autre (si il y a 2 mules elles auront le même tag)

Un truc pratique comme objet pour enregistrer tes trucs sur un perso c'est les objets de créature, type peau. C'est bien car ça t'évite de fouiller un inventaire pour retrouver l'objet à mémoire.

Si ta peau a pour resref "peau_memoire"
Sur le OnEnter de ton module rajoute :
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.


Pour retrouver l'objet à la fin d'une quête et la noter comme terminée :
NWScript :

void main()
{
object oPC =
object oPeau = GetItemInSlot(INVENTORY_SLOT_CARMOUR,oPC);
SetLocalInt(oPeau,"QUETE1",100);
}
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.


Avec ça tu as déjà une mémoire persistante sur tous tes joueurs. Tu n'aurai besoin d'un véritable identifiant unique que si tu veux retrouver un joueur, là en général le nom du compte + le nom du perso doit suffire (GetPCPlayerName(oPC) et GetName(oPC)) mais il y a le problème des types qui créent des persos avec le même nom. Soit tu l'empeche comme je t'ai dit plus haut, ou alors tu peux par exemple leur donner un numero lors de leur première connection quand tu leur donne leur peau :
NWScript :

object oPC = GetEnteringObject();
if (GetIsPC(oPC) && !GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_CARMOUR,oPC)))
{
    int nIndex = GetCampaignInt("nomdeladb","index_joueurs");
    object oPeau = CreateItemOnObject("peau_memoire",oPC);
    AssignCommand(oPC,ActionEquipItem(oPeau,INVENTORY_SLOT_CARMOUR));
    SetLocalInt(oPeau,"IDENTIFIANT",nIndex);
    SetCampaignInt("nomdeladb","index_joueurs",++nIndex);
}
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.


Si ça peut t'aider...
 
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 46.627ms