Sort Et Necromancie
#1
Posté 27 mai 2007 - 13:49
--> Comment detecter si la cible du sort est un cadavre
--> Comment avoir la reference de ce cadavre
--> Comment savoir si il n'est pas animal (peut etre selon les factions ?)
Merci. La premiere question et la deuxieme sont de loin les plus importantes
#2
Posté 27 mai 2007 - 14:05
Citation
--> Comment detecter si la cible du sort est un cadavre
Ac un bloc OnDeath. Ou avec une fonction GetIsDead. (== 1 si la cible est morte)
--> Comment avoir la reference de ce cadavre
Ac un GetSelf pour le "selectionner" (enfin ca ne te retourne pas sa reference, mais je pense que vu tes intentions c'est ce qui devrait t'aller pour tes idées.)
Tu fais un
ref var
;déclare la variable ref
(...)
;dans un bloc de ton choix, je ne sais pas ce que tu veux faire exactement non plus...
set var to GetSelf
--> Comment savoir si il n'est pas animal (peut etre selon les factions ?)
Bonne question. Je me suis deja posé la meme question pour autre chose. Je ne sais pas si on ne peux pas plutot envisager la possibilité de tester les races jouables, ou les races tout court les unes apres les autres... A voir donc.
Voila ! N'hésites pas si tu as un probleme... Mais dans ce cas, precises tes intentions !
EDIT : je te repondrai plus tard par MP a ton message sur le post de mon mod (pas le temps je dois partir) +++
Modifié par Daimyo Tai Shi, 27 mai 2007 - 15:00.
Si, comme moi vous êtes perdu(e) sur le net : www.perdu.com
#3
Posté 27 mai 2007 - 14:29
Merci de tes reponses, je m'en vais faire mon petit script.
#4
Posté 27 mai 2007 - 14:59
Petit EDIT (trop tard vu que tu as deja lu ma reponse)
c'est GetIsDead et non IsDead (petit oubli dsl je suis allé trop vite...)
Voila ! Ca marchera sans doute mieux comme ca... ^^
A + tard et bon scriptage !!!
Si, comme moi vous êtes perdu(e) sur le net : www.perdu.com
#5
Posté 27 mai 2007 - 15:10
Donc lorsque je fait le script suivant, cela me recupere le cadavre
ref cadavre begin scripteffectstart; le bloc pour le debut d'un effet, plus sur que ca soit lui set cadavre to getself; recupere la cible du sort ? if cadavre.getisdead == 0; si il n'est pas mort return; stop le script endif if cadavre.getisplayablerace == 0, savoir si le cadavre est n'est pas"humain" return endif ; et hop la suite end
En faite, mon getself recupere bien la cible du sort ?
Modifié par Josse, 27 mai 2007 - 15:14.
#6
Posté 27 mai 2007 - 18:59
en fait, GetSelf correspond à "lui-meme", donc dans notre cas (celui d'un sort) c'est en effet "toute cible affectée par le sort". Donc en admettant que tu le lances sur un cadavre, il prendra la "valeur" de la reference touchée (donc le cadavre). Maintenant, en considérant un sort a effet de zone, il touchera toutes les cibles dans la zone (dont les vivantes), et ensuite il faudra utiliser la détection de la mort ou non, et des races jouables ou non...
Pour ce qui est de ton debut de script, oui ce sont les bonnes fonctions et ecriture, mais j'aurais plutot vu ca en imbriquant, pour cumuler les effet. Donc :
__________________________________________________
ScriptName NomduScript
ref cadavre
Begin ScriptEffectStart
set cadavre to GetSelf
if ( cadavre.getisdead == 1 )
if ( cadavre.getisplayablerace == 1 )
resurrect
; rajoute aussi un effet pms, ca fera meilleure impression, par exemple un effet de mysticisme (ou capture d'ame...) sur cadavre. Je ne connais plus son ID par contre...
else
; Tu peux rajouter un 'Message' ou 'MessageBox' indiquant l'echec et sa cause (ici ca sera a cause de la race), par ex "Le sort n'a aucun effet car la cible n'est pas une race 'intelligente'"
return
else
; Tu peux rajouter un 'Message' ou 'MessageBox' indiquant l'echec et sa cause (ici ca sera a cause de l'etat "en vie"), par ex "Le sort n'a aucun effet car la cible est encore vivante"
return
endif
End
_____________________________________
A noter aussi que si tu utilises cette manière (getisplayablerace) tu n'auras pas les races non jouables (dremoras, saints dorés et vils seducteurs (SI)). Sinon, si tu les veux aussi inclues, utilises un test en imbriquant les races les unes apres les autres (en testant la race de la cible, et non sa jouabilité...)
En esperant t'avoir aidé, et que ca marche (normalement oui...)...
N'hésite pas si tu as des questions !
PS : il existe un sort de "réanimation" in TESCS qui a un effet non scripté correspondant à un effet similaire à ce qu'on vient de faire...
Maintenant, si tu veux rajouter d'autres choses, utilises plutot le script en le developpant plus...
+++
Si, comme moi vous êtes perdu(e) sur le net : www.perdu.com
#7
Posté 27 mai 2007 - 19:42
Juste a partir de celui ci creer un squelette (pour l'instant). Reste la question du comment invoquer une creature par "non-sort" (par script)
Je fait un placeatme (enfin je crois) et disable lorsqu'il faut
Je vais aussi essaiyé que le player puisse controler au moins 5creatures (mais la, sa vas etre plus dure, deja une ^^)
Je metterais sans doute mon script ici. En faite, il reste juste a verifié d'autres condition (getitemcount etc ...) et creer la creature,
#8
Posté 27 mai 2007 - 19:54
Citation
Citation
Attention, petite mise en garde, tu vas vite de retrouver confronté à un probleme : celui du multi-reanimation. C'est a dire que pour peu que tu aies suffisamment d'objets dans ton inventaire, tu pourras faire cinq squelettes a partir du meme cadavre (sauf si tu le disable, mais attention, problemes de compatibilité si par exemple le PNJ a un objet de quete sur lui...) Bref, c'est ca qu'il va falloir regler et qui sera, a mon avis, le plus chiant a decider...
Okok, je crois que je vois ce que tu veux faire... C'est différent de ce que je fais dans mon mod (menfin si tu veux un coup de main question scripting, n'hésite pas a me demander, je me debrouille ^^)
(du coup j'ai repondu a ton post sur le topic de la Tour de Zhaalfir : ca m'interesse de voir comment tu comptes faire, meme si c'est quelque peu différent de ma facon de faire... Et puis la diversité c'est bien, alors comme dit a l'instant, n'hésite pas a reposter si tu as des questions !)
+++ et bon courage !
Si, comme moi vous êtes perdu(e) sur le net : www.perdu.com
#9
Posté 27 mai 2007 - 20:44
Voic la partie qui bug
if cadavre.getdead == 1 && cadavre.getisplayablerace == 1 else messagebox "Le cible n'est pas autorisée pour de la necromancie" return endif
Et le debut de script entier qui fait appel au script de quête MUnecroquest. Il gere le niveau des gemmes (et donc le temps de vie du serviteur), si il est commandé (pour l'instant tout le temps non car jai pas encore fait les ordres). J'utilise placeatme, mais avec le temps, le serviteur se fait tuer, sinon il meurt des coups du player car il est hostile. Et si le player le commande et qu'il a du temps infine, il mourra bien un jour.
JE te laisse mon msn si tu veux coser Josselin6@hotmail.fr ... PAs de reponse dans ton topic, bizare
Modifié par Josse, 27 mai 2007 - 20:45.
#10
Posté 27 mai 2007 - 20:53
Josse, le 27.05.2007 à 20:44, dit :
if cadavre.getdead == 1 && cadavre.getisplayablerace == 1 else messagebox "Le cible n'est pas autorisée pour de la necromancie" return endif
pourquoi ne pas mettre
if !( (cadavre.getdead == 1) && (cadavre.getisplayablerace == 1)) messagebox "Le cible n'est pas autorisée pour de la necromancie" return endifou
if ( (cadavre.getdead == 0) || (cadavre.getisplayablerace == 0)) messagebox "Le cible n'est pas autorisée pour de la necromancie" return endifça evite d'utiliser un else alors que tu n'as rien mis dans le if ...
A plus
#11
Posté 27 mai 2007 - 21:04
#12
Posté 27 mai 2007 - 21:17
Citation
1- vérifie que tes variables sont bien déclarées dans les quetes et objets correspondants
2-
Citation
Donc quel rapport avec ton MUsqueletteinvochostile ?
Le probleme vient peut-etre de la... Mais je ne vois pas ce que tu as cherché a faire. A quoi sert cette variable invoc ?
la area...
En théorie elle fonctionne correctemement, meme avec un sort a effet de zone. Mais dans la plupart de mes sorts, mes effets de zone ne sont pas les effets de zone basiques et j'utilise cette methode :
1- exclure le player des effets
2- utiliser un appel d'activateur (dans le script du sort qu'a le PJ) qui lance le sort réel à ta place
Donc si tu veux tu peux toujours essayer, mais je ne pense pas que ca vienne de la.
Pourrais-tu en dire plus sur le probleme ?
A quel moment survient-il ? Compilation ? Lancement du jeu ? Utilisation in game ?
Quel message s'affiche, ou que se passe-t-il ?
Si, comme moi vous êtes perdu(e) sur le net : www.perdu.com
#13
Posté 27 mai 2007 - 21:25
Et MUsqueletteinvochostile, c'est une creature que j'ai faite (un squelette)
En faite, je sais pas mettre une distance, j'ai donc cru que c'était area
LE probleme, c'est lors de l'utilisation du sort sur mon pnj mort, il me sort le message "Le cible n'est pas autorisée pour de la necromancie" et donc que cela :
if cadavre.getdead == 1 && cadavre.getisplayablerace == 1
c'est pas bon
#14
Posté 27 mai 2007 - 21:36
Essaie de ne pas laisser de vide, pour voir mets un Message "C'est ok" entre le if ( cadavre.getdead == 1 ) && ( cadavre.getisplayablerace == 1 )
et le else.
Pour mettre une distance, pas besoin de toucher au area, mais faire derouler le menu deroulant indiquant "soit, contact, cible" et selectionner "cible".
Modifié par Daimyo Tai Shi, 27 mai 2007 - 21:37.
Si, comme moi vous êtes perdu(e) sur le net : www.perdu.com
#15
Posté 27 mai 2007 - 21:45
SA sert a rien de mettre un message, l'autre (la cible est incorecte) nous indique que les deux conditions sont pas bonne. Sans doute que le getselfe retourne aussi des objets autres que le cadavre qui font bugé le script. Je testerait demain sans area
#16
Posté 27 mai 2007 - 22:01
Citation
Je voulais dire par là, remplacer ton Message actuel par celui que je te dis, qui t'indiquera quand ca marche, et non quand ca marche pas lol !
Simple logique, etant donné que le bloc "if/endif" (en fait else/endif) commence par un else, donc tu ne teste pas les conditions mais leur inverse. Or pour voir si ca marche, autant tester les conditions. lol c'est pas essentiel, mais c'est surtout pour la simplicité du test, apres tu pourras modifier sans probleme...
Citation
Mets n'importe quoi pour le visu, ca tu pourras toujours modifier apres...
Citation
ok a demain alors... bonne nuit !
Si, comme moi vous êtes perdu(e) sur le net : www.perdu.com
#17
Posté 27 mai 2007 - 22:55
je te propose d'essayer (sans placer le code pour réanimer dans un premier temps) ce script afin de tester s'il sagit d'un probleme de condition ...
je me suis permis de restructurer ton script afin qu'il soit plus clair (juste un deplacement des conditions que tu utilisais )
pour ce qui est des commandes que tu utilises dans les dernières lignes de ton script je pense que c'est elles qui te pose problème .
scn MUspellnecromanciescript ref cadavre begin ScriptEffectStart Set cadavre to GetSelf if ( (cadavre.getdead == 1) && (cadavre.getisplayablerace == 1)) if cadavre.getitemcount BlackSoulGemFilled > 0; gemme noir, temps infinie set MUnecroquest.temps to -1 elseif cadavre.getitemcount SoulGem3Common1PettySoul || cadavre.getitemcount SoulGem3Common2LesserSoul > 0 || SoulGem3Common3CommonSoul > 0; temps 30s set MUnecroquest.temps to 30 elseif cadavre.getitemcount SoulGem2Lesser1PettySoul || cadavre.getitemcount SoulGem2Lesser2LesserSoul > 0; temps 20s set MUnecroquest.temps to 20 elseif cadavre.getitemcount SoulGem1Petty1PettySoul > 0; temps 10s set MUnecroquest.temps to 10 endif if (cadavre.getitemcount ScrollStandardCommandCreature2Apprentice > 0 )||( cadavre.getitemcount ScrollStandardCommandCreature3Expert > 0) messagebox "La cible est ranimée de manière amicale" ;code pour la réanimation ou/et deplacement ou je sais pas trop ce que tu voulais faire ... ;eventuelement un : ;cadavre.setav aggression 0 ;cadavre.evp else messagebox "La cible est ranimée de manière hostile" ;code pour la réanimation et le deplacement comme au dessus plus les 3 lignes ci-dessous pour rendre le cadavre hostile ;cadavre.setav aggression 100 ;cadavre.setrestrained 0 ;cadavre.evp endif else messagebox "La cible n'est pas autorisée pour de la necromancie" return endif end
au fait, tu utilises une variable de quete pour gérer le temp d'invocation ? c'est bien ça ?
sinon c'est peut-être la variable MUnecroquest.temps qui te pose problème .
dsl pour le post precedent je n'avais pas lu le script au complet ...
Bon chance .
Modifié par Le Magicien, 27 mai 2007 - 22:59.
#18
Posté 27 mai 2007 - 23:08
Citation
Je rajouterai juste que si tu testes les conditions avec un :
if (cadavre.getitemcount ScrollStandardCommandCreature2Apprentice > 0 )||( cadavre.getitemcount ScrollStandardCommandCreature3Expert > 0)
tu devrais faire un removeitem de ces éléments, parce que sinon ca n'a guere d'utilité (enfin bon...)
Bref, commentaire sans doute inutile, en tous cas tres tres secondaire, mais des fois que tu l'aies oublié (ou si c'est fait expres désolé...), et puis en fait fallait bien que je le sorte a un moment, scuse...
Voila, bah reste plus qu'a tester alors...
Bonne soirée et bon courage !
Modifié par Daimyo Tai Shi, 27 mai 2007 - 23:10.
Si, comme moi vous êtes perdu(e) sur le net : www.perdu.com
#19
Posté 27 mai 2007 - 23:26
Daimyo Tai Shi, le 27.05.2007 à 23:08, dit :
if (cadavre.getitemcount ScrollStandardCommandCreature2Apprentice > 0 )||( cadavre.getitemcount ScrollStandardCommandCreature3Expert > 0)
tu devrais faire un removeitem de ces éléments, parce que sinon ca n'a guere d'utilité (enfin bon...)
Bref, commentaire sans doute inutile, en tous cas tres tres secondaire, mais des fois que tu l'aies oublié (ou si c'est fait expres désolé...), et puis en fait fallait bien que je le sorte a un moment, scuse...
je pense que Josse compte tuer et/ou "disabler" le cadavre une fois qu'il aura été inovqué et arrivé au bout de son temp d'invocation donc au pire seul un voleur pourrait recuperer la/les gemme(s) et le/les parchemin(s) ...
je comptais les enlever moi aussi mais comme j'ai lu je sais plus ou qu'on parlait de menu pour donner des ordres je pense que cette manip etait prevue dans d'autres scripts ...
Sinon pourquoi ne pas cumuler les durée? je veux dire 2 gemmes à 20 secondes donnes 40 secondes etc...
Mais bon on verra ça un fois que le script fonctionnera correctement .
A Bientot
Modifié par Le Magicien, 27 mai 2007 - 23:27.
#20
Posté 28 mai 2007 - 07:50
Pour les cadavres, ils sont envoyé dans une cell poubelle, donc pas de reprise des objets (sinon trop facile ...). Quand aux servviteurs, il sont soit tués avec le temps (qui est bien geré dans une quête, comme la reference invoc) soit par le player (si il est hostile) soit pas du tout (mais bon, le player ne pourra en creer que 5 donc sa ira ...)
Pour la distance, j'ai bien mis un truc d'invoc. vais mettre la boule de feu
Pour les dernieres lignes du script, je vois pas bien le probleme, elles sont juste la pour dire si le serviteur est hostile, si oui on le creer sinon on met commande (variable dans une quête) a 1
A noter qu'a la fin, je pense faire que des variable au debut (du genre commande a 1) et creer le serviteur selon ses variable a part (au lieu de le faire a chaque fois qu'il faut)
Quand a ton script le magicien, je le trouve au contraire pas tres claire car tu met emboite les diverses etapes, donc si je veux modifié, je pige plus trop rien, tout est melangé. MAis je regarde si je vois des trucs plus interressant (j'en ai d'ailleur vue ^^)
Sinon, je perciste a dire que c'est la area qui bug car avant que je la mette sa marchait. Je vais tester cela comme sa on verra bien
Modifié par Josse, 28 mai 2007 - 07:52.
#21
Posté 28 mai 2007 - 12:13
Je suis un peu votre projet depuis un temps mais :
Citation
N'est il pas un peu risqué de faire ceci ?
Car après tout les cadavres/serviteur ne seront pas suprimer et celà risquerai de faire largement grimper la taille des sauvegardes en flèches, au début celà ne serais peut être pas visible mais un cadavre +cadavre et ce pendant pas mal de temps ....
En tout cas bon courage .
Membre de la team MorrowindStargate
Vous êtes en mal d'aventure ?
Alors n'attendez plus et partez à la découverte de Morrowind Stargate le futur Tc de la porte des étoiles :
http://www.rochmedia...ex.php?act=home
#22
Posté 28 mai 2007 - 12:15
#23
Posté 28 mai 2007 - 12:19
Citation
Non, mais je pensais qu'il aurait fait ses MessageBox dans ce script en fait...
Citation
Citation
Quant aux serviteurs, si tu comptes mettre 5 maximum, tu devrais créer 5 references, et utiliser une gestion des references, en faisant des resurrect/moveto player avec ordre de priorité 1 à 5 selon les serviteurs. Je sais pas si tu vois ce que je veux dire, mais ayant une limitation ca serait sans doute mieux.
Citation
Citation
Citation
Et là, avec un peu de bon sens, tu te rends compte que ca ne veut rien dire.
Je pense que tu as dû inverser "cadavre" et "placeatme MUsqueletteinvochostile 1 1,1", car dans ce cas ca peut etre logique de mettre la variable invoc a la valeur de la variable cadavre (variable appartenant au squelette créé par placeatme). Tu vois le probleme maintenant ?
Citation
Citation
Citation
Bon, ca te fera un effet tout autour de toi, mais c'est quand meme une zone... (n'oublie pas de mettre le sort appelant sur 'soit' (en plus ca fera penser a la reanimation dans Diablo II...))
+++ !
Si, comme moi vous êtes perdu(e) sur le net : www.perdu.com
#24
Posté 28 mai 2007 - 12:55
Au contraire
set MUnecroquest.invoc to cadavre.placeatme MUsqueletteinvochostile 1 1,1
est plus logique
C'est reference la creature qui est invoqué
au lieu de dire c'est creature la reference qui est invoqué ?
D'ailleur, on ne peut placer une reference, et encore pire si elle n'a aucune valeur ...
c'est d'ailleur expliqué ici a la fin ...
Si le cadavre contient des objets de quêtes, c'est au PJ de faire attention ...
Pour les ordres, je peux pas mettre dans le meme script vu que c'est dans un bloc onactivate et que c'est le squelette qui doit etre activé ...
POur les cadavres, je les disable pas car ils prennent tout de meme de la place dans la cell alors que dans la cell poubelle il ne prenne rien, c'est de l'optimisation. SI un gros combat, le cadavre en plus peut faire ramer, sans il le fera moins. Je procede comme cela lorsque mon pnj n'est plus utile
Pour les variables, c'est des variables d'etats (entre guillemet). Au lieu d'ecrire dix fois la meme ligne dans le script, on creer des variables, et a la fin du script selon celles ci, on creer la bonne creatures. C'est pour bien demarquer les etapes ...
EDIT : c'est bien area qui plantait, sa remarche. Bon jme lance dans des test de temps et puis apres les types de creatures
Modifié par Josse, 28 mai 2007 - 14:25.
#25
Posté 28 mai 2007 - 16:20
Josse, le 28.05.2007 à 07:50, dit :
...
...
Quand a ton script le magicien, je le trouve au contraire pas tres claire car tu met emboite les diverses etapes, donc si je veux modifié, je pige plus trop rien, tout est melangé. MAis je regarde si je vois des trucs plus interressant (j'en ai d'ailleur vue ^^)
Sinon, je perciste a dire que c'est la area qui bug car avant que je la mette sa marchait. Je vais tester cela comme sa on verra bien
salut
pour mon script je le trouve plus clair car justement imbriquer et structurer, enfin bref j'avais justement placé des commentaires afin que tu saches ou placer ton code donc ...
pour ce qui est des durées cumulées ca donnerai un truc du genre :
scn MUspellnecromanciescript ref cadavre short NbGemme begin ScriptEffectStart Set cadavre to GetSelf if ( (cadavre.getdead == 1) && (cadavre.getisplayablerace == 1)) ;init de la variable de temps set MUnecroquest.temps to 0 ;Incrementation de la variable de temps en fonction du nombre de gemmes set NbGemme to cadavre.getitemcount SoulGem1Petty1PettySoul set MUnecroquest.temps to MUnecroquest.temps+10*NbGemme cadavre.removeitem SoulGem1Petty1PettySoul,NbGemme set NbGemme to cadavre.getitemcount SoulGem2Lesser1PettySoul set MUnecroquest.temps to MUnecroquest.temps+20*NbGemme cadavre.removeitem SoulGem2Lesser1PettySoul,NbGemme set NbGemme to cadavre.getitemcount SoulGem2Lesser2LesserSoul set MUnecroquest.temps to MUnecroquest.temps+20*NbGemme cadavre.removeitem SoulGem2Lesser2LesserSoul,NbGemme set NbGemme to cadavre.getitemcount SoulGem3Common1PettySoul set MUnecroquest.temps to MUnecroquest.temps+30*NbGemme cadavre.removeitem SoulGem3Common1PettySoul ,NbGemme set NbGemme to cadavre.getitemcount SoulGem3Common1PettySoul set MUnecroquest.temps to MUnecroquest.temps+30*NbGemme cadavre.removeitem SoulGem3Common1PettySoul ,NbGemme set NbGemme to cadavre.getitemcount SoulGem3Common2LesserSoul set MUnecroquest.temps to MUnecroquest.temps+30*NbGemme cadavre.removeitem SoulGem3Common2LesserSoul ,NbGemme set NbGemme to cadavre.getitemcount SoulGem3Common3CommonSoul set MUnecroquest.temps to MUnecroquest.temps+30*NbGemme cadavre.removeitem SoulGem3Common3CommonSoul ,NbGemme ;si gemme noir alors -1 pour le temps dans tous les cas set NbGemme to cadavre.getitemcount BlackSoulGemFilled if (NbGemme > 0) set MUnecroquest.temps to -1 cadavre.removeitem BlackSoulGemFilled ,NbGemme endif if (cadavre.getitemcount ScrollStandardCommandCreature2Apprentice > 0 )||( cadavre.getitemcount ScrollStandardCommandCreature3Expert > 0) messagebox "La cible est ranimée de manière amicale" ;Le code pour le deplacement de ton serviteur commandable est à placer ici ;exemple : ;serviteurref.ResurrectActor ;serviteurref.ResetHealth ;serviteurref.moveto cadavre ;cadavre.disable ;Serviteurref.setav aggression 0 ;Serviteurref.evp else messagebox "La cible est ranimée de manière hostile" ;Le code pour le deplacement de ton serviteur hostile est à placer ici ;exemple : ;serviteurref.ResurrectActor ;serviteurref.ResetHealth ;serviteurref.moveto cadavre ;cadavre.disable ;Serviteurref.setav aggression 100 ;Serviteurref.setrestrained 0 ;Serviteurref.evp endif else messagebox "La cible n'est pas autorisée pour de la necromancie" return endif endj'espère que tu trouves ce script plus clair ...
Et enfin, je suis de l'avis de Daimyo Tai Shi sur les dernières lignes de ton script et j'ai mis en commentaire une façon d'appeler ton serviteur et de l'initialiser ... reste juste a prevoir ses packages et le moyen de lui donner des ordres
une fois disabler si tu veux deplacer le cadavre ... pourquoi pas ...
A plus .
Modifié par Le Magicien, 28 mai 2007 - 20:44.
0 utilisateur(s) li(sen)t ce sujet
0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)