NWN - Maskado

[Question] Modifier le nom d'un objet.

Répondre
Partager Rechercher
Bonjour à vous Maskadoniens/Maskadoniennes,

Voilà j'aimerais vous solliciter afin de mieux connaître le chemin, si chemin il y a, afin de savoir s'il est possible d'agir sur le nom d'un item.

J'ai découvert que celà étais possible par CustomToken mais sur les placeables car malheureusement ça ne fonctionne pas sur les items

Celà serait-il possible de créer un objet et de changer son nom à la création ?

J'ai fais maintes recherches sur Maskado, le vault et tout ce qui se trouvais sur le net mais sans résultats... Soit google n'est pas mon ami soit c'est complètement impossible... C'est pourquoi je viens vous voir afin de pouvoir m'assurer si le chemin vers lequel je me dirige n'est pas inexistant

Merci de votre attention et bons courage pour vos modules respectifs
slt

Citation :
J'ai découvert que celà étais possible par CustomToken mais sur les placeables car malheureusement ça ne fonctionne pas sur les items
?:
Je voudrai bien que tu me dises comment ? Tu es certain de ce que tu avances là ? A ma connaissance, il est impossible de modifier le nom de quoique ce soit après sa création.

Citation :
Celà serait-il possible de créer un objet et de changer son nom à la création ?
Impossible.

Citation :
bons courage pour vos modules respectifs
Merci
Je confirme que c'est possible sur les placables avec un CustomToken. On donne au placable un nom comme : <CUSTOM2000> et ensuite, dans un script, on appelle la fonction : SetCustomToken(2000, "Truc");
Ca changera le nom du placable.

Par contre, je ne sais pas s'il est possible de changer le nom devant les yeux d'un PJ. Je pense qu'il faut que le PJ parte et revienne (change de zone ?) pour que le nom soit actualisé.

Pour un item, je ne sais pas si ca fonctionne, mais en tout cas, pour une créature ca ne marche pas.
Avec les custom token ça changera le nom de tous les placables ayant de le custom de même numéro non ?

Sinon, je crois qu'il est possible de le faire avec NWNX pour les personnages mais pour les items, placables, etc, je ne sais pas...
KzimiR -> Oui, sans doute, mais après il suffit de mettre un numéro de token différent.
Pour le plugin NwnX, je ne sais pas s'il fonctionne vraiment, je n'ai jamais testé.

Yinstyx -> Avec NwnX-Leto, impossible, on peut modifier les fichiers extérieurs au module comme les personnages, mais pas les fichiers internes comme les blueprint des placables car ils sont chargés dans la mémoire du serveur.
Les CustomToken marchent avec les plaçables et effectivement le changement doit être fait avant que le PJ ne charge la zone. Ceux qui y sont déja pendant le changement verront donc l'ancien nom tendis que les nouveaux arrivants verront le nouveau.
MrXXS => Pas si tu les sauvegardes dans la base de donnée de bioware (StoreCampaignObject), que tu modifies tes objets directement dedans via LetoScript et que tu les récupères par RetrieveCampaignObject ... bien sur, cela implique sa suppression et que tu le recrées mais pour un item ça ne devrait pas poser de souci.
Bonsoir et merci de ces réponses

Je vois que le chemin sur lequel je me dirige est brumeux et caillouteux. J'ai déjà tenté Létoscript mais il ne permet que de renommer les pj/pnj et je n'ai hélas rien trouver d'autres

Citation :
Par contre, je ne sais pas s'il est possible de changer le nom devant les yeux d'un PJ. Je pense qu'il faut que le PJ parte et revienne (change de zone ?) pour que le nom soit actualisé.
Tu peux le détruire, changer le nom et le recréer devant le pj pour lui donner l'impression d'un changement de nom immédiat.

Je vais continuer mes recherches et si je trouve quelque chose je vous en ferais part dans ce post étant donné que le principe à l'air d'être recherché.

Merci
Je pense que le code devrait ressembler à ça ... mais je n'ai pas pris le temps de tester : tiens moi au courant si tu l'essayes !


Soient,

PATH : le chemin d'installation de NWN (du type "C:/NeverwinterNights/NWN/")
DB_NAME : le nom de ta base bioware
DB_GATEWAY_VAR : la variable dans la base de donnée bioware
oObject : l'item à modifier
sNewObjectName : le nouveau nom à donner à l'objet.

Le code devrait ressembler à ça (exemple en Unicorn ... donc LetoScript dernière mouture de préférence) :
Code HTML:
  //////////////////////////////////
  if (GetObjectType(oObject) == OBJECT_TYPE_ITEM) { // à n'effectuer que si c'est un item !
    // On met l'objet dans la DB :
    StoreCampaignObject(DB_NAME, DB_GATEWAY_VAR, oObject);
  
    // On construit la commande Leto :
  
    string sLetoCmd = "$filename = '" + PATH + "/database/" + DB_NAME + ".FPT';"; // fichier de db à ouvrir
    sLetoCmd += "fpt.extract $filename, '" + DB_GATEWAY_VAR + "', %OBJECT;"; // on recupere l'objet sauvegardé
    sLetoCmd += "use %OBJECT;"; // on defini que les prochaines instructions concernent cet objet
    sLetoCmd += "/LocName = '" + sNewObjectName + "';"; // On affecte le nouveau nom
    sLetoCmd += "fpt.inject $filename, '" + DB_GATEWAY_VAR + "', %OBJECT;"; // On injecte l'objet modifié dans la db
    sLetoCmd += "%filename = '>';"; // On sauvegarde la db
    sLetoCmd += "close %filename;"; // On ferme la db
    sLetoCmd += "close %OBJECT;"; // On efface la copie de l'objet crée en memoire
  
    WriteTimestampedLogEntry("Instruction Leto :" + sLetoCmd);
    SetLocalString(GetModule(), "NWNX!LETO!SCRIPT", sLetoCmd);
    WriteTimestampedLogEntry("Reponse Leto : " + GetLocalString(GetModule(), "NWNX!LETO!SCRIPT"));
  
    // On détruit l'ancien objet et fait apparaitre le nouveau
    location lLoc = GetLocation(oObject);
    DestroyObject(oObject);
    oNewObject = RetrieveCampaignObject(DB_NAME, DB_GATEWAY_VAR, lLoc);
    }
  else
    WriteTimestampedLogEntry("La cible a renommer n'est pas un item !");
  
  //////////////////////////////////
Je devrais tester ce script dans les jours qui viennent car utilisant linux, la technique "MadCodeHookLib" m'est impossible et je n'ai pas

d'autre solution pour modifier des objets en live ...
@+,

Yinstyx


J'ai un peu de mal à capter l'utilité d'une méthode où il faudrait quitter une carte pour voir les changements apporter au nom sur un placable ?

A mon avis il y a bien plus simple. On détruit l'objet et on le recréer devant le PJ ! Non ?

Pour Leto-NWNX, je confirme que ca marche pour tous types d'objets, même les cartes. Cependant, il faut là aussi dans le cas de modifications apportées par exemple sur un PJ, que ce dernier quitte le module pour que les changements deviennent effectifs. Idem pour les autres objets, sauf que pour les placables faut relancer le mod, pour les cartes faut que les PJ quittent la carte pour que cela devienne effectif.

Pour les cartes, il y aurait la méthode de bioware (méthode des VFX) pour changer dynamiquement un tile de map, mais cela implique d'abord un gros travail sur le 2da des VFX afin de créer l'effet de changement correspondant au tile.

Donc à la question de Squalthor qui était :

Citation :
Celà serait-il possible de créer un objet et de changer son nom à la création ?
je réponds toujours impossible
Bonsoir (ou bonjour),

Bon je sait définitivement à quoi m'en tenir, tant pis

Yinstyx, merci pour ton code Je n'ai pas encore eu la possibilité de le tester mais dès que possible je le fais

Linux ? Il est terrible mais malheureusement je n'ai pas encore réussi à installer Neveredit sur débian

Mickey, a mon avis si on dois faire sortir le pj de la map ben c'est très très limité donc sûr qu'il est bien mieux de détruire et reconstruire l'objet sur le pj.

Impossible n'est pas français donc même si celà est impossible il y a toujours un moyen de tricher, après n'est-ce pas ça être scripteur: être un illusionniste et faire croire à des choses ?

