WB [résolu] Comment ajouter des objets accessibles dans l'éditeur de scènes ?

Users who are viewing this thread

GrandDesign

Recruit
Comment ajouter des objets accessibles dans l'éditeur de scènes ?

J'ai pas mal cherché mais je ne trouve pas mon bonheur. Il y a pas mal d'infos pour ajouter des items ou transformer des personnages par le biais du module-system. Mais ce n'est pas ce que je veux.
Je voudrais modifier certaines scènes en ajoutant des objets perso. J'ai déjà créé ces objets, ils sont dans un fichier.brf qui est chargé dans le module.ini et fonctionnent sous OpenBrf. Par contre je ne sais pas comment les lier au programme pour qu'ils apparaissent dans la liste de l'éditeur de scène.

Merci.
 
Hello!

Pour effectuer cela il faudra jouer avec le module system. C'est à dire ajouter de nouvelles lignes de codes au jeu.

Voici les tutos :
Tutoriel: Importer ses models Wings 3D dans M&B - ( ce que tu as déjà dû faire ) http://forums.taleworlds.com/index.php/topic,70428.0.html
Part 5: Module_Items (comment les intégrer au jeu via le module system) http://forums.taleworlds.com/index.php/topic,12372.0.html

Si tu débutes je te conseil également de regarder comment fonctionne le module system de warband. Les différentes parties et comment l'installer correctement. Il me semble que certain braves types de la communauté française ont passé du temps à répertorier tout ces tutos dans la section modding du forum.

Bon courage.
Si tu as besoins de plus n'hésites pas à ne pas demander une nouvelle fois bien entendu!  :mrgreen:
 
Bonjour,

Pour ajouter des nouveaux objets dans une scène, c'est très simple. :smile:

1. Utilise l'application Phython. (gratuite)
2. Création du répertoire module, à la racine de l'application.
3. Place les 2 répertoires (ex: module_data 1.153, et module_system 1.153) avec les fichiers du module système (la version que tu souhaite) dans le répertoire module.
4. Ouvre le fichier module_scene_props.py
5. Ajoute la déclaration de tes objets à la fin.
6. EX:  ("basket_a",0,"basket_a","bo_basket_a", []),
7. basket_a = référence de l'objet (identification) C'est celle que tu vois dans l'éditeur.
    basket_a (2ème valeur) = nom du modèle 3d que tu as dans ton fichier .brf
    bo_basket_a = nom du modèle 3d de collision (dans ton fichier .brf) (modèle invisible) il n'est pas nécessaire pour les petits objets (ex: verre, assiette etc...)

8. Enregistre ton fichier.
9. Indique dans le fichier module_info.py, le chemin de ton module
    export_dir = "F:/Mount&Blade Warband 1153/Modules/nom_de_ton_module/"
10. Double_clique sur le fichier build_module.bat
11. La compilation se lance (environ 3 minutes)
12. Dans le répertoire du module de ton jeu, il faut ajouter la déclaration de ton fichier .BRF (celui qui contient tes nouveaux objets)
      Ouvre le fichier module.ini et ajoute la 2ème ligne (après celle existante)

load_resource = wb_mp_objects_a
load_module_resource = nouveaux_objets        (ligne à ajouter)


13. Si tous ce passe bien, tu trouveras tes objets dans l'éditeur de scène


Salutations,
 
Super merci ! ça fonctionne.        Je précise que sans collision on met "0"

Du coup je me suis rendu compte que toutes mes textures sont trop lumineuses pour le jeu mais bon...
Maintenant je vais essayer de voir si je peux rendre quelques animaux vivants tel que les chevaux des AI mais ça c'est une autre histoire.
 
Bonjour GrandDesign,  :grin:

Je suis heureux que cela fonctionne. Pour les textures, le shader par défaut c'est no_shader (sans shader). C'est pour cette raison que les textures conservent leurs couleurs de jour comme de nuit. Puisque le moteur n'applique pas le rendu de lumière sur ces textures.

Pour cela utilise pour les objets, le shader simple : agent_shader, ou agent_shader_instanced. Et le résultat sera bon. Le no_shader peut être utilisé pour les objets lumineux (lampe, luminaire, braises etc..) c'est très pratique et réaliste.

Pour l'utilisation des shaders avec un reflet lumineux, utilise les shaders avec un specular. Utile pour le métal (casque, armes, parties métallique d'une armure), le marbre, pierres précieuses etc.... Un specular avec un vêtement de textile, la pierre, bois ne sert à rien.

Pour les textures avec un effet de relief, utilise les shaders bump. Utile pour les murs en pierre. Certains l'utilise massivement pour leurs nombreuses textures.
Toutefois il faut savoir que les shaders avec bump, sont très gourmands en mémoire (affichage vidéo) donc a utiliser avec précaution, surtout si l'on a un PC peu performant. :cry:

Personellement, je n'utilise pas de shader bump sur les armures, je trouve cela pas très jolie.

Pour les textures de la végétation, tu peux utiliser le même shader que celui utilisé dans le jeu natif. (flora)

-----------------------------------------

Pour la création de nouveaux animaux. Si le squelette de l'animal est proche de celui du cheval, tu n'aura pas très grand problème. Sinon cela se compliquera, en particulier pour le mouvement de la tête.
Dans ce cas, n'utilise pas l'articulation de la tête et des articulations neck 3 et neck 2 à 70% environ.

La liaison du squelette avec le modèle 3D (mesh) est une longue étape, mais le résultat peut-être concluant.

Bonne chance dans ton projet, et vive le modding.  :grin: :grin:

Salutations.






 
Oui je me suis rendu compte pour les shaders mais comme je ne suis pas trop au jus j'avais mis un peu au hasard. Du coup j'avais ces surbrillances.
Je vais essayer tous tes trucs, je pense que je vais apprendre.

Un autre truc dont je me suis rendu compte : c'est que les ombres ne sont pas appliquées sur le mesh texturé mais sur l'objet qui sert aux collisions. Comme j'avais fait au plus simple avec des formes cubiques ça faisait super moche. Et je me rends compte que si l'on simplifie trop l'objet "collision" ça ne rends pas bien.
J'ai essayé en mettant le mesh complet pour les collisions et même là ce n'est pas super, on voit les limites rectilignes des faces apparaître quand on regarde de près, surtout sur des textures claires.

Et je suis d'accord avec toi, si l'on force trop sur les brillances (des armures comme tu dis) ça fait plutôt tape à l’œil. A ce que j'ai vu sur YouTube, je me demande même si la version II de M&B n'aura pas ce défaut. J'aimais tellement le petit côté "BD" des textures de Warband. Dans le même sens, ils vont augmenter le nombre de soldats des armées (ça va plaire) mais il vont aussi perdre le côté "authentique" des petits affrontements locaux qu'il pouvait y avoir au moyen-âge surtout pour la période visée.
Mais là, c'est une affaire de gouts.

Pour animer des bestiaux je ne suis pas sur que je vais y arriver car je comptais mettre ça dans des scènes "ville", et il faudra entrer dans le script à un point qui sera ans doute trop fort pour moi.
D’autant que leur code semble un peu tordu à voir les soucis que j'ai eu avec les bannières en ajoutant simplement une faction.

En tous cas merci pour tes réponses, je vais essayer tout ça.
 
Bonjour GrandDesign,

En ce qui concerne, les mesh de collision, j'ai remarqué effectivement que lorsque le personnage est au plus près de la texture de l'objet, on voit un léger filtre noir transparent. Qui correspond au mesh de collision.

Mais cela ne pas trop dérangé, car c'est uniquement quand le joueur est très proche, et cela dépend aussi de la direction de la lumière qui touche le mesh. J'ai remarqué également que le mesh de collision, pour éviter ce problème peut être légèrement plus petit, afin qu'il n'englobe pas le mesh de base, et ainsi éviter ce filtre noir transparent.

Dans la majorité des modèles que j'ai fait le mesh de collision est très allégé, et est de même taille que le modèle de base. C'est surtout quand le mesh de collision est plus grand que le modèle de base, que l'on peut voir ce problème. Mais dans l'ensemble ça reste acceptable. Et puis une chose importante, c'est de supprimer les mesh de collision pour tout les petits objets (livres, vaisselle, petits mobiliers) cela augmente les performance graphique de la scène.

