La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
FAQ
Rechercher
Liste des Membres
Groupes d'utilisateurs
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
La date/heure actuelle est 23/11/2024 06:50:00
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
Voir le sujet précédent ¤ Voir le sujet suivant | |
---|---|
Auteur | Message |
Charietto Acolyte Messages: 25 |
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 !):
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 | |
kiky.le.magnifique Homme très gay Messages: 907 Localisation: Camping de la nation martienne... |
Avec des variables locales, j'imagine.
_________________ 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 | |
Viduc de Papironda Grand Chevalier Messages: 119 |
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 | |
Charietto Acolyte Messages: 25 |
kiky.le.magnifique a écrit : Avec des variables locales, j'imagine. 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 | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
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 | |
Black Knight Grand Maître Chanteur du Conseil Messages: 1031 Localisation: Fin fond du trou du cul du monde |
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; } } (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; } } (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; } } (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; } } voila a mettre dans les condition, ce sont des examples, et si par exemple tu veux donner la chambre une : NWScript :
void main() { SetLocalInt(GetModule(), "clef1", 1); SetLocalString(GetModule(), "clef1", GetName(GetPCSpeaker())); } dans le action consequence ou alors si tu veux enlever la chambre une du proprio : 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. 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"); } } voilou si il y a des erreurs dit le moi _________________ [http] |
Revenir en haut | |
Charietto Acolyte Messages: 25 |
Va pour les variables locales, alors !
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 . Je testerai ça tout à l'heure, là je suis en train de travailler (l'air de rien). |
Revenir en haut | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
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"))); } } Y a surement plus simple, en attendant c'est déjà ça. |
Revenir en haut | |
Charietto Acolyte Messages: 25 |
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; } } 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 | |
Black Knight Grand Maître Chanteur du Conseil Messages: 1031 Localisation: Fin fond du trou du cul du monde |
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 _________________ [http] |
Revenir en haut | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
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 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. 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))); } Comme ça le même script peut servir pour toutes les conditions. |
Revenir en haut | |
Charietto Acolyte Messages: 25 |
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 :
T'es le roi de la miniaturisation toi ! 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?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))); } Comme ça le même script peut servir pour toutes les conditions. |
Revenir en haut | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
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 | |
Black Knight Grand Maître Chanteur du Conseil Messages: 1031 Localisation: Fin fond du trou du cul du monde |
Oui, j'ai pens au début de changer sont dialogue, mais comme elle l'a demandé comme ça, j'ai fait avec...
_________________ [http] |
Revenir en haut | |
Charietto Acolyte Messages: 25 |
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 !
Un grand merci à tous les deux! |
Revenir en haut | |
Black Knight Grand Maître Chanteur du Conseil Messages: 1031 Localisation: Fin fond du trou du cul du monde |
Lol escuse moi, c'est ton nom, mais non je repondrais toujours à tes demande, si j'y arrive xD
_________________ [http] |
Revenir en haut | |
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
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