[SCRIPT] script léger pour une forge/artisanat

Répondre
Partager Rechercher
Valà, j'avais besoin d'un truc tout simple pour faire une forge, et j'avais pas envie d'utiliser un gros truc comme l'ATS juste pour ça, donc je me suis fait une petite bibliothèque indépendante :

Code PHP:

/////////////////////////////////////////////////////////////////////////////
/*
Bibliothèque pour la création d'objets à partir d'autres
*/
/////////////////////////////////////////////////////////////////////////////
// Nom : nwl_forgitem.nss
// Auteur : Jedaï
/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////
//PROTOTYPES
/////////////////////////////////////////////////////////////////////////////

//Vérifie dans oForge si les objets requis sont présents dans les bonnes quantités,
//si c'est le cas, la fonction renvoie TRUE/1, crée l'objet de blueprint/resref sObtenu dans oForge,
//, détruit les objets requis et oForge dit sMessage
//dans le cas contraire, elle renvoie FALSE/0
//sRequis est formé des tags des objets requis, ainsi que des quantités de ces objets, exemple :
//"2!POTION_MAG:ANNEAU:EPEE_LONGUE_01:6!QUEUE_SERPENT:"
//De même sObtenu (qui ne contient qu'un seul blueprint) peut comporter une indication de quantité
//exemple : 10!potion_bleue.
//ATTENTION : toujours mettre ":" à la fin de sRequis, ne pas en mettre au début
//ne pas mettre de nombre négatif, ne pas mettre 2 fois le même tag dans sRequis
int Transformstring sRequisstring sObtenuobject oForge OBJECT_SELFstring sMessage "");


//Compte le nombre d'items de tag sTag dans l'inventaire de oOwner
int CountItemstring sTagobject oOwner OBJECT_SELF );


//Détruit le nombre nNum d'items de tag sTag dans l'inventaire de oOwner
//renvoie le nombre d'items réellement détruits
int DestroyNumItemstring sTagint nNum 1object oOwner OBJECT_SELF);


/////////////////////////////////////////////////////////////////////////////
//FONCTIONS
/////////////////////////////////////////////////////////////////////////////

void vciostring sItemTemplateobject oTarget OBJECT_SELFint nStackSize )
{
    
CreateItemOnObjectsItemTemplateoTargetnStackSize );
}


int DestroyNumItemstring sTagint nNum 1object oOwner OBJECT_SELF)
{
    
object oItem GetFirstItemInInventoryoOwner );
    
string sResrefint nCount 0;
    while( 
GetIsObjectValidoItem ))
    {
        if( 
GetTagoItem ) == sTag )
        {
            
sResref GetResRefoItem );
            
nCount += GetNumStackedItemsoItem );
            
DestroyObjectoItem0.1 );
        }

        
oItem GetNextItemInInventoryoOwner );
    }

    
int nToKeep nCount nNum;

    if( 
nToKeep <= ) return nCount;

    for( ; 
nToKeepnToKeep-- )
    
AssignCommandGetModule(),
        
DelayCommand0.2,
            
vciosResrefoOwner )));

    return 
nNum;
}


int CountItemstring sTagobject oOwner OBJECT_SELF )
{
    
object oItem GetFirstItemInInventoryoOwner );
    
int nCount 0;
    while( 
GetIsObjectValidoItem ))
    {
        if( 
GetTagoItem ) == sTag )
            
nCount += GetNumStackedItemsoItem );

        
oItem GetNextItemInInventoryoOwner );
    }

    return 
nCount;
}


int Transformstring sRequisstring sObtenuobject oForge OBJECT_SELFstring sMessage "")
{
    
string sTagint nNumnItemsstring sToDestroy sRequis;

    while( (
nNum FindSubStringsRequis":" )) != -)
    {
        
sTag GetStringLeftsRequisnNum );
        
sRequis GetStringRightsRequisGetStringLengthsRequis ) - nNum );

        if( (
nNum FindSubStringsTag"!" )) != -)
        {
            
nItems StringToIntGetStringLeftsTagnNum ) );
            
sTag GetStringRightsTagGetStringLengthsTag ) - nNum );
            if( 
CountItemsTagoForge ) < nItems ) return FALSE;
        }
        else if( ! 
GetIsObjectValidGetItemPossessedByoForgesTag ) ) )
            return 
FALSE;
    }

    while( (
nNum FindSubStringsToDestroy":" )) != -)
    {
        
sTag GetStringLeftsToDestroynNum );
        
sToDestroy GetStringRightsToDestroyGetStringLengthsToDestroy ) - nNum );

        if( (
nNum FindSubStringsTag"!" )) != -)
        {
            
nItems StringToIntGetStringLeftsTagnNum ) );
            
sTag GetStringRightsTagGetStringLengthsTag ) - nNum );
            
DestroyNumItemsTagnItemsoForge );
        }
        else 
DestroyObjectGetItemPossessedByoForgesTag ) );
    }

    
nItems 1;

    if( (
nNum FindSubStringsObtenu"!" )) != -)
    {
        
nItems StringToIntGetStringLeftsObtenunNum ) );
        
sObtenu GetStringRightsObtenuGetStringLengthsObtenu ) - nNum );
    }

    for( ; 
nItemsnItems-- )
        
CreateItemOnObjectsObtenuoForge );

    if( 
sMessage != "" AssignCommandoForgeSpeakStringsMessage ) );

    return 
TRUE;
}


//void main(){} 
Code PHP:

/////////////////////////////////////////////////////////////////////////////
//SCRIPTS DE TEST
/////////////////////////////////////////////////////////////////////////////

#include "nwl_forgitem"

void main()
{
    if( ! 
Transform"2!PLUME_PHENIX:4!MACHIN:2!BOUTEILLE:""2!potion_rouge"OBJECT_SELF"2 potions de feu !" ) )
        
SpeakString"Pas les bons objets !" );
}

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

#include "nwl_forgitem" 

void main() 

    if( 
Transform"2!PLUME_PHENIX:3!MACHIN:2!BOUTEILLE:""2!potion_rouge"OBJECT_SELF"2 potions de feu !" ) ) 
        return; 
    if( 
Transform"2!PLUME_PHENIX:EPEE_LONGUE:""lame_feu" ) ) 
        return; 
    if( 
Transform"2!GLACON:BOUTEILLE:""potion_bleue" ) ) 
        return; 
    if( 
Transform"10!MINERAI_FER:""mauvaise_epee" ) ) 
        return; 
    if( 
Transform"2!MINERAI_FER:3!MINERAI_CHARBON:""2!minerai_acier" ) ) 
        return; 
    
// A recopier à la suite si nécessaire :
    //if( Transform( ":", "" ) ) 
    //    return; 
     

