Login: Pass:
Slayne



Inscrit le: 02 Oct 2006
Messages: 33
Message Posté le: 29/11/2006 19:52 Sujet du message: [Probléme] création d'un script de mort/respawn du Pj
Voila, je prefere lancer un nouveau post afin de régler mon probléme de script. Voici les 2 scripts que j'ai essayé de faire afin d'obtenir à la mort du Pj, la création d'une amulette (pour voir plus tard un systéme d'anti triche pour déco reco), une perte d'or et d'xp lors du respawn du Pj à un point X.

J'ai bien ma fenêtre avec les différents choix [ Respawn; Attendre de l'aide; Menu principal]

Mais lorsque je clic sur la touche "Respawn" Rien ne ce passe. Ni la création de l'amulette, ni la perte d'XP. Rien quoi !
La fenêtre disparait bien, mais il ne ce passe rien d'autre. Le Pj ne se reléve même plus Sad

Voici les scripts que j'ai essayé de faire, avec l'aide de Tatav

Dans le script de mort du joueur :

Code:
#include "ginc_death"

void main()
{
   // Obtention d'amulette des abysses
   object oPC= GetLastPlayerDied();
   CreateItemOnObject("amulettedesabysses",oPC,1);
   ShowDeathScreen(oPC,TRUE,TRUE,FALSE,TRUE);
 
}
void ShowDefaultDeathScreen( object oPlayer )
{
   //DisplayGuiScreen( oPlayer, GUI_DEFAULT_DEATH_SCREEN, FALSE );
   DisplayMessageBox( oPlayer, 0, GetStringByStrRef(181408), "gui_death_respawn", "", FALSE, "", 6603, "", 0, "" );
}


Et voici le script que j'ai nommé "gui_death_respawn"

Code:
#include "ginc_death"

void ApplyPenalty(object oDead)
{
    int nXP = GetXP(oDead);
    int nPenalty = 50 * GetHitDice(oDead);
    int nHD = GetHitDice(oDead);

    int nMin = ((nHD * (nHD - 1)) / 2) * 1000;

    int nNewXP = nXP - nPenalty;
    if (nNewXP < nMin)
       nNewXP = nMin;
    SetXP(oDead, nNewXP);
    int nGoldToTake =    FloatToInt(0.10 * GetGold(oDead));

    if (nGoldToTake > 10000)
    {
        nGoldToTake = 10000;
    }
    AssignCommand(oDead, TakeGoldFromCreature(nGoldToTake, oDead, TRUE));
    DelayCommand(4.0, FloatingTextStrRefOnCreature(58299, oDead, FALSE));
    DelayCommand(4.8, FloatingTextStrRefOnCreature(58300, oDead, FALSE));

}
void main()
{
   RemoveDeathScreens( OBJECT_SELF );
   object oRespawner = GetLastRespawnButtonPresser();
   AssignCommand(OBJECT_SELF,JumpToObject(GetObjectByTag("NW_DEATH_TEMPLE")));
}


D'aprés ce que j'ai pu voir sur un autre post il n'y a rien besoin de mettre dans le script de spawn du joueur. Donc j'ai essayé de mettre la perte d'or et d'XP dans ce dernier.

Merci de votre aide Rolling Eyes
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé
Alia Atreides



Inscrit le: 20 Nov 2006
Messages: 26
Message Posté le: 30/11/2006 8:32 Sujet du message:
coucou, j'ai pas tous compris tes deux scripts.. tu as des fonctions que tu n'appelle jamais dans ton main ........

pour ton premier script :
ShowDeathScreen(oPC,TRUE,TRUE,FALSE,TRUE);

ShowDefaultDeathScreen( object oPlayer )

je pense que tu devrias renomer la premier fonction pour que ce soit celle que tu as dasn ton script

pour ton deuxieme script :
Code:

void main()
{
   RemoveDeathScreens( OBJECT_SELF );
   object oRespawner = GetLastRespawnButtonPresser();
   AssignCommand(OBJECT_SELF,JumpToObject(GetObjectByTag("NW_DEATH_TEMPLE")));
   ApplyPenalty(OBJECT_SELF)
}

j'ai pas tester mais regarde deja ca. peux etre que ca resoudrait ton probleme.
_________________
Alia Atreides, scripteuse en herbe
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger
Slayne



Inscrit le: 02 Oct 2006
Messages: 33
Message Posté le: 30/11/2006 12:07 Sujet du message:
Kikoo, Rien à faire. Mon Pj reste à terre lorsque je clic sur respawn. J'ai essayé de mettre ce que tu m'as dit et rien.

Tu me dit que je n'appelle pas certaine fonction, si je comprend bien:

Code:
ShowDeathScreen(oPC,TRUE,TRUE,FALSE,TRUE);

et
Code:
ShowDefaultDeathScreen( object oPlayer )


Elles y sont bien pourtant . Mais je peux encore avoir tout compris de travers lol

Sinon pour le 2e, si je met les ApplyPenalty à la fin du script, il ne veut pas compiler
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé
Tatav



Inscrit le: 04 Oct 2006
Messages: 79
Message Posté le: 30/11/2006 14:15 Sujet du message:
J'ai oublié une ligne dans le script du respawn Rolling Eyes
Il ne ressucite pas donc comme il est toujours mort, il ne se téléporte pas sur le WP.


Tiens regarde ce module pour prendre exemple ( avec l'éditeur sous la main ca fonctionne dessuite mieu que de tête Wink )

http://www.partage-facile.com/35920-respawn_test.rar.html

Comme le dit Alia, le code si dessous ne sert à rien.

Code:

void ShowDefaultDeathScreen( object oPlayer )
{
   //DisplayGuiScreen( oPlayer, GUI_DEFAULT_DEATH_SCREEN, FALSE );
   DisplayMessageBox( oPlayer, 0, GetStringByStrRef(181408), "gui_death_respawn", "", FALSE, "", 6603, "", 0, "" );
}


et dans le respawn,
Code:
object oRespawner = GetLastRespawnButtonPresser();

retourne un objet invalide donc inutilisable maintenant.


Ensuite, la fonction ApplyPenalty(object oDead), si tu souhaites la placer en dessous du main(), tu dois au préalable la déclarer au dessus du main()

avec la ligne ApplyPenalty(object oDead); pour dire au compilateur quand il compile le main(), que cette fonction existe mais qu'elle est implémentée au dessous. donc si tu souhaites placer cette fonction en dessous, tu dois écrire:

Code:
#include "ginc_death"

void ApplyPenalty(object oDead);

void main()
{
   RemoveDeathScreens( OBJECT_SELF );
   ResurrectCreature(OBJECT_SELF);
    AssignCommand(OBJECT_SELF,JumpToObject(GetObjectByTag("NW_DEATH_TEMPLE")));
   ApplyPenalty(OBJECT_SELF);
}

void ApplyPenalty(object oDead)
{
    int nXP = GetXP(oDead);
    int nPenalty = 50 * GetHitDice(oDead);
    int nHD = GetHitDice(oDead);

    int nMin = ((nHD * (nHD - 1)) / 2) * 1000;

    int nNewXP = nXP - nPenalty;
    if (nNewXP < nMin)
       nNewXP = nMin;
    SetXP(oDead, nNewXP);
    int nGoldToTake =    FloatToInt(0.10 * GetGold(oDead));

    if (nGoldToTake > 10000)
    {
        nGoldToTake = 10000;
    }
    AssignCommand(oDead, TakeGoldFromCreature(nGoldToTake, oDead, TRUE));
    DelayCommand(4.0, FloatingTextStrRefOnCreature(58299, oDead, FALSE));
    DelayCommand(4.8, FloatingTextStrRefOnCreature(58300, oDead, FALSE));

}



Enfin, il semble qu'il y ait un truc que tu n'as pas compris, c'est la différence entre écrire une fonction et appeler une fonction.
Par exemple, dans ton script de résurection, tu as la fonction "ApplyPenalty(object oDead)" mais tu ne l'appelles jamais dans ton main(). si tu ne l'appeles pas, cette fonction ne sera jamais exécutée. donc si tu veux que cette fonction soit exécutée, tu dois l'appeler dans ton script quand tu souhaite qu'elle soit exécutée, ceci permet de faire une même tache sans avoir à recopier X fois la même chose.

PS Sinon, ton script de pénalité n'est plus appliquable maintenant à cause des races différentes qui n'ont plus la même échelle d'XP.
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur
Slayne



Inscrit le: 02 Oct 2006
Messages: 33
Message Posté le: 30/11/2006 18:42 Sujet du message:
Oui c'est vrai que j'ai un léger probléme pour comprendre tout ca lol
Mais je persiste ^^
Un grand merci pour le mal que vous vous donnez pour faire rentrer tout ca dans ma ptite téte Embarassed

Vais explorer ton Mod de test et essayer de mieux comprendre Rolling Eyes

Merci encore.
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé
Alia Atreides



Inscrit le: 20 Nov 2006
Messages: 26
Message Posté le: 1/12/2006 7:52 Sujet du message:
tu sait c'est comme ca qu'on a tous commencer hihihi (je parle pour moi deja hihihi) et personnellement je continue a aprendre et a pauser des question qui paresse simple quadn on connait mais on n'ai pas tous des genies hihihih
_________________
Alia Atreides, scripteuse en herbe
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger
Tao
Animateur


Inscrit le: 25 Avr 2006
Messages: 184
Localisation: Quelque part en yhgdrazil
Message Posté le: 1/12/2006 11:38 Sujet du message:
La fonction ApplyPenalty ( ou toute autre ) est a definir avant le void main généralement :p
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur
Slayne



Inscrit le: 02 Oct 2006
Messages: 33
Message Posté le: 1/12/2006 12:11 Sujet du message:
Je pense avoir bien compris cette fois ci, enfin j'éspere. Rolling Eyes

il faut mettre :

Code:
void ApplyPenalty(object oDead)
{
.......
.......
.......
.......

}
void Main
{
// et rappeler par ici le ApplyPenalty(OBJECT_SELF);
}


Cool Idea
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé
Tatav



Inscrit le: 04 Oct 2006
Messages: 79
Message Posté le: 1/12/2006 14:17 Sujet du message:
Oui faut bien apprendre un jour ou l'autre, ce n'est pas inné et sans fin, on apprends toujours un nouveau truc à un moment ou à un autre.

Sinon, oui, ca marche comme ca pour cette fonction Wink

Enfin personnellement, je préfère lister mes fonctions avec en commentaires leur rôle comme ca :

Code:


/*
 *Procédure appliquant une pénalité d'or et d'experience sur une
 *créature en fonction de son niveau et Or
 *Utilisé principalement pour le respawn d'un pj mort
 *ou comme punition pour un meutre de PNJ
 */
void ApplyPenalty(object oDead);

void main()
{
   RemoveDeathScreens( OBJECT_SELF );
   ResurrectCreature(OBJECT_SELF);
    AssignCommand(OBJECT_SELF,JumpToObject(GetObjectByTag("NW_DEATH_TEMPLE")));
   ApplyPenalty(OBJECT_SELF);
}

void ApplyPenalty(object oDead)
{ ... }



Enfin la l'intêret peut paraitre minime car cette fonction est juste appelée en interne, mais si par exemple dans un script onDeath d'une créature tu veux rajouter une pénalité au tueur du même genre:

Code:
ApplyPenalty(GetLastKiller());


et que dans ton script, il y a 40 fonctions différentes non déclarées avant, pour retrouver la bonne, si tu dois chercher une ligne parmi 500 autres de code, crois moi, ca va te prendre énormement de temps, alors qu'avec cette facon, tu cherches juste au début, tu sais à quoi ca sert et comment ca marche sans avoir à fouiller tout le script.

Ca parait plus long de faire ainsi au début mais après quand tu as pleins de scripts et pleins de fonctions dedans, retrouver ca en 2 minutes c'est très appréciable. Encore plus quand tu travailles avec d'autres personnes qui n'ont pas écrit la fonction.
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur
Sharg



Inscrit le: 30 Jan 2007
Messages: 3
Message Posté le: 30/01/2007 16:07 Sujet du message: HCR2 fugue raise dead
Bonjour,

j'ai truové un modul HCR2 ( http://nwvault.ign.com/View.php?view=NWN2Scripts.Detail&id=61 ) et j'essai de conjurer un raise dead spell (avec mon npc, qui etais en fugue), mais n'est rien passé.
Je pense que je doit écrire un script raise dead que mon npc utile, c'est scripte que je le doit adaapter ma dialgue. Mais je ne les sais pas faire.
/Pardonnez-moi, si j'ecrite faussement Sad /
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé
Tyrnis



Inscrit le: 05 Jan 2007
Messages: 6
Message Posté le: 30/01/2007 21:24 Sujet du message:
Faudrais ressucité le pj avant de le tp Rolling Eyes
ApplyEffectToObject(DURATION_TYPE_INSTANT,oPC,EffectResurection()) ou un truc du genre ^^
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   

Page 1 sur 1
Sauter vers:  

 

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

Traduction par : phpBB-fr.com
Powered by phpBB © 2001, 2007 phpBB Group