La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
FAQ
Rechercher
Liste des Membres
Groupes d'utilisateurs
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
La date/heure actuelle est 23/11/2024 20:39:06
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
Voir le sujet précédent ¤ Voir le sujet suivant | |
---|---|
Auteur | Message |
Aladar Chevalier Messages: 96 Localisation: Tours |
Bonjour,
Je suis en train de créer un mini-jeu, une bataille de catapulte qui balance des boules de feu en gros. Le but est simple : tuer l'adversaire en lui tirant dessus avec une catapulte, tout en evitant ses tirs. Jusque là pas de probleme. Ce que je voulais faire, à chaque fois qu'un PJ arrive à tuer son adversaire, il gagne 500 xp et un bonus de vitesse de 10% permanent. Mon seul probleme vient du fait que je n'arrive pas à identifier le tueur... GetLastKiller() ne fonctionne pas dans ce cas, ce n'est pas le PJ qui tue mais la boule de feu. Quelqu'un aurait il une idée pour identifier le PJ qui a activé la catapulte qui a lancée la boule de feu qui a tuée le mort ? Je vous mets les scripts ; Le code des catapultes (il y a deux code pour ca, les deux sont presque identiques) : NWScript :
int iCible = GetLocalInt(GetArea(OBJECT_SELF), "ncible"); int iRandom = Random(iCible)+1; object oCible = GetNearestObjectByTag("CibleA_"+IntToString(iRandom), OBJECT_SELF, 1); location lCible = GetLocation(oCible); object oPJ = GetLastUsedBy(); void main() { if(oCible != OBJECT_INVALID) { if(GetLocalInt(OBJECT_SELF, "reload") == 0) { ActionCastSpellAtLocation(SPELL_FIREBALL, lCible, METAMAGIC_ANY, TRUE, PROJECTILE_PATH_TYPE_BALLISTIC); SetLocalInt (OBJECT_SELF, "reload", 1); ActionWait(8.0); ActionDoCommand(SetLocalInt(OBJECT_SELF,"reload", 0)); } else { SpeakString("Vous devez attendre que la catapulte se recharge !"); } } } Le deuxieme code, seul la ligne GetNearestObjectByTag("CibleA_"+IntToString(iRandom), OBJECT_SELF, 1); change, ca va chercher ("CibleB_"+IntToString(iRandom). Dans le OnDeath du module : NWScript :
#include "al_inc_penality" object oCrieur = GetObjectByTag("CRIEUR", 1); object oPJ = GetLastPlayerDied(); int nCount = GetLocalInt(oPJ, "nDeath"); void main() { if(nCount != 14) { nCount++; AssignCommand(oCrieur, ActionSpeakString(GetName(oPJ)+" est mort ! Nombre de morts a son actif : "+IntToString(nCount), TALKVOLUME_SHOUT)); SetLocalInt(oPJ, "nDeath", nCount); } else { AssignCommand(oCrieur, ActionSpeakString(GetName(oPJ)+" est mort pour la "+IntToString(nCount)+"eme fois, fin de la partie !", TALKVOLUME_SHOUT)); } ApplyPenalty(oPJ); DelayCommand(0.5, PopUpGUIPanel(oPJ, GUI_PANEL_PLAYER_DEATH)); } Plus deux autres micro scripts ou j'initialise les variables "rouge" et "bleue" sur chacun des pjs. |
Revenir en haut | |
Harmelyo Chevalier Messages: 84 |
Je fais une rapide lecture mais ne serait il pas possible d'utiliser une var local pour stocker sur la catapulte son utilisateur?
Lors que l'on utilise la catapulte, on stocke à l'aide d'une variable local l'utilisateur. Lors qu'il y a un mort, on récupère la catapulte responsable (getlastkiller) à l'aide de quoi on retrouve par la variable local l'utilisateur. C'est un peu tordu mais je ne vois pas d'autre solution pour le moment. |
Revenir en haut | |
Aladar Chevalier Messages: 96 Localisation: Tours |
J'avais pensé à ca, pour testé j'ai fais ca
Code : ActionSpeakString(GetName(oPJ)+" a ete tue par "+GetName(GetLastKiller), TALKVOLUME_SHOUT));
pensant que ca me dirait "oPJ a ete tue par catapulte" mais ca se contente de dire "oPJ a ete tue par" |
Revenir en haut | |
-MeteZ- Seigneur Messages: 205 Localisation: Région Parisienne (95) |
Bah voilà la synthaxe que j'aurai utilisé:
SYNTHAXE du script: si OBJECT n'est pas PJ (donc c'est un sort) alors OBJECT oJoueur = GetLastSpellCaster(); // et puis on continue le script. sinon OBJECT est un PJ // et puis on continue le script. Autrement pour ta phrase j'aurai mis: 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. _________________ "Ne dit pas affronter les ténèbres celui qui n'a jamais connu la tombée de la nuit." |
Revenir en haut | |
Aladar Chevalier Messages: 96 Localisation: Tours |
Je pensais à un truc dans le OnDeath du style :
Si oMort a la var "rouge" alors oTueur est forcement "bleu" et inversement. Après suffirait d'appliquer les effets sur oTueur... Je vois toujours pas comment m'y prendre, mais j'ai du temps devant moi donc ca va ^^ Ca va se compliquer quand je vais tacher d'adapter ca pour que ce soit jouable par equipe... -edit- Ou alors... Au moment ou les joueurs entrent dans l'air de jeu, on pose une var "joueur" sur TRUE. On vire cette meme var quand ils en sortent. Des qu'un pj meurt, on passe tout les pjs en revue, si un joueur (autre que le mort) a la var "joueur" sur TRUE, alors c'est forcement le tueur. Et de la recuperer ce pj qui deviendra oKiller... Ca serait jouable ? |
Revenir en haut | |
-MeteZ- Seigneur Messages: 205 Localisation: Région Parisienne (95) |
Je trouve ca compliqué. Tu as essayé ce que j'ai mis plus haut ?
_________________ "Ne dit pas affronter les ténèbres celui qui n'a jamais connu la tombée de la nuit." |
Revenir en haut | |
Aladar Chevalier Messages: 96 Localisation: Tours |
En fait j'ai rien compris à ta synthaxe
|
Revenir en haut | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
Le Lexicon est notre ami
Lexicon a écrit : GetLastKiller()
Bon, y a quand même un truc à vérifier c'est que si un PC appelle la fonction ça marche peut-être.
Get the object that killed the caller. object GetLastKiller(); Description Returns an object representing the object that killed the calling object. Remarks Only works when called from an NPC or creature. Does not work during the OnPlayerDeath event of a module (returns OBJECT_INVALID in this case). Donc essaye un truc du genre : NWScript :
void FindPCKiller() { object oKiller = GetLastKiller(); object oCrieur = GetObjectByTag("CRIEUR", 1); AssignCommand(oCrieur,SpeakString(""+GetName(oKiller)+" comme tueur du dernier PC mort",TALKVOLUME_SHOUT)); } Et dans ton OnDeath rajoute au début (aprèse tes déclarations de variables) : 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. Comme ça on saura si on peut utiliser GetLastKiller ou si il faut trouver un moyen détourné. Je pense pas que ça marche mais on sait jamais, ça serait bien pratique. |
Revenir en haut | |
Aladar Chevalier Messages: 96 Localisation: Tours |
Bien joué
Resultat : "J'ai trouvé Catapulte comme tueur du dernier PJ mort" Plus qu'à choper qui a utilisé oKiller. J'ai testé ca NWScript :
void FindPCKiller() { object oKiller = GetLastKiller(); object oUser = GetLastUsedBy(oKiller); object oCrieur = GetObjectByTag("CRIEUR", 1); AssignCommand(oCrieur, SpeakString(""+GetName(oUser)+" comme tueur du dernier PC mort",TALKVOLUME_SHOUT)); } Mais ca renvois toujours la catapulte. |
Revenir en haut | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
Nope tu peux pas utiliser de paramètre dans GetLastUsedBy().
Par contre, sur le OnUsed de la catapulte, enregistre celui qui l'a utilisée en variable locale. Comme ça tu peux le retrouver dans le OnDeath à l'interieur de la fonction FindPCKiller. |
Revenir en haut | |
Aladar Chevalier Messages: 96 Localisation: Tours |
Enregistrer le PJ qui a utilisé la catapule en variable locale ?
L'enregistrer sur la catapule ? Je vois pas du tout comment faire ! |
Revenir en haut | |
madjawa Voyageur Messages: 3 |
Dans le OnUsed de la catapulte, rajoutes ça:
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. Et dans "void FindPCKiller()" remplace 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. par 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. En théorie ça devrait fonctionner |
Revenir en haut | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
NWScript :
int iCible = GetLocalInt(GetArea(OBJECT_SELF), "ncible"); int iRandom = Random(iCible)+1; object oCible = GetNearestObjectByTag("CibleA_"+IntToString(iRandom), OBJECT_SELF, 1); location lCible = GetLocation(oCible); object oPJ = GetLastUsedBy(); void main() { SetLocalObject(OBJECT_SELF,"LASTUSER",oPJ); if(oCible != OBJECT_INVALID) { if(GetLocalInt(OBJECT_SELF, "reload") == 0) { ActionCastSpellAtLocation(SPELL_FIREBALL, lCible, METAMAGIC_ANY, TRUE, PROJECTILE_PATH_TYPE_BALLISTIC); SetLocalInt (OBJECT_SELF, "reload", 1); //ActionWait(8.0); //ActionDoCommand(SetLocalInt( OBJECT_SELF,"reload" , 0)); DelayCommand(8.0,SetLocalInt(OBJECT_SELF,"reload",0)); } else { SpeakString("Vous devez attendre que la catapulte se recharge !"); } } } et la fonction dans le OnDeath devient : NWScript :
void FindPCKiller() { object oKiller = GetLastKiller(); object oUser = GetLocalObject(oKiller,"LASTUSER"); object oCrieur = GetObjectByTag("CRIEUR", 1); AssignCommand(oCrieur, SpeakString(""+GetName(oUser)+" comme tueur du dernier PC mort",TALKVOLUME_SHOUT)); } EDIT : Mouarf Madjawa tu m'as grillé, mais au moins on est d'accord : !! Dernière édition par Sith Vicious le 30/03/2006 00:20:37; édité 1 fois
|
Revenir en haut | |
Aladar Chevalier Messages: 96 Localisation: Tours |
C'est marrant, enfin plus ou moins, ca renvois toujours "J'ai trouvé Catapulte blabla", sauf que parfois, ca renvois le module comme dernier tueur ôO.
|
Revenir en haut | |
Aladar Chevalier Messages: 96 Localisation: Tours |
J'ai essayé de m'auto-tuer (vive tempette de grele).
Et ca renvois bien mon nom, donc on peux toujours utiliser FindPCKiller() pour placer un GetLastKiller() dans le OnDeath. Par contre, par moment ca deconne et ca donne encore le module comme dernier tueur... |
Revenir en haut | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
Ouais, je pense pas que GetLastKiller ait vraiment été concue pour les personnages joueurs..
Ah non je suis con. C'pas ça. L'esplication c'est ça : si ton PJ tombe entre 0 et -10 points de vie, c'est le OnPlayerDying qui se déclanche et dedans ils tuent le joueur (EffectDeath()) mais là c'est le module qui appelle ce script, donc c'est le module qui est considéré comme le tueur. Donc faudrait copier le code dans le OnPlayerDying aussi pour éviter ça (avec un moyen pour vérifier dans le OnDeath si le joueur est passé par le Dying ou pas, sinon ça le ferait 2 fois). Mais bon, ça marche avec l'enregistrement du tireur sur la catapulte ou bien sinon ? |
Revenir en haut | |
Aladar Chevalier Messages: 96 Localisation: Tours |
Non ca ne marche pas avec l'enregistrement du tireur sur la catapulte, ca continu de renvoyer Catapulte comme tueur.
|
Revenir en haut | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
question bête (on sait jamais, il est tard) :
t'as bien changé oKiller en oUser dans le GetName() ? |
Revenir en haut | |
Aladar Chevalier Messages: 96 Localisation: Tours |
oui
|
Revenir en haut | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
Ben c'est marrant chez moi ça marche. J'ai fait en sorte que la catapulte me tire dessus et ça me met bien "j'ai trouvé <nom de mon perso> comme tueur...".
Enfin ça marche pas si je passe par la case OnPlayerDying, mais lui j'y ai pas touché. |
Revenir en haut | |
Aladar Chevalier Messages: 96 Localisation: Tours |
Ah !
Alors j'ai du merder quelque part, je refais le truc... |
Revenir en haut | |
Aladar Chevalier Messages: 96 Localisation: Tours |
En effet, ca fonctionne.
J'avais placé la fonction en include, si je la mets tout au debut du OnDeath, là, ca marche Une raison particuliere à ca ? |
Revenir en haut | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
Si tu recompile pas tes scripts après une modification de tes includes les modifs sont pas prises en compte, je pense que ça vient de là. Faut toujours tout recompiler avant de lancer un module (créer ==> créer module ==> compiler (scripts)).
|
Revenir en haut | |
Aladar Chevalier Messages: 96 Localisation: Tours |
C'est cool j'ai appris l'existence de deux trucs : SetLocalObject() et ce truc pour compiler avant de tester.
Je vais pouvoir passer à la prochaine etape de mon mini jeu, je posterai le tout quand il sera terminé si ca interesse quelqu'un (pour se defouler, c'est marrant ) Grand merci à toi Sith Vicious |
Revenir en haut | |
Aladar Chevalier Messages: 96 Localisation: Tours |
Pour le OnDying, j'ai legerement modifié la fonction pour en faire une autre, FindPCAttacker().
Je pensais recuperer le dernier PJ a avoir attaqué le mort, en passant par la catapulte qu'il a utilisé. Je passe egalement une variable "mort" sur le PJ mort à 1, et dans le OnDeath je test si "mort" vaut 0, auquel cas on lance la fonction, sinon on passe direct à la suite. Je passe "mort" à 0 dans le OnRespawn. Ca evite qu'il le dise deux fois. Donc ca donne : NWScript :
void FindPCKiller() { object oKiller = GetLastKiller(); object oUser = GetLocalObject(oKiller,"LASTUSER"); object oCrieur = GetObjectByTag("CRIEUR", 1); SetLocalInt(oPJ, "mort", 1); AssignCommand(oCrieur, SpeakString("Je passe par le OnDeath",TALKVOLUME_SHOUT)); AssignCommand(oCrieur, SpeakString(""+GetName(oUser)+" comme tueur du dernier PC mort",TALKVOLUME_SHOUT)); } Avec dans le OnDeath 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. et NWScript :
void FindPCAttacker() { object oAttacker = GetLastAttacker(); object oUser = GetLocalObject(oAttacker,"LASTUSER"); object oCrieur = GetObjectByTag("CRIEUR", 1); SetLocalInt(oPJ, "mort", 1); AssignCommand(oCrieur, SpeakString("Je passe par le OnDying",TALKVOLUME_SHOUT)); AssignCommand(oCrieur, SpeakString(""+GetName(oUser)+" comme tueur du dernier PC mort",TALKVOLUME_SHOUT)); } Avec dans le OnDying 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. Donc quand ca passe direct par le OnDeath, ca marche parfaitement. Mais quand ca passe par le OnDying, ca dit : "je passe par le OnDying" "j'ai trouvé <rien du tout> comme tueur du dernier PC mort" Une idée ? |
Revenir en haut | |
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
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