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 01/11/2024 16:24:20
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 |
Ailesnoires Grand Chevalier Messages: 110 Localisation: Vendée |
Bonjour à tous
Je script depuis peu et je m'amuse pas mal a le faire, je viens de finir le script d'un feu d'artifice (c'était un orage à la base) ce script fonctionne parfaitement bien et est modulable en fonction de la zone. Son script fonctionne alors pourquoi il poste ici celui là ? me demanderez vous Ma question est simple, ce qui ne l'est peut être pas de la réponse. j'ai mit le script dans le OnHeartbeat de la zone et il ne se déclanche que la nuit tombé. Je voudrais savoir si il serait la cause d'un lag? Et aussi si vous avez de petite remarque à faire sur tel où tel chose n'hésitez pas. NWScript : /***************************** */ /***************************** */ /***** Feu d'artifice *****/ /***** Ailesnoires *****/ /***************************** */ /***************************** */ void main() { object oItem = GetFirstObjectInArea(GetArea(OBJECT_SELF)); while (GetIsObjectValid(oItem)) { if(GetIsPC(oItem) && GetIsNight()) { /**********PARAMETRES A REGLER***********/ /*---------------------------- ----------*/ /*---------------------------- ----------*/ /*******NOMBRE DE CARRE DE LA ZONE*******/ /*-------*/ int iLargeur = 6; /*-------*/ /*-------*/ int iHauteur = 6; /*-------*/ /*---------------------------- ----------*/ /*---------------------------- ----------*/ /********NOMBRE D IMPACT EN 6 SEC********/ /*------*/ int iCountmax = 15; /*------*/ /*---------------------------- ----------*/ /***************************** ***********/ /********POURCENTAGE D'ETRE TOUCHE*******/ /*-------*/ int iTouche = 1; /*--------*/ /*---------------------------- ----------*/ /***************************** ***********/ effect eUn = EffectVisualEffect(VFX_IMP_FORTITUDE_SAVING_THROW_USE); effect eDeux = EffectVisualEffect(VFX_IMP_MAGBLUE); effect eTrois = EffectVisualEffect(VFX_IMP_RESTORATION_GREATER); effect eQuatre = EffectVisualEffect(VFX_IMP_FROST_L); effect eCinq = EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY); effect eSix = EffectVisualEffect(VFX_IMP_FROST_S); effect eSept = EffectVisualEffect(VFX_IMP_EVIL_HELP); effect eHuit = EffectVisualEffect(VFX_IMP_TORNADO); effect eNeuf = EffectVisualEffect(VFX_IMP_HEAD_EVIL); effect eEffect1; effect eEffect2; effect eEffect3; object oArea = GetArea(OBJECT_SELF); int iRandom; int iX; int iY; int iEffect; int iCount; int iRdm1; int iRdm2; float fRdm2; float fDelay; float fX; float fY; float fXmax; float fYmax; float fXpj; float fYpj; vector vPos; vector vPj; location lEclair; location lPj = GetLocation(oItem); //Calcul des coordonees maximun de la zone fXmax = iLargeur*10 + 0.0; fYmax = iHauteur*10 + 0.0; vPj = GetPosition(oItem); fXpj = vPj.x; fYpj = vPj.y; for (iCount=1;iCount<iCountmax { iCount++; //Calcul aleatoire du delai entre 0 et 6 puis mise en float iRdm1 = Random(5)+1; iRdm2 = Random(9); fRdm2 = iRdm2 + 0.0; fDelay = iRdm1 + fRdm2; //Calcul aleatoire des coordonees de l'impact iX = Random(20)-10; fX = iX + fXpj; iY = Random(20)-10; fY = iY + fYpj; if (fX > fXmax) { fX = fXmax-(fX-fXmax); } if (fY > fYmax) { fY = fYmax-(fY-fYmax); } if (fX < fX - fX) { fX = -fX; } if (fY < fY - fY) { fY = -fY; } //Repartition aleatoire des effets //3 effets par impacts parmis un choix de 9 effets iEffect = Random(5)+1; if(iEffect == 1){eEffect1 = eUn;} if(iEffect == 2){eEffect1 = eDeux;} if(iEffect == 3){eEffect1 = eTrois;} if(iEffect == 4){eEffect1 = eQuatre;} if(iEffect == 5){eEffect1 = eCinq;} if(iEffect == 6){eEffect1 = eSix;} if(iEffect == 7){eEffect1 = eSept;} if(iEffect == 8){eEffect1 = eHuit;} if(iEffect == 9){eEffect1 = eNeuf;} iEffect = Random(5)+1; if(iEffect == 1){eEffect2 = eUn;} if(iEffect == 2){eEffect2 = eDeux;} if(iEffect == 3){eEffect2 = eTrois;} if(iEffect == 4){eEffect2 = eQuatre;} if(iEffect == 5){eEffect2 = eCinq;} if(iEffect == 6){eEffect2 = eSix;} if(iEffect == 7){eEffect1 = eSept;} if(iEffect == 8){eEffect1 = eHuit;} if(iEffect == 9){eEffect1 = eNeuf;} iEffect = Random(5)+1; if(iEffect == 1){eEffect3 = eUn;} if(iEffect == 2){eEffect3 = eDeux;} if(iEffect == 3){eEffect3 = eTrois;} if(iEffect == 4){eEffect3 = eQuatre;} if(iEffect == 5){eEffect3 = eCinq;} if(iEffect == 6){eEffect3 = eSix;} if(iEffect == 7){eEffect1 = eSept;} if(iEffect == 8){eEffect1 = eHuit;} if(iEffect == 9){eEffect1 = eNeuf;} //Application des effets vPos = Vector(fX, fY, 5.0); lEclair = Location(oArea, vPos, 0.0); DelayCommand(fDelay, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eEffect1, lEclair)); DelayCommand(fDelay, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eEffect2, lEclair)); DelayCommand(fDelay, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eEffect3, lEclair)); } //Calcul aleatoire pour toucher le premier joueur dans la zone iRandom = Random(100); if(iRandom<iTouche) { effect eEffect = EffectRegenerate(20, 1.0); SetIsDestroyable(FALSE, FALSE, FALSE); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eEffect, oItem, 30.0); ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeux, oItem); GiveXPToCreature(oItem, 200); } return; } oItem = GetNextObjectInArea(GetArea(OBJECT_SELF)); } } |
Revenir en haut | |
lylver Héros Messages: 274 |
Jette un oeil par là :
http://www.system-tek.com/nwinter/phpbb2/viewtopic.php?p=99175&highlight=#p99175 |
Revenir en haut | |
Ailesnoires Grand Chevalier Messages: 110 Localisation: Vendée |
Je ne regrete vraiment pas d'avoir posé cette question ic , merci a toi lylver, c'est vraiment sympa d'avoir répondu.
je vais appliquer ça, ça va beaucoup me servir |
Revenir en haut | |
frenchris Novice Messages: 8 |
yop,
pour ceux qui comme moi seront interessés par ce tres chouette feu d' artifice gaffe a ça, ligne 86 : NWScript :
for (iCount=1;iCount<iCountmax qui est en fait, biensur : for (iCount=1;iCount<iCountmax;) Chris. |
Revenir en haut | |
Ailesnoires Grand Chevalier Messages: 110 Localisation: Vendée |
merci
|
Revenir en haut | |
arknax Ecuyer Messages: 56 |
Euh, au cas ou personne aurait répondu à ta première question, tu devrais revoir ta ligne ici :
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. Ça va peut-être répondre à ta question. *Au cas ou tu l'aurais pas trouvé, il faut enlever le &&GetIsNight() |
Revenir en haut | |
Ivellios Légende vivante Messages: 447 Localisation: Poitiers |
Moi aussi je croyait au debut qu'il fallait enlever la nuit.
Mais ne relisant bien sa phrase tu verra c'est pas une question, il précise juste que c'est sur le oHB et la nuit ^^ _________________ Scripts, systèmes, fonctions,... c'est par ici... Pyjama pour castor, une vocation, un avenir sûr |
Revenir en haut | |
Ailesnoires Grand Chevalier Messages: 110 Localisation: Vendée |
exact Ivellios car je prefers les feux d'artifices de nuit.
Merci tout de même arknax |
Revenir en haut | |
arknax Ecuyer Messages: 56 |
Hu? Euh...On se connaît?
*La prochaine fois j'essayerais de faire plus attention à la question. |
Revenir en haut | |
Ailesnoires Grand Chevalier Messages: 110 Localisation: Vendée |
A la demande de Djezebel j'ai adapté mon feu d'artifice.
Tout d'abord creer un objet invisible avec le tag et le resref : meche creer un objet inventaire de tag "amorce" avec "lancer un sort : Pouvoir unique" (pas sur soi) Creer le script suivant avec pour nom "feuartifice" NWScript :
int GetAreaXDim(object oArea); int GetAreaYDim(object oArea); // Feu d'artifice // - oArea // - lFeu : location du feu d'artifice // - iDure : duree du feu d'artifice en minutes // - iImpact : nombre d'impacs par minute void feuartifice(object oArea, location lFeu,int iDure=2, int iImpact=150); int GetAreaXDim(object oArea) { int nX; int nEnd; location lLoc; vector vPos; nEnd=FALSE; while ((nX<=31) && (!nEnd)) { vPos=Vector(IntToFloat(nX), 0.0, 0.0); lLoc=Location(oArea, vPos, 0.0); int nCol=GetTileSourceLight1Color(lLoc); if (nCol==519) { nEnd=TRUE; nX--; } else { nX++; } } return nX+1; } int GetAreaYDim(object oArea) { int nY; int nEnd; location lLoc; vector vPos; nEnd=FALSE; while ((nY<=31) && (!nEnd)) { vPos=Vector(0.0, IntToFloat(nY), 0.0); lLoc=Location(oArea, vPos, 0.0); int nCol=GetTileSourceLight1Color(lLoc); if (nCol==519) { nEnd=TRUE; nY--; } else { nY++; } } return nY+1; } void feuartifice(object oArea, location lFeu, int iDure, int iImpact) { //calcul de la taille de la carte int iLargeur = GetAreaXDim(oArea); int iHauteur = GetAreaYDim(oArea); //calcul de la duree et du nombre d'impacts iImpact = iImpact*iDure; iDure = iDure*60; //enregistrement des effets effect eUn = EffectVisualEffect(VFX_IMP_FORTITUDE_SAVING_THROW_USE); effect eDeux = EffectVisualEffect(VFX_IMP_MAGBLUE); effect eTrois = EffectVisualEffect(VFX_IMP_RESTORATION_GREATER); effect eQuatre = EffectVisualEffect(VFX_IMP_FROST_L); effect eCinq = EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY); effect eSix = EffectVisualEffect(VFX_IMP_FROST_S); effect eSept = EffectVisualEffect(VFX_IMP_EVIL_HELP); effect eHuit = EffectVisualEffect(VFX_IMP_TORNADO); effect eNeuf = EffectVisualEffect(VFX_IMP_HEAD_EVIL); effect eEffect1; effect eEffect2; effect eEffect3; //declaration des integers int iRandom; int iX; int iY; int iZ; int iEffect; int iCount; int iRdm1; int iRdm2; //declaration des floats float fRdm2; float fDelay; float fX; float fY; float fZ; float fXmax; float fYmax; float fXFeu; float fYFeu; //declarations des vecteurs et locations vector vPos; vector vFeu; location lEclair; //Calcul des coordonees maximun de la zone fXmax = IntToFloat(iLargeur)*10; fYmax = IntToFloat(iHauteur)*10; //mise enplace du placeable de location CreateObject(OBJECT_TYPE_PLACEABLE,"meche",lFeu); object oFeu = GetObjectByTag("meche"); vFeu = GetPosition(GetObjectByTag("meche")); fXFeu = vFeu.x; fYFeu = vFeu.y; DestroyObject(oFeu,60.0); //boucle des calcul des impacts for (iCount=1;iCount<iImpact; ) { iCount++; //Calcul aleatoire du delai puis mise en float iRdm1 = Random(iDure)+1; iRdm2 = Random(9); fRdm2 = iRdm2 + 0.0; fDelay = iRdm1 + fRdm2; //Calcul aleatoire des coordonees de l'impact iX = Random(20)-10; fX = iX + fXFeu; iY = Random(20)-10; fY = iY + fYFeu; iZ = Random(50)-25; fZ = (IntToFloat(iZ)/10)+7.5; if (fX > fXmax) { fX = fXmax-(fX-fXmax); } if (fY > fYmax) { fY = fYmax-(fY-fYmax); } if (fX < fX - fX) { fX = -fX; } if (fY < fY - fY) { fY = -fY; } //Repartition aleatoire des effets //3 effets par impacts parmis un choix de 9 effets iEffect = Random(8)+1; if(iEffect == 1){eEffect1 = eUn;} if(iEffect == 2){eEffect1 = eDeux;} if(iEffect == 3){eEffect1 = eTrois;} if(iEffect == 4){eEffect1 = eQuatre;} if(iEffect == 5){eEffect1 = eCinq;} if(iEffect == 6){eEffect1 = eSix;} if(iEffect == 7){eEffect1 = eSept;} if(iEffect == 8){eEffect1 = eHuit;} if(iEffect == 9){eEffect1 = eNeuf;} iEffect = Random(8)+1; if(iEffect == 1){eEffect2 = eUn;} if(iEffect == 2){eEffect2 = eDeux;} if(iEffect == 3){eEffect2 = eTrois;} if(iEffect == 4){eEffect2 = eQuatre;} if(iEffect == 5){eEffect2 = eCinq;} if(iEffect == 6){eEffect2 = eSix;} if(iEffect == 7){eEffect1 = eSept;} if(iEffect == 8){eEffect1 = eHuit;} if(iEffect == 9){eEffect1 = eNeuf;} iEffect = Random(8)+1; if(iEffect == 1){eEffect3 = eUn;} if(iEffect == 2){eEffect3 = eDeux;} if(iEffect == 3){eEffect3 = eTrois;} if(iEffect == 4){eEffect3 = eQuatre;} if(iEffect == 5){eEffect3 = eCinq;} if(iEffect == 6){eEffect3 = eSix;} if(iEffect == 7){eEffect1 = eSept;} if(iEffect == 8){eEffect1 = eHuit;} if(iEffect == 9){eEffect1 = eNeuf;} //Application des artifices vPos = Vector(fX, fY, fZ); lEclair = Location(oArea, vPos, 0.0); DelayCommand(fDelay, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eEffect1, lEclair)); DelayCommand(fDelay, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eEffect2, lEclair)); DelayCommand(fDelay, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eEffect3, lEclair)); } } inclure le script suivant dans OnActivateItem du module Avec #include "feuartifice" ce qui donne avec ce seul script en OnAvtivateItem NWScript :
#include "feuartifice" #include "x2_inc_switches" void main() { object oItem = GetItemActivated(); if(GetTag(oItem)=="amorce")//l'objet utiliser lance le feu { object oArea = GetArea(GetItemActivator()); location lFeu = GetItemActivatedTargetLocation(); feuartifice(oArea,lFeu); } // * Generic Item Script Execution Code // * If MODULE_SWITCH_EXECUTE_TAGBASED _SCRIPTS is set to TRUE on the module, // * it will execute a script that has the same name as the item's tag // * inside this script you can manage scripts for all events by checking against // * GetUserDefinedItemEventNumber( ). See x2_it_example.nss if (GetModuleSwitchValue(MODULE_SWITCH_ENABLE_TAGBASED_SCRIPTS) == TRUE) { SetUserDefinedItemEventNumber(X2_ITEM_EVENT_ACTIVATE); int nRet = ExecuteScriptAndReturnInt(GetUserDefinedItemEventScriptName(oItem),OBJECT_SELF); if (nRet == X2_EXECUTE_SCRIPT_END) { return; } } } Il ne reste plus qu'à trouver une occasion de faire la fête PS : Merci à lendraste pour son script de calcul de taille de zone |
Revenir en haut | |
Djezebel Héros Messages: 252 |
Merci beaucoup
C'est super ! Ca marche !!! ... presque J'ai le script par défaut dans le OnActivateItem de Nwn (nommé : x2_mod_def_act) qui dit de prendre le nom de l'objet et de lui appliquer le script correspondant. Donc j'ai au final deux scripts : Un "feuartifice" et un autre "amorce". Seulement, à la compilation, ça me dit pour "feu artifice" : feuartifice.nss: ERREUR : NO FUNCTION MAIN() IN SCRIPT Et quand je le lance ça me fait 3 erreurs : Script amorce, OID: 80000000, Tag:, ERREUR : TOO MANY INSTRUCTIONS Script amorce, OID: 80000000, Tag:, ERREUR : TOO MANY INSTRUCTIONS Script x2_mod_def_act, OID: 80000000, Tag:, ERREUR : TOO MANY INSTRUCTIONS Une idée ? |
Revenir en haut | |
Ailesnoires Grand Chevalier Messages: 110 Localisation: Vendée |
a la place de x2_mod_def_act tu mets le script suivant :
j'ai fais en sorte que mon script s'ajoute à l'ancien. Il lancera "feuartifice" quand il le faut NWScript : #include "feuartifice" #include "x2_inc_switches" void main() { object oItem = GetItemActivated(); if(GetTag(oItem)=="amorce")//l'objet utiliser lance le feu { object oArea = GetArea(GetItemActivator()); location lFeu = GetItemActivatedTargetLocation(); feuartifice(oArea,lFeu); } // * Generic Item Script Execution Code // * If MODULE_SWITCH_EXECUTE_TAGBASED _SCRIPTS is set to TRUE on the module, // * it will execute a script that has the same name as the item's tag // * inside this script you can manage scripts for all events by checking against // * GetUserDefinedItemEventNumber( ). See x2_it_example.nss if (GetModuleSwitchValue(MODULE_SWITCH_ENABLE_TAGBASED_SCRIPTS) == TRUE) { SetUserDefinedItemEventNumber(X2_ITEM_EVENT_ACTIVATE); int nRet = ExecuteScriptAndReturnInt(GetUserDefinedItemEventScriptName(oItem),OBJECT_SELF); if (nRet == X2_EXECUTE_SCRIPT_END) { return; } } } |
Revenir en haut | |
Djezebel Héros Messages: 252 |
Ca marche !
C'est magique ! T'es génial ! C'est super ! T'es un dieu vivant ! |
Revenir en haut | |
Ailesnoires Grand Chevalier Messages: 110 Localisation: Vendée |
heu... ce n'est qu'un script et c'est moi qui te remerci de l'utiliser
|
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