Merci de votre aide en tout cas, je me doutais que le SetName posais un véritable problème, vu les possibilités qu'il aurait pût offrir ça aurait été trop beau

Je vous souhaite un bon week-end
De rien ... ça ne marche pas :

première erreur, ce n'est pas /LocName mais /LocalizedName (cas particulier pour un item) et ... Leto ne sais pas modifier LocalizedName ou j'ai raté quelque chose (je cherche encore car il semble que c'était faisable en Phoenix) !

Sinon, petite parenthèse, mon serveur tourne sous Linux mais je trouve NeverEdit trop limité : je développe avec Aurora

Mickey974 => avec la technique que je proposais, je détruisais l'item pour le recréer (par exemple dans un inventaire) donc c'était transparent pour le PJ (mis à part le "objet perdu/objet obtenu").

Par conséquent, comme je suis motivé et que moi aussi je n'aime pas le mot "impossible", je suis en train de coder un programme en C, le principe sera le suivant :

j'exporte le fichier UTI de l'item via Leto dans un répertoire quelconque, j'appelle une commande externe toujours via Leto (qui exécutera mon programme, se chargeant de changer le nom de l'item directement dans le fichier UTI) puis j'utilise Leto pour ré-injecter l'UTI dans le module.

Pareil, je ne sais pas si ça fonctionnera mais qui ne tente rien n'a rien !
Mais je suis confiant car en utilisant gff2xml, en modifiant le nom de l'item dans le xml et en le reconvertissant via xml2gff ... les utilitaires de lecture de GFF ne plantent pas !

@+ et bon week-end,

Yinstyx
Je sais pertinemment que le mot impossible n'est pas français ! Croyez moi j'en sais quelque chose.

Cependant, selon les propos des codeurs de NWN, le nom de tous objets 3d dans NWN sert de support pour l'identification de l'objet au niveau du moteur (C'est un pointeur. C'est aberrant pour les programmeur en C que nous sommes tous, mais pourtant c'est la réalité. cf le forum officiel de bioware et la réponse d'un développeur sur l'éventualité d'une intégration d'une fonction telle que SetName)

Etant donné que j'ai déjà travaillé sur le problème depuis bien longtemps, je peux confirmer que l'on peux changer le nom de tous objets dans NWN. Cependant, il faut faire une "MAJ" (cf mon post plus haut). Et cela même si on utilise des outils codés "maison" ! Le nom d'un objet, servant de pointeur pour le code C++ de NWN, il est impossible de modifier ce pointeur dynamiquement (sauf tripatouiller la mémoire en live ) . La seule solution est de détruire ce pointeur et d'en créer un nouveau. Avec Leto-NWNX, on arrive à faire des choses impressionnantes, mais pour ce qui est de changer le nom dynamiquement en temps réel, c'est pas possible.

Croyez moi, ce problème occupe la communauté de tous les développeurs depuis maintenant 3 années. Consultez le forum de Bioware pour vous faire votre propre idée sur ce sujet !
Je suis tout à fait d'accord avec toi Mickey974 mais j'ai constaté un chose intéressante : si tu crée un personnage sur un module avec un inventaire un peu spécifique (mais ne dépendant pas des éventuels haks que ce module peut inclure) et que tu importe ce personnage dans un autre module, tous ses items ne posent pas de problèmes puisque, en gros, l'uti de l'item est inclus dans le bic du personnage.
Par conséquent, en injectant l'objet par modifié Leto directement dans un inventaire ou ailleurs (via un RetrieveCampaignObject) je ne vois pas où est le problème puisque le pointeur va être créé à ce moment là et que le LocalizedName a été modifié bien avant.
Dis moi si je me trompe dans mon raisonnement !
@+,

Yinstyx
Bonjour

Bon et bien bonne nouvelle

Vous trouverez un SetName ici:

http://nwvault.ign.com/View.php?view...Detail&id=2068

J'ai testé et utiliser et je peux vous affirmer que ça marche

Bon j'ai testé sur un début de système de loot crée aléatoirement avec un objet de chaques style en base (ca évite d'avoir une palette surchargée d'items) en gros: TERRIBLE le SetName, il offre des possibilités plus qu'hallucinantes

Il faut avoir NWNX pour pouvoir l'utiliser. N'étant en aucun cas programmeur ( aller je pourrais sortir un petit "scripteur" nwn) je ne sait pas ce que le code vaut mais en l'ayant mis sur un levier sur lequel j'ai bourriné je n'ai pas eu de plantages Par contre il pour avoir un changement de nom immédiat pour un objet crée à terre évitez les delaycommand

Bon et bien voilà une excellente chose, j'attend vos avis dessus et j'en profite pour vous remercier ainsi que Isilweoet son équipe à qui nous devons ce SetName
Il est vrai que j'ai testé celà sur un module de test pas sur le module online.
J'ai aussi eu des plantages mais uniquement quand mon système en étais à ses prémices, depuis plus de plantages même en bourrinant sec Enfin peut-être d'autres personnes pourront-ils nous donner leur avis afin que nous puissions avoir un avis général
@Yinstyx
Ton raisonnement est correct. Si tu modifie le fichier uti avant de le créer dans le jeu, c'est la modification qui apparaîtra. Là dessus on est parfaitement synchro.

Par contre si ton item est crée dans le jeu, et que là tu modifies le nom de l'item, tu devra faire une MAJ de la mémoire, par un moyen quelconque (reset du modul, PJ qui quitte le module, etc etc)

@Squalthor
Cette fonction est codé en C et est placé dans une librairie (nwnx_functions.dll). Elle modifie directement le pointeur en mémoire vive. Comme tu le dis si bien toi même, c'est la cause de trop nombreux crash du server pour être considéré comme fiable et je ne connais aucun server de module qui l'utilise. Donc jusqu'à aujourd'hui, je maintiens ce que je dis, il est impossible de modifier en temps réel le nom d'un objet 3d du jeu NWN sur un server.

Personellement et pour conclure sur ce débat mainte et mainte fois refait, je me fis plus aux dires des créateurs du jeu qui affirment qu'il est impossible de modifier le nom d'un objet 3d plutôt qu'aux dires des gens de talents qui essaient de repousser les limites du jeu. Il y a un moment ou il y a un mur. C'est dommage d'ailleurs !
juste une petite question de noobs :

pour quoi un nom d'objet, un tag, et un resref si le pointeur est le nom de l'objet ?

j'ai toujours penser que c'était le resref le pointeur de l'objet puisque un resref est forcement unique !

donc le nom ainsi que le tag ne devrait être qu'une référence de l'objet.

quelque part si c'est le nom de l'objet le pointeur il y a une énorme couille puisque il peut il avoir 36 nom identique !
Ni le resref, ni le tag, ni le nom d'un objet est unique. Tout simplement parceque si on crée une copie de cet objet, ces 3 propriétés seront les mêmes

L'histoire de l'impossible fonction SetName est assez trouble. Les noms des objets ne peuvent pas faire directement office de pointeurs de manière évidente, puisqu'ils ne sont pas uniques. De plus, il y a il me semble une fonction ObjectToInt ou un truc comme ça, qui donne l'adresse de l'objet dans le jeu.
Cela dit, peut-être que le nom sert, d'une manière ou d'une autre, à référencer les objets...

J'avais lu quelquechose à propos de problèmes avec la localisation des noms du jeu, mais rien de précis. Je croyais que c'était le principal frein à une telle fonction.

Le fichier donné par Squalthor marche, je l'avais essayé y'a longtemps. Il y a certains bugs, connus pour la plupart, mais je pense que c'est utilisable pour un module persistant par exemple. Ca reste à prouver, bien sûr, mais qui ne tente rien...

Conclusion : changer le nom des objets, c'est possible, mais risqué
Pour information, j'ai signalé dans un précédent post que la possibilité de changer le nom d'un item (le LocalizedName, directement dans un fichier uti) ne fonctionnait pas. Il s'agit en fait d'un bug qui sera corrigé dans la prochaine version de LetoScript.
Techniquement, lorsqu'un item est créé directement avec avec Aurora en version Française, le StringId est fixé à 2 au lieu de 0 pour la version anglaise (cf http://weathersong.infopop.cc/groupe...1/m/9971081023).

@+,

Yinstyx
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés