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

NWScript - pour niveau 7

Dans ce niveau 7, il sera question de plaçables et de portes. Chacun de ces objets est le support d'événements bien précis que nous allons développer. Bien plus complexes que les événements du module, les événements que nous dévoilerons ici seront les principaux organes de votre module.

Sortez votre trousse à outils, et bienvenue dans le monde de l'interactif.



NWScript - Page générale


NWScript - pour niveau 6
- Evénements du module -

NWScript - pour niveau 7
- Evénements d'un plaçable, d'une porte -

NWScript - pour niveau 8
- Evénements d'une zone, d'un déclencheur, d'une rencontre -

NWScript - pour niveau 9
- Evénements d'une conversation, d'une échoppe -

NWScript - pour niveau 10
- Evénements d'une créature -

Evénements d'un plaçable, d'une porte...

Plaçables et portes sont les supports des événements suivants :
- lors d'un clic
- lors de l'utilisation
- lors de l'ouverture
- lors de l'échec de l'ouverture (porte)
- lors de la modification de l'inventaire (plaçable)
- lors de la fermeture
- lors du dévérrouillage
- lors du verrouillage
- lors du déclenchement d'un piège
- lors du désarmement d'un piège
- lors d'une attaque physique
- lors du lancement d'un sort
- lorsque des dégâts sont subis
- lors de la "mort"
- lors d'une conversation
- événement récurrent
- événement défini par l'utilisateur

Notez que plusieurs événements peuvent se déclencher "simultanément", selon l'action effectuée ou selon l'état de l'objet. Notez également que certains événements ne se déclencheront que sous certaines conditions. Ces détails seront abordés à chaque description.

... Lors d'un clic
     (OnClick)

Cet événement se déclenche lorsqu'un joueur clique sur un plaçable utilisable ou une porte. Selon les termes de NWScript, il n'est pas question "d'utilisation". Il s'agit particulièrement de l'action "cliquer" (avec la souris, donc).


Pour un plaçable :

Selon le type d'action par défaut défini dans les propriétés d'un plaçable, l'événement "OnClick" peut ne pas se déclencher. Oui... pour nous "faciliter" la vie, il existe des types d'actions par défaut : automatique, utiliser (use), forcer (bash), désamorcer (disarm), et examiner. Bizarrement, il n'y a pas d'action "crocheter" dans cette liste.

Je présente donc sous forme de tableau les situations pour lesquelles l'événement "OnClick" se déclenchera... ou pas. Notez tout de même que l'événement "OnClick" se déclenchera toujours si on utilise l'action "Utiliser" grâce à un clic-droit sur le plaçable.

Action par défaut Automatique Utiliser Forcer Désamorcer Examiner
"Onclick" oui* oui non non non

* En action automatique, un coffre piégé et/ou verrouillé ne déclenchera pas l'événement "OnClick" si le joueur posséde la compétence et/ou la clé correspondante.

