Fix: Nourriture consommée par le bon user

This commit is contained in:
Vincent Vandemeulebrouck 2022-11-13 21:56:23 +01:00
parent 2fe6b472a2
commit ccb6709f5b
3 changed files with 39 additions and 23 deletions

View File

@ -65,7 +65,7 @@ export class RdDActor extends Actor {
static onSocketMessage(sockmsg) { static onSocketMessage(sockmsg) {
switch (sockmsg.msg) { switch (sockmsg.msg) {
case "msg_remote_actor_call": case "msg_remote_actor_call":
return RdDActor.onRemoteActorCall(sockmsg.data); return RdDActor.onRemoteActorCall(sockmsg.data, sockmsg.userId);
case "msg_reset_nombre_astral": case "msg_reset_nombre_astral":
console.log("RESET ASTRAL", game.user.character); console.log("RESET ASTRAL", game.user.character);
game.user.character.resetNombreAstral(); game.user.character.resetNombreAstral();
@ -73,23 +73,26 @@ export class RdDActor extends Actor {
} }
} }
static remoteActorCall(callData, canExecuteLocally = () => Misc.isUniqueConnectedGM()) { static remoteActorCall(callData, userId = undefined) {
if (canExecuteLocally()) { userId = userId ?? Misc.firstConnectedGMId();
RdDActor.onRemoteActorCall(callData); if (userId == game.user.id) {
RdDActor.onRemoteActorCall(callData, userId);
return false; return false;
} }
else { else {
game.socket.emit(SYSTEM_SOCKET_ID, { msg: "msg_remote_actor_call", data: callData }); game.socket.emit(SYSTEM_SOCKET_ID, { msg: "msg_remote_actor_call", data: callData, userId: userId });
return true; return true;
} }
} }
static onRemoteActorCall(callData) { static onRemoteActorCall(callData, userId) {
const actor = game.actors.get(callData?.actorId); if (userId == game.user.id) {
if (Misc.isOwnerPlayerOrUniqueConnectedGM(actor)) { // Seul le joueur choisi effectue l'appel: le joueur courant si propriétaire de l'actor, ou le MJ sinon const actor = game.actors.get(callData?.actorId);
const args = callData.args; if (Misc.isOwnerPlayerOrUniqueConnectedGM(actor)) { // Seul le joueur choisi effectue l'appel: le joueur courant si propriétaire de l'actor, ou le MJ sinon
console.info(`RdDActor.onRemoteActorCall: pour l'Actor ${callData.actorId}, appel de RdDActor.${callData.method}(`, ...args, ')'); const args = callData.args;
actor[callData.method](...args); console.info(`RdDActor.onRemoteActorCall: pour l'Actor ${callData.actorId}, appel de RdDActor.${callData.method}(`, ...args, ')');
actor[callData.method](...args);
}
} }
} }
@ -299,7 +302,7 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
getObjet(id) { getObjet(id) {
return id ? this.items.find(it => it.id == id) : undefined; return this.getEmbeddedDocument('Item', id);
} }
listItemsData(type) { listItemsData(type) {
@ -1932,15 +1935,24 @@ export class RdDActor extends Actor {
async consommer(item, choix) { async consommer(item, choix) {
switch (item.type) { switch (item.type) {
case 'nourritureboisson': case 'nourritureboisson':
return await this.consommerNourritureboisson(item, choix); return await this.consommerNourritureboisson(item.id, choix);
case 'potion': case 'potion':
return await this.consommerPotion(item) return await this.consommerPotion(item)
} }
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async consommerNourritureboisson(item, choix = { doses: 1, seForcer: false, supprimerSiZero: false }) { async consommerNourritureboisson(itemId, choix = { doses: 1, seForcer: false, supprimerSiZero: false}, userId = undefined) {
if (userId != undefined && userId != game.user.id) {
RdDActor.remoteActorCall({
actorId: this.id,
method: 'consommerNourritureboisson',
args: [itemId, choix, userId]
},
userId)
return;
}
const item = this.getObjet(itemId)
if (item.type != 'nourritureboisson') { if (item.type != 'nourritureboisson') {
return; return;
} }
@ -3649,10 +3661,7 @@ export class RdDActor extends Actor {
const acheteur = achat.acheteurId ? game.actors.get(achat.acheteurId) : undefined; const acheteur = achat.acheteurId ? game.actors.get(achat.acheteurId) : undefined;
const vendeur = achat.vendeurId ? game.actors.get(achat.vendeurId) : undefined; const vendeur = achat.vendeurId ? game.actors.get(achat.vendeurId) : undefined;
const messageVente = game.messages.get(achat.chatMessageIdVente); const vente = achat.vente;
const html = await messageVente.getHTML();
const button = html.find(".button-acheter")[0];
const vente = DialogItemAchat.venteData(button);
const itemId = vente.item._id; const itemId = vente.item._id;
const isItemEmpilable = "quantite" in vente.item.system; const isItemEmpilable = "quantite" in vente.item.system;
@ -3692,7 +3701,7 @@ export class RdDActor extends Actor {
let items = await acheteur.createEmbeddedDocuments("Item", listeAchat); let items = await acheteur.createEmbeddedDocuments("Item", listeAchat);
if (achat.choix.consommer && vente.item.type == 'nourritureboisson') { if (achat.choix.consommer && vente.item.type == 'nourritureboisson') {
achat.choix.doses = achat.choix.nombreLots; achat.choix.doses = achat.choix.nombreLots;
await acheteur.consommerNourritureboisson(items[0], achat.choix); await acheteur.consommerNourritureboisson(items[0].id, achat.choix, vente.actingUserId);
} }
} }
if (coutDeniers > 0) { if (coutDeniers > 0) {

View File

@ -22,6 +22,7 @@ export class DialogItemAchat extends Dialog {
const prixLot = Monnaie.arrondiDeniers(button.attributes['data-prixLot']?.value ?? 0); const prixLot = Monnaie.arrondiDeniers(button.attributes['data-prixLot']?.value ?? 0);
return { return {
item: json ? JSON.parse(json) : undefined, item: json ? JSON.parse(json) : undefined,
actingUserId: game.user.id,
vendeurId: vendeurId, vendeurId: vendeurId,
vendeur: vendeur, vendeur: vendeur,
acheteur: acheteur, acheteur: acheteur,
@ -39,6 +40,7 @@ export class DialogItemAchat extends Dialog {
chatMessageIdVente: RdDUtility.findChatMessageId(button) chatMessageIdVente: RdDUtility.findChatMessageId(button)
}; };
} }
static async onAcheter(venteData) { static async onAcheter(venteData) {
const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-achat.html`, venteData); const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-achat.html`, venteData);
const dialog = new DialogItemAchat(html, venteData); const dialog = new DialogItemAchat(html, venteData);
@ -52,7 +54,7 @@ export class DialogItemAchat extends Dialog {
const actionAchat = venteData.prixLot > 0 ? "Acheter" : "Prendre"; const actionAchat = venteData.prixLot > 0 ? "Acheter" : "Prendre";
const buttons = {}; const buttons = {};
if (isConsommable) { if (isConsommable) {
buttons["consommer"] = { label: venteData.item.system.boisson ? "Boire" : "Manger", callback: it => { this.onAchatConsommer(); } } buttons["consommer"] = { label: venteData.item.system.boisson ? "Boire" : "Manger", callback: it => this.onAchatConsommer() }
} }
buttons[actionAchat] = { label: actionAchat, callback: it => { this.onAchat(); } }; buttons[actionAchat] = { label: actionAchat, callback: it => { this.onAchat(); } };
buttons["decliner"] = { label: "Décliner", callback: it => { } }; buttons["decliner"] = { label: "Décliner", callback: it => { } };
@ -76,7 +78,8 @@ export class DialogItemAchat extends Dialog {
acheteurId: this.venteData.acheteur?.id, acheteurId: this.venteData.acheteur?.id,
prixTotal: this.venteData.prixTotal, prixTotal: this.venteData.prixTotal,
chatMessageIdVente: this.venteData.chatMessageIdVente, chatMessageIdVente: this.venteData.chatMessageIdVente,
choix: this.venteData.choix choix: this.venteData.choix,
vente: this.venteData
}); });
} }

View File

@ -133,7 +133,11 @@ export class Misc {
* @returns true pour un seul utilisateur: le premier GM connecté par ordre d'id * @returns true pour un seul utilisateur: le premier GM connecté par ordre d'id
*/ */
static isUniqueConnectedGM() { static isUniqueConnectedGM() {
return game.user.id == Misc.firstConnectedGM()?.id; return game.user.id == Misc.firstConnectedGMId();
}
static firstConnectedGMId() {
return Misc.firstConnectedGM()?.id;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */