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 cree un include file :
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);
}
}
}
}
puis sur chaque sort du mod tu fous la fonction SaveSpell(object oPC, int nSpellsID).
en gros, tu change ceci :
en ceci :
#include "nom_du_include_choisi"
void main()
{
SaveSpell(OBJECT_SELF, GetSpellId());
// suite du script de sort...
ensuite, sur ton onplayerrested, tu mets un declencheur de compteur, comme ceci :
SetLocalInt(oPC,"SortsRepos",TRUE);
puis sur le OnHeartBeat ceci, un compteur qui enregistrera les sorts juste apres la fin des repos :
#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.");
}
}
}
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 tes conditions :
#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);
}
}
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)).
Pour Info, j'ai créé un .erf qui contient le include et les sorts de NWN SOU et HOTU réédités pour qu'ils marchent avec ce systeme.
Mayk - _Kyam_
++++