CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Forum
  • Accueil
  • Actus
  • Tests
  • Vidéos
  • Images
  • Soluces
  • Forum
Liste des sujets

Editeur : Probleme validation d'objectif

Ripper76
Ripper76
Niveau 6
05 octobre 2014 à 22:54:29

Bonjour,

J'ai un probleme avec la validation de mes objectifs sur mes missions. Les objectifs ne se valide que pour le premier joueur qui remplit l'objectif, et pas pour le groupe entier. J'explique : par exemple, dans mon fichier briefing.sqf, j'ai la task1 "Securiser la zone X". J'appelle le briefing.sqf par le fichier init de ma mission.

Au démarrage de la mission, la task apparait pour tout le monde. Elle est visible dans la liste des taches, le marker apparaît sur la carte ect... Le leader marche en tête de groupe, et entre dans la zone X, la sécurisant par la même occasion. Il recoit la notification comme quoi la task est validée, et elle est notée comme réussie dans la liste des tâche. Mais tous les autres membres du groupe ont toujours la task d'active et n'ont aucun moyen de la valider.

Les unités du groupe sont évidement groupées et synchronisées sur le leader.

Donc, quelqu'un pourrait-il m'expliquer comment faire pour que lorsqu'un des membre valide une tache, la tache soit validée pour les autres membres?

Merci

LeHardballer
LeHardballer
Niveau 3
06 octobre 2014 à 00:03:12

C'est une histoire de localité, peux tu poster le code que tu utilises pour valider la task ?

Ripper76
Ripper76
Niveau 6
06 octobre 2014 à 01:18:43

De localité? C'est quoi?

En l’occurrence, pour cet exemple c'est ce code :
"1" objStatus "DONE";
task_1 setTaskState "SUCCEEDED";
task_1 = true;
publicVariable "task_1";
player setCurrentTask task_2;
["TaskSucceeded",["","Ambassade de Pyrgos securisee"]] call bis_fnc_showNotification;
["TaskAssigned",["","Trouver des informations"]] call bis_fnc_showNotification;

Directement depuis l'init du trigger. Il termine donc l'objectif 1 (la sécurisation de l'ambassade) et lance l'objectif 2 (trouver des infos), en affichant des notifications.

Old_Bear
Old_Bear
Niveau 12
06 octobre 2014 à 09:28:34

Perso, j'utilise des déclencheurs en cascades pour bien séparer la "task" réussie de la "task" assignée et je n'utilise pas "publicVariable".

LeHardballer
LeHardballer
Niveau 3
06 octobre 2014 à 10:35:34

Tu as certaines commandes qui ne s'exécutent que sur le pc qui les fait et non pas chez tout le monde, en l'occurrence des commandes comme : setTaskState, bis_fnc_showNotification.
C'est des commandes locales.

Maintenant un trigger placé dans l'éditeur sera lu par tout le monde donc techniquement une commande locale devient globale (exécuter par tout le monde).

Pas évident de débugger à distance mais par rapport à ce que tu nous dis je pense que le problème viens de l'activation de ta trigger, elle ne s'active que pour le joueur qui réussit l'objectif et pas pour les autres.
Tu as mis quoi comme paramètres d'activation ?

Ripper76
Ripper76
Niveau 6
06 octobre 2014 à 17:32:18

Ok, je vois...

C'est aussi ce que je pensais, mais je ne sais pas du d'où ca peut venir et quoi faire pour corriger le problème. La config des trigger est vachement limité je trouve.

J'ai mis :
Type = Néant
Activation = Pris - Par Résistance (Mes unités étant indépendante)
PRESENT
Condition = This
Init = le code

LeHardballer
LeHardballer
Niveau 3
06 octobre 2014 à 18:05:17

En effet c'est bizarre...
Si tu veux utiliser des triggers je serais toi je suivrais la méthode de Old_Bear, à savoir plusieurs triggers.
Une trigger qui s'active quand la zone est sécurisée
Dans Activation tu met par exemple task1Done = true;
Dans une deuxième trigger dans la condition tu mettras :
task1Done (cad le trigger se déclenche uniquement si la variable task1Done == true)
Et dans l'activation ton code de validation des objectifs
task_1 setTaskState "SUCCEEDED";
player setCurrentTask task_2;
["TaskSucceeded",["","Ambassade de Pyrgos securisee"]] call bis_fnc_showNotification;
["TaskAssigned",["","Trouver des informations"]] call bis_fnc_showNotification;

Normalement ça devrait le faire

LeHardballer
LeHardballer
Niveau 3
06 octobre 2014 à 18:06:06

Faudra juste penser à définir task1Done = false quelque part (init.sqf, l'init d'une unité dans l'éditeur)

Ripper76
Ripper76
Niveau 6
06 octobre 2014 à 18:12:28

C'est vrai, j'ai oublié de répondre à OldBear que je voyais pas bien ce qu'il voulait dire, mais j'ai compris maintenant. En effet, ca fonctionnera surement comme ça, merci.

Je vais essayer ca, et je vous tiens au courant.

Une petite question : Si je comprends bien, "task1Done = false" est une commande qui permettrait à la fois de créer une variable et de la désactiver depuis le début?

Pseudo supprimé
Pseudo supprimé 06 octobre 2014 à 18:13:55

Bonjour Ripper.

J'utilise une méthode simple, optimisée et totalement JIP compatible pour mes missions.

1- Création des objectifs.
Dans un initServer.sqf, je créais mes objectifs en utilisant la fonction BIS_fnc_taskCreate.

Exemple :
:d) [Blufor, "idobjectif", ["Description de mon objectif.", "Titre de mon objectif", "Indication 3d"], "monmarqueur", true] call BIS_fnc_taskCreate; :g)

