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 27/12/2024 19:43:44
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 |
AZAZEL11 Seigneur Messages: 156 |
allo. J'ai fait un script pour les leviers ouvrant des portes
le système fonctionne, le levier ouvre ou ferme la porte comme il se doit. L'ennui est de coté esthétique; J'ai fait un système de sons aléatoires. Jusque là tout va très bien encore les sons jouent de facon aléatoire. Mais le problème c'Est que parfois il n'y a aucun sons! des fois c'est la première série, des fois la deuxième des fois les 2!!! j'avoue que je ne saisi pas le pourquoi...quoique mon random est encore plus *réaliste* mais cependant j'aimerais bien savoir pourquoi ce comportement! il y a peut être une option que je n'ai pas mise...mais laquelle? NWScript : //created by: AZAZEL //script pour system de levier et trap UNIVERSEL //a mettre dans le OnUsed du levier //modified by: void main() { object oPC=GetLastUsedBy(); object oLevier= OBJECT_SELF; string sTag= GetTag(OBJECT_SELF); location lLoc= GetLocation(oLevier); //la porte doit avoir pour tag:Trap_ et on ajoute le tag du levier/// object oTarget=GetObjectByTag("Trap_" +sTag); ///////////////////////Random pour les sons du debut AZAZEL///////////////// string sSon; int nRandom= d8(1); switch (nRandom) { case 1: sSon= "as_cv_boilegrn1"; break; case 2: sSon= "as_cv_boilegrn2"; break; case 3: sSon= "as_cv_boilegrn1"; break; case 4: sSon= "as_cv_crank1"; break; case 5: sSon= "as_cv_beamcreak1"; break; case 6: sSon= "as_cv_beamcreak4"; break; case 7: sSon= "as_cv_pipegroan"; break; case 8: sSon= "as_cv_pipegroan"; break; } //Random pour les sons consequents////////// string sSon2; int nRandom2= d4(1); switch (nRandom2) { case 1: sSon2= "as_cv_boomdist1"; break; case 2: sSon2= "as_cv_boomdist2"; break; case 3: sSon2= "as_cv_pipegroan"; break; case 4: sSon2= "as_cv_pipegroan"; break; } if (GetLocalInt(OBJECT_SELF, "Fonction")==0) //pas en fonction? ok { SetLocalInt (OBJECT_SELF, "Fonction", 1); if (!GetIsOpen(oTarget)) { AssignCommand(oLevier,PlayAnimation (ANIMATION_PLACEABLE_ACTIVATE)); PlaySound("as_sw_lever1"); DelayCommand (2.0, PlaySound(sSon)); DelayCommand (5.0, PlaySound(sSon2)); DelayCommand (6.0, ActionOpenDoor(oTarget)); DelayCommand(8.0,DeleteLocalInt (OBJECT_SELF, "Fonction")); } else if (GetIsOpen(oTarget)) { AssignCommand(oLevier,PlayAnimation (ANIMATION_PLACEABLE_DEACTIVATE)); PlaySound("as_sw_lever1"); DelayCommand (2.0, PlaySound(sSon)); DelayCommand (5.0, PlaySound(sSon2)); DelayCommand (6.0, ActionCloseDoor(oTarget)); DelayCommand (8.0, DeleteLocalInt (OBJECT_SELF, "Fonction")); } } else if (GetLocalInt(oLevier, "Fonction")==1) { SendMessageToPC (oPC, ""); //en fonction? bloquer } } _________________ L'imagination est plus importante que le savoir. (Albert Einstein) Dernière édition par AZAZEL11 le 03/11/2007 17:50:03; édité 1 fois
|
Revenir en haut | |
AZAZEL11 Seigneur Messages: 156 |
bon ok, ca pas l'air d'intéresser grand monde pour les sons. Mais inquiétez vous pas
j'ai un nouveau problème héhé! en fait ma boucle pour trouver les autres portes (ayant le meme tag) ne fonctionne pas. Je sais pertinement que c'est soit ma zone qui est mal définie ou bien mon while qui est incorrect. Mais après quelques heures sans résultats, je donne ma langue au chat. quelqu'un d'assez aimable pourrait me dire mon erreur? NWScript : //created by: AZAZEL //script pour system de levier et trap UNIVERSEL //a mettre dans le OnUsed du levier //modified by: void main() { object oPC=GetLastUsedBy(); object oLevier= OBJECT_SELF; string sTag= GetTag(OBJECT_SELF); location lLoc= GetLocation(oLevier); //la porte doit avoir pour tag:Trap_ et on ajoute le tag du levier/// object oTarget=GetObjectByTag("Trap_" +sTag); object oArea=GetArea(oTarget); ///////////////////////Random pour les sons du debut AZAZEL///////////////// string sSon; int nRandom= d8(1); switch (nRandom) { case 1: sSon= "as_cv_boilegrn1"; break; case 2: sSon= "as_cv_boilegrn2"; break; case 3: sSon= "as_cv_boilegrn1"; break; case 4: sSon= "as_cv_crank1"; break; case 5: sSon= "as_cv_beamcreak1"; break; case 6: sSon= "as_cv_beamcreak4"; break; case 7: sSon= "as_cv_pipegroan"; break; case 8: sSon= "as_cv_pipegroan"; break; } //Random pour les sons consequents////////// string sSon2; int nRandom2= d4(1); switch (nRandom2) { case 1: sSon2= "as_cv_boomdist1"; break; case 2: sSon2= "as_cv_boomdist2"; break; case 3: sSon2= "as_cv_pipegroan"; break; case 4: sSon2= "as_cv_pipegroan"; break; } // int nDoor=GetObjectType(OBJECT_TYP E_DOOR); if (GetLocalInt(OBJECT_SELF, "Fonction")==0) //pas en fonction? ok { SetLocalInt (OBJECT_SELF, "Fonction", 1); while (GetIsObjectValid(oTarget)==TRUE) { // SendMessageToPC(oPC,"phase1"); if (!GetIsOpen(oTarget)) { //fermer SendMessageToPC(oPC,"phase2"); AssignCommand(oLevier,PlayAnimation (ANIMATION_PLACEABLE_ACTIVATE)); PlaySound("as_sw_lever1"); DelayCommand (2.0, PlaySound(sSon)); DelayCommand (5.0, PlaySound(sSon2)); DelayCommand (5.0, SetLocked(oTarget, FALSE)); DelayCommand (6.0, ActionOpenDoor(oTarget)); DelayCommand (7.0, SetLocked(oTarget, TRUE)); DelayCommand (8.0,DeleteLocalInt (OBJECT_SELF, "Fonction")); } ///fermer else if (GetIsOpen(oTarget)) { //ouvre SendMessageToPC(oPC,"phase3"); AssignCommand(oLevier,PlayAnimation (ANIMATION_PLACEABLE_DEACTIVATE)); PlaySound("as_sw_lever1"); DelayCommand (2.0, PlaySound(sSon)); DelayCommand (5.0, PlaySound(sSon2)); DelayCommand (6.0, ActionCloseDoor(oTarget)); DelayCommand (8.0, DeleteLocalInt (OBJECT_SELF, "Fonction")); } // // break; // ouvre } object oTrap=GetFirstObjectInArea(GetArea(oArea)); object oTarget; oTrap=oTarget; oTarget=GetNextObjectInArea(oArea); SendMessageToPC(oPC,"phase4"); } /// // else if (GetLocalInt(oLevier, "Fonction")==1) { SendMessageToPC (oPC, ""); //en fonction? bloquer } } _________________ L'imagination est plus importante que le savoir. (Albert Einstein) Dernière édition par AZAZEL11 le 30/10/2007 22:58:15; édité 1 fois
|
Revenir en haut | |
finipe Grand Sage du Conseil Messages: 519 Localisation: Nantes |
Sans avoir lu le détail de ton script, on peut déjà voir le problème suivant : tu définis oTrap=GetFirstObjectInArea(oArea) mais ensuite dans ta boucle tu commences avec while(GetIsObjectValid(oTarget)).
_________________ » 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 | |
AZAZEL11 Seigneur Messages: 156 |
ah bon sang! J'avais meme pas envisagé de vérifier ça!!! C'est surement ca car le script compile oui c'est déja ça mais aucune boucle d'effecuée. merci finipe je vais tester ca ce soir!
_________________ L'imagination est plus importante que le savoir. (Albert Einstein) |
Revenir en haut | |
AZAZEL11 Seigneur Messages: 156 |
ah c'Est n'importe quoi! j'y arrive pas lol! après moults tests en définissant mes variables autrement et de plusieurs facon rien ne fait!!! ma boucle est toujours inexistante mais mon script compile toujours...je sais que c'Est un rien mais ce *rien* là commence à m'énerver sérieusement!!! Ca fait 2 jours que je tente à temps perdu de résoudre ce script lol. (ca parait tu que je suis beginner avec les while? )
si je suis autant insistant c,est que j'ai besoin de ce script pour commencer mes futures maps, leur structures dépendent de ce script entre autre...pour mon labyrinthe PS' J'ai édité le CODE plus haut pour une meilleure compréhension. _________________ L'imagination est plus importante que le savoir. (Albert Einstein) |
Revenir en haut | |
finipe Grand Sage du Conseil Messages: 519 Localisation: Nantes |
Tu devrais INDENTER ton code avec beaucoup de RIGUEUR, ça simplifie terriblement la lecture, et on voit plus facilement les éventuelles erreurs. Essaye de l'organiser toujours de la même façon. Exemple totalement fictif :
NWScript :
void main() { object oPC = GetLastUsedBy(); object oLevier = OBJECT_SELF; string sTag = GetTag(OBJECT_SELF); if(sTag == "pouet") { // Chaque bloc d'instruction est compris entre if(....) { // .......... } else { // .......... } } } Si tu t'astreins à faire TOUJOURS de la même façon, tu t'épargneras bien des erreurs. C'est un peu autiste, mais pour bien programmer, faut être très rigoureux, y a pas de mystère _________________ » 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 | |
finipe Grand Sage du Conseil Messages: 519 Localisation: Nantes |
Tiens, voici ton code indenté avec rigueur : d'un seul coup, on s'aperçoit qu'il est farci de fautes, d'incohérences et d'oublis
NWScript :
//created by: AZAZEL //script pour system de levier et trap UNIVERSEL //a mettre dans le OnUsed du levier //modified by: void main() { object oPC = GetLastUsedBy(); object oLevier = OBJECT_SELF; string sTag = GetTag(OBJECT_SELF); location lLoc = GetLocation(oLevier); // La porte doit avoir pour tag : Trap_ et on ajoute le tag du levier object oTarget = GetObjectByTag("Trap_" + sTag); object oArea = GetArea(oTarget); // ***************** Random pour les sons du debut AZAZEL ************ string sSon; int nRandom = d8(1); switch(nRandom) { case 1: sSon = "as_cv_boilegrn1"; break; case 2: sSon = "as_cv_boilegrn2"; break; case 3: sSon = "as_cv_boilegrn1"; break; case 4: sSon = "as_cv_crank1"; break; case 5: sSon = "as_cv_beamcreak1"; break; case 6: sSon = "as_cv_beamcreak4"; break; case 7: sSon = "as_cv_pipegroan"; break; case 8: sSon = "as_cv_pipegroan"; break; } string sSon2; int nRandom2 = d4(1); switch(nRandom2) { case 1: sSon2 = "as_cv_boomdist1"; break; case 2: sSon2 = "as_cv_boomdist2"; break; case 3: sSon2 = "as_cv_pipegroan"; break; case 4: sSon2 = "as_cv_pipegroan"; break; } int nDoor = GetObjectType(OBJECT_TYPE_DOOR); if(GetLocalInt(OBJECT_SELF, "Fonction") == 0) { SetLocalInt(OBJECT_SELF, "Fonction", 1); while(GetIsObjectValid(oTarget) == TRUE) { SendMessageToPC(oPC, "phase1"); if(!GetIsOpen(oTarget)) { SendMessageToPC(oPC, "phase2"); AssignCommand(oLevier, PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE)); PlaySound("as_sw_lever1"); DelayCommand(2.0, PlaySound(sSon)); DelayCommand(5.0, PlaySound(sSon2)); DelayCommand(5.0, SetLocked(oTarget, FALSE)); DelayCommand(6.0, ActionOpenDoor(oTarget)); DelayCommand(7.0, SetLocked(oTarget, TRUE)); DelayCommand(8.0, DeleteLocalInt(OBJECT_SELF, "Fonction")); } else if(GetIsOpen(oTarget)) { SendMessageToPC(oPC, "phase3"); AssignCommand(oLevier, PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE)); PlaySound("as_sw_lever1"); DelayCommand(2.0, PlaySound(sSon)); DelayCommand(5.0, PlaySound(sSon2)); DelayCommand(6.0, ActionCloseDoor(oTarget)); DelayCommand(8.0, DeleteLocalInt(OBJECT_SELF, "Fonction")); } break; } object oTrap=GetFirstObjectInArea(GetArea(oArea)); object oTarget; oTrap = oTarget; oTarget = GetNextObjectInArea(oArea); SendMessageToPC(oPC, "phase4"); } else if(GetLocalInt(oLevier, "Fonction") == 1) { SendMessageToPC(oPC, ""); } } Ta boucle while déconne sérieusement ! Une boucle de ce type s'organise presque toujours de la façon suivante : NWScript : object oObjet = GetFirstObjectInArea(oArea); // ou bien GetFirstObjectInShape, ou tout autre GetFirstQuelqueChose... while(GetIsObjectValid(oObjet)) { if(test) { } oObjet = GetNextObjectInArea(oArea); // ou bien GetNextObjectInShape, ou tout autre GetNextQuelqueChose... } _________________ » 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 | |
AZAZEL11 Seigneur Messages: 156 |
rien d'encourageant....je crois que je vais me résigner a un levier pour chacunes des portes/grilles. (boulot de plus...)
mon problème pour les variables est que je dois utiliser le oTarget et le oTrap pour la meme porte, mais ca je crois que c'est bon non? en fait j'devrais peut etre me tapper une bonne lecture pour mieux connaitre les scripts car certaines options me sont inconnues encore, et c'Est MOI (LOL) qui est le scripteur de secours. _________________ L'imagination est plus importante que le savoir. (Albert Einstein) |
Revenir en haut | |
finipe Grand Sage du Conseil Messages: 519 Localisation: Nantes |
Mais non mais non. Il faut juste revoir ta boucle ! Cependant, je ne comprends pas bien le but de ton script. Tu parles de leviers, de portes, mais que veux-tu faire exactement ?
Ouvrir toutes les portes d'un seul levier ? Ouvrir des portes aléatoires ? Actionner plusieurs leviers pour une seule porte ? Ouvrir la porte la plus proche du levier considéré ? _________________ » 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 | |
AZAZEL11 Seigneur Messages: 156 |
ouvrir des portes avec le meme tag par un seul levier,
NWScript : "Trap_" +sTag _________________ L'imagination est plus importante que le savoir. (Albert Einstein) |
Revenir en haut | |
finipe Grand Sage du Conseil Messages: 519 Localisation: Nantes |
Sur le principe, ça devrait donner une architecture ressemblant à ça :
NWScript :
void main() { object oArea = GetArea(OBJECT_SELF); string sTag = "Trap_" + GetTag(OBJECT_SELF); object oTrap = GetFirstObjectInArea(oArea); while(GetIsObjectValid(oTrap)) { if(GetObjectType(oTrap) == OBJECT_TYPE_DOOR && GetTag(oTrap) == sTag) { if(!GetIsOpen(oTrap)) { AssignCommand(OBJECT_SELF, PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE)); } else { AssignCommand(OBJECT_SELF, PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE)); } } oTrap = GetNextObjectInArea(oArea); } } Ce sont les grandes lignes ! Ensuite, tu peux rajouter des trucs dans ce canevas là (les sons notamment). _________________ » 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 | |
AZAZEL11 Seigneur Messages: 156 |
même de cette facon la boucle ne s'exécute pas... merci d'avoir essayé.
_________________ L'imagination est plus importante que le savoir. (Albert Einstein) |
Revenir en haut | |
finipe Grand Sage du Conseil Messages: 519 Localisation: Nantes |
Le script brut tel que je te l'ai mis juste avant devrait fonctionner. S'il ne fonctionne pas, c'est que tu as une erreur quelque part... Telle que je l'ai écrite, la boucle devrait boucler !
_________________ » 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 | |
Anthraxcite Légende vivante Messages: 372 Localisation: Belgique |
Y a un break dans la boucle et un break dans une boucle ça permet de sortir de cette boucle(j'ai jamais trop aimé cette façon de sortir d'une boucle d'ailleurs).
|
Revenir en haut | |
finipe Grand Sage du Conseil Messages: 519 Localisation: Nantes |
Ouaip sauf que pour ce qu'il veut faire, il ne lui faut pas de break, puisque (si j'ai bien compris) il veut ouvrir toutes les portes d'une même zone avec un seul levier.
Mais j'ai peut-être mal compris _________________ » 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 | |
AZAZEL11 Seigneur Messages: 156 |
et bien...merci pour votre aide. J'y ai été d,une autre facon car avec la précédente, on aurait que c'était impossible!
NWScript : void main() { object oPC = GetLastUsedBy(); string sTag ="Trap_"+ GetTag(OBJECT_SELF); object oArea = GetArea(OBJECT_SELF); object oTrap; object oLevier=OBJECT_SELF; int nAction1=ANIMATION_PLACEABLE_ACTIVATE; int nAction2=ANIMATION_PLACEABLE_DEACTIVATE; //string sSon = GetSon(); //string sSon2 = GetSon2(); // string GetSon() //{ string sSon; switch(d8()) { case 1: sSon = "as_cv_boilegrn1"; break; case 2: sSon = "as_cv_boilegrn2"; break; case 3: sSon = "as_cv_boilegrn1"; break; case 4: sSon = "as_cv_crank1"; break; case 5: sSon = "as_cv_beamcreak1"; break; case 6: sSon = "as_cv_beamcreak4"; break; case 7: sSon = "as_cv_pipegroan"; break; case 8: sSon = "as_cv_pipegroan"; break; //} //return sSon; } //string GetSon2() //{ string sSon2; switch(d4()) { case 1: sSon2 = "as_cv_boomdist1"; break; case 2: sSon2 = "as_cv_boomdist2"; break; case 3: sSon2 = "as_cv_pipegroan"; break; case 4: sSon2 = "as_cv_pipegroan"; break; //} //return sSon2; } if (GetAbilityScore(oPC, ABILITY_STRENGTH)>=16) { if(!GetLocalInt(OBJECT_SELF, "Fonction")) { SetLocalInt(OBJECT_SELF, "Fonction", TRUE); oTrap=GetFirstObjectInArea(oArea); while(GetIsObjectValid(oTrap)) { if(GetObjectType(oTrap) == OBJECT_TYPE_DOOR && GetTag(oTrap) == sTag) { if ((!GetIsOpen(oTrap))&&(!GetLocalInt(oTrap, "open"))) { SetLocalInt(oTrap, "open", TRUE); DeleteLocalInt(oTrap, "close"); SetLocked(oTrap, FALSE); if (!GetLocalInt(OBJECT_SELF, "DoOnce")) { SetLocalInt(OBJECT_SELF, "DoOnce", TRUE); AssignCommand(OBJECT_SELF, PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE)); PlaySound("as_sw_lever1"); DelayCommand(2.0, PlaySound(sSon)); DelayCommand(5.0, PlaySound(sSon2)); } DelayCommand(6.0, ActionOpenDoor(oTrap)); DelayCommand(7.0, SetLocked(oTrap, TRUE)); } else if ((GetIsOpen(oTrap))&&(!GetLocalInt(oTrap, "close"))) { SetLocalInt(oTrap, "close", TRUE); DeleteLocalInt(oTrap, "open"); if (!GetLocalInt(OBJECT_SELF, "DoOnce")) { SetLocalInt(OBJECT_SELF, "DoOnce", TRUE); AssignCommand(OBJECT_SELF, PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE)); PlaySound("as_sw_lever1"); DelayCommand(2.0, PlaySound(sSon)); DelayCommand(5.0, PlaySound(sSon2)); } DelayCommand(6.0, ActionCloseDoor(oTrap)); } } oTrap = GetNextObjectInArea(oArea); } DelayCommand(7.0, DeleteLocalInt(OBJECT_SELF, "DoOnce")); DelayCommand(7.0, DeleteLocalInt(OBJECT_SELF, "Fonction")); } else { SendMessageToPC(oPC, ""); } } else { SendMessageToPC(oPC, ""); } } _________________ L'imagination est plus importante que le savoir. (Albert Einstein) |
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