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 16:15:10
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 |
Lodilan Novice Messages: 5 |
Bonjour à tous,
Tout d'abord, merci pour cette bibliothèque, c'est vraiment une chouette source d'information. Je souhaiterais de l'aide pour terminer le projet suivant : une pipe et du tabac. J'ai déjà réussi à faire en sorte que l'utilisation d'un item "tabac" produit un fx de fumée situé au niveau de la tête du PC. Je bute sur la condition de présence obligatoire de l'item "pipe" dans l'inventaire de l'utilisateur de l'item "tabac". Pour l'instant, il suffit d'utiliser l'item "tabac", le script fonctionne. Sachant, que idéalement, un message devrait s'afficher si le PC qui tente d'utiliser l'item "tabac" ne possède pas l'item "pipe", du type : "Vous devez avoir une pipe pour pouvoir fumer votre tabac". Donc, si l'un d'entre vous pouvez m'aider ce sera sympa, merci. Dernière édition par Lodilan le 11/04/2008 14:22:42; édité 3 fois
|
Revenir en haut | |
Ivellios Légende vivante Messages: 447 Localisation: Poitiers |
Un test conditionnel dans l'utilisation de ton tabac
NWScript : if(GetItemPossessedBy(oPC, "TAG_PIPE") != OBJECT_INVALID) { } else { FloatingText... // Ici t'as pas de pipe } _________________ Scripts, systèmes, fonctions,... c'est par ici... Pyjama pour castor, une vocation, un avenir sûr |
Revenir en haut | |
Lodilan Novice Messages: 5 |
Oki, merci de ta réponse rapide Ivellios, toutefois, une fois les modifications faites en ce sens, la conséquence c'est que si l'on ne possède pas la pipe dans son inventaire, alors le message correspondant est dit, mais le script fait tout de même fumer le PC (oActivator, puisqu'il s'agit d'un item à utilisation unique), et si l'on possède la pipe dans son inventaire, alors le message correspondant est dit et le script fait fumer la pipe comme souhaité. Il faudrait que la condition empêche le déroulement du script si la pipe n'est pas présente, hors là, ça marche pas...
Ou est le problème dans le script ? Voila le script en entier. NWScript : location GetLocationAboveAndInFrontOf(object oPC, float fDist, float fHeight) { float fDistance = -fDist; object oTarget = (oPC); object oArea = GetArea(oTarget); vector vPosition = GetPosition(oTarget); vPosition.z += fHeight; float fOrientation = GetFacing(oTarget); vector vNewPos = AngleToVector(fOrientation); float vZ = vPosition.z; float vX = vPosition.x - fDistance * vNewPos.x; float vY = vPosition.y - fDistance * vNewPos.y; fOrientation = GetFacing(oTarget); vX = vPosition.x - fDistance * vNewPos.x; vY = vPosition.y - fDistance * vNewPos.y; vNewPos = AngleToVector(fOrientation); vZ = vPosition.z; vNewPos = Vector(vX, vY, vZ); return Location(oArea, vNewPos, fOrientation); } void SmokePipe(object oActivator) { float fHeight = 1.7; float fDistance = 0.1; // Set height based on race and gender if (GetGender(oActivator) == GENDER_MALE) { switch (GetRacialType(oActivator)) { case RACIAL_TYPE_HUMAN: case RACIAL_TYPE_HALFELF: fHeight = 1.7; fDistance = 0.12; break; case RACIAL_TYPE_ELF: fHeight = 1.55; fDistance = 0.08; break; case RACIAL_TYPE_GNOME: case RACIAL_TYPE_HALFLING: fHeight = 1.15; fDistance = 0.12; break; case RACIAL_TYPE_DWARF: fHeight = 1.2; fDistance = 0.12; break; case RACIAL_TYPE_HALFORC: fHeight = 1.9; fDistance = 0.2; break; } } else { // FEMALES switch (GetRacialType(oActivator)) { case RACIAL_TYPE_HUMAN: case RACIAL_TYPE_HALFELF: fHeight = 1.6; fDistance = 0.12; break; case RACIAL_TYPE_ELF: fHeight = 1.45; fDistance = 0.12; break; case RACIAL_TYPE_GNOME: case RACIAL_TYPE_HALFLING: fHeight = 1.1; fDistance = 0.075; break; case RACIAL_TYPE_DWARF: fHeight = 1.2; fDistance = 0.1; break; case RACIAL_TYPE_HALFORC: fHeight = 1.8; fDistance = 0.13; break; } } location lAboveHead = GetLocationAboveAndInFrontOf(oActivator, fDistance, fHeight); // glow red AssignCommand(oActivator, ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_LIGHT_RED_5), oActivator, 0.15))); // wait a moment AssignCommand(oActivator, ActionWait(1.0)); // puff of smoke above and in front of head AssignCommand(oActivator, ActionDoCommand(ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SMOKE_PUFF), lAboveHead))); // if female, turn head to left if ((GetGender(oActivator) == GENDER_FEMALE) && (GetRacialType(oActivator) != RACIAL_TYPE_DWARF)) AssignCommand(oActivator, ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_LEFT, 1.0, 5.0)); // funky effect //ApplyEffectToObject(DURATION _TYPE_INSTANT, EffectParalyze(), oActivator); } void main() { object oActivator = GetItemActivator(); SmokePipe(oActivator); if(GetItemPossessedBy(oActivator,"Pipe") != OBJECT_INVALID) { ActionSpeakString(""); } else { //FloatingText... // Ici t'as pas de pipe ActionSpeakString(""); } } |
Revenir en haut | |
Noon Héros Messages: 272 Localisation: Entre Vannes et les RO |
A priori, il faut que ton smokepipe(oactivator) soit après la condition "if GetItemPossessedBy...", parce que là il déclenche l'effet visuel et après seulement il vérifie que l'utilisateur a une pipe.
Donc tu déplaces le smokepipe juste au dessus du SpeakString je dirais. _________________ Beshaba me protège, Tymora guide mes tirs. The Cake is a lie ! Mes modules NwN2:De Vieilles Rencontres! et De Vieilles Rencontres2 Double Avenir sur le Nwvault |
Revenir en haut | |
Lodilan Novice Messages: 5 |
Et bien, j'ai deja fait des modifications pour simplifier le script de la façon suivante (voir après), de ce fait, le "void main()" n'est plus en fin de script, et l'entrée "smokpipe (oActivator)" a disparue. Toutefois, je reste dans le problème précédent, le script se déroule que l'item "pipe" soit présent ou pas dans l'inventaire, la condition gère uniquement le "ActionSpeakString", et non le déroulement du script.
NWScript :
location GetLocationAboveAndInFrontOf(object oPC, float fDist, float fHeight) { float fDistance = -fDist; object oTarget = (oPC); object oArea = GetArea(oTarget); vector vPosition = GetPosition(oTarget); vPosition.z += fHeight; float fOrientation = GetFacing(oTarget); vector vNewPos = AngleToVector(fOrientation); float vZ = vPosition.z; float vX = vPosition.x - fDistance * vNewPos.x; float vY = vPosition.y - fDistance * vNewPos.y; fOrientation = GetFacing(oTarget); vX = vPosition.x - fDistance * vNewPos.x; vY = vPosition.y - fDistance * vNewPos.y; vNewPos = AngleToVector(fOrientation); vZ = vPosition.z; vNewPos = Vector(vX, vY, vZ); return Location(oArea, vNewPos, fOrientation); } void main() { object oActivator = GetItemActivator(); if(GetItemPossessedBy(oActivator,"Pipe") != OBJECT_INVALID) { ActionSpeakString(""); } else { //FloatingText... // Ici t'as pas de pipe ActionSpeakString(""); AssignCommand (oActivator, ActionPlayAnimation (ANIMATION_LOOPING_TALK_NORMAL, 1.0, 2.0)); } { float fHeight = 1.7; float fDistance = 0.1; // Set height based on race and gender if (GetGender(oActivator) == GENDER_MALE) { switch (GetRacialType(oActivator)) { case RACIAL_TYPE_HUMAN: case RACIAL_TYPE_HALFELF: fHeight = 1.7; fDistance = 0.12; break; case RACIAL_TYPE_ELF: fHeight = 1.55; fDistance = 0.08; break; case RACIAL_TYPE_GNOME: case RACIAL_TYPE_HALFLING: fHeight = 1.15; fDistance = 0.12; break; case RACIAL_TYPE_DWARF: fHeight = 1.2; fDistance = 0.12; break; case RACIAL_TYPE_HALFORC: fHeight = 1.9; fDistance = 0.2; break; } } else { // FEMALES switch (GetRacialType(oActivator)) { case RACIAL_TYPE_HUMAN: case RACIAL_TYPE_HALFELF: fHeight = 1.6; fDistance = 0.12; break; case RACIAL_TYPE_ELF: fHeight = 1.45; fDistance = 0.12; break; case RACIAL_TYPE_GNOME: case RACIAL_TYPE_HALFLING: fHeight = 1.1; fDistance = 0.075; break; case RACIAL_TYPE_DWARF: fHeight = 1.2; fDistance = 0.1; break; case RACIAL_TYPE_HALFORC: fHeight = 1.8; fDistance = 0.13; break; } } location lAboveHead = GetLocationAboveAndInFrontOf(oActivator, fDistance, fHeight); // glow red AssignCommand(oActivator, ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_LIGHT_RED_5), oActivator, 0.30))); // wait a moment AssignCommand(oActivator, ActionWait(1.0)); // puff of smoke above and in front of head AssignCommand(oActivator, ActionDoCommand(ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SMOKE_PUFF), lAboveHead))); // if female, turn head to left if ((GetGender(oActivator) == GENDER_FEMALE) && (GetRacialType(oActivator) != RACIAL_TYPE_DWARF)) AssignCommand(oActivator, ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_LEFT, 1.0, 5.0)); // funky effect //ApplyEffectToObject(DURATION _TYPE_TEMPORARY, EffectAbilityIncrease(IP_CONST _ABILITY_CHA, 2), oActivator, 30.0); } } De ce fait, le main n'est plus en fin de script, et l'entrée "smokpipe (oActivator) a disparue. Toutefois, je reste dans le problème précédent, le script se déroule que l'item "pipe" soit présent ou pas dans l'inventaire, la condition gère uniquement le ActionSpeakString, et non le déroulement du script. |
Revenir en haut | |
Lodilan Novice Messages: 5 |
Bon et bien, j'ai rajouté une condition de jet de protection FORTITUDE, j'ai du enlever l'état "dazed", et cela fonctionne... Je sais pas pourquoi l'état "dazed" empêché le déclenchement de la fumée... De même, j'ai testé sans la condition du jet de protection FORTITUDE, le script repose le problème de déclenché à chaque fois la fumée, avec ou sans la pipe dans l'inventaire, bien que le message correspondant s'affiche tout de même...*dubitatif*
EDIT > Bon finalement, ca fonctionne pas, le PC ne fume pas lorqu'il rate son jet de FORTITUDE.....*T_T* Voila script final : NWScript : location GetLocationAboveAndInFrontOf(object oPC, float fDist, float fHeight) { float fDistance = -fDist; object oTarget = (oPC); object oArea = GetArea(oTarget); vector vPosition = GetPosition(oTarget); vPosition.z += fHeight; float fOrientation = GetFacing(oTarget); vector vNewPos = AngleToVector(fOrientation); float vZ = vPosition.z; float vX = vPosition.x - fDistance * vNewPos.x; float vY = vPosition.y - fDistance * vNewPos.y; fOrientation = GetFacing(oTarget); vX = vPosition.x - fDistance * vNewPos.x; vY = vPosition.y - fDistance * vNewPos.y; vNewPos = AngleToVector(fOrientation); vZ = vPosition.z; vNewPos = Vector(vX, vY, vZ); return Location(oArea, vNewPos, fOrientation); } void main() { object oActivator = GetItemActivator(); if(GetItemPossessedBy(oActivator,"k_Pipe") != OBJECT_INVALID) { ActionSpeakString("Et bien, il est fort ce tabac..... je me sens.... bien....*sourire paisible*"); AssignCommand(oActivator, ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_LIGHT_RED_5), oActivator, 0.30))); // wait a moment { if (FortitudeSave(oActivator, 15)) { SendMessageToPC(oActivator,""); } else { SendMessageToPC(oActivator,"Votre esprit s'embrume paisiblement..."); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectAbilityDecrease(IP_CONST_ABILITY_WIS, 2), oActivator, 30.0); AssignCommand(oActivator, ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE), oActivator, 0.30))); AssignCommand(oActivator, ActionPlayAnimation(ANIMATION_LOOPING_PAUSE_DRUNK, 1.0, 30.0)); } float fHeight = 1.7; float fDistance = 0.1; // Set height based on race and gender if (GetGender(oActivator) == GENDER_MALE) { switch (GetRacialType(oActivator)) { case RACIAL_TYPE_HUMAN: case RACIAL_TYPE_HALFELF: fHeight = 1.7; fDistance = 0.12; break; case RACIAL_TYPE_ELF: fHeight = 1.55; fDistance = 0.08; break; case RACIAL_TYPE_GNOME: case RACIAL_TYPE_HALFLING: fHeight = 1.15; fDistance = 0.12; break; case RACIAL_TYPE_DWARF: fHeight = 1.2; fDistance = 0.12; break; case RACIAL_TYPE_HALFORC: fHeight = 1.9; fDistance = 0.2; break; } } else { // FEMALES switch (GetRacialType(oActivator)) { case RACIAL_TYPE_HUMAN: case RACIAL_TYPE_HALFELF: fHeight = 1.6; fDistance = 0.12; break; case RACIAL_TYPE_ELF: fHeight = 1.45; fDistance = 0.12; break; case RACIAL_TYPE_GNOME: case RACIAL_TYPE_HALFLING: fHeight = 1.1; fDistance = 0.075; break; case RACIAL_TYPE_DWARF: fHeight = 1.2; fDistance = 0.1; break; case RACIAL_TYPE_HALFORC: fHeight = 1.8; fDistance = 0.13; break; } } location lAboveHead = GetLocationAboveAndInFrontOf(oActivator, fDistance, fHeight); // puff of smoke above and in front of head AssignCommand(oActivator, ActionDoCommand(ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SMOKE_PUFF), lAboveHead))); } // if female, turn head to left if ((GetGender(oActivator) == GENDER_FEMALE) && (GetRacialType(oActivator) != RACIAL_TYPE_DWARF)) AssignCommand(oActivator, ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_LEFT, 1.0, 5.0)); } else { //FloatingText... // Ici t'as pas de pipe ActionSpeakString(""); AssignCommand (oActivator, ActionPlayAnimation (ANIMATION_LOOPING_TALK_NORMAL, 1.0, 2.0)); } } |
Revenir en haut | |
Lodilan Novice Messages: 5 |
Script fonctionnel, MAIS le truc, c'est dès que rajoute un EFFECT (tel que Stunned, ou Dazed) dans les conséquences de l'effet du jet de FORTITUDE, alors l'effet de SMOKE_PUFF ne fonctionne pas. Alors que si je refais utiliser le tabac et que je PC rate de nouveau son JP, alors qu'il est encore sous l'effet du premier tabac, alors cette fois le SMOKE_PUFF apparaît....
Quelqu'un sait d'ou vient le problème, et si oui, me proposer une solution, car même si le projet est utilisable tel que, j'aurai préféré placer un EFFECT DAZED ou STUNNED, plutot qu'une animation. Merci. NWScript : location GetLocationAboveAndInFrontOf(object oPC, float fDist, float fHeight) { float fDistance = -fDist; object oTarget = (oPC); object oArea = GetArea(oTarget); vector vPosition = GetPosition(oTarget); vPosition.z += fHeight; float fOrientation = GetFacing(oTarget); vector vNewPos = AngleToVector(fOrientation); float vZ = vPosition.z; float vX = vPosition.x - fDistance * vNewPos.x; float vY = vPosition.y - fDistance * vNewPos.y; fOrientation = GetFacing(oTarget); vX = vPosition.x - fDistance * vNewPos.x; vY = vPosition.y - fDistance * vNewPos.y; vNewPos = AngleToVector(fOrientation); vZ = vPosition.z; vNewPos = Vector(vX, vY, vZ); return Location(oArea, vNewPos, fOrientation); } void main() { object oActivator = GetItemActivator(); if(GetItemPossessedBy(oActivator,"k_Pipe") != OBJECT_INVALID) { ActionSpeakString(""); AssignCommand(oActivator, ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_LIGHT_RED_5), oActivator, 0.30))); // wait a moment { if (FortitudeSave(oActivator, 20)) { SendMessageToPC(oActivator,""); } else { SendMessageToPC(oActivator,"Votre esprit s'embrume paisiblement..."); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectAbilityDecrease(IP_CONST_ABILITY_WIS, 4), oActivator, 30.0); AssignCommand(oActivator, ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE), oActivator, 5.0))); AssignCommand(oActivator, ActionPlayAnimation(ANIMATION_FIREFORGET_PAUSE_BORED, 1.8, 3.0)); } float fHeight = 1.7; float fDistance = 0.1; // Set height based on race and gender if (GetGender(oActivator) == GENDER_MALE) { switch (GetRacialType(oActivator)) { case RACIAL_TYPE_HUMAN: case RACIAL_TYPE_HALFELF: fHeight = 1.7; fDistance = 0.12; break; case RACIAL_TYPE_ELF: fHeight = 1.55; fDistance = 0.08; break; case RACIAL_TYPE_GNOME: case RACIAL_TYPE_HALFLING: fHeight = 1.15; fDistance = 0.12; break; case RACIAL_TYPE_DWARF: fHeight = 1.2; fDistance = 0.12; break; case RACIAL_TYPE_HALFORC: fHeight = 1.9; fDistance = 0.2; break; } } else { // FEMALES switch (GetRacialType(oActivator)) { case RACIAL_TYPE_HUMAN: case RACIAL_TYPE_HALFELF: fHeight = 1.6; fDistance = 0.12; break; case RACIAL_TYPE_ELF: fHeight = 1.45; fDistance = 0.12; break; case RACIAL_TYPE_GNOME: case RACIAL_TYPE_HALFLING: fHeight = 1.1; fDistance = 0.075; break; case RACIAL_TYPE_DWARF: fHeight = 1.2; fDistance = 0.1; break; case RACIAL_TYPE_HALFORC: fHeight = 1.8; fDistance = 0.13; break; } } location lAboveHead = GetLocationAboveAndInFrontOf(oActivator, fDistance, fHeight); // puff of smoke above and in front of head AssignCommand(oActivator, ActionDoCommand(ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SMOKE_PUFF), lAboveHead))); } // if female, turn head to left if ((GetGender(oActivator) == GENDER_FEMALE) && (GetRacialType(oActivator) != RACIAL_TYPE_DWARF)) AssignCommand(oActivator, ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_LEFT, 1.0, 5.0)); } else { //FloatingText... // Ici t'as pas de pipe ActionSpeakString(""); AssignCommand (oActivator, ActionPlayAnimation (ANIMATION_LOOPING_TALK_NORMAL, 1.0, 2.0)); } } |
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