La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 09/05/2024 13:53:33


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Charietto
Acolyte
Inscrit le: 23 Mai 2006
Messages: 25
Répondre en citant
Posté le : 20/07/2006 14:00:31 Sujet du message : [Résolu] Clefs de chambre d'auberge en multijoueur.

Bon, nouveau problème, mais là, je ne vois pas vraiment par quel bout le prendre (donc pas de script raté à vous soumettre Razz !):

Pour se reposer dans une auberge, il faut prendre la clef d'une chambre. Cette clef est donnée au cours du dialogue avec l'aubergiste. Il y a 2 chambres, et une salle commune (ou il y a toujours de la place).
Les différentes options de dialogue du PNJ sont donc les suivantes:

Les 2 chambres sont prises, il reste de la place dans la salle commune (si les 2 clefs ont déjà été attribuées).
Il reste une chambre, et de la place dans la salle commune (si la clef de la chambre 1 est attribuée).
Il reste une chambre, et de la place dans la salle commune (si la clef de la chambre 2 est attribuée).
J'ai deux chambres ou de la place dans la salle commune (si aucune clef n'a été attribuée).

Le problème se pose en multijoueurs:

Comment être sûr que 2 personnages différents ne puissent pas se voir proposer la même clef (sauf celle de la chambre commune)?
Dernière édition par Charietto le 21/07/2006 19:06:14; édité 1 fois
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
kiky.le.magnifique
Homme très gay
Inscrit le: 19 Sep 2003
Messages: 907
Localisation: Camping de la nation martienne...
Répondre en citant
Posté le : 20/07/2006 14:40:07 Sujet du message :

Avec des variables locales, j'imagine. Very Happy
_________________
http://perso.wanadoo.fr/kikitor | Deviant Art | www.VistaEntraide.com | CCLLSELFV! | D-lire_K | Viendez rêver au Pays des fées... | Ne taquinez pas l'admin!
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Viduc de Papironda
Grand Chevalier
Inscrit le: 22 Mar 2006
Messages: 119
Répondre en citant
Posté le : 20/07/2006 16:12:54 Sujet du message :

Bah là c'est toujours le même problème... en gros je pense (après de nombreuses réflexions à se sujet) qu'il y a deux options à ce pb... posséder un base donnée ou pas... en effet, un module en multi qui n'as pas de base de données ne peux pas enregistrer des variables longtemps (reboot, plantage etc...), donc par ex ds ton cas si tu utilises des variables locales pour savoir si tes chambres sont louées ou pas, lors d'un reboot, les variables sont effacées, la clé de la chambre remise en jeu et l'ancien joueur possédant toujours sa clé...

Par contre si tu as une base de données, alors oui là tu peux simplement utiliser des variables locales que tu stock ds ta base de données, et à chaque redémarrage un script qui vérifie tout tes paramètres et remet comme c'était avant le reboot...

Viduc
_________________
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Charietto
Acolyte
Inscrit le: 23 Mai 2006
Messages: 25
Répondre en citant
Posté le : 20/07/2006 17:35:00 Sujet du message :


kiky.le.magnifique a écrit :
Avec des variables locales, j'imagine. Very Happy
Je croyais que ça ne fonctionnait qu'avec les PJs ces choses là... On peut coller une variable locale à un PNJ?


Viduc de Papironda a écrit :
en effet, un module en multi qui n'as pas de base de données ne peux pas enregistrer des variables longtemps (reboot, plantage etc...), donc par ex ds ton cas si tu utilises des variables locales pour savoir si tes chambres sont louées ou pas, lors d'un reboot, les variables sont effacées, la clé de la chambre remise en jeu et l'ancien joueur possédant toujours sa clé...
Ce n'est pas "trop" problématique. Le problème peut toujours survenir, bien sûr, mais bon, le PJ ne reste en possession de sa clef que pour un temps assez court (le temps qu'il lui faut pour accéder à sa chambre, se reposer et ressortir), étant donné qu'il doit rendre sa clef avant de pouvoir quitter l'auberge (non mais!).
Mais si tu as une alternative je suis toujours preneur...
 
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 : 20/07/2006 17:46:40 Sujet du message :

Tu peux coller des locales sur tout : le module, les zones, les items, les PNJ, les plaçables, enfin tout ce qui est du type "object".

