From 7ba3b44c87c35bd3059ddb60a0f28218d357d3bf Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sat, 5 Jun 2021 01:14:29 +0200 Subject: [PATCH] =?UTF-8?q?Fix:=20=C3=A9crasement=20quantit=C3=A9=20=20ach?= =?UTF-8?q?ats=20multiples?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Quand plusieurs joueurs ouvraient la fenêtre d'achat en même temps, on utilisait pour chaque acheteur la quantité d'origine, la quantité disponible n'était diminuée que par le dernier acheteur. En reprenant les infos disponibles dans le tchat, on peut appliquer la diminution (le delta) à la quantité courante, et supporter plusieurs acheteurs --- module/actor.js | 68 ++++++++++++++++++------------------- module/dialog-item-achat.js | 60 +++++++++++++++++--------------- 2 files changed, 66 insertions(+), 62 deletions(-) diff --git a/module/actor.js b/module/actor.js index 60a1467a..5d425962 100644 --- a/module/actor.js +++ b/module/actor.js @@ -30,6 +30,7 @@ import { Monnaie } from "./item-monnaie.js"; import { DialogConsommer } from "./dialog-item-consommer.js"; import { DialogFabriquerPotion } from "./dialog-fabriquer-potion.js"; import { RollDataAjustements } from "./rolldata-ajustements.js"; +import { DialogItemAchat } from "./dialog-item-achat.js"; /* -------------------------------------------- */ @@ -3511,61 +3512,61 @@ export class RdDActor extends Actor { } /* -------------------------------------------- */ - async achatVente(vendeurId, acheteurId, venteData, chatMessageIdVente) { - if (vendeurId == acheteurId) { + async achatVente(achat) { + if (achat.vendeurId == achat.acheteurId) { ui.notifications.info("Inutile de se vendre à soi-même"); return; } if (!Misc.isElectedUser()) { RdDActor.remoteActorCall({ - actorId: vendeurId ?? acheteurId, - method: 'achatVente', args: [vendeurId, acheteurId, venteData, chatMessageIdVente] + actorId: achat.vendeurId ?? achat.acheteurId, + method: 'achatVente', args: [achat] }); return; } - const acheteur = acheteurId ? game.actors.get(acheteurId) : undefined; - const vendeur = vendeurId ? game.actors.get(vendeurId) : undefined; - const itemId = venteData.item._id; + const acheteur = achat.acheteurId ? game.actors.get(achat.acheteurId) : undefined; + const vendeur = achat.vendeurId ? game.actors.get(achat.vendeurId) : undefined; + const messageVente = game.messages.get(achat.chatMessageIdVente); + const html = await messageVente.getHTML(); + const buttonAcheter = html.find(".button-acheter")[0]; + const vente = DialogItemAchat.prepareVenteData(buttonAcheter, achat.vendeurId, vendeur, acheteur); + const itemId = vente.item._id; - const coutDeniers = Math.floor((venteData.prixTotal ?? 0) * 100); - venteData.quantiteTotal = (venteData.nombreLots ?? 1) * (venteData.tailleLot); + const coutDeniers = Math.floor((achat.prixTotal ?? 0) * 100); + achat.quantiteTotal = (achat.nombreLots ?? 1) * (vente.tailleLot); if (acheteur) { let resteAcheteur = await acheteur.depenser(coutDeniers); if (resteAcheteur < 0) { - ui.notifications.warn(`Vous n'avez pas assez d'argent pour payer ${venteData.prixTotal} sols !`); + ui.notifications.warn(`Vous n'avez pas assez d'argent pour payer ${vente.prixTotal} sols !`); return; } } if (vendeur) { - let itemData = Misc.data(vendeur.getObjet(itemId)); - // diminuer QuantiteVendeur - if ("quantite" in itemData.data ? - itemData.data.quantite < venteData.quantiteTotal : venteData.nombreLots != 1) { - // pas assez de quantite + let itemVenduData = Misc.data(vendeur.getObjet(itemId)); + if ("quantite" in itemVenduData.data ? itemVenduData.data.quantite < achat.quantiteTotal : achat.nombreLots != 1) { await acheteur?.ajouterDeniers(coutDeniers); - ui.notifications.warn(`Le vendeur n'a plus assez de ${venteData.item.name} !`); + ui.notifications.warn(`Le vendeur n'a plus assez de ${vente.item.name} !`); return; } vendeur.ajouterDeniers(coutDeniers); - let qtReste = (itemData.data.quantite ?? 1) - venteData.quantiteTotal; - if (qtReste == 0) { + let resteQuantite = (itemVenduData.data.quantite ?? 1) - achat.quantiteTotal; + if (resteQuantite == 0) { vendeur.deleteEmbeddedDocuments("Item", itemId); } else { - vendeur.updateEmbeddedDocuments("Item", [{ _id: itemId, 'data.quantite': qtReste }]); + vendeur.updateEmbeddedDocuments("Item", [{ _id: itemId, 'data.quantite': resteQuantite }]); } } - if (acheteur) { - const achat = { - type: venteData.item.type, - img: venteData.item.img, - name: venteData.item.name, - data: venteData.item.data + const achatData = { + type: vente.item.type, + img: vente.item.img, + name: vente.item.name, + data: vente.item.data } - achat.data.quantite = venteData.quantiteTotal; - await acheteur.createEmbeddedDocuments("Item", [achat]); + achatData.data.quantite = achat.quantiteTotal; + await acheteur.createEmbeddedDocuments("Item", [achatData]); } if (coutDeniers > 0) { RdDAudio.PlayContextAudio("argent"); @@ -3573,19 +3574,16 @@ export class RdDActor extends Actor { ChatMessage.create({ whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), - content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-achat-item.html', venteData) + content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-achat-item.html', vente) }); - if (!venteData.quantiteIllimite) { - if (venteData.quantiteNbLots <= venteData.nombreLots) { + if (!vente.quantiteIllimite) { + if (vente.quantiteNbLots <= achat.nombreLots) { ChatUtility.removeChatMessageId(chatMessageIdVente); } else { - venteData.quantiteNbLots -= venteData.nombreLots; - venteData.jsondata = JSON.stringify(venteData.item); - let newMessageVente = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-vente-item.html', venteData); - const messageVente = game.messages.get(chatMessageIdVente); - messageVente.update({ content: newMessageVente }); + vente.quantiteNbLots -= achat.nombreLots; + messageVente.update({ content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-vente-item.html', vente) }); messageVente.render(true); } } diff --git a/module/dialog-item-achat.js b/module/dialog-item-achat.js index 855c84a1..7a7079cf 100644 --- a/module/dialog-item-achat.js +++ b/module/dialog-item-achat.js @@ -1,17 +1,18 @@ -import { RdDActor } from "./actor.js"; -import { HtmlUtility } from "./html-utility.js"; + import { Misc } from "./misc.js"; import { RdDUtility } from "./rdd-utility.js"; export class DialogItemAchat extends Dialog { static async onButtonAcheter(event) { - let jsondata = event.currentTarget.attributes['data-jsondata']?.value; - if (!jsondata) { + const buttonAcheter = event.currentTarget; + if (!buttonAcheter.attributes['data-jsondata']?.value) { ui.notifications.warn("Impossible d'acheter: informations sur l'objet manquantes") return; } - const vendeurId = event.currentTarget.attributes['data-vendeurId']?.value; + const chatMessageIdVente = RdDUtility.findChatMessageId(buttonAcheter); + + const vendeurId = buttonAcheter.attributes['data-vendeurId']?.value; const vendeur = vendeurId ? game.actors.get(vendeurId) : undefined; const acheteur = RdDUtility.getSelectedActor(); @@ -20,22 +21,7 @@ export class DialogItemAchat extends Dialog { return; } - const chatMessageIdVente = RdDUtility.findChatMessageId(event.currentTarget); - const itemData = JSON.parse(jsondata); - const prixLot = event.currentTarget.attributes['data-prixLot']?.value ?? 0; - let venteData = { - item: itemData, - vendeurId: vendeurId, - vendeur: Misc.data(vendeur), - acheteur: Misc.data(acheteur), - tailleLot: event.currentTarget.attributes['data-tailleLot']?.value ?? 1, - quantiteIllimite : event.currentTarget.attributes['data-quantiteIllimite']?.value == 'true', - quantiteNbLots: event.currentTarget.attributes['data-quantiteNbLots']?.value, - nombreLots: 1, - prixLot: prixLot, - prixTotal: prixLot, - isVente: prixLot > 0 - }; + let venteData = DialogItemAchat.prepareVenteData(buttonAcheter, vendeurId, vendeur, acheteur); const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-achat.html`, venteData); const dialog = new DialogItemAchat(html, vendeur, acheteur, venteData, chatMessageIdVente); dialog.render(true); @@ -63,14 +49,34 @@ export class DialogItemAchat extends Dialog { this.venteData = venteData; } + static prepareVenteData(buttonAcheter, vendeurId, vendeur, acheteur) { + const jsondata = buttonAcheter.attributes['data-jsondata']?.value; + const prixLot = buttonAcheter.attributes['data-prixLot']?.value ?? 0; + let venteData = { + item: JSON.parse(jsondata), + vendeurId: vendeurId, + vendeur: Misc.data(vendeur), + acheteur: Misc.data(acheteur), + tailleLot: parseInt(buttonAcheter.attributes['data-tailleLot']?.value ?? 1), + quantiteIllimite: buttonAcheter.attributes['data-quantiteIllimite']?.value == 'true', + quantiteNbLots: parseInt(buttonAcheter.attributes['data-quantiteNbLots']?.value), + nombreLots: 1, + prixLot: prixLot, + prixTotal: prixLot, + isVente: prixLot > 0 + }; + return venteData; + } + async onAchat() { await $(".nombreLots").change(); - (this.vendeur ?? this.acheteur).achatVente( - this.vendeur?.id, - this.acheteur?.id, - this.venteData, - this.chatMessageIdVente - ); + (this.vendeur ?? this.acheteur).achatVente({ + vendeurId: this.vendeur?.id, + acheteurId: this.acheteur?.id, + nombreLots: this.venteData.nombreLots, + prixTotal: this.venteData.prixTotal, + chatMessageIdVente: this.chatMessageIdVente + }); } /* -------------------------------------------- */