?
| Nos forums | NwN2.fr | Lyncya | Notre channel IRC |
La Bibliothéque de Neverwinter Nights
La Bibliothéque de Neverwinter Nights
 
 
 
 
 
Bienvenue, connectez vous ou créez votre compte. Changer d'interface
 
Se connecter:
Login:

Password:


 
Neverwinter Nights 2
  Compendium NWN/NWN2
Classe, Warlock
Classes de Base
Classes de Prestige
Forum Joueur NWN2
Forum Concepteur NWN2
Bestiaire (Créatures)
Races
Tests
 - Collector Chaotique Mauvais (bbnwn, 4 nov 2006)
 - Mask of the Betrayer
 - Storm of Zehir
 - Mysteries of Westgate
Mondes
 - Les Artisans du Mitan
 - Les Légendes de Luiren
 - LanceDragon
 - La Bataille pour Cormanthor
 - Man O'War
 - Sendarie Nouvel Âge
Preview
 - 29 Mars 2006 (BBNWN)
 - 2 mai 2006 (Gamespot)
 - 17 Mai 2006 (WarCry)
 - 19 Mai 2006 (NWVault)
 - Designer Diary #1 (Gamespot, 1er Juin 2006)
Interview
 - Dorian Richard (20/02/2006)
 - Ferret Baudoin (22/02/2006)
 - Feargus Urquhart (2 mai 2006)
 - La Lettre Ouverte de Papermonk
 - Chris Avellone (Total Video Games)
Logs IRC
 - Warcry (27/01/2006)
 - NWVault / NWC (3 Juin 2006)
 - NWN2News.net (30 Juin 2006)
Faciliter la diffusion et l'installation de vos créations

 
Communauté
  Forums
Channel #nwnights-fr
Guide IRC
Liens
CEP

 
Fichier
  Tileset
Module
Hakpak
Objets
Portraits
Créatures
Scripts
Tutoriaux
Autres
Wallpapers

 
Editeur
  Tutorial Editeur
Cinématiques
Musiques
Textures
Tutoriaux NWScripts
Scripts

 
Le jeu
  Solution
Sorts
Classes
Dons (feat)
Aptitudes (skill)
Bestiaire
Règles 3e Edition
Jouer en multiplayer

 
Hordes of the Underdark
  Informations Générales
Solution [forum]

 
Shadows of Undrentide
  Preview
Informations générales
Classes de Prestige
'Lisez Moi.txt' de la Démo
FAQ
Nouveaux tilesets
Solution [forum]

 
Divers
  Traductions Logs Irc
Guides divers

 
Présentation
  Généralités
Configuration minimale
Serveur Dédié
Traduction FAQ
Historique (nwn et bioware)
Contrats de Bioware (vf)

 
Site
  Copyrights
Webmasters

 
     
 
Dîtes non aux inutiles protections contre la copie dans les jeux (SecuROM, StarForce, etc) !!
HADOPI - Le Net en France : black-out

Appel de portail et effets spéciaux

Il peut vous être utile de faire apparaître un portail comme conséquence d'une action, et vous aurez sûrement envie d'accompagner l'apparition de ce portail avec des effets spéciaux, qui pourraient le cas échéant endommager les structures avoisinantes et/ou blesser les PJs qui seraient à proximité.

// Effet special: fx: VFX_*, time : en seconde, type de dommage DAMAGE_TYPE_*
struct FX
{
  int fx;
  float time;
  int damage;
  int damageType;
  int damageMin;
  int damageMax;
};


// Creer un portail:
// - oCaller : personne appelant le portail
// - lUserItemLoc : location ou creet le portail
// - Structure Portail

object CreatePortail( object oCaller, location lUserItemLoc, struct FX cBeam, struct FX cAura, int iType = 0 );


object CreatePortail( object oCaller, location lUserItemLoc, struct FX cBeam, struct FX cAura, int iType = 0 )
{
  int bCanCreate = TRUE;
  object oPortail = OBJECT_INVALID;

  ///////////////////////////////

  /* Partie a modifier selon le type d'action voulue */
  if ( iType == 0 &&
    GetIsPC( oCaller ) &&
    GetLocalInt( GetModule(), "bal_portail_used_by_" + GetPCPlayerName( oCaller ) )
    == TRUE )
  {
    FloatingTextStringOnCreature( GetPCPlayerName( oCaller ) + " : vous avez deja ouvert un portail.", oCaller, FALSE );
    bCanCreate = FALSE;
  }
  /* Partie a modifier selon le type d'action voulue */
  ///////////////////////////////

  if ( bCanCreate == TRUE )
  {
    effect eEffect = EffectVisualEffect( VFX_DUR_ELEMENTAL_SHIELD );
    effect eEffect2 = EffectVisualEffect( cAura.fx );

    ApplyEffectAtLocation( DURATION_TYPE_TEMPORARY, eEffect, lUserItemLoc, 3.0);
    oPortail = CreateObject( OBJECT_TYPE_PLACEABLE, "teleport_portail", lUserItemLoc, FALSE );
    ApplyEffectAtLocation( DURATION_TYPE_TEMPORARY, eEffect2, lUserItemLoc, cAura.time );

    effect eLightning = EffectBeam( cBeam.fx, oPortail, BODY_NODE_CHEST );

    float fDelay = 0.2;
    object oTarget = GetFirstObjectInShape( SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, lUserItemLoc, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_ITEM | OBJECT_TYPE_PLACEABLE );

    int iDamageRange = abs( cBeam.damageMax - cBeam.damageMin );
    effect eDamage;


    while ( GetIsObjectValid( oTarget ) )
    {
      if ( oTarget != oPortail )
      {
        DelayCommand(fDelay, ApplyEffectToObject( DURATION_TYPE_TEMPORARY, eLightning, oTarget, cBeam.time ) );

      if ( cBeam.damage == TRUE && iDamageRange > 0 )
      {
        eDamage = EffectDamage( ( cBeam.damageMin + Random( iDamageRange ) + 1 ), cBeam.damageType );
      DelayCommand( 0.0, ApplyEffectToObject( DURATION_TYPE_INSTANT, eDamage, oTarget ) );
      }
    }
    fDelay = fDelay + 0.1f;

    oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, lUserItemLoc, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_ITEM |  OBJECT_TYPE_PLACEABLE );
    }

    /* Type de portails
      0. portail prive de teleportation
    */


    ///////////////////////////////
    /* Partie a modifier selon le type d'action voulue */
    if ( iType == 0 && GetIsPC( oCaller ) )
    {
      SetLocalInt( oPortail   , "bal_portail_type", iType );
      SetLocalString( oPortail, "bal_portail_user", GetPCPlayerName( oCaller ) );
      SetLocalInt( GetModule(), "bal_portail_used_by_" + GetPCPlayerName( oCaller ), 1 );
    }
    /* Partie a modifier selon le type d'action voulue */
    ///////////////////////////////

  }

  return oPortail;
}

Un script que j'ai crée: le but est de créer un portail qui a pour blueprint teleport_portail. Ceci va en plus de créer le portail dégager des effets spéciaux histoire d'en mettre plein la vue. Ces effets spéciaux peuvent aussi mettre plein de dégâts aux créatures environnant le portail.
Je l'explique :

struct FX
{
  int fx;
  float time;
  int damage;
  int damageType;
  int damageMin;
  int damageMax;
};

Cette structure va nous permettre de définir un effet spécial, elle va nous simplifier la vie: au lieu de faire des noms de variable pas sympa du tout, on pourra faire appel à par exemple beam.time, ce qui est plus sympa quand même.

  • fx : il s'agit d'un entier représentant une des constantes VFX_*.
  • time : flottant représentant la durée de l'effet
  • damage : entier (ou booléen) représentant si oui (TRUE) ou non (FALSE) le portail dommagera les différentes choses (créatures, placeables, objets) qui traînent dans le coin.
  • damageType : type de dommage. Basiquement représenté par une constante DAMAGE_TYPE_*
  • damageMin, damageMax : dommages minimum et maximum. Et oui, on utilise pas les fonctions d20.
object CreatePortail( object oCaller, location lUserItemLoc, struct FX cBeam, struct FX cAura, int iType = 0 )
  • oCaller : personne qui appelle le portail.
  • lUserItemLoc : l'endroit où va se 'poser' le portail. Basiquement: GetItemActivatedTargetLocation(); s'il s'agit d'une item créant le portail.
  • cBeam : représente le rayon (par exemple: électrique) qui 'touchera' chacun des objets présant dans la zone. Ici, cBeam.fx doit être une constante VFX_BEAM_*
  • cAura : lorsque le portail apparaît on crée une aura (sans effets sur les objets) : par exemple, une aura de 'froid' sur un portail menant vers les plaines hivernales. etc. Basiquement, ça doit être une constante VFX_DUR_AURA_*
  • iType : type de portail. Si vous désirez faire un portail menant vers l'enfer, alors il serait bon d'envoyer quelque démons, ceci vous permet d'ajouter des suppléments à la fonction.

La fonction renvoie par défaut le portail crée, ou un OBJECT_INVALID en cas de pépin.

///////////////////////////////

/* Partie a modifier selon le type d'action voulue */
if ( iType == 0 &&
  GetIsPC( oCaller ) &&
  GetLocalInt( GetModule(), "bal_portail_used_by_" + GetPCPlayerName( oCaller ) )
  == TRUE )
{
  FloatingTextStringOnCreature( GetPCPlayerName( oCaller ) + " : vous avez deja ouvert un portail.", oCaller, FALSE );
  bCanCreate = FALSE;
}
 /* Partie a modifier selon le type d'action voulue */
 ///////////////////////////////

Cette partie consiste basiquement à vérifier par exemple l'existance du portail et éviter qu'il soit recrée. Si vous donnez a valeur FALSE à bCanCreate alors rien ne se produira.

///////////////////////////////
/* Partie a modifier selon le type d'action voulue */
if ( iType == 0 && GetIsPC( oCaller ) )
{
  SetLocalInt( oPortail   , "bal_portail_type", iType );
  SetLocalString( oPortail, "bal_portail_user", GetPCPlayerName( oCaller ) );
  SetLocalInt( GetModule(), "bal_portail_used_by_" + GetPCPlayerName( oCaller ), 1 );
}
/* Partie a modifier selon le type d'action voulue */
///////////////////////////////

C'est ici que cela se passe: en fonction du type, vous pouvez décider d'envoyer des démons, de personaliser le portail etc !

 
 
Revenir à la page d'accueil du site Ajouter la Bibliothéque de Neverwinter dans vos favoris Afficher une version imprimable de la page
  NeverList - Liste ...
Lyncya 3 - La Gue ...
Sarmates!
Le dernier des fi ...
Bonne année
Joyeux Noël 2010
The Witcher 2 en ...

Archives
Rechercher
 
 
Le Site



NwN 2 - Support des Modules Solos


Groupes
Archives
 

:: design by ghaxir :: coding by baldurien :: la bibliothèque de neverwinter :: tous droits réservés ::