--------------------------

Je suis entièrement d'accord avec toi concernant warband 2. Le specular semble élevé sur certains modèles, ce qui donne un aspect luminescent, et qui n'est pas réaliste. Il utilise beaucoup le shader bump sur les armures, et de près ça donne un aspect de textures "baveuses, délavées". Sur une vidéo de siège, on peut voir par contre l'utilisation du shader bump sur les remparts, qui donne un réalisme saisissant (magnifique).
J'aime également beaucoup le côté texture bd de warband.
En ce qui concerne les armées, je pense que l'effectif pourra varier pour chaque seigneurs. Cela devrait dépendre des finances de chaque seigneur, vis à vis de la taille de leur fief et de leur prospérité.

---------------------------

Pour l'animation des animaux dans le village, les mods qui utilise cette fonctionnalité, ont des animaux statiques. D'ailleurs dans warband, on peut constater que les marchands de chevaux des villes (scène), sont statiques.
Cependant j'ai mis dans certaines de mes scènes des chevaux animé (animation de base du jeu natif) et le résultat est parfait et réaliste. Je l'ai est englobé dans des murs invisible pour IA (ai_barrier = scene propeler) Car au bout d'un certain moment ils se mettent en mouvement. Comme durant une scène de bataille, quand le cavalier est mort, le cheval est à l'arrêt puis plus tard il se déplace.
Je les installent dans la scène, avec un trigger (dans le mission_template concerné) avec la fonction spawn. Très pratique.
Donc tu peux utiliser cette façon. De sorte que dans un enclos, tu peux parquer des moutons animés, soit sans barrière d'IA, si tu veux qu'il se déplacent, ou avec une barrière.

Voici mon script de trigger :

chevaux_scene = ( 0, 0.2, ti_once,                           
    [],
    [                           
      (try_for_range, ":tic",0, 10),                                                                                                    # nombre de position (10)
              (scene_prop_get_instance,":element_instance", "spr_position_monture_2", ":tic"),              # pour connaitre le matricule de l'objet (instance)
              (neq, ":element_instance", -1),                                                                                        # si la position existe
              (prop_instance_get_position, pos1 , ":element_instance"),                                                  # recuperation de la position de l'objet
              (set_spawn_position, pos1),
              (spawn_horse, "itm_monture_a8", 0),
      (try_end),
    ])

----------
Tu peux constater que le script est tout simple, tu peux changer le nombre maxi. J'ai mis 10 pour garder une marge. Mais mes scènes n'exède pas 5 chevaux. J'ai créé un objet invisible pour déterminer la position de l'animal (spr_position_monture_2).

J'espère que cela t'aura été utile.

Salutations,








 
Super pour les chevaux, ça fonctionne et comme tu dis : "c'est simple".
Je peux même disposer d'un cheval sur les maps des châteaux. Ça va plus vite pour voyager et faire des essais parce que je m'amuse à faire de grands paysages. Bon, je monte "à cru" comme les indiens.

Du coup ça donne envie d'aller plus loin mais je n'ai pas les compétences.
J'ai essayé d'ajouter des paysans dans les basse-cours des châteaux tel que c'est défini dans le mission_template des villages mais sans succès. Ça a pourtant l'air simple !
J'ai essayé de faire un choix aléatoire parmi 6 chevaux sans y parvenir...
Je vais aussi essayer de donner aux châteaux des portes qui ferment la nuit... et surtout de leur rendre les "retour de prison" et "retour du donjon" au pied de leur porte et pas dans le milieu de la cour. Je ne sais pas pourquoi c'est ainsi. Ni pourquoi il n'y a pas de son dans les châteaux.

Tu vois, ce n'est pas gagné. Surtout que je suis plus un bidouilleur qu'autre chose. Mais en fait c'est plus rigolo de faire ces trucs là que de jouer au jeu proprement dit.
Et je comprend pourquoi certains ont également envie d'améliorer certaines choses qui ne sont finalement pas si achevées que ça. C'est d'ailleurs dommage que certains détails manquent alors que le fond est bon. Et on sent "la patte" des gars qui ont fait le jeu, et aussi leurs remises en chantier quand ils l'ont mis à niveau.

En tous cas merci.
 
Bonjour GrandDesign,

Heureux de t'avoir aidé. Ca fait plaisir. :grin: :grin:

En ce qui concerne l'ajout de NPC (non playable character ou PNJ en français), dans des scenes existantes c'est également simple.
Pour ma part j'ai conçu un objet invisible (sans collision) qui me sert à déterminer une position sur la scene, afin d'y ajouter par la suite un NPC. Je ne me sert pas des points d'entrées (sauf dans certains cas spécifiques).

Donc ces points invisibles, tu les placent aux endroits, que tu souhaites avoir les nouveaux NPC.
Ensuite de la même façon que le script des chevaux, tu utilise la fonction spawn pour les NPC (ex : trp_paysan_2)

C'est le même procédé que les chevaux, sauf que la c'est des NPC. Et tu peut ensuite leur attribuer également à la naissance une animation spécifique. J'utilise ce procédé et ça fonctionne parfaitement. Du coup les scènes sont beaucoup plus vivantes.

Si tu as des NPC de différentes nature, tu créé un nouvelle objet invisible (scene propelers), et un nouveaux script pour ta deuxième catégorie de NPC.

------------------------------------------------
Pour ce qui est des portes fermées la nuit et ouvertes le jour c'est très simple. Tu doit concevoir dans ton mission template un trigger (déclencheur) Et utiliser la fonction de l'heure courante, puis en fonction de l'heure tu détermine si c'est fermé ou non, avec la fonction d'ajout de scene propeler (objet porte ouverte, ou objet porte fermée) J'utilise cette façon pour les sièges, et ça fonctionne très bien sans aucun soucis.

-------------------------------------------------
Pour tes chevaux aléatoire je ne comprend pas trop le problème. :?:

Pour le son (ambience sonore ou musique de fond ?) des châteaux, personnelement il y a une musique de fond, mais pour les sons tu peux ajouter un trigger avec les sons que tu veux y mettre.
Personnellement j'utilise la nuit le son des grillons, et le jour les oiseaux, c'est très réaliste.

-------------------------------------------------
Je suis d'accord avec toi, la création d'un module procure plus de joie que de jouer, car c'est ta propre création. Tu y mets ce que tu désire (si c'est possible.....)

Salutations, :grin:





 
Dis,
puisque l'on a parlé plus haut de nouveaux animaux que l'on peut faire bouger et donc des squeletons, j'ai repris le squelette du cheval que j'ai adapté à mes meshs perso. Par contre je n'ai pas trouvé où cela est lié dans le module-system. Si je prends skel_horse par exemple, je ne le trouve nul part, dans aucun fichier du module. Il faut bien que je signale quelque-part quel est le fichier.smd que j'utilise pour chaque animal. Tu crois qu'ils n'ont rien prévu à ce sujet ?
J'ai même essayé de mettre un squelette différent sous le nom "skel_horse" dans "horse_skeleton.brf" et tout se passe bien, comme s'ils ne l'utilisaient pas !

Et au fait, comme je suis un peu novice dans tout ça, le forum et tout, tu crois qu'il faut que je fasse un sujet pour chaque thème de question que je pose ?

Merci de ton aide et pour ton temps.
 
Bonjour GrandDesign,

En ce qui concerne les éléments liès à un squelette (armures et jambes ainsi que les chevaux) Ce sont des modeles qui sont liées avec le squelette. Quand tu importes ce type de modèle 3D dans OpenBRF, tu dois importer en rigged mesh. C'est à dire un modèle en liaison avec un squelette. Et ce fichier doit être au format .smd (fichier half life pour info.)

Tu as aucun codes à mettre dans un fichier PY. Hormis celui de déclarer ton nouvelle animal, dans le fichier module_items.py.

Par contre tu dois dans ton modeleur 3d, lier le squelette avec ton mesh (modèle 3D). Ajuster les valeurs en % des vertices avec l'articulation la plus proche. C'est un travail assez long, et tu doit l'importer régulièrement dans OpenBRF pour tester avec une animation, pour vérifier que le modèle soit le plus fluide. Vérifier aussi que les vertices soient bien liés avec la bonne articulation du squelette.

Donc pour conclure, tu importes un modèle de cheval existant (du jeu natif) format smd. Dans ton modeleur 3d, tu effaces le mesh en conservant le squelette. Puis tu importes dans le même fichier le mesh de ton nouvelle animal. Ensuite tu fais la liaison du squelette et du mesh. Et pour finir tu l'exporte au format .smd, pour pouvoir après l'importer dans OpenBRF comme rigged mesh.

:grin: :grin: :grin:
-------------------------------------

Pour ce qui est des thèmes de questions, tu peut si tu le souhaites. Personnellement c'est plus facile quand c'est tout regroupé, ça évite de faire plusieurs réponses (pour chaque thèmes) C'est toi qui choisit... :cool:

Salutations,

 
Salut, et cette fois tu vas me prendre pour un nul :

Voilà, je m'y suis remis.
C'est le code que tu m'as donné plus haut mais je n'arrive pas à trouver la solution au problème de syntaxe suivant :
-----------------------
#essai de cheval aleatoire
liste_chevaux = ["itm_cheval_alezan","itm_cheval_appaloosa","itm_cheval_bringe","itm_cheval_souris","itm_cheval_pangare","itm_cheval_perlino"]
insertion_chevaux = ( 0, 0.2, ti_once, [],
    [
      (try_for_range, ":num",0, 10),
              (scene_prop_get_instance,":element_instance", "spr_cheval_anime", ":num"),
              (neq, ":element_instance", -1),
              (prop_instance_get_position, pos1 , ":element_instance"),
              (set_spawn_position, pos1),
          (store_random_in_range, ":rand", 0, 5),
              (spawn_horse, liste_chevaux [":rand"], 0),      #erreur de syntaxe du compilateur, si je mets [3], ca marche !!!
      (try_end),
])
--------------------------------
Je voulais y entrer les éléments d'un tableau. J'ai essayé plein de formes différentes sans succès.
D'ailleurs pour que ce soit plus propre, y a-t-il un moyen de rentrer le tableau à l'intérieur de la fonction trigger ?

J'ai aussi essayé d'insérer de la même manière des paysans. J'ai utilisé "trp_village_walker_1". Sans rien faire ils prennent les occupations des villageois du jeu (se rendre aux points d'entrée des autres). Je pense que c'est l'utilisation de "trp_village_walker_1" qui fait que ça démarre tout seul. Par contre ils interfèrent entre eux (nouveaux paysans et walkers du jeu) et certains ne démarrent pas tout le temps (de façon aléatoire). J'ai comme l'impression qu'une table stocke les données des déplacements mais qu'elle n'est pas assez grande pour des personnages supplémentaires. Premier entré premier servi.
Ça te dis quelque-chose ? je n'ai pas trouvé où on agrandi ce tableau.

Autre question : Quand on dit "Python", ce qui est employé pour le jeu ça s'appelle comment pour un programmateur ?
Ce n'est pas du langage de base, ils utilisent des formes propres à eux. Je ne parle pas des triggers et autres (pour moi ça c'est spécifique) mais des choses comme "store_random_in_range" par exemple. Ou aussi des trucs du style "for", "if"... qu'on ne voit nulle-part.

Tu vois, même si je m'y frotte, je ne suis pas vraiment au jus. Mais vive l'innocence ! Et ça me plait assez de voir comment tout ça s'engraine, avec cet œil extérieur que j'aime bien.

Ah oui, tu vois les AI meshs dans l'éditeur de scène. Je les fais avec le plus grand soin, autant que faire ce peut. Mais des paysans vont malgré tout se bloquer en sortant du terrain balisé. Tu as des conseils là-dessus ?

Encore merci de ta patience.
 
Bonjour GrandDesign,

Il y a un début à tout. Voila plus de 4 ans que je suis sur mon projet, et je ne suis pas déçu de toutes les fonctionnalités que j'y ai ajoutés (ça tourne à merveille). Donc avec le temps il n'y a pas de raison que tu n'y parvienne pas. :grin: :grin: :grin:

----------------------------------------
Donc pour l'installation de chevaux aléatoires sur une position, la méthode que tu utilises ne peut pas fonctionner. C'est plus complexe. (je t'indique ma propre méthode)

1- Il faut que tes 6 chevaux soient déclarés dans le fichier module_items.py Il doivent se suivre, les uns sous les autres dans le fichier.

2- Dans le trigger que je t'ai donné. On va créer une variable locale, qui prendra la valeur du 1er cheval de ta liste(module_items_py). soit : "itm_cheval_alezan" . La variable locale commence toujours par le signe :

3- Dans la boucle principale (try_range.....) à (try_end), on va ajouter la fonction aléatoire, avec un intervalle de 0 à 6 (la valeur maxi est toujours égale à valeur maxi -1, donc dans ce cas prècis, valeur maxi = 5). Pour les 6 chevaux de ta liste. 0 = cheval 1, 1 = cheval 2 etc...

4- La valeur du cheval qui sera sur la position donnée, sera égale à la variable locale + valeur aléatoire du cheval. On utilise la fonction val_add (addition de valeur)

5 - Le script sera :


chevaux_scene = ( 0, 0.2, ti_once,                           
    [],
    [                           
      (try_for_range, ":tic",0, 10),                                                                                                    # nombre de position (10)
              (scene_prop_get_instance,":element_instance", "spr_position_monture_2", ":tic"),              # pour connaitre le matricule de l'objet (instance)
              (neq, ":element_instance", -1),                                                                                        # si la position existe
              (assign, ":ID_cheval", "itm_cheval_alezan"),
              (store_random_in_range, ":rand", 0, 6),
              (val_add, ":ID_cheval", ":rand"),

              (prop_instance_get_position, pos1 , ":element_instance"),                                                  # recuperation de la position de l'objet
              (set_spawn_position, pos1),
              (spawn_horse, ":ID_cheval", 0),
      (try_end),
    ])

--------------------------------
6 - Tu peux constater que 3 lignes de codes suffisent pour placer des chevaux aléatoires. Et la variable locale que l'on utilise dans la fonction spawn_horse.

---------------------------------

Tu trouveras l'ensemble des fonctions de python, dans le fichier header_operations.py.

Pour ce qui est de paysans supplémentaires dans une scène (hors paysans qui se déplacent) Il faut que tu crée un nouveau NPC, sinon si tu utilise le même, il va y avoir une interférence avec ceux qui se déplacent (avec le script natif). Par contre pour les NPC la fonction est :

(spawn_agent,<troop_id>),

--------------------------------------------
Tu as raison le language du moteur du jeu n'est pas le language Python (le language du jeu je ne le connais pas, peut-être du C++ ??). C'est un language plus puissant et plus élaboré, c'est le code dur, il est protégé par les auteurs de Talesworld.

Chaque language à ces fonctions propres, mais chaque language à des fonctions communes, comme les conditions et autres. Et chaque language à sa propre syntaxe.

---------------------------------------------

Pour ce qui est des scènes, avec le damier de l'IA.

Les scènes de village, utilise le script qui permet le déplacement des paysans d'un point d'entrée à un autre en aléatoire. Ces points d'entrées doivent être impérativement sur le damier. Et les cases du damier doivent contourner tout les éléments qui y sont (bâtiments, et objets de décor imposants). Il peut arriver q'un NPC se bloque un moment sur un élément, si tu converses avec lui par exemple. Le script est lu sur un temps donné qui est programmé. Le NPC perd son chemin un moment, et dés que le script est relu, il recalcule le parcours du NPC. Et tu voit le NPC qui était bloqué, repartir dans la direction qui lui est attribué.

Sur les scènes aléatoires (combat) Ils n'utilisent pas le damier de l'IA, car ce n'est que des arbres, ou petits rochers. Si un NPC bloque dessus, le code dur se charge de le déplacer à gauche ou à droite légérement pour contourner un obstacle léger.

Pour les NPC qui sortent du damier, tu peux placer des barrières invisibles (AI_limiter) Mais je n'ai jamais eu ce problème de NPC indiscipliné  :lol: :lol:


Courage  :grin: :grin: :grin: :grin:

Salutations,





 
Back
Top Bottom