//Vous pouvez changer la valeur de nBaseXP selon votre echelle; 100=DMG.
int nBaseXP = 15;
//Bonus d'XP a partager entre les membres conscients du groupe se trouvant dans la meme Zone
int nBonusXPGroupe = 5;
//Bonus d'XP pour celui qui acheve la creature
int nBonusXPTueur = 1;
//Bonus de Rarete: nombre de creatures tuees avant que le Bonus = 0
int nBonusXPRarete = 10;
//Changement de la Reputation de base lors d'un meurtre
int nReput = -5;
// Variables commune a toutes les fonctions, ne pas supprimer cette ligne
float fCR = GetLocalFloat(OBJECT_SELF, "CR");
//Fonction d'xp du PJ achevant le monstre
void XPTueur(object oKiller, int nBonusXPTueur)
{
string sLeech = GetLocalString(OBJECT_SELF, "TagLeech");
float fXP;
if(sLeech == "")
{
string sMonine = "Votre attaque est si violente que votre adversaire est littéralement pulvérisé.";
FloatingTextStringOnCreature(sMonine, oKiller, FALSE);
fXP = fCR * nBonusXPTueur;
}
else
{
int nMaxHP = GetLocalInt(OBJECT_SELF, "TotalLeech");
int nLeech = GetLocalInt(oKiller, sLeech);
float fMaxHP = IntToFloat(nMaxHP);
float fLeech = IntToFloat(nLeech);
float fDmg = fLeech / fMaxHP;
fXP = (fCR * fDmg)* nBonusXPTueur;
}
int nXP = FloatToInt(fXP);
if(GetIsPJ(oKiller))
{
SendMessageToPC(oKiller, "Vous gagnez " + IntToString(nXP) + " points d'expérience de Bonus.");
GiveXPToCreature(oKiller, nXP);
}
}
//Fonction d'xp des autres PJ faisant partie du groupe du PJ ayant acheve le monstre
void XPParty(object oKiller, object oArea, int nBonusXPGroupe)
{
int nMembres = 0;
object oMembreGroupe = GetFirstFactionMember(oKiller, TRUE);
while (GetIsObjectValid(oMembreGroupe) == TRUE)
{
object oAreaGroupe = GetArea(oMembreGroupe);
if(GetIsPC(oMembreGroupe) == TRUE && !GetIsDM(oMembreGroupe) && oArea == oAreaGroupe)
{
nMembres = nMembres + 1;
}
oMembreGroupe = GetNextFactionMember(oKiller, TRUE);
}
float fCompteur = IntToFloat(nMembres);
//Bonus d'xp accorde aux PJ jouant en groupe.
//Si vous ne voulez pas favoriser cela, mettez cette ligne:
//float fMultiplier = 1.0;
float fMultiplier = (1.0 + ((0.1 * fCompteur) - 0.1));
float fXP = ((fCR * fMultiplier) / fCompteur);
int nMaxHP = GetLocalInt(OBJECT_SELF, "TotalLeech");
string sLeech = GetLocalString(OBJECT_SELF, "TagLeech");
while (GetIsObjectValid(oMembreGroupe) == TRUE)
{
object oAreaGroupe = GetArea(oMembreGroupe);
if(GetIsPJ(oMembreGroupe) && oArea == oAreaGroupe && GetCurrentHitPoints(oMembreGroupe) > 0)
{
int nLeech = GetLocalInt(oMembreGroupe, sLeech);
if(sLeech == "")
{
nMaxHP = GetMaxHitPoints(OBJECT_SELF);
nLeech = nMaxHP;
}
float fMaxHP = IntToFloat(nMaxHP);
float fLeech = IntToFloat(nLeech);
float fDmg = fLeech / fMaxHP;
float fXPReel = (fXP * fDmg)* nBonusXPGroupe;
int nXP = FloatToInt(fXPReel);
SendMessageToPC(oMembreGroupe, "Vous gagnez " + IntToString(nXP) + " points d'expérience de Bonus de Groupe.");
GiveXPToCreature(oMembreGroupe, nXP);
}
oMembreGroupe = GetNextFactionMember(oKiller, TRUE);
}
}
//Fonction d'xp des autres PJ ayant touche le monstre
void XPBinote(object oArea, int nBaseXP, int nXPRarete)
{
string sLeech = GetLocalString(OBJECT_SELF, "TagLeech");
if(sLeech == "")
{
return;
}
else
{
object oLeecheur = GetFirstPC();
int nMaxHP = GetLocalInt(OBJECT_SELF, "TotalLeech");
float fMaxHP = IntToFloat(nMaxHP);
while (GetIsObjectValid(oLeecheur) == TRUE)
{
object oAreaLeech = GetArea(oLeecheur);
if(oArea == oAreaLeech && GetCurrentHitPoints(oLeecheur) > 0)
{
int nLeech = GetLocalInt(oLeecheur, sLeech);
float fLeech = IntToFloat(nLeech);
float fDmg = fLeech / fMaxHP;
//Edit Diff CR
float fCRPJ = IntToFloat(GetHitDice(oLeecheur));
if(fCRPJ <=1.0) fCRPJ =1.0;
float fXPReel = (((fCR*2)/fCRPJ) * fDmg)* IntToFloat(nBaseXP);
int nXPLeech = FloatToInt(fXPReel);
int nXP = nXPLeech + nXPRarete;
if(((fCRPJ+1) - (fCR+1)) > (fCRPJ/2))
{
nXP = 0;
nXPRarete = 0;
SendMessageToPC(oLeecheur, "Votre adversaire ne fait vraiment pas le poids, cela ne vous enseigne rien!");
}
if(GetIsPJ(oLeecheur))
{
SendMessageToPC(oLeecheur, "Vous gagnez " + IntToString(nXP) + " XP, dont " + IntToString(nXPRarete) + " XP de Bonus de Rareté.");
GiveXPToCreature(oLeecheur, nXP);
}
DeleteLocalInt(oLeecheur, sLeech);
}
oLeecheur = GetNextPC();
}
}
}
//Tableau de Chasse du Joueur
int GetKillBoard(object oKiller, string sNom)
{
//int nKills = GetLocalInt(oBD, sNom);
//La ligne suivante est a utiliser avec la BD Bioware
int nKills = GetCampaignInt(GetName(oKiller), sNom);
nKills += 1;
//SetLocalInt(oBD, sNom, nKills);
//La ligne suivante est a utiliser avec la BD Bioware
SetCampaignInt(GetName(oKiller), sNom, nKills);
return nKills;
}
//Bonus XP de Rarete
int GetXPRarete(int nBonusXPRarete, int nKills)
{
float fBonusXPRarete = IntToFloat(nBonusXPRarete);
float fKills = IntToFloat(nKills);
float fXP = fCR * (fBonusXPRarete/fKills);
int nXP = FloatToInt(fXP);
return nXP;
}
//Ajustement de la Faction lors d'un meurtre
void AdjustFaction (object oKiller, int nReput)
{
object oLeader = GetFactionLeader(OBJECT_SELF);
object oGrosBill = GetFactionStrongestMember(OBJECT_SELF);
string sFaction = GetName(oLeader);
if(oLeader == OBJECT_SELF)
{
nReput = nReput * 20;
}
else if(oGrosBill == OBJECT_SELF)
{
nReput = nReput * 10;
}
SendMessageToPC(oKiller, "Votre réputation vis-a-vis de la faction de " + sFaction + " s'est déteriorée!");
AdjustReputation(oKiller, OBJECT_SELF, nReput);
}
// Fin Binote XP
void main()
{
int nClass = GetLevelByClass(CLASS_TYPE_COMMONER);
int nAlign = GetAlignmentGoodEvil(OBJECT_SELF);
object oKiller = GetLastKiller();
object oArea = GetArea(OBJECT_SELF);
string sArea = GetTag(oArea);
string sNom = GetName(OBJECT_SELF);
string sKiller = GetName(oKiller);
while(GetIsObjectValid(GetMaster(oKiller)))
{
oKiller=GetMaster(oKiller);
}
if(nClass > 0 && (nAlign == ALIGNMENT_GOOD || nAlign == ALIGNMENT_NEUTRAL))
{
AdjustAlignment(oKiller, ALIGNMENT_EVIL, 5);
}
if(bMessageDM)
{
SendMessageToAllDMs(sNom + " vient d'etre tué par " + sKiller + " dans " + sArea);
WriteTimestampedLogEntry(sNom + " vient d'etre tué par " + sKiller + " dans " + sArea);
}
SpeakString("NW_I_AM_DEAD", TALKVOLUME_SILENT_TALK);
SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK);
if(GetSpawnInCondition(NW_FLAG_DEATH_EVENT))
{
SignalEvent(OBJECT_SELF, EventUserDefined(1007));
}
if (GetIsObjectValid(GetMaster(OBJECT_SELF)))
{
object oMaster = GetMaster(OBJECT_SELF);
object oAssociate = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oMaster);
if (oAssociate == OBJECT_SELF)
return;
oAssociate = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oMaster);
if (oAssociate == OBJECT_SELF)
return;
oAssociate = GetAssociate(ASSOCIATE_TYPE_DOMINATED, oMaster);
if (oAssociate == OBJECT_SELF)
return;
oAssociate = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oMaster);
if (oAssociate == OBJECT_SELF)
GiveXPToCreature(oMaster, (-50*GetHitDice(oMaster)));
AdjustAlignment(oKiller, ALIGNMENT_EVIL, 5);
return;
}
//XP Binote
int nXPRarete = 1;
if(GetIsPJ(oKiller))
{
//Resultat du Tableau de Chasse
int nKillBoard = GetKillBoard(oKiller, sTag);
string sKills = IntToString(nKillBoard);
SendMessageToPC(oKiller, "Vous venez de tuer " + sNom + "; ceci est votre " + sKills + "e !");
//Bonus XP Rarete
nXPRarete = GetXPRarete(nBonusXPRarete, nKillBoard);
//Bonus XP Tueur, Mettez // devant la ligne si vous ne voulez pas utiliser cette option.
XPTueur(oKiller, nBonusXPTueur);
//XP (mettez bien l'echelle d'xp sur 0 dans les proprietes du module)
XPBinote(oArea, nBaseXP, nXPRarete);
//Bonus XP Groupe, Mettez // devant la ligne si vous ne voulez pas utiliser cette option.
XPParty(oKiller, oArea, nBonusXPGroupe);
//Ajustement de la Faction
AdjustFaction (oKiller, nReput);
//Effacement des variables locales du monstre
}
DeleteLocalInt(OBJECT_SELF, "TotalLeech");
DeleteLocalInt(OBJECT_SELF, "Coup");
DeleteLocalString(OBJECT_SELF, "TagLeech");
}
L'event OnDamaged je ne pense l'avoir modifié, mais le script a tellement changé depuis (énormément d'ajouts spécifiques à mon système de scripts), qu'il faudrait que je vérifie ligne par ligne.