*/ 
Valà, ça peut toujours servir, c'est sans fioriture, mais on peut toujours la coupler avec une bibliothèque d'émulation de tableau, ou avec un .2da prochainement.
Si ça intéresse quelqu'un, je peux rajouter des possibilités comme :
  • Permettre de mettre des "outils" dans les objets requis, c'est à dire des objets qui ne seront pas détruits même si ils sont nécessaires
  • Permettre une temporisation : l'objet final est achevé seulement au bout d'un certain temps
  • Dans cette optique, rajouter un paramètre qui dit si les objets requis sont détruits tous dés le début du travail, au fur et à mesure (ça c'est plus dur, pas sûr que je le fasse), ou à la fin
  • Permettre de créer plusieurs objets différents (pas forcément avec le même temps d'achèvement) en un seul Transform()
  • Autres... Vous avez des idées ?
  • Sans refaire l'ATS, limiter la conception de certains objets en fonction d'une valeur de caractéristique et/ou d'un jet peut-être. (Quoique j'aime pas les jets de dé de Bioware.)
    Genre, pour forger une épée une Dextérité et une Force minimums, pour faire une potion, une Intelligence minimum.
  • En fonction de la création certains outils pourraient s'abimer avec le temps. Un pourcentage selon l'objet, si on fait en dessous, un int qui s'incrémente et quand on arrive à une certaine valeur, l'outil est cassé.

[ModeSemiHSOn = Histoire sur les jets de dé]
Une fois, sur un serveur action, j'avais un barbare niveau 8, 20 en force et une bonne épée bâtarde que je savais bien manier ( comprendre ici +1). Nous arrivons à un total de +13 pour toucher.
Il m'a fallut près de 3 minutes IRL pour déquiller cette saleté de gob en un seul coup d'épée!! Je crois pouvoir postuler pour la plus longue série de jet pourris... *heureusement qu'il ne gère pas les fumble, je me serais tué tout seul...
[ModeSemiHSOff]
Jedaï te serait il possible de faire un petit module de test pour voir l application de ton script grandeur nature car a ma connaissance je connais pas de module francophone utilisant se type de script (et se taper l installation de l ats juste pour comprendre comment marche le système de la forge je trouve sa un peu abuser)

en tout cas ton script m intéresse grandement et je pense pas être le seul que sa va intéresser

merci d avance !
Bon, j'ai fait des ajouts, désolé Archamedes, je n'ai pas encore rajouté les tests de compétences, je pourrais le faire, mais je commence à m'inquiéter devant l'enflure que prend ma fonction, et je me demande si je n'ai pas déjà rajouté trop de truc....
Enfin certaines des fonctions ont été "sorties" du corps de la fonction Transform, et elle peuvent être assez utiles, en offrant une interface de haut niveau pour les suppressions et tests multiples dans l'inventaire.

Il devient maintenant évident qu'il faudra créer des fonctions "raccourcis" avec un certain nombre de paramètres fixés, selon les préférences du scripteur pour son système de forge.

Code PHP:

/////////////////////////////////////////////////////////////////////////////
/*
Bibliothèque pour la création d'objets à partir d'autres
*/
/////////////////////////////////////////////////////////////////////////////
// Nom : nwl_forgitem.nss
// Auteur : Jedaï
/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////
//DECLARATIONS DE CONSTANTES
/////////////////////////////////////////////////////////////////////////////

int DESTROY_AT_THE_BEGINNING 2;
int DESTROY_AT_MIDDLE 4;
int DESTROY_AT_THE_END 8;

int DESTROY_IF_FAILURE 16;

int HENCHMAN_CREATURE 32;


/////////////////////////////////////////////////////////////////////////////
//PROTOTYPES DES FONCTIONS
/////////////////////////////////////////////////////////////////////////////


//Compte le nombre d'items de tag sTag dans l'inventaire de oOwner
int CountItemstring sTagobject oOwner OBJECT_SELF );


//Détruit le nombre nNum d'items de tag sTag dans l'inventaire de oOwner
//renvoie le nombre d'items réellement détruits
int DestroyNumItemstring sTagint nNum 1object oOwner OBJECT_SELF);


//Vérifie si oOwner contient bien une série d'objet, dont les quantités et les tags sont indiqués dans des chaînes formées ainsi :
//"2!POTION_MAG:ANNEAU:EPEE_LONGUE_01:6!QUEUE_SERPENT:"
//vérifie si oOwner contient au moins 2 items de tag "POTION_MAG", 1 item de tag "EPEE_LONGUE_01" et 6 "QUEUE_SERPENT"
int TestItemStringstring sItemsobject oOwner );


//Détruit une série d'items dans l'inventaire de oOwner, grâce à une chaîne formée ainsi :
//"2!POTION_MAG:ANNEAU:EPEE_LONGUE_01:6!QUEUE_SERPENT:"
//détruit 2 items de tag "POTION_MAG", 1 item de tag "EPEE_LONGUE_01" et 6 "QUEUE_SERPENT"
//si nForce est à FALSE, la série d'item ne sera pas détruite si ces items ne sont pas tous présents,
//la fonction renvoie le nombre d'items réellement détruit
//ATENTION : pour tous les items qui sont susceptibles de se trouver dans des piles, mettez la quantité à
//détruire, même s'il s'agit de 1!
int DestroyItemStringstring sToDestroyobject oOwnerint nForce TRUE );

