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:
		
							
								
								
									
										12
									
								
								changelog.md
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								changelog.md
									
									
									
									
									
								
							| @@ -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 | ||||||
|   | |||||||
| @@ -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,9 +583,14 @@ 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) { | ||||||
|  |             if (item.type == 'conteneur') { | ||||||
|               corrections.push({ _id: item.id, 'system.contenu': [] }); |               corrections.push({ _id: item.id, 'system.contenu': [] }); | ||||||
|             } |             } | ||||||
|  |             else { | ||||||
|  |               corrections.push({ _id: item.id, 'system.-=contenu': undefined }); | ||||||
|  |             } | ||||||
|  |           } | ||||||
|         } |         } | ||||||
|         if (corrections.length > 0) { |         if (corrections.length > 0) { | ||||||
|           await this.updateEmbeddedDocuments('Item', corrections); |           await this.updateEmbeddedDocuments('Item', corrections); | ||||||
| @@ -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; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* -------------------------------------------- */ |   /* -------------------------------------------- */ | ||||||
|   | |||||||
| @@ -358,16 +358,18 @@ 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) { | ||||||
|  |       if (conteneur.isConteneur()) { | ||||||
|         conteneur.subItems = []; |         conteneur.subItems = []; | ||||||
|         for (let id of conteneur.system.contenu ?? []) { |         for (let id of conteneur.system.contenu ?? []) { | ||||||
|           let objet = inventaires.find(objet => (id == objet._id)); |           let objet = inventaires.find(objet => (id == objet._id)); | ||||||
|           if (objet) { |           if (objet) { | ||||||
|           objet.estContenu = true; // Permet de filtrer ce qui est porté dans le template |             objet.estContenu = true; | ||||||
|             objetVersConteneur[id] = conteneur._id; |             objetVersConteneur[id] = conteneur._id; | ||||||
|             conteneur.subItems.push(objet); |             conteneur.subItems.push(objet); | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|  |     } | ||||||
|     for (let conteneur of conteneurs) { |     for (let conteneur of conteneurs) { | ||||||
|       conteneur.system.encTotal = RdDUtility.calculEncContenu(conteneur, inventaires); |       conteneur.system.encTotal = RdDUtility.calculEncContenu(conteneur, inventaires); | ||||||
|     } |     } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user