Fix sortie de conteneur

This commit is contained in:
Vincent Vandemeulebrouck
2021-05-07 01:47:51 +02:00
parent 6eb79c3ec7
commit 56c82d935a
6 changed files with 83 additions and 77 deletions

View File

@ -920,28 +920,29 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */
/** Supprime un item d'un conteneur, sur la base
* de leurs ID */
async enleverDeConteneur(itemId, conteneur) {
if (conteneur?.isConteneur()) { // Si présent
async enleverDeConteneur(item, conteneur, objetVersConteneur) {
if (conteneur?.isConteneur()) {
let data2use = duplicate(Misc.data(conteneur));
//console.log("Suppression du conteneur1", conteneurId, itemId, data2use.data.contenu);
let contenu = data2use.data.contenu;
let index = contenu.indexOf(itemId);
let index = contenu.indexOf(item.id);
while (index >= 0) { // Force cleanup, itemId is unique
contenu.splice(index, 1);
index = contenu.indexOf(itemId);
index = contenu.indexOf(item.id);
}
await this.updateEmbeddedDocuments('Item', [data2use]);
delete objetVersConteneur[item.id];
}
}
/* -------------------------------------------- */
/** Ajoute un item dans un conteneur, sur la base
* de leurs ID */
async ajouterDansConteneur(itemId, conteneur) {
async ajouterDansConteneur(item, conteneur, objetVersConteneur) {
if (conteneur?.isConteneur()) {
let data2use = duplicate(Misc.data(conteneur));
data2use.data.contenu.push(itemId);
data2use.data.contenu.push(item.id);
await this.updateEmbeddedDocuments('Item', [data2use]);
objetVersConteneur[item.id] = conteneur.id;
}
}
@ -959,54 +960,52 @@ export class RdDActor extends Actor {
await this.updateEmbeddedDocuments('Item', conteneurFixedList);
}
/* -------------------------------------------- */
async processItemDropEvent(event, objetVersConteneur) {
let dragData = JSON.parse(event.dataTransfer.getData("text/plain"));
async processDropItem(event, dragData, objetVersConteneur) {
console.log("DRAG", this.id, dragData);
let itemId = dragData.id || dragData.data._id;
if (dragData.type == 'Item') {
if (dragData.actorId && dragData.actorId != this.id) {
console.log("Moving objects", dragData);
this.moveItemsBetweenActors(itemId, dragData.actorId);
return false;
}
const droppedItemId = dragData.id || dragData.data._id;
if (dragData.actorId && dragData.actorId != this.id) {
console.log("Moving objects", dragData);
this.moveItemsBetweenActors(droppedItemId, dragData.actorId);
return false;
}
let result = true;
const destId = $(event.target).parents(".item").attr("data-item-id");
const itemId = dragData.id || dragData.data._id;
const item = this.getObjet(itemId);
if (item.isEquipement()) {
if (dragData.actorId == this.id) {
// rangement
const destId = $(event.target).parents(".item").attr("data-item-id");
const srcId = objetVersConteneur[itemId];
if (srcId != destId && itemId != destId) { // déplacement de l'objet
const item = this.getObjet(itemId);
const dest = this.getObjet(destId);
const src = this.getObjet(srcId);
if (!dest) {
// on peut toujours vider son sac
await this.enleverDeConteneur(itemId, src);
if (dest?.isConteneur()) {
if (this.conteneurPeutContenir(dest, item)) {
await this.enleverDeConteneur(item, src, objetVersConteneur);
await this.ajouterDansConteneur(item, dest, objetVersConteneur);
}
}
else if (!dest.isConteneur()) {
// regrouper?
await this.regrouperEquipementsSimilaires(item, dest);
}
else if (this.conteneurPeutContenir(dest, item)) {
// déplacer?
await this.enleverDeConteneur(itemId, src);
await this.ajouterDansConteneur(itemId, dest);
else {
if (src?.isConteneur() && !item?.isConteneur()) {
await this.enleverDeConteneur(item, src, objetVersConteneur);
// simuler la re-création
dragData.actorId = null;
await this.deleteEmbeddedDocuments('Item', [item.id]);
}
else if (dest?.isEquipementSimilaire(item)) {
await this.regrouperEquipementsSimilaires(item, dest);
}
}
}
}
this.computeEncombrementTotalEtMalusArmure();
await this.computeEncombrementTotalEtMalusArmure();
}
if (dragData.type == "Actor") {
this.addSubacteur(itemId);
}
return true;
return result;
}
/* -------------------------------------------- */
conteneurPeutContenir(dest, item) {
const destData = Misc.data(dest);
if (destData?.type != 'conteneur') {
ui.notifications.warn(`Impossible de déplacer un objet (${item.name}) vers un ${destData.type} qui n'est pas un conteneur (${dest.name}) !`);
return false;
}
if (this._isConteneurContenu(item, dest)) {
ui.notifications.warn(`Impossible de déplacer un conteneur parent (${item.name}) dans un de ses contenus ${destData.name} !`);
return false; // Loop detected !
@ -1061,10 +1060,8 @@ export class RdDActor extends Actor {
}
async regrouperEquipementsSimilaires(item, dest) {
if (item.isEquipementSimilaire(dest)) {
await dest.quantiteIncDec(Misc.templateData(item).quantite);
await this.deleteEmbeddedDocuments('Item', [item.id]);
}
await dest.quantiteIncDec(Misc.templateData(item).quantite);
await this.deleteEmbeddedDocuments('Item', [item.id]);
}
/* -------------------------------------------- */
@ -2348,7 +2345,7 @@ export class RdDActor extends Actor {
// Mise à jour de la tache
rollData.tache = duplicate(rollData.tache);
rollData.tache.data.points_de_tache_courant += rollData.rolled.ptTache;
if (rollData.rolled.isETotal){
if (rollData.rolled.isETotal) {
rollData.tache.data.difficulte--;
}
this.updateEmbeddedDocuments('Item', [rollData.tache]);