Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > Gagner de l'experience par la lecture d'un livre
Gagner de l'experience par la lecture d'un livre
Par Azrael07 le 23/11/2002 à 0:58:19 (#2623665)
Bon de facon directe je pense pas que c'est possible, mais si vous voyez une méthode pour y parvenir par la ruse (moi j'en ai pas dans mon sac ^_^), se serais cool ;)
Par miriandel le 23/11/2002 à 1:05:40 (#2623714)
S'il s'agit d'un livre particulier, passe par les Unique Power.
Sinon, je vois pas :confus:
Par coolstar le 23/11/2002 à 11:30:30 (#2625028)
Ben j'ai bien l'impression que ça rejoint mon même prob du comment faire parler les Items (les utiliser en fait)... et j'ai bien eu la même réponse... sigh! :D
;)
Par Azrael07 le 23/11/2002 à 11:42:39 (#2625095)
Par contre quesque t'appelle Unique power ?
Par coolstar le 23/11/2002 à 11:56:26 (#2625151)
...
EDIT
----------------------
Au cas ou... voilà le lien avec le fil où ma question qu'est presque pareille et a eu la presque pareille réponse... :D
----------------------
Par Simkim le 23/11/2002 à 12:05:41 (#2625193)
Par contre, pas la peine de me demander comment ça marche, j'en sais rien.
Par miriandel le 23/11/2002 à 13:09:29 (#2625546)
Affiche les propriétés de l'objet et ouvre "cast spell" où tu verras la liste exhaustive des sorts.
Sélectionne "Unique Power" si tu veux qu'un pointeur apparaisse pour le sort, ou "Unique Power Self Only" pour que l'effet ne concerne que l'utilisateur.
Tu voudras sans doute changer cette propriété pour en élargir l'usage à une fois par jour, ou 1 charge par utilisation, ou illimité.
Ensuite, dans la routine OnActiveItem de ton module, place ce code:object quoi = GetItemActivated();
if (GetTag(quoi) == "mon_beau_bouquin")
{
object utilisateur = GetItemActivator();
object cible = GetSpellTargetObject(); // uniquement pour les "unique Power" non "Self"
// placer le code voulu ici
return;
}
Par coolstar le 23/11/2002 à 13:25:13 (#2625665)
Merci encore pour vos éclairages à tous... ;)
...
Par sounéva le 23/11/2002 à 13:51:58 (#2625839)
Il suffit d'ouvrir l'item en question, d'aller dans l'onglet propriété et ouvrir la partie Lancer un sort. Pouvoir Unique se trouve là.
propriété->lancer un sort->pouvoir unique
Par coolstar le 23/11/2002 à 14:02:12 (#2625921)
:maboule:
:mdr:
Enfin bon, merci. :merci:
Mais juste une chose encore... à quoi ça sert normalement Pouvoir unique? et quelle est la différence avec Pouvoir unique, sur soi uniquement ??? :confus:
Et pourquoi ça marche pas chez moi??? :doute:
...
:merci: :merci:
EDIT
------------------------
J'ai utilisé ça...Provient du message de Jedaï
void main()
{
if (GetTag(GetItemActivated()) == "Tag de l'item qui cause")
{
object oPC = GetItemActivator();
AssignCommand(oPC, ClearAllActions());
AssignCommand(oPC, ActionStartConversation(oPC, "Nom de la conversation"));
}
}
Par Azrael07 le 23/11/2002 à 14:28:49 (#2626101)
coolstar, pour ta reponse :provient du message de miriandel
Sélectionne "Unique Power" si tu veux qu'un pointeur apparaisse pour le sort, ou "Unique Power Self Only" pour que l'effet ne concerne que l'utilisateur.
Par coolstar le 23/11/2002 à 14:31:49 (#2626122)
ou... comment un nb doit d'abord la fermer (& mieux lire) avant de l'ouvrir...
Par mobidique le 23/11/2002 à 14:37:08 (#2626152)
Par Azrael07 le 23/11/2002 à 14:47:12 (#2626210)
la méthode du OnActivate permet de passer la lecture du bouquin dans la fenetre de converstation.
Je sias pas si ca va être jouable comme méthode mais je pense que je vais essayer comme ca ;)
merci a toi quand meme, mob'
Par sounéva le 23/11/2002 à 14:52:08 (#2626244)
- tu veut que ton aventurier apprenne un élément de quête qui fera évoluer son journal en lisant un livre.
c'est tout simplement plus réaliste et cela permet de faire évoluer la quête que si je joueur a lu le livre.
bref y a des livres a lire et c'est vrai qu'un événement ou une fonction OnOpenBook et OncloseBook serai bien.
de même que pouvoir changer le contenu du livre par script serai extra, on pourrai faire des livre illisible pour les moins intelligents et faire changer le texte dans certaine situation.
Par coolstar le 23/11/2002 à 15:13:01 (#2626351)
Et sinon... ça marche enfin mon utilisation du Script de Jedaï (nb que je suis je l'avais mis en OnUnAcquireItem!)... mais par contre, impossible de donner des XP... comment les faire donner à l'Utilisateur Du-dit Item? et comment lors d'un Dial déclenché peut-on mettre l'Icône de l'Item?? :maboule:
:merci::merci::merci:
-------------------------------
Suggestion :
... pour actualiser le Journal des Quêtes via la lecture des livres (je viens juste d'y penser et ça va avec mes interrogations!)...
Y'a qu'à le faire via un Dial qui s'articulera comme une interaction entre le Lecteur et l'Ouvrage!!
(comme dans les Livres Dont Vous Etes le Héros quoi! la fonction Examiner ne servant alors qu'à décrire l'Objet au prime abord!)...
On n'a plus même qu'à diviser ainsi le Dial en Chapitres "consultables à la demande"...
(mais reste toujours le prob de Script d'Attribution à l'Utilisateur!) :D
-------------------------------
...
:hardos:
Par sounéva le 23/11/2002 à 15:17:05 (#2626367)
yep :)
Par Azrael07 le 23/11/2002 à 16:08:20 (#2626637)
Mais je pense avoir trouver la solution, je vais en effet utiliser le prinsipe des conversations pour lire le livre, par un OnActivate. De cette facon on ne lire pas un livre par l'inventaire mais en l'utilisant, et les pj pourrons passer leur aprem a la bibliothèque pour gagner de l'xp ;)
Par coolstar le 23/11/2002 à 16:14:33 (#2626677)
Par Tynril le 23/11/2002 à 17:36:52 (#2627131)
Par coolstar le 23/11/2002 à 17:41:08 (#2627158)
EDIT
--------------------
Perso, g naïvement tenté ça... :Dvoid main()
--------------------
{
// Donner des XP à la personne qui utilise l'objet
object oPC = GetItemActivator();
GiveXPToCreature(oPC, 12);
}
Par Azrael07 le 23/11/2002 à 18:11:47 (#2627332)
Voici le module de demo que j'ai fait
L'inconveniant c'est que initialiser une variable integer a chaques livre lut, tout ca pour chaques pj, c'est vite lourd sur le serveur. Encore un grand merci a bioware pour nous avoir intégré les variables booléenne :/
Items Parlants...
Par coolstar le 23/11/2002 à 22:23:19 (#2629002)
Pour Activer DES Items (quelque soit le nombre et la nature?) :
Script à mettre dans le OnActivateItem du Module (avec application du sort Pouvoir unique sur soi uniquement sur les Items désirés!)...//::///////////////////////////////////////////////
//:: FileName activer_items
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//:: Created By: coolstar "Honorable canard"
//:: Created On: 23/11/2002 14:51:50
//:://////////////////////////////////////////////
void main()
{
// Exemple avec un premier Item et son Dialogue attache
if (GetTag(GetItemActivated()) == "CS_EpeeIntelligente")
AssignCommand(GetItemActivator(), ActionStartConversation(GetItemActivator(), "act_epeeintellig"));
// Exemple avec un deuxieme Item et son Dialogue attache
if (GetTag(GetItemActivated()) == "CS_JouetBavard")
AssignCommand(GetItemActivator(), ActionStartConversation(GetItemActivator(), "act_jouetbavard"));
// Exemple avec un troisieme Item et son Dialogue attache
if (GetTag(GetItemActivated()) == "CS_HeaumeZut")
AssignCommand(GetItemActivator(), ActionStartConversation(GetItemActivator(), "act_heaumezut"));
}
& Pour rendre le Dial Interractif (Sélectif ou pour Offrir des XP selon le cas...) :
Script à insérer dans les Conditions d'exécution (ex. pour GENDER_FEMALE)...//::///////////////////////////////////////////////
& Script à insérer dans les Actions conséquentes (ex. pour XP)...
//:: FileName activer_gender
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//:: Created By: coolstar "Honorable canard"
//:: Created On: 23/11/2002 20:10:02
//:://////////////////////////////////////////////
int StartingConditional()
{
// Ajouter restriction de Sexe à l'Utilisateur de l'Item
return(GetGender(GetItemActivator()) == GENDER_FEMALE);
}//::///////////////////////////////////////////////
//:: FileName activer_xp
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//:: Created By: coolstar "Honorable canard"
//:: Created On: 23/11/2002 21:52:35
//:://////////////////////////////////////////////
void main()
{
// Donner des PeX à l'Utilisateur de l'Item
GiveXPToCreature(GetItemActivator(), 12);
}
Voilà, voilà... :ange:
Alors, n'hésitez pas à me reprendre ô Vétérants, parce que si tout marche à la perfection en Solo pour des Modules ponctuels, je n'ignore pas que certains détails doivent m'échapper pour ce qui est du Multi et/ou Persistant... :hardos:
D'autant que je n'ai vraiment pas compris la pertinence de mettre des AssignCommand(oPC, ClearAllActions()); ou des
object oPC = GetItemActivator(); et autres object oItem = GetItemActivated(); & string sTag = GetTag( oItem ); ??? :maboule:
Merci pour tous vos éclaircissements... et encore merci à Jedaï et Azrael plus particulièrement qui m'ont permis, bon gré mal gré, d'élucider enfin le mystère des Items Parlants grâce à leur Script... :merci: :merci: :merci:
...
Par Amaranthe le 23/11/2002 à 23:06:34 (#2629232)
ExecuteScript(GetResRef(GetItemActivated()), OBJECT_SELF);
Apres quoi il n'y a plus qu'a créer un script par objet, ce script ayant le même nom que le resref de l'objet.
Simple, efficace et de bon goût.
Ca a le mérite de pas avoir a recompiler le on_act_item a chaque fois.
Par Azrael07 le 23/11/2002 à 23:40:26 (#2629460)
moi personneelment je prefere de base dans le onactivate
coolstar > le ClearAllAction, c'ets si jamais le pc fait autre chose, il annule cette action courante pour bel et bien démarer la conversation. A toujours mettre avant une action, sinon tu vas droit vers les bugs.
TOut les autres trucs que tu marque, c'est une initialisation de variable, j'écrit en deux ligne ce que tu fait en une, mais niveau vitesse d'execution ca revient au meme. C'est simplement des différences d'écriture
Par coolstar le 23/11/2002 à 23:53:14 (#2629549)
Provient du message de Azrael07
TOut les autres trucs que tu marque, c'est une initialisation de variable, j'écrit en deux ligne ce que tu fait en une, mais niveau vitesse d'execution ca revient au meme. C'est simplement des différences d'écriture
Alors pourquoi taper autant de lignes si ça ne change rien??? :D
...
Par Azrael07 le 24/11/2002 à 10:46:50 (#2631098)
Pour simplifier, partons d'un exemple simple : Chaques fonction appelée bouffe des ressources, de facon plus ou moin marqué.
void main()
{
AssignCommand(GetItemActivator(), ActionStartConversation(GetItemActivator(), "act_jouetbavard"));
}
dans cette exemple tu peux constater que la fonction GetItemActivator est appellée deux fois. Si cette fonction ne doit pas demander beaucoup de ressources, il faut savoir qu'elle en utilise quand meme, alors on emploie une variable dans laquelle on stock l'objet, pour eviter de réemployer la fonction a chaques fois
on met donc :
void main()
{
object oPlayer = GetItemActivator
//La variable oPlayer représente donc l'activateur de l'objet, donc le joueur
AssignCommand( oPlayer, ActionStartConversation(oPlayer, "act_jouetbavard"));
}
et voila on a évité quelques instruction au processeur, et comme ca on a du gagner....... au moins 1*10^-9 s sur le temp d'éxécution ^_^
c'est pour cela que je parle de convention d'écriture plutot que de truc vraimnet utile, mais certaine fonction (comme les GetObjectByTag par exemple) utilise pas mal de ressources, passer par les variable est donc indisspensable
Par Jedaï le 27/11/2002 à 11:26:19 (#2654644)
Exemple classique : les boucles qui tournent plus de vingt fois de suite, si on a une variable qui reste constante (sic) pendant toute la boucle, l'initialiser en dehors de la boucle fera économiser au moins 19 appel de fonction ;) . Pour peu que le script qui lance cette boucle soit appelé souvent (et je ne parle même pas des OnHeartbeat où utiliser une boucle comprenant plus d'une fonction relève de l'inconscience :monstre: ), on gagnera un confort indéniable pour le module ! :D
Autre chose : pour les XP pendant un dialogue, je te conseille plutôt d'utiliser GetPCSpeaker() : avec GetItemActivator(), il suffit qu'un autre PC ait utilisé un objet à pouvoir unique entre-temps pour que ton script ne marche plus :(
Par coolstar le 27/11/2002 à 13:17:08 (#2655537)
:merci:
Par Azrael07 le 27/11/2002 à 13:40:38 (#2655784)
bon c'est corrigé, merci ca m'éconnomise du boulot de debugging ;)
JOL Archives 1.0.1
@ JOL / JeuxOnLine