Login: Pass:
Miltiades



Inscrit le: 05 Nov 2006
Messages: 175
Message Posté le: 2/09/2007 9:34 Sujet du message: [Résolu]Script de pierres de téléportation.
Bonjour, et oui c'est encore moi^^

Voilà mon soucis aujourd'hui.

Pour aller dans certaines parties de mon module, je compte employer un système de portail de téléportation qui ne s'active que si l'on possède une pierre.
En gros voilà le système.

Un portail qui peut être employé pour plusieurs destinations ( on va dire 5 par exemple )
Une pierre classique correspond à 3 destinations
Et deux autres pierres à une destination chacune.

Donc si le PJ clique sur le portail sans avoir de pierre dans son sac, le portail ne marche pas.

S'il possède la 1ère pierre, le portail s'active et lui propose les 3 destinations.
Le PJ n'a plus qu'à choisir la destination voulue.
Si le PJ possède la 2nde ou la 3ème pierre, le portail lui propose la 4 ème ou la 5ème destination selon la pierre en sa possession.

Par contre je voudrais que les pierres soient à usage unique pour corcer les choses. Et je souhaiterais aussi que la téléportation ne marche pas à coup sûr dans le sens où il peut arriver qu'au lieu d'aller à la destination 1, elle téléporte le joueur à une destination alpha.

Je sais qu'il faudra créer les pierres avec un tag spécifique et également créer les WP pour les zones d'arrivées.

Ah oui dernière chose ( je sais je suis embêtant ), peut-on faire en sorte que lors de l'activation du portail, l'effet portail mélodieux apparaisse? Si vous voulez avant activation, le portail est vierge de tout effet mais lors de son activation par la pierre, il acquiert l'effet visuel portail mélodieux pendant une durée de 10 ou 20 secondes par exemple.

Merci à toute personne qui m'aidera.


Dernière édition par Miltiades le 4/09/2007 16:59; édité 1 fois
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé
KorTeX



Inscrit le: 28 Juin 2007
Messages: 22
Message Posté le: 3/09/2007 16:11 Sujet du message: Re: Script de pierres de téléportation.
bon alors il faudra créer 3 pierres (que l'on nommera pierre1, pierre2 et pierre3, avec, pour l'exemple, leur tag identiques à leur noms), plusieurs scripts et une conversation

créer 5 waypoint dans les zones de destination : WP1, WP2, WP3, WP4 et WP5

pierre1 permet d'aller au waypoint WP1, WP2 ou WP3
pierre2 permet d'aller au waypoint WP4
pierre3 permet d'aller au waypoint WP5

mets le placeable portail en utilisable, statique sur FALSE
la conversation dans l'onglet conversation
et le script x0_startconv (script bioware) dans l'event OnUse du placeable

voici comment sera la conversation :
Faut essayer de s'imaginer l'arbre de conversation aussi, et bien sûr la conversation est pourrie



Citation
- utiliser le portail ?

