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 13:21:04


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Yan the salor
Seigneur
Inscrit le: 03 Oct 2004
Messages: 151
Répondre en citant
Posté le : 06/04/2005 14:40:32 Sujet du message : Script ondying

Voici mon "onplayerdying". Je souhaiterai rajouter une pénalité immédiate d'xp avant le respawn éventuel du joueur, pour le cas où il est rappelé à la vie, que la pénalité soit déjà effectuée.
De plus je voudrais que l'un des objets porté sur le joueur soit détruit au hasard.
Merci beaucoup de votre temps.

NWScript :
#include "NW_I0_GENERIC"
void bleed(int iBleedAmt)
{
    object oDying = GetLocalObject(OBJECT_SELF, "PCName");
    int iDCC = GetLocalInt(oDying, "iPCDCC");
    iDCC = iDCC + 1;
    int iDC;
    int iDCBase = 10; //Jet de stabilisation
    iDC = iDCBase;
    if(iDCC > iDCBase){
        iDC = iDCC;
    }
    effect eBleedEff;
    if (GetCurrentHitPoints() <= 0){
        if (iBleedAmt > 0){
            eBleedEff = EffectDamage(iBleedAmt);
        }else{
            eBleedEff = EffectHeal(-iBleedAmt);
        }
        ApplyEffectToObject(DURATION_TYPE_INSTANT, eBleedEff, oDying);
        if (GetCurrentHitPoints() <= -10){
            //Mort
            PlayVoiceChat(VOICE_CHAT_DEATH);
            ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DEATH), OBJECT_SELF);
            ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oDying);
            return;
            }
        if (iBleedAmt > 0){
            int iConBonus = GetAbilityModifier(ABILITY_CONSTITUTION, oDying);
            int iStableRoll = d20() + iConBonus;
            SendMessageToPC(oDying, "Jet de stabilisation : "+IntToString(iStableRoll-iConBonus)+"+"+IntToString(iConBonus)+"="+IntToString(iStableRoll));
            SendMessageToPC(oDying, "Jet de reussite : "+IntToString(iDC));
            if(iStableRoll >= iDC){
                //stabilisation
                iBleedAmt = -iBleedAmt;
                PlayVoiceChat(VOICE_CHAT_LAUGH);
                SendMessageToPC(oDying, "Vous avez reussi a vous stabiliser et commencez doucement a vous remettre.");
            }else{
                switch (d6()){
                    case 1: PlayVoiceChat(VOICE_CHAT_PAIN1); break;
                    case 2: PlayVoiceChat(VOICE_CHAT_PAIN2); break;
                    case 3: PlayVoiceChat(VOICE_CHAT_PAIN3); break;
                    case 4: PlayVoiceChat(VOICE_CHAT_HEALME); break;
                    case 5: PlayVoiceChat(VOICE_CHAT_NEARDEATH); break;
                    case 6: PlayVoiceChat(VOICE_CHAT_HELP);
                }
            }
        }
        if(GetCurrentHitPoints() <= 0){
            SetLocalInt(oDying, "iPCDCC", iDC);
            DelayCommand(6.0,bleed(iBleedAmt));
        } else {
            //fin du coma
            int i;
            object oAttacker = GetNearestCreature(CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY,oDying, i);
            while(GetIsObjectValid(oAttacker) && GetDistanceToObject(oAttacker) < 20.0){
                if(!GetIsInCombat(oAttacker)) DelayCommand(IntToFloat(Random(6)),AssignCommand(oAttacker,DetermineCombatRound()));
                oAttacker = GetNearestCreature(CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY,oDying, ++i);
            }
        }
    }
}

