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/11/2024 18:23:08
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 |
Kétil Dimzad Ecuyer Messages: 62 Localisation: Fijj'Bool City |
Posté le : 04/01/2004 02:04:09 Sujet du message : [SCRIPT] Help, systeme de casse des objets en combat
Salut à tous,
Voilà je voudrai un script qui me permette d'introduire la notion de casse des objets en combat. Je suis une quiche en script Mais bon, me suis coller sur l'editeur de script puisque mon ami Script Générator ne peut pas satisfaire ma demande Je suis arrivé à ça, ça compile mais ça marche pas NWScript :
// Se place sur le OnHeartBeat du module, c'est chiant mais je vois pas // comment lancer le script autrement. void main() { object oPC = GetLastHostileActor(); if (!GetIsPC(oPC)) return; //---------------------------- -------------------- if (d2()>1) return; //Si return ici, le script stope ou les autres tests sont faits ? object oItem = GetItemInSlot(INVENTORY_SLOT_ARMS, oPC); if(GetIsObjectValid(oItem)) DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("1--Une piece de votre equipement s'est brisee", oPC); //---------------------------- -------------------- if (d2()>1) return; oItem = GetItemInSlot(INVENTORY_SLOT_BELT, oPC); if(GetIsObjectValid(oItem)) DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("2--Une piece de votre equipement s'est brisee", oPC); //---------------------------- -------------------- if (d2()>1) return; oItem = GetItemInSlot(INVENTORY_SLOT_BOLTS, oPC); if(GetIsObjectValid(oItem)) DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("3--Une piece de votre equipement s'est brisee", oPC); //---------------------------- -------------------- if (d2()>1) return; oItem = GetItemInSlot(INVENTORY_SLOT_BOOTS, oPC); if(GetIsObjectValid(oItem)) DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("4--Une piece de votre equipement s'est brisee", oPC); //---------------------------- -------------------- if (d2()>1) return; oItem = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC); if(GetIsObjectValid(oItem)) DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("5--Une piece de votre equipement s'est brisee", oPC); //---------------------------- -------------------- if (d2()>1) return; oItem = GetItemInSlot(INVENTORY_SLOT_CLOAK, oPC); if(GetIsObjectValid(oItem)) DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("6--Une piece de votre equipement s'est brisee", oPC); //---------------------------- -------------------- if (d2()>1) return; oItem = GetItemInSlot(INVENTORY_SLOT_HEAD, oPC); if(GetIsObjectValid(oItem)) DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("7--Une piece de votre equipement s'est brisee", oPC); //---------------------------- -------------------- if (d2()>1) return; oItem = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC); if(GetIsObjectValid(oItem)) DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("8--Une piece de votre equipement s'est brisee", oPC); //---------------------------- -------------------- if (d2()>1) return; oItem = GetItemInSlot(INVENTORY_SLOT_LEFTRING, oPC); if(GetIsObjectValid(oItem)) DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("9--Une piece de votre equipement s'est brisee", oPC); //---------------------------- -------------------- if (d2()>1) return; oItem = GetItemInSlot(INVENTORY_SLOT_NECK, oPC); if(GetIsObjectValid(oItem)) DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("9--Une piece de votre equipement s'est brisee", oPC); //---------------------------- -------------------- if (d2()>1) return; oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC); if(GetIsObjectValid(oItem)) DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("10--Une piece de votre equipement s'est brisee", oPC); //---------------------------- -------------------- if (d2()>1) return; oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTRING, oPC); if(GetIsObjectValid(oItem)) DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("11--Une piece de votre equipement s'est brisee", oPC); //---------------------------- -------------------- if (d2()>1) return; oItem = GetItemInSlot(INVENTORY_SLOT_ARROWS, oPC); if(GetIsObjectValid(oItem)) DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("12--Une piece de votre equipement s'est brisee", oPC); //---------------------------- -------------------- if (d2()>1) return; oItem = GetItemInSlot(INVENTORY_SLOT_BOLTS, oPC); if(GetIsObjectValid(oItem)) DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("13--Une piece de votre equipement s'est brisee", oPC); //---------------------------- -------------------- if (d2()>1) return; oItem = GetItemInSlot(INVENTORY_SLOT_BULLETS, oPC); if(GetIsObjectValid(oItem)) DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("14--Une piece de votre equipement s'est brisee", oPC); //---------------------------- -------------------- if (d2()>1) return; oItem = GetItemInSlot(INVENTORY_SLOT_CARMOUR, oPC); if(GetIsObjectValid(oItem)) DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("15--Une piece de votre equipement s'est brisee", oPC); //---------------------------- -------------------- if (d2()>1) return; oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oPC); if(GetIsObjectValid(oItem)) DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("16--Une piece de votre equipement s'est brisee", oPC); //---------------------------- -------------------- if (d2()>1) return; oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oPC); if(GetIsObjectValid(oItem)) DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("17--Une piece de votre equipement s'est brisee", oPC); //---------------------------- -------------------- if (d2()>1) return; oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oPC); if(GetIsObjectValid(oItem)) DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("18--Une piece de votre equipement s'est brisee", oPC); } Donc mon but, c'est que à chaque round de combat (enfin toutes les 6 secondes puisque OnHeartBeat ) il y ait un test pour toutes les parties équipées ( et seulement équipées ) du perso, et une proba que l'objet se brise. La proba est à 50% sur ce script de manière à pouvoir tester. Vala, si quelqu'un pouvait m'aider.... |
Revenir en haut | |
Longbow Grand Sage du Conseil Messages: 638 Localisation: Orléans |
Hum... Hum...
Effectivement solliciter le OnHearBeat de ton module n'est pas une très bonne idée... Pourquoi ne pas utiliser le OnPhysicalAttack puisque nous sommes dans le cas d'un combat... touché ou non... Je te propose ceci...ca compile, ca fonctionne mais je ne suis pas sûr que ce soit ce que tu recherches vraiment (3h du mat)... En tout cas, cela évite le OnHeartBeat du module. NWScript : void main() { object oPC = GetLastAttacker(); object oItem; if (GetIsPC(oPC)) { if (d2()>1) return; oItem = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC); if(GetIsObjectValid(oItem)) {DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("", oPC);} if (d2()>1) return; oItem = GetItemInSlot(INVENTORY_SLOT_HEAD, oPC); if(GetIsObjectValid(oItem)) {DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("", oPC);} //---------------------------- -------------------- if (d2()>1) return; oItem = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC); if(GetIsObjectValid(oItem)) {DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("", oPC);} //---------------------------- -------------------- if (d2()>1) return; oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC); if(GetIsObjectValid(oItem)) {DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("", oPC);} //---------------------------- -------------------- if (d2()>1) return; {oItem = GetItemInSlot(INVENTORY_SLOT_CARMOUR, oPC); if(GetIsObjectValid(oItem)) {DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("", oPC);} //---------------------------- -------------------- if (d2()>1) return; oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oPC); if(GetIsObjectValid(oItem)) {DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("", oPC);} //---------------------------- -------------------- if (d2()>1) return; oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oPC); if(GetIsObjectValid(oItem)) {DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("", oPC);} //---------------------------- -------------------- if (d2()>1) return; oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oPC); if(GetIsObjectValid(oItem)) {DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("", oPC);} } } // Sinon le script de Bioware else { ExecuteScript("nw_c2_default5", OBJECT_SELF); } } _________________ Rex illeteratus Quasi Asinus Coronatus Jean de Salisbury |
Revenir en haut | |
Tzeentsh Ecuyer Messages: 41 |
Tu devrais plutot utiliser le OnDamaged des monstres pour ce genre de script (ou le OnHit qui arrive avec HotU).
|
Revenir en haut | |
Longbow Grand Sage du Conseil Messages: 638 Localisation: Orléans |
Hum... Hum...
Dans ce cas utiliser la commande 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. La question étant de savoir si un objet ne peut-être brisé que s'il touche ou s'il sert... Hors dans le cas d'un casque, il ne serait pas très logique de le briser parce qu'on a frappé... Je réserverais ce script aux équipements offensifs (en excluant d'ailleurs les armes à distances:) BASE_ITEM_DART BASE_ITEM_HEAVYCROSSBOW BASE_ITEM_LONGBOW ... etc Bref tu as les éléments à toi de voir l'usage... _________________ Rex illeteratus Quasi Asinus Coronatus Jean de Salisbury |
Revenir en haut | |
Kétil Dimzad Ecuyer Messages: 62 Localisation: Fijj'Bool City |
merci a vous pour vos reponses. J'ai modifié un peu le script, pour que la localisation de l'objet cassé soit plus aléatoire.
NWScript :
void main() { object oPC = GetLastAttacker(); object oItem; int nLoc; if (!GetIsPC(oPC)) return; if (d100()<=1 && d100()<=1 && d100()<=1 && d100()<=1 && d100()<=1 ) // Une chance sur 500 de casser { int nLoc = d20(); if ( nLoc == 1 ) { oItem = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC); if(GetIsObjectValid(oItem)) { DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("", oPC); } } if ( nLoc == 2 ) { oItem = GetItemInSlot(INVENTORY_SLOT_HEAD, oPC); if(GetIsObjectValid(oItem)) { DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("", oPC); } } if ( nLoc == 3 ) { oItem = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC); if(GetIsObjectValid(oItem)) { DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("", oPC); } } if ( nLoc == 4 ) { oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC); if(GetIsObjectValid(oItem)) { DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("", oPC); } } if ( nLoc == 5 ) { oItem = GetItemInSlot(INVENTORY_SLOT_CARMOUR, oPC); if(GetIsObjectValid(oItem)) { DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("", oPC); } } if ( nLoc == 6 ) { oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oPC); if(GetIsObjectValid(oItem)) { DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("", oPC); } } if ( nLoc == 7 ) { oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oPC); if(GetIsObjectValid(oItem)) { DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("", oPC); } } if ( nLoc == 8 ) { oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oPC); if(GetIsObjectValid(oItem)) { DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("", oPC); } } if ( nLoc == 9 ) { object oItem = GetItemInSlot(INVENTORY_SLOT_ARMS, oPC); if(GetIsObjectValid(oItem)) { DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("ARMS--Une piece de votre equipement s'est brisee", oPC); } } if ( nLoc == 10 ) { oItem = GetItemInSlot(INVENTORY_SLOT_BELT, oPC); if(GetIsObjectValid(oItem)) { DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("BELT--Une piece de votre equipement s'est brisee", oPC); } } if ( nLoc == 11 ) { oItem = GetItemInSlot(INVENTORY_SLOT_BOLTS, oPC); if(GetIsObjectValid(oItem)) { DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("BOLTS--Une piece de votre equipement s'est brisee", oPC); } } if ( nLoc == 12 ) { oItem = GetItemInSlot(INVENTORY_SLOT_BOOTS, oPC); if(GetIsObjectValid(oItem)) { DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("BOOTS--Une piece de votre equipement s'est brisee", oPC); } } if ( nLoc == 13 ) { oItem = GetItemInSlot(INVENTORY_SLOT_CLOAK, oPC); if(GetIsObjectValid(oItem)) { DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("CLOAK--Une piece de votre equipement s'est brisee", oPC); } } if ( nLoc == 14 ) { oItem = GetItemInSlot(INVENTORY_SLOT_LEFTRING, oPC); if(GetIsObjectValid(oItem)) { DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("LEFTRING--Une piece de votre equipement s'est brisee", oPC); } } if ( nLoc == 15 ) { oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTRING, oPC); if(GetIsObjectValid(oItem)) { DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("RIGHTRING--Une piece de votre equipement s'est brisee", oPC); } } if ( nLoc == 16 ) { oItem = GetItemInSlot(INVENTORY_SLOT_NECK, oPC); if(GetIsObjectValid(oItem)) { DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("NECK--Une piece de votre equipement s'est brisee", oPC); } } if ( nLoc == 17 ) { oItem = GetItemInSlot(INVENTORY_SLOT_ARROWS, oPC); if(GetIsObjectValid(oItem)) { DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("ARROWS--Une piece de votre equipement s'est brisee", oPC); } } if ( nLoc == 18 ) { oItem = GetItemInSlot(INVENTORY_SLOT_BULLETS, oPC); if(GetIsObjectValid(oItem)) { DestroyObject(oItem, 0.0); FloatingTextStringOnCreature("BULLETS--Une piece de votre equipement s'est brisee", oPC); } } if ( nLoc == 19 ) { FloatingTextStringOnCreature("Votre equipement souffre du combat bien qu'il n'y ait pas de casse...", oPC); } if ( nLoc == 20 ) { FloatingTextStringOnCreature("Votre equipement souffre du combat bien qu'il n'y ait pas de casse...", oPC); } // Sinon le script de Bioware else { ExecuteScript("nw_c2_default5", OBJECT_SELF); } } } Pour répondre à LongBow, dans la mesure ou les joueurs ne sont pas censé s'y connaitre en nwscript et surtout qu'il ne sont pas censé connaitre les scripts du module, ce n'est qu'un détail. Je souhaite juste simulé le fait qu'en combat, ils puissent casser de l'equipement. Je ne prend que l'equipement équipé et donc visible par les ennemis. Pour ce qui est d'un casque par exemple c'est sur que si le joueur tire a distance et casse un casque c'est pas super terrible au niveau du realisme mais bon.... Je vois pas trop comment envisager un tel cas de figure au niveau des scripts. Vala vala Maintenant, j'aimerai un dernier renseignement, comment utilise-t-on ces constantes dans les scripts : 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.
J'aimerai que lorsqu'un joueur casse un objet, il y ait un bruit d'objet cassé et que son perso lache un juron. Merci encore. |
Revenir en haut | |
Lavok Légende vivante Messages: 434 Localisation: Sphère planaire |
Kétil Dimzad a écrit : if (d100()<=1 && d100()<=1 && d100()<=1 && d100()<=1 && d100()<=1 )
Non, pas vraiment. En fait, c'est une chance sur 10 milliards (100 exposant 5) ... Utilises plutôt un bon vieux 'if(Random(500)==0)' .// Une chance sur 500 de casser _________________ ToB : Une seule chose semble certaine : tant que le trône de sang de Bhaal restera vide, le chaos règnera. Moi : Une seule chose semble certaine : tant que la tête de singe de Bush restera vide, le chaos règnera. |
Revenir en haut | |
Kétil Dimzad Ecuyer Messages: 62 Localisation: Fijj'Bool City |
lol merci lavok
|
Revenir en haut | |
Longbow Grand Sage du Conseil Messages: 638 Localisation: Orléans |
Hum... Hum...
Voyons ces deux commandes (au fait, tu connais sans doute le livre de référence de tout scripteur: le Lexicon) int TALKVOLUME_TALK est utilisé pour indiquer quelle intensité a la voix (murmure, Crier...) dans les fonctions SpeakString() ou ActionSpeakString.. Pour TALK, à la limite pas besoin, c'est le niveau sonore par défault. int VOICE_CHAT_BORED est utilisé avec par exemple 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. _________________ Rex illeteratus Quasi Asinus Coronatus Jean de Salisbury |
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