From d9e36e3a23e4dedde972c647a9cde1484a14829b Mon Sep 17 00:00:00 2001 From: WBHarry Date: Sun, 15 Mar 2026 17:17:42 +0100 Subject: [PATCH] Fixed sync start --- daggerheart.mjs | 11 ++++++ module/applications/dialogs/tagTeamDialog.mjs | 35 +++++++++++++++++-- module/config/hooksConfig.mjs | 3 +- module/systemRegistration/socket.mjs | 6 +++- .../tag-team-dialog/initialization.less | 14 +++++++- styles/less/dialog/tag-team-dialog/sheet.less | 10 ++++++ .../dialogs/tagTeamDialog/initialization.hbs | 4 +++ .../dialogs/tagTeamDialog/tagTeamRoll.hbs | 4 +-- 8 files changed, 80 insertions(+), 7 deletions(-) diff --git a/daggerheart.mjs b/daggerheart.mjs index 5960c6b1..14848b72 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -402,6 +402,17 @@ Hooks.on('chatMessage', (_, message) => { } }); +Hooks.on(CONFIG.DH.HOOKS.hooksConfig.tagTeamStart, async data => { + if (data.openForAllPlayers && data.partyId) { + const party = game.actors.get(data.partyId); + if (!party) return; + + const dialog = new game.system.api.applications.dialogs.TagTeamDialog(party); + dialog.tabGroups.application = 'tagTeamRoll'; + await dialog.render({ force: true }); + } +}); + const updateActorsRangeDependentEffects = async token => { const rangeMeasurement = game.settings.get( CONFIG.DH.id, diff --git a/module/applications/dialogs/tagTeamDialog.mjs b/module/applications/dialogs/tagTeamDialog.mjs index 43fef003..e3686060 100644 --- a/module/applications/dialogs/tagTeamDialog.mjs +++ b/module/applications/dialogs/tagTeamDialog.mjs @@ -19,6 +19,7 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio selected: false })); this.intiator = null; + this.openForAllPlayers = true; this.tabGroups.application = Object.keys(party.system.tagTeam.members).length ? 'tagTeamRoll' @@ -33,6 +34,7 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio static DEFAULT_OPTIONS = { tag: 'form', + id: 'TagTeamDialog', classes: ['daggerheart', 'views', 'dh-style', 'dialog', 'tag-team-dialog'], position: { width: 550, height: 'auto' }, actions: { @@ -77,6 +79,7 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio async _prepareContext(_options) { const context = await super._prepareContext(_options); + context.isEditable = this.getIsEditable(); return context; } @@ -94,6 +97,7 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio partContext.initiator = this.initiator; partContext.initiatorOptions = selectedMembers.map(x => ({ value: x.id, label: x.name })); partContext.initiatorDisabled = !selectedMembers.length; + partContext.openForAllPlayers = this.openForAllPlayers; break; case 'tagTeamRoll': @@ -139,6 +143,7 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio partContext.members[actorId] = { ...data, + isEditable: actor.testUserPermission(game.user, CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER), key: actorId, readyToRoll: Boolean(data.rollChoice), hasRolled: Boolean(data.rollData), @@ -164,8 +169,10 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio } static async updateData(_event, _, formData) { - const { initiator, ...partyData } = foundry.utils.expandObject(formData.object); + const { initiator, openForAllPlayers, ...partyData } = foundry.utils.expandObject(formData.object); this.initiator = initiator; + this.openForAllPlayers = openForAllPlayers !== undefined ? openForAllPlayers : this.openForAllPlayers; + this.updatePartyData(partyData); } @@ -181,10 +188,20 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio } } + getIsEditable() { + return this.party.system.partyMembers.some(actor => { + const selected = Boolean(this.party.system.tagTeam.members[actor.id]); + return selected && actor.testUserPermission(game.user, CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER); + }); + } + tagTeamRefresh = ({ refreshType, action }) => { if (refreshType !== RefreshType.TagTeamRoll) return; switch (action) { + case 'startTagTeamRoll': + this.tabGroups.application = 'tagTeamRoll'; + break; case 'refresh': this.render(); break; @@ -227,9 +244,23 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio }, {}) }) }); - /* Update Party data and refresh all views */ + this.tabGroups.application = 'tagTeamRoll'; + // if (this.openForAllplayers) { + // game.socket.emit(`system.${CONFIG.DH.id}`, { + // action: socketEvent.Refresh, + // data: { refreshType: RefreshType.TagTeamRoll, action: 'startTagTeamRoll' } + // }); + // } + + const hookData = { openForAllPlayers: this.openForAllPlayers, partyId: this.party.id }; + Hooks.callAll(CONFIG.DH.HOOKS.hooksConfig.tagTeamStart, hookData); + game.socket.emit(`system.${CONFIG.DH.id}`, { + action: socketEvent.TagTeamStart, + data: hookData + }); + this.render(); } //#endregion diff --git a/module/config/hooksConfig.mjs b/module/config/hooksConfig.mjs index 61ba594c..8d04be6d 100644 --- a/module/config/hooksConfig.mjs +++ b/module/config/hooksConfig.mjs @@ -1,4 +1,5 @@ export const hooksConfig = { effectDisplayToggle: 'DHEffectDisplayToggle', - lockedTooltipDismissed: 'DHLockedTooltipDismissed' + lockedTooltipDismissed: 'DHLockedTooltipDismissed', + tagTeamStart: 'DHTagTeamRollStart' }; diff --git a/module/systemRegistration/socket.mjs b/module/systemRegistration/socket.mjs index 173ef02b..fb152959 100644 --- a/module/systemRegistration/socket.mjs +++ b/module/systemRegistration/socket.mjs @@ -15,6 +15,9 @@ export function handleSocketEvent({ action = null, data = {} } = {}) { case socketEvent.DowntimeTrigger: Party.downtimeMoveQuery(data); break; + case socketEvent.TagTeamStart: + Hooks.callAll(CONFIG.DH.HOOKS.hooksConfig.tagTeamStart, data); + break; } } @@ -22,7 +25,8 @@ export const socketEvent = { GMUpdate: 'DhGMUpdate', Refresh: 'DhRefresh', DhpFearUpdate: 'DhFearUpdate', - DowntimeTrigger: 'DowntimeTrigger' + DowntimeTrigger: 'DowntimeTrigger', + TagTeamStart: 'DhTagTeamStart' }; export const GMUpdateEvent = { diff --git a/styles/less/dialog/tag-team-dialog/initialization.less b/styles/less/dialog/tag-team-dialog/initialization.less index 1b0c9185..ef120a00 100644 --- a/styles/less/dialog/tag-team-dialog/initialization.less +++ b/styles/less/dialog/tag-team-dialog/initialization.less @@ -38,10 +38,22 @@ footer { margin-top: 8px; display: flex; + gap: 8px; - > * { + button { flex: 1; } + + .finish-tools { + flex: none; + display: flex; + align-items: center; + gap: 4px; + + &.inactive { + opacity: 0.4; + } + } } } } diff --git a/styles/less/dialog/tag-team-dialog/sheet.less b/styles/less/dialog/tag-team-dialog/sheet.less index c6a79285..635a7425 100644 --- a/styles/less/dialog/tag-team-dialog/sheet.less +++ b/styles/less/dialog/tag-team-dialog/sheet.less @@ -4,6 +4,11 @@ flex-direction: column; gap: 16px; + &.inactive { + opacity: 0.4; + pointer-events: none; + } + .team-container { display: flex; gap: 16px; @@ -15,6 +20,11 @@ gap: 8px; flex: 1; + &.inactive { + opacity: 0.4; + pointer-events: none; + } + .data-container { display: flex; flex-direction: column; diff --git a/templates/dialogs/tagTeamDialog/initialization.hbs b/templates/dialogs/tagTeamDialog/initialization.hbs index d89397a9..63ef2d73 100644 --- a/templates/dialogs/tagTeamDialog/initialization.hbs +++ b/templates/dialogs/tagTeamDialog/initialization.hbs @@ -26,5 +26,9 @@ \ No newline at end of file diff --git a/templates/dialogs/tagTeamDialog/tagTeamRoll.hbs b/templates/dialogs/tagTeamDialog/tagTeamRoll.hbs index f0d14aa8..a90c45e3 100644 --- a/templates/dialogs/tagTeamDialog/tagTeamRoll.hbs +++ b/templates/dialogs/tagTeamDialog/tagTeamRoll.hbs @@ -1,8 +1,8 @@
-
+
{{#each members as |member key|}} -
+