v0.14.2 - Double-check cooldown via img opacity:0.5 in hasReadySpell
- Some quickbar/deprecated elements retain onclick even when on cooldown if the cooldown indicator is only visual (img opacity:0.5) not structural - Now also checks img.btqi / img style.opacity !== '0.5' - This catches cases where the parent div has onclick but the inner image is visually dimmed (game cooldown)
This commit is contained in:
parent
7ae6e4855f
commit
205f1cd631
5 changed files with 30 additions and 12 deletions
|
|
@ -1,7 +1,7 @@
|
||||||
// ==UserScript==
|
// ==UserScript==
|
||||||
// @name HV Unified
|
// @name HV Unified
|
||||||
// @namespace hvunified
|
// @namespace hvunified
|
||||||
// @version 0.14.1
|
// @version 0.14.2
|
||||||
// @description HV Unified — battle automation, guidance, and UI enhancements for HentaiVerse
|
// @description HV Unified — battle automation, guidance, and UI enhancements for HentaiVerse
|
||||||
// @author GaboGG + Hermes
|
// @author GaboGG + Hermes
|
||||||
// @match *://*.hentaiverse.org/*
|
// @match *://*.hentaiverse.org/*
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
// CONFIG — default settings
|
// CONFIG — default settings
|
||||||
// ═══════════════════════════════════════════════════════════════════════
|
// ═══════════════════════════════════════════════════════════════════════
|
||||||
|
|
||||||
const VERSION = '0.14.1';
|
const VERSION = '0.14.2';
|
||||||
|
|
||||||
const CFG = {
|
const CFG = {
|
||||||
// — Battle automation
|
// — Battle automation
|
||||||
|
|
@ -733,11 +733,17 @@ function hasSpell(name) {
|
||||||
return STATE.spellsKnown.some(s => s.n === name);
|
return STATE.spellsKnown.some(s => s.n === name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if a spell is not on cooldown (has onclick in the DOM)
|
// Check if a spell is not on cooldown (has onclick in the DOM AND inner img isn't dimmed)
|
||||||
function hasReadySpell(name) {
|
function hasReadySpell(name) {
|
||||||
const el = $$('.btsd, .btqs').find(e =>
|
const el = $$('.btsd, .btqs').find(e =>
|
||||||
(e.getAttribute('onmouseover') || '').includes(`set_infopane_spell('${name}'`));
|
(e.getAttribute('onmouseover') || '').includes(`set_infopane_spell('${name}'`));
|
||||||
return el ? el.hasAttribute('onclick') : false;
|
if (!el) return false;
|
||||||
|
if (!el.hasAttribute('onclick')) return false;
|
||||||
|
// Double-check: the inner img might have opacity:0.5 (cooldown tint)
|
||||||
|
// even if the parent has onclick from a previous parse
|
||||||
|
const img = el.querySelector('img.btqi, img');
|
||||||
|
if (img && img.style.opacity === '0.5') return false;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function findSpell(name) {
|
function findSpell(name) {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
// ==UserScript==
|
// ==UserScript==
|
||||||
// @name HV Unified
|
// @name HV Unified
|
||||||
// @namespace hvunified
|
// @namespace hvunified
|
||||||
// @version 0.14.1
|
// @version 0.14.2
|
||||||
// @description HV Unified — battle automation, guidance, and UI enhancements for HentaiVerse
|
// @description HV Unified — battle automation, guidance, and UI enhancements for HentaiVerse
|
||||||
// @author GaboGG + Hermes
|
// @author GaboGG + Hermes
|
||||||
// @match *://*.hentaiverse.org/*
|
// @match *://*.hentaiverse.org/*
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
// CONFIG — default settings
|
// CONFIG — default settings
|
||||||
// ═══════════════════════════════════════════════════════════════════════
|
// ═══════════════════════════════════════════════════════════════════════
|
||||||
|
|
||||||
const VERSION = '0.14.1';
|
const VERSION = '0.14.2';
|
||||||
|
|
||||||
const CFG = {
|
const CFG = {
|
||||||
// — Battle automation
|
// — Battle automation
|
||||||
|
|
@ -733,11 +733,17 @@ function hasSpell(name) {
|
||||||
return STATE.spellsKnown.some(s => s.n === name);
|
return STATE.spellsKnown.some(s => s.n === name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if a spell is not on cooldown (has onclick in the DOM)
|
// Check if a spell is not on cooldown (has onclick in the DOM AND inner img isn't dimmed)
|
||||||
function hasReadySpell(name) {
|
function hasReadySpell(name) {
|
||||||
const el = $$('.btsd, .btqs').find(e =>
|
const el = $$('.btsd, .btqs').find(e =>
|
||||||
(e.getAttribute('onmouseover') || '').includes(`set_infopane_spell('${name}'`));
|
(e.getAttribute('onmouseover') || '').includes(`set_infopane_spell('${name}'`));
|
||||||
return el ? el.hasAttribute('onclick') : false;
|
if (!el) return false;
|
||||||
|
if (!el.hasAttribute('onclick')) return false;
|
||||||
|
// Double-check: the inner img might have opacity:0.5 (cooldown tint)
|
||||||
|
// even if the parent has onclick from a previous parse
|
||||||
|
const img = el.querySelector('img.btqi, img');
|
||||||
|
if (img && img.style.opacity === '0.5') return false;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function findSpell(name) {
|
function findSpell(name) {
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
// CONFIG — default settings
|
// CONFIG — default settings
|
||||||
// ═══════════════════════════════════════════════════════════════════════
|
// ═══════════════════════════════════════════════════════════════════════
|
||||||
|
|
||||||
const VERSION = '0.14.1';
|
const VERSION = '0.14.2';
|
||||||
|
|
||||||
const CFG = {
|
const CFG = {
|
||||||
// — Battle automation
|
// — Battle automation
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
// ==UserScript==
|
// ==UserScript==
|
||||||
// @name HV Unified
|
// @name HV Unified
|
||||||
// @namespace hvunified
|
// @namespace hvunified
|
||||||
// @version 0.14.1
|
// @version 0.14.2
|
||||||
// @description HV Unified — battle automation, guidance, and UI enhancements for HentaiVerse
|
// @description HV Unified — battle automation, guidance, and UI enhancements for HentaiVerse
|
||||||
// @author GaboGG + Hermes
|
// @author GaboGG + Hermes
|
||||||
// @match *://*.hentaiverse.org/*
|
// @match *://*.hentaiverse.org/*
|
||||||
|
|
|
||||||
|
|
@ -8,11 +8,17 @@ function hasSpell(name) {
|
||||||
return STATE.spellsKnown.some(s => s.n === name);
|
return STATE.spellsKnown.some(s => s.n === name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if a spell is not on cooldown (has onclick in the DOM)
|
// Check if a spell is not on cooldown (has onclick in the DOM AND inner img isn't dimmed)
|
||||||
function hasReadySpell(name) {
|
function hasReadySpell(name) {
|
||||||
const el = $$('.btsd, .btqs').find(e =>
|
const el = $$('.btsd, .btqs').find(e =>
|
||||||
(e.getAttribute('onmouseover') || '').includes(`set_infopane_spell('${name}'`));
|
(e.getAttribute('onmouseover') || '').includes(`set_infopane_spell('${name}'`));
|
||||||
return el ? el.hasAttribute('onclick') : false;
|
if (!el) return false;
|
||||||
|
if (!el.hasAttribute('onclick')) return false;
|
||||||
|
// Double-check: the inner img might have opacity:0.5 (cooldown tint)
|
||||||
|
// even if the parent has onclick from a previous parse
|
||||||
|
const img = el.querySelector('img.btqi, img');
|
||||||
|
if (img && img.style.opacity === '0.5') return false;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function findSpell(name) {
|
function findSpell(name) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue