Empêcher doublons sur tête/souffle #175

Lors de l'ajout de la tête présents des cités, le présent de chaque
cité était ajouté par tous les joueurs connectés qui traitaient le hook
This commit is contained in:
Vincent Vandemeulebrouck 2021-04-16 23:07:09 +02:00
parent 6fc8906d67
commit f05a166d5b
4 changed files with 43 additions and 39 deletions

View File

@ -55,27 +55,21 @@ export class RdDActor extends Actor {
} }
} }
static remoteActorCall(actorId, method, ...args) { static remoteActorCall(options) {
game.socket.emit("system.foundryvtt-reve-de-dragon", { console.log("remoteActorCall ", options)
msg: "msg_remote_actor_call", options.userId = options.userId ?? Misc.connectedGMOrUser();
data: { game.socket.emit("system.foundryvtt-reve-de-dragon", { msg: "msg_remote_actor_call", data: options });
gmId: Misc.connectedGM(),
toActorId: actorId,
method: method,
args: args
}
});
} }
static onRemoteActorCall(data) { static onRemoteActorCall(data) {
if (game.user.id == data.gmId) { // Seul le GM connecté choisi effectue l'appel if (game.user.id == data.userId) { // Seul le joueur choisi effectue l'appel
const actor = game.actors.get(data?.toActorId); const actor = game.actors.get(data?.actorId);
if (!actor) { if (!actor) {
console.info("RdDActor.onRemoteActorCall: Pas d'Actor disponible ", data); console.info("RdDActor.onRemoteActorCall: Pas d'Actor disponible ", data);
} }
else { else {
const args = data.args; const args = data.args;
console.info(`RdDActor.onRemoteActorCall: pour l'Actor ${data.toActorId}, appel de RdDActor.${data.method}(`, ...args, ')'); console.info(`RdDActor.onRemoteActorCall: pour l'Actor ${data.actorId}, appel de RdDActor.${data.method}(`, ...args, ')');
actor[data.method](...args); actor[data.method](...args);
} }
} }
@ -3185,7 +3179,7 @@ export class RdDActor extends Actor {
async ajouterDeniers(gain, fromActorId = undefined) { async ajouterDeniers(gain, fromActorId = undefined) {
if (fromActorId && !game.user.isGM) { if (fromActorId && !game.user.isGM) {
RdDActor.remoteActorCall(this.id, 'ajouterDeniers', gain, fromActorId); RdDActor.remoteActorCall({ userId: Misc.connectedGMOrUser(), actorId: this.id, method: 'ajouterDeniers', args: [gain, fromActorId] });
} }
else { else {
const fromActor = game.actors.get(fromActorId) const fromActor = game.actors.get(fromActorId)
@ -3616,6 +3610,14 @@ export class RdDActor extends Actor {
await this.createEmbeddedDocuments('ActiveEffect', [effet]); await this.createEmbeddedDocuments('ActiveEffect', [effet]);
} }
/* -------------------------------------------- */
async onPreUpdateItem(item, change, options, id) {
const itemData = Misc.data(item);
if (itemData.type == 'competence' && itemData.data.defaut_carac && itemData.data.xp) {
await this.checkCompetenceXP(itemData.name, itemData.data.xp);
}
}
/* -------------------------------------------- */ /* -------------------------------------------- */
async onCreateItem(item, options, id) { async onCreateItem(item, options, id) {
switch (item.type) { switch (item.type) {
@ -3628,13 +3630,6 @@ export class RdDActor extends Actor {
} }
} }
async onPreUpdateItem(item, change, options, id) {
const itemData = Misc.data(item);
if (itemData.type == 'competence' && itemData.data.defaut_carac && itemData.data.xp) {
await this.checkCompetenceXP(itemData.name, itemData.data.xp);
}
}
async onDeleteItem(item, options, id) { async onDeleteItem(item, options, id) {
switch (item.type) { switch (item.type) {
case 'tete': case 'tete':
@ -3650,29 +3645,32 @@ export class RdDActor extends Actor {
} }
async onCreateOwnedDraconique(item, options, id) { async onCreateOwnedDraconique(item, options, id) {
if (Misc.isElectedUser()) {
let draconique = Draconique.all().find(it => it.match(item)); let draconique = Draconique.all().find(it => it.match(item));
if (draconique) { if (draconique) {
draconique.onActorCreateOwned(this, item) draconique.onActorCreateOwned(this, item)
this.notifyGestionTeteSouffleQueue(item, draconique.manualMessage()); this.notifyGestionTeteSouffleQueue(item, draconique.manualMessage());
} }
} }
}
async onDeleteOwnedDraconique(item, options, id) { async onDeleteOwnedDraconique(item, options, id) {
if (Misc.isElectedUser()) {
let draconique = Draconique.all().find(it => it.match(item)); let draconique = Draconique.all().find(it => it.match(item));
if (draconique) { if (draconique) {
draconique.onActorDeleteOwned(this, item) draconique.onActorDeleteOwned(this, item)
} }
} }
}
async onDeleteOwnedCaseTmr(item, options, id) { async onDeleteOwnedCaseTmr(item, options, id) {
if (Misc.isElectedUser()) {
let draconique = Draconique.all().find(it => it.isCase(item)); let draconique = Draconique.all().find(it => it.isCase(item));
if (draconique) { if (draconique) {
draconique.onActorDeleteCaseTmr(this, item) draconique.onActorDeleteCaseTmr(this, item)
} }
} }
}
notifyGestionTeteSouffleQueue(item, manualMessage = true) { notifyGestionTeteSouffleQueue(item, manualMessage = true) {
ChatMessage.create({ ChatMessage.create({

View File

@ -29,7 +29,7 @@ export class ChatUtility {
static removeChatMessageContaining(part) { static removeChatMessageContaining(part) {
const removeMessageData = { const removeMessageData = {
part: part, part: part,
gmId: Misc.connectedGM() gmId: Misc.connectedGMOrUser()
}; };
if (game.user.isGM) { if (game.user.isGM) {
@ -41,7 +41,7 @@ export class ChatUtility {
} }
static removeChatMessageId(messageId) { static removeChatMessageId(messageId) {
const removeMessageData = { messageId: messageId, gmId: Misc.connectedGM() }; const removeMessageData = { messageId: messageId, gmId: Misc.connectedGMOrUser() };
if (game.user.isGM) { if (game.user.isGM) {
ChatUtility.onRemoveMessages(removeMessageData); ChatUtility.onRemoveMessages(removeMessageData);
} }

View File

@ -114,7 +114,13 @@ export class Misc {
return Misc.data(it)?.data ?? {} return Misc.data(it)?.data ?? {}
} }
static connectedGM() { static connectedGMOrUser(ownerId = undefined) {
return game.user.isGM ? game.user.id : game.users.entities.find(u => u.isGM && u.active)?.id; if (ownerId && game.user.id == ownerId){
return ownerId;
}
return (game.user.isGM ? game.user.id : game.users.entities.find(u => u.isGM && u.active)?.id) ?? game.user.id;
}
static isElectedUser() {
return game.user.id == Misc.connectedGMOrUser();
} }
} }

View File

@ -1211,7 +1211,7 @@ export class RdDCombat {
attackerId: this.attackerId, attackerId: this.attackerId,
defenderTokenId: defenderTokenId, defenderTokenId: defenderTokenId,
attackerRoll: attackerRoll, attackerRoll: attackerRoll,
gmId: Misc.connectedGM(), gmId: Misc.connectedGMOrUser(),
} }
}); });
} }