Bienvenue sur JeuxOnLine - MMO, MMORPG et MOBA !
Les sites de JeuxOnLine...
 

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Gagner de l'experience par la lecture d'un livre

Par Azrael07 le 23/11/2002 à 0:58:19 (#2623665)

Je veux faire en sorte que lorsqu'un personnage joueur lise un livre, il gagne de l'experience.

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)

Un livre ? ou n'importe quel livre ?

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)

Hi!


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)

ben non, c'est bien pour n'importe quel livre

Par contre quesque t'appelle Unique power ?

Par coolstar le 23/11/2002 à 11:56:26 (#2625151)

Je confirme l'interrogation! je n'ai vu aucune option concernant Unique Power dans l'Edition d'Items??? :D

...



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)

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à.

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)

Je joue en anglais, donc vous ferez la traduction :)

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 miriandel pour cette reconfirmation... mais c nb, je vois vraiment pas où se trouve ce Unique Power dans la liste de sorts dans l'Editeur (j'ai la version FR)??? :D

Merci encore pour vos éclairages à tous... ;)


...

Par sounéva le 23/11/2002 à 13:51:58 (#2625839)

j'ai la vo avec les diag en francais.

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)

.. nan mais en fait je suis vraiment un Néobyte! j'ava pas vu le truc... :D

: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)

ok ben merci beacoup, je devrais pouvoir m'en sortir comme ca


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)

:D


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)

Heu ... Je peux faire une suggestion ? Pourquoi tu passe pas par le OnAcquire du module ? Tu te fais une série de livres avec le tag XPBook et dans le OnAcquire quand le perso fait l'acquisition de ce livre tu lui donne de l'XP, de manière aléatoire, en t'appuyant sur le nom du livre, en fonction du niveau du joueur en bref comme tu veux fixe ou variable selon une fonction de ton choix. Le pb reste que faire du livre une fois qu'il a rapporté de l'XP ... dans le cadre d'un module 24/7, tu associe une variable au perso lors de la lecture du book, méthode qui marchera trés bien aussi pour du module one shot. Tu peux aussi détruire le livre à la suite de son acquisition c'est brutal mais efficace :D

Par Azrael07 le 23/11/2002 à 14:47:12 (#2626210)

oui en effet, j'y avais pensé, mais le truc est que le joueur doit LIRE le livre, et pas simplement l'acquérir

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)

je comprends Azrael07 c'est certes perfectionniste mais un exemple :
- 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)

J'ACHETE!! :D



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)

unique pppooowwweeerrr
yep :)

Par Azrael07 le 23/11/2002 à 16:08:20 (#2626637)

voila voila c ca t'as tout compris

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)

Tiens-nous au courant! ;)

Par Tynril le 23/11/2002 à 17:36:52 (#2627131)

Demandez à Bioware un OnItemExamined :)

Par coolstar le 23/11/2002 à 17:41:08 (#2627158)

lol! t'as pas mieux comme réponse môssieux le Roi?? nan sérieux, hrrmmm! y'a quoi comme soluce pour qu'un Item puisse donner des XP à son Utilisateur ??? :D



EDIT
--------------------
Perso, g naïvement tenté ça... :D

void 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)

bah voila moi j'ai fait un truc qui marche (pas mal en plus ;) )

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)

Bon! je reviens de mes tests (ce fut un long labeur de nb!) et voilà ce que je ramène... :D


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)...
//::///////////////////////////////////////////////
//:: 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);
}
& Script à insérer dans les Actions conséquentes (ex. pour XP)...
//::///////////////////////////////////////////////
//:: 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)

Petit script a mettre dans le on_act_item de votre module.


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)

ben ca a le merite de pas avoir a recompiler le onactivateitem a chaques fois, mais ca multiplie le nombre de fichiers scripts

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)

rahlala je pourais écrire des pages et des pages sur l'esthétique et la lecture d'un code source, sur les conventions d'ériture et tout et tout.

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)

Je cautionne ce que vient de dire Azrael07, c'est surtout une habitude que j'ai prise en écrivant des scripts plus lourd sur lesquels l'initialisation de variable est quasi-indispensable si on veut un monde qui tourne....:)
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)

La sagesse n'attend pas le nombre des années... ;)

:merci:

Par Azrael07 le 27/11/2002 à 13:40:38 (#2655784)

aie aie aie oui oui c'est une faute immonde :/

bon c'est corrigé, merci ca m'éconnomise du boulot de debugging ;)

JOL Archives 1.0.1
@ JOL / JeuxOnLine