-- oui (condition : possède l'un des 3 pierres. Donc faut que tu mettes 3 lignes avec OU (OR) à chacune. scriptcond avec iPierre à 1 OU scriptcond avec iPierre à 2 OU scriptcond avec iPierre à 3)

----- aller dans l'endroit 1
(condition : scriptcond avec la iPierre à 1) (action : scriptportail avec iDest à 1)
----- aller dans l'endroit 2
(condition : scriptcond avec la iPierre à 1) (action : scriptportail avec iDest à 2)
----- aller dans l'endroit 3
(condition : scriptcond avec la iPierre à 1) (action : scriptportail avec iDest à 3)
----- aller dans l'endroit 4
(condition : scriptcond avec la iPierre à 2) (action : scriptportail avec iDest à 4)
----- aller dans l'endroit 5
(condition : scriptcond avec la iPierre à 3) (action : scriptportail avec iDest à 5)

-- non [fin de la conversation]



Code:
// scriptcond. nss
/* variable iPierre int représente le n° de pierre*/
int StartingConditional (int iPierre)
{
/* prend l'objet "pierre" +"1","2", ou "3" selon la valeur de iPierre*/
object oPierre = GetItemPossessedBy (GetPCSpeaker(), "pierre"+IntToString (iPierre));
/* retourne TRUE si oPierre est dans l'inventaire du joueur*/
return GetIsObjectValid (oPierre);
}



Code:
//  scriptportail.nss
void main (int iDest)
{
object oPC = GetPCSpeaker ();

/* va falloir que tu choppes le resref de l'effet placé
 et que tu le mettes ici. Tu le trouve dans les propriétés
 de l'effet placé*/
string sResref = "";

/* création de l'effet placé, et destruction dans 10 secondes)*/
object oEffect = CreateObject (OBJECT_TYPE_PLACED_EFFECT, sResref,  GetLocation (OBJECT_SELF));
DelayCommand (10.0f, DestroyObject (oEffect));

/* téléportation du pj au WP de destination après 2 secondes
 ... 2 secondes car faut bien que le joueurs puisse voir l'effet
du portail, sinon ça sert à rien :p*/

object oDest = GetWaypointByTag ("WP"+IntToString (iDest));
DelayCommand (2.0f, AssignCommand (oPC, JumpToObject (oDest)));
}



voilà !
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur
Miltiades



Inscrit le: 05 Nov 2006
Messages: 175
Message Posté le: 3/09/2007 18:24 Sujet du message:
Alors là chapeau bas, un grand merci tu m'as vraiment bien aidé.
J'espère pouvoir te rendre la pareille Smile

Par contre comme je ne suis pas trop fortiche en scripts, pourrais-tu me dire où placer les scripts ?

Dernière chose ( je sais ^^), admettons qu'il y a 10 destinations au total.
J'emploie la pierre 1 qui permet 3 destinations par exemple. Comment faire pour qu'elle puisse avec un certain % donner accès à la destination 8 par exemple alors qu'elle n'est pas censée y donner accès. Enfin bref une téléportation qui a totalement raté.

Merci^^
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé
KorTeX



Inscrit le: 28 Juin 2007
Messages: 22
Message Posté le: 3/09/2007 20:04 Sujet du message:
Miltiades
Alors là chapeau bas, un grand merci tu m'as vraiment bien aidé.
J'espère pouvoir te rendre la pareille Smile


y'a pas de quoi Wink
c'est gratos

Miltiades
Par contre comme je ne suis pas trop fortiche en scripts, pourrais-tu me dire où placer les scripts ?


et bien le script conditionnel est à placé dans les conditions de ton noeud de dialogue, et le script d'action dans les actions de tes noeuds de dialogues

ensuite tu fais "rafraîchir" et tu mets les variables iPierre et iDest correspondantes



Miltiades

Dernière chose ( je sais ^^), admettons qu'il y a 10 destinations au total.
J'emploie la pierre 1 qui permet 3 destinations par exemple. Comment faire pour qu'elle puisse avec un certain % donner accès à la destination 8 par exemple alors qu'elle n'est pas censée y donner accès. Enfin bref une téléportation qui a totalement raté.

Merci^^


et bien tu as qu'à reprendre le script de condition et rajouter un test aléatoire/

Là je mets 50 % de chance de donner la destination.
Sachant que le joueur n'aura alors qu'à recliquer 10 000 fois sur le portail pour l'avoir, mais bon..

Code:
// scriptcond2. nss
/* variable iPierre int représente le n° de pierre*/
int StartingConditional (int iPierre)
{
/* nouveau test aléatoire
50 % de chance
un chiffre aléatoire entre 0 et 99 doit être inférieur à 50)
donc s'il est supérieur, je renvoie FALSE */
if (Random(100) > 50) return FALSE;
else
{
/* prend l'objet "pierre" +"1","2", ou "3" selon la valeur de iPierre*/
object oPierre = GetItemPossessedBy (GetPCSpeaker(), "pierre"+IntToString (iPierre));
/* retourne TRUE si oPierre est dans l'inventaire du joueur*/
return GetIsObjectValid (oPierre);
}
}


et voilà, tu n'auras qu'à rajouter le numéro de la pierre correspondante
si tu veux un pourcentage que tu peux modifier selon les pierres choisies, tu utilises une variable dans ton script et tu la modifie dans ton dialogue

Code:
// scriptcond2. nss
/* variable iPierre int représente le n° de pierre*/
int StartingConditional (int iPierre, int iPourcentage)
{
/* nouveau test aléatoire
iPourcentage % de chance
*/
if (Random(100) > iPourcentage) return FALSE;
else
{
/* prend l'objet "pierre" +"1","2", ou "3" selon la valeur de iPierre*/
object oPierre = GetItemPossessedBy (GetPCSpeaker(), "pierre"+IntToString (iPierre));
/* retourne TRUE si oPierre est dans l'inventaire du joueur*/
return GetIsObjectValid (oPierre);
}
}
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur
Miltiades



Inscrit le: 05 Nov 2006
Messages: 175
Message Posté le: 3/09/2007 20:37 Sujet du message:
Citation
Là je mets 50 % de chance de donner la destination.
Sachant que le joueur n'aura alors qu'à recliquer 10 000 fois sur le portail pour l'avoir, mais bon..


En fait je me suis mal expliqué, désolé. Je veux dire que par exemple le joueur choisit la destination 1, cliques sur l'option 1 mais là au lieu d'arriver en destination 1, il arrive en destination 8 tout en ayant bien choisi la destination 1.


Encore merci ^^
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé
KorTeX



Inscrit le: 28 Juin 2007
Messages: 22
Message Posté le: 3/09/2007 23:36 Sujet du message:
Miltiades
Citation
Là je mets 50 % de chance de donner la destination.
Sachant que le joueur n'aura alors qu'à recliquer 10 000 fois sur le portail pour l'avoir, mais bon..


En fait je me suis mal expliqué, désolé. Je veux dire que par exemple le joueur choisit la destination 1, cliques sur l'option 1 mais là au lieu d'arriver en destination 1, il arrive en destination 8 tout en ayant bien choisi la destination 1.



oups j'ai mal lu Razz


bon bin c'est le script de téléportation que tu dois modifier
rajoutes cette ligne juste avant la fin Wink

Code:
void main (int iDest)
{

// (...)


/* en gros ici le script a 50 % de chance
 d'avoir une destination aléatoire, entre les 3 WP
l'aléa est choisi avec IntToString (Random (3)+1) qui choisi une bout
de string (ne nous méprenons pas sur ce terme hautement technique)
entre 0 et 2, auquel on rajoutera 1 (donc au final entre 1 et 3)
*/


object oDest = GetWaypointByTag ("WP"+IntToString (iDest));


//// rajout
if (Random(100) < 50) oDest = GetWaypointByTag ("WP"+IntToString (Random (3)+1));
////

DelayCommand (2.0f, AssignCommand (oPC, JumpToObject (oDest)));
}



voili voilou !
bien sûr si tu ne veux pas une localisation aléatoire tu mets

GetWaypointByTag ("TagDuWP");


avec ça t'as tout ce qu'il faut pour ton script Wink
bon courage
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur
Miltiades



Inscrit le: 05 Nov 2006
Messages: 175
Message Posté le: 4/09/2007 16:59 Sujet du message:
Merci beaucoup encore une fois ^^

Je vais mettre ça en pratique sur le module Smile
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé
Miltiades



Inscrit le: 05 Nov 2006
Messages: 175
Message Posté le: 4/09/2007 20:29 Sujet du message:
Tout marche à merveille.
Par contre au niveau de l'arborescence, il faut ajouter quelle destination quand on a l'option oui

oui ==> quelle destination ==> WP1 / WP2 / WP3 / WP4 / WP5.

Si on le fait pas et que l'on a les 3 pierres, il téléporte automatiquement au WP1.


Sinon est-il possible d'ajouter un effet sonore au portail en plus de l'effet placé ??

Je pensais aussi à une améliroation au niveau des pierres. Je pensais que la pierre posséderait x charges. A chaque utilisation du portail par une pierre, cette même pierre aurait une charge en moins et serait détruite si le nombre de charge =0 . Est-ce envisageable?


Et dernière question
Citation
if (Random(100) < 50)
indique qu'il y a 50 % de chance que la téléportation soit aléatoire. Si je veux mettre 25 % je dois donc noter if (Random(100) < 25) ???


Merci ^^ et encore désolé pour toutes ces questions [/quote]
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé
KorTeX



Inscrit le: 28 Juin 2007
Messages: 22
Message Posté le: 4/09/2007 22:13 Sujet du message:
Miltiades
Tout marche à merveille.
Par contre au niveau de l'arborescence, il faut ajouter quelle destination quand on a l'option oui

oui ==> quelle destination ==> WP1 / WP2 / WP3 / WP4 / WP5.

Si on le fait pas et que l'on a les 3 pierres, il téléporte automatiquement au WP1.


bon alors voilà la conversation





Miltiades
Sinon est-il possible d'ajouter un effet sonore au portail en plus de l'effet placé ??


oui.
en fait ton son, tu dois le placer au préalable dans le toolset, avec actif à FALSE.
Je l'utilise pour un de mes script. Afin de trouver facilement, je prend le tag de l'objet lançant le script et je rajoute "sound" à la fin
La ligne donne ça

Code:
object oSound = GetObjectByTag (GetTag(OBJECT_SELF) + "sound");
        SoundObjectPlay (oSound);



Miltiades
Je pensais aussi à une améliroation au niveau des pierres. Je pensais que la pierre posséderait x charges. A chaque utilisation du portail par une pierre, cette même pierre aurait une charge en moins et serait détruite si le nombre de charge =0 . Est-ce envisageable?


oui tu rajoutes des charges à tes pierres de téléportation (dans les propriétés de ton objet)

et tu utilises les fonctions GetItemCharges, SetItemCharges (jusqu'à 1) et DestroyObject (quand la pierre n'aura plus de charge, car setitemcharges à 0 ne fait rien)
Faut que tu définisses le moyen de trouver la bonne pierre à décharger te ce sera ok


Miltiades
Et dernière question
Citation
if (Random(100) < 50)
indique qu'il y a 50 % de chance que la téléportation soit aléatoire. Si je veux mettre 25 % je dois donc noter if (Random(100) < 25) ???


oui. exactement ça veut dire que si un chiffre prix aléatoirement entre 0 et 99 -Random (100) est inférieur à 50 alors la condition est remplie

Miltiades
Merci ^^ et encore désolé pour toutes ces questions


pourquoi es tu désolé ? Shocked
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur
KorTeX



Inscrit le: 28 Juin 2007
Messages: 22
Message Posté le: 5/09/2007 20:10 Sujet du message:
pour en faire profiter tout le monde je vais répondre ici aux questions que tu m'as posées par MP

=> tu veux que le portail ne réagisse pas si jamais le perso n'a pas de pierre :

dans le noeud d econversation"utiliser le portail", tu rajoutes les conditions
scriptcond2 (iPierre = 1)
OU scriptcond2 (iPierre = 2)
OU scriptcond2 (iPierre = 3)

Donc ce 1er noeud apparaîtra si et seulement si le joueur a une des3 pierres de téléportation


Dans la conversation, tu rajoutes 1 ligne de dialogue à la racine, et tu écris "le portail ne semble pas réagir"
Ce noeud de dialogue doit se trouver à la fin. l'application regardera alors le 1er noeud, et l'affichera si les conditions sont remplies. Si elle ne le sont pas, elle passera au noeud suivant et regardera les conditions (y'en a pas alors elles sont toujours remplies), et ainsi de suite.


=> je veux que tu me fasses pour moi tout seul le script avec les charges sur les pierres



donc pour les charges, ta pierre, tu la récupère en refaisant le même principe de test que dans les conditions

rajoute ça

Code:
object oPierre;
// si la destination est le 5eme portail, c'est la pierre n°3
if (iDest == 5) oPierre = GetItemPossessedBy (GetItemPossessedBy (GetPCSpeaker(), "pierre3");
// si la destination est le 4eme portail, c'est la pierre n°2
else if (iDest == 4) oPierre = GetItemPossessedBy (GetItemPossessedBy (GetPCSpeaker(), "pierre2");
// sinon c'est la pierre n°1
else oPierre = GetItemPossessedBy (GetItemPossessedBy (GetPCSpeaker(), "pierre1");

// on prend les charges de la pierre
int iCharges = GetItemCharges (oPierre);
// on décrémente le nombre de charges
iCharges --;

// si plus de charge, on détruit la pierre
if (iCharges == 0) DestroyObject (oPierre);

// sinon on enregistre le nombre de charges restantes
else SetItemCharges (oPierre, iCharges);


voili voilou
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur
Miltiades



Inscrit le: 05 Nov 2006
Messages: 175
Message Posté le: 6/09/2007 17:54 Sujet du message:
Encore une fois mille merci. J'ai regardé les liens que tu m'as donné et je trouve que c'est une vraie mine d'or. Je vais m'y mettre et voir de quoi je suis capable.

Bon courage à toi Smile
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé
KorTeX



Inscrit le: 28 Juin 2007
Messages: 22
Message Posté le: 7/09/2007 0:01 Sujet du message:
Miltiades
Encore une fois mille merci. J'ai regardé les liens que tu m'as donné et je trouve que c'est une vraie mine d'or.


donné en mp
http://nwn1.nwn2lexicon.com/



de rien Wink
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur
Montrer les messages depuis:   

Page 1 sur 1
Sauter vers:  

 

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

Traduction par : phpBB-fr.com
Powered by phpBB © 2001, 2007 phpBB Group