La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 23/11/2024 22:57:59


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Inquisiteur-Loh
Acolyte
Inscrit le: 26 Fév 2005
Messages: 22
Répondre en citant
Posté le : 18/08/2005 01:54:26 Sujet du message : OnPlayerDeath, chasseur de primes (et autres joies)

Bonjour, voici un script que j'ai mis dans le OnPlayerDeath d'un module multijoueur.

Le script est sencé à la mort d'un personnage :1- Vérifier si l'objet de tag "contrat" possédé par le PJ tué possède la variable "hitme" supérieure ou égale à 1.
2- Vérifier si la créature qui l'a séché est un Personnage Joueur (PC)

Si ces deux conditions sont réunies :
1- On augmente la variable "gob" de l'objet "contrat" détenu par le tueur de la valeur "hitme" de l'objet "contrat" possédé par le PJ tué.
2- On remet à zéro la valeur "hitme" de l'objet "contrat" possédé par le PJ tué.
3- On incrémente de 1 la variable "killer" de l'objet "contrat" possédé par le tueur.
4- On incrémente de 1 la variable "morts" de l'objet "contrat" possédé par le PJ tué.
5- Le mort crie "Le personnage <tueur> a obtenu une prime de <variable "hitme"> PO en me tuant. Il n'y a plus de prime sur ma tête".

Voici le script (c'est le script de base avec un rajout, je m'inquiete surtout de l'efficacité du GetLastKiller() sur le script OnPlayerDeath. Notez que le script compile.

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.

    BK: October 8 2002: Overriden for Expansion
*/

//: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);
    }
}  */

void Raise(object oPlayer)
{
        effect eVisual = EffectVisualEffect(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()
{
    //Mode chasseur de primes, verifie si le PJ avait une prime sur lui...
    object oPlayer = GetLastPlayerDied();
    object oKiller = GetLastKiller();
    int nInt;
    nInt = GetLocalInt(GetItemPossessedBy(oPlayer, "contrat"), "hitme");
    if ((GetIsPC(oKiller)) && (GetLocalInt(GetItemPossessedBy(oPlayer, "contrat"), "hitme") >= 1))
    {
        int nLoh;
        nLoh = GetLocalInt(GetItemPossessedBy(oKiller, "contrat"), "gob");
        string sPrime = IntToString(nInt);
        string sTueur = GetName(oKiller);
        string sAccount = GetPCPlayerName(oPlayer);
        nLoh += nInt;

        SetLocalInt(GetItemPossessedBy(oKiller, "contrat"), "gob", nLoh);//Recompense le tueur qui ira toucher la tune chez le chasseur de primes
        SetLocalInt(GetItemPossessedBy(oPlayer, "contrat"), "hitme", 0);//Annule la prime mise sur la tete du joueur
        SpeakString("Le personnage " + sTueur + "(" + sAccount + ") a obtenu une prime de" + sPrime + " PO en me tuant. Il n'y a plus de prime sur ma tete", TALKVOLUME_SHOUT);//Le gueule sur tous les toits
        //Ajoute un meurtre au sanglant compteur du tueur
        int nDied;
        nDied = GetLocalInt(GetItemPossessedBy(oKiller, "contrat"), "killer");
        nDied += 1;
        SetLocalInt(GetItemPossessedBy(oKiller, "contrat"), "killer",nDied);
    }
    //Compteurs de nombre de fois ou le PJ s'est fait tuer...
    //Stocke dans la variable "morts"
    int nDeath;
    nDeath = GetLocalInt(GetItemPossessedBy(oPlayer, "contrat"), "morts");
    nDeath += 1;
    SetLocalInt(GetItemPossessedBy(oPlayer, "contrat"), "morts",nDeath);
    // * increment global tracking number of times that I died
    SetLocalInt(oPlayer, "NW_L_PLAYER_DIED", GetLocalInt(oPlayer, "NW_L_PLAYER_DIED") + 1);

    // * BK: Automation Control. Autopcs ignore death
    if (GetLocalInt(oPlayer, "NW_L_AUTOMATION") == 10)
    {
        Raise(oPlayer);
        DelayCommand(1.0, ExecuteScript("crawl", OBJECT_SELF));
        return; // Raise and return
    }


    // * Handle Spirit of the Wood Death
    string sArea = GetTag(GetArea(oPlayer));
/*
    if (sArea == "MAP_M2Q2F2" &amp;&amp; GetDistanceBetweenLocations(Ge tLocation(GetObjectByTag(" ;M2Q2F2_M2Q2G")), GetLocation(oPlayer)) &lt; 5.0 &amp;&amp; GetLocalInt(GetModule()," NW_M2Q2E_WoodsFreed") == 0)
    {
        int bValid;

        Raise(oPlayer);
        string sDestTag = "WP_M2Q2GtoM2Q2F";
        object oSpawnPoint = GetObjectByTag(sDestTag);
        AssignCommand(oPlayer,JumpToLo cation(GetLocation(oSpawnPoint )));
        return;

    }
*/

    // * in last level of the Sourcestone, move the player to the beginning of the area
    // * May 16 2002: or the main area of the Snowglobe (to prevent plot logic problems).
    // * May 21 2002: or Castle Never
    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,FALSE, TRUE, 66487));
        return;
    }

    // * make friendly to Each of the 3 common factions
    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));

}
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.


Je vous remercie par avance de vos conseils et réponses.

Inki.
_________________
Inquisiteur Loh
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Elandil2
Chevalier
Inscrit le: 14 Fév 2005
Messages: 97
Localisation: sur mon ordi loir-et-cher
Répondre en citant
Posté le : 18/08/2005 11:47:07 Sujet du message :

Salut a toi.

je n'en sais rien mais je suppose : tu utilise "while" pour rechercher tous les effets présent sur ton PJ (ce qui est très judicieux) mais une fois que tous les effets que tu veux enlever le seront, si il reste des effets mais que tu ne veux pasz enlever, il va pourtant continuer a chercher les effets ... et ce sans fin, ce qui à la longue rend ce script très lourd pour ton moduule ...

Mais ceci n'est qu'une supposition elle est a vérifier ...

Sinon tu peux gagner un^peu de place dans ton script :
NWScript :
nInt = GetLocalInt(GetItemPossessedBy(oPlayer, "contrat"), "hitme");
if ((GetIsPC(oKiller)) && (GetLocalInt(GetItemPossessedBy(oPlayer, "contrat"), "hitme") >= 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.

A transformer en ça :

NWScript :
nInt = GetLocalInt(GetItemPossessedBy(oPlayer, "contrat"), "hitme");
if ((GetIsPC(oKiller)) && nInt >=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.


A part ça, ça m'a l'air plutot très bien ! ^^
_________________
Rejoignez nous sur notre forum
Aelor, module en construction
Vive Gimli

 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger 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 72.688ms