void main(){
    object oDying = GetLastPlayerDying();
    SetLocalObject(oDying, "PCName", oDying);
    SetLocalInt(oDying, "iPCDCC", 0);
    AssignCommand(oDying, ClearAllActions());
    AssignCommand(oDying, bleed(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.


note de finipe : pense aux balises [ nwscript] et [ /nwscript] (sans les espaces) pour mettre du code dans ton message, c'est vachement plus bô Cool
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Stan
Grand Chevalier
Inscrit le: 07 Avr 2005
Messages: 126
Répondre en citant
Posté le : 08/04/2005 09:56:59 Sujet du message :

Je suis peut-être dans l'erreur mais une perte d'xp et un objet détruit c'est mieux de mettre ça dans le onplayerdeath.

Car même quand on se fait rez, on active ce script.

Tu peux poster ton OnPlayerDeath ? (en balise nwnscript stp cette fois Very Happy)
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Yan the salor
Seigneur
Inscrit le: 03 Oct 2004
Messages: 151
Répondre en citant
Posté le : 10/04/2005 19:19:28 Sujet du message :

Voilà comme demandé mon onplayerdeath

NWScript :
#include "NW_I0_GENERIC"
void bleed(int iBleedAmt)
{
    //OnDeath personnalise

#include "rav_include"


void ClearAllFactionMembers(object oMember, object oPlayer)
{
//    AssignCommand(oMember, SpeakString("here")) ;
    AdjustReputation(oPlayer, oMember, 100);
    SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad
    object oClear = GetFirstFactionMember(oMember, FALSE);
    while (GetIsObjectValid(oClear) == TRUE)
    {
        ClearPersonalReputation(oPlayer, oClear);
        oClear = GetNextFactionMember(oMember, FALSE);
    }
}

void main()
{
    object oPlayer = GetLastPlayerDied();

    //Ajouter le joueur a la liste des morts et incrementer le nombre de morts
    object module = GetModule();
    int numdead = GetLocalInt(module, "numdead");
    numdead++;
    SetLocalInt(module, "numdead", numdead);
    SetLocalObject(module,"deadplayer"+IntToString(numdead),oPlayer);

    // * 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.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Stan
Grand Chevalier
Inscrit le: 07 Avr 2005
Messages: 126
Répondre en citant
Posté le : 11/04/2005 00:12:45 Sujet du message :

Premiere question toute bête :

NWScript :
if (sArea == "M4Q1D2" || sArea == "M3Q3C" || sArea == "MAP_M1Q6A")
    {
        DelayCommand(2.5, PopUpDeathGUIPanel(oPlayer,FALSE, TRUE, 66487));
        return;
    }
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.


Elles ont quoi ces maps de spécial pour interdire un respawn du joueur ? Est-ce un module multi ? si oui tes joueurs vont peut-être pas aimer d'être bloqué sur ces 3 cartes là Very Happy


NWScript :


    object oPlayer = GetLastPlayerDied();
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.


à la suite de ça par exemple tu peux mettre la perte d'xp, il la perdra avant même de voir son panneau d'attente ou de respawn.

NWScript :

int nXP=GetHitDice(oPlayer)*140;
nXP=GetXP(oPlayer)-nXP;
SetXP(oPlayer, nXP);
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.



On lui fait perdre son niveau * 140.

PS : attention cette méthode permet de level down, si tu ne veux pas qu'ils level down, précise le il faudra changer le script.


*va préparer le script de destruction d'item*

Edit : après courte réfléxion on a plusieurs options à décider.Veux tu que le PJ ait une chance d'échapper à la destruction ou doit on fouiller tout son équipement porté jusqu'à trouver un truc à supprimer ? (cad si t'as juste une arme et une armure, l'un des deux se fait supprimer)

Doit-on s'occuper de tous les joueurs ? meme les levels 1 ? (cette question se pose dans le cas où tu déciderais qu'obligatoirement un item soit supprimé, car un pauvre level 1 avec une armure et une arme, deux mort et il est à poil sans or)

L'item doit-il être supprimé ou juste droppé pour laisser une chance de le récuperer ?
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Lisan Anthelus
Chevalier
Inscrit le: 31 Mai 2004
Messages: 73
Localisation: Lyon (FRANCE)
Répondre en citant
Posté le : 11/04/2005 03:58:00 Sujet du message :

A la question toute bête de Stan, le script en question est customisé.
Il s'agit d'un bout de script de la campagne officielle SOU (on y lit ,d'ailleurs, les commentaires au dessus faisant référence à la pierre des origines et au passage dans le globe. Il y a même Castle Never qui concerne peut-être la salle où l'on va combattre Desther).
_________________
Un cerveau... c'est fait pour agir.
La pensée n'est là que pour rendre plus efficace l'action
.

H. Laborit

 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur MSN Messenger Ignorer l'utilisateur
 
Yan the salor
Seigneur
Inscrit le: 03 Oct 2004
Messages: 151
Répondre en citant
Posté le : 11/04/2005 17:12:47 Sujet du message :

Vraiment gentil de s'occuper de moi ainsi...
Pour la perte d'objet je voudrais un des objets porté au hasard à coups surs (genre l'armure ou l'épée ou un anneau porté).
Merci encore, je teste la première partie...
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Stan
Grand Chevalier
Inscrit le: 07 Avr 2005
Messages: 126
Répondre en citant
Posté le : 11/04/2005 17:57:16 Sujet du message :

Voilà le script qui devrait virer un item à coup sur.J'espere qu'il fonctionne Razz

Ecris grâce à une petite aide de kiki (encore merci kiki pour les prédéclarations).

NWScript :
void vireritem(int De,object oCreature);

void sup(int Slot,object oCreature, int De){

if (GetItemInSlot(Slot,oCreature)!=OBJECT_INVALID) DestroyObject(GetItemInSlot(Slot,oCreature)); //si l'objet est valide on le supprime

else {
int oTentative=GetLocalInt(oCreature,"tentative");

if (oTentative<12){

SetLocalInt(oCreature,"tentative",(oTentative+1));
vireritem(De+1,oCreature);
                  }
    }
                                          }



void vireritem(int De, object oCreature){

if (De>11) De=1;

switch (De){

case 1: sup(INVENTORY_SLOT_ARMS, oCreature, De); //on vire les bracelets si possible
        break;

case 2: sup(INVENTORY_SLOT_BELT, oCreature, De); //on vire la ceinture si possible
        break;

case 3: sup(INVENTORY_SLOT_BOOTS, oCreature, De); //on vire les bottes si possible
        break;

case 4: sup(INVENTORY_SLOT_CHEST, oCreature, De); //on vire l'armure si possible
        break;

case 5: sup(INVENTORY_SLOT_CLOAK, oCreature, De); //on vire la cape si possible
        break;

case 6: sup(INVENTORY_SLOT_HEAD, oCreature, De); //on vire le casque si possible
        break;

case 7: sup(INVENTORY_SLOT_LEFTHAND, oCreature, De); //on vire l'objet main gauche si possible
        break;

case 8: sup(INVENTORY_SLOT_LEFTRING, oCreature, De); //on vire l'anneau gauche si possible
        break;

case 9: sup(INVENTORY_SLOT_NECK, oCreature, De); //on vire l'amulette si possible
        break;

case 10: sup(INVENTORY_SLOT_RIGHTHAND, oCreature, De); //on vire l'objet main droite si possible
        break;

case 11: sup(INVENTORY_SLOT_RIGHTRING, oCreature, De); //on vire l'objet main gauche si possible
        break;

          }}

void main(){

object oPlayer = GetLastPlayerDied();

SetLocalInt(oPlayer,"tentative",1);
vireritem(d8(1)+d4(1)-1,oPlayer);

DeleteLocalInt(oPlayer,"tentative");



//ici tu remet le reste de ton script de ondeath

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


Plus qu'à prier pour que cela fonctionne car je me suis heurté à des problèmes que je n'avais pas imaginé avant de me lancer dans le script Sad
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Yan the salor
Seigneur
Inscrit le: 03 Oct 2004
Messages: 151
Répondre en citant
Posté le : 11/04/2005 18:49:06 Sujet du message :

Euh ça compile pas...
Cette ligne là, il me dit:
NWScript :

void vireritem(int De,object oCreature);
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.

UNKNOWN STATE IN COMPILER

J'ai tout mis à la suite de
NWScript :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.


Qu'est-ce que t'en pense?
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Yeziliclick
Seigneur
Inscrit le: 13 Fév 2005
Messages: 235
Répondre en citant
Posté le : 11/04/2005 18:55:18 Sujet du message :

la déclaration des fonctions se fait en dehors du main si je me rappelle bien mes cours de prog.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Yan the salor
Seigneur
Inscrit le: 03 Oct 2004
Messages: 151
Répondre en citant
Posté le : 11/04/2005 19:10:26 Sujet du message :

bé oui, ça compile, je vais tester ça merci.

TROP GENIAL ça FONCTIONNE, vraiment merci, je suis super content (non non je vais pas vomir...)

Merci à vous deux. je recommande le script si quelqu'un veut s'en servir.
Dernière édition par Yan the salor le 12/04/2005 12:18:11; édité 1 fois
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Stan
Grand Chevalier
Inscrit le: 07 Avr 2005
Messages: 126
Répondre en citant
Posté le : 11/04/2005 20:32:29 Sujet du message :

J'aimerais juste savoir si cela fonctionne réellement, car que ça compile ça je le savais déjà Very Happy

A tester aussi avec un PJ totalement nu, voir si la boucle se termine réellement.



Oui faut effectivement déclarer les "3" fonctions avant le main, comme je l'ai fais sur mon post.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Yan the salor
Seigneur
Inscrit le: 03 Oct 2004
Messages: 151
Répondre en citant
Posté le : 12/04/2005 12:19:05 Sujet du message :

Oui, pas de pblm, ça fonctionne nickel, merci.
 
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 90.89ms