Page 1 sur 1

[SCRIPT] Le trigger HitBy ne reconnaît pas la variable FIRE

Posté : jeu. 18 déc. 2008, 22:44
par Avatar
Bonjour à tous. :)

J'ai un problème avec le trigger HitBy. Je voudrais détecter si mon PNJ reçoit des dégats de type "feu". Sur papier, ça a l'air très simple :

Code : Tout sélectionner

IF
 OR(2)
  HitBy([ANYTHING],FIRE)
  HitBy([ANYTHING],MAGICFIRE)
THEN
 RESPONSE #100
 CreateVisualEffectObject("SPCMWOUI",Myself)
END
(Là je crée juste un effet visuel sur le PNJ pour tester si ça marche).

Problème : j'ai beau lancer des boules de feu et des potions d'haleine ardente sur mon PNJ, rien ne se passe. Par contre, si je remplace FIRE par le type générique CRUSHING, mon script marche correctement...

Quelqu'un aurait-il une idée? :help:

Merci d'avance.

Re : HitBy : ne marche pas avec le type FIRE?

Posté : ven. 19 déc. 2008, 00:37
par Isaya
La doc de HitBy sur IESDP dit :
0x0020 HitBy(O:Object*,I :D ameType*Damages)
Returns true only if the active CRE was hit by the specifed object by the specified damage type in the last script round. If the damage type is CRUSHING or 0 then this will return true for ANY damage type.
!HitBy returns true when the script is first activated (e.g. initial area load) and when hit by any damage type.
Ça pourrait expliquer pourquoi CRUSHING marche à tous les coups.

Il arrive que des sorts de zone ne soient pas considérés comme visant ton personnage si on se contente de les lancer à proximité. C'est le cas de certains sorts d'absorption ou de protection, il me semble. Vérifie en lançant bien le sort sur le personnage lui-même ou en utilisant flèche enflammée par exemple, pour lequel il y a forcément une cible.
Autrement, utilise une arme qui provoque des dégâts de feu pour l'attaquer et vois si la situation est différente avec des dégâts physiques.

Autre chose, le fait d'utiliser ANYTHING risque de réagir aussi aux tirs amis (genre boule de feu mal ajustée). Peut-être devrais-tu choisir un autre groupe, comme ENEMY si tu veux éviter de répliquer violemment contre tes propres amis maladroits, par exemple (ou en lançant toi-même ta boule de feu sur un personnage qui se rapproche de toi).

Re : HitBy : ne marche pas avec le type FIRE?

Posté : ven. 19 déc. 2008, 19:46
par Avatar
Merci pour la réponse.

J'ai tenté de faire quelques tests, mais soit je m'y prend mal, soit HitBy ne marche pas trop bien.

Voici le script de mon PNJ :

Code : Tout sélectionner

IF
 HitBy([0],FIRE)
THEN
 RESPONSE #100
 DisplayString(Myself,~Fire~)
 Continue()
END

IF
 HitBy([0],MAGICFIRE)
THEN
...
Les blocs suivants sont identiques avec MAGICFIRE, MAGIC, MISSILE, PIERCING, STUNNING, et CRUSHING (dans cet ordre).

J'ai ensuite balancé un peu tout ce que je trouvais sur mon PNJ : projo magique, flèche, coup d'épée (enflammée ou pas), orbe chromatique, flèche enflammée,...

Résultat : je n'ai jamais vu que "Crushing" s'afficher à la fenêtre de dialogue (et encore, pas à tout les coups :( )

Alors, ais-je commis une erreur de scriptage, est-ce que HitBy ne fonctionne pas correctement, ou suis-je tout simplement maudit?

Merci d'avance de vos réponses.

Re : HitBy : ne marche pas avec le type FIRE?

Posté : sam. 20 déc. 2008, 00:17
par Isaya
Tu emploies HitBy([0],FIRE), donc [0] là où on utilise généralement [ANYONE]. Ce devrait être la même valeur, en principe, mais as-tu essayé avec ANYONE ?

As-tu essayé sans Continue() ? Je dois dire que je vois pas pourquoi tu t'en sers ici. Il me semble qu'il est d'usage très rare en raison de contraintes et de risques particuliers, notamment le nom respect de l'ordre d'évaluation ou le fait qu'il empêche de recommencer l'évaluation au premier script. A priori, on peut penser que le fait de s'arrêter une fois pour afficher le message lié au type de dégât n'empêchera pas le script d'être rapidement réévalué, même en repartant du début, pour que la suite puisse être traitée avant qu'un nouveau coup n'arrive.

Sinon, sur le fond, HitBy([ANYONE],FIRE) fonctionne dans le jeu. Pour t'en convaincre, consulte le script SLIFIS01.BCS employé par le Limon à fission (SLIFIS02.CRE). Si ce trigger ne fonctionnait pas avec le feu, le limon continuerait à se dédoubler à sa mort. Pourtant, on arrive bel et bien à les tuer en les touchant au moins une fois avec des flèches de feu ou une flèche enflammée.

Code : Tout sélectionner

IF
	HitBy([ANYONE],FIRE)
	Global("NoFusion","LOCALS",0)
THEN
	RESPONSE #100
		SetGlobal("NoFusion","LOCALS",1)
END

IF
	Die()
	Global("NoFusion","LOCALS",0)
THEN
	RESPONSE #100
		DisplayStringHead(Myself,71108) // Au lieu de mourir, la créature se divise en deux.
		CreateCreatureObjectEffect("SLIFIS02","TRGOOYAA",Myself)
		CreateCreatureObjectEffect("SLIFIS02","TRGOOYAA",Myself)
END

Re : HitBy : ne marche pas avec le type FIRE?

Posté : sam. 20 déc. 2008, 01:27
par Avatar
Ce devrait être la même valeur, en principe, mais as-tu essayé avec ANYONE ?
J'ai essayé, et ça donne les même résultats qu'avec [0].

Pour les Continue(), je n'étais pas sûr. Mais de nouveau, avec ou sans, le script à le même effet ( = il n'y a que le bloc "crushing" qui se déclenche).
Sinon, sur le fond, HitBy([ANYONE],FIRE) fonctionne dans le jeu. Pour t'en convaincre, consulte le script SLIFIS01.BCS employé par le Limon à fission (SLIFIS02.CRE). Si ce trigger ne fonctionnait pas avec le feu, le limon continuerait à se dédoubler à sa mort. Pourtant, on arrive bel et bien à les tuer en les touchant au moins une fois avec des flèches de feu ou une flèche enflammée.
Heu... Je ne trouve pas le script SLIFIS01.BCS (je cherche avec Near Infinity). J'ai un fichier SLIFIS01.CRE (et pas 02), par contre. Le limon à fission n'est pas une créature de TOB?

[Je précise que je modde sur BG2 sans rien (pas TOB, juste le patch officiel et le fixpack). Mais je suppose que ça ne change rien au fonctionnement de HitBy d'avoir ou pas l'extension. (ou si?)]

Pour tester j'ai invoqué des Limons à fission (version 01) mais ils ont l'air de mourir normalement, feu ou pas feu... J'ai regardé les trolls avec NI, me disant qu'ils doivent fonctionner sur le même principe (HitBy acide ou feu pour les tuer), mais on dirait que c'est plus compliqué. Il y a une créature TROLDE01 avec des résistances normales (0% partout), puis une créature TROLDE02 avec 1pv, 100% de résistance partout sauf 0% en feu, feu magique et acide. Serait-ce possible que les trolls marchent sur un autre principe du genre : "quand le troll s'écroule : remplacer le TROLDE01 par le TROLDE02 qui ne sera tuable que par feu ou acide"? Apparemment les trolls n'utilisent pas le HitBy...

Ca m'embête cette histoire. Je tenais un bon concept pour mon PNJ - en gros, il devrait se transformer s'il subit des dégats de feu (quel que soit la source).

Bon, je continuerai mes expériences demain (ah zut, on est déjà demain...) ^^

EDIT : sur Pocket Plane Group, j'ai trouvé ce thread : weird Problem with Fission Slime

Un des participants à la discussion écrit :
Macready a écrit :Hello -

OK...I've spent way more time on this than I should have. But I do have a working theory to show for it.

Are you by any chance using a ToB-less (i.e., SoA only) BG2 installation as a base (and thus, the SoA version of EasyTutu)? I ask because I can replicate the issue on SoA installations, but not ToB installations. In both environments I have identical AI script and damage identifier tables, but in the SoA installation the HitBy trigger fails to fire. HitBy does work under some conditions (e.g., with the generic CRUSHING type), but not with FIRE. I'm at a loss. I'm inclined to categorize it as an engine bug with the SoA build of BG2.

Unless anyone can suggest something demonstrably better, I plan to remove the ReallyForceSpellDead AI block for fission slimes in the SoA distribution of EasyTutu.
Ceci correspond plus ou moins à ce que j'observe (si ce n'est que chez moi HitBy ne réagit que avec "Crushing"). Serait-ce possible que je doive modder sur SoA + ToB pour avoir un HitBy fonctionnel?

RE-EDIT : Yahouuu, ça marche ! :oui:

J'ai donc passé mon SoA sans mods (qui me servait de base pour modder) en ToB. Après quelques tripatouillages dans le registre pour parvenir à installer ToB sur mon SoA et pas sur mon BGT (vive les multi-install :) ), j'ai réinstallé mon PNJ, et maintenant mon script fonctionne correctement : les projo magiques sont de type "Magic", les boules de feu de type "Fire", ...

Conclusion : la fonction HitBy ne détecte correctement le type de dégat que avec ToB installé.

Bon, ben mon PNJ sera "ToB - requis".

Merci beaucoup pour ton aide, Isaya, et désolé de ne pas avoir pensé plus tôt à essayer avec ToB.

Re : HitBy : ne marche pas avec le type FIRE?

Posté : sam. 20 déc. 2008, 14:38
par Isaya
Bonne nouvelle.

J'avais effectivement fait des recherches avec ToB. Imposer ToB de nos jours n'est pas une grosse contrainte. Ceux qui cherchent des mods pour renouveler l'expérience ont probablement acheté l'extension ou peuvent le faire pour un prix très faible.