JeuxOnLineForumsPlusConnectés : 773 (sites) | 1497 (forums)Créer un compte
Forum jeux-vidéo>Neverwinter Nights
Maskado
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > Répartition d'XP sur un monstre tué RSS
   
Répondre
Partager Outils Rechercher
Avatar de Ambrosis
Ambrosis
Roi
 
Avatar de Ambrosis
 
Je ne comprend pas tout
Ca serai possible de détailé le script employé ?
Et ou on le met exactement
Et dasn ce cas la ou est ce que l'on donne la valeur en px que l'on veut attribuer lors du meurtre de la créature ?
Merci
Lien direct vers le message - Vieux
Avatar de Melken
Melken
Alpha & Oméga
 
Avatar de Melken
 
A vraie dire sa a l'air super Je vais tester des que je met les monstres dans mon petit module
Lien direct vers le message - Vieux
Avatar de Ambrosis
Ambrosis
Roi
 
Avatar de Ambrosis
 
Excuse moi de t'ennuyer je sais que ta pas mal d boulot Nek, mai si j'inclus les lignes que tu me dit, es ce que cela prendra beaucoup de ressource ?
Sinon, dans cette ligne:
Code PHP:
if (sTag == "NW_BADGER")
 {
   return 
1.0;
 } 
Ou sont inscrit le nombre de px donné au joueur. Et comment je es ce que j'inclus les nouvelle donné ?

Merci
Lien direct vers le message - Vieux
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 
Ce genre de script ne pose pas de problème point de vue "ressources" ne t'en fait pas

Le chiffre représentant les xp est dans ce cas ci: 1.0 (qui veut dire 1 XP )

Si tu veux ajouter un monstre, tu dois avoir 2 données à ta disposition:

- Son TAG
- Les XP que tu veux lui attribuer.

Ensuite tu ajoutes la même ligne que les autres mais en changeant le TAG entre " " par le nouveau, et en changeant le chiffre avec décimale (important) par celui que tu désires.

Par exemple, ajouter une Dracoliche qui comporte le TAG: DRACOLICHE à qui tu veux donner 25000 XP, ça donnerait ceci:

Code PHP:
else if (sTag == "DRACOLICHE")
 {
   return 
25000.0
 


PS: Mais je te déconseille tout de même cette méthode qui est fastidieuse à mettre en place et pas très souple d'emploi.
Utilise plutot mon script complet et donne une valeur entre 1 et 5 à nBaseXP, tu en seras plus content
Lien direct vers le message - Vieux
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 
Mise à jour des scripts
Comme prévu, voici une nouvelle version de ces scripts, comprenant entre autre:

- Bonus de rareté (plus vous tuez le même monstre, moins il vous rapporte).
- Phrases de combat (selon le coup que vous portez, des phrases et des voix d'animations surviennent durant la bataille).
- Meilleure structure du script, réécriture de certaines fonctions.

Code PHP:
//::///////////////////////////////////////////////
//:: Default On Damaged
//:: NW_C2_DEFAULT6
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
    If already fighting then ignore, else determine
    combat round
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: Oct 16, 2001
//:: Modifier By: Binote
//:://////////////////////////////////////////////

#include "NW_I0_GENERIC"

void VoiceFighting(object oDamagerint nDamage)
{
    
float fMaxHP IntToFloat(GetMaxHitPoints(OBJECT_SELF));
    
float fDamage IntToFloat(nDamage);
    
int nAlignBM GetAlignmentGoodEvil(oDamager);
    
float fViolence fDamage/fMaxHP;
    
string sMonine;
    if(
fViolence >= 0.9)
    {
     
sMonine "Votre attaque envoit votre adversaire aux portes de la mort.";
     
PlayVoiceChat(VOICE_CHAT_NEARDEATHOBJECT_SELF);
     if(
nAlignBM == ALIGNMENT_EVIL)
     {
      
PlayVoiceChat(VOICE_CHAT_LAUGHoDamager);
     }
    }
    else if(
fViolence >= 0.8)
    {
     
sMonine "Votre adversaire se demande encore ce qu'il lui est arrive.";
     
PlayVoiceChat(VOICE_CHAT_PAIN3OBJECT_SELF);
    }
    else if(
fViolence >= 0.7)
    {
     
sMonine "Votre adversaire ne peut que constater les degats de votre attaque.";
     
PlayVoiceChat(VOICE_CHAT_PAIN2OBJECT_SELF);
    }
    else if(
fViolence >= 0.6)
    {
     
sMonine "Votre adversaire ne peut contenir la violence de votre attaque.";
     
PlayVoiceChat(VOICE_CHAT_PAIN1OBJECT_SELF);
    }
    else if(
fViolence >= 0.5)
    {
     
sMonine "Votre adversaire a du mal a encaisser la violence de votre attaque.";
     
PlayVoiceChat(VOICE_CHAT_BATTLECRY1OBJECT_SELF);
    }
    else if(
fViolence <= 0.1)
    {
     
sMonine "Votre ridicule petite attaque fait peu d'effet sur votre adversaire.";
     
PlayVoiceChat(VOICE_CHAT_LAUGHOBJECT_SELF);
     
PlayVoiceChat(VOICE_CHAT_WEAPONSUCKSoDamager);
    }
    else
    {
    }
    
FloatingTextStringOnCreature(sMonineoDamagerTRUE);
}

void main()
{
    
object oDamager GetLastDamager();
    
int nDamage GetTotalDamageDealt();
    
int nCoup GetLocalInt(OBJECT_SELF"Coup");
    
string sLeech;
    if (
nCoup == 0)
    {
     
string sTag GetTag(OBJECT_SELF);
     
int nID Random(65534);
     
string sID IntToString(nID);
     
sLeech "Leech_" sTag sID;
    }
    else
    {
     
sLeech GetLocalString(OBJECT_SELF"TagLeech");
    }
    
SetLocalString(OBJECT_SELF"TagLeech"sLeech);
    
int nBlessure GetLocalInt(oDamagersLeech);
    
int nTotBless GetLocalInt(OBJECT_SELF"TotalLeech");
    
int nLeech nDamage nBlessure;
    
int nTotalLeech nDamage nTotBless;
    
SetLocalInt(oDamagersLeechnLeech);
    
SetLocalInt(OBJECT_SELF"TotalLeech"nTotalLeech);
    
int nFCoup nCoup 1;
    
SetLocalInt(OBJECT_SELF"Coup"nFCoup);
    
VoiceFighting(oDamagernDamage);

    if(!
GetFleeToExit())
    {
        if(!
GetSpawnInCondition(NW_FLAG_SET_WARNINGS))
        {
            if(!
GetIsObjectValid(GetAttemptedAttackTarget()) && !GetIsObjectValid(GetAttemptedSpellTarget()))
            {
                if(
GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL))
                {
                    
DetermineSpecialBehavior(oDamager);
                }
                else if(
GetIsObjectValid(oDamager))
                {
                    
DetermineCombatRound();
                    if(!
GetIsFighting(OBJECT_SELF))
                    {
                        if(!
GetObjectSeen(oDamager) && GetArea(OBJECT_SELF) == GetArea(oDamager))
                        {
                            
ActionMoveToLocation(GetLocation(oDamager), TRUE);
                            
ActionDoCommand(DetermineCombatRound());
                        }
                    }
                }
            }
            else if (!
GetIsObjectValid(GetAttemptedSpellTarget()))
            {
                
object oTarget GetAttackTarget();
                if(!
GetIsObjectValid(oTarget))
                {
                    
oTarget GetAttemptedAttackTarget();
                }
                
object oAttacker GetLastHostileActor();
                if (
GetIsObjectValid(oAttacker) && oTarget != oAttacker && GetIsEnemy(oAttacker) &&
                   (
GetTotalDamageDealt() > (GetMaxHitPoints(OBJECT_SELF) / 4) ||
                    (
GetHitDice(oAttacker) - 2) > GetHitDice(oTarget) ) )
                {
                    
DetermineCombatRound(oAttacker);
                }
            }
        }
    }
    if(
GetSpawnInCondition(NW_FLAG_DAMAGED_EVENT))
    {
        
SignalEvent(OBJECT_SELFEventUserDefined(1006));
    }

Code PHP:
//::///////////////////////////////////////////////
//:: Default On Death
//:: NW_C2_DEFAULT7
//:://////////////////////////////////////////////

//:://////////////////////////////////////////////
//:: Created By: Binote
//:: Created On: Mai 2003
//:://////////////////////////////////////////////

#include "NW_I0_GENERIC"

//Vous pouvez changer la valeur de nBaseXP selon votre echelle; 100=DMG.
int nBaseXP 100;
//Bonus d'XP a partager entre les membres conscients du groupe se trouvant dans la meme Zone
int nBonusXPGroupe 25;
//Bonus d'XP pour celui qui acheve la creature
int nBonusXPTueur 5;
//Bonus de Rarete: nombre de creatures tuees avant que le Bonus = 0
int nBonusXPRarete 20;

//Changement de la Reputation de base lors d'un meurtre
int nReput = -5;

//Ne changez rien ci-dessus, sauf si vous savez ce que vous faites ;)

//Fonction d'xp du PJ achevant le monstre
void XPTueur(object oKillerint nBonusXPTueur)
{
 
float fCR GetChallengeRating(OBJECT_SELF);
 
string sLeech GetLocalString(OBJECT_SELF"TagLeech");
 
float fXP;
 if(
sLeech == "")
 {
  
string sMonine "Votre attaque est si violente que votre adversaire est litteralement pulverise.";
  
FloatingTextStringOnCreature(sMonineoKillerTRUE);
  
fXP fCR nBonusXPTueur;
 }
 else
 {
  
int nMaxHP GetLocalInt(OBJECT_SELF"TotalLeech");
  
int nLeech GetLocalInt(oKillersLeech);
  
float fMaxHP IntToFloat(nMaxHP);
  
float fLeech IntToFloat(nLeech);
  
float fDmg fLeech fMaxHP;
  
fXP = (fCR fDmg)* nBonusXPTueur;
 }
 
int nXP FloatToInt(fXP);
 
SendMessageToPC(oKiller"Vous gagnez " IntToString(nXP) + " points d'experience de Bonus.");
 
GiveXPToCreature(oKillernXP);
}

//Fonction d'xp des autres PJ faisant partie du groupe du PJ ayant acheve le monstre
void XPParty(object oKillerobject oAreaint nBonusXPGroupe)
{
     
int nMembres 0;
     
object oMembreGroupe GetFirstFactionMember(oKillerTRUE);
     while (
GetIsObjectValid(oMembreGroupe) == TRUE)
     {
      
object oAreaGroupe GetArea(oMembreGroupe);
      if(
oArea == oAreaGroupe)
      {
       
nMembres nMembres 1;
      }
      
oMembreGroupe GetNextFactionMember(oKillerTRUE);
     }
     
float fCR GetChallengeRating(OBJECT_SELF);
     
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(
GetIsPC(oMembreGroupe) == TRUE && oArea == oAreaGroupe && GetCurrentHitPoints(oMembreGroupe) > 0)
      {
       
int nLeech GetLocalInt(oMembreGroupesLeech);
       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'experience de Bonus de Groupe.");
       
GiveXPToCreature(oMembreGroupenXP);
      }
      
oMembreGroupe GetNextFactionMember(oKillerTRUE);
     }
}

//Fonction d'xp des autres PJ ayant touche le monstre
void XPBinote(object oAreaint nBaseXPint nXPRarete)
{
    
string sLeech GetLocalString(OBJECT_SELF"TagLeech");
    if(
sLeech == "")
    {
     return;
    }
    else
    {
     
object oLeecheur GetFirstPC();
     
float fCR GetChallengeRating(OBJECT_SELF);
     
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(oLeecheursLeech);
       
float fLeech IntToFloat(nLeech);
       
float fDmg fLeech fMaxHP;
       
float fXPReel = (fCR fDmg)* nBaseXP;
       
int nXPLeech FloatToInt(fXPReel);
       
int nXP nXPLeech nXPRarete;
       
SendMessageToPC(oLeecheur"Vous gagnez " IntToString(nXP) + " XP, dont " IntToString(nXPRarete) + " XP de Bonus de Rarete.");
       
GiveXPToCreature(oLeecheurnXP);
       
DeleteLocalInt(oLeecheursLeech);
      }
      
oLeecheur GetNextPC();
     }
    }
}

//Tableau de Chasse du Joueur
int GetKillBoard(object oKillerstring sNom)
{
    
int nKills GetLocalInt(oKillersNom);
    
nKills += 1;
    
SetLocalInt(oKillersNomnKills);
    return 
nKills;
}

//Bonus XP de Rarete
int GetXPRarete(int nBonusXPRareteint nKills)
{
    
float fCR GetChallengeRating(OBJECT_SELF);
    
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 oKillerint 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;
    }
    
AdjustReputation(oKillerOBJECT_SELFnReput);
    
SendMessageToPC(oKiller"Votre reputation vis-a-vis de la faction de " sFaction " s'est deterioree!");
}

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);
    if(
nClass && (nAlign == ALIGNMENT_GOOD || nAlign == ALIGNMENT_NEUTRAL))
    {
        
AdjustAlignment(oKillerALIGNMENT_EVIL5);
    }
    
//Message d'avertissement aux MDs. Mettez // devant la ligne si vous ne voulez pas utiliser cette option.
    
SendMessageToAllDMs(sNom " vient d'etre tue par " sKiller " dans " sArea);
    if(
GetIsPC(oKiller) == TRUE)
    {
     
//Resultat du Tableau de Chasse
     
int nKillBoard GetKillBoard(oKillersNom);
     
string sKills IntToString(nKillBoard);
     
SendMessageToPC(oKiller"Vous venez de tuer " sNom "; ceci est votre " sKills "e !");
     
//Bonus XP Rarete
     
int nXPRarete GetXPRarete(nBonusXPRaretenKillBoard);
     
//Bonus XP Tueur, Mettez // devant la ligne si vous ne voulez pas utiliser cette option.
     
XPTueur(oKillernBonusXPTueur);
     
//XP (mettez bien l'echelle d'xp sur 0 dans les proprietes du module)
     
XPBinote(oAreanBaseXPnXPRarete);
     
//Bonus XP Groupe, Mettez // devant la ligne si vous ne voulez pas utiliser cette option.
     
XPParty(oKilleroAreanBonusXPGroupe);
    }
     
//Ajustement de la Faction
     
AdjustFaction (oKillernReput);
     
//Effacement des variables locales du monstre
     
DeleteLocalInt(OBJECT_SELF"TotalLeech");
     
DeleteLocalInt(OBJECT_SELF"Coup");
     
DeleteLocalString(OBJECT_SELF"TagLeech");
    if(
GetSpawnInCondition(NW_FLAG_DEATH_EVENT))
    {
        
SignalEvent(OBJECT_SELFEventUserDefined(1007));
    }

Lien direct vers le message - Vieux
Avatar de raistlin
raistlin
Roi
 
Avatar de raistlin
 
Voilà, je voudrais savoir si c'est possible de faire un PNJ qui donne le niveau 2 aux joueurs seulement s'ils sont niveau 1, avec un petit dialogue ?

Merci d'éviter de poster en majuscule à l'avenir.
Lien direct vers le message - Vieux
Avatar de raistlin
raistlin
Roi
 
Avatar de raistlin
 
j'ai trouvé le scrypt est a mettre dans " action " du dialogue du joueur

Code PHP:

void main
()
{
    
// Donne 3001 XP au joueur s'il est lvl 1
    
object joueur GetPCSpeaker();
    
int nXP GetXP(joueur);

    if (
nXP 1001)
    {
        
GiveXPToCreature(joueur3001);
         
    }



voila
Lien direct vers le message - Vieux
Avatar de Typoon
Typoon
Prince / Princesse
 
Avatar de Typoon
 
Bonjour, j'ai remarqué 2-3 petites choses dans le code ici, je suppose qu'il vaut mieux les rapporter :

- Le ratio d'xp 100 est trop élevé, un chevalier funeste de la campagne solo rapporte avec ce script 1050xp ( 1000xp avec XPBinote, et 50 avec XPTueur )
Pour ma part j'ai mis le ratio nBaseXP = 7, et nBonusXPTueur = 3 (ou deux, je me rapelle plus ), ainsi je touche une xp correcte de tous les monstres. Enfin ça c'est juste minime
- J'ai modifié quelque peu le script pour mon usage, en rajoutant un test d'xp minimale, en effet, certains monstres donnaient 0 points d'xp ( cela vient surement d'un FloatToInt ), pour contrer cela il suffit de rajouter juste avant les lignes concernant legain d'xp du jouer un petit

if(nXP < 20)
{
nXP = 20;
}

ainsi on obtient une xp minimale par monstre, qui me semble tout a fait convenable.

- J'ai eu une erreur de "division par zero" à un moment, je suppose qu'elle provient du moment ou on compte les membres du groupe dans la zone, mais logiquement vu que le pj ayant tué le monstre se trouve dans sa zone, la variable nMembre ( et donc fCompteur ) devraient au minimum valoir 1... (pour info, ceci ce trouve dans la foncopn XPParty ).
Les seules autres divisions sont du genre fDmg = fLeech / fMaxHP; et si j'ai bien compris, fMaxHP contient la valeur des hp maximaux du monstre qui vient de mourir, donc toujours différent de zero.
Enfin bref, ce bug de division par zero n'a pas causé de plantage ni rien, juste un petit message jaune.
Je tiens a préciser que j'ai eu ce message lorsque je ne tuais aucun monstre (je ramassais mes drops ), que tous les membres de mon groupe ont eu ce message, et que j'étais seul dans ma zone.

- Pour terminer, la fonction XPParty n'a pas l'air de fonctionner. En fait, j'ai jamais regardé et calculé exactement l'xp que l'on gagnait hors et en party a la mort d'un monstre via la fiche du personnage, mais je déduis cela du fait que je n'ai jamais eu le message suivant :

SendMessageToPC(oMembreGroupe, "Vous gagnez " + IntToString(nXP) + " points d'experience de Bonus de Groupe.");

J'en conclus donc que la fonction ne donne pas l'xp, vu qu'elle ne s'exécute pas, ou qu'elle plante avant d'afficher ce message.


Pour info, voici le script tel que je l'utilise :
Code PHP:
 //::///////////////////////////////////////////////
     //:: Default On Death
     //:: NW_C2_DEFAULT7
     //:://////////////////////////////////////////////
     
     //:://////////////////////////////////////////////
     //:: Created By: Binote
     //:: Created On: Mai 2003
     //:://////////////////////////////////////////////
     
     #include "NW_I0_GENERIC"
     
     //Vous pouvez changer la valeur de nBaseXP selon votre echelle; 100=DMG.
     
int nBaseXP 7;
     
//Bonus d'XP a partager entre les membres conscients du groupe se trouvant dans la meme Zone
     
int nBonusXPGroupe 25;
     
//Bonus d'XP pour celui qui acheve la creature
     
int nBonusXPTueur 3;
     
//Bonus de Rarete: nombre de creatures tuees avant que le Bonus = 0
     
int nBonusXPRarete 20;
     
     
//Changement de la Reputation de base lors d'un meurtre
     
int nReput = -5;
     
     
//Ne changez rien ci-dessus, sauf si vous savez ce que vous faites ;)
     
     //Fonction d'xp du PJ achevant le monstre
     
void XPTueur(object oKillerint nBonusXPTueur)
     {
     
float fCR GetChallengeRating(OBJECT_SELF);
     
string sLeech GetLocalString(OBJECT_SELF"TagLeech");
     
float fXP;
     if(
sLeech == "")
     {
       
string sMonine "Votre attaque est si violente que votre adversaire est litteralement pulverise.";
       
FloatingTextStringOnCreature(sMonineoKillerTRUE);
       
fXP fCR nBonusXPTueur;
     }
     else
     {
       
int nMaxHP GetLocalInt(OBJECT_SELF"TotalLeech");
       
int nLeech GetLocalInt(oKillersLeech);
       
float fMaxHP IntToFloat(nMaxHP);
       
float fLeech IntToFloat(nLeech);
       
float fDmg fLeech fMaxHP;
       
fXP = (fCR fDmg)* nBonusXPTueur;
     }
     
int nXP FloatToInt(fXP);
     if(
nXP 20)
     {
         
nXP 20;
     }
     
SendMessageToPC(oKiller"Vous gagnez " IntToString(nXP) + " points d'experience de Bonus.");
     
GiveXPToCreature(oKillernXP);
     }
     
     
//Fonction d'xp des autres PJ faisant partie du groupe du PJ ayant acheve le monstre
     
void XPParty(object oKillerobject oAreaint nBonusXPGroupe)
     {
          
int nMembres 0;
          
object oMembreGroupe GetFirstFactionMember(oKillerTRUE);
          while (
GetIsObjectValid(oMembreGroupe) == TRUE)
          {
           
object oAreaGroupe GetArea(oMembreGroupe);
           if(
oArea == oAreaGroupe)
           {
            
nMembres nMembres 1;
           }
           
oMembreGroupe GetNextFactionMember(oKillerTRUE);
          }
          
float fCR GetChallengeRating(OBJECT_SELF);
          
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(
GetIsPC(oMembreGroupe) == TRUE && oArea == oAreaGroupe && GetCurrentHitPoints(oMembreGroupe) > 0)
           {
            
int nLeech GetLocalInt(oMembreGroupesLeech);
            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'experience de Bonus de Groupe.");
            
GiveXPToCreature(oMembreGroupenXP);
           }
           
oMembreGroupe GetNextFactionMember(oKillerTRUE);
          }
     }
     
     
//Fonction d'xp des autres PJ ayant touche le monstre
     
void XPBinote(object oAreaint nBaseXP)
     {
         
string sLeech GetLocalString(OBJECT_SELF"TagLeech");
         if(
sLeech == "")
         {
          return;
         }
         else
         {
          
object oLeecheur GetFirstPC();
          
float fCR GetChallengeRating(OBJECT_SELF);
          
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(oLeecheursLeech);
            
float fLeech IntToFloat(nLeech);
            
float fDmg fLeech fMaxHP;
            
float fXPReel = (fCR fDmg)* nBaseXP;
            
int nXPLeech FloatToInt(fXPReel);
            
int nXP nXPLeech;
            if(
nXP 20)
            {
             
nXP 20;
            }
            
SendMessageToPC(oLeecheur"Vous gagnez " IntToString(nXP) + " XP");
            
GiveXPToCreature(oLeecheurnXP);
            
DeleteLocalInt(oLeecheursLeech);
           }
           
oLeecheur GetNextPC();
          }
         }
     }
     
     
//Tableau de Chasse du Joueur
     
int GetKillBoard(object oKillerstring sNom)
     {
         
int nKills GetLocalInt(oKillersNom);
         
nKills += 1;
         
SetLocalInt(oKillersNomnKills);
         return 
nKills;
     }
     
     
     
     
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);
     
//Message d'avertissement aux MDs. Mettez // devant la ligne si vous ne voulez pas utiliser cette option.
         //SendMessageToAllDMs(sNom + " vient d'etre tue par " + sKiller + " dans " + sArea);
         
if(GetIsPC(oKiller) == TRUE)
         {
          
//Resultat du Tableau de Chasse
          
int nKillBoard GetKillBoard(oKillersNom);
          
string sKills IntToString(nKillBoard);
          
SendMessageToPC(oKiller"Vous venez de tuer " sNom "; ceci est votre " sKills "e !");
          
//Bonus XP Rarete
          //Bonus XP Tueur, Mettez // devant la ligne si vous ne voulez pas utiliser cette option.
          
XPTueur(oKillernBonusXPTueur);
          
//XP (mettez bien l'echelle d'xp sur 0 dans les proprietes du module)
          
XPBinote(oAreanBaseXP);
          
//Bonus XP Groupe, Mettez // devant la ligne si vous ne voulez pas utiliser cette option.
          
XPParty(oKilleroAreanBonusXPGroupe);
         }
          
//Ajustement de la Faction
          //Effacement des variables locales du monstre
          
DeleteLocalInt(OBJECT_SELF"TotalLeech");
          
DeleteLocalInt(OBJECT_SELF"Coup");
          
DeleteLocalString(OBJECT_SELF"TagLeech");
         if(
GetSpawnInCondition(NW_FLAG_DEATH_EVENT))
         {
             
SignalEvent(OBJECT_SELFEventUserDefined(1007));
         }
     } 
et le ondeath :
Code PHP:
//::///////////////////////////////////////////////
     //:: Default On Damaged
     //:: NW_C2_DEFAULT6
     //:: Copyright (c) 2001 Bioware Corp.
     //:://////////////////////////////////////////////
     /*
         If already fighting then ignore, else determine
         combat round
     */
     //:://////////////////////////////////////////////
     //:: Created By: Preston Watamaniuk
     //:: Created On: Oct 16, 2001
     //:: Modifier By: Binote
     //:://////////////////////////////////////////////
     
     #include "NW_I0_GENERIC"
     
     
void main()
     {
         
object oDamager GetLastDamager();
         
int nDamage GetTotalDamageDealt();
         
int nCoup GetLocalInt(OBJECT_SELF"Coup");
         
string sLeech;
         if (
nCoup == 0)
         {
          
string sTag GetTag(OBJECT_SELF);
          
int nID Random(65534);
          
string sID IntToString(nID);
          
sLeech "Leech_" sTag sID;
         }
         else
         {
          
sLeech GetLocalString(OBJECT_SELF"TagLeech");
         }
         
SetLocalString(OBJECT_SELF"TagLeech"sLeech);
         
int nBlessure GetLocalInt(oDamagersLeech);
         
int nTotBless GetLocalInt(OBJECT_SELF"TotalLeech");
         
int nLeech nDamage nBlessure;
         
int nTotalLeech nDamage nTotBless;
         
SetLocalInt(oDamagersLeechnLeech);
         
SetLocalInt(OBJECT_SELF"TotalLeech"nTotalLeech);
         
int nFCoup nCoup 1;
         
SetLocalInt(OBJECT_SELF"Coup"nFCoup);
     
         if(!
GetFleeToExit())
         {
             if(!
GetSpawnInCondition(NW_FLAG_SET_WARNINGS))
             {
          if(!
GetIsObjectValid(GetAttemptedAttackTarget()) && !GetIsObjectValid(GetAttemptedSpellTarget()))
                 {
                     if(
GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL))
                     {
                  
DetermineSpecialBehavior(oDamager);
                     }
                 else if(
GetIsObjectValid(oDamager))
                     {
                         
DetermineCombatRound();
                  if(!
GetIsFighting(OBJECT_SELF))
                         {
                      if(!
GetObjectSeen(oDamager) && GetArea(OBJECT_SELF) == GetArea(oDamager))
                      {
                          
ActionMoveToLocation(GetLocation(oDamager), TRUE);
                          
ActionDoCommand(DetermineCombatRound());
                      }
                         }
                     }
                 }
              else if (!
GetIsObjectValid(GetAttemptedSpellTarget()))
                 {
                 
object oTarget GetAttackTarget();
                  if(!
GetIsObjectValid(oTarget))
                     {
                  
oTarget GetAttemptedAttackTarget();
                     }
                     
object oAttacker GetLastHostileActor();
              if (
GetIsObjectValid(oAttacker) && oTarget != oAttacker && GetIsEnemy(oAttacker) &&
                  (
GetTotalDamageDealt() > (GetMaxHitPoints(OBJECT_SELF) / 4) ||
                  (
GetHitDice(oAttacker) - 2) > GetHitDice(oTarget) ) )
                     {
                  
DetermineCombatRound(oAttacker);
                     }
                 }
             }
         }
         if(
GetSpawnInCondition(NW_FLAG_DAMAGED_EVENT))
         {
             
SignalEvent(OBJECT_SELFEventUserDefined(1006));
         }
     } 

ps: le nBonusXPGroupe est toujours a 25 pour les raisons citées plus haut : je ne le vois pas intervenir durant ma partie.
ps2: j'utilise ce script pour un module persistant action
ps3 : je trouve ce script super, car il ne dépend pas du lv du monstre et du pj, et donc même les zones bas lv restent intéressante question xp, cela ne limite donc pas le module a "zone A pour lv Y, zone B pour lv Z,..."
Merci de l'avoir tapé, j'avoue que je n'ai pas encore les connaissance nécéssaires pour écrire un tel script, mais juste pour le comprendre ( et encore ^^; )
Lien direct vers le message - Vieux
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 
Citation:
- Le ratio d'xp 100 est trop élevé...
la valeur 100 correspond au DMG (Guide du Maitre 3e Edition), sur mon module persistant j'utilise cette config:

Code PHP:
//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
Citation:
- J'ai modifié quelque peu le script pour mon usage, en rajoutant un test d'xp minimale, en effet, certains monstres donnaient 0 points d'xp ( cela vient surement d'un FloatToInt ),
Le système donne 0xp dans les cas suivants:
- Le monstre est tué en un coup (ce qui ne représente pas un "défi" selon moi), dans ce cas seuls les XP bonus (BonusXPTueur) sont attribués.
- Le tueur a un CR au moins 2 fois supérieur à celui du monstre tué, ce qui est également trop "facile".
Ce n'est pas du à une erreur ou un bug, mais simplement à un choix de script.

Citation:
J'ai eu une erreur de "division par zero" à un moment,
C'est parce qu'un MD ou un PNJ/monstre tue un autre PNJ/monstre (Et que donc ça entraine une division par 0).
Place la portion "main" du code dans ce "IF":
Code PHP:
if(GetIsPC(oPC) && !GetIsDM(oPC) && !GetIsDMPossessed(oPC))
{

Depuis le temps j'ai mis à jour ce script qui existe dans une version plus récente. Je le publierai cette semaine si ça vous intéresse.
Lien direct vers le message - Vieux
Avatar de Typoon
Typoon
Prince / Princesse
 
Avatar de Typoon
 
Citation:
- Le tueur a un CR au moins 2 fois supérieur à celui du monstre tué, ce qui est également trop "facile".
je te comprends entièrement, mais bon le pauvre magicien a qui je pensais en écrivant ça se faisait déchirer par le monstre en question ^^;

Enfin, merci de ton aide ^^

ps: oui la version a jour m'intéresse ^^

ps2 : comment vous faites pour que vos codes soient colorés? ^^;
edit : merci, il me semblais juste que j'avais déjà essayé ^^;
Lien direct vers le message - Vieux
Avatar de Rand
Rand
Alpha & Oméga
 
Avatar de Rand
 
Il faut utiliser la balise PHP .
Code PHP:
//blabla
blabla 
Si tu ne vois vraiment pas, "Cite" mon message ou celui d'un des autres posteurs.
Lien direct vers le message - Vieux
Avatar de Typoon
Typoon
Prince / Princesse
 
Avatar de Typoon
 
Un dernier truc, dans ton nouveau code, as-tu geré le problême du familier et des invocations? Elles ne sont pas considérées comme un pj, et donc pour le script, c'est un monstre qui tue un autre monstre, et aucun calcul d'xp n'est effectué.
Lien direct vers le message - Vieux
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 
Le fichier de l'event OnDeath des créatures du module:

Code PHP:
//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 oKillerint 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(sMonineoKillerFALSE);
  
fXP fCR nBonusXPTueur;
 }
 else
 {
  
int nMaxHP GetLocalInt(OBJECT_SELF"TotalLeech");
  
int nLeech GetLocalInt(oKillersLeech);
  
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(oKillernXP);
 }
}


//Fonction d'xp des autres PJ faisant partie du groupe du PJ ayant acheve le monstre
void XPParty(object oKillerobject oAreaint nBonusXPGroupe)
{
     
int nMembres 0;
     
object oMembreGroupe GetFirstFactionMember(oKillerTRUE);
     while (
GetIsObjectValid(oMembreGroupe) == TRUE)
     {
      
object oAreaGroupe GetArea(oMembreGroupe);
      if(
GetIsPC(oMembreGroupe) == TRUE && !GetIsDM(oMembreGroupe) && oArea == oAreaGroupe)
      {
       
nMembres nMembres 1;
      }
      
oMembreGroupe GetNextFactionMember(oKillerTRUE);
     }
     
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(oMembreGroupesLeech);
       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(oMembreGroupenXP);
      }
      
oMembreGroupe GetNextFactionMember(oKillerTRUE);
     }
}


//Fonction d'xp des autres PJ ayant touche le monstre
void XPBinote(object oAreaint nBaseXPint 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(oLeecheursLeech);
       
float fLeech IntToFloat(nLeech);
       
float fDmg fLeech fMaxHP;
       
//Edit Diff CR
       
float fCRPJ IntToFloat(GetHitDice(oLeecheur));
       if(
fCRPJ <=1.0fCRPJ =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(oLeecheurnXP);
       }
       
DeleteLocalInt(oLeecheursLeech);
      }
      
oLeecheur GetNextPC();
     }
    }
}

//Tableau de Chasse du Joueur
int GetKillBoard(object oKillerstring 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), sNomnKills);
    return 
nKills;
}

//Bonus XP de Rarete
int GetXPRarete(int nBonusXPRareteint 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 oKillerint 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(oKillerOBJECT_SELFnReput);
}

// 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 && (nAlign == ALIGNMENT_GOOD || nAlign == ALIGNMENT_NEUTRAL))
   {
    
AdjustAlignment(oKillerALIGNMENT_EVIL5);
   }
   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_SELFEventUserDefined(1007));
   }
   if (
GetIsObjectValid(GetMaster(OBJECT_SELF)))
    {
        
object oMaster GetMaster(OBJECT_SELF);
        
object oAssociate GetAssociate(ASSOCIATE_TYPE_SUMMONEDoMaster);
        if (
oAssociate == OBJECT_SELF)
            return;
        
oAssociate GetAssociate(ASSOCIATE_TYPE_FAMILIARoMaster);
        if (
oAssociate == OBJECT_SELF)
            return;
        
oAssociate GetAssociate(ASSOCIATE_TYPE_DOMINATEDoMaster);
        if (
oAssociate == OBJECT_SELF)
           return;
        
oAssociate GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANIONoMaster);
        if (
oAssociate == OBJECT_SELF)
            
GiveXPToCreature(oMaster, (-50*GetHitDice(oMaster)));
            
AdjustAlignment(oKillerALIGNMENT_EVIL5);
            return;
    }
    
//XP Binote
    
int nXPRarete 1;
    if(
GetIsPJ(oKiller))
    {
     
//Resultat du Tableau de Chasse
     
int nKillBoard GetKillBoard(oKillersTag);
     
string sKills IntToString(nKillBoard);
     
SendMessageToPC(oKiller"Vous venez de tuer " sNom "; ceci est votre " sKills "e !");
     
//Bonus XP Rarete
     
nXPRarete GetXPRarete(nBonusXPRaretenKillBoard);

     
//Bonus XP Tueur, Mettez // devant la ligne si vous ne voulez pas utiliser cette option.
     
XPTueur(oKillernBonusXPTueur);
     
//XP (mettez bien l'echelle d'xp sur 0 dans les proprietes du module)
     
XPBinote(oAreanBaseXPnXPRarete);
     
//Bonus XP Groupe, Mettez // devant la ligne si vous ne voulez pas utiliser cette option.
     
XPParty(oKilleroAreanBonusXPGroupe);
     
//Ajustement de la Faction
     
AdjustFaction (oKillernReput);
     
//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.
Lien direct vers le message - Vieux
Avatar de Typoon
Typoon
Prince / Princesse
 
Avatar de Typoon
 
Code PHP:
//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");
  
  
#include "NW_I0_GENERIC"
  
  //Fonction d'xp du PJ achevant le monstre
  
void XPTueur(object oKillerint 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(sMonineoKillerFALSE);
    
fXP fCR nBonusXPTueur;
  }
  else
  {
    
int nMaxHP GetLocalInt(OBJECT_SELF"TotalLeech");
    
int nLeech GetLocalInt(oKillersLeech);
    
float fMaxHP IntToFloat(nMaxHP);
    
float fLeech IntToFloat(nLeech);
    
float fDmg fLeech fMaxHP;
    
fXP = (fCR fDmg)* nBonusXPTueur;
  }
  
int nXP FloatToInt(fXP);
  if(
nXP 20)
  {
    
nXP 20;
  }
  if(
GetIsPC(oKiller))
  {
    
SendMessageToPC(oKiller"Vous gagnez " IntToString(nXP) + " points d'expérience de Bonus.");
    
GiveXPToCreature(oKillernXP);
  }
  }
  
  
  
//Fonction d'xp des autres PJ faisant partie du groupe du PJ ayant acheve le monstre
  
void XPParty(object oKillerobject oAreaint nBonusXPGroupe)
  {
       
int nMembres 0;
       
object oMembreGroupe GetFirstFactionMember(oKillerTRUE);
       while (
GetIsObjectValid(oMembreGroupe) == TRUE)
       {
        
object oAreaGroupe GetArea(oMembreGroupe);
        if(
GetIsPC(oMembreGroupe) == TRUE && !GetIsDM(oMembreGroupe) && oArea == oAreaGroupe)
        {
         
nMembres nMembres 1;
        }
        
oMembreGroupe GetNextFactionMember(oKillerTRUE);
       }
       
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)
        
if(oArea == oAreaGroupe && GetCurrentHitPoints(oMembreGroupe) > 0)
        {
         
int nLeech GetLocalInt(oMembreGroupesLeech);
         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(oMembreGroupenXP);
        }
        
oMembreGroupe GetNextFactionMember(oKillerTRUE);
       }
  }
  
  
  
//Fonction d'xp des autres PJ ayant touche le monstre
  
void XPBinote(object oAreaint nBaseXPint 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(oLeecheursLeech);
         
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);
         
float fXPReel 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 (nXP 20)
         {
          
nXP 20;
         }
         if(
GetIsPC(oLeecheur))
         {
         
SendMessageToPC(oLeecheur"Vous gagnez " IntToString(nXP) + " XP, dont " IntToString(nXPRarete) + " XP de Bonus de Rareté.");
          
GiveXPToCreature(oLeecheurnXP);
         }
         
DeleteLocalInt(oLeecheursLeech);
        }
        
oLeecheur GetNextPC();
       }
      }
  }
  
  
//Tableau de Chasse du Joueur
  
int GetKillBoard(object oKillerstring 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), sNomnKills);
      return 
nKills;
  }
  
  
//Bonus XP de Rarete
  
int GetXPRarete(int nBonusXPRareteint 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 oKillerint 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(oKillerOBJECT_SELFnReput);
  }
  
  
// 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_SELFEventUserDefined(1007));
     }
     if (
GetIsObjectValid(GetMaster(OBJECT_SELF)))
      {
          
object oMaster GetMaster(OBJECT_SELF);
          
object oAssociate GetAssociate(ASSOCIATE_TYPE_SUMMONEDoMaster);
          if (
oAssociate == OBJECT_SELF)
              return;
          
oAssociate GetAssociate(ASSOCIATE_TYPE_FAMILIARoMaster);
          if (
oAssociate == OBJECT_SELF)
              return;
          
oAssociate GetAssociate(ASSOCIATE_TYPE_DOMINATEDoMaster);
          if (
oAssociate == OBJECT_SELF)
             return;
          
oAssociate GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANIONoMaster);
          if (
oAssociate == OBJECT_SELF)
              
GiveXPToCreature(oMaster, (-50*GetHitDice(oMaster)));
              
//AdjustAlignment(oKiller, ALIGNMENT_EVIL, 5);
              
return;
      }
      
//XP Binote
      
int nXPRarete 0;
      if(
GetIsPC(oKiller))
      {
       
//Resultat du Tableau de Chasse
       //int nKillBoard = GetKillBoard(oKiller, sNom);
       //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(oKillernBonusXPTueur);
       
//XP (mettez bien l'echelle d'xp sur 0 dans les proprietes du module)
       
XPBinote(oAreanBaseXPnXPRarete);
       
//Bonus XP Groupe, Mettez // devant la ligne si vous ne voulez pas utiliser cette option.
       
XPParty(oKilleroAreanBonusXPGroupe);
       
//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");
  } 
Voila le "corrigé" que je vais utiliser dès le prochain reboot de mon serveur ^^
Tu avais en effet quelques fautes ( GetIsPJ() a la place de GetIsPC(), et aussi tu appelais dans le "GetKillBoard(oKiller, sNom);" sTag à la place de sNom.

Merci de ta mise à jour ^^
Lien direct vers le message - Vieux
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 
Citation:
Tu avais en effet quelques fautes ( GetIsPJ() a la place de GetIsPC(), et aussi tu appelais dans le "GetKillBoard(oKiller, sNom);" sTag à la place de sNom.
Ce n'est pas des erreurs, c'est juste que j'utilise mes propres fonctions plutôt que celles de Bioware, et quand je mets un script ici, il faut que je réadapte le tout pour monsieur tout le monde, et forcément, sans compilateur, il reste parfois des oublis.

Le GetIsPJ() est en fait une fonction booléenne qui renvoit TRUE quand cette condition est vérifiée:

Code PHP:
if(GetIsPC(oPC) && !GetIsDM(oPC) && !GetIsDMPossessed(oPC)) 


Ce qui va au-delà de la fonction Bioware, car un "PC" peut être également un personnage DM ou une créature possédée par un DM (qui entrainera une erreur de division par 0 et qui comptera comme "membre du groupe" dans la fonction d'xp de groupe).
Lien direct vers le message - Vieux
Répondre
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > Répartition d'XP sur un monstre tué
   

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 17h56.
   

© 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