La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 02/06/2024 12:16:46


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Elechos
Acolyte
Inscrit le: 11 Mai 2004
Messages: 31
Répondre en citant
Posté le : 26/09/2004 23:28:04 Sujet du message : système de mort personnalisée

bonjour à tous.. alors mon problème est simple, j'ai une vision très précis de ce que je veux à la mort d'une créature... pour ça je voudrais désactiver le système de NWN et utiliser le système suivant mais je n'y arrive pas si quelqu'un a une idée....
NWScript :

#include "NW_I0_GENERIC"

void VoidCreateObject(string sTemplate, location lLoc, int bUseAppearAnimation=TRUE);

void main()
{
int MinGold = 50; // la on met le min d'or
int MaxGold = 150; // et la le max en or
string sRef;

switch( Random( 15 ) + 1 )
{
case 1 :
{
sRef = "resref de l'item a looter";
break;
}
case 2 :
{
sRef = "resref de l'item a looter";
break;
}
case 3 :
{
sRef = "resref de l'item a looter";
break;
}
case 4 :
{
sRef = "resref de l'item a looter";
break;
}
case 5 :
{
sRef = "resref de l'item a looter";
break;
}
case 6 :
{
sRef = "resref de l'item a looter";
break;
}
case 7 :
{
sRef = "resref de l'item a looter";
break;
}
case 8 :
{
sRef = "resref de l'item a looter";
break;
}
case 9 :
{
sRef = "resref de l'item a looter";
break;
}
case 10 :
{
sRef = "resref de l'item a looter";
break;
}
case 11 :
{
sRef = "resref de l'item a looter";
break;
}
case 12:
{
sRef = "resref de l'item a looter";
break;
}
case 13:
{
sRef = "resref de l'item a looter";
break;
}
case 14 :
{
sRef = "resref de l'item a looter";
break;
}
case 15 :
{
sRef = "resref de l'item a looter";
break;
}
}

CreateItemOnObject(sRef);

if(GetSpawnInCondition(NW_FLAG_DEATH_EVENT))
{
SignalEvent(OBJECT_SELF, EventUserDefined(1007));
}

object oSelf = OBJECT_SELF;
location lLoca = GetLocalLocation( oSelf, "Tag de la creature a respawn");
float fSeconds = 240.0; //temps en secondes pour le respawn
string sTemplate = GetResRef( oSelf );

AssignCommand( GetArea( oSelf ) , DelayCommand( fSeconds, VoidCreateObject( sTemplate, lLoca ) ) );
CreateItemOnObject("NW_IT_GOLD001", OBJECT_SELF, (Random(MaxGold-MinGold) + MinGold));
}

void VoidCreateObject(string sTemplate, location lLoc, int bUseAppearAnimation=TRUE)
{
CreateObject(OBJECT_TYPE_CREATURE, sTemplate,lLoc, bUseAppearAnimation);

}
//:Confused///////////////////////// ////////////////////////
//:: SIX_PJ_GAINXP
/*
  Evenement OnDeath pour les NPCs.
  a intgrer dans l'evenement OnDeath des PNJs
  qui est NW_C2_DEFAULT7 par defaut.

  Adjusts killer's alignment if appropriate and
  alerts allies to our death.
*/

//:Confused///////////////////////// ////////////////////////
//:: Copyright (c) 2004 SixOfOne
//:: Created By: DM_Danae
//:: Scripted By : SixOfOne
//:: Created On: 25/08/2004
//::
//:: Version non optimisee
//::
//:: Methode d'appel :
//::
//:: six_pj_gainxp(oKiller, OBJECT_SELF);
//::
//:: a insserrer en fin de procedure sur
//:: l'evenement OnDeath du PNJ
//::
//:Confused///////////////////////// ////////////////////////


// Determiner si le PC est en groupe
int six_IsInGroup(object oPC)
{
  int iNombre = 0;

  // Trouver le premier membre du groupe du PC
  object oMembre = GetFirstFactionMember(oPC, FALSE);

  while( GetIsObjectValid(oMembre) )
  {
    iNombre++;
    oMembre = GetNextFactionMember(oPC, FALSE);
  }

  return ( iNombre > 1 );
}

// Calcul de la valeur absolue pour des float (nombres decimaux)
float six_absfloat(float a)
{
  if ( a < 0.0f )
    a = -a;

  return a;
}

// Si la valeur est negatif on renvoi zero
float six_positifzero(float a)
{
  if (a < 0.0f)
    a = 0.0f;

  return a;
}

// Fonction principale
void six_pj_gainxp(object oKiller, object oDead)
{
  // Level de la creature morte
  float fLvlDead = IntToFloat( GetHitDice(oDead) );

  // Calcul des xp de base
  float fXpDeBase = fLvlDead * 10;

  // Level le plus haut du groupe dans lequel se trouve
  // eventuellement le killer, si pas de groupe c'est son
  // level qui est pris en compte
  float fLvlMax = IntToFloat( GetHitDice( GetFactionStrongestMember(oKiller) ) );

  // Definissions la variable pour stocker le lvl des membres du groupe
  float fLvlMembre = 0.0f;

  // Nous declarons et initialisons la variable des xp a donner aux PCs
  float fXp = 0.0f;

  // Ici, nous determinons si le killer est en groupe ou pas
  int iEnGroupe = six_IsInGroup(oKiller);


  // Traitons cas du joueur seul
  if (!iEnGroupe)
  {

    // ****************************** ****************************** ******
    // *** Ici, nous traitons le cas du PC seul                      ***

    //SendMessageToPC( oKiller, "*** Pas en groupe ***");
    //SendMessageToPC( oKiller, "Lvl creature = " + FloatToString(fLvlDead) );
    //SendMessageToPC( oKiller, "Lvl max      = " + FloatToString(fLvlMax) );
    //SendMessageToPC( oKiller, "Diff Lvl max = " + FloatToString( six_absfloat(fLvlDead - fLvlMax) ) );

    fXp = fXpDeBase + ( fXpDeBase * 0.15f * ( fLvlDead - fLvlMax ) ); // Pas de valeur absolue !!!!
    //SendMessageToPC( oKiller, "fXp (1) = " + FloatToString(fXp) );

    six_positifzero(fXp);

    //SendMessageToPC( oKiller, "fXp (2) = " + FloatToString(fXp) );

    //Don d'xp
    // Doit-on comptabiliser les xp negatifs ?
    if ( GetIsPC(oKiller) )
    {
      GiveXPToCreature( oKiller, FloatToInt(fXp) );
    }

    // ***                                                            ***
    // ****************************** ****************************** ******

  }
  else
  {
    // ****************************** ****************************** ******
    // *** Ici nous traitons le cas pour chacun des membres du groupe ***

    // Modification du calcul des xp de base
    // J'enleve 10% des xp de base
    float fXpGroupe = fXpDeBase - fXpDeBase * 0.1f;

    // J'enleve encore 5% sur le plus grand ecart de lvl entre PCs et creature
    fXpGroupe = fXpGroupe - (fXpDeBase * 0.05f * six_absfloat(fLvlDead - fLvlMax));

    // Trouver le premier membre du groupe du killer
    object oMembreGroupe = GetFirstFactionMember(oKiller, FALSE);

    // Nous refaisons les operations tant que nous n'avons
    // pas balaye tous les membres du groupe
    while( GetIsObjectValid(oMembreGroupe) )
    {
      // Pour prendre en compte les membres du groupe
      // nous testons qu'ils se trouvent bien dans la meme zone
      // que celui qui vient de tuer la creature.
      // Ajoutons a cela que le membre ne doit pas se trouver
      // a plus de 50 metres de la creature morte !

      if(GetArea(oKiller) == GetArea(oMembreGroupe) && GetCurrentHitPoints(oMembreGroupe) > 0 && GetDistanceBetween(oKiller, oMembreGroupe) < 50.0f)
      {

        //SendMessageToPC( oMembreGroupe, "*** En groupe : conditions : ok ***");
        //SendMessageToPC( oMembreGroupe, "Lvl creature = " + FloatToString(fLvlDead) );
        //SendMessageToPC( oMembreGroupe, "Lvl max      = " + FloatToString(fLvlMax) );
        //SendMessageToPC( oMembreGroupe, "Diff Lvl max = " + FloatToString( six_absfloat(fLvlDead - fLvlMax) ) );

        //SendMessageToPC( oMembreGroupe, "fXpGroupe    = " + FloatToString(fXpGroupe) );

        // Level du membre actuel du groupe
        float fLvlMembre = IntToFloat( GetHitDice(oMembreGroupe) );

        // Je calcule les 4% des xpDeBase par lvl de diff entre mob et membre du groupe
        // que je retranche aux xp deja calcules
        fXp = fXpGroupe - (fXpDeBase * 0.04f * six_absfloat(fLvlDead - fLvlMembre));

        //SendMessageToPC( oMembreGroupe, "fXp (1) = " + FloatToString(fXp) );

        six_positifzero(fXp);

        //SendMessageToPC( oMembreGroupe, "fXp (2) = " + FloatToString(fXp) );

        //Don d'xp
        // Doit-on comptabiliser les xp negatifs ?
        if ( GetIsPC(oMembreGroupe) )
        {
          GiveXPToCreature( oMembreGroupe, FloatToInt(fXp) );
        }

      } // Fin du if dans la zone
      else
      {
        //SendMessageToPC( oMembreGroupe, "*** En groupe : conditions : pas ok ***");
        //SendMessageToPC( oMembreGroupe, "Lvl creature = " + FloatToString(fLvlDead) );
        //SendMessageToPC( oMembreGroupe, "Lvl max      = " + FloatToString(fLvlMax) );
        //SendMessageToPC( oMembreGroupe, "Diff Lvl max = " + FloatToString( six_absfloat(fLvlDead - fLvlMax) ) );
      }

      oMembreGroupe = GetNextFactionMember(oKiller, FALSE);

    // ***                                                            ***
    // ****************************** ****************************** ******

    }


  } // Fin du else

  // Pour eviter la redondance du don d'XP.
  SetLocalInt(oDead, "AlreadyDyingEXP", 1);
}

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.

Merci d'avance
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Semcatala
Grand Sage du Conseil
Inscrit le: 20 Jan 2004
Messages: 951
Répondre en citant
Posté le : 27/09/2004 10:38:14 Sujet du message :

Bonjour !

dis moi , a propos de :


Citation :

j'ai une vision très précis de ce que je veux à la mort d'une créature... pour ça je voudrais désactiver le système de NWN et utiliser le système suivant mais je n'y arrive pas si quelqu'un a une idée....
Si tu pouvais répondre a de simples questions pour savoir ou l'on va ... :

- Quelle est ta vision trés précise de ce qte tu veux a la mort d'une créature
Pas la peine de nous dire exactement ce que tu va faire , mais si tu peux nous donner un exemple ce serais sympa.

- Désactiver le systéme de nwn ? C'est a dire ? Personaliser ce qui se passe a la mort du pj ?

- Tu pourrais nous dire ce qu'est censé faire ton script ?
Sachant qu'il est trés long et qu'il ne fonctionne visiblement pas comme tu le voudrais , je pense que je ne vais pas prendre du temps a le décortiquer en détail ( j'ai commencé , mais bon , a un moment je décroche , sachant que je ne sais pas exactement ce que tu veux faire ) pour essayer de le comprendre , il serait mieux pour tout le monde si tu pouvais commencer par nous donner un minimum d'infos sur ce que tu attends de ce script.

@+
_________________
" La ruse doit être employée pour faire croire que l'on est où l'on est pas, que l'on veut ce qu'on ne veut pas. " CdG
" La véritable école du Commandement est la culture générale. " CdG
" Une société prête à sacrifier un peu de liberté contre un peu de sécurité ne mérite ni l'une ni l'autre et finit par perdre les deux. " B.F
" La gloire se donne seulement à ceux qui l'ont toujours rêvée. " CdG
" La fin de l'espoir est le commencement de la mort. " CdG
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Elechos
Acolyte
Inscrit le: 11 Mai 2004
Messages: 31
Répondre en citant
Posté le : 27/09/2004 14:51:51 Sujet du message :

Merci de prendre le temps de me répondre...Very Happy


Alors ce script je voudrais le coller sur le ondeath des créatures...

Ma vision:

à la mort d'une créature, le script accorde un certain nombre d'xp au tueur, en fonction de son niveau. Si le tueur est en groupe, il reçoit des malus selon les différences de niveau du groupe et la sienne/ à celui de la créature...

je souhaiterais que ce système remplace celui par défault...

La partie supérieure correspondant au lootsage de mes mobs...

Merci
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Semcatala
Grand Sage du Conseil
Inscrit le: 20 Jan 2004
Messages: 951
Répondre en citant
Posté le : 30/09/2004 02:50:33 Sujet du message :

Alors je ne pense pas être totalement de taille pour te répondre , mais je vais essayer tout de même.

En ce qui concerne l'attribution des xp , je crois que l'on ne peut pas gérer ça , ça se fait directement par la petite réglette dans les réglages du module.

Ou alors , il faudrait parvenir a établir une régle mathématique En tenant compte du level de la créature morte et du level du tueur.
Mais là , une question se pose , comment faire a la mort de la bestiole pour savoir combien d'xp viennent d'être attribué au joueur de maniére automatique ?
Car les xp que tu donnera par scripts seront en PLUS des xp donnés automatiquement par le jeu lui même.
Alors là , tu peux régler l'attribution des xp a 0 pour tout le module , mais cela voudra dire que sur CHAQUE créature utilisée , tu devra coller le script qui va bien pour attribuer les xp en fonction du level.

Et là je voudrais poser une question a ceux qui s'y conaissent mieux pour essayer de trouver une solution : est il possible de désactiver l'attribution automatique d'xp sur une seule créature ou alors de savoir combien d'xp viennent d'être attribués automatiquement ?

Au fait , en français , ça veux dire quoi " lootsage de mes mobs " , parceque là je comprends pas tout ! Embarassed
_________________
" La ruse doit être employée pour faire croire que l'on est où l'on est pas, que l'on veut ce qu'on ne veut pas. " CdG
" La véritable école du Commandement est la culture générale. " CdG
" Une société prête à sacrifier un peu de liberté contre un peu de sécurité ne mérite ni l'une ni l'autre et finit par perdre les deux. " B.F
" La gloire se donne seulement à ceux qui l'ont toujours rêvée. " CdG
" La fin de l'espoir est le commencement de la mort. " CdG
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
lendraste
Grand Maître Chanteur du Conseil
Inscrit le: 20 Fév 2003
Messages: 1403
Localisation: Quelque part ailleurs
Répondre en citant
Posté le : 30/09/2004 08:26:44 Sujet du message :

Déjà, le script que tu as posté comporte un élément de trop. Il y a un morceau qui concerne le respawn de créature, les loots et aucune instruction n'est fournie. En revanche si tu retiens uniquement le morceau suivant :
NWScript :

//:Confused///////////////////////// ////////////////////////
//:: SIX_PJ_GAINXP
/*
  Evenement OnDeath pour les NPCs.
  a intgrer dans l'evenement OnDeath des PNJs
  qui est NW_C2_DEFAULT7 par defaut.

  Adjusts killer's alignment if appropriate and
  alerts allies to our death.
*/

//:Confused///////////////////////// ////////////////////////
//:: Copyright (c) 2004 SixOfOne
//:: Created By: DM_Danae
//:: Scripted By : SixOfOne
//:: Created On: 25/08/2004
//::
//:: Version non optimisee
//::
//:: Methode d'appel :
//::
//:: six_pj_gainxp(oKiller, OBJECT_SELF);
//::
//:: a insserrer en fin de procedure sur
//:: l'evenement OnDeath du PNJ
//::
//:Confused///////////////////////// ////////////////////////


// Determiner si le PC est en groupe
int six_IsInGroup(object oPC)
{
  int iNombre = 0;

  // Trouver le premier membre du groupe du PC
  object oMembre = GetFirstFactionMember(oPC, FALSE);

  while( GetIsObjectValid(oMembre) )
  {
    iNombre++;
    oMembre = GetNextFactionMember(oPC, FALSE);
  }

  return ( iNombre > 1 );
}

// Calcul de la valeur absolue pour des float (nombres decimaux)
float six_absfloat(float a)
{
  if ( a < 0.0f )
    a = -a;

  return a;
}

// Si la valeur est negatif on renvoi zero
float six_positifzero(float a)
{
  if (a < 0.0f)
    a = 0.0f;

  return a;
}

// Fonction principale
void six_pj_gainxp(object oKiller, object oDead)
{
  // Level de la creature morte
  float fLvlDead = IntToFloat( GetHitDice(oDead) );

  // Calcul des xp de base
  float fXpDeBase = fLvlDead * 10;

  // Level le plus haut du groupe dans lequel se trouve
  // eventuellement le killer, si pas de groupe c'est son
  // level qui est pris en compte
  float fLvlMax = IntToFloat( GetHitDice( GetFactionStrongestMember(oKiller) ) );

  // Definissions la variable pour stocker le lvl des membres du groupe
  float fLvlMembre = 0.0f;

  // Nous declarons et initialisons la variable des xp a donner aux PCs
  float fXp = 0.0f;

  // Ici, nous determinons si le killer est en groupe ou pas
  int iEnGroupe = six_IsInGroup(oKiller);


  // Traitons cas du joueur seul
  if (!iEnGroupe)
  {

    // ****************************** ****************************** ******
    // *** Ici, nous traitons le cas du PC seul                      ***

    //SendMessageToPC( oKiller, "*** Pas en groupe ***");
    //SendMessageToPC( oKiller, "Lvl creature = " + FloatToString(fLvlDead) );
    //SendMessageToPC( oKiller, "Lvl max      = " + FloatToString(fLvlMax) );
    //SendMessageToPC( oKiller, "Diff Lvl max = " + FloatToString( six_absfloat(fLvlDead - fLvlMax) ) );

    fXp = fXpDeBase + ( fXpDeBase * 0.15f * ( fLvlDead - fLvlMax ) ); // Pas de valeur absolue !!!!
    //SendMessageToPC( oKiller, "fXp (1) = " + FloatToString(fXp) );

    six_positifzero(fXp);

    //SendMessageToPC( oKiller, "fXp (2) = " + FloatToString(fXp) );

    //Don d'xp
    // Doit-on comptabiliser les xp negatifs ?
    if ( GetIsPC(oKiller) )
    {
      GiveXPToCreature( oKiller, FloatToInt(fXp) );
    }

    // ***                                                            ***
    // ****************************** ****************************** ******

  }
  else
  {
    // ****************************** ****************************** ******
    // *** Ici nous traitons le cas pour chacun des membres du groupe ***

    // Modification du calcul des xp de base
    // J'enleve 10% des xp de base
    float fXpGroupe = fXpDeBase - fXpDeBase * 0.1f;

    // J'enleve encore 5% sur le plus grand ecart de lvl entre PCs et creature
    fXpGroupe = fXpGroupe - (fXpDeBase * 0.05f * six_absfloat(fLvlDead - fLvlMax));

    // Trouver le premier membre du groupe du killer
    object oMembreGroupe = GetFirstFactionMember(oKiller, FALSE);

    // Nous refaisons les operations tant que nous n'avons
    // pas balaye tous les membres du groupe
    while( GetIsObjectValid(oMembreGroupe) )
    {
      // Pour prendre en compte les membres du groupe
      // nous testons qu'ils se trouvent bien dans la meme zone
      // que celui qui vient de tuer la creature.
      // Ajoutons a cela que le membre ne doit pas se trouver
      // a plus de 50 metres de la creature morte !

      if(GetArea(oKiller) == GetArea(oMembreGroupe) && GetCurrentHitPoints(oMembreGroupe) > 0 && GetDistanceBetween(oKiller, oMembreGroupe) < 50.0f)
      {

        //SendMessageToPC( oMembreGroupe, "*** En groupe : conditions : ok ***");
        //SendMessageToPC( oMembreGroupe, "Lvl creature = " + FloatToString(fLvlDead) );
        //SendMessageToPC( oMembreGroupe, "Lvl max      = " + FloatToString(fLvlMax) );
        //SendMessageToPC( oMembreGroupe, "Diff Lvl max = " + FloatToString( six_absfloat(fLvlDead - fLvlMax) ) );

        //SendMessageToPC( oMembreGroupe, "fXpGroupe    = " + FloatToString(fXpGroupe) );

        // Level du membre actuel du groupe
        float fLvlMembre = IntToFloat( GetHitDice(oMembreGroupe) );

        // Je calcule les 4% des xpDeBase par lvl de diff entre mob et membre du groupe
        // que je retranche aux xp deja calcules
        fXp = fXpGroupe - (fXpDeBase * 0.04f * six_absfloat(fLvlDead - fLvlMembre));

        //SendMessageToPC( oMembreGroupe, "fXp (1) = " + FloatToString(fXp) );

        six_positifzero(fXp);

        //SendMessageToPC( oMembreGroupe, "fXp (2) = " + FloatToString(fXp) );

        //Don d'xp
        // Doit-on comptabiliser les xp negatifs ?
        if ( GetIsPC(oMembreGroupe) )
        {
          GiveXPToCreature( oMembreGroupe, FloatToInt(fXp) );
        }

      } // Fin du if dans la zone
      else
      {
        //SendMessageToPC( oMembreGroupe, "*** En groupe : conditions : pas ok ***");
        //SendMessageToPC( oMembreGroupe, "Lvl creature = " + FloatToString(fLvlDead) );
        //SendMessageToPC( oMembreGroupe, "Lvl max      = " + FloatToString(fLvlMax) );
        //SendMessageToPC( oMembreGroupe, "Diff Lvl max = " + FloatToString( six_absfloat(fLvlDead - fLvlMax) ) );
      }

      oMembreGroupe = GetNextFactionMember(oKiller, FALSE);

    // ***                                                            ***
    // ****************************** ****************************** ******

    }


  } // Fin du else

  // Pour eviter la redondance du don d'XP.
  SetLocalInt(oDead, "AlreadyDyingEXP", 1);
}

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.



Voici ce qu'il faut en faire :
- Tu ouvres n'importe quel panneau de propriété d'un modèle de créature ou d'une créature déjà placée dans le module.
- Dans l'onglet "scripts", tu cliques sur le bouton pour afficher/modifier le script "OnDeath" de la créature.
- Si tu n'as rien modifié de spécial dans le module et que toutes tes créatures utilisent le script par défaut, tu devrais tomber sur un script qui s'intitule NW_C2_DEFAULT7
- Dans ce script, tu vas repérer deux lignes particulières : l'une commence par #include, l'autre par void main().
- Juste en dessous de la ligne où il y a #include (NB : il pourrait y avoir plusieurs lignes #include qui se trouvent généralement en haut du script, choisi la dernière d'entre elle dans le sens de lecture) tu vas copier/coller le script que j'ai isolé un peu plus haut ici.
- Juste en dessous de la ligne où il y a void main() (cette ligne là, il ne peut y en avoir qu'une seule), tu vas ajouter une ligne qui contient six_pj_gainxp(oKiller, OBJECT_SELF);
- Sauvegarde le tout et recompile le module.

S'il produit une erreur à la compilation lors de la sauvegarde republie le script résultat de l'opération ici, on essaiera de voir ce qui déconne. Normalement le script NW_C2_DEFAULT7 modifié par tes soins devrait avoir la tronche suivante :
- commentaires des programmeurs de Bioware
- lignes #include
- le code issue de ce sujet
- la ligne void main()
- la ligne six_pj_gainxp(oKiller, OBJECT_SELF);
- le reste du script d'origine

Je peux me tromper car je n'ai pas NW_C2_DEFAULT7 sous la main.

En outre, tu dois régler le gain d'expérience à 0% dans les propriétés de ton module. Il se passera que les personnages auront deux messages successifs lors qu'il abattront une créature, un premier leur indiquant qu'ils ont gagné 0XP, un second qui indiquera le montant accordé par ton système. Le premier de ces messages devrait disparaître dans le prochain patch de Bioware (le 1.64) qui a eu la bonne idée de supprimer l'affichage d'un gain de 0XP.

Pour intégrer la partie loot, il faudra y réfléchir plus sérieusement, mais peut-être y avait-il quelques instructions expliquant où il fallait coller ce morceau (des commentaires que tu n'aurais pas copié ?).

Enfin...


Citation :

Et là je voudrais poser une question a ceux qui s'y conaissent mieux pour essayer de trouver une solution : est il possible de désactiver l'attribution automatique d'xp sur une seule créature ou alors de savoir combien d'xp viennent d'être attribués automatiquement ?
On ne peut pas désactiver le gain d'XP pour une seule créature et le seul moyen d'intervenir dessus est la réglette précédemment évoquée, sachant que réduire à 0% signifie abolir les gains, mais le calcul est toujours effectué par le moteur du jeu et affiche "gain de 0 XP" (l'affichage ne sera bientôt plus un problème).

Pour savoir combien d'expérience le joueur est susceptible de gagner, on pourrait le calculer nous-même à partir des fichiers 2DA de Bioware qui contiennent la méthode d'attribution (enfin, il faut savoir les interpréter quand même). Hélas, il se pose un problème. Il y a le calcul de l'XP brute d'une part (celui-là on peut le refaire) mais la valeur de la réglette impose au moteur d'accomplir une opération supplémentaire sur l'XP brute, à savoir, attribuer un pourcentage de cette valeur (entre 0% et 200% si je ne m'abuse), mais il est impossible de connaître cette valeur directement (la méthode indirecte ressemble à une usine à gaz relativement ingérable dans un module). Donc c'est plutôt exclu. En dehors de cette solution, il y en a une plutôt lourde qui consiste à lire régulièrement le niveau d'expérience d'un PJ pour voir les différences. Placée sur le OnHeartBeat du module, une telle pratique consommerait du temps machine et si une différence survenait, on ne saurait pas forcément à quoi elle est due à moins d'observer aussi les action d'un PJ. Cette solution est donc encore plus délirante. Bref, il est plus aisé de trouver d'autres solutions.
_________________
Lendraste de Loreval
Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel.
La cité des mensonges - 1
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Numéro ICQ Ignorer l'utilisateur
 
Elechos
Acolyte
Inscrit le: 11 Mai 2004
Messages: 31
Répondre en citant
Posté le : 30/09/2004 11:01:56 Sujet du message :

Alors,
1. je te remercie beaucoup de prendre le temps de faire m'aider à boucler ce sript qui est assez lourd.
2. il y a effectivement une erreur:
NWScript :
//:Confused///////////////////////// ////////////////////////
//:: NW_C2_DEFAULT7
/*
  Default OnDeath event handler for NPCs.

  Adjusts killer's alignment if appropriate and
  alerts allies to our death.
*/

//:Confused///////////////////////// ////////////////////////
//:: Copyright (c) 2002 Floodgate Entertainment
//:: Created By: Naomi Novik
//:: Created On: 12/22/2002
//:Confused///////////////////////// ////////////////////////

#include "x2_inc_compon"
#include "x0_i0_spawncond"
//Confused////////////////////////// //////////////////////
//:: SIX_PJ_GAINXP
/*
Evenement OnDeath pour les NPCs.
a intgrer dans l'evenement OnDeath des PNJs
qui est NW_C2_DEFAULT7 par defaut.

Adjusts killer's alignment if appropriate and
alerts allies to our death.
*/

//Confused////////////////////////// //////////////////////
//:: Copyright (c) 2004 SixOfOne
//:: Created By: DM_Danae
//:: Scripted By : SixOfOne
//:: Created On: 25/08/2004
//::
//:: Version non optimisee
//::
//:: Methode d'appel :
//::
//:: six_pj_gainxp(oKiller, OBJECT_SELF);
//::
//:: a insserrer en fin de procedure sur
//:: l'evenement OnDeath du PNJ
//::
//Confused////////////////////////// //////////////////////


// Determiner si le PC est en groupe
int six_IsInGroup(object oPC)
{
  int iNombre = 0;

  // Trouver le premier membre du groupe du PC
  object oMembre = GetFirstFactionMember(oPC, FALSE);

  while( GetIsObjectValid(oMembre) )
  {
    iNombre++;
    oMembre = GetNextFactionMember(oPC, FALSE);
  }

  return ( iNombre > 1 );
}

// Calcul de la valeur absolue pour des float (nombres decimaux)
float six_absfloat(float a)
{
  if ( a < 0.0f )
    a = -a;

  return a;
}

// Si la valeur est negatif on renvoi zero
float six_positifzero(float a)
{
  if (a < 0.0f)
    a = 0.0f;

  return a;
}

// Fonction principale
void six_pj_gainxp(object oKiller, object oDead)
{
  // Level de la creature morte
  float fLvlDead = IntToFloat( GetHitDice(oDead) );

  // Calcul des xp de base
  float fXpDeBase = fLvlDead * 10;

  // Level le plus haut du groupe dans lequel se trouve
  // eventuellement le killer, si pas de groupe c'est son
  // level qui est pris en compte
  float fLvlMax = IntToFloat( GetHitDice( GetFactionStrongestMember(oKiller) ) );

  // Definissions la variable pour stocker le lvl des membres du groupe
  float fLvlMembre = 0.0f;

  // Nous declarons et initialisons la variable des xp a donner aux PCs
  float fXp = 0.0f;

  // Ici, nous determinons si le killer est en groupe ou pas
  int iEnGroupe = six_IsInGroup(oKiller);


  // Traitons cas du joueur seul
  if (!iEnGroupe)
  {

    // ****************************** ****************************** ******
    // *** Ici, nous traitons le cas du PC seul ***

    //SendMessageToPC( oKiller, "*** Pas en groupe ***");
    //SendMessageToPC( oKiller, "Lvl creature = " + FloatToString(fLvlDead) );
    //SendMessageToPC( oKiller, "Lvl max = " + FloatToString(fLvlMax) );
    //SendMessageToPC( oKiller, "Diff Lvl max = " + FloatToString( six_absfloat(fLvlDead - fLvlMax) ) );

    fXp = fXpDeBase + ( fXpDeBase * 0.15f * ( fLvlDead - fLvlMax ) ); // Pas de valeur absolue !!!!
    //SendMessageToPC( oKiller, "fXp (1) = " + FloatToString(fXp) );

    six_positifzero(fXp);

    //SendMessageToPC( oKiller, "fXp (2) = " + FloatToString(fXp) );

    //Don d'xp
    // Doit-on comptabiliser les xp negatifs ?
    if ( GetIsPC(oKiller) )
    {
      GiveXPToCreature( oKiller, FloatToInt(fXp) );
    }

    // *** ***
    // ****************************** ****************************** ******

  }
  else
  {
    // ****************************** ****************************** ******
    // *** Ici nous traitons le cas pour chacun des membres du groupe ***

    // Modification du calcul des xp de base
    // J'enleve 10% des xp de base
    float fXpGroupe = fXpDeBase - fXpDeBase * 0.1f;

    // J'enleve encore 5% sur le plus grand ecart de lvl entre PCs et creature
    fXpGroupe = fXpGroupe - (fXpDeBase * 0.05f * six_absfloat(fLvlDead - fLvlMax));

    // Trouver le premier membre du groupe du killer
    object oMembreGroupe = GetFirstFactionMember(oKiller, FALSE);

    // Nous refaisons les operations tant que nous n'avons
    // pas balaye tous les membres du groupe
    while( GetIsObjectValid(oMembreGroupe) )
    {
      // Pour prendre en compte les membres du groupe
      // nous testons qu'ils se trouvent bien dans la meme zone
      // que celui qui vient de tuer la creature.
      // Ajoutons a cela que le membre ne doit pas se trouver
      // a plus de 50 metres de la creature morte !

      if(GetArea(oKiller) == GetArea(oMembreGroupe) && GetCurrentHitPoints(oMembreGroupe) > 0 && GetDistanceBetween(oKiller, oMembreGroupe) < 50.0f)
      {

        //SendMessageToPC( oMembreGroupe, "*** En groupe : conditions : ok ***");
        //SendMessageToPC( oMembreGroupe, "Lvl creature = " + FloatToString(fLvlDead) );
        //SendMessageToPC( oMembreGroupe, "Lvl max = " + FloatToString(fLvlMax) );
        //SendMessageToPC( oMembreGroupe, "Diff Lvl max = " + FloatToString( six_absfloat(fLvlDead - fLvlMax) ) );

        //SendMessageToPC( oMembreGroupe, "fXpGroupe = " + FloatToString(fXpGroupe) );

        // Level du membre actuel du groupe
        float fLvlMembre = IntToFloat( GetHitDice(oMembreGroupe) );

        // Je calcule les 4% des xpDeBase par lvl de diff entre mob et membre du groupe
        // que je retranche aux xp deja calcules
        fXp = fXpGroupe - (fXpDeBase * 0.04f * six_absfloat(fLvlDead - fLvlMembre));

        //SendMessageToPC( oMembreGroupe, "fXp (1) = " + FloatToString(fXp) );

        six_positifzero(fXp);

        //SendMessageToPC( oMembreGroupe, "fXp (2) = " + FloatToString(fXp) );

        //Don d'xp
        // Doit-on comptabiliser les xp negatifs ?
        if ( GetIsPC(oMembreGroupe) )
        {
          GiveXPToCreature( oMembreGroupe, FloatToInt(fXp) );
        }

      } // Fin du if dans la zone
      else
      {
        //SendMessageToPC( oMembreGroupe, "*** En groupe : conditions : pas ok ***");
        //SendMessageToPC( oMembreGroupe, "Lvl creature = " + FloatToString(fLvlDead) );
        //SendMessageToPC( oMembreGroupe, "Lvl max = " + FloatToString(fLvlMax) );
        //SendMessageToPC( oMembreGroupe, "Diff Lvl max = " + FloatToString( six_absfloat(fLvlDead - fLvlMax) ) );
      }

      oMembreGroupe = GetNextFactionMember(oKiller, FALSE);

    // *** ***
    // ****************************** ****************************** ******

    }


  } // Fin du else

  // Pour eviter la redondance du don d'XP.
  SetLocalInt(oDead, "AlreadyDyingEXP", 1);
}


void main()
six_pj_gainxp(oKiller, OBJECT_SELF);
{
    int nClass = GetLevelByClass(CLASS_TYPE_COMMONER);
    int nAlign = GetAlignmentGoodEvil(OBJECT_SELF);
    object oKiller = GetLastKiller();

    // If we're a good/neutral commoner,
    // adjust the killer's alignment evil
    if(nClass > 0 && (nAlign == ALIGNMENT_GOOD || nAlign == ALIGNMENT_NEUTRAL))
    {
        AdjustAlignment(oKiller, ALIGNMENT_EVIL, 5);
    }

    // Call to allies to let them know we're dead
    SpeakString("NW_I_AM_DEAD", TALKVOLUME_SILENT_TALK);

    //Shout Attack my target, only works with the On Spawn In setup
    SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK);

    // NOTE: the OnDeath user-defined event does not
    // trigger reliably and should probably be removed
    if(GetSpawnInCondition(NW_FLAG_DEATH_EVENT))
    {
        SignalEvent(OBJECT_SELF, EventUserDefined(1007));
    }
    craft_drop_items(oKiller);
}
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.


Il me dit :" unknown state in complier en parlant de la ligne: "six_pj_gainxp(oKiller, OBJECT_SELF);"

euh ya aussi un petit point de plus, c'est que la partie supérieure de mon script d'origine correspondait au système de dépots d'objets et d'or ainsi qu'au respawn de mes monstres AVANT que je ne cherche à personnaliser les xp... Il me faut donc le conserver dans mon script ONDEATH...

J'espère que tu pourras m'apporter l'aide dont j'ai besoin (ou toute autre personne)
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
lendraste
Grand Maître Chanteur du Conseil
Inscrit le: 20 Fév 2003
Messages: 1403
Localisation: Quelque part ailleurs
Répondre en citant
Posté le : 30/09/2004 12:07:14 Sujet du message :

Excuse-moi, il y avait une toute petite erreur dans mes explications, il fallait mettre la ligne "six_pj_gainxp(oKiller, OBJECT_SELF);" en dessous de la ligne ou on définit la variable oKiller, donc 4 lignes plus bas.
Voici le script réctifié :

NWScript :
//:Confused///////////////////////// ////////////////////////
//:: NW_C2_DEFAULT7
/*
  Default OnDeath event handler for NPCs.

  Adjusts killer's alignment if appropriate and
  alerts allies to our death.
*/

//:Confused///////////////////////// ////////////////////////
//:: Copyright (c) 2002 Floodgate Entertainment
//:: Created By: Naomi Novik
//:: Created On: 12/22/2002
//:Confused///////////////////////// ////////////////////////

#include "x2_inc_compon"
#include "x0_i0_spawncond"
//Confused////////////////////////// //////////////////////
//:: SIX_PJ_GAINXP
/*
Evenement OnDeath pour les NPCs.
a intgrer dans l'evenement OnDeath des PNJs
qui est NW_C2_DEFAULT7 par defaut.

Adjusts killer's alignment if appropriate and
alerts allies to our death.
*/

//Confused////////////////////////// //////////////////////
//:: Copyright (c) 2004 SixOfOne
//:: Created By: DM_Danae
//:: Scripted By : SixOfOne
//:: Created On: 25/08/2004
//::
//:: Version non optimisee
//::
//:: Methode d'appel :
//::
//:: six_pj_gainxp(oKiller, OBJECT_SELF);
//::
//:: a insserrer en fin de procedure sur
//:: l'evenement OnDeath du PNJ
//::
//Confused////////////////////////// //////////////////////


// Determiner si le PC est en groupe
int six_IsInGroup(object oPC)
{
  int iNombre = 0;

  // Trouver le premier membre du groupe du PC
  object oMembre = GetFirstFactionMember(oPC, FALSE);

  while( GetIsObjectValid(oMembre) )
  {
    iNombre++;
    oMembre = GetNextFactionMember(oPC, FALSE);
  }

  return ( iNombre > 1 );
}

// Calcul de la valeur absolue pour des float (nombres decimaux)
float six_absfloat(float a)
{
  if ( a < 0.0f )
    a = -a;

  return a;
}

// Si la valeur est negatif on renvoi zero
float six_positifzero(float a)
{
  if (a < 0.0f)
    a = 0.0f;

  return a;
}

// Fonction principale
void six_pj_gainxp(object oKiller, object oDead)
{
  // Level de la creature morte
  float fLvlDead = IntToFloat( GetHitDice(oDead) );

  // Calcul des xp de base
  float fXpDeBase = fLvlDead * 10;

  // Level le plus haut du groupe dans lequel se trouve
  // eventuellement le killer, si pas de groupe c'est son
  // level qui est pris en compte
  float fLvlMax = IntToFloat( GetHitDice( GetFactionStrongestMember(oKiller) ) );

  // Definissions la variable pour stocker le lvl des membres du groupe
  float fLvlMembre = 0.0f;

  // Nous declarons et initialisons la variable des xp a donner aux PCs
  float fXp = 0.0f;

  // Ici, nous determinons si le killer est en groupe ou pas
  int iEnGroupe = six_IsInGroup(oKiller);


  // Traitons cas du joueur seul
  if (!iEnGroupe)
  {

    // ****************************** ****************************** ******
    // *** Ici, nous traitons le cas du PC seul ***

    //SendMessageToPC( oKiller, "*** Pas en groupe ***");
    //SendMessageToPC( oKiller, "Lvl creature = " + FloatToString(fLvlDead) );
    //SendMessageToPC( oKiller, "Lvl max = " + FloatToString(fLvlMax) );
    //SendMessageToPC( oKiller, "Diff Lvl max = " + FloatToString( six_absfloat(fLvlDead - fLvlMax) ) );

    fXp = fXpDeBase + ( fXpDeBase * 0.15f * ( fLvlDead - fLvlMax ) ); // Pas de valeur absolue !!!!
    //SendMessageToPC( oKiller, "fXp (1) = " + FloatToString(fXp) );

    six_positifzero(fXp);

    //SendMessageToPC( oKiller, "fXp (2) = " + FloatToString(fXp) );

    //Don d'xp
    // Doit-on comptabiliser les xp negatifs ?
    if ( GetIsPC(oKiller) )
    {
      GiveXPToCreature( oKiller, FloatToInt(fXp) );
    }

    // *** ***
    // ****************************** ****************************** ******

  }
  else
  {
    // ****************************** ****************************** ******
    // *** Ici nous traitons le cas pour chacun des membres du groupe ***

    // Modification du calcul des xp de base
    // J'enleve 10% des xp de base
    float fXpGroupe = fXpDeBase - fXpDeBase * 0.1f;

    // J'enleve encore 5% sur le plus grand ecart de lvl entre PCs et creature
    fXpGroupe = fXpGroupe - (fXpDeBase * 0.05f * six_absfloat(fLvlDead - fLvlMax));

    // Trouver le premier membre du groupe du killer
    object oMembreGroupe = GetFirstFactionMember(oKiller, FALSE);

    // Nous refaisons les operations tant que nous n'avons
    // pas balaye tous les membres du groupe
    while( GetIsObjectValid(oMembreGroupe) )
    {
      // Pour prendre en compte les membres du groupe
      // nous testons qu'ils se trouvent bien dans la meme zone
      // que celui qui vient de tuer la creature.
      // Ajoutons a cela que le membre ne doit pas se trouver
      // a plus de 50 metres de la creature morte !

      if(GetArea(oKiller) == GetArea(oMembreGroupe) && GetCurrentHitPoints(oMembreGroupe) > 0 && GetDistanceBetween(oKiller, oMembreGroupe) < 50.0f)
      {

        //SendMessageToPC( oMembreGroupe, "*** En groupe : conditions : ok ***");
        //SendMessageToPC( oMembreGroupe, "Lvl creature = " + FloatToString(fLvlDead) );
        //SendMessageToPC( oMembreGroupe, "Lvl max = " + FloatToString(fLvlMax) );
        //SendMessageToPC( oMembreGroupe, "Diff Lvl max = " + FloatToString( six_absfloat(fLvlDead - fLvlMax) ) );

        //SendMessageToPC( oMembreGroupe, "fXpGroupe = " + FloatToString(fXpGroupe) );

        // Level du membre actuel du groupe
        float fLvlMembre = IntToFloat( GetHitDice(oMembreGroupe) );

        // Je calcule les 4% des xpDeBase par lvl de diff entre mob et membre du groupe
        // que je retranche aux xp deja calcules
        fXp = fXpGroupe - (fXpDeBase * 0.04f * six_absfloat(fLvlDead - fLvlMembre));

        //SendMessageToPC( oMembreGroupe, "fXp (1) = " + FloatToString(fXp) );

        six_positifzero(fXp);

        //SendMessageToPC( oMembreGroupe, "fXp (2) = " + FloatToString(fXp) );

        //Don d'xp
        // Doit-on comptabiliser les xp negatifs ?
        if ( GetIsPC(oMembreGroupe) )
        {
          GiveXPToCreature( oMembreGroupe, FloatToInt(fXp) );
        }

      } // Fin du if dans la zone
      else
      {
        //SendMessageToPC( oMembreGroupe, "*** En groupe : conditions : pas ok ***");
        //SendMessageToPC( oMembreGroupe, "Lvl creature = " + FloatToString(fLvlDead) );
        //SendMessageToPC( oMembreGroupe, "Lvl max = " + FloatToString(fLvlMax) );
        //SendMessageToPC( oMembreGroupe, "Diff Lvl max = " + FloatToString( six_absfloat(fLvlDead - fLvlMax) ) );
      }

      oMembreGroupe = GetNextFactionMember(oKiller, FALSE);

    // *** ***
    // ****************************** ****************************** ******

    }


  } // Fin du else

  // Pour eviter la redondance du don d'XP.
  SetLocalInt(oDead, "AlreadyDyingEXP", 1);
}


void main()
{
    int nClass = GetLevelByClass(CLASS_TYPE_COMMONER);
    int nAlign = GetAlignmentGoodEvil(OBJECT_SELF);
    object oKiller = GetLastKiller();
   
    six_pj_gainxp(oKiller, OBJECT_SELF);

    // If we're a good/neutral commoner,
    // adjust the killer's alignment evil
    if(nClass > 0 && (nAlign == ALIGNMENT_GOOD || nAlign == ALIGNMENT_NEUTRAL))
    {
        AdjustAlignment(oKiller, ALIGNMENT_EVIL, 5);
    }

    // Call to allies to let them know we're dead
    SpeakString("NW_I_AM_DEAD", TALKVOLUME_SILENT_TALK);

    //Shout Attack my target, only works with the On Spawn In setup
    SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK);

    // NOTE: the OnDeath user-defined event does not
    // trigger reliably and should probably be removed
    if(GetSpawnInCondition(NW_FLAG_DEATH_EVENT))
    {
        SignalEvent(OBJECT_SELF, EventUserDefined(1007));
    }
    craft_drop_items(oKiller);
}
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.


Pour ce qui est des loots, je vais y jeter un oeil, mais je peux déjà te dire que tu ne peux pas mettre cette partie dans le script NW_C2_DEFAULT7 car tu aurais alors 2 fonction "main" dans ce script, ce qui n'est pas possible. Si j'ai un moment, j'essaie de te réintégrer le loots dans le présent script.
_________________
Lendraste de Loreval
Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel.
La cité des mensonges - 1
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Numéro ICQ Ignorer l'utilisateur
 
Elechos
Acolyte
Inscrit le: 11 Mai 2004
Messages: 31
Répondre en citant
Posté le : 30/09/2004 12:36:08 Sujet du message :

Graaaaaaaaaaaaaand MERCI à toi, je vais attendre la version défintive dans ce cas.. Car sans système de loots, j'aurais des ennuis, car c'est le système d'un monde persistant...
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Elechos
Acolyte
Inscrit le: 11 Mai 2004
Messages: 31
Répondre en citant
Posté le : 06/10/2004 10:26:31 Sujet du message :

bjr y aurat-il un talentueux scripteur qui pourrait m'aider à résoudre ce problème? je patauge toujours...
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
diraen
Novice
Inscrit le: 04 Juil 2004
Messages: 15
Répondre en citant
Posté le : 15/10/2004 17:40:24 Sujet du message :

J'ai une question bete Lendraste, mais est ce que ce n'est pas possible de créer le script de loots et de l'appeller avec un "#include" a l'interieur du script de gain d'XP ?
 
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 100.214ms