Aller au contenu


[résolu] Arrêter Un Combat Quand Des Armes Précises Ne Sont Pas Utilis


  • Veuillez vous connecter pour répondre
9 réponses à ce sujet

#1 Orann

Orann

    Nérévarine de Pertevue


Posté 19 février 2010 - 19:46

Bonsoir.
Voici la partie de mon script en question :

if ( onpchitme == 1 )
	set onpchitme to 0
	set frappe_avec_la_bonne_arme to hitonme A_P_arene_baton01
	if ( frappe_avec_la_bonne_arme == 0 )
		set frappe_avec_la_bonne_arme to hitonme A_P_arene_hache01
		if ( frappe_avec_la_bonne_arme == 0 )
			set frappe_avec_la_bonne_arme to hitonme A_P_arene_epee_courte_01
			if ( frappe_avec_la_bonne_arme == 0 )
				set frappe_avec_la_bonne_arme to hitonme A_P_arene_epee_large01
			endif
		endif
	endif

	if ( frappe_avec_la_bonne_arme == 0 )
		messagebox "Vous avez frappé Réba avec une arme non autorisée. Le combat est terminé." "Ok"
		set A_P_arene_03 to 3; ............... triche
		A_P_arene_reba01->stopcombat, player
		A_P_arene_reba01->modcurrenthealth 1000
		set A_P_arene_01 to 4; .................... fin du combat
		return
	endif
endif

Le but de ce script est de détecter si le joueur utilise ou non l'une des 4 armes autorisées. Si c'est le cas, le combat doit continuer. Mais dès l'instant où une autre arme frappe le npc, le combat doit être stoppé.

Le problème, c'est que le message apparait si je me laisse frappé par le npc (alors que je n'ai pas du tout frappé moi-même le npc). Et si je frappe le joueur, ça ne marche pas du tout...
Je précise que je suis Morrowind seul requis.

Merci beaucoup.

Modifié par Orann, 21 février 2010 - 14:03.

Palme d'honneur 2010 pour le mod Archipel de Pertevue

Entamez votre voyage vers l'Archipel de Pertevue ! Test communautaire en cours.

#2 Nerwal

Nerwal

    SAMU Kalendaarien


Posté 19 février 2010 - 20:18

Citation

if ( frappe_avec_la_bonne_arme == 0 )

Déjà, peut-être par superstition, j'éviterais les deux boucles différentes à la même hauteur dans le même bloc avec la même condition d'entrée, ça a tendance à foirer à la compilation.

Possible :

short x1,x2,x3,x4
(...)
set x1 to ( hitonme "A_P_arene_baton01" )
set x2 to ( hitonme "A_P_arene_hache01" )
set x3 etc.
set x4 etc.

set frappe_avec_la_bonne_arme to ( x1+x2+x3+x4 )
if ( frappe_avec_la_bonne_arme == 0 )
messagebox "Vous avez frappé Réba avec une arme non autorisée. Le combat est terminé." "Ok"
etc.

Autre façon de faire sans locale du tout :

if ( hitonme "A_P_arene_baton01" == 1 )
return
elseif ( hitonme "A_P_arene_hache01" == 1 )
return
etc.
(...)
else
messagebox "Vous avez frappé Réba avec une arme non autorisée. Le combat est terminé." "Ok"
etc.

#3 Orann

Orann

    Nérévarine de Pertevue


Posté 20 février 2010 - 16:46

Merci Nerwal, je vais essayer la première solution. La deuxième ne peux pas m'aller car je ne peux pas faire de return, il y a une suite au script qui s'exécute quand le joueur a la bonne arme.  :arrow:

Voici le nouveau script:

if ( onpchitme == 1 )
	set onpchitme to 0
	set x1 to ( hitonme "A_P_arene_baton01" )
	set x2 to ( hitonme "A_P_arene_hache01" )
	set x3 to ( hitonme "A_P_arene_epee_courte_01" )
	set x4 to ( hitonme "A_P_arene_epee_large01" )

	set frappe_avec_la_bonne_arme to ( x1+x2+x3+x4 )

	if ( frappe_avec_la_bonne_arme == 0 )
		messagebox "Vous avez frappé Réba avec une arme non autorisée. Le combat est terminé." "Ok"
		set A_P_arene_03 to 3; ............... triche
		A_P_arene_reba01->stopcombat, player
		A_P_arene_reba01->modcurrenthealth 1000
		set A_P_arene_01 to 4; .................... fin du combat
		return
	endif
endif

Et il ne fonctionne pas...  :huhu:  Les symptômes sont les mêmes et j'ai poussé les tests un peu plus loin:
- si le npc m'attaque en premier (sans que je tape), le script se déclenche et considère que je n'ai pas frappé le npc avec la bonne arme
- si j'attaque en premier, peu importe l'arme que j'utilise (une bonne ou une pas bonne), le script ne fait plus rien du tout (même si le npc me tape ensuite)
Palme d'honneur 2010 pour le mod Archipel de Pertevue