L'événement "OnClick" se déclenchera selon les conditions précédentes et ce, quelle que soit la distance entre le joueur et le plaçable. Notez que si un joueur clique sur un plaçable et que plusieurs événements se déclenchent, l'événement "OnClick" sera toujours le premier de la liste (s'il se déclenche).

Pour un plaçable, la fonction permettant de retrouver l'objet ayant effectué le clic est "GetPlaceableLastClickedBy()".


Pour une porte :

L'événement "OnClick" se déclenchera si cette porte est une transition vers un autre lieu ET si elle est déjà ouverte. Si la porte n'est pas une transition, l'événement "OnClick" ne se déclenchera pas.

Contrairement aux plaçables, l'événement "OnClick" n'est pas déclenché à longue distance. Le joueur devra se déplacer à portée. Aussi, l'événement "OnClick" est un peu plus délicat à faire fonctionner sur une porte.

Notez bien que dans le cas d'une porte de transition vers un autre lieu, un script placé dans l'événement "OnClick" bloquera toute transition, à moins de le faire manuellement dans ce même script (en prenant soin de bien laisser la transition dans les propriétés de la porte).

Pour une porte, la fonction permettant de retrouver l'objet ayant effectué le clic est "GetClickingObject()".


Plaçables et portes :

L'événement "OnClick" ne concerne que les interactions de joueur à plaçable ou de joueur à porte. Probablement parce que c'est le seul type d'objet du jeu capable d'utiliser une souris. Une équipe d'experts est actuellement sur le coup, et nous vous donnerons de plus amples informations après l'analyse de leur rapport.

... Lors de l'utilisation
     (OnUsed)

L'événement "OnUsed" est déclenché par l'action "utiliser". En général, seules les créatures sont capables d'effectuer cette action. Pour un joueur, l'utilisation vient généralement après le clic. Si une créature désire "utiliser" un plaçable ou une porte, elle devra d'abord s'en être rapprochée pour que l'événement "OnUsed" puisse être déclenché.


Pour un plaçable :

Pour un joueur qui utilise l'action "Utiliser" grâce à un clic-droit sur le plaçable, l'événement "OnUsed" se déclenchera toujours. Et ce, quel que soit le type d'action par défaut défini dans les propriétés de ce plaçable.

Autrement, selon l'état du plaçable et/ou le type d'action par défaut défini dans ses propriétés, l'événement "OnUsed" ne se déclenchera pas forcément si un joueur clique dessus :

Pour un plaçable verrouillé :

Action par défaut Automatique Utiliser Forcer Désamorcer Examiner
"OnUsed" oui* oui non non non

* Si le personnage possède la compétence "crochetage", ou s'il a la clé correspondante, l'événement "OnUsed" ne sera pas déclenché.

Si le plaçable est piégé, l'événement "OnUsed" ne sera pas déclenché si le joueur clique dessus.

Notez bien que si un joueur clique sur un plaçable et que plusieurs événements sont déclenchés, l'événement "OnUsed" sera toujours le dernier de la liste (s'il se déclenche).

Pour un cadran solaire par exemple, vous pourriez utiliser l'événement "OnUsed" pour donner au joueur l'heure courante du module :

void main()
{
    // Nous allons juste récupérer l'heure, puis
    // la convertir en valeur de type "string" afin
    // de pouvoir l'envoyer dans un message :


    int nHeure = GetTimeHour();
    string sMessage = "Il est "+IntToString(nHeure)+" heure(s)";
    SendMessageToPC(GetLastUsedBy(), sMessage);
}

Pour une porte :

Etrangement, l'événement "OnUsed" n'a pas l'air de vouloir fonctionner pour une porte, bien qu'il soit dans la liste...


Plaçables et portes :

La fonction permettant de retrouver l'objet ayant utilisé le plaçable ou (théoriquement) la porte est "GetLastUsedBy()".

... Lors de l'ouverture
     (OnOpen)

Cet événement se declenche lorsque s'ouvre un plaçable doté d'un inventaire ou une porte.


Pour un plaçable :

Pour un plaçable verrouillé, l'événement "OnOpen" se déclenchera après avoir cliqué dessus, si (et seulement si) :
- le type d'action par défaut du plaçable est "utiliser", ET que le joueur possède la clé requise.
- le joueur utilise l'action "utiliser" grâce à un clic-droit, ET qu'il possède la clé requise.

Pour un plaçable piégé, l'événement "OnOpen" ne se déclenchera pas si une créature interagit avec.

Notez que l'événement "OnOpen" d'un plaçable précédera toujours l'événement "OnUsed", s'il a été provoqué par un personnage.


Pour une porte :

Pour une porte verrouillée, l'événement "OnOpen" ne se déclenchera pas si un personnage intéragit avec elle. Il faudra qu'elle soit déverrouillée. Même si le personnage a la clé requise, il ne fera que déclencher l'événement "OnUnlock".

Pour une porte piégée, l'événement "OnOpen" ne se déclenchera pas si un personnage interagit avec elle.

Refermer une porte automatiquement est un cas de script fréquement utilisé dans l'événement "OnOpen" :

void main()
{
    // Au bout de de cinq secondes, la porte
    // se refermera automatiquement :


    object oDoor = OBJECT_SELF;
    DelayCommand(5.0, AssignCommand(oDoor, ActionCloseDoor(oDoor)));
}

Plaçables et portes :

La fonction permettant de retrouver l'objet ayant ouvert le plaçable ou la porte est "GetLastOpenedBy()".

... Lors de l'échec de l'ouverture (porte)
     (OnFailToOpen)

Cet événement se déclenche lorsque quelqu'un (ou quelque chose) tente d'ouvrir ou de crocheter une porte, et qu'il n'y parvient pas.

La fonction permettant de retrouver l'objet ayant tenté d'ouvrir la porte est "GetClickingObject()".

... Lors de la modification de l'inventaire (plaçable)
     (OnDisturb)

Cet événement se déclenche lorsque l'inventaire d'un plaçable est modifié. Cela peut être à cause d'un objet retiré, ou d'un objet rajouté.

La fonction permettant de retrouver ce qui a altéré l'inventaire d'un plaçable est "GetLastDisturbed()".

La fonction "GetInventoryDisturbType()" peut être utilisée pour déterminer quel est le type de modification dans l'inventaire du plaçable. La valeur que cette fonction renverra pourra être comparée aux constantes suivantes :
- INVENTORY_DISTURB_TYPE_ADDED : sa valeur de 0 signifiera qu'un objet a été rajouté.
- INVENTORY_DISTURB_TYPE_REMOVED : sa valeur de 1 signifiera qu'un objet a été retiré.

La fonction "GetInventoryDisturbItem()" permettra de retrouver l'item ayant été retiré ou rajouté.

... Lors de la fermeture
     (OnClose)

Cet événement se declenche lorsque se ferme un plaçable doté d'un inventaire ou une porte.


Pour un plaçable :

Pour un plaçable verrouillé, l'événement "OnClose" se déclenchera après avoir cliqué dessus, si (et seulement si) :
- le type d'action par défaut du plaçable est "utiliser", ET que le joueur possède la clé requise.
- le joueur utilise l'action "utiliser" grâce à un clic-droit, ET qu'il possède la clé requise.

Pour un plaçable piégé, l'événement "OnClose" ne se déclenchera pas si une créature interagit avec.

Oui, il est donc possible d'avoir un plaçable ouvert et verrouillé/piégé.

Notez que l'événement "OnClose" d'un plaçable précédera toujours l'événement "OnUsed", s'il a été provoqué par un personnage.


Pour une porte :

Pour une porte vérrouillée, l'événement "OnClose" ne se déclenchera pas.

Pour une porte piégée, l'événement "OnClose" ne se déclenchera pas si c'est une créature qui interagit avec.


Plaçables et portes :

La fonction permettant de retrouver l'objet ayant fermé le plaçable ou la porte est "GetLastClosedBy()".

Dans l'événement "OnClose", on peut facilement imaginer un script permettant de verrouiller automatiquement un plaçable ou une porte :

void main()
{
    // Grâce à la fonction suivante, le plaçable ou
    // la porte se verrouillera automatiquement :


    SetLocked(OBJECT_SELF, TRUE);
}

... Lors du dévérrouillage
     (OnUnlock)

Cet événement est déclenché lorsque quelqu'un utilise la compétence "crochetage" sur un plaçable ou une porte, ou qu'il utilise la clé requise.

La fonction permettant de retrouver l'objet ayant déverrouillé le plaçable ou la porte est "GetLastUnlocked()".

... Lors du verrouillage
     (OnLocked)

Cet événement est déclenché lorsque quelqu'un verrouille un plaçable ou une porte.

La fonction permettant de retrouver l'objet ayant verrouillé le plaçable ou la porte est "GetLastLocked()".