//Vérifie dans oForge si les objets requis  sont présents dans les bonnes quantités,
//Vérifie dans oMaker (par défaut égal à oForge) si les outils sont bien présents
//si c'est le cas, la fonction renvoie TRUE/1, crée l'objet de blueprint/resref sObtenu dans oForge,
//, détruit les objets requis et oForge dit sMessage
//dans le cas contraire, elle renvoie FALSE/0
//sRequis est formé des tags des objets requis, ainsi que des quantités de ces objets, exemple :
//"2!POTION_MAG:ANNEAU:EPEE_LONGUE_01:6!QUEUE_SERPENT:"
//De même sObtenu (qui ne contient qu'un seul blueprint) peut comporter une indication de quantité
//exemple : 10!potion_bleue.
//nFlag peut contenir les flags suivants (séparés par |, ex : , DESTROY_IF_FAILURE | DESTROY_AT_THE_END, ) :
//* DESTROY_AT_THE_BEGINNING, DESTROY_AT_MIDDLE et DESTROY_AT_THE_END
//déterminent quand les objets requis sont détruits, si il y a un délai avant la création
//si les objets requis (mais pas les outils) ne sont pas présents au moment de la vérification, la création ne se fera pas
//par défaut, les objets seront détruit à la moitié du-temps
//* DESTROY_IF_FAILURE indique qu'en cas d'échec, les objets requis devront être détruits
//fDelay indique un délai en secondes avant la création de l'objet
//nSuccess indique le pourcentage de chance de réussite de l'objet
//ATTENTION : toujours mettre ":" à la fin de sRequis, ne pas en mettre au début
//ne pas mettre de nombre négatif, ne pas mettre 2 fois le même tag dans sRequis,
//pour tous les items qui sont susceptibles de se trouver dans des piles, mettez la quantité à
//détruire, même s'il s'agit de 1!
int Transformstring sRequisstring sObtenuobject oForge OBJECT_SELFstring sUtils ""object oMaker OBJECT_INVALIDint nSuccess 100float fDelay 0.0fint nFlag 0string sMessage "");


//Vérifie dans oForge si les objets requis  sont présents dans les bonnes quantités,
//Vérifie dans oMaker (par défaut égal à oForge) si les outils sont bien présents
//si c'est le cas, la fonction renvoie TRUE/1, crée la créature de blueprint/resref sObtenu à côté de oForge,
//, détruit les objets requis et oForge dit sMessage
//dans le cas contraire, elle renvoie FALSE/0
//sRequis est formé des tags des objets requis, ainsi que des quantités de ces objets, exemple :
//"2!POTION_MAG:ANNEAU:EPEE_LONGUE_01:6!QUEUE_SERPENT:"
//De même sObtenu (qui ne contient qu'un seul blueprint) peut comporter une indication de quantité
//exemple : 10!gobelin.
//nFlag peut contenir les flags suivants (séparés par |, ex : , DESTROY_IF_FAILURE | DESTROY_AT_THE_END, ) :
//* DESTROY_AT_THE_BEGINNING, DESTROY_AT_MIDDLE et DESTROY_AT_THE_END
//déterminent quand les objets requis sont détruits, si il y a un délai avant la création
//si les objets requis (mais pas les outils) ne sont pas présents au moment de la vérification, la création ne se fera pas
//par défaut, les objets seront détruit à la moitié du temps
//* HENCHMAN_CREATURE indique que la créature créée doit être liée à oMaker
//* DESTROY_IF_FAILURE indique qu'en cas d'échec, les objets requis devront être détruits
//fDelay indique un délai en secondes avant la création de l'objet
//nSuccess indique le pourcentage de chance de réussite de l'objet
//oWP : le waypoint où apparaîtra l'objet, par défaut, à côté de oForge
//ATTENTION : toujours mettre ":" à la fin de sRequis, ne pas en mettre au début
//ne pas mettre de nombre négatif, ne pas mettre 2 fois le même tag dans sRequis,
//pour tous les items qui sont susceptibles de se trouver dans des piles, mettez la quantité à
//détruire, même s'il s'agit de 1!
int Cocoonstring sRequisstring sObtenuobject oForge OBJECT_SELFstring sUtils ""object oMaker OBJECT_INVALIDint nSuccess 100float fDelay 0.0fint nFlag 0object oWP OBJECT_INVALIDstring sMessage "");