2- Pour valider un objectif, dans un déclencheur uniquement local au serveur, soit en mettant "&& iSServer" à la fin des conditions du déclencheur, je valide mon objectif en utilisant la fonction BIS_fnc_taskSetState appelée par la fonction BIS_fnc_MP.

Cela donne par exemple :

[["idobjectif", "Succeeded"],"BIS_fnc_taskSetState", true, true] call BIS_fnc_MP;

Testée et approuvée dans de nombreuses missions, dont Fratercula : http://steamcommunity.com/sharedfiles/filedetails/?id=305279364

Remarque : Bien que l'objectif et son statut soit uniquement gérés par le serveur, les conséquences sont bien évidemment répercutées sur l'ensemble des clients connectés ou qui se connecteront.

Pseudo supprimé
Pseudo supprimé 06 octobre 2014 à 18:18:48

J'ai oublié de compléter ma démonstration par un élément important : pour vérifier si un objectif est completé j'utilise la fonction BIS_fnc_taskCompleted.

Dans un déclencheur, si je veux créer un autre objectif une fois que le premier a été validé, je pourrais mettre en condition

:d) ["idobjectif"] call BIS_fnc_taskCompleted && isServer :g)

Et dans activation, je créerais un nouvel objectif en reprenant l'exemple déjà présenté.

Pseudo supprimé
Pseudo supprimé 06 octobre 2014 à 18:23:34

Dernière précision technique qui me vient à l'esprit, si tu décides d'executer certaines commandes dans un déclencheur dont l'une des conditions est "isServer", l'ensemble des actions ne seront éxecutées que du côté serveur.

Il faut donc se renseigner sur chacune des commandes que utilises en vérifiant si la portée de ses effets est globale ou locale. Cette information se trouve facilement sur le wiki de bis, exemple avec la commande "createvehicle" : https://community.bistudio.com/wiki/createVehicle

:d) Ses effets sont globaux comme indiqués par l'icone "Eg", par conséquent, les conséquences seront bien répercutées sur l'ensemble des clients.

Ripper76
Ripper76
Niveau 6
06 octobre 2014 à 18:51:40

Salut Anderton,

Merci pour ta technique, mais je la trouve vachement compliquée. Et ca m'obligerait a tout recommencer depuis 0 pour la mettre en place. Alors je vais la garder sous le coude, au cas où. Mais je ne suis pas loin d'y arriver avec la méthode de Hardballer :ok:

Donc, j'ai mis "task1done = false;" dans Init.sqf. J'ai mis mon trigger de zone avec dans l'init "task1done = true;" et un trigger juste à côté, avec type et activation sur Néant, "task1done = true" dans conditions et mon code de validation d'objectif dans l'init.

Mais rien ne se passe lorsqu'un joueur passe dans le premier trigger. J'ai loupé quelque chose?

Pseudo supprimé
Pseudo supprimé 06 octobre 2014 à 18:54:14

C'est compliqué parceque j'ai essayé d'être exhaustif dans mon explication, mais je t'assure que c'est trés simple et surtout c'est optimisé, compatible avec les joueurs qui rejoignent et c'est "intelligent", tu peux faire des sous objectifs par exemple ou la
fonction t'évite de créer plusieurs objectifs avec les mêmes ids.

Bon courage :)

LeHardballer
LeHardballer
Niveau 3
06 octobre 2014 à 19:05:07

Je voulais pas rentrer dans les détails mais c'est évidemment les commandes citées par LtAnderton qu'il faut s'appliquer à utiliser ;)

@Ripper
Non tu as fais une erreur dans la condition
lorsque tu écrits maVariable = blabla, tu attribue une valeur à ta variable.
Si tu veux tester que ta variable soit égale à quelque chose alors il faut mettre == (deux fois égale).
Donc : task1done == true;

Maintenant task1done est une bolean, cad une variable qui ne peut avoir que deux valeurs possibles, soit true (vrai) soit false (faux).
Pour ce genre de variable tu n'es pas obligé d'utiliser le signe == pour tester.
Dans la condition tu peux juste mettre : task1Done
Ca veut dire que pour que la condition soit validé il faut que task1Done retourne true.
si tu mets !task1Done alors elle doit retourner false.

Tu peux t'amuser à tester pour voir par toi même, mets task1Done = false dans ton init.sqf et !task1Done dans la condition de ta trigger, et tu verras qu'elle se déclenchera dès le début de la mission parce que tu définies task1Done comme false dans l'init.sqf

Ripper76
Ripper76
Niveau 6
06 octobre 2014 à 19:17:36

Ok je comprends mieux. Mais ca marche toujours pas. Je pense que l'erreur est au moment ou j'active task1done.

Dans l'init du trigger, que je mette "task1done = true;" ou simplement "task1done;", elle ne s'active pas.
Evidemment "task1done == true;" ne passe pas, et c'est normal d'après ce que tu me dis.
Mais que dois-je mettre pour l'activer?

Ripper76
Ripper76
Niveau 6
06 octobre 2014 à 19:21:06

Je viens même d'essayer avec "!task1done;" dans la condition, et la tache ne se valide pas non plus.

Pseudo supprimé
Pseudo supprimé 06 octobre 2014 à 19:21:40

Dans la condition, si tu veux activer le déclencheur quand la variable task1done est "true" alors tu mettras juste : "task1done" et éventuellement un && pour le séparer des autres conditions si il y en a.

Ripper76
Ripper76
Niveau 6
06 octobre 2014 à 19:29:08

Pour la condition c'est bon. C'est l'init du premier trigger qui pose problème : comment mettre "task1done" sur true depuis l'init du trigger? Car "task1done = true; ne fonctionne pas.

J'ai refais le test avec "!task1done;" dans la condition, en mettant le type du trigger sur "Interrupteur", et ca a marché dès le lancement, comme prévu.
Mais ca ne fonctionne plus pour "task1done;". Le problème vient donc vraiment de l'init du trigger de declenchement.

Pseudo supprimé
Pseudo supprimé 06 octobre 2014 à 19:38:32

Un déclencheur n'a pas d'init mais simplement un champ de condition, d'activation et de desactivation.

Dans tous les cas, pour faire passer une variable comme étant "true", il faut bien faire " mavariable = true; ". Ensuite, si tu veux t'assurer que cette variable soit connu de l'ensemble des clients présents et à avenir, tu peux la rendre "publique" grâce à la commande " publicVariable "mavariable"; "

Sous forums
  • Les modes Life
  • Configurations PC et ses problèmes
  • Teams et Serveurs
  • Teams et Serveurs MilSim
La vidéo du moment