Fix: cas d'un objet est un conteneur fantôme

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à.
This commit is contained in:
Vincent Vandemeulebrouck 2024-08-01 01:05:00 +02:00
parent 70e42ea631
commit 538058ecc6
3 changed files with 49 additions and 26 deletions

View File

@ -1,5 +1,15 @@
# 12.0 # 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 - Fix: restaurer la compatibilité Foundry 11
## 12.0.5 - Les mauvais jours d'Astrobazzarh ## 12.0.5 - Les mauvais jours d'Astrobazzarh

View File

@ -557,15 +557,15 @@ export class RdDBaseActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
/** Ajoute un item dans un conteneur, sur la base de leurs ID */ /** Ajoute un item dans un conteneur, sur la base de leurs ID */
async ajouterDansConteneur(item, conteneur, onAjouterDansConteneur) { async ajouterDansConteneur(item, conteneur, onAjouterDansConteneur) {
if (!conteneur) { if (conteneur?.isConteneur()) {
// TODO: afficher
item.estContenu = false;
}
else if (conteneur.isConteneur()) {
item.estContenu = true; item.estContenu = true;
const nouveauContenu = [...conteneur.system.contenu, item.id]; const nouveauContenu = [...conteneur.system.contenu, item.id];
await conteneur.update({ 'system.contenu': nouveauContenu }); 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) { if (item.estContenu) {
item.estContenu = undefined; item.estContenu = undefined;
} }
if (item.type == 'conteneur' && item.system.contenu.length > 0) { if (item.system.contenu != undefined) {
corrections.push({ _id: item.id, 'system.contenu': [] }); if (item.type == 'conteneur') {
corrections.push({ _id: item.id, 'system.contenu': [] });
}
else {
corrections.push({ _id: item.id, 'system.-=contenu': undefined });
}
} }
} }
if (corrections.length > 0) { 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) { async enleverDeConteneur(item, conteneur, onEnleverDeConteneur) {
if (conteneur?.isConteneur()) { if (conteneur) {
item.estContenu = false; if (conteneur.isConteneur()) {
const contenu = conteneur.system.contenu.filter(id => id != item.id); const contenu = conteneur.system.contenu.filter(id => id != item.id);
await conteneur.update({ 'system.contenu': contenu }); await conteneur.update({ 'system.contenu': contenu });
onEnleverDeConteneur(); onEnleverDeConteneur();
}
else {
await conteneur.update({ 'system.-=contenu': undefined })
}
} }
item.estContenu = false;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@ -304,12 +304,12 @@ export class RdDUtility {
Handlebars.registerHelper('experienceLog-topic', topic => ExperienceLog.labelTopic(topic)); Handlebars.registerHelper('experienceLog-topic', topic => ExperienceLog.labelTopic(topic));
// Handle v12 removal of this helper // 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 escapedValue = RegExp.escape(Handlebars.escapeExpression(selected));
const rgx = new RegExp(' value=[\"\']' + escapedValue + '[\"\']'); const rgx = new RegExp(' value=[\"\']' + escapedValue + '[\"\']');
const html = options.fn(this); const html = options.fn(this);
return html.replace(rgx, "$& selected"); return html.replace(rgx, "$& selected");
}); });
return loadTemplates(templatePaths); return loadTemplates(templatePaths);
} }
@ -358,13 +358,15 @@ export class RdDUtility {
let objetVersConteneur = {}; let objetVersConteneur = {};
// Attribution des objets aux conteneurs // Attribution des objets aux conteneurs
for (let conteneur of conteneurs) { for (let conteneur of conteneurs) {
conteneur.subItems = []; if (conteneur.isConteneur()) {
for (let id of conteneur.system.contenu ?? []) { conteneur.subItems = [];
let objet = inventaires.find(objet => (id == objet._id)); for (let id of conteneur.system.contenu ?? []) {
if (objet) { let objet = inventaires.find(objet => (id == objet._id));
objet.estContenu = true; // Permet de filtrer ce qui est porté dans le template if (objet) {
objetVersConteneur[id] = conteneur._id; objet.estContenu = true;
conteneur.subItems.push(objet); objetVersConteneur[id] = conteneur._id;
conteneur.subItems.push(objet);
}
} }
} }
} }