From 6d59bf753feefd9ea846fb0e3bcad0f19d62043b Mon Sep 17 00:00:00 2001 From: Renato Innocenti Date: Mon, 2 Nov 2020 16:54:40 -0300 Subject: [PATCH] Find Trap 1.0 FindTrap ok! --- lang/en.json | 68 ++++++----- lang/pt-BR.json | 48 ++++++-- main.js | 23 ++-- scripts/openchest.js | 264 +++++++++++++++++++++++++------------------ scripts/settings.js | 8 ++ 5 files changed, 255 insertions(+), 156 deletions(-) diff --git a/lang/en.json b/lang/en.json index d8c9f70..935973e 100644 --- a/lang/en.json +++ b/lang/en.json @@ -1,43 +1,57 @@ { "OpenLock.Settings": { - "ThievesTool": "Thieves’ Tools", - "ThievesToolTitle": "Thieves’ Tools: ", - "ThievesToolHint": "Nome do item que representa a ferramenta de ladino", + "ThievesTool": "Thieves’ Tools", + "ThievesToolTitle": "Thieves’ Tools: ", + "ThievesToolHint": "Name of the item representing the Thieves’ Tools", "LockFeat": "Lock", "LockFeatTitle": "Lock Feat: ", - "LockFeatHint": "Nome do Recurso que será considerado a tranca simples", + "LockFeatHint": "Name of the feat that will be considered the simple lock", "TrapFeat": "Trap", "TrapFeatTitle": "Lock Trap Feat: ", - "TrapFeatHint": "Nome do Recurso que será considerado a tranca com armadilha", - "defaultStrenght": "ND Força padrão", - "defaultStrenghtHint": "Caso não haja um valor definido na tranca, este valor será usado como Nivel de Desafio (padrão: 12)", - "defaultDexterity": "ND Destreza padrão", - "defaultDexterityHint": "Caso não haja um valor definido na tranca, este valor será usado como Nivel de Desafio (padrão: 10)", - "defaultPerception": "ND Percepção Passiva padrão", - "defaultPerceptionHint": "Caso não haja um valor definido na tranca, este valor será usado como Nivel de Desafio (padrão: 10)", - "removeLock": "Remover tranca", - "removeLockHint": "Remover a tranca após abrir?" + "TrapFeatHint": "Name of the feat that will be considered the trap lock", + "defaultStrenght": "Default CD Stranght", + "defaultStrenghtHint": "If there is no value set in the lock, this value is used as Challenge Level (default: 12)", + "defaultDexterity": "Default CD Dexterity", + "defaultDexterityHint": "If there is no value set in the lock, this value is used as Challenge Level (default: 10)", + "defaultPerception": "Default CD Perception", + "defaultPerceptionHint": "If there is no value set in the lock, this value is used as Challenge Level (default: 10)", + "removeLock": "Remove lock", + "removeLockHint": "Remove the lock after opening?" }, "OpenLock.Btn": { - "Strangth": "Força", - "ThievesTools": "Ferramenta de Ladino", - "DontTouch": "Não Tocar", - "OpenChest": "Abrir", - "DisarmTrap": "Desarmar Armadilha" + "Strangth": "Strangth", + "ThievesTools": "Thieves’ Tools", + "DontTouch": "Don't touch this", + "OpenChest": "Open", + "DisarmTrap": "Unset Trap" }, "OpenLock.MsgDialog": { - "TrapAlert": "Atenção!! Armadilha detectada!", - "HaveKey": "Você tem a chave apara este baú", - "HasLock": "Este baú está trancado", - "Title": "Abrir Baú", - "TitleCheck": "Verificar Armadilhas", - "Content": "O Baú esta trancado, como você deseja abri-lo?", - "ContentCheck": "Você encontrou um Báu o que deseja fazer?" + "TrapAlert": "Warning!! Trap detected!", + "HaveKey": "You have the key to this chest", + "HasLock": "This chest is locked", + "Title": "Open Chest", + "TitleCheck": "Check Traps", + "Content": "The chest is locked, how do you want to open it?", + "ContentCheck": "Did you find a chest what do you want to do?" }, "OpenLock.MsgChat": { - "Used": "Usou: ", - "Loot": "Abriu: " + "Used": "Used: ", + "Loot": "Opened: ", + "SearchTitle": "Find Traps", + "TitleDisarm": "Disarm Traps", + "TrapDisarm": "Disarmed Trap: ", + "OpenTitle": "Open Chest", + "NotLock": "This Item does not have a locking device", + "hasLock": "Locked: ", + "Yes": "Yes", + "No": "No", + "Dontfound": "Not found", + "haveKey": "Have the Key: ", + "haveTrap": "Traps: ", + "StranghtOpen": "Broke the lock:", + "TrapOnOpen": "Enabled Trap!", + "ToolOpen": "Open the lock: " } } \ No newline at end of file diff --git a/lang/pt-BR.json b/lang/pt-BR.json index 35db896..bf2a4d4 100644 --- a/lang/pt-BR.json +++ b/lang/pt-BR.json @@ -1,29 +1,57 @@ { "OpenLock.Settings": { - "ThievesTool": "Thieves’ Tools", - "ThievesToolTitle": "Thieves’ Tools: ", + "ThievesTool": "Ferramenta de Ladrão", + "ThievesToolTitle": "Ferramenta de Ladrão: ", "ThievesToolHint": "Nome do item que representa a ferramenta de ladino", - "LockFeat": "Lock", - "LockFeatTitle": "Lock Feat: ", + "LockFeat": "Cadeado", + "LockFeatTitle": "Habilidade de Cadeado: ", "LockFeatHint": "Nome do Recurso que será considerado a tranca simples", - "TrapFeat": "Trap", - "TrapFeatTitle": "Lock Trap Feat: ", - "TrapFeatHint": "Nome do Recurso que será considerado a tranca com armadilha" + "TrapFeat": "Armadilha", + "TrapFeatTitle": "Habilidade de Cadeado com Armadilha: ", + "TrapFeatHint": "Nome do Recurso que será considerado a tranca com armadilha", + "defaultStrenght": "ND Força padrão", + "defaultStrenghtHint": "Caso não haja um valor definido na tranca, este valor será usado como Nivel de Desafio (padrão: 12)", + "defaultDexterity": "ND Destreza padrão", + "defaultDexterityHint": "Caso não haja um valor definido na tranca, este valor será usado como Nivel de Desafio (padrão: 10)", + "defaultPerception": "ND Percepção Padrão", + "defaultPerceptionHint": "Caso não haja um valor definido na tranca, este valor será usado como Nivel de Desafio (padrão: 10)", + "removeLock": "Remover tranca", + "removeLockHint": "Remover a tranca após abrir?" }, "OpenLock.Btn": { "Strangth": "Força", "ThievesTools": "Ferramenta de Ladino", - "DontTouch": "Não Tocar" + "DontTouch": "Não Tocar", + "OpenChest": "Abrir", + "DisarmTrap": "Desarmar Armadilha" }, "OpenLock.MsgDialog": { "TrapAlert": "Atenção!! Armadilha detectada!", + "HaveKey": "Você tem a chave apara este baú", + "HasLock": "Este baú está trancado", "Title": "Abrir Baú", - "Content": "O Baú esta trancado, como você deseja abri-lo?" + "TitleCheck": "Verificar Armadilhas", + "Content": "O Baú esta trancado, como você deseja abri-lo?", + "ContentCheck": "Você encontrou um Báu o que deseja fazer?" }, "OpenLock.MsgChat": { "Used": "Usou: ", - "Loot": "Pilhado: " + "Loot": "Abriu: ", + "SearchTitle": "Procurar Armadilhas", + "TitleDisarm": "Desarmar Armadilhas", + "TrapDisarm": "Armadilha Desarmada: ", + "OpenTitle": "Abrir Objeto", + "NotLock": "Este Item não possui um despositvo de trava", + "hasLock": "Trancado: ", + "Yes": "Sim", + "No": "Não", + "Dontfound": "Não Encontrei", + "haveKey": "Possuo a chave: ", + "haveTrap": "Armadilhas: ", + "StranghtOpen": "Quebrou a trava:", + "TrapOnOpen": "Ativou Armadilha!", + "ToolOpen": "Abriu a trava: " } } \ No newline at end of file diff --git a/main.js b/main.js index f31906e..c3286d6 100644 --- a/main.js +++ b/main.js @@ -3,6 +3,7 @@ import { Door } from './scripts/opendoor.js'; Hooks.once("init", async () => { game.socket.on(`module.innocenti-openlock`, async (data) => { + console.log(data); if (game.user.isGM) { let actor = game.actors.entities.find(a => a.id === data.actorTargetid); //let item = actor.items.find(a => a.id === data.item_id); @@ -14,21 +15,25 @@ Hooks.once("init", async () => { let newpermissions = duplicate(actor.data.permission); newpermissions[`${data.userid}`] = 2; let permissions = new PermissionControl(actor); - await permissions._updateObject(event, newpermissions); + await permissions._updateObject(event, newpermissions); } - if (data.disarm === true) { + if (data.trap === true && data.disarm === false) { + data.disarm = true; + await new MidiQOL.TrapWorkflow(actor, tokenitem, [token], targetToken.center); + } + if (data.disarm === true) { data.trap = false; console.log(tokenitem); - let updates = targetToken.actor.items.map(itemup => { - if (itemup.name === tokenitem.name) - return { _id: itemup.id, data: { actionType: "" } } - else - return { _id: itemup.id } - }); + let updates = targetToken.actor.items.map(itemup => { + if (itemup.name === tokenitem.name) + return { _id: itemup.id, data: { actionType: "" } } + else + return { _id: itemup.id } + }); targetToken.actor.updateEmbeddedEntity("OwnedItem", updates); await console.log("DESARMOU O LOCK"); } - if (data.trap === true && data.disarm === false) await new MidiQOL.TrapWorkflow(actor, tokenitem, [token], targetToken.center); + if (data.remove === true || game.settings.get("innocenti-openlock", "removeLock") === true) { await tokenitem.delete(); await console.log("REMOVER O LOCK", tokenitem); diff --git a/scripts/openchest.js b/scripts/openchest.js index 80b90a1..b6eb3df 100644 --- a/scripts/openchest.js +++ b/scripts/openchest.js @@ -1,87 +1,92 @@ +//TODO: Pegar os ND da folha de item +//TODO: Verificar a Distancia dos tokens export let OpenLock = async function () { - if (canvas.tokens.controlled.length === 0) - return ui.notifications.error("Select a token"); + if (CheckTokentarget() === false) return const actor = canvas.tokens.controlled[0].actor; - if (!game.user.targets.values().next().value) { - ui.notifications.warn("No token is targeted"); - return; - } for (let targetToken of game.user.targets) { - let flag = targetToken.actor.getFlag('lootsheetnpc5e', 'lootsheettype'); - if (flag === 'Loot') { - let openChest = false; - let hasTrap = false; - let lootkey = false; - let entityTarget = await game.actors.entities.find(a => a.id === targetToken.actor.id); - let perm = entityTarget.data.permission; - // Se já tenho permissão não preciso testar nada. - if (perm[`${game.user.id}`]) return setTimeout(function () { targetToken._onClickLeft2() }, 500); - + if (targetToken.actor.getFlag('lootsheetnpc5e', 'lootsheettype') === 'Loot') { + if (CheckPermission(targetToken) === true) return setTimeout(function () { targetToken._onClickLeft2() }, 500); // Checagem se o loot possui uma tranca a ser aberta. - let lock = targetToken.actor.items.find(a => a.name === (game.settings.get("innocenti-openlock", "nameLockFeat") || game.settings.get("innocenti-openlock", "nameTrapLockFeat")) && a.type === `feat`); - if (!lock) { - let options = { open: true, trap: hasTrap, disarm: false, remove: false } - await OpenChest(targetToken, lock, lootkey, options); + let hasLock = HasLock(targetToken.actor); + if (hasLock === false) { + let options = { open: true, trap: false, disarm: false, remove: false }; + let msg = { + SearchTitile: game.i18n.localize('OpenLock.MsgChat.OpenTitle'), + content: `

${game.i18n.localize('OpenLock.MsgChat.NotLock')}

` + } + await OpenChest(targetToken, hasLock, false, options, msg); return; } //Tem uma trance então verificar se possui a chave ou se precisa de uma. // Tem um a tranca, não possuo uma chave, então verificar se há uma armadilha. - - if (lock.data.data.requirements) { - lootkey = actor.items.find(item => item.name === `${lock.data.data.requirements}`); - if (lootkey) { + let hasKey = false; + if (hasLock.data.data.requirements) { + hasKey = HasKey(hasLock, actor); + if (hasKey) { // Se precisa de uma chave e eu tenho a chave não preciso checar mais nada. - let options = { open: true, trap: hasTrap, disarm: false, remove: false } - await OpenChest(targetToken, lock, lootkey, options); + let options = { open: true, trap: false, disarm: false, remove: false } + let msg = { + SearchTitile: game.i18n.localize('OpenLock.MsgChat.OpenTitle'), + content: `

${game.i18n.localize('OpenLock.MsgChat.Used')} ${hasKey.name}

` + } + await OpenChest(targetToken, hasLock, hasKey, options, msg); return; } } + let hasOpen = false; let trapDisarm = false; let trapRemove = false; // Se tem tranca então esta fechado para quem não tem permissão ou a chave // Verificar se há alguma armadilha configurada - if (lock.data.data.actionType === '') { - let options = { open: true, trap: hasTrap, disarm: false, remove: false } - await OpenChest(targetToken, lock, lootkey, options); - return; - } - // Daqui em diante Supões-se que a tranca esta com um efeito de armadilha - hasTrap = true; - const activation = PrepareActivations(lock.data.data.activation['condition']); + let haveTrap = (hasLock.data.data.actionType !== '') ? true : false; + // Daqui em diante Supões-se esta fechado trancado e pode haver ou não uma armadilha + const activation = PrepareActivations(hasLock.data.data.activation['condition']); // Verifica se possui um tool para arrombar a tranca - let tool = actor.items.find(a => a.name === `Thieves’ Tools` || a.name === game.i18n.localize('OpenLock.Msg.ThievesTools') || a.name === game.settings.get("innocenti-openlock", "nameThievesTool")); + let tool = HasTool(actor); console.log("tenho tool?", tool); // Configura o dialogo para arrombar let btnone = { icon: '', label: game.i18n.localize('OpenLock.Btn.Strangth'), callback: async () => { - if (!activation['str']) { + if (!activation['str']) { activation['str'] = game.settings.get("innocenti-openlock", "defaultStrenght"); } await actor.rollAbilityTest(`str`).then((result) => { if (result.total >= activation['str']) { - let options = { open: true, trap: hasTrap, disarm: false, remove: true } - OpenChest(targetToken, lock, lootkey, options); - } else { - let options = { open: false, trap: hasTrap, disarm: false, remove: false } - OpenChest(targetToken, lock, lootkey, options); + hasOpen = true; trapDisarm = true; trapRemove = true; + } + let options = { open: hasOpen, trap: haveTrap, disarm: trapDisarm, remove: trapRemove } + let msg = { + SearchTitile: game.i18n.localize('OpenLock.MsgChat.OpenTitle'), + content: `

${game.i18n.localize('OpenLock.MsgChat.StranghtOpen')}${(hasOpen) ? game.i18n.localize('OpenLock.MsgChat.Yes') : game.i18n.localize('OpenLock.MsgChat.No')}

` + } + if (haveTrap == true && trapDisarm == false) { + msg['content'] = msg['content'] + `

${game.i18n.localize('OpenLock.MsgChat.TrapOnOpen')}

`; } + OpenChest(targetToken, hasLock, hasKey, options, msg); }); - console.log("bau foi aberto?", openChest); + console.log("bau foi aberto?", hasOpen); } }; let btntwo = { icon: '', label: game.i18n.localize('OpenLock.Btn.ThievesTools'), callback: async () => { - if (!activation['dex']) { + if (!activation['dex']) { activation['dex'] = game.settings.get("innocenti-openlock", "defaultDexterity"); } await tool.rollToolCheck().then((result) => { if (result.total >= activation['dex']) { - openChest = true; + hasOpen = true; trapDisarm = true; } }); - let options = { open: openChest, trap: hasTrap, disarm: false, remove: false } - await OpenChest(targetToken, lock, lootkey, options); + let options = { open: hasOpen, trap: haveTrap, disarm: trapDisarm, remove: trapRemove } + let msg = { + SearchTitile: game.i18n.localize('OpenLock.MsgChat.OpenTitle'), + content: `

${game.i18n.localize('OpenLock.MsgChat.ToolOpen')}${(hasOpen) ? game.i18n.localize('OpenLock.MsgChat.Yes') : game.i18n.localize('OpenLock.MsgChat.No')}

` + } + if(haveTrap == true && trapDisarm == false) { + msg['content'] = msg['content'] + `

${game.i18n.localize('OpenLock.MsgChat.TrapOnOpen')}

`; + } + await OpenChest(targetToken, hasLock, hasKey, options, msg); } }; let buttons = (tool) ? { buttons: { one: btnone, two: btntwo }, default: 'two' } : { buttons: { one: btnone }, default: 'one' }; @@ -90,65 +95,66 @@ export let OpenLock = async function () { title: game.i18n.localize('OpenLock.MsgDialog.Title'), content: `

${game.i18n.localize('OpenLock.MsgDialog.Content')}

`, close: async () => { - //await OpenChest(targactor, targetToken, lock, lootkey, openChest = false, hasTrap); - //return; + let options = { open: hasOpen, trap: haveTrap, disarm: trapDisarm, remove: trapRemove } + let msg = { + SearchTitile: game.i18n.localize('OpenLock.MsgChat.OpenTitle'), + content: `

${game.i18n.localize('OpenLock.MsgChat.TrapOnOpen')}

` + } + await OpenChest(targetToken, hasLock, hasKey, options, msg); } }, buttons); let d = new Dialog(dialogBase); await d.render(true); } else { - return ui.notifications.info(`${targetToken.nam} não é um Loot Valido`); + return ui.notifications.info(`${targetToken.nam} não é um Loot Valido`); } } } export let CheckForTraps = async function () { - if (canvas.tokens.controlled.length === 0) - return ui.notifications.error("Select a token"); + if (CheckTokentarget() === false) return const actor = canvas.tokens.controlled[0].actor; - if (!game.user.targets.values().next().value) { - ui.notifications.warn("No token is targeted"); - return; - } for (let targetToken of game.user.targets) { - let flag = targetToken.actor.getFlag('lootsheetnpc5e', 'lootsheettype'); - if (flag === 'Loot') { - let foundTrap = false; - let entityTarget = await game.actors.entities.find(a => a.id === targetToken.actor.id); - let perm = entityTarget.data.permission; - // Se já tenho permissão não preciso testar nada. - if (perm[`${game.user.id}`]) return setTimeout(function () { targetToken._onClickLeft2() }, 500); - console.log("Não tenho permissão"); + if (targetToken.actor.getFlag('lootsheetnpc5e', 'lootsheettype') === 'Loot') { + if (CheckPermission(targetToken) === true) return setTimeout(function () { targetToken._onClickLeft2() }, 500); // Checagem se o loot possui uma tranca a ser aberta. - let hasLock = targetToken.actor.items.find(a => a.name === (game.settings.get("innocenti-openlock", "nameLockFeat") || game.settings.get("innocenti-openlock", "nameTrapLockFeat")) && a.type === `feat`); - if (!hasLock) { - let options = { open: true, trap: false, disarm: false, remove: false } - await OpenChest(targetToken, hasLock, false, options); - return; + let hasLock = HasLock(targetToken.actor); + if (hasLock === false) { + let options = { open: true, trap: false, disarm: false, remove: false }; + let msg = { + SearchTitile: game.i18n.localize('OpenLock.MsgChat.SearchTitle'), + content: `

${game.i18n.localize('OpenLock.MsgChat.NotLock')}

` + } + await OpenChest(targetToken, hasLock, false, options, msg); + return; } - console.log("tenho um lock", hasLock); - let haveKey = (hasLock.data.data.requirements) ? actor.items.find(item => item.name === `${hasLock.data.data.requirements}`) : hasLock.data.data.requirements; + let hasKey = HasKey(hasLock, actor); + let foundTrap = false; + let foundKey = false; let haveTrap = (hasLock.data.data.actionType !== '') ? true : false; - + let tool = HasTool(actor); const activation = PrepareActivations(hasLock.data.data.activation['condition']); - if (!activation['prc']) { + ///PASSIVE PERCEPTION FOR FIND TRAP AND LOCKED + if (!activation['prc']) { activation['prc'] = game.settings.get("innocenti-openlock", "defaultPerception"); } - - // Testar a percepção passiva/ativa. if (actor.data.data.skills['prc'].passive >= activation['prc'] && hasLock.data.actionType !== '') { - foundTrap = (haveTrap) ? true : false; + foundTrap = (haveTrap) ? true : false; + foundKey = (hasKey) ? true : false; } else { await actor.rollSkill(`prc`).then((result) => { if (result.total >= activation['prc']) { foundTrap = (haveTrap) ? true : false; + foundKey = (hasKey) ? true : false; + } else { + foundTrap = false; + foundKey = false; } - }); + }); } - console.log("Encontrei uma armadilha", foundTrap); - console.log("Tem Alguma armadilha?", haveTrap); - let tool = actor.items.find(a => a.name === `Thieves’ Tools` || a.name === game.i18n.localize('OpenLock.Msg.ThievesTools') || a.name === game.settings.get("innocenti-openlock", "nameThievesTool")); + await CheckForTrapsChat(foundTrap, foundKey); + let btnone = { icon: '', label: game.i18n.localize('OpenLock.Btn.OpenChest'), @@ -158,25 +164,22 @@ export let CheckForTraps = async function () { icon: '', label: game.i18n.localize('OpenLock.Btn.DisarmTrap'), callback: async () => { - if (!activation['disarm']) { + if (!activation['disarm']) { activation['disarm'] = game.settings.get("innocenti-openlock", "defaultDexterity"); } await tool.rollToolCheck().then((result) => { + let disarm = false; if (result.total >= activation['disarm']) { - console.log("Conseguiu desarmar", activation['disarm']); - let options = { open: false, trap: false, disarm: true, remove: false } - OpenChest(targetToken, hasLock, haveKey, options); - } else { - console.log("Não Desaramou", activation['disarm']); - let options = { open: false, trap: true, disarm: false, remove: false } - OpenChest(targetToken, hasLock, haveKey, options, true); + disarm = true; } + let options = { open: false, trap: haveTrap, disarm: disarm, remove: false }; + let msg = { SearchTitile: game.i18n.localize('OpenLock.MsgChat.TitleDisarm'), content: `

${game.i18n.localize('OpenLock.MsgChat.TrapDisarm')}${(disarm) ? game.i18n.localize('OpenLock.MsgChat.Yes') : game.i18n.localize('OpenLock.MsgChat.No')}

` } + OpenChest(targetToken, hasLock, hasKey, options, msg); }); } }; - - let buttons = (tool && foundTrap === true && hasTrap === true) ? { buttons: { one: btnone, two: btntwo }, default: 'two' } : { buttons: { one: btnone }, default: 'one' }; + let buttons = (tool && foundTrap === true && haveTrap === true) ? { buttons: { one: btnone, two: btntwo }, default: 'two' } : { buttons: { one: btnone }, default: 'one' }; let trapAlert = (foundTrap === true) ? `

${game.i18n.localize('OpenLock.MsgDialog.TrapAlert')}

` : ''; let dialogBase = Object.assign({ title: game.i18n.localize('OpenLock.MsgDialog.TitleCheck'), @@ -187,49 +190,90 @@ export let CheckForTraps = async function () { let d = new Dialog(dialogBase); await d.render(true); } else { - return ui.notifications.info(`${targetToken.nam} não é um Loot Valido`); + return ui.notifications.info(`${targetToken.nam} não é um Loot Valido`); } } } +async function CheckForTrapsChat(foundTrap, foundKey) { + let content = `

${game.i18n.localize('OpenLock.MsgChat.hasLock')}${game.i18n.localize('OpenLock.MsgChat.Yes')}

`; + content = content + `

${game.i18n.localize('OpenLock.MsgChat.haveKey')}${(foundKey) ? game.i18n.localize('OpenLock.MsgChat.Yes') : game.i18n.localize('OpenLock.MsgChat.Dontfound')}

`; + content = content + `

${game.i18n.localize('OpenLock.MsgChat.haveTrap')}${(foundTrap) ? game.i18n.localize('OpenLock.MsgChat.Yes') : game.i18n.localize('OpenLock.MsgChat.Dontfound')}

`; + + await ChatMessage.create({ + content: content, + type: CONST.CHAT_MESSAGE_TYPES.EMOTE, + speaker: ChatMessage.getSpeaker(), + flavor: `

${game.i18n.localize('OpenLock.MsgChat.SearchTitle')}

` + }); +} +let CheckTokentarget = () => { + if (canvas.tokens.controlled.length === 0) { + ui.notifications.error("Select a token"); + return false; + } + if (!game.user.targets.values().next().value) { + ui.notifications.warn("No token is targeted"); + return false; + } + return true; +} +let HasTool = (actor) => { + return actor.items.find(a => a.name === `Thieves’ Tools` || a.name === game.i18n.localize('OpenLock.Msg.ThievesTools') || a.name === game.settings.get("innocenti-openlock", "nameThievesTool")); +} +let HasKey = (lock, actor) => { + return (lock.data.data.requirements) ? actor.items.find(item => item.name === `${lock.data.data.requirements}`) : false; +} +let HasLock = (actor) => { + let lock = actor.items.find(a => a.name === (game.settings.get("innocenti-openlock", "nameLockFeat") || game.settings.get("innocenti-openlock", "nameTrapLockFeat")) && a.type === `feat`); + return (lock) ? lock : false; +} +let CheckPermission = async (targetToken) => { + let entityTarget = await game.actors.entities.find(a => a.id === targetToken.actor.id); + let perm = entityTarget.data.permission; + // Se já tenho permissão não preciso testar nada. + if (perm[`${game.user.id}`]) return true + console.log("Não tenho permissão"); + return false; +} function PrepareActivations(itemActivation) { let activation = {}; const activations = itemActivation.split(';').map(a => a.split(' ')); activations.forEach((array) => { const [key, ...newData] = array; activation[key] = parseInt(newData.filter(i => !!i)); - }); - return activation; + }); + return activation; } - -async function OpenChest(targetToken, lockitem, chestKey = false, options, msgs) {//open = true, trap = false, lockdisarm = false, lockremove = false) { +async function OpenChest(targetToken, lockitem, chestKey = false, options, msgs) { let imgActor = targetToken.actor.img || targetToken.data.img; let imgToken = targetToken.data.img || targetToken.actor.img; - - let msgAction = msgs.title; + let content = `

` + msgs.content; // Fazer um texto extra dizendo como o bau foi pilhado let contentItem = (chestKey) ? `

${game.i18n.localize('OpenLock.MsgChat.Used')} ${chestKey.name}

` : ''; + content = content + contentItem; + console.log(options); await game.socket.emit("module.innocenti-openlock", { - actorTargetid: targetToken.actor.id, - token: canvas.tokens.controlled[0].id, - targetToken: targetToken.id, - userid: game.user.id, - item_id: lockitem.id, - chestKey: chestKey, - trap: options.trap, - disarm: options.disarm, - remove: options.remove, - open: options.open + actorTargetid: targetToken.actor.id, + token: canvas.tokens.controlled[0].id, + targetToken: targetToken.id, + userid: game.user.id, + item_id: lockitem?.id, + chestKey: chestKey, + trap: options.trap, + disarm: options.disarm, + remove: options.remove, + open: options.open }); await ChatMessage.create({ - content: `

${game.i18n.localize('OpenLock.MsgChat.Loot')} @Actor[${targetToken.actor.data._id}]{${targetToken.name}}

${contentItem}`, + content: content, type: CONST.CHAT_MESSAGE_TYPES.EMOTE, speaker: ChatMessage.getSpeaker(), - flavor: `

` + flavor: `

${msgs.SearchTitile}

` }); - if (open === true) + if (options.open === true) await setTimeout(function () { targetToken._onClickLeft2() }, 500); -} +} \ No newline at end of file diff --git a/scripts/settings.js b/scripts/settings.js index 53eba79..b02ab82 100644 --- a/scripts/settings.js +++ b/scripts/settings.js @@ -56,4 +56,12 @@ Hooks.once("init", () => { default: false, type: Boolean }); + game.settings.register("innocenti-openlock", "resetTrap", { + name: game.i18n.localize('OpenLock.Settings.resetTrap'), + hint: game.i18n.localize('OpenLock.Settings.resetTrapHint'), + scope: "world", + config: true, + default: false, + type: Boolean + }); }); \ No newline at end of file