/////////////////////////////////////////////////////////////////////////////
//FONCTIONS
/////////////////////////////////////////////////////////////////////////////

void vciostring sItemTemplateobject oTarget OBJECT_SELFint nStackSize )
{
    
CreateItemOnObjectsItemTemplateoTargetnStackSize );
}

void vcoint nObjectTypestring sTemplatelocation locLocationint bUseAppearAnimation FALSE)
{
    
CreateObjectnObjectTypesTemplatelocLocationbUseAppearAnimation );
}

void vtstring sRequisstring sObtenuobject oForgeint nFlagstring sMessagefloat fDelay 0.0f)
{
    if( 
fDelay == 0.0 )
    {
        if( 
nFlag DESTROY_AT_THE_END )
        {
            if( ! 
DestroyItemStringsRequisoForgeFALSE )) return;
        }

        
int nNum;
        
int nItems 1;

        if( (
nNum FindSubStringsObtenu"!" )) != -)
        {
            
nItems StringToIntGetStringLeftsObtenunNum ) );
            
sObtenu GetStringRightsObtenuGetStringLengthsObtenu ) - nNum );
        }

        for( ; 
nItemsnItems-- )
            
DelayCommand(0.1vciosObtenuoForge ));

        if( 
sMessage != "" AssignCommandoForgeSpeakStringsMessage ) );
    }
    else if( 
DestroyItemStringsRequisoForgeFALSE ) )
    {
        
DelayCommandfDelayvtsRequissObtenuoForgenFlagsMessage ) );
    }
}

void vcstring sRequisstring sObtenuobject oForgelocation lSpawnint nFlagstring sMessageobject oMakerfloat fDelay 0.0f)
{
    if( 
fDelay == 0.0 )
    {
        if( 
nFlag DESTROY_AT_THE_END )
        {
            if( ! 
DestroyItemStringsRequisoForgeFALSE )) return;
        }

        
int nNum;
        
int nItems 1;

        if( (
nNum FindSubStringsObtenu"!" )) != -)
        {
            
nItems StringToIntGetStringLeftsObtenunNum ) );
            
sObtenu GetStringRightsObtenuGetStringLengthsObtenu ) - nNum );
        }

        
object oCreature;
        for( ; 
nItemsnItems-- )
            
oCreature CreateObjectOBJECT_TYPE_CREATUREsObtenulSpawnTRUE );

        if( 
nFlag HENCHMAN_CREATURE AddHenchmanoMakeroCreature );

        if( 
sMessage != "" AssignCommandoForgeSpeakStringsMessage ) );
    }
    else if( 
DestroyItemStringsRequisoForgeFALSE ) )
    {
        
DelayCommandfDelayvcsRequissObtenuoForgelSpawnnFlagsMessageoMaker) );
    }
}


int DestroyNumItemstring sTagint nNum 1object oOwner OBJECT_SELF)
{
    
object oItem GetFirstItemInInventoryoOwner );
    
string sResrefint nCount 0;
    while( 
GetIsObjectValidoItem ))
    {
        if( 
GetTagoItem ) == sTag )
        {
            
sResref GetResRefoItem );
            
nCount += GetNumStackedItemsoItem );
            
DestroyObjectoItem0.1 );
        }

        
oItem GetNextItemInInventoryoOwner );
    }

    
int nToKeep nCount nNum;

    if( 
nToKeep <= ) return nCount;

    for( ; 
nToKeepnToKeep-- )
    
AssignCommandGetModule(),
        
DelayCommand0.2,
            
vciosResrefoOwner )));

    return 
nNum;
}