Entamez votre voyage vers l'Archipel de Pertevue ! Test communautaire en cours.

#4 Nerwal

Nerwal

    SAMU Kalendaarien


Posté 20 février 2010 - 16:51

C'est bien un script local attaché au PNJ ? On peut avoir le script complet ?

#5 Orann

Orann

    Nérévarine de Pertevue


Posté 20 février 2010 - 16:56

Oui, c'est un script local attaché au npc.

begin A_P_arene_script_reba01

; script sur Reba
; permet de stopper le combat :
; - si la vie des combattants est en dessous de 5%
; - si le joueur n'est pas equipé d'un bouclier et d'une arme autorisé pendant plus de 8 secondes
; - si le joueur frappe Reba avec une arme non autorisée

; variables globales :
; A_P_arene_01 : 3 = début du combat, 4 = fin du combat
; A_P_arene_03 : 1 = victoire du joueur, 2 = victoire de Réba, 3 = triche
; A_P_arene_05: nombre de victoires
; A_P_arene_06: nombre de défaites

float vie_reba
float vie_joueur
short fait
short frappe_avec_la_bonne_arme
short onpchitme
short x1
short x2
short x3
short x4



if ( A_P_arene_01 == 1 )
	set fait to 0
endif

if ( A_P_arene_01 == 4 )
	if ( A_P_arene_03 == 3 )
		if ( fait == 0 )
			A_P_arene_reba01->stopcombat, player
			A_P_arene_reba01->modcurrenthealth 1000
			set fait to 1
		endif
	endif
endif

if ( A_P_arene_01 != 3 )
	return
endif

if ( onpchitme == 1 )
	set onpchitme to 0
	set x1 to ( hitonme "A_P_arene_baton01" )
	set x2 to ( hitonme "A_P_arene_hache01" )
	set x3 to ( hitonme "A_P_arene_epee_courte_01" )
	set x4 to ( hitonme "A_P_arene_epee_large01" )

	set frappe_avec_la_bonne_arme to ( x1+x2+x3+x4 )

	if ( frappe_avec_la_bonne_arme == 0 )
		messagebox "Vous avez frappé Réba avec une arme non autorisée. Le combat est terminé." "Ok"
		set A_P_arene_03 to 3; ............... triche
		A_P_arene_reba01->stopcombat, player
		A_P_arene_reba01->modcurrenthealth 1000
		set A_P_arene_01 to 4; .................... fin du combat
		return
	endif
endif

set vie_reba to ( A_P_arene_reba01->GetHealthGetRatio )
set vie_joueur to  ( player->GetHealthGetRatio )

if ( vie_reba < 0.05 )
	set A_P_arene_03 to 1; ............... victoire
	A_P_arene_reba01->stopcombat, player
	A_P_arene_reba01->modcurrenthealth 1000
	set A_P_arene_01 to 4; .................... fin du combat
	set A_P_arene_05 to ( A_P_arene_05 + 1 )
	messagebox, "Vous avez gagné. Réba se retire. Le combat est terminé conformément aux règles." "Ok"
	return
endif

if ( vie_joueur < 0.05 )
	set A_P_arene_03 to 2; ............... défaite
	A_P_arene_reba01->stopcombat, player
	A_P_arene_reba01->modcurrenthealth 1000
	set A_P_arene_01 to 4; .................... fin du combat
	set A_P_arene_06 to ( A_P_arene_06 + 1 )
	messagebox, "Vous avez perdu. Réba vous épargne conformément aux règles. Le combat est terminé." "Ok"
	return
endif

end

Palme d'honneur 2010 pour le mod Archipel de Pertevue

Entamez votre voyage vers l'Archipel de Pertevue ! Test communautaire en cours.

#6 elendell

elendell

    Mécano Dell'Arte


Posté 20 février 2010 - 19:46

Bonjour Orann,

 Orann, le 20.02.2010 à 17:00, dit :

- si le npc m'attaque en premier (sans que je tape), le script se déclenche et considère que je n'ai pas frappé le npc avec la bonne arme
C'est curieux. Essaye juste ça pour voir :

if ( onpchitme == 1 )
	messagebox "Maman, le PJ m'a frappé !" "Ok"		
endif


Il y a plusieurs choses qui me gênent dans le script :

- Il y a plusieurs fois cette syntaxe : "A_P_arene_reba01->stopcombat, player". Contrairement à "StartCombat", la fonction "StopCombat" peut prendre un appelant mais pas de paramètre appelé ("player" dans ton cas).

- Dans l'instruction "set frappe_avec_la_bonne_arme to ( x1+x2+x3+x4 )", il manque des espaces autour des signes "+".

- Le dernier "return" ne sert à rien puisqu'il n'y a rien au-dessous.

- Au lieu d'utiliser l'avant-dernier "return", tu pourrais réunir les deux derniers blocs avec un "elseif".

EDIT :

Je n'ai jamais utilisé "OnPCHitMe" mais dans le MSfD, je lis ceci :

MSfD8 dit :

Il semble que la présence de cette variable "court-circuite" le comportement normal du PNJ : il n’attaquera plus de lui-même. Si vous ne voulez pas que l’Acteur reste passif, vous devez vous servir de la fonction StartCombat manuellement (voir exemple cidessous).
Une fois que l’Acteur est en mode combat, OnPCHitMe ne signale plus les coups du PJ. Sauf si, selon une information des forums, OnPCHitMe se réinitialise à 0 si un autre Acteur frappe l’Acteur appelant après que le PJ l’ait fait ; elle repasse à 1 si le joueur le frappe à nouveau.

Exemple :
Spoiler

Modifié par elendell, 20 février 2010 - 20:25.
suppression d'une bêtise


#7 Orann

Orann

    Nérévarine de Pertevue


Posté 20 février 2010 - 20:25

Spoiler

Avec ce script (j'espère n'avoir oublié aucun de tes conseils), le message apparait dès que le npc me tape, alors que je n'ai rien fait. Et je reste bloqué sur la messagebox, obligé de faire ctrl+alt+suppr. Mais je pense que ça vient du fait que onpchitme ne revient pas à 0...

Modifié par Orann, 20 février 2010 - 20:25.

Palme d'honneur 2010 pour le mod Archipel de Pertevue

Entamez votre voyage vers l'Archipel de Pertevue ! Test communautaire en cours.

#8 elendell

elendell

    Mécano Dell'Arte


Posté 21 février 2010 - 08:31

Salut Orann,

Ça faisait des mois que je n'avais pas fait de script et j'avais oublié comme tout est simple et logique avec le Tescs !  :jester:

Bon, j'ai fait des tas d'essais avec "OnPCHitMe" pour comprendre. Au bout de plusieurs heures, j'ai quand même fini par avoir l'idée de noter les résultats parce que je me mélangeais les pinceaux. Je te livre donc ci-dessous ceux que j'ai notés. Le point qui m'a fait arracher le plus de cheveux est que j'essayais systématiquement chaque nouveau script dans 2 installations : Une avec Morro seul et une avec les extensions.
Avec extensions, le résultat évoluait à chaque fois mais avec Morro seul, j'avais toujours le même résultat : Le PNJ était pris de convulsions.  :mdr:

Au désespoir d'obtenir autre chose que cette crise d'épilepsie, j'ai fini par ne mettre aucun script et à faire juste "StartCombat" à la console sur plein de PNJs de Seyda Nihyn. Tous convulsaient, sauf les gardes. La cause était simple mais je ne le savais pas : Avec Morro seul (en jeu), un PNJ ne peut pas se battre à mains nues. S'il n'a pas d'arme, il convulse. Et ce, que son combat soit déclenché par un "StartCombat" ou simplement parce que son Fight est réglé pour le faire attaquer dès qu'il voit le PJ.  :peur: (Avec Tribunal, pas de problème).

Bref, voici mes essais sur "OnPCHitMe" :

Spoiler

Spoiler

Cet essai m'a fait voir un autre problème que je ne connaissais pas : "StartCombat, player" ne fonctionne pas si elle est lancée au moment où le PJ arrive d'une autre cellule. Quand le PJ arrive dans la cellule, le script est immédiatement actif mais "StartCombat" passe avant la détection du PJ par le PNJ car cette dernière ne se fait pas à la première frame. Donc, comme à ce moment là il n'a pas encore détecté le PJ, il ignore l'instruction.  :shocked:

Note : Les essais suivants ont été faits avec le Fight du PNJ réglé à 30.

Spoiler

Spoiler

Spoiler


Conclusion des essais de "OnPCHitMe" :

Il y a une erreur dans ce qu'indique le MSfD8. C'est juste en partie mais très incomplet :

MSfD8 dit :

"OnPCHitMe" passe à 1 lorsque le joueur frappe l’Acteur appelant.
Il faudrait dire : Quand un PNJ est en combat avec le PJ, "OnPCHitMe" passe à 1 lorsqu'un coup est porté, par le PJ ou par le PNJ. Si le PNJ n'est pas en combat quand le PJ frappe, cela le met automatiquement en combat avec lui, avant de valider le "OnPCHitMe".
Note : Je n'ai pas essayé des situations avec des intervenants supplémentaires, telles que par exemple, frappe du PJ pendant que le PNJ combat un autre PNJ...  :angry:


Pour ton script, il y a quand même une solution ! :D

Au lieu de chercher à savoir "quand le PNJ est frappé par le PJ", on peut chercher à savoir "quand le PNJ est blessé". Quand c'est le cas, on vérifie comme tu l'as fait avec "hitonme" quelle est l'arme qui l'a blessé. L'avantage est que ça fonctionne également si c'est un compagnon qui le blesse. Ça interdit donc de fait au PJ de se faire aider par un compagnon, sauf s'il a lui aussi une arme autorisée.

J'ai donc testé ce script avec succès, que ce soit avec Morro seul ou avec les extensions :

Spoiler

J'ai refais ton script à ma manière en utilisant ce principe mais sans le tester (la flemme de faire les "ID"  :P ). Je te laisse l'essayer toi-même (tel quel) et me dire si ça fonctionne :

Spoiler

Notes :

- Il ne faut pas mettre l'ID du PNJ si l'instruction qui est dans son script lui est destinée. Ça peut engendrer un bug et c'est inutile puisqu'il est ciblé par défaut.

- Dans tes commentaires, tu avais marqué ceci : "si le joueur n'est pas équipé d'un bouclier et d'une arme autorisé pendant plus de 8 secondes" mais je ne vois pas ce qui peut faire ça dans ton script. (Un reste d'essai, je suppose ?)

- Tout ça me fait penser que tu dois systématiquement vérifier que tes scripts fonctionnent avec les extensions (en jeu, pas dans le Tescs) car les fonctions pour Morrowind seul ne fonctionnent pas forcement de la même façon quand les extensions sont installées. (Exemple : "StartCombat, Player" quand le PNJ n'a pas d'arme.)

PS : Heu... Une pensée me vient en me relisant : Et si le PJ utilisait la magie ?  :o  (Essaye ça aussi...)

#9 Not Quite Dead

Not Quite Dead

    Rincevent


Posté 21 février 2010 - 09:42

 elendell, le 21.02.2010 à 08:45, dit :

PS : Heu... Une pensée me vient en me relisant : Et si le PJ utilisait la magie ?  :shocked:  (Essaye ça aussi...)
Sans avoir lu le détail des scripts, ne peut-on pas détecter lorsque le PJ lance un sort en faisant un test sur GetSpellReadied ?

Evidemment, utiliser cette condition pour mettre un terme au combat l'empêcherait d'utiliser des sorts pour booster ses caractéristiques ou se soigner, mais ce n'est peut-être pas plus mal.
« I was a soldier! I killed people!
- You were a doctor!
- I had bad days! »
John Watson, en train d'étrangler Sherlock Holmes, Sherlock - A Scandal in Belgravia (2012)
---------------
Vous aussi rejoignez les Fervents Partisans de l'Immuabilité Avatarienne!
---------------
VGM impénitent (était-il besoin de le préciser?)
---------------
Paterfamilias niv.IV

#10 Orann

Orann

    Nérévarine de Pertevue


Posté 21 février 2010 - 14:02

Que ferais-je sans toi Elendell ?  ;)  Merci beaucoup pour le temps que tu y as passé ! Et pour les résultats.
Avant de tester tout ça, je précise qu'il y a d'autres scripts qui tournent dans la cell, dont un qui permet de savoir si le joueur est bien équipé d'un bouclier et d'une arme autorisée.
Si le joueur équipe autre chose pendant le combat (c'est surtout pour le bouclier), un message apparait, et s'il ne change pas au bout de quelques secondes, le combat est annulé. La variable globale A_P_arene_01 passe à 4 et A_P_arene_03 passe à 3, d'où le premier bloc d'instructions dont tu ne voyais pas l'utilité.

En ce qui concerne la magie, elle est impossible pendant le combat (disableplayermagic). Pour le RP, un npc dit qu'il lance un enchantement dans la pièce. Donc ça évite d'autres soucis.

Quant au bug des npcs pour le combat à mains nues, je le connais bien. Au départ, cette arène devait être un lieu de combat à mains nues... Mais j'ai dû vite changer d'idée. De même, tous les npcs de Pertevue (sauf rares exceptions) portent une arme pour pouvoir se défendre efficacement au cas où.

Quant aux tests avec d'autres versions de Morro et les add-ons, c'est prévu. Inari, A3jv et d'autres qui ont l'Archipel jouent avec les extensions et pourront me faire leur compte rendu pour les passages scriptés qui pourraient poser problème...  :yahoo:

Merci encore !  :angry:

[edit]

C'est bon, ça fonctionne impeccablement !  :shocked:  Merci beaucoup !!!!  :jester:

Modifié par Orann, 21 février 2010 - 14:02.

Palme d'honneur 2010 pour le mod Archipel de Pertevue

Entamez votre voyage vers l'Archipel de Pertevue ! Test communautaire en cours.




0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)