Affichage des résultats 1 à 9 sur 9

Discussion: [SCRIPT] - Créature invisible change de comportement si son maître devient visible

  1. #1
    Date d'inscription
    avril 2009
    Localisation
    Wherever I may roam
    Messages 
    274

    [SCRIPT] - Créature invisible change de comportement si son maître devient visible

    Bonjour,

    Je bloque sur un script pour ma créature.

    La créature en question est un familier qui peut changer de forme, dès lors ou sa forme change, son script de comportement change. Dans sa forme initiale la créature ne peut pas attaquer les ennemis, elle agit uniquement en fonction des actions de son invocateur.

    Dès lors ou la créature prend sa forme humaine, dès que l'invocateur se cache dans l'ombre, la créature fait de même. J'ai entré un script qui ordonne à la créature de rester invisible si l'invocateur est invisible, même ci ceux-ci ont un ennemi en vue.

    Je souhaiterai que la créature attaque dans chacune de ces conditions:

    Si elle n'est pas invisible

    Si l'invocateur devient visible

    Si l'ennemi attaque l'invocateur malgré son invisibilité

    Le problème que je rencontre intervient dans le cas où la créature (le familier) et l'invocateur sont invisibles, et que l'invocateur attaque la créature ennemie (par la même occasion l'invocateur devient visible). Le familier décide d'attaquer la créature ennemie uniquement à la fin de son effet "cacher dans l'ombre" au lieu d'attaquer lorsque l'invocateur engage le combat.

    Voici le script que j'ai essayé:


    IF
    See(LastSummonerOf(Myself))
    StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    THEN
    RESPONSE #100
    Hide()
    Continue()
    END
    IF
    StateCheck(Myself,STATE_INVISIBLE)
    THEN
    RESPONSE #100
    MoveToObjectFollow(LastSummonerOf(Myself))
    END
    IF
    See(NearestEnemyOf(Myself))
    StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    THEN
    RESPONSE #100
    MoveToObjectFollow(LastSummonerOf(Myself))
    END
    IF
    See([EVILCUTOFF])
    StateCheck(LastSummonerOf(Myself),STATE_NORMAL)
    THEN
    RESPONSE #100
    Attack([EVILCUTOFF])
    END
    IF
    Die()
    THEN
    RESPONSE #100
    ReallyForceSpellDead(Myself,ILLUSION_DEATH) // SPIN835.SPL (No such index)
    DestroySelf()
    END
    IF
    ActionListEmpty()
    See(LastSummonerOf(Myself))
    THEN
    RESPONSE #100
    MoveToObjectFollow(LastSummonerOf(Myself))
    Continue()
    END
    Dernière modification par Faust ; 29/08/2017 à 19h19.
    "Wrath is the burden of those who haven't faith in humanity but there's no mean to avoid it. I guess it's my choice, just try to stand it."

    Wherever I May Roam.

  2. #2
    Date d'inscription
    mars 2010
    Localisation
    Paris
    Messages 
    1 273
    Salut Faust,
    ton explication est claire et détaillée.

    Ca donne l'impression que le code avec les conditions"Ennemis visible" et "Invocateur visible" n'agit pas. P.E que le changement de statut de l'invocateur met du temps à se rafraîchir.

    Attention à "MoveToObjectFollow" qui pour moi ne s'arrête jamais.


    A lecture de ton code, je te propose l'évolution suivante en gras.


    // ennemi visible. J'attaque l’ennemi si mon maitre est visible
    IF
    See(NearestEnemyOf(Myself)) // A tester aussi: ActuallyInCombat
    StateCheck(LastSummonerOf(Myself),STATE_NORMAL) // !StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE) // A tester à la place: inverse de invisible avec "!" devant
    THEN
    RESPONSE #100
    Attack([EVILCUTOFF])
    END


    IF
    See(LastSummonerOf(Myself))
    StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    THEN
    RESPONSE #100
    Hide()
    Continue()
    END

    // Je suis mon invocateur, si nous sommes invisibles.
    IF
    StateCheck(Myself,STATE_INVISIBLE)
    StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    THEN
    RESPONSE #100
    MoveToObjectFollow(LastSummonerOf(Myself))
    END

    // block non utile: la créature attaque uniquement si l'invocateur est visible.
    IF
    See(NearestEnemyOf(Myself))
    StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    THEN
    RESPONSE #100
    MoveToObjectFollow(LastSummonerOf(Myself))
    END


    IF
    Die()
    THEN
    RESPONSE #100
    ReallyForceSpellDead(Myself,ILLUSION_DEATH) // SPIN835.SPL (No such index)
    DestroySelf()
    END

    IF
    ActionListEmpty()
    See(LastSummonerOf(Myself))
    THEN
    RESPONSE #100
    MoveToObjectFollow(LastSummonerOf(Myself))
    Continue()
    END

    Cocrane

  3. #3
    Date d'inscription
    avril 2009
    Localisation
    Wherever I may roam
    Messages 
    274
    Citation Envoyé par Cocrane Voir le message
    Salut Faust,
    ton explication est claire et détaillée.

    Ca donne l'impression que le code avec les conditions"Ennemis visible" et "Invocateur visible" n'agit pas. P.E que le changement de statut de l'invocateur met du temps à se rafraîchir.

    Attention à "MoveToObjectFollow" qui pour moi ne s'arrête jamais.


    A lecture de ton code, je te propose l'évolution suivante en gras.


    // ennemi visible. J'attaque l’ennemi si mon maitre est visible
    IF
    See(NearestEnemyOf(Myself)) // A tester aussi: ActuallyInCombat
    StateCheck(LastSummonerOf(Myself),STATE_NORMAL) // !StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE) // A tester à la place: inverse de invisible avec "!" devant
    THEN
    RESPONSE #100
    Attack([EVILCUTOFF])
    END


    IF
    See(LastSummonerOf(Myself))
    StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    THEN
    RESPONSE #100
    Hide()
    Continue()
    END

    // Je suis mon invocateur, si nous sommes invisibles.
    IF
    StateCheck(Myself,STATE_INVISIBLE)
    StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    THEN
    RESPONSE #100
    MoveToObjectFollow(LastSummonerOf(Myself))
    END

    // block non utile: la créature attaque uniquement si l'invocateur est visible.
    IF
    See(NearestEnemyOf(Myself))
    StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    THEN
    RESPONSE #100
    MoveToObjectFollow(LastSummonerOf(Myself))
    END


    IF
    Die()
    THEN
    RESPONSE #100
    ReallyForceSpellDead(Myself,ILLUSION_DEATH) // SPIN835.SPL (No such index)
    DestroySelf()
    END

    IF
    ActionListEmpty()
    See(LastSummonerOf(Myself))
    THEN
    RESPONSE #100
    MoveToObjectFollow(LastSummonerOf(Myself))
    Continue()
    END

    Cocrane

    Salut Cocrane,

    Un grand merci pour ton intervention!

    J'ai suivi ton conseil, j'ai utilisé !StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE) et ai retiré le block suivant:

    // block non utile: la créature attaque uniquement si l'invocateur est visible.
    IF
    See(NearestEnemyOf(Myself))
    StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    THEN
    RESPONSE #100
    MoveToObjectFollow(LastSummonerOf(Myself))
    END

    Du coup tout fonctionne au poil, la créature attaque uniquement si son invocateur est visible!

    Merci!
    "Wrath is the burden of those who haven't faith in humanity but there's no mean to avoid it. I guess it's my choice, just try to stand it."

    Wherever I May Roam.

  4. #4
    Date d'inscription
    mars 2010
    Localisation
    Paris
    Messages 
    1 273
    Ravi que ça fonctionne.

    C'est souvent à cause de pas grand chose.

    Cocrane

  5. #5
    Date d'inscription
    avril 2009
    Localisation
    Wherever I may roam
    Messages 
    274
    En modifiant un petit peu, tout fonctionne correctement, auparavant après un certains nombre de "se cacher dans l'ombre" le familier restait visible et suivait l'invocateur qui était lui invisible. Avec ce script, s'est réglé:

    IF
    See([EVILCUTOFF])
    !StateCheck(Myself,STATE_INVISIBLE)
    THEN
    RESPONSE #100
    Attack([EVILCUTOFF])
    END
    IF
    See(NearestEnemyOf(Myself))
    !StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    OR(2)
    See(NearestEnemyOf(Myself))
    StateCheck(LastSummonerOf(Myself),STATE_IMPROVEDINVISIBILITY)
    THEN
    RESPONSE #100
    Attack([EVILCUTOFF])
    END
    IF
    See(LastSummonerOf(Myself))
    StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    THEN
    RESPONSE #100
    Hide()
    Continue()
    END
    IF
    StateCheck(Myself,STATE_INVISIBLE)
    THEN
    RESPONSE #100
    MoveToObjectFollow(LastSummonerOf(Myself))
    END
    IF
    See(LastSummonerOf(Myself))
    StateCheck(LastSummonerOf(Myself),STATE_IMPROVEDINVISIBILITY)
    THEN
    RESPONSE #100
    Hide()
    Continue()
    END
    IF
    StateCheck(Myself,STATE_INVISIBLE)
    THEN
    RESPONSE #100
    MoveToObjectFollow(LastSummonerOf(Myself))
    END
    IF
    ActionListEmpty()
    See(LastSummonerOf(Myself))
    THEN
    RESPONSE #100
    MoveToObjectFollow(LastSummonerOf(Myself))
    Continue()
    END
    IF
    Die()
    THEN
    RESPONSE #100
    ReallyForceSpellDead(Myself,ILLUSION_DEATH) // SPIN835.SPL (No such index)
    DestroySelf()
    END
    Dernière modification par Faust ; 30/08/2017 à 10h49.
    "Wrath is the burden of those who haven't faith in humanity but there's no mean to avoid it. I guess it's my choice, just try to stand it."

    Wherever I May Roam.

  6. #6
    Date d'inscription
    mars 2010
    Localisation
    Paris
    Messages 
    1 273
    Il y a une partie du code qui me gène. Il a pas mal changé.


    // j'attaque si ennemi visible et si mon maitre est visible
    IF
    See(NearestEnemyOf(Myself))
    !StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    OR(2)
    See(NearestEnemyOf(Myself)) // Déjà écrit au dessus donc c'est inutile fausse ton test "OR(2)"
    StateCheck(LastSummonerOf(Myself),STATE_IMPROVEDINVISIBILITY) // Je ne connais pas le statut "STATE_IMPROVEDINVISIBILITY"
    THEN
    RESPONSE #100
    Attack([EVILCUTOFF])
    END


    Je remplacerai du coup part:
    IF
    See(NearestEnemyOf(Myself))
    OR(2)
    !StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    StateCheck(LastSummonerOf(Myself),STATE_IMPROVEDINVISIBILITY)
    THEN
    RESPONSE #100
    Attack([EVILCUTOFF])
    END


    // Ce block existe deux fois dans ton code. Une fois suffit normalement.
    IF
    StateCheck(Myself,STATE_INVISIBLE)
    THEN
    RESPONSE #100
    MoveToObjectFollow(LastSummonerOf(Myself))
    END


    // Pour les deux blocks, je ne suis pas sur de comprendre ce que tu veux. Si la créature voit l'invocateur qu'il soit invisible ou non, elle se cache?
    IF
    See(LastSummonerOf(Myself))
    StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    THEN
    RESPONSE #100
    Hide()
    Continue()
    END

    IF
    See(LastSummonerOf(Myself))
    StateCheck(LastSummonerOf(Myself),STATE_IMPROVEDINVISIBILITY)
    THEN
    RESPONSE #100
    Hide()
    Continue()
    END


    Cocrane

  7. #7
    Date d'inscription
    avril 2009
    Localisation
    Wherever I may roam
    Messages 
    274
    Citation Envoyé par Cocrane Voir le message
    Il y a une partie du code qui me gène. Il a pas mal changé.


    // j'attaque si ennemi visible et si mon maitre est visible
    IF
    See(NearestEnemyOf(Myself))
    !StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    OR(2)
    See(NearestEnemyOf(Myself)) // Déjà écrit au dessus donc c'est inutile fausse ton test "OR(2)"
    StateCheck(LastSummonerOf(Myself),STATE_IMPROVEDINVISIBILITY) // Je ne connais pas le statut "STATE_IMPROVEDINVISIBILITY"
    THEN
    RESPONSE #100
    Attack([EVILCUTOFF])
    END


    Je remplacerai du coup part:
    IF
    See(NearestEnemyOf(Myself))
    OR(2)
    !StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    StateCheck(LastSummonerOf(Myself),STATE_IMPROVEDINVISIBILITY)
    THEN
    RESPONSE #100
    Attack([EVILCUTOFF])
    END


    // Ce block existe deux fois dans ton code. Une fois suffit normalement.
    IF
    StateCheck(Myself,STATE_INVISIBLE)
    THEN
    RESPONSE #100
    MoveToObjectFollow(LastSummonerOf(Myself))
    END


    // Pour les deux blocks, je ne suis pas sur de comprendre ce que tu veux. Si la créature voit l'invocateur qu'il soit invisible ou non, elle se cache?
    IF
    See(LastSummonerOf(Myself))
    StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    THEN
    RESPONSE #100
    Hide()
    Continue()
    END

    IF
    See(LastSummonerOf(Myself))
    StateCheck(LastSummonerOf(Myself),STATE_IMPROVEDINVISIBILITY)
    THEN
    RESPONSE #100
    Hide()
    Continue()
    END


    Cocrane

    Concernant OR, ça ne change pas l'intégralité de la condition? Si je ne rajoute pas "See(NearestEnemyOf(Myself))" cette partie sera toujours prise en compte ?

    "STATE_IMPROVEDINVISIBILITY" est le statut de la créature qui se trouve sous l'effet d'invisibilité partielle après avoir attaqué alors qu'elle était invisible. Cette créature ne peut donc pas être ciblée avec un sort (Détection faussée, Poussière de fée, etc....)

    Du coup dans ces deux conditions je veux qu'elle se cache (la créature à la capacité de se fondre dans l'ombre, comme un rôdeur).

    Dans ce cas ça fonctionne si je remplace par le block suivant?


    IF
    See(LastSummonerOf(Myself))
    OR(2)
    StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    StateCheck(LastSummonerOf(Myself),STATE_IMPROVEDINVISIBILITY)
    THEN
    RESPONSE #100
    Hide()
    Continue()
    END

    Edit: en remplaçant par:

    IF
    See(NearestEnemyOf(Myself))
    OR(2)
    !StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    StateCheck(LastSummonerOf(Myself),STATE_IMPROVEDINVISIBILITY)
    THEN
    RESPONSE #100
    Attack([EVILCUTOFF])
    END

    Le familier attaque l'ennemie malgré que son invocateur soit invisible, je pense donc que la condition OR nécessite de rajouter la première partie du block, car cela fonctionnait avec mon précédent script.

    EDIT:2

    Idem pour:

    IF
    See(LastSummonerOf(Myself))
    OR(2)
    StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    StateCheck(LastSummonerOf(Myself),STATE_IMPROVEDINVISIBILITY)
    THEN
    RESPONSE #100
    Hide()
    Continue()
    END

    La créature ne redevient pas invisible lorsque je le veux.
    Dernière modification par Faust ; 30/08/2017 à 13h50.
    "Wrath is the burden of those who haven't faith in humanity but there's no mean to avoid it. I guess it's my choice, just try to stand it."

    Wherever I May Roam.

  8. #8
    Date d'inscription
    mars 2010
    Localisation
    Paris
    Messages 
    1 273
    Ok pour STATE_IMPROVEDINVISIBILITY. Je découvre avec ton explication et ça change la logique.

    IF
    See(NearestEnemyOf(Myself))
    OR(2)
    !StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    !StateCheck(LastSummonerOf(Myself),STATE_IMPROVEDINVISIBILITY) // Si pas invisibilité partielle
    THEN
    RESPONSE #100
    Attack([EVILCUTOFF])
    END

    Ca devrait résoudre le problème d'attaque.

    Par contre, si tu veux la créature "cacheé" lorsque l'invocateur est invisible ou partiellement invisible, le code me semble bon.

    IF
    See(LastSummonerOf(Myself))
    StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    THEN
    RESPONSE #100
    Hide()
    Continue()
    END

    IF
    See(LastSummonerOf(Myself))
    StateCheck(LastSummonerOf(Myself),STATE_IMPROVEDINVISIBILITY)
    THEN
    RESPONSE #100
    Hide()
    Continue()
    END

    je fusionnerai même les deux blocks vu que l'objectif est le même:
    IF
    See(LastSummonerOf(Myself))
    Or(2)
    StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    StateCheck(LastSummonerOf(Myself),STATE_IMPROVEDINVISIBILITY)
    THEN
    RESPONSE #100
    Hide()
    Continue()
    END

    Cocrane

  9. #9
    Date d'inscription
    avril 2009
    Localisation
    Wherever I may roam
    Messages 
    274
    Citation Envoyé par Cocrane Voir le message
    Ok pour STATE_IMPROVEDINVISIBILITY. Je découvre avec ton explication et ça change la logique.

    IF
    See(NearestEnemyOf(Myself))
    OR(2)
    !StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    !StateCheck(LastSummonerOf(Myself),STATE_IMPROVEDINVISIBILITY) // Si pas invisibilité partielle
    THEN
    RESPONSE #100
    Attack([EVILCUTOFF])
    END

    Ca devrait résoudre le problème d'attaque.

    Par contre, si tu veux la créature "cacheé" lorsque l'invocateur est invisible ou partiellement invisible, le code me semble bon.

    IF
    See(LastSummonerOf(Myself))
    StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    THEN
    RESPONSE #100
    Hide()
    Continue()
    END

    IF
    See(LastSummonerOf(Myself))
    StateCheck(LastSummonerOf(Myself),STATE_IMPROVEDINVISIBILITY)
    THEN
    RESPONSE #100
    Hide()
    Continue()
    END

    je fusionnerai même les deux blocks vu que l'objectif est le même:
    IF
    See(LastSummonerOf(Myself))
    Or(2)
    StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE)
    StateCheck(LastSummonerOf(Myself),STATE_IMPROVEDINVISIBILITY)
    THEN
    RESPONSE #100
    Hide()
    Continue()
    END

    Cocrane

    J'ai remodifié un peu:

    IF
    See(NearestEnemyOf(Myself))
    OR(2)
    !StateCheck(Myself,STATE_INVISIBLE) // Comme STATE_IMPROVEDINVISIBILITY rend l'invocateur partiellement
    !StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE) //visible, je veux que le familier attaque, donc je l'ai retiré, car dans les
    THEN // deux cas l'invocateur peut être attaqué.
    RESPONSE #100
    Attack([EVILCUTOFF])
    END



    IF
    See(LastSummonerOf(Myself))
    Or(2)
    StateCheck(LastSummonerOf(Myself),STATE_INVISIBLE) // le familier devient invisible si l'invocateur est invisible ou
    StateCheck(LastSummonerOf(Myself),STATE_IMPROVEDINVISIBILITY) //partiellement invisible
    THEN
    RESPONSE #100
    Hide()
    Continue()
    END


    IF
    StateCheck(Myself,STATE_INVISIBLE) // Si la créature devient invisible, elle suit l'invocateur
    THEN
    RESPONSE #100
    MoveToObjectFollow(LastSummonerOf(Myself))
    END


    Ca marche très bien et le script est beaucoup plus clair!
    Merci pour le coup de main Cocrane.
    Dernière modification par Faust ; 30/08/2017 à 16h15.
    "Wrath is the burden of those who haven't faith in humanity but there's no mean to avoid it. I guess it's my choice, just try to stand it."

    Wherever I May Roam.

Discussions similaires

  1. [Script] avoir une créature qui suit le groupe et change de carte
    Par Cocrane dans le forum Généralités sur la création d'un mod
    Réponses: 4
    Dernier message: 17/08/2017, 23h03
  2. Réponses: 4
    Dernier message: 19/07/2017, 15h00
  3. Réponses: 2
    Dernier message: 04/07/2017, 22h36
  4. [BGT] Mon coéquipier devient invisible
    Par Syntax dans le forum Baldur's Gate Reloaded : les mods TUTU et Baldur's Gate Trilogy
    Réponses: 7
    Dernier message: 23/07/2011, 14h29
  5. [SCRIPT] Script de comportement de Perso
    Par Sith dans le forum Scripts
    Réponses: 3
    Dernier message: 17/04/2009, 20h26

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