int CountItemstring sTagobject oOwner OBJECT_SELF )
{
    
object oItem GetFirstItemInInventoryoOwner );
    
int nCount 0;
    while( 
GetIsObjectValidoItem ))
    {
        if( 
GetTagoItem ) == sTag )
            
nCount += GetNumStackedItemsoItem );

        
oItem GetNextItemInInventoryoOwner );
    }

    return 
nCount;
}


int TestItemStringstring sItemsobject oOwner )
{
    
string sTagint nNumnItems;

    while( (
nNum FindSubStringsItems":" )) != -)
    {
        
sTag GetStringLeftsItemsnNum );
        
sItems GetStringRightsItemsGetStringLengthsItems ) - nNum );

        if( (
nNum FindSubStringsTag"!" )) != -)
        {
            
nItems StringToIntGetStringLeftsTagnNum ) );
            
sTag GetStringRightsTagGetStringLengthsTag ) - nNum );
            if( 
CountItemsTagoOwner ) < nItems ) return FALSE;
        }
        else if( ! 
GetIsObjectValidGetItemPossessedByoOwnersTag ) ) )
            return 
FALSE;
    }
    return 
TRUE;
}


int DestroyItemStringstring sToDestroyobject oOwnerint nForce TRUE )
{
    if( ! 
nForce )
    {
        if( ! 
TestItemStringsToDestroyoOwner ) )
            return 
FALSE;
    }

    
string sTagint nNumnItemsint nNumItem 0;

    while( (
nNum FindSubStringsToDestroy":" )) != -)
    {
        
sTag GetStringLeftsToDestroynNum );
        
sToDestroy GetStringRightsToDestroyGetStringLengthsToDestroy ) - nNum );

        if( (
nNum FindSubStringsTag"!" )) != -)
        {
            
nItems StringToIntGetStringLeftsTagnNum ) );
            
sTag GetStringRightsTagGetStringLengthsTag ) - nNum );
            
nNumItem += DestroyNumItemsTagnItemsoOwner );
        }
        else
        {
            
DestroyObjectGetItemPossessedByoOwnersTag ) );
            
nNumItem++;
        }
    }

    return 
nNumItem;
}


int Transformstring sRequisstring sObtenuobject oForge OBJECT_SELFstring sUtils ""object oMaker OBJECT_INVALIDint nSuccess 100float fDelay 0.0fint nFlag 0string sMessage "")
{
    if( !
GetIsObjectValidoMaker )) oMaker oForge;

    if( ! (
TestItemStringsRequisoForge ) && TestItemStringsUtilsoMaker )) ) return FALSE;
    if( 
Random101 ) > nSuccess )
    {
        if(  
nFlag DESTROY_IF_FAILURE DestroyItemStringsRequisoForge );

        return 
FALSE;
    }

    
int nNum;

    if( 
fDelay == 0.0f )
    {
        
DestroyItemStringsRequisoForge );


        
int nItems 1;

        if( (
nNum FindSubStringsObtenu"!" )) != -)
        {
            
nItems StringToIntGetStringLeftsObtenunNum ) );
            
sObtenu GetStringRightsObtenuGetStringLengthsObtenu ) - nNum );
        }

        for( ; 
nItemsnItems-- )
            
DelayCommand(0.1vciosObtenuoForge ));

        if( 
sMessage != "" AssignCommandoForgeSpeakStringsMessage ) );
    }
    else
    {
        if( 
nFlag DESTROY_AT_THE_BEGINNING )
        {
            
DestroyItemStringsRequisoForge );

            
int nItems 1;

            if( (
nNum FindSubStringsObtenu"!" )) != -)
            {
                
nItems StringToIntGetStringLeftsObtenunNum ) );
                
sObtenu GetStringRightsObtenuGetStringLengthsObtenu ) - nNum );
            }

            for( ; 
nItemsnItems-- )
                
AssignCommandoForgeDelayCommand(fDelayvciosObtenuoForge )));

            if( 
sMessage != "" AssignCommandoForgeDelayCommand(fDelaySpeakStringsMessage )) );
        }
        else if( 
nFlag DESTROY_AT_THE_END AssignCommandoForgeDelayCommandfDelayvtsRequissObtenuoForgenFlagsMessage) ));
        else 
