JeuxOnLineForumsPlusConnectés : 649 (sites) | 1188 (forums)Créer un compte
Forum jeux-vidéo>Neverwinter Nights
Maskado
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > Une petite bibliothèque pour vous! RSS
   
Répondre
Partager Outils Rechercher
Avatar de coolstar
coolstar
Alpha & Oméga
 
Avatar de coolstar
 
LOL!


J'avais pas vu! un RAT de Bibliothèque... vu!




[ModeTrolling]s'cuze!![/ModeTrolling]
Lien direct vers le message - Vieux
Avatar de ¤ TynriL ¤
¤ TynriL ¤
Bagnard
 
Avatar de ¤ TynriL ¤
 
Pour la gestion des strings...
Code PHP:
//::///////////////////////////////////////////////
//:: Gestion avancee des chaines de caracteres
//:: inc_strings.nss
//:: Copyright (c) Althea 2002
//:://////////////////////////////////////////////
/*
    Bibliotheques de fonction de traitement
    avance des chaines de caracteres.
*/
//:://////////////////////////////////////////////
//:: Créé par : Tynril
//:: Créé le  : 21/09/2002
//:://////////////////////////////////////////////


//----------------------------------------------------------------------------
// CONSTANTES

// Succes de l'operation sur le Tokenizer.
int StrTOKENIZER_SUCCESS 0;

// Erreur retournee si l'on essaye d'initialise un Tokenizer existant.
int StrTOKENIZER_EXISTS = -1;

// Erreur retournee si l'on essaye d'utiliser un Tokenizer non-initialise.
int StrTOKENIZER_NOTINITIALIZED = -2;

// Erreur retournee si l'on essaye d'utiliser un Tokenizer avec un Token vide.
int StrTOKENIZER_EMPTYTOKEN = -3;

// Erreur retournee si l'on essaye d'utiliser un Tokenizer avec une chaine vide.
int StrTOKENIZER_EMPTYSTRING = -4;



//----------------------------------------------------------------------------
// PROTOTYPES DE FONCTIONS ET DECLARATIONS

// Retourne les caracteres se trouvant avant sPattern.
// Exemple : StrBefore("Un chien"," ") -> "Un"
// Si sPattern n'est pas trouve dans la chaine, celle-ci est retournee entiere.
string StrBefore(string sSourcestring sPattern);

// Retourne les caracteres se trouvant apres sPattern.
// Exemple : StrAfter("Un chien"," ") -> "chien"
// Si sPattern n'est pas trouve dans la chaine, celle-ci est retournee entiere.
string StrAfter(string sSourcestring sPattern);

// Initialize the string tokenizer with a given string and token.  Optionally,
// takes a tokenizer session, in case you need to run more than one tokenizer
// at a time.  The tokenized string can be walked with the function
// StrTokenizerNext, and freed with StrTokenizerFree.
//
int StrTokenizerInitialize(string sStringToTokenizestring sTokenint iTokenizerSession 0);

// Returns the next token-delimited string from a given initialized tokenizer,
// or "" if the tokenizer is not initialized or empty of tokens.  A tokenizer
// needs to be allocated with Strtokenizer_initialize and freed with
// Strtokenizer_free.
string StrTokenizerNext(int iTokenizerSession 0);

// Frees an initialized tokenizer.
int StrTokenizerFree(int iTokenizerSession 0);

// Turns a given string uppercase
string StrUpperCase(string sSource);

// Turns a given string lowercase
string StrLowerCase(string sSource);

// Replaces all instances of sReplaceMe in sSource with sNewText, and return
// the altered string.  If sReplaceMe is empty, then sSource is immediately
// returned unaltered.
string StrReplace(string sSourcestring sReplaceMestring sNewText);

// Capitalize the first letter of a string.  Useful for turning
// 'mister' into 'Mister', for example, in generating conversation or
// other text.
//
string StrCapStr(string sSource);

// Pads a string on the left with the pattern given.
string StrPadLeft(string sOriginalint iPadTostring sPadWith);

// Pads a string on the right with the pattern given.
string StrPadRight(string sOriginalint iPadTostring sPadWith);

// Returns the member position of the token in the string, beginning with 0,
// or -1 if the given token is not a member of the string list.  Token must
// be a complete one.
//
int StrMember(string sListstring sTokenstring sDelimit " "int iTokenizer 969);

// Returns the number of tokens in a delimited list string, or -1 on error.
int StrMemberCount(string sListstring sDelimit " "int iTokenizer 969);


//----------------------------------------------------------------------------
// ACTUAL FUNCTION SOURCES

// FUNCTION: StrBefore
//
// Returns the portion of sSource which is before the first occurance of
// sPattern.  For example, Strbefore("Foo bar"," ") -> "Foo"
//
// If the pattern does not exist in the string, the entire string is returned.
string StrBefore(string sSourcestring sPattern)
{
    
int iMarker;
    
string sResult;

    
// Sanity check!
    
if ((sPattern == "") || (sSource == ""))
        return 
sSource;

    
iMarker FindSubString(sSource,sPattern);

    if (
iMarker >= 0) {
        
sResult GetSubString(sSource,0,iMarker);
    }
    else {
        
sResult sSource;
    }

    return 
sResult;
}

// FUNCTION: StrAfter
//
// Returns the portion of sSource which is after the first occurance of
// sPattern.  For example, Strbefore("Foo bar"," ") -> "bar"
//
// If the pattern does not exist in the string, an empty string is returned.
string StrAfter(string sSourcestring sPattern)
{
    
int iMarkeriMarkerLength;
    
string sResult;

    
// Sanity check!
    
if ((sPattern == "") || (sSource == ""))
        return 
"";

    
iMarkerLength GetStringLength(sPattern);
    
iMarker FindSubString(sSource,sPattern);

    if (
iMarker >= 0) {
        
sResult GetSubString(sSource,iMarker iMarkerLength,
            
GetStringLength(sSource) - (iMarker iMarkerLength));
    }
    else {
        
sResult "";
    }

    return 
sResult;
}

// FUNCTION: StrTokenizerInitialize
//
// Initialize the string tokenizer with a given string and token.  Optionally,
// takes a tokenizer session, in case you need to run more than one tokenizer
// at a time.  The tokenized string can be walked with the function
// Strtokenizer_next, and freed with Strtokenizer_free.
//
int StrTokenizerInitialize(string sStringToTokenizestring sToken,
        
int iTokenizerSession 0)
{
    
// Sanity check to make sure we're not clobbering an existing token.
    
if (GetLocalString(OBJECT_SELF,"tokenizer_" IntToString(iTokenizerSession) + "_token") != "") {
        return 
StrTOKENIZER_EXISTS;
    }

    
// Sanity check that we have a token.
    
if (sToken == "")
        return 
StrTOKENIZER_EMPTYTOKEN;

    
// Sanity check that we have a string to tokenize!
    
if (sStringToTokenize == "")
        return 
StrTOKENIZER_EMPTYSTRING;

    
// Set up our data for later.
    
SetLocalString(OBJECT_SELF,
        
"tokenizer_" IntToString(iTokenizerSession) + "_token",
        
sToken);

    
SetLocalString(OBJECT_SELF,
        
"tokenizer_" IntToString(iTokenizerSession) + "_stringbuf",
        
sStringToTokenize);

    return 
StrTOKENIZER_SUCCESS;
}

// FUNCTION: StrTokenizerNext
//
// Returns the next token-delimited string from a given initialized tokenizer,
// or "" if the tokenizer is not initialized or empty of tokens.  A tokenizer
// needs to be allocated with Strtokenizer_initialize and freed with
// Strtokenizer_free.
//
string StrTokenizerNext(int iTokenizerSession 0)
{
    
string sCurBuffersNewBuffersToken;

    
sToken GetLocalString(OBJECT_SELF"tokenizer_" +
        
IntToString(iTokenizerSession) + "_token");
    
sCurBuffer GetLocalString(OBJECT_SELF"tokenizer_" +
        
IntToString(iTokenizerSession) + "_stringbuf");

    
// Sanity check to make sure we have an initialized tokenizer
    
if (sToken == "")
        return 
"";

    
sNewBuffer StrBefore(sCurBuffersToken);
    
sCurBuffer StrAfter(sCurBuffersToken);

    
SetLocalString(OBJECT_SELF"tokenizer_" +
        
IntToString(iTokenizerSession) + "_stringbuf"sCurBuffer);

    return 
sNewBuffer;
}

// FUNCTION: StrTokenizerFree
//
// Frees an initialized tokenizer.
//
int StrTokenizerFree(int iTokenizerSession 0)
{
    if (
GetLocalString(OBJECT_SELF"tokenizer_" +
        
IntToString(iTokenizerSession) + "_token") == "")
        return 
StrTOKENIZER_NOTINITIALIZED;

    
DeleteLocalString(OBJECT_SELF"tokenizer_" +
        
IntToString(iTokenizerSession) + "_token");
    
DeleteLocalString(OBJECT_SELF"tokenizer_" +
        
IntToString(iTokenizerSession) + "_stringbuf");

    return 
StrTOKENIZER_SUCCESS;
}

// FUNCTION: StrUpperCase
//
// Turns a given string uppercase
//
string StrUpperCase(string sSource)
{
    
string sResult;
    
string UppercaseLetters "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
string LowercaseLetters "abcdefghijklmnopqrstuvwxyz";
    
int loopmarker;

    
// Sanity check!
    
if (sSource == "")
        return 
"";

    
// Walk the string...
    
for (loop 0loop GetStringLength(sSource); loop++) {
        
string sChar;
        
int marker;

        
// Get the current character of the string...
        
sChar GetSubString(sSourceloop1);

        
// ...and see if it's in the LowercaseLetter set.
        
marker FindSubString(LowercaseLetterssChar);
        if (
marker >= 0) {
            
// If so, replace with a matching UppercaseLetter.
            
sChar GetSubString(UppercaseLettersmarker1);
        }

        
// Append the current character to the result.
        
sResult sResult sChar;
    }

    return 
sResult;
}

// FUNCTION: StrLowerCase
//
// Turns a given string lowercase
//
string StrLowerCase(string sSource)
{
    
string sResult;
    
string UppercaseLetters "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
string LowercaseLetters "abcdefghijklmnopqrstuvwxyz";
    
int loopmarker;

    
// Sanity check!
    
if (sSource == "")
        return 
"";

    
// Walk the string...
    
for (loop 0loop GetStringLength(sSource); loop++) {
        
string sChar;
        
int marker;

        
// Get the current character of the string...
        
sChar GetSubString(sSourceloop1);

        
// ...and see if it's in the UppercaseLetter set.
        
marker FindSubString(UppercaseLetterssChar);
        if (
marker >= 0) {
            
// If so, replace with a matching LowercaseLetter.
            
sChar GetSubString(LowercaseLettersmarker1);
        }

        
// Append the current character to the result.
        
sResult sResult sChar;
    }

    return 
sResult;
}

// FUNCTION: StrReplace
//
// Replaces all instances of sReplaceMe in sSource with sNewText, and return
// the altered string.  If sReplaceMe is empty, then sSource is immediately
// returned unaltered.
//
string StrReplace(string sSourcestring sReplaceMestring sNewText)
{
    
string sResult;
    
int marker;

    
// Sanity check!
    
if (sSource == "")
        return 
"";

    
// Sanity check!
    
if (sReplaceMe == "")
        return 
sSource;

    
sResult sSource;

    
// As long as an instance of our replace-string exists, keep walking
    // the string and altering it.
    
while ((marker FindSubString(sResultsReplaceMe)) >= 0) {

        
// Isn't it nice to be able to reuse your own library functions?
        
sResult =
            
StrBefore(sResultsReplaceMe) +
            
sNewText +
            
StrAfter(sResultsReplaceMe);

    }

    return 
sResult;
}

// FUNCTION: StrCapStr
//
// Capitalize the first letter of a string.  Useful for turning
// 'mister' into 'Mister', for example, in generating conversation or
// other text.
//
string StrCapStr(string sSource)
{
    
string sResult;
    
string UppercaseLetters "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
string LowercaseLetters "abcdefghijklmnopqrstuvwxyz";
    
string sChar;
    
int iPos;

    
sChar GetSubString(sSource01);
    
iPos FindSubString(LowercaseLetterssChar);

    if (
iPos != -1) {
        
sChar GetSubString(UppercaseLetters,iPos,1);
    }

    
sResult sChar GetSubString(sSource,1,GetStringLength(sSource) - 1);

    return 
sResult;
}

// FUNCTION: StrPadLeft
//
// Pads a string on the left with the pattern given.
string StrPadLeft(string sOriginalint iPadTostring sPadWith)
{
    
string sNew;

    
sNew sOriginal;
    while (
GetStringLength(sNew) < iPadTo) {
        
sNew sPadWith sNew;
    }

    if (
GetStringLength(sNew) > iPadTo) {
        
sNew GetStringRight(sNewiPadTo);
    }

    return 
sNew;
}

// FUNCTION: StrPadRight
//
// Pads a string on the right with the pattern given.
string StrPadRight(string sOriginalint iPadTostring sPadWith)
{
    
string sNew;

    
sNew sOriginal;
    while (
GetStringLength(sNew) < iPadTo) {
        
sNew sNew sPadWith;
    }

    if (
GetStringLength(sNew) > iPadTo) {
        
sNew GetStringLeft(sNewiPadTo);
    }

    return 
sNew;
}

// FUNCTION: StrMember
//
// Returns the member position of the token in the string, beginning with 0,
// or -1 if the given token is not a member of the string list.  Token must
// be a complete one.
//
int StrMember(string sListstring sTokenstring sDelimit " "int iTokenizer 969)
{
    
string sTempKey;
    
int iCounteriFound;

    
iCounter 0;
    
iFound = -1;

    if (
StrTokenizerInitialize(sListsDelimitiTokenizer) != StrTOKENIZER_SUCCESS) {
        return -
1;
    }

    while (((
sTempKey StrTokenizerNext(iTokenizer)) != "") && (iFound == -1)) {
        if (
sTempKey == sToken) {
            
iFound iCounter;
        }
        
iCounter++;
    }

    
StrTokenizerFree(iTokenizer);

    return 
iFound;
}

// FUNCTION: StrMemberCount
//
// Returns the number of tokens in a delimited list string, or -1 on error.
//
int StrMemberCount(string sListstring sDelimit " "int iTokenizer 969)
{
    
string sTempKey;
    
int iCounter;

    
iCounter 0;

    if (
sList == "")
        return 
0;

    if (
FindSubString(sListsDelimit) == -1)
        return 
0;

    if (
StrTokenizerInitialize(sListsDelimitiTokenizer) != StrTOKENIZER_SUCCESS) {
        return -
1;
    }

    while ((
sTempKey StrTokenizerNext(iTokenizer)) != "") {
        
iCounter++;
    }

    
StrTokenizerFree(iTokenizer);

    return 
iCounter;

Repompé d'un truc je sais plus où
Lien direct vers le message - Vieux
Avatar de coolstar
coolstar
Alpha & Oméga
 
Avatar de coolstar
 
Lien direct vers le message - Vieux
Avatar de RAT
RAT
Alpha & Oméga
 
Avatar de RAT
 
MDR, bien vu coolstar pour le RAT de bibliothèque, je n'avais même pas fait le rapprochement .

1 point pour Coolstar .

Et merci à tynril , je pense que cela est très utile , et que je vais analyser le code .
Lien direct vers le message - Vieux
Avatar de RAT
RAT
Alpha & Oméga
 
Avatar de RAT
 
un petit script à mettre ds le onHeartbeat d'un NPC
ce script permet surtout pour les mondes persistants, de créer des nettoyeurs publics, qui viendront ramasser au bout de X minutes (par defaut c'est 1 min) un item qu'un joueur aurait laissé trainer . A mettre dans le onSpawn la fonction " ActionRandomWalk(); " pour ne pas vous embeter de mettre des waypoints.

Voici le code :

Code PHP:
//::///////////////////////////////////////////////
//:: Default On Heartbeat
//:: NW_C2_DEFAULT1
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
    This script will have people perform default
    animations.
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: Nov 23, 2001
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//:: Modifie par: RAT
//:://////////////////////////////////////////////
#include "NW_I0_GENERIC"

void main()
{
    if(
GetSpawnInCondition(NW_FLAG_FAST_BUFF_ENEMY))
    {
        if(
TalentAdvancedBuff(40.0))
        {
            
SetSpawnInCondition(NW_FLAG_FAST_BUFF_ENEMYFALSE);
            return;
        }
    }

    if(
GetSpawnInCondition(NW_FLAG_DAY_NIGHT_POSTING))
    {
        
int nDay FALSE;
        if(
GetIsDay() || GetIsDawn())
        {
            
nDay TRUE;
        }
        if(
GetLocalInt(OBJECT_SELF"NW_GENERIC_DAY_NIGHT") != nDay)
        {
            if(
nDay == TRUE)
            {
                
SetLocalInt(OBJECT_SELF"NW_GENERIC_DAY_NIGHT"TRUE);
            }
            else
            {
                
SetLocalInt(OBJECT_SELF"NW_GENERIC_DAY_NIGHT"FALSE);
            }
            
WalkWayPoints();
        }
    }

    if(!
GetHasEffect(EFFECT_TYPE_SLEEP))
    {
        if(!
GetIsPostOrWalking())
        {
            if(!
GetIsObjectValid(GetAttemptedAttackTarget()) && !GetIsObjectValid(GetAttemptedSpellTarget()))
            {
                if(!
GetIsObjectValid(GetNearestCreature(CREATURE_TYPE_REPUTATIONREPUTATION_TYPE_ENEMYOBJECT_SELF1CREATURE_TYPE_PERCEPTIONPERCEPTION_SEEN)))
                {
                    if(!
GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL) && !IsInConversation(OBJECT_SELF))
                    {
                        if(
GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS) || GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS_AVIAN))
                        {
                            
PlayMobileAmbientAnimations();
                        }
                        else if(
GetIsEncounterCreature() &&
                        !
GetIsObjectValid(GetNearestCreature(CREATURE_TYPE_REPUTATIONREPUTATION_TYPE_ENEMYOBJECT_SELF1CREATURE_TYPE_PERCEPTIONPERCEPTION_SEEN)))
                        {
                            
PlayMobileAmbientAnimations();
                        }
                        else if(
GetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS) &&
                           !
GetIsObjectValid(GetNearestCreature(CREATURE_TYPE_REPUTATIONREPUTATION_TYPE_ENEMYOBJECT_SELF1CREATURE_TYPE_PERCEPTIONPERCEPTION_SEEN)))
                        {
                            
PlayImmobileAmbientAnimations();
                        }
                    }
                    else
                    {
                        
DetermineSpecialBehavior();
                    }
                }
                else
                {
                    
//DetermineCombatRound();
                
}
            }
        }
    }
    else
    {
        if(
GetSpawnInCondition(NW_FLAG_SLEEPING_AT_NIGHT))
        {
            
effect eVis EffectVisualEffect(VFX_IMP_SLEEP);
            if(
d10() > 6)
            {
                
ApplyEffectToObject(DURATION_TYPE_INSTANTeVisOBJECT_SELF);
            }
        }
    }
    if(
GetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT))
    {
        
SignalEvent(OBJECT_SELFEventUserDefined(1001));
    }

//:://////////////////////////////////////////////
//:: Cree par :RAT
//:: script permettant de faire les nettoyeux publics sur un module
//:: ils rammassent les objets qu'ils peuvent voir
//:: et le detruisent dans leur inventaire
//:: Mettre les NPC en perception longue
//:://////////////////////////////////////////////

//:://////////////////////////////////////////////
//:: Declaration des variables
//:://////////////////////////////////////////////

 
object oitem=GetNearestObject(OBJECT_TYPE_ITEM,OBJECT_SELF,1);
 
object oNPC=OBJECT_SELF;
 
int inth=1;
float fDuree=60.0;  // si vous voulez qu'ils attendent plus d'une minute, vous
// devez changer cette valeur

if (GetIsObjectValid(oitem))
{
  if (
GetDistanceToObject(oitem)<=20.0//s'il voit un objet ds un rayon de 20 metres
  
{

    
ClearAllActions();


   
string stag=GetTag(oitem);
     if (
GetLocalInt(oitem,"BLOKE_EBOUEUR")==0)  // verifie si l item possede le tag pour bloquer le NPC
      
{
      
DelayCommand(fDuree,SetLocalInt(oitem,"BLOKE_EBOUEUR",1)); // au bout d'une minute , on debloque le NPC
      
}
      else
      {
     
SetLocalInt(oitem,"BLOKE_EBOUEUR",0);
      
ActionPickUpItem(oitem);   // et donc va chercher l'item
      
object oinvent=GetFirstItemInInventory(OBJECT_SELF);   // on regarde le premier objet dans son inventaire
         // ActionRandomWalk();
      
DestroyObject(oinvent,1.0);   // et il le supprime
      // SendMessageToAllDMs(stag); // message de test
       
ActionRandomWalk();  // on redemande au NPC de marcher aleatoirement
       //break;

      
}
  }

  else
  {

   
string stag2=GetTag(oitem);   // si le NPC le voit a plus de 20 metre ,

   
ActionPickUpItem(oitem);  //on le deplace, mais il sera rebloquer pendant une minute quand l'item
                             //rentrera dans son rayon de 20 metres

    
SetLocalInt(oitem,"BLOKE_EBOUEUR",0);
  }

}
else
{
SetLocalInt(oitem,"BLOKE_EBOUEUR",0);
  
ActionRandomWalk();

}

//:://////////////////////////////////////////////
//::                FIN DU SCRIPT
//:://////////////////////////////////////////////






Lien direct vers le message - Vieux
Avatar de Mastokk
JOL Mastokk
Alpha & Oméga
 
Avatar de Mastokk
 
Si je me souviens bien, nos grands maîtres scripteurs sur ce forum ont déjà résolu ce problème de nettoyage de zone avec un script sur le OnExit de la zone, ce qui évite l'utilisation lourde du OnHeartbeat.

Edit\ plus précisement, je pensais à ce poste ci d'eMR.
Lien direct vers le message - Vieux
Avatar de RAT
RAT
Alpha & Oméga
 
Avatar de RAT
 
Ah bon! je m'en souvenais pas , ba merci à toi Mastokk de me le rappeler, j'irai voir . Mais je trouvais que celui là, faisait un peu plus rp. Mais , c'est vrai qu'il fait chauffer le processeur un peu plus.

Question à part :
Mais est ce que le onheartbeat d'un NPC est aussi lourd que le onhearbeat d'un module??

juste pour savoir
Lien direct vers le message - Vieux
Avatar de coolstar
coolstar
Alpha & Oméga
 
Avatar de coolstar
 
1) Je trouve que le nettoyage "en cours" est plus RP...

2) Je ne suis pas convaincu que le OnHeartBeat soit le plus approprié... (OnEnter c'est mieux, suffit juste de créer une boucle par renvoi de Script avec un délai plus raisonnable... genre 600 sec... faut du temps pour les Eboueurs!)

3) A mon avis le OnHeartBeat est lourd selon ce qu'il doit gérer... donc, ça dépend... (mais j'imagine que pour un Module y'a souvent plus d'éléments à traiter...)

4) Tapez pas !!

...
Lien direct vers le message - Vieux
Avatar de RAT
RAT
Alpha & Oméga
 
Avatar de RAT
 
merci coolstar pour ton avis et je suis d'accord avec toi pour le fait que les éboueurs font plus rp qu'un script sur le onexit :P
Lien direct vers le message - Vieux
Avatar de Jedaï
Jedaï
Alpha & Oméga
 
Avatar de Jedaï
 
Exclamation
Vive les strings
Une bonne bibliothèque Tyn', néanmoins :
  • Je comprend pas vraiment comment marche ces tokens et surtout quel est leur but... Si tu pouvais expliquer, sinon il va falloir plonger dans le code plus profondément....
  • A quoi servent les fonctions StrUpperCase() et StrLowerCase(), Bioware les proposent déjà en standard...
  • Cette fonction StrReplace() est efficace mais vu son implémentation, il a oublié un "Sanity check" : sReplaceMe != sNewText... On risque de se retrouver avec une boucle infinie, toujours désagréable !

Je signale par ailleurs que ma propre bibliothèque de gestion des tokens est beaucoup plus complète et plus claire (du moins pour moi ) pour ce qui est des tokens en tous cas. elle est disponible sur NWN-Fr. (Je ne la mettrai pas ici, elle fait dans les 900 lignes )



