From 538058ecc67dd41561b46067cf5b3251293f6370 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Thu, 1 Aug 2024 01:05:00 +0200 Subject: [PATCH] =?UTF-8?q?Fix:=20cas=20d'un=20objet=20est=20un=20conteneu?= =?UTF-8?q?r=20fant=C3=B4me?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Lors d'une partie, la feuille d'un personnage a été bloquée. Après debug, il semble que l'objet a eu le flag estContenu=true sans être contenu. En regardant le json, il semble que des Item "objet" se sont retrouvés avec un champ "contenu", et que l'arbre des contenant a été cassé. Du coup: l'ajout dans un conteneur est maintenant "sécurisé" pour éviter l'accident. si on essaie d'ajouter dans un Item non conteneur, on positionne estContenu à false, et on corrige si possible le "contenu" de la cible, qui ne devrait pas être là. --- changelog.md | 12 ++++++++++- module/actor/base-actor.js | 41 ++++++++++++++++++++++++-------------- module/rdd-utility.js | 22 ++++++++++---------- 3 files changed, 49 insertions(+), 26 deletions(-) diff --git a/changelog.md b/changelog.md index b8cf0948..2b3780bd 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,15 @@ # 12.0 -## 12.0.6 - Les souvenirs d'Astrobazzarh + +## 12.0.6 - Le bazar d'Astrobazzarh +- Corrections de l'inventaire en bazar: + - un problème pouvait survenir en déplaçant les objets + l'inventaire, qui fait qu'un conteneur se retrouve récursivement dans son + propre contenu, ce qui empêche d'ouvrir la feuille d'acteur. + - un objet non-conteneur pouvait dans certains cas avoir un pseudo contenu + - un objet pouvait être considéré comme contenu, sans être présent dans un + conteneur (et donc non affiché) + - vider les conteneurs supprime correctement toutes les informations liées + aux conteneurs/contenus - Fix: restaurer la compatibilité Foundry 11 ## 12.0.5 - Les mauvais jours d'Astrobazzarh diff --git a/module/actor/base-actor.js b/module/actor/base-actor.js index f2a30b12..4b35d754 100644 --- a/module/actor/base-actor.js +++ b/module/actor/base-actor.js @@ -557,15 +557,15 @@ export class RdDBaseActor extends Actor { /* -------------------------------------------- */ /** Ajoute un item dans un conteneur, sur la base de leurs ID */ async ajouterDansConteneur(item, conteneur, onAjouterDansConteneur) { - if (!conteneur) { - // TODO: afficher - item.estContenu = false; - } - else if (conteneur.isConteneur()) { + if (conteneur?.isConteneur()) { item.estContenu = true; const nouveauContenu = [...conteneur.system.contenu, item.id]; await conteneur.update({ 'system.contenu': nouveauContenu }); - onAjouterDansConteneur(item.id, conteneur.id); + onAjouterDansConteneur(item.id, conteneur.id) + } + else { + item.estContenu = false; + await conteneur?.update({ 'system.-=contenu': undefined }) } } @@ -583,8 +583,13 @@ export class RdDBaseActor extends Actor { if (item.estContenu) { item.estContenu = undefined; } - if (item.type == 'conteneur' && item.system.contenu.length > 0) { - corrections.push({ _id: item.id, 'system.contenu': [] }); + if (item.system.contenu != undefined) { + if (item.type == 'conteneur') { + corrections.push({ _id: item.id, 'system.contenu': [] }); + } + else { + corrections.push({ _id: item.id, 'system.-=contenu': undefined }); + } } } if (corrections.length > 0) { @@ -619,15 +624,21 @@ export class RdDBaseActor extends Actor { } /* -------------------------------------------- */ - /** Supprime un item d'un conteneur, sur la base - * de leurs ID */ + /** + * Supprime un item d'un conteneur, sur la base de leurs ID + */ async enleverDeConteneur(item, conteneur, onEnleverDeConteneur) { - if (conteneur?.isConteneur()) { - item.estContenu = false; - const contenu = conteneur.system.contenu.filter(id => id != item.id); - await conteneur.update({ 'system.contenu': contenu }); - onEnleverDeConteneur(); + if (conteneur) { + if (conteneur.isConteneur()) { + const contenu = conteneur.system.contenu.filter(id => id != item.id); + await conteneur.update({ 'system.contenu': contenu }); + onEnleverDeConteneur(); + } + else { + await conteneur.update({ 'system.-=contenu': undefined }) + } } + item.estContenu = false; } /* -------------------------------------------- */ diff --git a/module/rdd-utility.js b/module/rdd-utility.js index 92cf7e6b..3b9d8855 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -304,12 +304,12 @@ export class RdDUtility { Handlebars.registerHelper('experienceLog-topic', topic => ExperienceLog.labelTopic(topic)); // Handle v12 removal of this helper - Handlebars.registerHelper('select', function (selected, options) { + Handlebars.registerHelper('select', function (selected, options) { const escapedValue = RegExp.escape(Handlebars.escapeExpression(selected)); const rgx = new RegExp(' value=[\"\']' + escapedValue + '[\"\']'); const html = options.fn(this); - return html.replace(rgx, "$& selected"); - }); + return html.replace(rgx, "$& selected"); + }); return loadTemplates(templatePaths); } @@ -358,13 +358,15 @@ export class RdDUtility { let objetVersConteneur = {}; // Attribution des objets aux conteneurs for (let conteneur of conteneurs) { - conteneur.subItems = []; - for (let id of conteneur.system.contenu ?? []) { - let objet = inventaires.find(objet => (id == objet._id)); - if (objet) { - objet.estContenu = true; // Permet de filtrer ce qui est porté dans le template - objetVersConteneur[id] = conteneur._id; - conteneur.subItems.push(objet); + if (conteneur.isConteneur()) { + conteneur.subItems = []; + for (let id of conteneur.system.contenu ?? []) { + let objet = inventaires.find(objet => (id == objet._id)); + if (objet) { + objet.estContenu = true; + objetVersConteneur[id] = conteneur._id; + conteneur.subItems.push(objet); + } } } }