|
|
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é.
struct FX
{
int fx;
float time;
int damage;
int damageType;
int damageMin;
int damageMax;
};
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;
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;
}
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 );
}
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 );
}
}
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.
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;
}
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.
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 );
}
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 !
|
|
|
|
|
|
|