... Lors du déclenchement d'un piège
     (OnTrapTriggered)

Cet événement est déclenché lorsque le piège actif d'un plaçable ou d'une porte se déclenche. L'événement "OnTrapTriggered" peut également se déclencher lorsqu'un personnage utilise sa compétence "Désamorçage" et qu'il en résulte un echec critique.

Il semblerait bien qu'il n'existe aucune fonction directement liée à cet événement.

Notez que l'événement "OnTrapTriggered" d'une porte verrouillée et piégée ne se déclenche pas si un personnage n'a pas la clé requise ou s'il utilise sa compétence "crochetage".

... Lors du désarmement d'un piège
     (OnTrapDisarm)

Cet événement est déclenché lorsque le piège actif d'un plaçable ou une porte vient d'être désamorcé. Une tentative ratée de désamorçage ne déclenche donc pas cet événement.

La fonction permettant de retrouver l'objet ayant désarmé le piège d'un plaçable ou d'une porte est "GetLastDisarmed()".

Dans l'événement "OnDisarm", vous pouvez très bien accorder un peu d'expérience au joueur ayant désarmé le piège :

// Grâce à ce script, le joueur ayant
// désarmé le piège gagnera 100 XP :


void main()
{
    object oJoueur = GetLastDisarmed();

    // Je vérifie qu'il s'agit bien d'un personnage
    // joueur et non un PNJ, puis je donne l'expérience.

    if(GetIsPC(oJoueur) == TRUE)
        SetXP(oJoueur, GetXP(oJoueur)+100);
}

... Lors d'une attaque physique
     (OnPhysicalAttacked)

Cet événement est déclenché lorsqu'une créature essaye de "forcer" un plaçable ou une porte. A chaque attaque de la créature, l'événement "OnPhysicalAttacked" sera déclenché. Si la créature touche le plaçable et qu'elle inflige des dégâts, l'événement "OnPhysicalAttacked" sera automatiquement suivi de l'événement "OnDamaged".

La fonction permettant de retrouver l'objet ayant attaqué le plaçable ou la porte est "GetLastAttacker()".

Si l'attaquant est une créature, il est possible de retrouver l'arme qu'elle a utilisé lors de l'attaque grâce à la fonction "GetLastWeaponUsed(...)".

... Lors du lancement d'un sort
     (OnSpellCastAt)

Cet événement est déclenché lorsqu'un plaçable ou une porte est ciblé par un sort. Concernant les sorts à zone d'effet, il semble que seuls les plaçables réagissent s'ils sont dans la zone d'effet mais qu'ils ne sont pas pris pour cible. Si le sort provoque des dégâts, l'événement "OnSpellCastAt" sera automatiquement suivi de l'événement "OnDamaged".

La fonction permettant de retrouver l'objet ayant lancé un sort sur le plaçable ou la porte est "GetLastSpellCaster()".

La fonction "GetLastSpell()" permet de retrouver l'identifiant du sort qui a été lancé. La valeur obtenue peut être alors comparée aux constantes de la famille "SPELL_".

La fonction "GetLastSpellCastClass()" permet de retrouver quelle est la classe du lanceur de sort. Cette fonction saura aussi distinguer la bonne classe dans le cas d'une créature ayant plusieurs classes de type "lanceur de sort". La valeur renvoyée par cette fonction pourra être comparée aux constantes de la famille "CLASS_TYPE_"

La fonction "GetLastSpellHarmful()" permet de définir si le sort était offensif ou non. La valeur renvoyée sera "TRUE" si le sort était offensif.

... Lors des dégâts sont subis
     (OnDamaged)

Cet événement se déclenche si un plaçable ou une porte subit des dégâts.

La fonction permettant de retrouver l'objet ayant endommagé le plaçable ou la porte est "GetLastDamager()".

La fonction "GetTotalDamageDealt()" permettra de connaître la totalité des dégâts subis.

