Voila ce que ca peut donner (Presque tout droit tiré d'Arkalym
)
1) il faut créer un fichier include.
Je le nomme inc_yi_lvlup. On va y ranger toutes les fonctions de base
// renvoie une string lie au joueur et a son pero
string Identifiant(object pj);
// demande au PJ de refaire son lvl
// lui retire les px en trop
void Refaitlvl(object pj);
// verifie les dons.
// ici j'interdit le combat au corps à corps pour les pretres
// tu peux en rajouter d'autres
// ainsi que des checks sur les caracteristique ou autre
int CheckDon(object pj);
// donne le niveau max d'un joueur, stocke dans une variable locale par exemple
// à voir selon la persistance que tu utilises pour la stocker en "dur"
int GetLevelMaxPJ(object pj);
// determine le max d'XPs du pj (selon le niveau qu'il a le droit d'atteindre) et l'informe
void MaxLevelHPs(object pj=OBJECT_SELF);
// Intialise les varialbes des lvls du PJ
void InitLvlPj(object pj);
//*****************************************************************************
// IMPLEMENTATION
//*****************************************************************************
// renvoie une string lie au joueur et a son pero
string Identifiant(object pj) {
string name = GetLocalString(pj,"player_name");
string s = name+IntToString(GetStringLength(name))+GetName(pj);
return s;
}
// demande au PJ de refaire son lvl
// lui retire les px en trop
void Refaitlvl(object pj)
{ int PXLvL = (GetHitDice(pj)-1)*(GetHitDice(pj))*1000/2;
int CurrentPX = GetXP(pj);
WriteTimestampedLogEntry("Lvl Redo :"+GetName(pj)+" lvl:"+IntToString(GetHitDice(pj))+" "+GetPCPublicCDKey(pj)+" "+GetPCPlayerName(pj));
DelayCommand(1.0,FloatingTextStringOnCreature("Tu vas devoir refaire ton niveau",pj));
SetXP(pj,PXLvL-10);
DelayCommand(10.0,SetXP(pj,CurrentPX));
}
// verifie les dons.
// ici j'interdit le combat au corps à corps pour les pretres
// tu peux en rajouter d'autres
// ainsi que des checks sur les caracteristique ou autre
int CheckDon(object pj)
{ if ((GetLevelByClass(CLASS_TYPE_CLERIC,pj)>=1) && (GetHasFeat(FEAT_IMPROVED_UNARMED_STRIKE,pj)))
{DelayCommand(8.0,FloatingTextStringOnCreature("La Classe de Prètre n'a pas le droit au don 'combat à main nu'.",pj)); return -1;}
return 0;
}
// donne le niveau max d'un joueur, stocke dans une variable locale par exemple
// à voir selon la persistance que tu utilises pour la stocker en "dur"
int GetLevelMaxPJ(object pj) {
int resultat = GetLocalInt(pj,"levelMax");
return resultat;
}
// determine le max d'XPs du pj (selon le niveau qu'il a le droit d'atteindre) et l'informe
void MaxLevelHPs(object pj=OBJECT_SELF) {
int i = GetLevelMaxPJ(pj); int z;
if (i<21) i = 20;
if (i > 30) {
z = 440000;
for (;i>30;i--) z += (i*1000);
} else
switch (i) {
case 20: z = 204000; break;
case 21: z = 215000; break;
case 22: z = 235000; break;
case 23: z = 257000; break;
case 24: z = 280000; break;
case 25: z = 305000; break;
case 26: z = 330000; break;
case 27: z = 355000; break;
case 28: z = 383000; break;
case 29: z = 410000; break;
case 30: z = 440000; break;
default: z = 204000;
}
if (GetXP(pj) > z) {
FloatingTextStringOnCreature(sRed+"tu viens de perdre des points d'experiences car tu as perdu des niveaux", pj);
SetXP(pj, z);
}
SetLocalInt(pj, LocalMaxLvl, z);
if (GetXP(pj) > z) SetXP(pj, z);
}
// Intialise les varialbes des lvls du PJ
void InitLvlPj(object pj) {
int lvl = GetCampaignInt(Identifiant(pj),"levelMax");
if (lvl==0) // nouveau joueur
{ lvl = 15;
SetCampaignInt(Identifiant(pj),"levelMax",lvl);
}
SetLocalInt(pj,"levelMax",lvl); // pour eviter les acces disques, on stocke la valeur sur le pj
FloatingTextStringOnCreature("Ton mérite te permet d'atteindre le niveau :"+IntToString(lvl),pj,FALSE);
MaxLevelHPs(pj);
}
2) On passe ensuite aux evenements
dans on enter du module, on charge les valeurs (ou on les initialises à lvl=15 pour les nouveaux joueurs
#include "inc_yi_lvlup"
void main()
{ object pj = GetEnteringObject();
InitLvlPj(pj);
}
dans on level up, pour vérifier si un joueur fait un level up alors qu'il n'a pas le droit.
on en profite pour lui retirer les px si besoin (et la j'en profite même pour vérifier des dons et/ou classe interdites : CheckPJ
#include "inc_yi_lvlup"
void main()
{ object pj = GetPCLevellingUp()
MaxLevelHPs(pj); // bloque un joueur à un certain niveau (en px/lvl)
CheckPJ(pj); // verifie si le joueur n'a pas pris des dons interdit
//CheckKarak(pj); // pour verifié les carac du joueur
}
et enfin l'evenement on item activated, il permet à un DM d'utiliser un objet ayant un pouvoir unique et ayant dans son tag "YI_SCEP" de débloquer de 5 niveaux le joueur
#include "inc_yi_lvlup"
// pj : la cible, appelant : l'utilisateur du baton
void SceptreDeNiveau(object pj,object appelant, string sS) {
if (GetIsDM(appelant))
{ ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_FNF_GAS_EXPLOSION_MIND),appelant);
int lvl = GetLocalInt(pj,"levelMax");
if (lvl==40)
{ FloatingTextStringOnCreature("Ce joueur peut déjà atteindre le niveau 40",appelant);
return;
}
lvl = lvl + 5;
SetCampaignInt(Identifiant(pj), "levelMax" ,lvl);
SetLocalInt(pj,"levelMax",lvl);
}
}
void main()
{ object quoi = GetItemActivated();
object pj = GetItemActivator();
object target = GetItemActivatedTarget();
string sS = GetStringUpperCase(GetTag(quoi));
if (FindSubString(sS,"YI_SCEP")>=0) {SceptreDeNiveau(target,pj,sS);}
}
Voila.
Pour utiliser nwn_ff il suffit de modifier 3 lignes.
On remplace SetCampaignInt(Identifiant(pj),"levelMax",lvl); par
ff_SetPCPersistentInt(pj,"levelMax",lvl); les 2 fois où on le croise
et remplacer GetCampaingInt(Identifiant(pj),"levelMax"); par
ff_GetPCPersistentInt(pj, "levelMax");
Dites moi ce que cela donne