From 0c0fb1a3a8df2fd6479b09b730861342b04d4ea4 Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Sat, 1 Jun 2024 16:37:36 -0500 Subject: [PATCH] shape change done --- src/module/helpers.js | 20 ++++++++++++--- src/module/powers/powers.js | 4 +-- src/module/powers/shapeChange.js | 44 ++++++++++++++++++++++++++------ src/module/swade-mb-helpers.js | 11 +++++++- 4 files changed, 65 insertions(+), 14 deletions(-) diff --git a/src/module/helpers.js b/src/module/helpers.js index d1d9a34..da115a0 100644 --- a/src/module/helpers.js +++ b/src/module/helpers.js @@ -147,18 +147,32 @@ export async function requestTokenRoll(sceneId, tokenId, rollType, rollDesc, opt return { sceneId, tokenId, result }; } -export async function addActiveEffectsToToken(sceneId, tokenId, effectDocuments) { +function _getSceneToken(sceneId, tokenId) { const scene = game.scenes.get(sceneId); const token = scene.tokens.get(tokenId); + return token; +} + +export async function addActiveEffectsToToken(sceneId, tokenId, effectDocuments) { + const token = _getSceneToken(sceneId, tokenId); await token.actor.createEmbeddedDocuments('ActiveEffect', effectDocuments); } export async function deleteActiveEffectsFromToken(sceneId, tokenId, effectIds) { - const scene = game.scenes.get(sceneId); - const token = scene.tokens.get(tokenId); + const token = _getSceneToken(sceneId, tokenId); await token.actor.deleteEmbeddedDocuments('ActiveEffect', effectIds); } +export async function updateOwnedToken(sceneId, tokenId, updates, options = {}) { + const token = _getSceneToken(sceneId, tokenId); + return token.update(updates, options); +} + +export async function deleteToken(sceneId, tokenId) { + const token = _getSceneToken(sceneId, tokenId); + return token.delete(); +} + export function SwadeVAEbuttons(effect, buttons) { if (['Bound', 'Entangled'].includes(effect?.name)) { buttons.push({ diff --git a/src/module/powers/powers.js b/src/module/powers/powers.js index 4e150d0..f4e64b2 100644 --- a/src/module/powers/powers.js +++ b/src/module/powers/powers.js @@ -1,5 +1,5 @@ import { moduleName, moduleHelpers } from '../globals.js'; -import { firstOwner, deleteActiveEffectsFromToken } from '../helpers.js'; +import { firstOwner, deleteActiveEffectsFromToken, deleteToken } from '../helpers.js'; import { ArcaneProtectionEffect } from './arcaneProtection.js'; import { BanishEffect } from './banish.js'; import { BarrierEffect } from './barrier.js'; @@ -190,7 +190,7 @@ export async function powerEffectManagementHook(effect, data, userId) { const isSpawned = effect.getFlag(moduleName, 'spawnedTempToken') ?? false; if (isSpawned) { const token = effect.parent.token; - await token.delete(); + await moduleHelpers.socket.executeAsGM(deleteToken, token.parent.id, token.id); } const targetIds = effect.getFlag(moduleName, 'targetIds') || []; for (const targetId of targetIds) { diff --git a/src/module/powers/shapeChange.js b/src/module/powers/shapeChange.js index 79257ea..b76ed01 100644 --- a/src/module/powers/shapeChange.js +++ b/src/module/powers/shapeChange.js @@ -1,4 +1,5 @@ -import { log, moduleName } from '../globals.js'; +import { log, moduleHelpers, moduleName } from '../globals.js'; +import { firstOwner, updateOwnedToken } from '../helpers.js'; import { ActorFolderEffect } from './basePowers.js'; export class ShapeChangeEffect extends ActorFolderEffect { @@ -99,7 +100,11 @@ export class ShapeChangeEffect extends ActorFolderEffect { } this.data.tokenUpdates = { flags: { - [moduleName]: { 'shapeChange.srcTokenUuid': this.target.document.uuid }, + [moduleName]: { + 'shapeChange.srcTokenUuid': this.target.document.uuid, + 'shapeChange.srcTokenId': this.target.document.id, + 'shapeChange.srcTokenSceneId': this.target.scene.id, + }, }, actorLink: false, name: `${this.target.name} (${this.targetActor.prototypeToken.name} form)`, @@ -136,7 +141,6 @@ export class ShapeChangeEffect extends ActorFolderEffect { y: target.y - ((protoHeight - target.height) * size) / 2, elevation: target.elevation, hidden: target.hidden, - alpha: target.alpha, }); return this.source.scene.createEmbeddedDocuments('Token', [this.targetTokenDoc]); } @@ -182,10 +186,15 @@ export class ShapeChangeEffect extends ActorFolderEffect { } async sideEffects() { - // await this.target.document.update({ - // hidden: true, - // alpha: 0.1, - // }); + const owner = firstOwner(this.target); + moduleHelpers.socket.executeAsUser( + updateOwnedToken, + owner.id, + this.target.document.parent.id, + this.target.document.id, + { hidden: true, x: 0, y: 0 }, + { animate: false }, + ); } get description() { @@ -196,6 +205,25 @@ export class ShapeChangeEffect extends ActorFolderEffect { } } -export function shapeChangeTokenDeleteHandler(token, options, userId) { +export async function shapeChangeTokenDeleteHandler(token, options, userId) { log('TOKEN DELETED |', token, options, userId); + const sourceInfo = token.getFlag(moduleName, 'shapeChange'); + if (!sourceInfo?.srcTokenId) { + return; + } + if (sourceInfo.srcTokenSceneId !== token.parent.id) { + return; + } + const srcToken = await fromUuid(sourceInfo.srcTokenUuid); + const size = token.parent.dimensions.size; + const owner = firstOwner(srcToken); + const updates = { + x: token.x - ((srcToken.width - token.width) * size) / 2, + y: token.y - ((srcToken.height - token.height) * size) / 2, + elevation: token.elevation, + hidden: token.hidden, + }; + moduleHelpers.socket.executeAsUser(updateOwnedToken, owner.id, srcToken.parent.id, srcToken.id, updates, { + animate: false, + }); } diff --git a/src/module/swade-mb-helpers.js b/src/module/swade-mb-helpers.js index 7ff1740..e23128b 100644 --- a/src/module/swade-mb-helpers.js +++ b/src/module/swade-mb-helpers.js @@ -4,7 +4,14 @@ import { registerSettings } from './settings.js'; import { preloadTemplates } from './preloadTemplates.js'; import { api } from './api.js'; import { initVisionModes } from './visionModes.js'; -import { requestTokenRoll, addActiveEffectsToToken, deleteActiveEffectsFromToken, SwadeVAEbuttons } from './helpers.js'; +import { + addActiveEffectsToToken, + deleteActiveEffectsFromToken, + deleteToken, + requestTokenRoll, + SwadeVAEbuttons, + updateOwnedToken, +} from './helpers.js'; import { preDamageRollModifiers, preTraitRollModifiers } from './rollHelpers.js'; import { log, moduleHelpers } from './globals.js'; import { powerEffectManagementHook, visualActiveEffectPowerButtons } from './powers/powers.js'; @@ -52,6 +59,8 @@ Hooks.on('visual-active-effects.createEffectButtons', SwadeVAEbuttons); Hooks.once('socketlib.ready', () => { const _socket = socketlib.registerModule('swade-mb-helpers'); _socket.register('requestTokenRoll', requestTokenRoll); + _socket.register('updateOwnedToken', updateOwnedToken); + _socket.register('deleteToken', deleteToken); _socket.register('addActiveEffectsToToken', addActiveEffectsToToken); _socket.register('deleteActiveEffectsFromToken', deleteActiveEffectsFromToken); moduleHelpers._socket = _socket;