您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Some silly fixes and 'improvements' to Roll20 because I'm impatient and a psycho
// ==UserScript== // @name Roll20 Fixes // @namespace http://statonions.com/ // @version 0.3.21 // @description Some silly fixes and 'improvements' to Roll20 because I'm impatient and a psycho // @author Justice Noon // @match https://app.roll20.net/editor/ // @grant GM_setValue // @grant GM_getValue // ==/UserScript== // Changelog: Fix disabled zoom slider (function() { 'use strict'; //Features var TMp = { clickShow: true, macroHide: true, fullButt: true, fixPing: "1", css: { player: false, zoom: false, sidebar: false, quick: false, turns: false, error: false, macroTok: true, bigQuery: true }, pfCustomAttr: true, splitTokName: "3", toolbarButt: true, scaleToks: false, statusHQ: false, scrollPages: '2', perfMode: false, noPopouts: false }; try { GM_info; var stored = GM_getValue('TMp', 'nah'); if (stored == 'nah') GM_setValue('TMp', JSON.stringify(TMp)); else { var checkVals = function(d, s) { for (var k in d) { if (typeof d[k] !== typeof s[k]) s[k] = d[k]; if (typeof d[k] == 'object') s[k] = checkVals(d[k], s[k]); }; return s; }; TMp = checkVals(TMp, JSON.parse(stored)); GM_setValue('TMp', JSON.stringify(TMp)); } checkLoaded(); } catch(err) { checkLoaded(); } function checkLoaded(tried) { if (!tried) tried = 1; try { if (Campaign && Campaign.activePage().thegraphics && Campaign.activePage().thegraphics.models[0] && Campaign.activePage().thegraphics.models[0].view && Campaign.activePage().thegraphics.models[0].view.graphic) { tried = 69; showtime(); } else setTimeout(checkLoaded, 1000, tried); } catch(err) { if (++tried < 69) setTimeout(checkLoaded, 1000, tried); else { console.log(err); console.log("Couldn't load userscript. Aborting."); } } }; function showtime() { //For *my* players specifically. Activates all css tweaks. I'm too lazy to maintain separate code (in-person touchpad view) ////_.each(TMp.css, (c,i,l) => l[i] = true);TMp.perfMode = true; //Create greasemonkey preferences menu try { GM_info; var prefLi = document.createElement('li'); prefLi.id = 'showfixes'; var prefSpan = document.createElement('span'); prefSpan.setAttribute('class', 'pictos'); prefSpan.appendChild(document.createTextNode('x')); prefLi.appendChild(prefSpan); prefLi.appendChild(document.createTextNode("\r\n 'Fixes' Preferences\r\n")); document.getElementById('helpsite').childNodes[3].childNodes[1].appendChild(prefLi); prefLi.addEventListener('click', promptPrefs); $("#helpsite").off(); function promptPrefs(e) { e.stopPropagation(); var finished = false, response, responseVal, responseMod = '', ref = TMp, counter, changeKey; while (!finished) { counter = 1; response = prompt(_.reduce(ref, (memo, v, k) => memo + '\n' + counter++ + ':' + k + ' :: ' + (_.isObject(v) ? '[' + _.keys(v).length + ' properties]' : v), 'Enter a number:\n0:Back'), 'Enter a number to swap value.'); responseVal = parseInt(response.replace(/\+/g,'').replace(/-/g,'')); responseMod = (response.indexOf('+') != -1 ? '+' : (response.indexOf('-') != -1 ? '-' : '')); if (/[^0-9+-]+/.test(response) || responseVal == 0 || responseVal > counter) { if (ref === TMp) { GM_setValue('TMp', JSON.stringify(TMp)); finished = true; alert('Reload to see changes'); } else ref = TMp; } else { changeKey = _.keys(ref)[responseVal-1]; if (_.isObject(ref[changeKey])) { if (responseMod == '!') _.each(ref[changeKey], (e,i) => {if (typeof e == 'boolean') ref[changeKey][i] = !e}); else if (responseMod == '+') _.each(ref[changeKey], (e,i) => {if (typeof e == 'boolean') ref[changeKey][i] = true}); else if (responseMod == '-') _.each(ref[changeKey], (e,i) => {if (typeof e == 'boolean') ref[changeKey][i] = false}); else ref = ref[changeKey]; } else if (_.isBoolean(ref[changeKey])) ref[changeKey] = !ref[changeKey]; else ref[changeKey] = prompt('Enter a new value for ' + changeKey); } } } } catch (err) { console.log('No GM. No need for preferences.'); } window.myLower = Campaign.activePage().thegraphics.models[0].view.graphic.canvas.lowerCanvasEl; window.myUpper = Campaign.activePage().thegraphics.models[0].view.graphic.canvas.upperCanvasEl; window.myMain = document.getElementById('finalcanvas'); //Display tokenname on select if (TMp.clickShow) { var toks = []; var muteCallback = function(mutationsList) { if (currentcontexttarget) { for(var mutation of mutationsList) { if (!_.isEmpty(mutation.addedNodes)) { let cct = currentcontexttarget.canvas; let cctIt = cct.lastRenderedObjectWithControlsAboveOverlay.model.attributes; if (!cctIt.showname) { cctIt.showname = true; toks.push([cctIt.page_id, cctIt.id]); } cct._objects.push(cct._objects.splice(cct._objects.indexOf(cct.lastRenderedObjectWithControlsAboveOverlay), 1)[0]); currentcontexttarget.canvas.renderAll && currentcontexttarget.canvas.renderAll(); } else if (!_.isEmpty(mutation.removedNodes)) { _.each(toks, tok => {if (tok[0] == Campaign.activePage().id) _.find(Campaign.activePage().thegraphics.models, tokk => tokk.attributes.id == tok[1]).attributes.showname = false}); toks = []; currentcontexttarget.canvas.renderAll && currentcontexttarget.canvas.renderAll(); Campaign.activePage().reorderByZ(); } } } }; var observer = new MutationObserver(muteCallback); observer.observe(document.getElementById('editor-wrapper'), {childList: true}); } if (TMp.css.macroTok) { var macroTokCallback = function(mutationsList) { for (var mutation of mutationsList) { _.delay((mutation) => { let cctIt = currentcontexttarget.canvas.lastRenderedObjectWithControlsAboveOverlay.model.attributes; if (mutation.target.style.display == 'block' && cctIt.gmnotes != 'blank' && cctIt.gmnotes != '%3Cp%3Eblank%3C/p%3E') _.each(document.getElementsByClassName('tokenactions')[0].firstElementChild.children, ob => ob.setAttribute('data-blank', 'false')); }, (typeof currentcontexttarget == 'undefined' ? 1000 : 0), mutation); } }; var macroObserver = new MutationObserver(macroTokCallback); macroObserver.observe(document.querySelector('.mode.tokenactions'), {attributeFilter: ['style']}); } //Allow Macros to be hidden if (TMp.macroHide) { var toggleMacro = document.createElement('div'); toggleMacro.setAttribute('class', 'macrobox'); var toggleButton = document.createElement('button'); toggleButton.setAttribute('class', 'btn'); toggleButton.appendChild(document.createTextNode('Show/Hide')); toggleButton.id = 'toggleMacros'; toggleMacro.appendChild(toggleButton) //macrobar is defined by default macrobar.appendChild(toggleMacro); document.getElementById('toggleMacros').addEventListener('click', () => macrobar.style.left = (macrobar.style.left == '' ? (macrobar.offsetWidth * -1 + 100) + 'px' : '')); } //Create fullscreen button if (TMp.fullButt) { var fullScreenLi = document.createElement('li'); fullScreenLi.setAttribute('tip', 'Toggle Fullscreen'); fullScreenLi.id = 'fullscreener'; var fullScreenSpan = document.createElement('span'); fullScreenSpan.setAttribute('class', 'pictos'); fullScreenSpan.appendChild(document.createTextNode('`')); fullScreenLi.appendChild(fullScreenSpan); floatingtoolbar.childNodes[1].appendChild(fullScreenLi); fullScreenLi.addEventListener('click', toggleFullScreen); function toggleFullScreen() { var doc = window.document; var docEl = doc.documentElement; var requestFullScreen = docEl.requestFullscreen || docEl.mozRequestFullScreen || docEl.webkitRequestFullScreen || docEl.msRequestFullscreen; var cancelFullScreen = doc.exitFullscreen || doc.mozCancelFullScreen || doc.webkitExitFullscreen || doc.msExitFullscreen; if(!doc.fullscreenElement && !doc.mozFullScreenElement && !doc.webkitFullscreenElement && !doc.msFullscreenElement) { requestFullScreen.call(docEl); } else { cancelFullScreen.call(doc); } } } //Create Floating Toolbar button if (TMp.toolbarButt) { var ToolBar = _.filter(Campaign.players.get(d20_player_id).macros.models, m => m.attributes.name.indexOf('ToolBar') > -1); if (_.isUndefined(ToolBar)) ToolBar = _.filter(_.union(..._.map(Campaign.players.models, m => m.macros.models)), m => {return m.visibleToCurrentPlayer() && m.attributes.name.indexOf('ToolBar') > -1}); _.each(ToolBar, tb => { var actions = tb.attributes.action.split('\n'); var toolBarLi = document.createElement('li'); toolBarLi.setAttribute('tip', 'Additional Macros'); toolBarLi.id = 'ToolBar' + (tb.attributes.name == ToolBar ? tb.id : tb.attributes.name.replace('ToolBar','')); toolBarLi.setAttribute('style', 'display: flex; justify-content: center; align-items: center;'); for (var k = 0, thisAction, thisSpan, thisLi, thisA, thisODiv; k < actions.length; k++) { thisAction = actions[k].split('||'); thisSpan = document.createElement('span'); thisSpan.setAttribute('class', 'pictos'); thisSpan.setAttribute('style', 'left: -11rem;'); //Make sure character is supported and won't unclip out of side var canvas = document.createElement('canvas').getContext('2d'); canvas.font = '22px Pictos'; var width = canvas.measureText(thisAction[0]); if (width.width > 31) thisAction[0] = _.compact([...thisAction[0].replace(/[\u200B-\u200D\uFEFF]/g, '')]).join(' '); thisSpan.appendChild(document.createTextNode(thisAction[0])); if (k == 0) { toolBarLi.appendChild(thisSpan); var thisDiv = document.createElement('div'); thisDiv.setAttribute('class', 'submenu'); var thisUl = document.createElement('ul'); } else { thisLi = document.createElement('li'); thisA = document.createElement('a'); if (thisAction[2].indexOf('j:') > -1) { thisA.setAttribute('href', '!'); thisA.onclick = eval('() => {' + thisAction[2].substr(2) + '}'); } else thisA.setAttribute('href', thisAction[2]); thisA.appendChild(thisSpan); thisODiv = document.createElement('div'); thisODiv.appendChild(document.createTextNode(thisAction[1])); thisA.appendChild(thisODiv); thisLi.appendChild(thisA); thisUl.appendChild(thisLi); } } thisDiv.appendChild(thisUl); thisDiv.setAttribute('style', 'top: -' + k*20 + 'px !important;'); toolBarLi.appendChild(thisDiv); floatingtoolbar.childNodes[1].appendChild(toolBarLi); }); } //Fix Pings if (TMp.fixPing != "0") { JSON.parse2 = JSON.parse; JSON.parse = function(e) { var intercept = JSON.parse2(e), api = false; if (intercept.type == 'mapping') { if (_.isUndefined(intercept.currentLayer)) api = true; if (TMp.fixPing == "2" && intercept.player == "api") { if (is_gm) spoofPing(intercept); Object.assign(intercept, {scrollto: false, left: -100, top: -100}); } intercept.currentLayer = 'objects'; if (intercept.pageid != Campaign.activePage().id || (api && intercept.player != "api" && intercept.player != d20_player_id)) Object.assign(intercept, {scrollto: false, left: -100, top: -100}); } return intercept; }; function spoofPing(old) { var paddingOffset = [], currentCanvasOffset = []; var canvasZoom = Math.round(document.getElementById('finalcanvas').getContext('2d').getTransform().a * 10) / 10; var canvasWidth = document.getElementById('finalcanvas').clientWidth, canvasHeight = document.getElementById('finalcanvas').clientHeight; var scaledTop = document.getElementById('editor-wrapper').scrollTop / canvasZoom, scaledLeft = document.getElementById('editor-wrapper').scrollLeft / canvasZoom; var pageWidth = Campaign.activePage().attributes.width * 70, pageHeight = Campaign.activePage().attributes.height * 70; var padding = 125; if (scaledLeft < padding) (paddingOffset[0] = padding - scaledLeft, currentCanvasOffset[0] = 0); else { if (pageWidth / canvasZoom - scaledLeft - canvasWidth / canvasZoom + padding < 0) (paddingOffset[0] = pageWidth / canvasZoom - scaledLeft - canvasWidth / canvasZoom + padding, currentCanvasOffset[0] = scaledLeft - padding + paddingOffset[0]); else (paddingOffset[0] = 0, currentCanvasOffset[0] = scaledLeft - padding); } if (scaledTop < padding) (paddingOffset[1] = padding - scaledTop, currentCanvasOffset[1] = 0); else { if (pageHeight / canvasZoom - scaledTop - canvasHeight / canvasZoom + padding < 0) (paddingOffset[1] = pageHeight / canvasZoom - scaledTop - canvasHeight / canvasZoom + padding, currentCanvasOffset[1] = scaledTop - padding + paddingOffset[1]); else (paddingOffset[1] = 0, currentCanvasOffset[1] = scaledTop - padding); } //var m = {left: old.left, top: old.top}; var pos = {left: canvasZoom * (old.left - currentCanvasOffset[0]) + paddingOffset[0], top: canvasZoom * (old.top - currentCanvasOffset[1]) + paddingOffset[1]}; var evt = new MouseEvent('mousedown', {bubbles: true, cancelable: true, composed: true, buttons: 1, shiftKey: true, clientX: pos.left, clientY: pos.top}); var maskedArr = []; _.each(Campaign.activePage().thegraphics.models, m => { if (m.attributes.layer == 'objects' && Math.abs(m.attributes.top - old.top) <= m.attributes.height / 2 && Math.abs(m.attributes.left - old.left) <= m.attributes.width / 2) { //debugger; maskedArr.push([m.id, m.view.graphic.selectable]); m.view.graphic.selectable = false; } }); _.delay((e, mask) => {window.myUpper.dispatchEvent(e); _.each(mask, m => Campaign.activePage().thegraphics._byId[m[0]].view.graphic.selectable = m[1]);}, 1000, new MouseEvent('mouseup', {bubbles: true, cancelable: true, composed: true, buttons: 1, clientX: 1, clientY: 1}), maskedArr); return !(window.myUpper.dispatchEvent(evt)); } } //CSS override block if (_.contains(TMp.css, true) || TMp.toolbarButt || TMp.statusHQ) { var style = document.createElement('style'); style.type = 'text/css'; style.innerHTML = ''; //Remove player names/ icons if (TMp.css.player) style.innerHTML += '.player.ui-droppable {display: none;} '; //Remove Zoom Slider if (TMp.css.zoom) style.innerHTML += '#zoomclick {display:none;} '; //Remove sidebar show/ hide button if (TMp.css.sidebar) style.innerHTML += '#sidebarcontrol {display: none;} '; //Increase quickmenu sizes if (TMp.css.quick) style.innerHTML += '.sheet-roll-cell a{padding:.5em !important;} '; //Permanently hide turn order if (TMp.css.turns) style.innerHTML += 'div.ui-dialog[style*="width: 160px;"] {display: none !important;} '; //Hides the connection error box if (TMp.css.error) style.innerHTML += '#connectionerror {display: none !important;} '; //Query window input box should size to the box size if (TMp.css.bigQuery) style.innerHTML += '.ui-dialog-content.ui-widget-content > p > strong + input {width: 100% !important; width: -moz-available !important; width: -webkit-fill-available !important; width: fill-available !important;} '; //Hide macroTokens by default if (TMp.css.macroTok) style.innerHTML += 'button[data-type="macro"]:not([data-blank="false"]) {display: none !important;} '; if (TMp.statusHQ) style.innerHTML += '#radial-menu .markermenu .markericon {background-image: url(https://files.catbox.moe/08tmts.svg) !important;} '; //Fills Toolbar buttons to their spaces style.innerHTML += '.submenu > ul > li > a {display: inline-block; width: 100%; height: 100%; color: grey; text-align: center;} .submenu > ul > li > a:hover {text-decoration: none;} .submenu > ul > li > a > .pictos {position: relative; left: -6rem; top: .1rem;} .submenu > ul > li > a > div {position: absolute; left: 3rem; top: .5rem;}'; document.getElementsByTagName('head')[0].appendChild(style); } //Popouts and/ or dialogs create browser-behavior tabs instead of forced popups. 1 for just characters, 2 for everything. if (TMp.noPopouts) { unsafeWindow._open = unsafeWindow.open; if (TMp.noPopouts == 1) unsafeWindow.open = function(a,b,c) {if (a == "/editor/popout") return unsafeWindow._open(a, b); else return unsafeWindow._open(a,b,c);}; else unsafeWindow.open = function(a,b,c) {return unsafeWindow._open(a, b);}; } //Character sheets display custom attributes as name if (TMp.pfCustomAttr) { function cssInjection(charId) { var list = [1,2,3,10,11,12]; var head = 'div.dialog.characterdialog[data-characterid=' + charId + '] {', foot = ''; _.each(list, function(cK) { cK = 'customa' + cK; let val = {}; if (!_.isUndefined(val = _.find(Campaign.characters._byId[charId].attribs.models, at => at.attributes.name == cK + '-name'))) head += `--${cK}: "${val.attributes.current}"; ` foot += `input[title="@{buff_${cK}-total}"] + span {visibility: hidden; top: -1.2rem;} input[title="@{buff_${cK}-total}"] + span::after {content: var(--${cK}, "${cK}"); visibility: visible; display: block;} ` }); return [head + '} ', foot]; } function newShow(that) { var customOver; var modCss = cssInjection(that.model.attributes.id); if (_.isNull(document.getElementById('customOver'))) { customOver = document.createElement('style'); customOver.type = 'text/css'; customOver.id = 'customOver'; customOver.innerHTML = modCss[1]; } else { customOver = document.getElementById('customOver'); } customOver.innerHTML += (modCss[0].indexOf('{}') > -1 ? '' : modCss[0]); if (that.childWindow) { _.delay(function() {customOver.innerHTML = modCss.join(' '); that.childWindow.document.getElementsByTagName('head')[0].appendChild(customOver)}, 4000); } else document.getElementsByTagName('head')[0].appendChild(customOver); }; _.each(Campaign.characters.models, ch => {ch.view.showDialog2 = ch.view.showDialog; ch.view.showDialog = function(e, t) {this.showDialog2(e, t); newShow(this)}}); _.each(Campaign.characters.models, ch => {ch.view.showPopout2 = ch.view.showPopout; ch.view.showPopout = function(e, t) {this.showPopout2(e, t); newShow(this)}}); //Bookmarklet check then process active child windows if (typeof unsafeWindow == 'undefined') _.each(window.allChildWindows, win => {newShow(Campaign.characters._byId[win.document.getElementsByClassName('dialog characterdialog')[0].getAttribute('data-characterid')].view)}); } //Tokens auto split their name to multiple lines if (TMp.splitTokName != "0") { var newFill = function(x, y, w, h) { if (this.font != 'bold 14px Arial' || this.fillStyle.replace(/ /g,'').indexOf('rgba(255,255,255,0.5') == -1) this.fillRect2(x, y, w, h); else if (this.fillText != this.newText) this.fillText = this.newText; //Note to self: Find where they're resetting this and stop it. A lot of wasted cycles for this. }; var newText = function(t, x, y, m) { if (this.font != 'bold 14px Arial' || this.fillStyle != '#000000') this.fillText2(t, x, y, m); else if (this.canvas == window.myUpper) return; else { var g = 14, r = y - 22, n = m, max = parseInt(TMp.splitTokName), forced, tmpFix = 3; var texes = t.toString().split(' '); for (var k = 0; k < texes.length; k++) { while ((this.measureText(texes[k] + ' ' + texes[k+1]).width < r*2 || k >= max - 1) && k+1 < texes.length ) { texes[k] += ' ' + texes[k+1]; texes.splice(k+1, 1); } if (texes[k].indexOf('\\n') > -1) { forced = texes[k].split('\\n'); texes[k] = forced.shift(); texes.splice(k+1, 0, ...forced); } texes[k] = texes[k].replace(/_/g, ' '); n = this.measureText(texes[k]).width; this.fillStyle = 'rgba(255, 255, 255, 0.50)'; this.fillRect2(-1 * Math.floor((n + 6) / 2), r + 8 + (g+6)*k, n + 6, g + 6); this.fillStyle = 'rgb(0,0,0)'; this.fillText2(texes[k], x, y + tmpFix + (g+6)*k, n); } } }; _.each([window.myMain, window.myUpper, window.myLower], function(c) { let can = c.getContext('2d'); can.fillRect2 = can.fillRect; can.fillRect = newFill; can.newFill = newFill; can.fillText2 = can.fillText; can.fillText = newText; can.newText = newText; }); } if (false && (TMp.scaleToks || TMp.statusHQ)) { var newRect = function(x, y, w, h) { var rgba = /rgba\( ?(\d*) ?, ?(\d*) ?, ?(\d*) ?, ?((?:\d|\.)*) ?\)/.exec(this.fillStyle), fillStr, offset = 24; if (rgba && parseFloat(rgba[4]).toFixed(2) == "0.75" && (Campaign.tokendisplay.bar3_rgb + '' == (fillStr = rgba[1] + ',' + rgba[2] + ',' + rgba[3]) || (Campaign.tokendisplay.bar2_rgb + '' == fillStr && _.isNumber(offset -= 12)) || (Campaign.tokendisplay.bar1_rgb + '' == fillStr && _.isNumber(offset -= 24)))) { var scale = (x - 3) * -1 / 35; if (scale != 1) { h = scale * 8; y = (y - offset + 20) + ((offset - 20) * scale); x = (x - 3) + (3 * scale); this.lineWidth = scale; w = Math.floor((70 * scale - 6 * scale) * (w / (70 * scale - 6))); } } this.rect2(x, y, w, h); }; var newImage = function() { if (arguments[7] && arguments[7] == 21 && (arguments[0].src == 'https://files.catbox.moe/08tmts.svg' || arguments[0].src == 'https://app.roll20.net/images/statussheet.png' || arguments[0].src == 'https://app.roll20.net/images/statussheet_small.png')) { if (TMp.statusHQ) { if (arguments[0].src != 'https://files.catbox.moe/08tmts.svg') arguments[0].src = 'https://files.catbox.moe/08tmts.svg'; arguments[3] = 24; arguments[4] = 24; } if (false) { var scaleO, scaleR, scaleH, scaleD, it, scale, k, j, pairs; switch(Campaign.get('markers_position')) { case 'bottom': scaleO = arguments[5]; scaleR = arguments[6] + 19; it = (scaleR - scaleO); scale = scaleR / 35; for (k = 0; k <= it / 16; k++) for (j = 0; j <= it / 22; j++) if (k * 16 + j * 22 == it) pairs = [k,j]; scaleD = scaleR - 10 * scale; scaleH = scaleO + 16 * pairs[0] * scale + 22 * pairs[1] * scale; break; case 'left': scaleO = -(arguments[5]); scaleR = -(arguments[6] + 19); it = (scaleO - scaleR); scale = scaleO / 35; for (k = 0; k <= it / 16; k++) for (j = 0; j <= it / 22; j++) if (k * 16 + j * 22 == it) pairs = [k,j]; scaleD = -scaleR - 10 * scale + 16 * pairs * scale[0] + 22 * pairs[1] * scale; scaleH = -scaleO + 16 * pairs[0] * scale + 22 * pairs[1] * scale; break; case 'right': scaleO = arguments[5] + 18; scaleR = -(arguments[6] + 19); it = (scaleO - scaleR); scale = scaleO / 35; for (k = 0; k <= it / 16; k++) for (j = 0; j <= it / 22; j++) if (k * 16 + j * 22 == it) pairs = [k,j]; scaleD = -scaleR - 10 * scale + 16 * pairs[0] * scale + 22 * pairs[1] * scale; scaleH = scaleO - 18 * scale; break; default: debugger; scaleO = arguments[5]; scaleR = -(arguments[6] - 1); it = (scaleR - scaleO); scale = scaleR / 35; for (k = 0; k <= it / 16; k++) for (j = 0; j <= it / 22; j++) if (k * 16 + j * 22 == it) pairs = [k,j]; scaleD = 10 * scale - scaleR; scaleH = scaleO + 16 * pairs[0] + 22 * pairs[1] - 16 * pairs[0] * scale - 22 * pairs[1] * scale; } arguments[5] = scaleH; arguments[6] = scaleD - 9 * scale; arguments[7] = 21 * scale; arguments[8] = 21 * scale; } } this.drawImage2(...arguments); } _.each([window.myMain, window.myUpper, window.myLower], function(c) { let can = c.getContext('2d'); if (TMp.scaleToks) { can.rect2 = can.rect; can.rect = newRect; } can.drawImage2 = can.drawImage; can.drawImage = newImage; }); } //Makes mousewheel scroll page listing at top and adds custom speed to it if (TMp.scrollPages != '0' && is_gm) { var scrollHorizontally = function(e) { e = window.event || e; document.getElementById('page-toolbar').children[1].scrollLeft -= (Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail))) * (parseFloat(TMp.scrollPages) * 40)); e.preventDefault(); } document.getElementById('page-toolbar').children[1].addEventListener("wheel", scrollHorizontally, false); } //Disables anti-aliasing on canvas if you need the performance if (TMp.perfMode) { _.each([window.myMain, window.myUpper, window.myLower], function(c) { c.getContext('2d').imageSmoothingEnabled = false; }); } } })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址