La fonction "GetDamageDealtByType(...)" permettra de connaître le montant d'un même type de dégâts infligés. Il faudra remplir le paramètre de la fonction par une constante de la famille "DAMAGE_TYPE_", pour désigner le type de dégâts infligés dont on souhaite connaître le montant.

Un script amusant est le script de type "oeil pour oeil". Un plaçable (ou une porte) pourrait rendre la totalité des dégâts qu'un méchant joueur lui aurait infligé :

// Grâce à ce script bienveillant, le méchant
// joueur subira la même quantité de dégâts :


void main()
{
    object oJoueur = GetLastDamager();

    // Je vérifie qu'il s'agit bien d'un joueur
    if(GetIsPC(oJoueur) == TRUE)
    {
        effect eDamage = EffectDamage(GetTotalDamageDealt());
        ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamage,oJoueur);
    }
}

Encore plus amusant, vous pouvez également infliger les mêmes types de dégâts qu'un joueur a infligé :

void main()
{
    object oJoueur = GetLastDamager();

    if(GetIsPC(oJoueur) == TRUE)
    {
        effect eDamage;
        int nType = 1;
        while(nType <= 2048)
        {
            eDamage = EffectDamage(GetDamageDealtByType(nType));
            ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamage,oJoueur);
            nType = nType*2;
        }
    }
}

... Lors de la "mort"
     (OnDeath)

Cet événement est déclenché lorsque quelqu'un (ou quelque chose) détruit le plaçable ou la porte. Il est encore possible d'interagir avec un placable détruit, ou une porte détruite, environ pendant trois secondes. Passé ce délai, le plaçable ou la porte n'est plus accessible.

La fonction permettant de retrouver l'objet ayant détruit le plaçable ou la porte est "GetLastKiller()".

... Lors d'une conversation
     (OnConversation)

Cet événement est déclenché lorsqu'un plaçable ou une porte est à portée d'un dialogue. Attention, il ne s'agit pas d'une "conversation" selon les termes de NWN2. J'utiliserai le terme "dialogue" pour tout ce qui est utilisation de la fenêtre de dialogue, ou d'une fonction de script telle que "SpeakString(...)".

Le plaçable entendra un dialogue "parlé" ou "chuchoté" selon la distance que couvrent ces type de dialogue.

La fonction permettant de retrouver l'objet ayant tenu une discussion avec le plaçable ou la porte est "GetLastSpeaker()".

Si on a paramétré le plaçable ou la porte de façon à "écouter" des phrases spécifiques, la fonction "GetListenPatternNumber()" permettra de déterminer si l'identifiant de la phrase a été rajouté dans la liste des identifiants connus.

Evénement récurrent
     (OnHeartbeat)

Cet événement est déclenché toutes les 6 secondes par le plaçable ou la porte. Il n'y a pas d'objet associé au déclenchement de cet événement.

Evénement défini par l'utilisateur
     (OnUserDefined)

Au même titre que pour le module, il est possible de faire réagir l'événement "OnUserDefined" à partir des autres événements, ou à partir d'événements personnalisés.

Vous avez gagné un niveau !

Après avoir défini des scripts pour le module, l'utilisation des plaçables et des portes se révèle vital pour le bien être d'un module. Que ce soit dans l'utilisation d'un coffre, d'un levier ou d'une porte, un donjon sera le principal terrain sur lequel vous pourrez utiliser tous ces outils.



NWScript - Page générale


NWScript - pour niveau 6
- Evénements du module -

NWScript - pour niveau 7
- Evénements d'un plaçable, d'une porte -

NWScript - pour niveau 8
- Evénements d'une zone, d'un déclencheur, d'une rencontre -

NWScript - pour niveau 9
- Evénements d'une conversation, d'une échoppe -

NWScript - pour niveau 10
- Evénements d'une créature -

Rédigé par Deyonara
article mis en ligne le 14 juin 2007 à 12:46,
dernière mise à jour : 17 octobre 2007 à 19:11.
Haut de page