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 07:29:53


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
tempus
Novice
Inscrit le: 12 Juil 2006
Messages: 15
Répondre en citant
Posté le : 16/07/2006 11:15:34 Sujet du message : [résolu]script inefficace, pourquoi?

bonjour a tous
Voila c'est mon tout premier post, j'espere ne pas me tromper d'endroit et demander correctement cette infos Smile

Tout dabord merci a semcatala qui avait psoter ce script!

Donc je me suis remis a nwn, pour aider un amis, et je me derouillé sur les scripts.

J'ai trouver un script qui m'a paru tres interressant, pour eviter que les joueurs utilise la deco/reco pour revivre, et pour evitez aussi d'avoir un item dans l'inventaire.
Car avant j'utiliser le script qui fonctionne avec un "bobjet de mort", c'est pas tres efficace, pas mal d'erreur, plusieurs objets etc...

Donc je tombe sur des variables donné par "Semcatala"
sur ce topic:
http://www.system-tek.com/nwinter/phpbb2/viewtopic.php?t=5158&postdays=0&postorder=asc&start=0

J'ajoute donc les parties du script de semcatala dans mes fichiers,
" oncliententer "

" onplayerrespawn "

Apres avec l'editeur de script, je rajoute les partie de script pour quand on rez .

Apres je test, et rien, comme si les variables n'avait rien enregistrer du status du perso, car en fesant deco /reco ( apres avoir ete tuer) je suis a nouveau en vie...
Donc je sais que sa viens pas des 2 derniers script modifier :
"nw_s0_raisdead"
"nw_s0_resserec"
Car ceci sont liée a la rezurection, hors je n'ai pas utilisé de rezu.

Sa viens donc des 2 premiers : " oncliententer " et " onplayerdeath "
J'ai du faire une erreur :s

Voila le contenue de ces fichiers:

" oncliententer "
NWScript :
#include "ats_inc_init"
#include "nw_i0_tool"
void main()
{

ATS_InitializePlayer(GetEnteringObject());
      //modif par Loup Artic le 27 Avril 2004, le 2 mai 2004
    //string BroadcastThis="Welcome, ";

    object SendToPC = GetEnteringObject();

    if (GetIsPC(SendToPC))
    {
        string PCNameIs=GetName(SendToPC);
        string WelcomeBegin="Bienvenue, ";
        string WelcomeEnd=", sur mon monde ! Que ta presence mene ton Clan a la victoire !";
        string HRP="(Ce serveur est semi Role Play)";
        string HRP2=".";
        string HRP3="";
        string BroadcastThis=WelcomeBegin + PCNameIs + WelcomeEnd + HRP + HRP2 +HRP3;
        SendMessageToPC(SendToPC, BroadcastThis);
      if (GetItemPossessedBy(SendToPC, "poubelledrop") != OBJECT_INVALID)
      {
        CreateItemOnObject("poubelledrop", SendToPC);
        }



object oPC = GetEnteringObject();

////////////////////////////// ////////////////////////////// /////////////
/// sert a recuperer l'info pour savoir si le pj est mort ou vivant  ///
int BALISE_MORT = GetCampaignInt("bddbvsm","balise_mort", oPC);
////////////////////////////// ////////////////////////////// /////////////


////////////////////////////// ////////////////////////////// /////////////
// sert a detecter si le pj est mort ou vivant, et a le rendre mort  ////
// ou vivant a la conection sur le serveur.                          ////
//                                                                  ////
        if(BALISE_MORT == TRUE ) ////
        { ////
          effect eDeath = EffectDeath(FALSE, FALSE); ////
          ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oPC); ////
        } ////
////////////////////////////// ////////////////////////////// /////////////
}





  object oEntering = GetEnteringObject();
if(HasItem(oEntering, "pierredubien"))
{

      SetLocalString(oEntering, "team", "good");
  }
if(HasItem(oEntering, "pierredumal"))
{

      SetLocalString(oEntering, "team", "evil");

    }

//object oPlayer = GetEnteringObject();
//if (GetIsPC (oPlayer))
//{
                  // if(GetItemPossessedBy(oPlayer, "aide-dm") != OBJECT_INVALID)
                    //{
                    //CreateItemOnObject("kic kpc", oPlayer);
                  // CreateItemOnObject("zone- aide-dm", oPlayer);
                    //CreateItemOnObject("pou belledrop", oPlayer);
                  // }
                  // }
//}
object oPlayer = GetEnteringObject();
if (GetIsDM(oPlayer) == TRUE)
    {
      if (GetItemPossessedBy(oPlayer, "kickpc") == OBJECT_INVALID)
      {
                CreateItemOnObject("kickpc",oPlayer);
                                  }
}
}

/*object oPlayer = GetEnteringObject();
if (GetIsDM(oPlayer) == TRUE)
    {
      string sTag = "md";
      object oTarget = GetObjectByTag(sTag);

AssignCommand(oPlayer,JumpToObject(oTarget));
      {
                }
                }
                }/* suspect block end found !*/

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.


ET le " onplayerdeath ":

NWScript :
//:Confused///////////////////////// /////////////////////
//:: Death Script
//:: NW_O0_DEATH.NSS
//:: Copyright (c) 2001 Bioware Corp.
//:Confused///////////////////////// ////////////////////
/*
    This script handles the default behavior
    that occurs when a player dies.
*/

//:Confused///////////////////////// ////////////////////
//:: Created By: Brent Knowles
//:: Created On: November 6, 2001
//:Confused///////////////////////// ////////////////////
/*
void ClearAllFactionMembers(object oMember, object oPlayer)
{
//    AssignCommand(oMember, SpeakString("here")) ;
    AdjustReputation(oPlayer, oMember, 100);
    SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad&qu ot;, 10); // * Player bad
    object oClear = GetFirstFactionMember(oMember, FALSE);
    while (GetIsObjectValid(oClear) == TRUE)
    {
        ClearPersonalReputation(oPlaye r, oClear);
        oClear = GetNextFactionMember(oMember, FALSE);
    }
}  */

#include "nw_i0_plot"
void dialomort(int dialo,object oPlayer)
    { //object oPlayer = GetLastPlayerDied();
        if (GetIsDead(oPlayer))
        {
        switch(dialo)
            {case 1: AssignCommand(oPlayer, SpeakString("A l'aide !"));break;
            case 2: AssignCommand(oPlayer, SpeakString(" Sauvez....moi !")); break;
            case 3: AssignCommand(oPlayer, SpeakString("Je souffre !")); break;
            case 4: AssignCommand(oPlayer, SpeakString("Ma vie va prendre fin..."));break;
            case 5: AssignCommand(oPlayer, SpeakString("Je me sens partir !")); break;
        } }
    }
  void mortoupas(object oPlayer)
  { //object oPlayer = GetLastPlayerDied();
  int nXP = GetXP(oPlayer);
    int nPenalty = 50 * GetHitDice(oPlayer);
    int nHD = GetHitDice(oPlayer);
    // * You can not lose a level with this respawning
    int nMin = ((nHD * (nHD - 1)) / 2) * 1000;

    int nNewXP = nXP - nPenalty;
    if (nNewXP < nMin)
      nNewXP = nMin;

    int nGoldToTake = FloatToInt(0.10 * GetGold(oPlayer));
    // * a cap of 20 000gp taken from you
    if (nGoldToTake > 10000)
    {
        nGoldToTake = 10000;

    }

        if (GetIsDead(oPlayer))
        { location lLoc = GetLocation(oPlayer );
  if(HasItem(oPlayer, "pierredumal"))
    { //objet cree par terre

        CreateObject(OBJECT_TYPE_ITEM, "objetdumal", lLoc);

    }
    if(HasItem(oPlayer, "pierredubien"))
    {

        CreateObject(OBJECT_TYPE_ITEM, "objetdubien", lLoc);
    }
      // TakeGoldFromCreature (nGoldToTake, oPlayer, TRUE);
AssignCommand(oPlayer, TakeGoldFromCreature(nGoldToTake, oPlayer, TRUE));
        effect eVisual = EffectResurrection();
  ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oPlayer);
      AssignCommand(oPlayer, SpeakString("(Respawn Automatique !)"));
    SetXP(oPlayer, nNewXP);
  object oSpawnPoint = GetObjectByTag("NW_DEATH_TEMPLE");
AssignCommand(oPlayer,JumpToLocation(GetLocation(oSpawnPoint)) );
DestroyObject( GetItemPossessedBy(oPlayer,"mort"));
    //SetLocalInt(oPlayer, "activemort", 0);
        }
  }