Je suis moi aussi pour des nettoyeurs publiques un peu lent comme proposé par Coolstar, pour les villes surtout. Pour les autres zones peut-être vaut-il mieux nettoyer sur le OnExit .
Lien direct vers le message - Vieux
Avatar de coolstar
coolstar
Alpha & Oméga
 
Avatar de coolstar
 
Jedaï! chuis sûr que t'es très bon, t'en fais plus que souvent la preuve même, mais tu crois que c bien utile de faire des comparaisons ?? n'échaude pas les nouveaux aussi dévoués et investis, hein...

Lien direct vers le message - Vieux
Avatar de ¤ TynriL ¤
¤ TynriL ¤
Bagnard
 
Avatar de ¤ TynriL ¤
 
La bibliothèque n'est pas de moi, et j'utilise pas la moitié de ses fonctions, donc je pourrais pas vous en parler
Lien direct vers le message - Vieux
Avatar de RAT
RAT
Alpha & Oméga
 
Avatar de RAT
 
Talking
une autre petite bibliothèque pour vous!
Cela permet de faire perdre des xp à un PC suivant un pourcentage, utilisé souvent dans une action par conséquence dans un dialogue, sans lui faire perdre de niveau.
Si le PC, après la perte d'xp devrait perdre normalement un niveau, le script lui mettra les xp minimum requis pour garder son niveau.

voici le code :

Code PHP:

////////////////////////////////////////////////////
//::Fait par RAT
//: nom du script : prendre_px
//////////////////////////////////////////////////////
// Prendre des PX au joueur  suivant un pourcentage
// ex faire perdre au joueur 10% de ses xp

void prendre_xp(object oPC,int iPerte)
{
/*

NIV         XP

1           0
2           1000
3           3000
4           6000
5           10000
6           15000
7           21000
8           28000
9           36000
10          45000
11          55000
12          66000
13          78000
14          91000
15          105000
16          120000
17          136000
18          153000
19          171000
20          190000
*/
int XpPC=0;
int Totalxp=0;
int ixp=1;
int comptxp=0;
int compt=0;
int mem=0;
int bloke=0;
XpPC=GetXP(oPC);
TotalxpXpPC - (XpPC * (iPerte /100));
string test;
while (
ixp<=20)
{
comptxp=comptxp + (mem *1000);

    if ((
Totalxp compt) && ((XpPC >= compt) && (XpPC comptxp))  )
    {
    
SetXP(oPC,Totalxp);
    
test"Vous vous sentez plus affaiblis";
    
SendMessageToPC (oPC,test);
    break;
    }

    if ((
Totalxp <= compt ) && ((XpPC >= compt) && (XpPC <=comptxp)))
    {
    
SetXP(oPC,compt);
    
test"Pour ne pas perdre un niveau , on vous donne le minimum requis";
    
SendMessageToPC (oPC,test);
    break;
    }

compt=comptxp;
mem=ixp;
ixp++;
}

}
////////////////////////////////////////////////////
//       FIN DU SCRIPT
////////////////////////////////////////////////////// 
Lien direct vers le message - Vieux
Avatar de eMRaistlin
eMRaistlin
Alpha & Oméga
 
Avatar de eMRaistlin
 
Merci pour tout ca, les gars ^^





*par contre, si je pouvais vous demander de creer un topic specifique a chaque fois, avec un lien dans le persistants qui traite des scripts, ce serait sympa... ^^;*
Lien direct vers le message - Vieux
Avatar de Jaha Effect
Jaha Effect
Alpha & Oméga
 
Avatar de Jaha Effect
 
héhéhé moi j'aime bien la dernière biblio

Jaha Effect
Lien direct vers le message - Vieux
Répondre
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > Une petite bibliothèque pour vous!
   

Outils Rechercher
Rechercher:

Recherche avancée

Les vidéos de Neverwinter Nights RSS
  • Aucune vidéo pour le moment...
Thème visuel : Fuseau horaire GMT +1. Il est actuellement 16h02.
   

© JeuxOnLine, le site des MMO, MMORPG et MOBA. Tous droits réservés. - Conditions générales d'utilisation - Conditions d'utilisation des forums - Traitement des données personnelles - ! Signaler un contenu illicite