Donc, quand le PNJ donne une clef par dialogue, tu change une variable, comme ça tu peux tester dessus si la chambre est dispo ou pas. Quand le joueur remet sa clef, tu la rechange, la chambre est à nouveau disponible.

En cas de reboot, sans persistance, les 2 chambres seront dispo. Donc pour pallier à ça, ce que tu peux faire c'est automatiquement virer un joueur de sa chambre après un reboot et détruire sa clef.
 
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 : 20/07/2006 17:56:09 Sujet du message :

c'est simple :

"Les 2 chambres sont prises" :

NWScript :
void main()
{
int iClef1 = GetLocalInt(GetModule(), "clef1");
int iClef2 = GetLocalInt(GetModule(), "clef2");
if(iClef1+iClef2 == 2)
{
return TRUE;
}
else
{
return FALSE;
}
}
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.


(faut modifier le script, comme j'ai pas l'éditeur sous la main, j'ai pas mit le script de condition, c'est un example ce que j'ai mit)

"La chambre 2 est prise, mais j'ai la chambre 1"

NWScript :
void main()
{
int iClef2 = GetLocalInt(GetModule(), "clef2");
int iClef1 = GetLocalInt(GetModule(), "clef1");

if(iClef2 == 1 && iClef1 != 1)
{
return TRUE;
}
else
{
return FALSE;
}
}
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.


(pareil qu'au dessus, tjr dans la condition)

"La chambre 1 est prise, mais j'ai la chambre 2"

NWScript :
void main()
{
int iClef1 = GetLocalInt(GetModule(), "clef1");
int iClef2 = GetLocalInt(GetModule(), "clef2");

if(iClef1 == 1 && iClef2 != 1)
{
return TRUE;
}
else
{
return FALSE;
}
}
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.


(pareil qu'au dessus, tjr dans la condition)

"J'ai deux chambre de libre"

NWScript :
void main()
{
int iClef1 = GetLocalInt(GetModule(), "clef1");
int iClef2 = GetLocalInt(GetModule(), "clef2");
if(iClef1+iClef2 == 0)
{
return TRUE;
}
else
{
return FALSE;
}
}
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.


voila a mettre dans les condition, ce sont des examples, et si par exemple tu veux donner la chambre une :

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.


dans le action consequence ou alors si tu veux enlever la chambre une du proprio :

NWScript :
void main()
{
SetLocalInt(GetModule(), "clef1", 0);
SetLocalString(GetModule(), "clef1", "--");
}
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.


et pour savoir si la chambre une est prise, tu met ça dans le OnUsed d'un panneau :

NWScript :
void main()
{
int iClef1 = GetLocalInt(GetModule(), "clef1");
if(iClef1 == 1)
{
SendMessageToPC(GetLastUsedBy(), ""+GetLocalString(GetModule(), "clef1"));
}
else
{
SendMessageToPC(GetLastUsedBy(), "Cette chambre n'est pas prise, allez voir l'aubergiste pour la louer");
}
}
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.


voilou Smile si il y a des erreurs dit le moi
_________________
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Charietto
Acolyte
Inscrit le: 23 Mai 2006
Messages: 25
Répondre en citant
Posté le : 20/07/2006 17:57:38 Sujet du message :

Va pour les variables locales, alors Smile !


Sith Vicious a écrit :
En cas de reboot, sans persistance, les 2 chambres seront dispo. Donc pour pallier à ça, ce que tu peux faire c'est automatiquement virer un joueur de sa chambre après un reboot et détruire sa clef.
Alors ça, ça m'a l'air d'être THE Solution, mais euh... tu fais ça comment? Lui enlever la clef et l'expédier aux fraises, ça va, c'est sur la partie "après un reboot" que je coince...

Edit:

Merci BlackKnight qui a posté pendant que j'écrivais ma réponse Razz . Je testerai ça tout à l'heure, là je suis en train de travailler (l'air de rien).
 
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 : 20/07/2006 18:20:51 Sujet du message :

Pour le "après un reboot", perso j'enregistre les joueurs dans le OnClientEnter sur le module, comme ça je sais si je dois les renvoyer à leur position ou si elle est enregistrée (et pour d'autres trucs aussi, passons...)

Bon, j'ai un système de numéro pour les joueurs, donc je me base dessus, mais sans, tu peux enregistrer par exemple le nom du joueur en local sur la zone à l'entrée, après la verif.
Si son nom est dans la liste : c'est pas après un reboot, tu le vire pas.
Si son nom est pas dans la liste : c'est un reboot, tu lui prend sa clef et tu l'envoie à un WP à l'accueil de l'auberge.

NWScript :

//un truc du genre, OnEnter de l'auberge :
void main()
{
  object oPC = GetEnteringObject();
  if (!GetIsPC(oPC)) return;
  if (GetLocalInt(OBJECT_SELF,"ENTREE_"+GetName(oPC))) return; //pas de reboot
  else // reboot
  {
      SetLocalInt(OBJECT_SELF,"ENTREE_"+GetName(oPC),TRUE); //on l'enregistre
      DestroyObject(GetItemPossessedBy(oPC,"TAG_CLEF1"));
        DestroyObject(GetItemPossessedBy(oPC,"TAG_CLEF2"));
      AssignCommand(oPC,JumpToObject(GetNearestObjectByTag("WP_AUBERGE_ACCUEIL")));
  }
}
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.


Y a surement plus simple, en attendant c'est déjà ça.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Charietto
Acolyte
Inscrit le: 23 Mai 2006
Messages: 25
Répondre en citant
Posté le : 20/07/2006 23:04:31 Sujet du message :

BlackKnight : L'attribution des clefs fonctionne au poil; comme tu l'as dit, il faut juste la bonne formulation pour la condition; voilà à titre d'exmple celle pour le cas où les deux chambres sont prises, dès fois que ça puisse servir à quelqu'un d'autre:

NWScript :

int StartingConditional()
{
    int iClef1 = GetLocalInt(GetModule(), "Clef1");
    int iClef2 = GetLocalInt(GetModule(), "Clef2");

    if(iClef1+iClef2 == 2)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}
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.


Sith: je te ferai savoir pour le reboot dès que j'aurai l'occasion de le tester.

Un grand merci à tous pour votre aide!!!
 
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 : 21/07/2006 09:50:36 Sujet du message :

Je pense, Sith, que ça ne marchera pas. Une variable local se supprime toujours quand il y a un reboot je crois, enfin je pense. Mais utilisé SetCampaignInt ne seraisse pas mieux?

Charietto: ok parfait Wink
_________________
[http]
 
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 : 21/07/2006 12:08:54 Sujet du message :

C'est sur que le plus cohérent est de faire un truc persistant avec des SetCampaign, mais apparement Charietto n'a pas de persistance en place, donc j'ai proposé une solution pour s'en passer. Les variables locales disparaissent, on est bien d'accord là dessus, c'est pour ça que pour éviter qu'il y ait plusieurs clefs qui se balladent, je la détruis sur celui qui la possédait au moment du reboot (puisque comme les variables ont disparu, les 2 clefs seront disponibles dans le dialogue).

A propos, il me semble plus simple un dialogue comme suit :


Citation :

[PNJ] Bonjour, si vous voulez une chamre je vous propose :
[PJ] Chambre 1 (1)
[PJ] Chambre 2 (2)
[PJ] Salle commune

Avec comme condition :

NWScript :

int StartingConditional()
{
  return (!GetLocalInt(GetModule(),"Clef1")); //Clef2 pour (2)
}
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.


Encore mieux, une condition unique pour X clefs :

NWScript :

int StartingConditional()
{
    int NOMBRE_DE_CLEFS = 2; //le nombre total de chambres X
    int nClef = GetLocalInt(OBJECT_SELF,"TEMP_CLEF");
    nClef++;
    if (nClef != NOMBRE_DE_CLEFS) SetLocalInt(OBJECT_SELF,"TEMP_CLEF",nClef);
    else DeleteLocalInt(OBJECT_SELF,"TEMP_CLEF");
    return (!GetLocalInt(GetModule(),"Clef"+IntToString(nClef)));
}
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.


Comme ça le même script peut servir pour toutes les conditions.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Charietto
Acolyte
Inscrit le: 23 Mai 2006
Messages: 25
Répondre en citant
Posté le : 21/07/2006 14:23:24 Sujet du message :


Sith Vicious a écrit :
C'est sur que le plus cohérent est de faire un truc persistant avec des SetCampaign, mais apparement Charietto n'a pas de persistance en place
Oulah, non! Je reste modeste, déjà que j'ai du mal... Je veux juste, pour l'instant, que le module soit jouable tant en solo qu'en multi. Ensuite, pour ce qui est de la persistance, on verra, un jour peut être dans un lointain futur... Mais bon, au rythme ou j'avance, NWN2 sera déjà sorti à ce moment là (et entre nous soit dit, j'espère qu'on pourra importer sans douleur les maps de NWN1 vers le 2, mais je n'y crois qu'à moitié, étant donné qu'il semble que le passage de NWN de base à NWN + extensions pose parfois problème...)


Sith Vicious a écrit :
Encore mieux, une condition unique pour X clefs :

NWScript :

int StartingConditional()
{
    int NOMBRE_DE_CLEFS = 2; //le nombre total de chambres X
    int nClef = GetLocalInt(OBJECT_SELF,"TEMP_CLEF");
    nClef++;
    if (nClef != NOMBRE_DE_CLEFS) SetLocalInt(OBJECT_SELF,"TEMP_CLEF",nClef);
    else DeleteLocalInt(OBJECT_SELF,"TEMP_CLEF");
    return (!GetLocalInt(GetModule(),"Clef"+IntToString(nClef)));
}
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.


Comme ça le même script peut servir pour toutes les conditions.
T'es le roi de la miniaturisation toi Razz ! Par contre, je ne comprend pas trop le fonctionnement de ce script. Comment fait-il pour identifier si c'est la clef 1 ou la clef 2 qui sont déjà attribuées?
 
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 : 21/07/2006 14:38:32 Sujet du message :

Ca marche si le dialogue a la structure que j'ai décrite. Dans ce cas, à chaque branche de dialogue (qui correspond à une chambre) on va lancer le script.

Je passe par une variable locale sur le PNJ aubergiste, premier noeud, elle est à 1, on cherche la clef "clef1". Si la variable "Clef1" n'existe pas, la chmabre est libre, donc la branche apparait, sinon elle n'apparait pas.
A chaque test (donc à chaque noeud) la variable augmente, et on vérifie la présence de la variable "ClefX" pour savoir si la chambre X est libre, et à la fin on remet à 0 la variable pour la prochaine fois.

Bon, il faut quand même se taper une action conséquente par clef pour mettre la variable correspondante à la chambre à jour...

D'un autre coté, la persistance, au moins avec la base de donnée Bioware, c'est pas si compliqué, ça fonctionne comme les variables locales dans la structure, c'est pas sorcier. Ca le devient si tu veux faire un truc vraiment optimisé pour limiter les accès et la taille des fichiers, mais pour stocker des trucs de base c'est pas si dur, tu devrais jeter un oeil sur les fonctions et tenter quelques trucs avec.

Sinon : les maps ne seront pas exportables sur NWN2, en revanche les scripts le seront.
 
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 : 21/07/2006 15:55:12 Sujet du message :

Oui, j'ai pens au début de changer sont dialogue, mais comme elle l'a demandé comme ça, j'ai fait avec... Razz
_________________
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Charietto
Acolyte
Inscrit le: 23 Mai 2006
Messages: 25
Répondre en citant
Posté le : 21/07/2006 19:04:44 Sujet du message :


Sith Vicious a écrit :
Ca marche si le dialogue a la structure que j'ai décrite. Dans ce cas, à chaque branche de dialogue (qui correspond à une chambre) on va lancer le script.
Oh, ben voui, c'est logique... Mais, que veux-tu, avec cette vilaine habitude de faire les dialogues en sens inverse, quand on les met à l'endroit, je suis perdu!

Pour la persistance, je jetterai un coup d'oeil alors, mais bon, attention à la bordée de questions qui ne manquera pas de s'ensuivre!


Sith Vicious a écrit :
Sinon : les maps ne seront pas exportables sur NWN2, en revanche les scripts le seront.
C'est un moindre mal (enfin, de mon point de vue), si l'éditeur est aussi bien que le premier, les cartes, c'est pas le plus dur à faire.


Black Knight a écrit :
mais comme elle l'a demandé comme ça
Hmmm, désolé de te décevoir, mais c'est plutôt il! J'espère que ça ne t'empêchera pas de te précipiter pour répondre à mes prochaines questions Razz !

Un grand merci à tous les deux!
 
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 : 21/07/2006 21:35:26 Sujet du message :

Lol escuse moi, c'est ton nom, mais non je repondrais toujours à tes demande, si j'y arrive xD
_________________
[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 44.522ms