From 362fd964d00e6a95a973096bfb1ebbe147719afc Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Fri, 21 Oct 2022 02:10:37 +0200 Subject: [PATCH 1/5] =?UTF-8?q?Fix:=20=C3=A9dition=20de=20sorts=20d'Actor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit L'édition était impossible parce que le formData ne contient pas de noeud system, mais des propriétés 'system.portee', ... --- module/item-sheet.js | 4 ++-- module/item-sort.js | 25 ++++++++++--------------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/module/item-sheet.js b/module/item-sheet.js index 1a92be79..0a2302b0 100644 --- a/module/item-sheet.js +++ b/module/item-sheet.js @@ -250,9 +250,9 @@ export class RdDItemSheet extends ItemSheet { /* -------------------------------------------- */ /** @override */ - _updateObject(event, formData) { // Deprecated en v0.8 à clarifier + _updateObject(event, formData) { // Données de bonus de cases ? - formData = RdDItemSort.buildBonusCaseStringFromFormData(formData); + formData['system.bonuscase'] = RdDItemSort.buildBonusCaseStringFromFormData(formData.bonusValue, formData.caseValue); return this.item.update(formData); } diff --git a/module/item-sort.js b/module/item-sort.js index 5047cc23..befbb6b0 100644 --- a/module/item-sort.js +++ b/module/item-sort.js @@ -63,26 +63,21 @@ export class RdDItemSort extends Item { /** Met à jour les données de formulaire * si static des bonus de cases sont présents * */ - static buildBonusCaseStringFromFormData( formData ) { - if ( formData.bonusValue ) { + static buildBonusCaseStringFromFormData( bonuses, cases ) { + if ( bonuses ) { let list = []; let caseCheck = {}; - for(let i=0; i 0 && caseCheck[coord] == undefined ) { - caseCheck[coord] = bonus; - list.push( coord+":"+bonus ); - } + for (let i=0; i 0 && caseCheck[coord] == undefined ) { + caseCheck[coord] = bonus; + list.push( coord+":"+bonus ); } } - formData.bonusValue = undefined; - formData.caseValue = undefined; - formData.system.bonuscase = list.toString(); // Reset + return list.toString(); } - return formData; + return undefined; } /* -------------------------------------------- */ From 32af9bf1b40739d8837c979ba736d3d282a09719 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Fri, 21 Oct 2022 02:27:16 +0200 Subject: [PATCH 2/5] Ajout de confirmation pour refoulement --- module/actor.js | 20 ++++++++++++++++---- module/regles-optionelles.js | 5 +++-- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/module/actor.js b/module/actor.js index 223a5e90..dc2f3c1d 100644 --- a/module/actor.js +++ b/module/actor.js @@ -1426,9 +1426,21 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async actionRefoulement(item) { const refoulement = item?.system.refoulement ?? 0; - if (refoulement>0){ - await this.ajouterRefoulement(refoulement); - await item.delete(); + if (refoulement>0) { + RdDConfirm.confirmer({ + settingConfirmer: "confirmation-refouler", + content: `

Prennez-vous le risque de refouler ${item.name} pour ${refoulement} points de refoulement ?

`, + title: 'Confirmer la refoulement', + buttonLabel: 'Refouler', + onAction: async () => { + ChatMessage.create({ + whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + content: `${this.name} a refoulé une queue ${item.nname} pour ${refoulement} points de refoulement` + }); + await this.ajouterRefoulement(refoulement); + await item.delete(); + } + }) } } @@ -3703,7 +3715,7 @@ export class RdDActor extends Actor { system: mergeObject(vente.item.system, { quantite: isItemEmpilable ? achat.quantiteTotal : undefined }), } let listeAchat = isItemEmpilable ? [achatData] : Array.from({ length: achat.quantiteTotal }, (_, i) => achatData) - let items = await acheteur.createEmbeddedDocuments("Item", listeAchat) + let items = await acheteur.createEmbeddedDocuments("Item", listeAchat); if (achat.choix.consommer && vente.item.type == 'nourritureboisson') { achat.choix.doses = achat.choix.nombreLots; await acheteur.consommerNourritureboisson(items[0], achat.choix); diff --git a/module/regles-optionelles.js b/module/regles-optionelles.js index ec93b239..eceda14c 100644 --- a/module/regles-optionelles.js +++ b/module/regles-optionelles.js @@ -18,8 +18,9 @@ const listeReglesOptionelles = [ { group: 'Règles générales', name: 'appliquer-fatigue', descr: "Appliquer les règles de fatigue"}, { group: 'Règles générales', name: 'afficher-colonnes-reussite', descr: "Afficher le nombre de colonnes de réussite ou d'échec", default: false }, - { group: 'Confirmations', name: 'confirmation-tmr', descr: "Confirmer pour monter dans les TMR", scope: "client"}, - { group: 'Confirmations', name: 'confirmation-vider', descr: "Confirmer pour vider l'équipement", scope: "client"}, + { group: 'Confirmations', name: 'confirmation-tmr', descr: "Confirmer pour monter dans les TMR", scope: "client"}, + { group: 'Confirmations', name: 'confirmation-refouler', descr: "Confirmer avant de refouler", scope: "client"}, + { group: 'Confirmations', name: 'confirmation-vider', descr: "Confirmer pour vider l'équipement", scope: "client"}, { group: 'Confirmations', name: 'confirmation-supprimer-lien-acteur', descr: "Confirmer pour détacher un animal/suivant/véhicule", scope: "client"}, { group: 'Confirmations', name: 'confirmation-supprimer-equipement', descr: "Confirmer la suppression des équipements", scope: "client"}, { group: 'Confirmations', name: 'confirmation-supprimer-oeuvre', descr: "Confirmer la suppression des oeuvres", scope: "client"}, From 9a1a464cb6712db86fcb0f05b6aceaa1a9f0af5d Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Fri, 21 Oct 2022 02:40:49 +0200 Subject: [PATCH 3/5] Whisper vers l'actor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plutôt que le game.user.name, pour que les messages soient envoyés au joueur même si c'est le MJ qui agit pour le user --- module/actor.js | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/module/actor.js b/module/actor.js index dc2f3c1d..26d371b1 100644 --- a/module/actor.js +++ b/module/actor.js @@ -393,7 +393,7 @@ export class RdDActor extends Actor { potionImg: potion.img } ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-potionenchantee-chateaudormant.html`, messageData) }); } @@ -801,7 +801,7 @@ export class RdDActor extends Actor { rollData.poesie = await Poetique.getExtrait(); ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-reve-de-dragon.html`, rollData) }); } @@ -946,7 +946,7 @@ export class RdDActor extends Actor { message += "
" + troncName; } ChatMessage.create({ - whisper: ChatMessage.getWhisperRecipients(game.user.name), + whisper: ChatMessage.getWhisperRecipients(this.name), content: message }); } @@ -1463,7 +1463,7 @@ export class RdDActor extends Actor { await this.createEmbeddedDocuments('Item', [souffle]); if (options.chat) { ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), content: this.name + " subit un Souffle de Dragon : " + souffle.name }); } @@ -1483,7 +1483,7 @@ export class RdDActor extends Actor { await this.createEmbeddedDocuments('Item', [queue]); if (options.chat) { ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), content: this.name + " subit une Queue de Dragon : " + queue.name }); } @@ -1521,7 +1521,7 @@ export class RdDActor extends Actor { let tmr = await TMRUtility.getTMRAleatoire(tmr => accessible(tmr) && !innaccessible.includes(tmr.coord)); ChatMessage.create({ content: `${raison} : ré-insertion aléatoire.`, - whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name) + whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name) }); await this.forcerPositionTMRInconnue(tmr); return tmr; @@ -1691,7 +1691,7 @@ export class RdDActor extends Actor { const result = await this._jetEndurance(this.system.sante.endurance.value) const message = { content: "Jet d'Endurance : " + result.roll.total + " / " + endurance + "
", - whisper: ChatMessage.getWhisperRecipients(game.user.name) + whisper: ChatMessage.getWhisperRecipients(this.name) }; if (result.sonne) { message.content += `${this.name} a échoué son Jet d'Endurance et devient Sonné`; @@ -1741,7 +1741,7 @@ export class RdDActor extends Actor { } const message = { content: msgText, - whisper: ChatMessage.getWhisperRecipients(game.user.name) + whisper: ChatMessage.getWhisperRecipients(this.name) }; ChatMessage.create(message); } @@ -1850,7 +1850,7 @@ export class RdDActor extends Actor { const jetMoral = await this._jetDeMoral(situation); const finMessage = (jetMoral.succes ? messageReussi : messageManque) ?? (jetMoral.ajustement == 0 ? "Vous gardez votre moral" : jetMoral.ajustement > 0 ? "Vous gagnez du moral" : "Vous perdez du moral"); ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), content: `${finMessage} - jet ${jetMoral.succes ? "réussi" : "manqué"} en situation ${situation} (${jetMoral.jet}/${jetMoral.difficulte}).` }); return jetMoral.ajustement; @@ -2145,7 +2145,7 @@ export class RdDActor extends Actor { }; ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-transformer-stress.html`, stressRollData) }); @@ -2396,7 +2396,7 @@ export class RdDActor extends Actor { } ChatMessage.create({ content: "Vous êtes sous le coup d'une Mauvaise Rencontre en Persective." + addMsg, - whisper: ChatMessage.getWhisperRecipients(game.user.name) + whisper: ChatMessage.getWhisperRecipients(this.name) }); } return rencSpecial; @@ -2408,7 +2408,7 @@ export class RdDActor extends Actor { if (countInertieDraconique > 0) { ChatMessage.create({ content: `Vous êtes sous le coup d'Inertie Draconique : vous perdrez ${countInertieDraconique + 1} cases de Fatigue par déplacement au lieu d'une.`, - whisper: ChatMessage.getWhisperRecipients(game.user.name) + whisper: ChatMessage.getWhisperRecipients(this.name) }); } return countInertieDraconique + 1; @@ -2420,7 +2420,7 @@ export class RdDActor extends Actor { await this.reveActuelIncDec(-1); ChatMessage.create({ content: "Vous êtes sous le coup d'un Péage : l'entrée sur cette case vous a coûté 1 Point de Rêve (déduit automatiquement).", - whisper: ChatMessage.getWhisperRecipients(game.user.name) + whisper: ChatMessage.getWhisperRecipients(this.name) }); } } @@ -3027,7 +3027,7 @@ export class RdDActor extends Actor { // Cas de désir lancinant, pas d'expérience sur particulière ChatMessage.create({ content: `Vous souffrez au moins d'un Désir Lancinant, vous ne pouvez pas gagner d'expérience sur une Particulière tant que le désir n'est pas assouvi`, - whisper: ChatMessage.getWhisperRecipients(game.user.name) + whisper: ChatMessage.getWhisperRecipients(this.name) }); return undefined; } @@ -3157,7 +3157,7 @@ export class RdDActor extends Actor { if (countMonteeLaborieuse > 0) { ChatMessage.create({ content: `Vous êtes sous le coup d'une Montée Laborieuse : vos montées en TMR coûtent ${countMonteeLaborieuse} Point de Rêve de plus.`, - whisper: ChatMessage.getWhisperRecipients(game.user.name) + whisper: ChatMessage.getWhisperRecipients(this.name) }); } return countMonteeLaborieuse; @@ -3197,7 +3197,7 @@ export class RdDActor extends Actor { if (this.getReveActuel() < minReveValue) { ChatMessage.create({ content: `Vous n'avez les ${minReveValue} Points de Reve nécessaires pour monter dans les Terres Médianes`, - whisper: ChatMessage.getWhisperRecipients(game.user.name) + whisper: ChatMessage.getWhisperRecipients(this.name) }); return; } @@ -3943,7 +3943,7 @@ export class RdDActor extends Actor { this.bonusRecuperationPotion = potionData.system.herbeBonus; } ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-soin.html`, potionData) }); } @@ -3976,7 +3976,7 @@ export class RdDActor extends Actor { this.bonusRepos = potionData.system.herbeBonus; } ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-repos.html`, potionData) }); } @@ -4014,7 +4014,7 @@ export class RdDActor extends Actor { this.diminuerQuantiteObjet(herbeData._id, herbeData.nbBrins); ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-fabriquer-potion-base.html`, messageData) }); } @@ -4039,7 +4039,7 @@ export class RdDActor extends Actor { } } ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-generique.html`, potionData) }); } @@ -4174,7 +4174,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ notifyGestionTeteSouffleQueue(item, manualMessage = true) { ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), content: `${this.name} a reçu un/une ${item.type}: ${item.name}, qui ${manualMessage ? "n'est pas" : "est"} géré(e) automatiquement. ${manualMessage ? manualMessage : ''}` }); } From e6b71faa02ae770100cd704be7bb52f92d74c836 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Fri, 21 Oct 2022 02:46:29 +0200 Subject: [PATCH 4/5] =?UTF-8?q?Passer=20un=20async=20=C3=A0=20game.socket.?= =?UTF-8?q?on()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Corrige le problème causé par l'update d'un objet pendant le traitement d'un message du socket, qui peut échouer quand le socket est occupé, et cause donc un rejet du message du socket, qui est réessayé en boucle infinier. Ce qui devrait résoudre le problème d'achat/vente qui fait planter le MJ et le serveur Foundry. --- module/rdd-main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/rdd-main.js b/module/rdd-main.js index d7466074..638a84a4 100644 --- a/module/rdd-main.js +++ b/module/rdd-main.js @@ -148,7 +148,7 @@ Hooks.once("init", async function () { }; /* -------------------------------------------- */ - game.socket.on(SYSTEM_SOCKET_ID, sockmsg => { + game.socket.on(SYSTEM_SOCKET_ID, async (sockmsg) => { console.log(">>>>> MSG RECV", sockmsg); try { RdDUtility.onSocketMessage(sockmsg); From 0ef9123cd56a62a70b97fb4b5931780a969b1be8 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Fri, 21 Oct 2022 22:10:38 +0200 Subject: [PATCH 5/5] Version 10.0.30 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix de bug de socket qui pouvait conduire à un plantage de Foundry, par exemple lors d'un achat par un joueur * Fix de l'édition des sorts des personnages: la sauvegarde fonctionne de nouveau * Ajout d'une demande de confirmation lors d'un refoulement: l'action refouler est très proche de la suppression, un mauvais clic est vite arrivé --- system.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system.json b/system.json index 679f1f54..263f1b7d 100644 --- a/system.json +++ b/system.json @@ -1,8 +1,8 @@ { "id": "foundryvtt-reve-de-dragon", "title": "Rêve de Dragon", - "version": "10.0.29", - "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-10.0.29.zip", + "version": "10.0.30", + "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-10.0.30.zip", "manifest": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/v10/system.json", "compatibility": { "minimum": "10",