Use this before other scripts
目前為
// ==UserScript==
// @name Roll20 Boilerplate v2
// @namespace http://statonions.com
// @version 0.2.2
// @description Use this before other scripts
// @author Justice Noon
// @match https://app.roll20.net/editor/
// @include https://app.roll20.net/assets/*
// @run-at document-start
// @grant GM_webRequest
// @grant GM_unsafeWindow
// @webRequest {"selector": "*/assets/app.js?*", "action": "cancel" }
//Changelog: Added compatibility for VTT ES / Requires unsafeWindow now. Sorry.
// ==/UserScript==
(function() {
'use strict';
var readyScript = '', intId;
GM_webRequest([{"selector": "*/assets/app.js?*", "action": "cancel" }], function(info, message, details) {
console.log(info, message, details);
});
var oReq = new XMLHttpRequest();
oReq.addEventListener("load", function() {
if (typeof r20es != 'undefined')
intId = setInterval(() => {if(d20) {unsafeWindow.d21 = d20; clearInterval(intId);}}, 2000);
else
readyScript = this.responseText.replace('getPointer,degreesToRadians;', 'getPointer,degreesToRadians;window.d21=d20;');
});
oReq.open("GET", "https://app.roll20.net/assets/app.js");
oReq.send();
const observer = new MutationObserver(mutations => {
mutations.forEach(({ addedNodes }) => {
addedNodes.forEach(node => {
if(node.nodeType === 1 && node.tagName === 'SCRIPT') {
const src = node.src || '';
//Load modified app when it would have loaded normally
if(src.indexOf('assets/app.js') > -1) {
window.eval(readyScript);
node.type = 'javascript/blocked';
node.parentElement.removeChild(node);
observer.disconnect();
}
}
})
})
})
observer.observe(document.documentElement, {
childList: true,
subtree: true
})
})();