#26
Posté 08 août 2012 - 23:56
#27
Posté 09 août 2012 - 11:06
En procédant par analogie avec cet autre exemple (-[Commentaire EDIT : Je suis un boulet, tu m'avais déjà mis la procédure en première réponse en avril...]-) j'aboutis donc à ceci :
Citation
Actor property EncChaurusBoss auto
Actor property DLC1EncChaurusBoss auto
ObjectReference DLC1EncChaurusBoss
Event OnDeath(Actor Killer)
Game.GetPlayer().PlaceAtme(DLC1EncChaurusBoss)
EndEvent
Mais ça ne fonctionne paaaaaaaaaas !
Modifié par Spitoven, 09 août 2012 - 13:44.
#28
Posté 09 août 2012 - 11:38
actor property playerref auto
Cela permet d'améliorer la vitesse d'exécution des scripts. L'alternative étant 20 fois plus rapide que le game.getplayer().
Deuxièmement, l'event ondeath() n'est-il pas lié aux scripts de type "extends actor" ?
Asctuce pour tester : Place une notification juste après la ligne event ondeath : debug.notification("c'est moi l'event ondeath!!!")
Si elle apparait, l'event est pris en compte. Si elle n'apparait pas, c'est que l'event ne correspond pas au type de script, ce que je suppose, n'ayant pas testé et n'utilisant jamais cet event.
Il faut éviter d'avoir des propriétés et des variables avec le même nom. Le script devient illisible.
De mémoire, il existe l'instruction placeactoratme...qui serait peu être utile dans ton cas. Dans ce cas, il faut utiliser la propriété de type actor de ton boss.
Plutôt que de placer l'actor au niveau du joueur, je l'aurais placé au niveau de l'ancien qui est mort...
Une référence correspond à un objet placé dans une cellule. Si c'est pour amener une référence que tu as créé dans une cellule tampon, il faut utiliser un moveto. exemple : mareference.moveto(playerref).
S'il est dans la même cell est pas loin, un translateto() peut être utile. Si c'est un actor, un petit package des familles conditionné par une variable globale et un petit evaluatepackage() pour qu'il réfléchisse à son avenir est tout indiqué. Il est ainsi possible de faire venir un acteur vers un joueur. Cependant, il faut s'assurer que l'acteur ne contienne que des copies des packages d'origine car il faut les conditionner à l'inverse pour qu'ils ne soient pas pris en compte.
Autre solution : placer l'actor dans le donjon avec le CK (il devient une référence) en le mettant disabled. Il suffira de faire un enable() sur sa référence pour qu'il apparaisse.
Modifié par Gérauld, 09 août 2012 - 11:40.
#29
Posté 09 août 2012 - 13:33
Gérauld, le 09 août 2012 - 11:38, dit :
actor property playerref auto
Cela permet d'améliorer la vitesse d'exécution des scripts. L'alternative étant 20 fois plus rapide que le game.getplayer().
Merci. Je le ferai quand le script fonctionnera, afin de ne pas tout embrouiller tant que j'ignore d'où vient le problème.
Gérauld, le 09 août 2012 - 11:38, dit :
Asctuce pour tester : Place une notification juste après la ligne event ondeath : debug.notification("c'est moi l'event ondeath!!!")
Si elle apparait, l'event est pris en compte. Si elle n'apparait pas, c'est que l'event ne correspond pas au type de script, ce que je suppose, n'ayant pas testé et n'utilisant jamais cet event.
C'est fait, et ça, ça fonctionne. Le problème ne vient donc pas de là.
Gérauld, le 09 août 2012 - 11:38, dit :
Mais je ne saisis pas bien. Qu'est la propriété et qu'est la variable ici ? J'ai mis le même nom dans mon script car je croyais qu'il s'agissait partout du même objet.
Gérauld, le 09 août 2012 - 11:38, dit :
Quelle est la différence avec l'instruction placeatme ?
Gérauld, le 09 août 2012 - 11:38, dit :
Merci mais j'ai juste envie qu'il apparaisse derrière le joueur et qu'il l'attaque. Sachant qu'à ce que j'ai cru remarquer le placeatme fait apparaître l'objet derrière la cible.
Gérauld, le 09 août 2012 - 11:38, dit :
S'il est dans la même cell est pas loin, un translateto() peut être utile.
En l'occurrence, le premier boss (qui initie le script en mourant), est déjà placé dans une cellule, tandis que le second (qui doit apparaître) n'est placé nulle part dans le jeu. Où donc dois-je mettre des -"ref" et où dois-je ne pas en mettre ?
Gérauld, le 09 août 2012 - 11:38, dit :
C'est ce que je voulais faire au début, et puis, finalement, ne trouvant pas d'endroit convenable où placer mon second boss, j'ai décidé de procéder selon la méthodologie actuelle.
Modifié par Spitoven, 09 août 2012 - 13:36.
#30
Posté 09 août 2012 - 14:14
Le script deviendrait un truc du genre (non testé et non compilé) :
Scriptname SuperChaurus extends ObjectReference Actor property playerref auto Actorbase property DLC1EncChaurusBoss auto Event OnDeath(Actor Killer) playerref.PlaceActorAtme(DLC1EncChaurusBoss).startcombat(playerref) EndEvent
EDIT : Il est aussi possible de choisir un modificateur de niveau avec la commande placeactoratme... Regarde donc sur le site du CK.
Modifié par Gérauld, 09 août 2012 - 14:16.
#31
Posté 09 août 2012 - 22:07
J'ai utilisé ton script avec la ligne de notification debug (qui fonctionne). Je ne vois pas ce qui cloche
EDIT : Ce CK est vraiment étonnant. Je n'avais pas fait l'auto-fill. Après l'avoir effectué par acquis de conscience, le script n'a en rien été modifié, mais à présent il fonctionne. L'icône du script s'est quant à elle retrouvée changée. C'est relativement incompréhensible, mais du moment que ça marche... YOUPI !
Merci infiniment à tous les deux
Modifié par Spitoven, 09 août 2012 - 22:22.
#32
Posté 14 août 2012 - 21:28
Je fais apparaître encore un autre boss (j'adore ça ).
Pour le coup c'est la même chose que précédemment, mais en faisant apparaître le deuxième boss à l'emplacement du premier quant celui-ci meurt, au lieu de le faire apparaître à côté du joueur.
J'ai placé ce script sur l'acteur de base du premier boss et j'aimerais qu'il soit générique, le problème étant qu'il me demande une référence devant PlaceActorAtMe. Je suppose qu'il existe une fonction permettant au script d'obtenir automatiquement la référence de l'acteur qui meurt, mais je ne parviens pas à la trouver.
Pouvez-vous m'aider ?
Modifié par Spitoven, 14 août 2012 - 21:30.
#33
Posté 15 août 2012 - 07:59
essais avec self ...
ça donne un truc comme ça :
Scriptname NomDuScriptGenerique extends ObjectReference Actor property playerref auto Actorbase property Boss2 auto Event OnDeath(Actor Killer) Self.PlaceActorAtme(Boss2).startcombat(playerref) EndEventLe boss devrait apparaitre sur l'objet appelant le script dans notre cas, le boss qui vient de mourir.
#35
Posté 01 septembre 2012 - 00:46
J'ai eu l'outrecuidance de penser que je parviendrais à me débrouiller seul pour mon prochain boss
Et bien non
Alors je vous expose la situation :
- Attention, contient des spoilers sur la scène finale de Dawnguard -
Mon script se déclenche à la mort d'Harkon et a 3 buts :
- Pousser deux gros chiens qui se trouvent dans la salle du combat final depuis le début à attaquer le joueur si ce n'est pas déjà fait.
- Retirer du jeu un personnage qui va apparaître sous une autre forme.
- Faire apparaître cette nouvelle forme dudit personnage dans la salle du combat final et le faire attaquer le joueur.
Ce qui donne ceci (attaché à Harkon) :
Citation
Actor property playerref auto
Actor property DLC1VQ09Hound1ref auto
Actor property DLC1VQ09Hound2ref auto
Actor property DLC1LamaeBalStaticref auto
Actor property DLC1LamaeBalFinalref auto
Event OnDeath(Actor Killer)
DLC1VQ09Hound1ref.startcombat(playerref)
DLC1VQ09Hound2ref.startcombat(playerref)
DLC1LamaeBalStaticref.Delete()
DLC1LamaeBalFinalref.Enable().startcombat(playerref)
EndEvent
Et j'obtiens cela :
Citation
Compiling "DLC1VQ09Script"...
e:\program files\steam\steamapps\common\skyrim\Data\Scripts\Source\temp\DLC1VQ09Script.psc(13,47): none is not a known user-defined type
No output generated for DLC1VQ09Script, compilation failed.
Batch compile of 1 files finished. 0 succeeded, 1 failed.
Failed on DLC1VQ09Script
Je n'aime pas les "none" ! (...Et j'en suis tombé amoureux !)
Pourriez-vous m'aider une fois de plus ?
#36
Posté 02 septembre 2012 - 12:41
DLC1LamaeBalFinalref.Enable().startcombat(playerref)en
DLC1LamaeBalFinalref.Enable() DLC1LamaeBalFinalref.startcombat(playerref)
Shéogorath - Prince de la folie
Vrai Grand Moddeur et FPIA à ses heures...#38
Posté 23 décembre 2012 - 21:27
Décidément, à chaque nouveauté, ça ne passe pas. C'est moi ou ces scripts ne sont pas intuitifs du tout ?
Bref, j'essaie de faire en sorte qu'au moment où un boss commence à se battre contre le joueur, un autre acteur apparaisse en renfort. Ce qui donne ça (les parties non-soulignées fonctionnent correctement) :
Citation
Actorbase property Archmedon2 auto
Actor property playerref auto
Actor property AmnThalmorMage0REF auto
Actor property AmnThalmorMelee1REF auto
Actor property AmnThalmorMelee2REF auto
Event OnCombatStateChanged(Actor playerref)
AmnThalmorMage0REF.Enable()
EndEvent
Event OnDying(Actor Killer)
Self.PlaceActorAtme(Archmedon2)
Self.Delete()
AmnThalmorMelee1REF.Enable()
AmnThalmorMelee2REF.Enable()
EndEvent
Et bien évidemment, ça ne marche pas (mais pas d'erreur de compilation)
Modifié par Spitoven, 23 décembre 2012 - 21:30.
#39
Posté 23 décembre 2012 - 23:30
Cela arrive souvent.
Ce qu'il y a entre parenthèses après l'event n'est pas un test mais uniquement le type et le nom des valeurs retournées par l'event. On les teste dans l'event comme suit :
Event OnCombatStateChanged(Actor akTarget, int aeCombatState)
if aktarget == playerref && aeCombatState > 0
;si c'est le joueur et que l'actor sur lequel est placé le script est au combat ou cherche le joueur
;on arrive ici
endif
endevent
Si les conditions du 1er paragraphe sont remplies, as-tu vérifié que les propriétés l'étaient également?
Place
debug.notification("Event OnCombatStateChanged déclenché")
après la ligne d'event du même nom. Cet event étant de type actor, je l'aurai intuitivement vu dans un script de type extends actor même si, normalement, un script de type objectreference placé sur un actor doit le faire déclencher aussi mais on ne sait jamais.
Plutôt qu'un enable(), j'aurai utilisé un Self.PlaceActorAtme(nomdel'actor) pour placer le renfort...
#40
Posté 24 décembre 2012 - 00:41
Alors :
- Je n'avais pas fait la debug notification car je fais dorénavant très attention à ne pas me tromper dans mes noms de propriétés et variables, alors je ne l'estime pas nécessaire, mais après l'avoir faite par acquis de conscience, elle ne s'affiche bel et bien pas.
- Toutes les conditions sont bien remplies, le script devrait donc pourtant fonctionner...
- J'ai essayé avec un script extends Actor, la réaction est différente, j'ai un message d'erreur :
Citation
Actor property playerref auto
Actor property AmnThalmorMage0REF auto
Event OnCombatStateChanged(Actor playerref)
debug.notification("Event OnCombatStateChanged déclenché")
AmnThalmorMage0REF.Enable()
EndEvent
Citation
Compiling "FPArchmedon1Extends"...
e:\program files\steam\steamapps\common\skyrim\Data\Scripts\Source emp\FPArchmedon1Extends.psc(6,0): the parameter types of function oncombatstatechanged in the empty state on script fparchmedon1extends do not match the parent script actor
No output generated for FPArchmedon1Extends, compilation failed.
Batch compile of 1 files finished. 0 succeeded, 1 failed.
Failed on FPArchmedon1Extends
Modifié par Spitoven, 24 décembre 2012 - 00:41.
#41
Posté 24 décembre 2012 - 10:29
La syntaxe de la ligne d'event ne doit pas être changée (seul les noms de variables peuvent être éventuellement modifiées mais ne doivent pas correspondre aux variables et propriétés du script).
Il faut que tu reprennes ce que j'ai mis dans mon précédent post.
Comme précisé dans mon précédent post, ce qui est compris entre parenthèses après l'event correspond aux données que t'envoie l'event et non à des conditions de déclenchement.
Il faut ensuite tester après la ligne "event...." les variables comprises dans les parenthèses pour savoir si elles ont les valeurs que tu souhaite.
Le bout de script est dans mon précédent post.
#42
Posté 24 décembre 2012 - 12:12
Dans ton exemple, il y a deux points-virgules, après le second je suppose qu'il faut mettre l'effet désiré (en l'occurrence le Enable), mais après le premier (là où tu as écrit : "si c'est le joueur et que l'actor sur lequel est placé le script est au combat ou cherche le joueur") c'est quoi ?
PS : J'ai oublié de dire : J'utilise Enable car l'acteur doit apparaître à un endroit précis, j'utilise le PlaceActorAtMe uniquement quand je veux spécifiquement qu'il apparaisse à côté d'un autre acteur.
Modifié par Spitoven, 24 décembre 2012 - 12:13.
#43
Posté 24 décembre 2012 - 13:14
En ajoutant un headingmarker et un placeactoratme sur le marqueur, tu obtiens aussi un placement précis...
#46
Posté 11 janvier 2013 - 21:16
Je suis pas sûr de la traduction, mais peut-être OnEnterBleedout().
Modifié par Lucead, 11 janvier 2013 - 21:17.
#47
Posté 11 janvier 2013 - 21:38
Il faut toujours faire attention avec les sauvegardes utilisées pour les tests de versions différentes de mods et surtout de scripts (à fortiori si des propriétés changent) : toujours utiliser une sauvegarde n'ayant pas connu une version antérieure du mod.
#48
Posté 11 janvier 2013 - 21:42
Spitoven, le 11 janvier 2013 - 21:10, dit :
Existe-t-il un type d'événement correspondant au moment où un acteur en fin de vie pose un genou et une main au sol pour récupérer ?
Lucead, le 11 janvier 2013 - 21:16, dit :
Je suis pas sûr de la traduction, mais peut-être OnEnterBleedout().
En fait, il vérifie très bien ce que Spitoven veut... c'est marrant car je cherchais une fonction ou un Event semblable, hier!
Par la même occasion ça marche aussi lorsqu'un Actor est KO (lorsqu'il a un flag "Essential" ou "Protected")
Pour un actor mourrant (sans flag), il est difficile parfois de faire exécuter l'Event, car si l'actor a peu de vie : le dernier coup peut lui être fatal - Dans ce cas, l'Event n'est pas pris en compte, l'actor n'a pas eu le tps d'être mourrant (en gros).
grillé par Gérauld.
Bref j'expérimente, car là de mon coté je prépare un mod d'Arène plus consistent de ce que propose le Nexus.
#49
Posté 11 janvier 2013 - 21:57
Gérauld, le 11 janvier 2013 - 21:38, dit :
ced, le 11 janvier 2013 - 21:42, dit :
#50
Posté 11 janvier 2013 - 22:18
Citation
Modifié par Spitoven, 11 janvier 2013 - 22:22.
0 utilisateur(s) li(sen)t ce sujet
0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)