AssignCommandoForgeDelayCommandfDelay/2.0fvtsRequissObtenuoForgenFlagsMessagefDelay/2.0f) ));
    }

    return 
TRUE;
}


int Cocoonstring sRequisstring sObtenuobject oForge OBJECT_SELFstring sUtils ""object oMaker OBJECT_INVALIDint nSuccess 100float fDelay 0.0fint nFlag 0object oWP OBJECT_INVALIDstring sMessage "")
{
    if( !
GetIsObjectValidoMaker )) oMaker oForge;

    if( ! (
TestItemStringsRequisoForge ) && TestItemStringsUtilsoMaker )) ) return FALSE;
    if( 
Random101 ) > nSuccess )
    {
        if(  
nFlag DESTROY_IF_FAILURE DestroyItemStringsRequisoForge );

        return 
FALSE;
    }

    
int nNum;

    
location lSpawn;
    if( 
GetIsObjectValidoWP ) ) lSpawn GetLocationoWP );
    else 
lSpawn GetLocationoForge );

    if( 
fDelay == 0.0f )
    {
        
DestroyItemStringsRequisoForge );

        
int nItems 1;

        if( (
nNum FindSubStringsObtenu"!" )) != -)
        {
            
nItems StringToIntGetStringLeftsObtenunNum ) );
            
sObtenu GetStringRightsObtenuGetStringLengthsObtenu ) - nNum );
        }

        
object oCreature;
        for( ; 
nItemsnItems-- )
            
oCreature CreateObjectOBJECT_TYPE_CREATUREsObtenulSpawnTRUE );

        if( 
nFlag HENCHMAN_CREATURE AddHenchmanoMakeroCreature );

        if( 
sMessage != "" AssignCommandoForgeSpeakStringsMessage ) );
    }
    else
    {
        if( 
nFlag DESTROY_AT_THE_BEGINNING )
        {
            
DestroyItemStringsRequisoForge );
            
AssignCommandoForgeDelayCommand(fDelayvc""sObtenuOBJECT_INVALIDlSpawnnFlagsMessageoMaker )));
        }
        else if( 
nFlag DESTROY_AT_THE_END AssignCommandoForgeDelayCommandfDelayvcsRequissObtenuoForgelSpawnnFlagsMessageoMaker) ));
        else 
AssignCommandoForgeDelayCommandfDelay/2.0fvcsRequissObtenuoForgelSpawnnFlagsMessageoMakerfDelay 2.0f) ));
    }

    return 
TRUE;
}


//void main(){} 
Cool, ça marche !! (Ouais, j'avais pas testé avant de poster) :bouffon:

N'empêche j'aime bien la fonction Cocoon(), c'est pratique pour faire "naître" des henchmen animaux, comme par exemple :
Code PHP:

#include "nwl_forgitem"

int CocoonHenchstring sRequisstring sObtenuobject oPJfloat fDelay 0.0fobject oCouveuse OBJECT_SELF )
{
    return 
CocoonsRequissObtenuoCouveuse""oPJ80fDelayHENCHMAN_CREATURE DESTROY_IF_FAILURE DESTROY_AT_THE_END );
}

void main()
{
    
object oPJ GetLastClosedBy();

    
//Le plus fort de tous les henchmen :
    
if( CocoonHench"OEUF_ROUGE:2!PLUME_PHENIX""phenix"oPJ20.0f ) )
        return;
    if( 
CocoonHench"OEUF_BLEU:2!POUDRE_FEE""faucon"oPJ12.0f ) )
        return;
    if( 
CocoonHench"OEUF_MARRON:2!POISSON""ours"oPJ8.0f ) )
        return;
    
//....
    //Le plus faible de tous les henchmen :
    
if( CocoonHench"OEUF""poule"oPJ3.0f ) )
        return;

A mettre dans le OnClose d'une "couveuse"
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés