La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 27/11/2024 04:19:40


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
mayk
Novice
Inscrit le: 23 Fév 2004
Messages: 18
Répondre en citant
Posté le : 16/05/2004 12:56:03 Sujet du message : SAUVEGARDE DES SORTS - LA Solution anti grosbill

A mon avis, la persistance n'a pas forcément sa place dans la sauvegarde des sorts. Dans le sens ou si un joueur se connecte pour la premiere fois apres un reboot, tant pis pour sa gueule, il faudra qu'il se repose.

Une fois reposé, le serveur lui enregistre sa config de sorts.

A chaque fois qu'il fait un sort, celui ci est déduit de sa sauvegarde par une variable qui en remplace celle sauvegardée apres le repos.

Si il deconnecte puis reconnecte, il retrouvera ses sorts inchangés.

Le but du systeme de scripts que j'ai fait est d'empecher la deco reco abusive de certains lourdauds.

tu crees un include file :

NWScript :

void SaveSpell(object oPC, int nSpellID)
{
if(GetIsPC(oPC)==TRUE)
    {
    int nRemainingSpells = GetHasSpell(nSpellID,oPC);
    SetLocalInt(oPC,"SPELL"+IntToString(nSpellID),nRemainingSpells);
    }
}

void SaveAllSpells(object oPC)
{
int x;
int n = 0;
SetLocalInt(oPC,"SortsRepos",FALSE);
SetLocalInt(oPC,"compteursauvsorts",0);
for(n ; n <=650 ; n++)
    {
    int nRemainingSpells = GetHasSpell(n,oPC);
    if(nRemainingSpells>0)
        {
        SetLocalInt(oPC,"SPELL"+IntToString(n),nRemainingSpells);
        }
    }
}

void LoadSpells(object oPC)
{
SendMessageToPC(oPC,"Reconstruction par le serveur de la sauvegarde des sorts de "+GetName(oPC)+".");
int x;
int n = 0;
for(n ; n <=650 ; n++)
    {
    int iSpellTimes = GetLocalInt(oPC,"SPELL"+IntToString(n));
    int iHasSpell = GetHasSpell(n,oPC);
    if(iSpellTimes==0)
        {
        while(GetHasSpell(n,oPC)>0)
            {
            DecrementRemainingSpellUses(oPC,n);
            }
        }
    if(iHasSpell>iSpellTimes)
        {
        for(x=0; x<(iHasSpell-iSpellTimes) ;x++)
            {
            DecrementRemainingSpellUses(oPC,n);
            }
        }
    }
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.



puis sur chaque sort du mod tu fous la fonction SaveSpell(object oPC, int nSpellsID).

en gros, tu change ceci :

NWScript :

void main()
{

/* warning: 1 unclosed block {} */
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


en ceci :

NWScript :

#include "nom_du_include_choisi"
void main()
{
    SaveSpell(OBJECT_SELF, GetSpellId());

// suite du script de sort...
/* warning: 1 unclosed block {} */
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.



ensuite, sur ton onplayerrested, tu mets un declencheur de compteur, comme ceci :

NWScript :

SetLocalInt(oPC,"SortsRepos",TRUE);
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


puis sur le OnHeartBeat ceci, un compteur qui enregistrera les sorts juste apres la fin des repos :

NWScript :

#include "nom_du_include_choisi"
void main()
{
if(GetLocalInt(oPC,"SortsRepos")==TRUE)
            {
            int iCounter = GetLocalInt(oPC,"compteursauvsorts");
            iCounter = iCounter+1;
            if(iCounter<=3)
                {
                SetLocalInt(oPC,"compteursauvsorts",iCounter);
                }
            if(iCounter>3)
                {
                SaveAllSpells(oPC);
                SendMessageToPC(oPC,"Constitution d'une sauvegarde des sorts de "+GetName(oPC)+" par le serveur.");
                }
            }
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


C'est long et fastidieux, mais le résultat en temps de calcul est quand meme plus leger que si tu faisais un OHB en permanence : Ca fait des gros coups de lag a chaque battement du coeur de module, et imagine si il y a 25 utilisateurs de sorts sur le serveur.

La fonction LoadSpells, juste sur le onenter, comme ceci, en se servant de conditions pour eviter ce processsus aux barbares ou guerriers peu intellectuels ^^:

NWScript :

#include "nom_du_include_choisi"
void main ()
{
if((GetLevelByClass(CLASS_TYPE_CLERIC,oPC) > 0) ||
        (GetLevelByClass(CLASS_TYPE_DRUID,oPC) > 0) ||
        (GetLevelByClass(CLASS_TYPE_SORCERER,oPC) > 0) ||
        (GetLevelByClass(CLASS_TYPE_WIZARD,oPC) > 0) ||
        (GetLevelByClass(CLASS_TYPE_PALADIN,oPC) > 0) ||
        (GetLevelByClass(CLASS_TYPE_RANGER,oPC) > 0) ||
        (GetLevelByClass(CLASS_TYPE_BARD,oPC) > 0) ||
        (GetLevelByClass(CLASS_TYPE_ARCANE_ARCHER,oPC) > 0))
            {
            LoadSpells(oPC);
            }
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Le serveur ne devrait avoir un coup de lag que a chaque connection de joueur utilisant de la magie, et le OHB du module est considérablement allégé.

Pour ceux qui sont curieux d'en voir le fonctionnement, passez sur mon module : FR - [CEP] - MARKHOR (persistant (rôle)).

Mayk - _Kyam_

++++
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Montrer les messages depuis :
Page 1 sur 1 ¤


Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Sauter vers:
FAQ | Rechercher | Liste des Membres | Groupes d'utilisateurs | S'enregistrer | Profil | Se connecter pour vérifier ses messages privés | Connexion
Powered by phpBB 2.* [m] © 2001, 2002 phpBB Group
Theme rewritten in beautiful XHTML code by Baldurien.
Thème "La Bibliothèque de Neverwinter" crée par Kruger
Traduction par : phpBB-fr.com
Page generated in 57.216ms