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 09:47:15
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 |
Black Knight Grand Maître Chanteur du Conseil Messages: 1031 Localisation: Fin fond du trou du cul du monde |
Salut à vous jeune scripteur/scripteuse, et maître des scripts
J'ai un petit problème que je n'arrive pas à résoudre J'ai chercher assez longtemps mais je n'ai pas la moindre idée du comment faire Je vous explique : Voila j'aimerais faire comme guilde war, pour les arènes : Le joueur entre dans la zone, il va au centre est dit "[Commencer]" (ça j'arrive à le faire, normalement ). La, un script alors se lance, celui la fait écouler un temps qui est *X, et au bout de 0 sec, le module regarde si 8 joueurs on dit "commencer", et si il y a bien 8 joueurs, alors ils sont diviser en 4 (par exemple les 4 derniers et les 4 premiers) et ils vont dans une arène (la Téléportation je ferais) et sont grouper, et sont mis hostile envers les autres. Mais, si il n'y a pas 8 joueur alors le timer recommence à 15 secondes et s'écoule jusqu'à 0 sec et on recommence ce que j'ai dis plus haut. *X = le module met en permanence le compteur en compte à rebours, un peu comme un HB qu'on arrête pas. Si vous preferez, si un joueur à dit "commencer" et que le timer est à 12 sec, par exemple, et que un autre joueur dit "commencer" 5 secondes après, le joueur attendra 7 secondes avant que le compte à rebours soit à 0(un message (SendMessageToPC()) dit à combien de seconde est le joueur). (j'espère que vous connaissez guilde war, pasque ça devient difficile à expliquer clairement la lol). Donc, pour pas vous laissez tout faire, je vais donner des idées (je me lance pas dans des trucs sans réfléchir lol) : Je ne sais pas comment faire pour que le temps descende comme toutes les 1 secondes... a par avec un DelayCommand, mais je prèfere que ce soit comment dire, réelle, comme si vous activiez votre montre. Pour ce qui est des 8 joueurs, je pense que mettre une local sur le module serait bon, on rajoute +1 a chaque joueur qui dit "commencer" et on enlève 1 si il quitte la zone. On met un LocalObject pour les téléporter, mais par contre, je ne vois pas aussi comment faire pour les diviser. Si vous savez comment faire, les grouper sera simple et les téléporter a leur place sera simple aussi. Voila merci de votre aide, prenez votre temps, et posé moi toutes les questions nécessaire _________________ [http] Dernière édition par Black Knight le 24/07/2006 10:22:16; édité 1 fois
|
Revenir en haut | |
-MeteZ- Seigneur Messages: 205 Localisation: Région Parisienne (95) |
Citation : Je ne sais pas comment faire pour que le temps descende comme toutes les 1 secondes. T'inquiète pas le temps s'écoule tout seul de 1 secondes à chaque seconde, ce sont des lois naturelles .
Enfaite pour ta question, je pense que les DelayCommands sont bons (je voie pas pourquoi tu ne veux pas les utiliser) si tu veux utiliser le temps écoulés comme un compte à rebours. Citation : Pour ce qui est des 8 joueurs, je pense que mettre une local sur le module serait bon, on rajoute +1 a chaque joueur qui dit "commencer" et on enlève 1 si il quitte la zone. On met un LocalObject pour les téléporter, mais par contre, je ne vois pas aussi comment faire pour les diviser. Mets les gladiateurs en local sur la zone en question (et non sur le module).
Oui, rajoute "+1" à un compteur à chaque entrée de joueur. Pour les diviser c'est très simple. Utilise une boucle for(i=0; i<8; i++), et traite joueurs par joueurs. Le script est pas très difficile, mais si tu as des questions ou si tu veux que je te fasse une partie du script, dit le moi . |
Revenir en haut | |
finipe Grand Sage du Conseil Messages: 519 Localisation: Nantes |
Et aussi, histoire de ne surtout pas me répéter, pourrais-tu mettre des titres explicites à tes sujets stp ?
_________________ » Le Tref & l'Aucube : Histoire, misanthropie & zoologie léonine » 1626, le Gant & l'Epée : intrigues & duels sous le règne de Louis XIII |
Revenir en haut | |
Black Knight Grand Maître Chanteur du Conseil Messages: 1031 Localisation: Fin fond du trou du cul du monde |
Heu alors j'ai compris une partie, bon oué je vais utilisé un DelayCommand, mais, comment faire pour que dès qu'un joueur arrive 7 sec aprés (donc 15-7 = il soit dit : "Début de l'arène dans : 8 secondes" ?
Heu par contre pour le script avec le FOR je veux bien que tu me le fasse j'ai jamais fait de script avec donc, j'y connais pas grand chose... FOR c'est une sort de WHILE je suppose? Enfaite faudrais que je fasse une localint qui met un numero au joueur (c'est simple ça) et dans le FOR je dit que 1 nommé Truc Chouette et que 2 nomme Trop Cool soit reuni? Mais si un joueur quitte la zone, comment faire pour retrouver le bonne équilibre ? xD Merci Finipe> Exact j'ai oublier dsl, je corrige _________________ [http] |
Revenir en haut | |
Tethilyssak Grand Chevalier Messages: 100 |
Kicker de la zone le dernier pj entré dans le camp adverse ?
_________________ Prenez votre destin en main ! |
Revenir en haut | |
-MeteZ- Seigneur Messages: 205 Localisation: Région Parisienne (95) |
Si un joueur quitte la zone d'arène en plein duel alors tu fais un système de bannissement (persistant) qui comptabilise le nombre de déco et tu banni la clef CD si le joueur déco trop souvent. Enfin bon, tu invente un truc quoi
Pour ce qui est des compteurs à rebours, je connais pas de système "timer" comme ceux de warcraft III. Mais je m'y prendrai comme cela : lorsqu'un joueur commence une partie ("commencer") tu démarre un script qui en appelle un script nommé "verif_joueur" au bout de X secondes. Lorsque "verif_joueur" demarre, tu vérifie qu'il y a bien 8 joueurs dans le LocalInt et tu fais en conséquence. Si tu veux envoyer un message au joueur qui entre dans l'arène en lui disant combien de temps il reste avant que le duel ne commence tu enregistre la date a laquelle a commencer la partie, et la date a laquelle le joueur est entrée. Avec un calcul tu as la différence. Mais bon ca c'est pas très important. Maintenant on envoie les joueurs : Imaginons que l'on stock ceux qui vont faire l'arène en LocalObjet sous GLADIATEUR_0, GLADIATEUR_1, GLADIATEUR_2, ..., GLADIATEUR_7. On les groupera et téléporteront comme ceux : NWScript :
void main() { int i = 0; for(i=0; i<4; i++) { // On ajoute les joueurs 1, 2, 3 au groupe de gladiateur 0 AddToParty( GetLocalObject(GetArea(OBJECT_SELF), "GLADIATEUR_" + IntToString(i)), GetLocalObject(GetArea(OBJECT_SELF), "GADIATEUR_1")); // Gladiateur_0 est le leader du groupe 1 // On teleporte les joueurs 0, 1, 2, 3 a TELEPORTATION_GROUPE_1 AssignCommand( GetLocalObject(GetArea(OBJECT_SELF), "GLADIATEUR_" + IntToString(i)), ActionJumpToObject( GetObjectByTag("TELEPORTATION_GROUPE_1"))); } for(i=4; i<8; i++) { // On ajoute les joueurs 5, 6, 7 au groupe de gladiateur 4 AddToParty( GetLocalObject(GetArea(OBJECT_SELF), "GLADIATEUR_" + IntToString(i)), GetLocalObject(GetArea(OBJECT_SELF), "GADIATEUR_4")); // Gladiateur_4 est le leader du groupe 2 // On teleporte les joueurs 4, 5, 6, 7 a TELEPORTATION_GROUPE_1 AssignCommand( GetLocalObject(GetArea(OBJECT_SELF), "GLADIATEUR_" + IntToString(i)), ActionJumpToObject( GetObjectByTag("TELEPORTATION_GROUPE_2"))); } } Bon c'est pas très difficile mais seulement ya un problème qu'il faut éviter : que des des GLADIATEUR_X soit OBJECT_INVALID. Imaginons qu'on a stocké les gladiateurs 0, 1, 2, 3 et que le numéro 2 s'en aille. Alors il ne faut pas que le prochain joueur a commencer soit stocké sous 4 (qui est le nombre après 3) mais sous 2 (car ce joueur a quitté et donc le localObject est invalid). Comment remédier a ca ? Il faut que le dialogue ou le joueur accède à "commencer" est 8 branches nommés "commencer. Sous aurora ca donne ca : Dans chaque "commencer" il y a une condition (si gladiateur X est présent) et il y a une conséquence (on définie le localObject gladiateur X et on défini aussi le booléen gladiateur_X_présent sous TRUE). Voici ce que j'ai écrit dans les conditions et conséquence de la première branche donc du gladiateur 0 : NWScript :
//condition int StartingConditional() { int iBooleen = FALSE; if(GetLocalInt(OBJECT_SELF, "GLADIATEUR_0_PRESENT") == FALSE) // Si le gladiateur_1 n'est pas present iBooleen = TRUE; // Alors la place est libre return iBooleen; } 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. Bon je te donne des idées et quelques pistes. Mais, bon bah n'hésite toujours pas à continuer à poster des questions ou réponses. P.S : J'ai fais le message d'une traite donc peut être des erreurs involontaires se sont glissées . |
Revenir en haut | |
Black Knight Grand Maître Chanteur du Conseil Messages: 1031 Localisation: Fin fond du trou du cul du monde |
Bon merci déjà
1) L'idées du dialogue est bonne, mais... si il y a deux place présente (deux joueurs qui on dit commencer et qui sont pas encore dans l'arene quitte) dans ton dialogue on va avoir : Bonjour, voulez faire un 4 vs 4? Commencer Commencer Non Donc ça pose un peu un probleme, peut être que ça pourrait marcher : NWScript :
void main() { int i=1; int tf = TRUE; object oPC; while(i<9 && tf == TRUE) { if(GetLocalObject(GetArea(OBJECT_SELF), "GLADIATEUR_" + IntToString(i)) != GetObjectByTag("PlaceLibre")) { i++; } else { SetLocalObject(GetArea(OBJECT_SELF), "GLADIATEUR_"+IntToString(i)); tf = FALSE; } } } La on regarde les 8 joueurs (même si il y en a pas). Si, normalement (par exemple) GLADIATEUR_1 est déjà pris, alors il ne se passe rien on passe au suivant. En revanche si GLADIATEUR_2 est libre, on donne la place a celui qui a dit commencer (le joueur qui a quitter la zone pendant le timer on le remplace par un objet posé dans la zone qui se tag "PlaceLibre"). Aprés je pense que regrouper les joueurs comme ta fait doit etre parfait, j'attends vos reponse et je teste ensuite EDIT: en re-regardant mon script je pense qu'on aurait plus de probleme pour ce qui est des joueurs qui quitte la zone. _________________ [http] |
Revenir en haut | |
-MeteZ- Seigneur Messages: 205 Localisation: Région Parisienne (95) |
Ha bah oui j'y avais pas pensé mon dialogue n'est pas bon (j'étais sûrement dans le coltar).
J'ai pas regardé ton code mais je te fait confiance . |
Revenir en haut | |
Black Knight Grand Maître Chanteur du Conseil Messages: 1031 Localisation: Fin fond du trou du cul du monde |
Je teste ça demain, et je vous dis ça, mais je pourrais pas voir ça en multijoueur..
_________________ [http] |
Revenir en haut | |
-MeteZ- Seigneur Messages: 205 Localisation: Région Parisienne (95) |
Bon je me suis décidé de regarder ton code et j'ai pas compris cette ligne :
NWScript :
if(GetLocalObject(GetArea(OBJECT_SELF), "GLADIATEUR_" + IntToString(i)) != GetObjectByTag("PlaceLibre")) Tu marque Si GLADIATEUR_X n'est pas le même objet que l'objet portant le tag "placelibre", ca veut dire qu'au début tu les défini comme celui ci ? Enfin personnellement j'aurai fait : 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. Comme ca lorsqu'un joueur quitte, ya pas besoin de redéfinir GLADIATEUR_X comme l'objet untel, si il quitte le LocalObject sera OBJECT_INVALID Avec le script bien identé : NWScript : void main() { int i = 1; int quitter = FALSE; while(i < 9 && quitter == FALSE) { if(GetLocalObject(GetArea(OBJECT_SELF), "GLADIATEUR_" + IntToString(i)) != OBJECT_INVALID) i++; else { SetLocalObject(GetArea(OBJECT_SELF), "GLADIATEUR_" +IntToString(i)); quitter = TRUE; } } } |
Revenir en haut | |
Black Knight Grand Maître Chanteur du Conseil Messages: 1031 Localisation: Fin fond du trou du cul du monde |
Bon j'ai deux problèmes, donc je vais récapituler un petit peu tout ça.
On a besoin de un Objet Invisible tagger : "Arene1" D'un garde OnSpawn du Garde de l'entrée de l'arène: (script name: "test") NWScript :
#include "NW_I0_GENERIC" void main() { SetAssociateListenPatterns(); SetListeningPatterns(); SetListening(OBJECT_SELF, TRUE); SetListenPattern(OBJECT_SELF, "[Commencer]", 1000); SetListenPattern(OBJECT_SELF, "**", 1001); } OnConversation du Garde de l'entrée de l'arène: (script name: "test1") NWScript :
#include "NW_I0_GENERIC" void main() { int iNb = GetListenPatternNumber(); object oPC = GetLastSpeaker(); switch (iNb) { case 1000 : SetLocalObject(GetObjectByTag("Arene1"), "Mec", oPC); ExecuteScript("test2", oPC); break; } } [b:3dd97a0d52]Script[/b:3dd97a0d52]: (script name: "test2") [nwscript]void main() { int i2=1; int tf = TRUE; object oPC = GetLocalObject(GetObjectByTag("Arene1"), "Mec"); while(i2<9 && tf == TRUE) { if(GetLocalObject(GetObjectByTag("Arene1"), "GLADIATEUR_" + IntToString(i2)) != OBJECT_INVALID) { SendMessageToPC(oPC, "Gladiateur "+IntToString(i2)+" pris."); i2++; } else { SetLocalObject(GetObjectByTag("Arene1"), "GLADIATEUR_"+IntToString(i2), oPC); SendMessageToPC(oPC, "Script executer, vous etes le gladiateur : "+IntToString(i2)); tf = FALSE; DeleteLocalObject(GetObjectByTag("Arene1"), "Mec"); SetLocalInt(GetObjectByTag("Arene1"), "Joueurs", GetLocalInt(GetObjectByTag("Arene1"), "Joueurs")+1); if(GetLocalInt(GetObjectByTag("Arene1"), "Joueurs") == 8) { int j=1; while(j<9) { ExecuteScript("test3", GetLocalObject(GetObjectByTag("Arene1"), "GLADIATEUR_"+IntToString(j))); } } } } } Script: (script name: "test3") NWScript :
void main() { int i = 1; for(i=1; i<5; i++) { AddToParty(GetLocalObject(GetObjectByTag("Arene1"), "GLADIATEUR_" + IntToString(i)),GetLocalObject(GetObjectByTag("Arene1"), "GLADIATEUR_1")); AssignCommand(GetLocalObject(GetObjectByTag("Arene1"), "GLADIATEUR_" + IntToString(i)),ActionJumpToObject(GetObjectByTag("TELEPORTATION_GROUPE_1"))); SpeakString("Party1", TALKVOLUME_SHOUT); } for(i=5; i<9; i++) { AddToParty(GetLocalObject(GetObjectByTag("Arene1"), "GLADIATEUR_" + IntToString(i)),GetLocalObject(GetObjectByTag("Arene1"), "GLADIATEUR_5")); AssignCommand(GetLocalObject(GetObjectByTag("Arene1"), "GLADIATEUR_" + IntToString(i)),ActionJumpToObject(GetObjectByTag("TELEPORTATION_GROUPE_2"))); SpeakString("Party2", TALKVOLUME_SHOUT); } } Mon premier probleme, le dernier script ("test3"), pour le tester j'ai mis un SpeakString("", TALKVOLUME_SHOUT);, et malheuresement, ça fait un gros bug, le message apparait 30 mille fois! J'ai essayé avec un While et ça fait pareil... Mon deuxieme probleme c'est que je ne sais pas comment faire les secondes, je sais que un heartbeat se "met à jour" toutes les 6 secondes, mais je ne sais pas du tout commencer faire pour que le temps descende a 15 sec en envoyant un message a tous les gladiateurs et de rebooter le timer a 0 sec quand on est arriver a 15... Voila _________________ [http] |
Revenir en haut | |
Black Knight Grand Maître Chanteur du Conseil Messages: 1031 Localisation: Fin fond du trou du cul du monde |
|
Revenir en haut | |
SephirothFr Ecuyer Messages: 57 Localisation: Rennes, bretagne |
|
Revenir en haut | |
Black Knight Grand Maître Chanteur du Conseil Messages: 1031 Localisation: Fin fond du trou du cul du monde |
non lol, tu peux faire un serveur RP, et tu mets une petite zone avec mes scripts pour faire quelque arène avec des joueurs aléatoires
_________________ [http] |
Revenir en haut | |
SephirothFr Ecuyer Messages: 57 Localisation: Rennes, bretagne |
|
Revenir en haut | |
Black Knight Grand Maître Chanteur du Conseil Messages: 1031 Localisation: Fin fond du trou du cul du monde |
|
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