
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.







La date/heure actuelle est 01/05/2025 14:13:31
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 |
Djezebel Héros ![]() Messages: 252 |
Bonsoir à tous !
Je tente de réaliser une scenette mais malheureusement je coince dans le "comment faire". Voici l'idée : Un joueur se promène innocement dans la foret luxuriante et... (*va abréger les détails*) et soudain, trois bandits surgissent de nulle part. Deux d'entre eux se jettent avec férocité sur le joueur tandis que le dernier, leur chef, bien plus puissant, observe la scène et la commente. Donc pour cela j'ai créé : - Un PNJ "bandit001" (le chef des bandits) - Un trigger qui fait apparaître les trois bandits - Un waypoint pour la localisation des bandits Aucun problème pour faire apparaitre les PNJ. "Bandit001" a ses scripts par défaut dans le OnDamaged, OnPhysicalAttack et OnSpellCastAt Donc, il regarde bien sans rien faire sauf si on l'attaque... Par contre... j'aimerai qu'il parle ! Dans le OnSpawn ça ne fonctionne pas... 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. Si c'est possible, je souhaiterais qu'il dise quelque chose : - A son arrivée (exemple : "Tuez-moi ça") - Quand un de ses compères se fait tuer (ex : "Vous aurais-je sous-estimé ?") - Quand les deux bandits sont tués (puis DestroyObject(OBJECT_SELF)) (ex : "Finalement, vous n'êtes pas si mauvais qu'on le dit") - Quand le joueur est tué (puis DestroyObject(OBJECT_SELF)) (ex : "Voilà ce qui arrive à des larves dans votre genre") Est-ce possible ? Je ne vois pas à quel moment on pourrait mettre une vérification de variable (si le joueur peut aquérir une variable une fois qu'il a tué le bandit, si toutefois il est tout seul car s'il est en groupe ça risque de se compliquer... non ?) Merci de votre attention ! Dernière édition par Djezebel le 05/01/2006 20:52:27; édité 1 fois
|
Revenir en haut | ![]() ![]() ![]() |
Anthraxcite Légende vivante Messages: 372 Localisation: Belgique |
Stocke les variables sur le chef, dans le OnHeartBeat du chef tu testes la variable dans un switch.
Variable à 0(case 0 ![]() A la mort d'un bandit tu augmentes la variable de 1 Variable à 2(case 2 ![]() Variable à 4(case 4 ![]() A chaque ohb tu vérifies en plus que le joueur est tjs vivant.(peut-etre un SetLocalObject quand le joueur entre dans le trigger histoire de l'identifier) |
Revenir en haut | ![]() ![]() ![]() ![]() ![]() |
Enki Légende vivante ![]() Messages: 432 |
Bonsoir Djezebel,
J'ai appliqué à une où deux choses près les conseils d'Anthraxcite. Je n'avais jamais utilisé la fonction GetLocalObject, cela m'a permis de comprendre son intérêt. C'est très utile ! Voilà les scripts que j'ai fait, pour trois PNJ (en fait deux ResRef pour trois PNJ). Les bandits ont le TAG et le ResRef "bandit" ( comme c'est original). Le chef a le TAG et le ResRef "bandit001" (c'est déja mieux que "luline006" !) Sur le trigger, j'ai mis ce script : NWScript :
void main() { object oPC=GetEnteringObject(); object oArea=GetArea(OBJECT_SELF); location lLocation=GetLocation(GetWaypointByTag("way01")); if (GetLocalInt(OBJECT_SELF,"NW_DO_ONCE") != 0) return; if (GetIsPC(oPC)) { object oBandit=CreateObject(OBJECT_TYPE_CREATURE,"bandit",lLocation,TRUE); object oBandit01=CreateObject(OBJECT_TYPE_CREATURE,"bandit001",lLocation,TRUE); object oBandit02=CreateObject(OBJECT_TYPE_CREATURE,"bandit",lLocation,TRUE); SetLocalObject(oArea,"joueur",oPC); SetLocalInt(OBJECT_SELF,"NW_DO_ONCE",1); } } Dans le script OnDeath du bandit de base (ResRef "bandit") j'ai rajouté ces lignes : NWScript :
object oBandit001=GetObjectByTag("bandit001"); int nMort=GetLocalInt(oBandit001,"mort"); nMort++; SetLocalInt( oBandit001, "mort",nMort); juste après le void main() Dans le script OnSpawn du Chef, j'ai enlevé les commentaires des UserDefinedEvent Perception et HeartBeat. 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.
Je trouve que c'est mieux que le chef dise la première phrase dès qu'il voit le PJ. Cela simplifie pas mal de chose en plus. Dans le UserDefined du chef : NWScript :
void main() { int nUser = GetUserDefinedEventNumber(); if(nUser == 1001) //HEARTBEAT { object oArea=GetArea(OBJECT_SELF); object oJoueur=GetLocalObject(oArea,"joueur"); object oBandit02=GetObjectByTag("bandit",0); object oBandit03=GetObjectByTag("bandit",1); if (GetIsDead(oJoueur)) { if (GetLocalInt(OBJECT_SELF,"NW_DO_ONCE03") != 0) return; SpeakString(""); SetLocalInt(OBJECT_SELF,"NW_DO_ONCE03",1); DelayCommand(1.5,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDisappear(1),OBJECT_SELF)); //DelayCommand(1.5,ApplyEffect ToObject(DURATION_TYPE_INSTANT ,EffectDisappear(1),oBandit03) ); } else if (GetLocalInt(OBJECT_SELF,"mort") ==2) { if (GetLocalInt(OBJECT_SELF,"NW_DO_ONCE02") != 0) return; SpeakString(""); SetLocalInt(OBJECT_SELF,"NW_DO_ONCE02",1); DelayCommand(2.0,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDisappear(1),OBJECT_SELF)); } else if (GetLocalInt(OBJECT_SELF,"mort") ==1) { if (GetLocalInt(OBJECT_SELF,"NW_DO_ONCE01") != 0) return; SpeakString(""); SetLocalInt(OBJECT_SELF,"NW_DO_ONCE01",1); } } else if(nUser == 1002) // PERCEIVE { object oBandit=GetObjectByTag("bandit"); object oPerso=GetLastPerceived(); ////////////////////////////// ///////////////////////////// if (GetIsPC(oPerso)) { if (GetLocalInt(OBJECT_SELF,"NW_DO_ONCE") != 0) return; { SpeakString("Tuez-moi cette larve"); SetLocalInt(OBJECT_SELF,"NW_DO_ONCE",1); } } } } Voilà, je pense que çela ira. Les défauts que j'ai constatés : parfois le delai du HeartBeat est un peu long, mais je ne vois pas comment faire autrement. La possibilité que le PJ meurre avant les deux bandits de base m'a fait rajouter deux lignes en commentaire dans le script UserDefined, à toi de voir si c'est utile de les faire disparaitre. A bientôt. |
Revenir en haut | ![]() ![]() ![]() |
Djezebel Héros ![]() Messages: 252 |
Grâce à l'aimable aide d'Enki, voici le résultat qui fonctionne !
Pour cette scène vous avez donc besoin : - Un trigger - Un waypoin (Tag : "way01") - Un chef bandit ( Tag et ResRef : bandit001 ) (à quand le 007 ?!) - Un bandit ( Tag et ResRef : bandit ) Sur le OnEnter du Trigger, voici le script à mettre : NWScript :
void main() { object oPC=GetEnteringObject(); object oArea=GetArea(OBJECT_SELF); location lLocation=GetLocation(GetWaypointByTag("way01")); if (GetLocalInt(OBJECT_SELF,"NW_DO_ONCE") != 0) return; if (GetIsPC(oPC)) { object oBandit=CreateObject(OBJECT_TYPE_CREATURE,"bandit",lLocation,TRUE); object oBandit01=CreateObject(OBJECT_TYPE_CREATURE,"bandit001",lLocation,TRUE); object oBandit02=CreateObject(OBJECT_TYPE_CREATURE,"bandit",lLocation,TRUE); SetLocalObject(oArea,"joueur",oPC); SetLocalInt(OBJECT_SELF,"NW_DO_ONCE",1); } } A la place du script du OnDeath des bandits : NWScript :
#include "x2_inc_compon" #include "x0_i0_spawncond" void main() { int nClass = GetLevelByClass(CLASS_TYPE_COMMONER); int nAlign = GetAlignmentGoodEvil(OBJECT_SELF); object oKiller = GetLastKiller(); object oBandit001=GetObjectByTag("bandit001"); int nMort=GetLocalInt(oBandit001,"mort"); nMort++; SetLocalInt( oBandit001, "mort",nMort); if(nClass > 0 && (nAlign == ALIGNMENT_GOOD || nAlign == ALIGNMENT_NEUTRAL)) { AdjustAlignment(oKiller, ALIGNMENT_EVIL, 5); } SpeakString("NW_I_AM_DEAD", TALKVOLUME_SILENT_TALK); SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK); if(GetSpawnInCondition(NW_FLAG_DEATH_EVENT)) { SignalEvent(OBJECT_SELF, EventUserDefined(1007)); } craft_drop_items(oKiller); } A la place du OnSpawn du chef des bandits : NWScript :
#include "x0_i0_anims" #include "x0_i0_treasure" #include "x2_inc_switches" void main() { if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_USE_SPAWN_STEALTH) == TRUE) { SetSpawnInCondition(NW_FLAG_STEALTH); } if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_USE_SPAWN_SEARCH) == TRUE) { SetSpawnInCondition(NW_FLAG_SEARCH); } if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_USE_SPAWN_AMBIENT_IMMOBILE) == TRUE) { SetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS); } if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_USE_SPAWN_AMBIENT) == TRUE) { SetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS); } SetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT); SetSpawnInCondition(NW_FLAG_PERCIEVE_EVENT); SetListeningPatterns(); WalkWayPoints(); if ((GetLocalInt(GetModule(), "X2_L_NOTREASURE") == FALSE) && (GetLocalInt(OBJECT_SELF, "X2_L_NOTREASURE") == FALSE) ) { CTG_GenerateNPCTreasure(TREASURE_TYPE_MONSTER, OBJECT_SELF); } if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_IS_INCORPOREAL) == TRUE) { effect eConceal = EffectConcealment(50, MISS_CHANCE_TYPE_NORMAL); eConceal = ExtraordinaryEffect(eConceal); effect eGhost = EffectCutsceneGhost(); eGhost = ExtraordinaryEffect(eGhost); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eConceal, OBJECT_SELF); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, OBJECT_SELF); } } Et enfin à la place du OnUserDefined du bandit NWScript :
void main() { int nUser = GetUserDefinedEventNumber(); if(nUser == 1001) //HEARTBEAT { object oArea=GetArea(OBJECT_SELF); object oJoueur=GetLocalObject(oArea,"joueur"); object oBandit02=GetObjectByTag("bandit",0); object oBandit03=GetObjectByTag("bandit",1); if (GetIsDead(oJoueur)) { if (GetLocalInt(OBJECT_SELF,"NW_DO_ONCE03") != 0) return; SpeakString(""); SetLocalInt(OBJECT_SELF,"NW_DO_ONCE03",1); DelayCommand(1.5,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDisappear(1),OBJECT_SELF)); DelayCommand(1.5,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDisappear(1),oBandit02)); // si tu veux que les bandits disparaissent si le PJ meurt avant eux, enlve les commentaires de ces 2 lignes. DelayCommand(1.5,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDisappear(1),oBandit03)); } else if (GetLocalInt(OBJECT_SELF,"mort") ==2) { if (GetLocalInt(OBJECT_SELF,"NW_DO_ONCE02") != 0) return; SpeakString(""); SetLocalInt(OBJECT_SELF,"NW_DO_ONCE02",1); DelayCommand(2.0,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDisappear(1),OBJECT_SELF)); } else if (GetLocalInt(OBJECT_SELF,"mort") ==1) { if (GetLocalInt(OBJECT_SELF,"NW_DO_ONCE01") != 0) return; SpeakString(""); SetLocalInt(OBJECT_SELF,"NW_DO_ONCE01",1); } } if (GetLocalInt(OBJECT_SELF,"NW_DO_ONCE") != 0) return; { SpeakString("Tuez-moi cette larve"); SetLocalInt(OBJECT_SELF,"NW_DO_ONCE",1); } } Merci beaucoup à Enki qui a réalisé la plupart des scripts ! |
Revenir en haut | ![]() ![]() ![]() |
Enki Légende vivante ![]() Messages: 432 |
Bon travail Djezebel,
il est vrai que le : if (GetIsPC(GetLastPerceived())) n'était pas obligatoire. En tous cas, je conseille à tous ceux qui lisent ce message de prendre ces scripts facilement adaptables pour créer une embuscade avec un effet d'apparition dans le style Manga. ![]() A bientôt ! |
Revenir en haut | ![]() ![]() ![]() |
Yaémon Voyageur Messages: 2 Localisation: Québec |
Salut après un passage sur WoW. Je reviens ça me manquais les longue heure de recherche sur les forum pour trouver un nouveau script.
J'ai fais comme écris plus haut mais le chef Bandit attaque en me lançant des insultes je réussis pas a le faire rester tranquille tu pourrais m'aider svp. Merci et Bonne journée _________________ Yaémon D'Evil ![]() |
Revenir en haut | ![]() ![]() ![]() ![]() |
Enki Légende vivante ![]() Messages: 432 |
Quelle est la faction de ton chef bandit ?
|
Revenir en haut | ![]() ![]() ![]() |
Yaémon Voyageur Messages: 2 Localisation: Québec |
Re mon chef bandit est Hostil même chose que les autres. De la mon erreur ?
Mais je voie pas le chef devais êtres hostile mais pas attaquer sauf ci je l'attaque. Ci la solution est la tu peu me mettre sur la piste svp. Gros merci a++ _________________ Yaémon D'Evil ![]() |
Revenir en haut | ![]() ![]() ![]() ![]() |
Enki Légende vivante ![]() Messages: 432 |
En fait, seuls les bandits doivent être en hostile. Le chef bandit doit être dans une faction personnalisée qui est neutre avec tous le monde. J'ai dû le préciser à Djezebel par MP, et j'ai oublier de le noter dans le message, désolé !
En tous cas, merci d'utiliser ces scripts, ça fait plaisir car la scène est bien sympathique ! |
Revenir en haut | ![]() ![]() ![]() |


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