Affichage des résultats 1 à 15 sur 15

Discussion: [script] script lancé par un objet

  1. #1
    Date d'inscription
    mars 2010
    Localisation
    Paris
    Messages 
    1 053

    [script] script lancé par un objet

    J'ai crée un objet qui permet d'invoquer un créature à votre service.

    L'objet et le sort d'invocation fonctionne.

    Je désire ajouter la règle suivante: l'objet est utilisable uniquement par le Charname.

    A ma connaissance, on ne peut pas bloquer sur le Charname facilement (case à cocher dans l'objet).

    Je pense que la meilleure manière est la suivante:
    - lancer un script par l'objet au lieu du sort.
    - le script teste si l'objet est dans l'équipement du Charname. Si c'est le cas, il lance le sort.

    J'utilse Set AI Script [82] au niveau de l'objet.

    Le script est le suivant:
    IF
    HasItem("cohelm01",PLAYER1)
    THEN
    RESPONSE #100
    ForceSpellRES("cohelm01",PLAYER1)
    END


    Le sort ne se lance pas. Si je remplace par un script Basique idem (génération d'un son ou apparition d'une créature). L'objet ne lance pas le script visiblement.

    Où est le problème?
    Existe t'il une solution plus simple?

    [script] script lancé par un objet-info.jpg

    Cocrane

  2. #2
    Date d'inscription
    janvier 2012
    Messages 
    52
    Bonjour,

    c'est le nom de l'objet qu'il faut indiquer dans la fonction HasItem (donc MISCP64) non le nom du script


    edit :
    j'aurais plutôt utilisé l'opcode 309 dans l'objet et complété les scripts baldur.bcs et baldur25.bcs avec quelque chose comme ça :
    IF
    Global("Flag", "LOCALS", 1)
    InPartySlot(Myself, 0)
    HasItemEquipedReal("MISCP64", Myself)
    THEN
    SetGlobal("Flag", "LOCALS", 0)
    ForceSpellRES("cohelm01", Myself)
    END

    dans tous les cas je te déconseille l'utilisation de l'opcode 82 avec le type AREA, à moins que ce ne soit justement utilisable que dans une zone bien définie ?
    Dernière modification par rivvers ; 24/01/2020 à 09h52. Motif: complétion

  3. #3
    Date d'inscription
    mars 2010
    Localisation
    Paris
    Messages 
    1 053
    Merci pour ton retour.

    Effectivement il y a une erreur que j'avais corrigé. Mais ca ne résout pas le problème.

    Pour ta proposition de code:
    - l’événement doit être déclenché par l'objet quand tu cliques. Il ne faut pas le lancer via BALDUR.BCS
    - HasItem suffit pour savoir qui et quoi.

    J'ai finalement trouvé la solution pour que tout fonctionne et il y a plusieurs choses à gérer.

    Voici la recette XD


    1-Paramétrage de l'objet (cohelm01.ITM)
    [script] script lancé par un objet-1.jpg

    [script] script lancé par un objet-2.jpg
    - ajouter l'effet Set AI Script [82], choisir override. Je ne parviens à rien avec les autres.
    > une fois le script lancé, il est actif et il tourne en boucle. Il faut donc gérer le problème.

    Code:
    [cohelm01.baf]
    // Le PLAYER possède l'objet et la créature n'est pas invoquée.
    IF
      HasItem("MISCP64",Player1)
      Global("CO_horreur_top","GLOBAL",0)  
    THEN
      RESPONSE #100
      SetGlobal("CO_horreur_top","GLOBAL",1)
      ReallyForceSpellRES("COHELM01",Player1)
      ChangeAIScript("",OVERRIDE)  // on retire le script du PLAYER1: évite au script de tourner en boucle
    END
    
    // Cas d'un autre PLAYER cherchant à utiliser l'objet: il ne se passe rien et on arrête le script.
    // Nécessaire car si l'objet est placé ensuite sur le PLAYER1. L'invocation se lancera quand même sans demande d'invocation. (les conditions sont réunies)
    IF
      !HasItem("MISCP64",Player1)
    THEN
      RESPONSE #100
       ChangeAIScript("",OVERRIDE) // on retire le script du PLAYERx: évite au script de tourner en boucle    
    END
    2-Paramétrage d'un script à placer sur la créature invoquée.
    A sa mort, il faut réinitialiser la variable à 0 pour une future invocation.

    Code:
    [cohelm02.baf]
    IF
     die()
    THEN
     RESPONSE #100
     SetGlobal("CO_horreur_top","GLOBAL",0)
     ReallyForceSpellDead(Myself,RED_HOLY_MIGHT)
    END
    3-Paramétrage du sort (.SPL)
    [script] script lancé par un objet-3.jpg

    4-Paramétrage de l'effet pour l'invocation
    [script] script lancé par un objet-4.jpg

    L'horreur guerrière vous salue. :-)
    Nom : 5.jpg
Affichages : 42
Taille : 4,1 Ko


    Il reste un cas à gérer, l'horreur guerrière arrive au terme de son invocation et ne meurt pas. La variable ne va pas se ré-initialiser.
    J'ai essayé d'utiliser EXISTS mais c'est limité à la carte en cours et mon test n'a pas marché.
    Je peux:
    - mettre un TIMER pour réinitialiser la variable mais je trouve la solution un peu lourde.
    - autoriser une seule invocation par jour (plus besoin de la variable). Actuellement c'est le prix du sang.


    On peut utiliser cette logique pour rendre utilisable un objet uniquement par le PLAYER1.

    Cocrane
    Dernière modification par Cocrane ; 25/01/2020 à 16h51.

  4. #4
    Date d'inscription
    janvier 2012
    Messages 
    52
    Pourquoi ne pas rajouter un effet avec le delay adéquat dans le sort cohelm01 pour mettre la variable CO_horreur_top à 0 grâce à l'opcode n°265 ?
    Je crois que cela pourrait résoudre le problème si l'horreur guerrière venait au terme de son invocation.


    L'invocation s'effectue si un autre joueur utilise l'objet et que Player1 le possède également ?

  5. #5
    Date d'inscription
    mars 2010
    Localisation
    Paris
    Messages 
    1 053
    Pourquoi ne pas rajouter un effet avec le delay adéquat dans le sort cohelm01 pour mettre la variable CO_horreur_top à 0 grâce à l'opcode n°265 ? Je crois que cela pourrait résoudre le problème si l'horreur guerrière venait au terme de son invocation.
    DELAY() est une idée. Dans ce cas, je le vois dans le script de la créature. Au bou de tant de temps, la créature disparait. Il faut penser à ajouter de l'effet visuel de désinvocation.

    L'invocation s'effectue si un autre joueur utilise l'objet et que Player1 le possède également ?
    Si l'objet existait en deux exemplaires et qu'il était placé sur le PLAYER1 et le PLAYERX, le code pourrait fonctionner sur un clic objet sur le PLAYERX.

    Mais j'ai prévu un seul exemplaire. :-)

    Cocrane

  6. #6
    Date d'inscription
    janvier 2012
    Messages 
    52
    D'accord ! Je serai plutôt partisan de ta solution, bien que plus complexe, elle me parait plus propre que la version que j'ai proposé.


    En rajoutant la condition InPartySlot(Myself, 0) pour le lancement du sort, tu enlèves efficacement tout risque de dérapage si un joueur venait à utiliser des commandes et rendrait, par la même occasion, ton système efficace pour d'autres créateurs qui souhaitaient l'utiliser pour un objet existant en plusieurs exemplaires...

  7. #7
    Date d'inscription
    avril 2011
    Localisation
    Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
    Messages 
    4 688
    Le hic, c'est que tu supprimes le script du slot override, indispensable pour la linéarité du jeu. Essaie plutôt le slot Race qui, de mémoire, n'est pas utilisé par les PJ, ou alors par très peu (c'est celui que j'ai décidé d’utiliser pour mes kits après plusieurs essais).
    CARPE DIEM...
    Co-modérateur de La Forge et de La Chambre des Scribes
    Moddeur qui s'arrache les cheveux...

  8. #8
    Date d'inscription
    mars 2010
    Localisation
    Paris
    Messages 
    1 053
    Freddy>
    Je partage ton avis, RACE est mieux que OVERRIDE. Mais lorsque j'ai testé avec RACE (je change OVERRIDE partout), ca ne marchait plus... Je peux tenter une dernière fois maintenant que tout le code est "stable". Vu que tu me dis que ca marche chez toi. :-)


    Rivers>
    Code:
    En rajoutant la condition InPartySlot(Myself, 0) pour le lancement du sort, tu enlèves efficacement tout risque de dérapage 
    si un joueur venait à utiliser des commandes et rendrait, par la même occasion, ton système efficace pour d'autres créateurs 
    qui souhaitaient l'utiliser pour un objet existant en plusieurs exemplaires...
    Effectivement, tu fais bien d'insister. (j'ai la tête dure parfois)
    InPartySlot(Myself, 0) va vérifier que le code est lancé sur le PLAYER1. Du coup, le sort ne sera jamais lancé sur un autre PLAYER.

    Du coup le code sur l'objet donnera cela au final (à tester):
    Code:
    IF
     InPartySlot(Myself, 0) // Script lancé via PLAYER1
     HasItem("MISCP64",PLAYER1) // PLAYER1 possède l'objet
     Global("CO_horreur_top","GLOBAL",0) // La créature n'est pas invoquée en ce moment.
    THEN
     RESPONSE #100
     SetGlobal("CO_horreur_top","GLOBAL",1)
    
     ReallyForceSpellRES("cohelm01",PLAYER1)
     ChangeAIScript("",OVERRIDE) 
    END
    
    // Cas d'un autre PLAYER cherchant à utiliser l'objet
    IF
     !HasItem("MISCP64",PLAYER1)
    THEN
     RESPONSE #100
    
     ChangeAIScript("",OVERRIDE) 
    END

  9. #9
    Date d'inscription
    janvier 2012
    Messages 
    52
    Il est délicat de proposer un axe d'amélioration ou une autre approche sans donner l'impression de l'imposer... Loin de moi l'idée de stopper ou de canaliser un élan créatif.

    Ton idée est fonctionnelle même si comme l'a indiqué Freddy, certains problèmes pointent le bout de leur nez.
    OVERRIDE est plus conseillé que AREA, RACE plus que OVERRIDE. Mais qu'importe le choix, nous ne pouvons que limiter la casse et prier pour que personne n'utilise un mod qui inclut des PJ ayant des scripts RACE.

    La solution que j'ai proposé dans mon premier post n'est pas confronté à ce problème et c'est bien l'utilisation de l'objet qui déclenchera le sort (c'est d'ailleurs le seul intérêt de l'objet : mettre la variable flag à 1 qui donne le feu vert au script de lancer le sort sur player1, la nuance c'est que le script est toujours actif donc nous n'avons rien à inventer pour le lancer). Mais elle implique de charger un peu plus les deux scripts "universels", pour un objet pourquoi pas. Mais si un créateur un peu zélé venait à inventer 50 objets magiques top cool pour le protagoniste ? Mais elle a, je crois, l'avantage de ne pas générer d'incompatibilité avec d'autres mods.
    edit :
    d'ailleurs je remarque qu'il pourrait ne pas fonctionner correctement, 'Myself' n'est pas une cible valide dans ce script
    fin de l'edit


    Il y a bien une solution propre en utilisant un splstate unique, mais là encore, il faut prier pour qu'aucun créateur n'utilise le même pour ses sorts... Et comme chacun fait à sa sauce...

    Je vais continuer à creuser.
    Dernière modification par rivvers ; 27/01/2020 à 16h06.

  10. #10
    Date d'inscription
    mars 2010
    Localisation
    Paris
    Messages 
    1 053
    Code:
    Il est délicat de proposer un axe d'amélioration ou une autre approche sans donner l'impression de l'imposer... Loin de moi l'idée de stopper ou de canaliser un élan créatif.
    Si il y a ambiguïté, j’apprécie l'échange et je ne me suis pas senti stoppé dans mon élan. Au contraire, en général, l'échange d'idées est stimulant et enrichissant. :-)

    Code:
    Il y a bien une solution propre en utilisant un splstate unique, mais là encore, il faut prier pour qu'aucun créateur n'utilise le même pour ses sorts... Et comme chacun fait à sa sauce...
    "SPLSTATE?"

    SPL pour sort? State? pour static? :-) Tu m'as perdu.


    Si tu as envie de trouver la solution idéale, je suis curieux de voir une autre façon de faire qui marche bien. Sans Script pour filtrer, je ne vois pas.

  11. #11
    Date d'inscription
    janvier 2012
    Messages 
    52
    Stimulant et enrichissant : tout est dit

    Cette solution utilisera quand même un script, pour s'assurer qu'il s'agit bien du Player1 mais une seule fois dans la partie et pour tous les objets (c'est plus appréciable que le nombre_de_créatures multipliés par le nombre_d'objet toutes les secondes).

    Les splstate (spl pour sort et state pour état) renseignent une valeur binaire, ils informent sur l'état du joueur à un instant précis. Ils sont très souvent ajoutés puis gérés manuellement (via des fichiers eff, itm, spl ou bcs le plus souvent). Par exemple, le splstate n°24, nommé BARKSKIN, s'il est activé, indique que le personnage subit les effets du sort Peau d'écorce (la liste complète se trouve dans le fichier SPLSTATE.IDS, d'où leur nom). Leur nombre est limité, c'est pourquoi si différents créateurs venaient à utiliser le même splstate cela peut occasionner des résultats quelque peu imprévus.

    La technique est très simple en apparence : nous activons en début de partie un splstate précis pour le Player1 (par l'opcode n°328) puis nous bloquons les effets de l'objet ou du sort si le splstate est inactif (par l'opcode n°318 ou 324).
    Cela fonctionnerait très bien si la cible est Myself mais je me rends compte qu'il sera nécessaire de bidouiller si ce n'était pas le cas...
    Cette solution ne semble pas aussi propre qu'espéré.
    Dernière modification par rivvers ; 28/01/2020 à 07h57. Motif: fôtes

  12. #12
    Date d'inscription
    janvier 2012
    Messages 
    52
    J'avoue n'avoir pas été totalement honnête... J'ai volontairement omis d'aborder le problème sous un angle en pensant pouvoir trouver une solution alternative et propre. J'ai échoué !
    Voici donc ce qui est certainement la solution la plus efficace :
    Miniatures attachées Miniatures attachées [script] script lancé par un objet-restriction-player1.png  

  13. #13
    Date d'inscription
    avril 2011
    Localisation
    Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
    Messages 
    4 688
    Malheureusement, Cocrane modde sur BGT.
    CARPE DIEM...
    Co-modérateur de La Forge et de La Chambre des Scribes
    Moddeur qui s'arrache les cheveux...

  14. #14
    Date d'inscription
    janvier 2012
    Messages 
    52
    Voilà une information qui change la donne... Les deux dernières solutions sont exclues d'office !?

  15. #15
    Date d'inscription
    mars 2010
    Localisation
    Paris
    Messages 
    1 053
    Effectivement je suis toujours sur BGT.

    J'ai pas encore joué les autres versions après le trône de Bhaal.

    On reste donc sur notre dernier script. :-p

Discussions similaires

  1. [SCRIPT] Comment savoir si un sort a été lancé ?
    Par Cocrane dans le forum Scripts
    Réponses: 6
    Dernier message: 15/12/2018, 11h05
  2. [SCRIPT] Détection d'un sort lancé
    Par Cocrane dans le forum Scripts
    Réponses: 8
    Dernier message: 13/10/2017, 14h40
  3. Réponses: 0
    Dernier message: 23/06/2017, 22h48
  4. [SCRIPT] Pb avec une cutscene qui ne se lance pas
    Par Grenouillebleue dans le forum Scripts
    Réponses: 9
    Dernier message: 15/10/2009, 23h00
  5. [ITM] Comment associer un script à un objet ?
    Par Shinook dans le forum Objets et magasins
    Réponses: 9
    Dernier message: 05/11/2005, 16h41

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257