void Raise(object oPlayer)
{
        effect eVisual = EffectVisualEffect(VFX_IMP_DESTRUCTION); //VFX_IMP_RESTORATION

        effect eBad = GetFirstEffect(oPlayer);
        ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oPlayer);
        ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oPlayer)), oPlayer);

        //Search for negative effects
        while(GetIsEffectValid(eBad))
        {
            if (GetEffectType(eBad) == EFFECT_TYPE_ABILITY_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_AC_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_ATTACK_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_SAVING_THROW_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_SPELL_RESISTANCE_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_SKILL_DECREASE ||
                GetEffectType(eBad) == EFFECT_TYPE_BLINDNESS ||
                GetEffectType(eBad) == EFFECT_TYPE_DEAF ||
                GetEffectType(eBad) == EFFECT_TYPE_PARALYZE ||
                GetEffectType(eBad) == EFFECT_TYPE_NEGATIVELEVEL)
                {
                    //Remove effect if it is negative.
                    RemoveEffect(oPlayer, eBad);
                }
            eBad = GetNextEffect(oPlayer);
        }
        //Fire cast spell at event for the specified target
        SignalEvent(oPlayer, EventSpellCastAt(OBJECT_SELF, SPELL_RESTORATION, FALSE));
        ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oPlayer);
}

void main()
{
    object oPlayer = GetLastPlayerDied();
    int iDied = GetLocalInt(oPlayer,"iDied"); //peut etre pas
    ++iDied;
    SetLocalInt(oPlayer,"iDied",iDied);





object oDeadPlayer=GetLastPlayerDied();
//object oPlayer=GetLastPlayerDied();
string sDeadPlayer=GetName(oDeadPlayer);
object oDeathArea=GetArea(oDeadPlayer);
string sDeathArea=GetTag(oDeathArea);
string sDeadOne="";
string sAreaName=GetName(oDeathArea);


string sSayDeath=sDeadPlayer+sDeadOne+sAreaName;
SendMessageToAllDMs(sSayDeath);


    object oKiller = GetLastKiller(); //a virer
    if (GetIsPC(oKiller) && GetIsPC(oPlayer))
        {
        int iKilled = GetLocalInt(oPlayer,"iKilled"); //peut etre pas
        ++iKilled;
        SetLocalInt(oPlayer,"iKilled",iKilled);
        //string PKReport="PK report: "+GetName(oKiller)+" (Lv "+IntToString(GetHitDice( oKiller))+" -CD key="+GetPCPublicCDKey(oK iller)+") a tue "+GetName(oPlayer)+" (Lv "+IntToString(GetHitDice( oPlayer))+" - CD key="+GetPCPublicCDKey(oP layer)+")";
      string PKReport="PK report: "+GetName(oKiller)+" (Lv "+IntToString(GetHitDice(oKiller))+" a tue "+GetName(oPlayer)+" (Lv "+IntToString(GetHitDice(oPlayer));
        WriteTimestampedLogEntry(PKReport);
        SendMessageToAllDMs(PKReport);


//---------------------------- ------------------------------ -------------//
//            On met une balise de mort au pj qui vient de mourir.      //
//---------------------------- ------------------------------ -------------//
// sert a declarer une balise pour "marquer" le pj a la mort.

          SetCampaignInt("bddbvsm","balise_mort",TRUE,oPlayer);

//---------------------------- ------------------------------ -----------//


        }
///////////////////////////
//FAB : creation objet de mort
//////////////////////////////
//object oPlayer = GetLastPlayerDied();
//CreateItemOnObject("mor t", oPlayer, 1); // cree objet mort
//////////////////////////////


  //  string sArea = GetTag(GetArea(oPlayer));
  //  if (sArea == "M4Q1D2" || sArea == "M3Q3C" || sArea == "MAP_M1Q6A")
  // {

        //Raise(oPlayer);
        //string sDestTag = "M4QD07_ENTER";
        //object oSpawnPoint = GetObjectByTag(sDestTag);
//        AssignCommand(oPlayer, DelayCommand(1.0, JumpToLocation(GetLocation(oSp awnPoint))));
// * MAY 2002: Just popup the YOU ARE DEAD panel at this point
    //  DelayCommand(2.5, PopUpDeathGUIPanel(oPlayer,FAL SE, TRUE, 66487));
    //  return;
  // }



    AssignCommand(oPlayer, ClearAllActions());
    // * Note: waiting for Sophia to make SetStandardFactionReptuation to clear all personal reputation
    if (GetStandardFactionReputation(STANDARD_FACTION_COMMONER, oPlayer) <= 10)
    { SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad
        SetStandardFactionReputation(STANDARD_FACTION_COMMONER, 80, oPlayer);
    }
    if (GetStandardFactionReputation(STANDARD_FACTION_MERCHANT, oPlayer) <= 10)
    { SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad
        SetStandardFactionReputation(STANDARD_FACTION_MERCHANT, 80, oPlayer);
    }
    if (GetStandardFactionReputation(STANDARD_FACTION_DEFENDER, oPlayer) <= 10)
    { SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad
        SetStandardFactionReputation(STANDARD_FACTION_DEFENDER, 80, oPlayer);
    }

    DelayCommand(2.5, PopUpGUIPanel(oPlayer,GUI_PANEL_PLAYER_DEATH));

DelayCommand(10.5, dialomort(1,oPlayer));
DelayCommand(50.5,dialomort(2,oPlayer));
DelayCommand(80.5,dialomort(3,oPlayer));
DelayCommand(120.5,dialomort(4,oPlayer));
DelayCommand(150.5,dialomort(5,oPlayer));
DelayCommand(180.5, mortoupas(oPlayer));
DelayCommand(200.5, DestroyObject( GetItemPossessedBy(oPlayer,"mort")));
}
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.


PS: Il y a beaucoups de repetitions, et c'est assez mal organisé ( beaucoups de commande inutile laisser en plan ^^ et des repet comme "object xxx = GetEnteringObject(); " qui aparait plusieurs fois ^^

Merci beaucoups d'avance Smile
Dernière édition par tempus le 19/07/2006 15:48:12; édité 1 fois
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
kiky.le.magnifique
Homme très gay
Inscrit le: 19 Sep 2003
Messages: 907
Localisation: Camping de la nation martienne...
Répondre en citant
Posté le : 16/07/2006 13:31:22 Sujet du message :

Dans ton onplayerdeath tu as mis le :
SetCampaignInt("bddbvsm","balise_mort",TRUE,oPlayer);

à l'intérieur de ta condition :
if (GetIsPC(oKiller) && GetIsPC(oPlayer))
{
//script
}


donc ton serveur n'enregistrera la mort que si elle est dû à un autre personnage joueur, et non pas par un monstre.

Peut être que ça vient de là, si c'est le cas, suffit de mettre ce SetCampaign au tout début du main de ton script :
NWScript :
void main()
{
object oPlayer = GetLastPlayerDied();
SetCampaignInt("bddbvsm","balise_mort",TRUE,oPlayer);
int iDied = GetLocalInt(oPlayer,"iDied");
//etc...
}
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.

_________________
http://perso.wanadoo.fr/kikitor | Deviant Art | www.VistaEntraide.com | CCLLSELFV! | D-lire_K | Viendez rêver au Pays des fées... | Ne taquinez pas l'admin!
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
tempus
Novice
Inscrit le: 12 Juil 2006
Messages: 15
Répondre en citant
Posté le : 16/07/2006 16:31:16 Sujet du message :

oula , ouep, en effet, c'etait pas volontaire, je pensai l'avoir mis juste sous void main :s

merci de m'avoir fait remarquer cette erreur, j'espere que sa vien de la !

EDIT: Aparament sa marche!!!! grand merci Wink

PS: je sais pas trop la procedure, je doit editer mon post pour ajouter resolu dans le titre?
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
kiky.le.magnifique
Homme très gay
Inscrit le: 19 Sep 2003
Messages: 907
Localisation: Camping de la nation martienne...
Répondre en citant
Posté le : 16/07/2006 19:46:17 Sujet du message :

Oui, ça serait bien, merci bien ^^
_________________
http://perso.wanadoo.fr/kikitor | Deviant Art | www.VistaEntraide.com | CCLLSELFV! | D-lire_K | Viendez rêver au Pays des fées... | Ne taquinez pas l'admin!
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur 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 60.313ms