libpbr2

You don't need this unless you're planning on writing a script that runs alongside Replay Rewrite.

目前为 2023-08-22 提交的版本。查看 最新版本

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.cn-greasyfork.org/scripts/473621/1238869/libpbr2.js

  1. // ==UserScript==
  2. // @name libpbr2
  3. // @description You don't need this unless you're planning on writing a script that runs alongside Replay Rewrite.
  4. // @include https://glb.warriorgeneral.com/game/replay.pl?game_id=*&pbp_id=*
  5. // @copyright 2009, pabst
  6. // @license (CC) Attribution Share Alike; http://creativecommons.org/licenses/by-sa/3.0/
  7. // @version 23.08.22
  8. // ==/UserScript==
  9. //23.08.22 update to work in the new domain
  10.  
  11. var fieldLayerZ = 0;
  12. var lowerDecalLayerZ = 64;
  13. var lineLayerZ = 128;
  14. var middleDecalLayerZ = 192;
  15. var playerLayerZ = 255;
  16. var upperDecalLayerZ = 768;
  17. var iconOverlayLayerZ = 1024;
  18.  
  19. var startLimit = 0;
  20. var lockTime = 0;
  21.  
  22. function importPBP(address, page) {
  23. console.log("inserting pbp");
  24. var pbp = document.getElementById("pbp");
  25. pbp.style.visibility = "hidden";
  26. pbp.style.display = "none";
  27. var string = page.responseText.replace(/<img/g,"<div").replace(/\/img/g,"/div>");
  28. string = string.slice(string.indexOf('<div id="content">'));
  29. string = string.slice(0,string.indexOf('<div id="footer">'));
  30. pbp.innerHTML = string;
  31. /*
  32. var code = page.responseText.split('<body onload="loadInbox()">')[1];
  33. code = code.replace(/<script /g,"<crap ");
  34. code = code.replace(/<\/script>/g,"/crap>");
  35. code = code.replace(/<link /g,"<crap ");
  36. pbp.innerHTML = code;
  37. */
  38. }
  39.  
  40. function init(needsPBP) {
  41. // console.log("init");
  42. if (startLimit == 0) {
  43. startLimit++;
  44. addToActive();
  45. activate();
  46. }
  47.  
  48. if (needsPBP == true) {
  49. var pbptag = document.createElement("div");
  50. pbptag.setAttribute("id","pbp");
  51.  
  52. var pbp = document.getElementById("pbp");
  53. if (pbp == null) {
  54. document.body.appendChild(pbptag);
  55.  
  56. var href = window.location.toString();
  57. href = href.replace("replay.pl","game.pl");
  58. var idx = href.indexOf("&pbp_id");
  59. href = href.slice(0,idx) + "&mode=pbp";
  60.  
  61. console.log("loading pbp");
  62. getInetPage(href, importPBP);
  63. return;
  64. }
  65. else if (pbp.childNodes.length == 0) {
  66. console.log("waiting for pbp");
  67. setTimeout(init, 300);
  68. return;
  69. }
  70. }
  71. if (document.getElementById("rrplay") == null) {
  72. if (startLimit >= 10) return;
  73. startLimit++;
  74. setTimeout(init, 300);
  75. return;
  76. }
  77. else {
  78. var rrplay = document.getElementById("rrplay");
  79. rrplay.addEventListener("change",function(e) { activate(e) }, false);
  80. }
  81. }
  82.  
  83. function deinit() { }
  84.  
  85. function addToActive() {
  86. // console.log("addToActive");
  87. var list = document.getElementById("active_list");
  88. if (list == null) {
  89. // console.log("addToActive: "+scriptName+" waiting");
  90. if (startLimit < 10) {
  91. startLimit++;
  92. setTimeout(addToActive,1000);
  93. }
  94. return;
  95. }
  96.  
  97. var div = document.createElement("div");
  98. div.innerHTML = scriptName+" : "+scriptVersion;
  99. list.appendChild(div);
  100.  
  101. if (GM_getValue) {
  102. var data = GM_getValue(scriptName);
  103. if (data == null) {
  104. GM_setValue(scriptName,0+"\t"+scriptVersion);
  105. data = GM_getValue(scriptName);
  106. }
  107.  
  108. var date = parseInt(data.split("\t")[0]);
  109. var ver = data.split("\t")[1];
  110. console.log("Checking for update : "+scriptName+" ("+date+") ("+ver+")");
  111.  
  112. var delay = 12*60*60*1000;
  113. if (((new Date()).getTime() - parseInt(date)) > delay) {
  114. console.log("checking for new version");
  115. GM_getInetPage(scriptWebpage.replace("/show/","/source/") + ".meta.js", updateCheck);
  116. }
  117. else if (ver != scriptVersion) {
  118. console.log("using local version");
  119. updateCheck(null, null, ver);
  120. }
  121. else {
  122. console.log("too soon to check");
  123. }
  124. }
  125. }
  126.  
  127. function lock(e) {
  128. console.log("locked "+scriptName);
  129. lockTime = new Date();
  130.  
  131. var pd = unsafeWindow.play_data;
  132. if (pd == null) {
  133. console.log("no play_data: turn flash replays off?");
  134. }
  135.  
  136. var rrplay;
  137. if (e == null) {
  138. rrplay = document.getElementById("rrplay");
  139. }
  140. else {
  141. rrplay = e.target;
  142. }
  143. if (rrplay == null) {
  144. console.log("rrplay == null");
  145. return;
  146. }
  147.  
  148. var div = document.createElement("div");
  149. div.setAttribute("id",scriptName);
  150. rrplay.appendChild(div);
  151. }
  152.  
  153. function unlock() {
  154. var time = new Date() - lockTime;
  155. console.log("unlocked : "+scriptName+" : "+time.toFixed(0)+"ms");
  156. var div = document.getElementById(scriptName);
  157. if (div != null) div.parentNode.removeChild(div);
  158. }
  159.  
  160. function updateCheck(address, page, v) {
  161. console.log("updateCheck : loaded "+address);
  162. var version = null;
  163. if (address != null) {
  164. // console.log(page.responseText);
  165. version = page.responseText.split("@version")[1];
  166. version = version.split("/")[0];
  167. version = version.replace(/^\s*|\s*$/g,"");
  168. // console.log("'"+version+"'");
  169. GM_setValue(scriptName,(new Date().getTime().toString())+"\t"+version);
  170. }
  171. else {
  172. version = v;
  173. }
  174.  
  175. if (scriptVersion != version) {
  176. var div = document.getElementById("active_list");
  177. for (var i=0; i<div.childNodes.length; i++) {
  178. var c = div.childNodes[i];
  179. if (c.innerHTML.indexOf(scriptName) == 0) {
  180. c.innerHTML +=" &nbsp;(";
  181. var a = document.createElement("a");
  182. a.href = scriptWebpage;
  183. a.innerHTML = version+" available";
  184. c.appendChild(a);
  185. c.innerHTML +=")";
  186. }
  187. }
  188. }
  189. }
  190.  
  191. function arraySum(arr,start) {
  192. var total = 0;
  193. for (var i=start; i<arr.length; i++) {
  194. total += arr[i];
  195. }
  196. return total;
  197. }
  198.  
  199. function fixEscapedText(str) {
  200. var s = str;
  201. while (s.indexOf('"') != -1) {
  202. s = s.replace('"',"&quot;");
  203. }
  204. while (s.indexOf("'") != -1) {
  205. s = s.replace("'","&#39;");
  206. }
  207. return s;
  208. }
  209.  
  210. function trim(str) {
  211. var s = str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
  212. return s.replace(/\n/," ");
  213. }
  214.  
  215. function setCookie(c_name, value) {
  216. var strs = new Array();
  217. var v = btoa(escape(value));
  218. if (GM_setValue != null) {
  219. GM_setValue(c_name,v);
  220. //console.log("writing gmValue ("+value.length+" --> "+v.length+") :"+c_name+" ==> "+v);
  221. }
  222. else {
  223. var cw = c_name + "=" + v +";";
  224. document.cookie = cw;
  225. //console.log("writing cookie ("+value.length+" --> "+v.length+") :"+c_name+" ==> "+v);
  226. }
  227. }
  228.  
  229. function getCookie(c_name) {
  230. if (GM_getValue != null) {
  231. var s = GM_getValue(c_name,"");
  232. // console.log(c_name+" --> '"+s+"'");
  233. return unescape(atob(s));
  234. }
  235. else {
  236. var start = document.cookie.indexOf(c_name+"=");
  237. if (start != -1) {
  238. console.log(document.cookie);
  239. var s = document.cookie.slice(start+(c_name+"=").length);
  240. s = s.slice(0,s.indexOf(";"));
  241. var c = s;
  242. // console.log(c_name+" --> '"+s+"'");
  243. return unescape(atob(s));
  244. }
  245. else {
  246. console.log("cookie not set");
  247. }
  248. }
  249. return null;
  250. }
  251.  
  252. function rangeCheck(arr, i) {
  253. if (i < 0) return false;
  254. if (i >= arr.length) return false;
  255. return true;
  256. }
  257.  
  258. function findChild(id,node) {
  259. if (node.id+"" == id+"") {
  260. return node;
  261. }
  262. //for each (var c in node.childNodes) {
  263. for (var i=0; i<node.childNodes.length; i++) {
  264. var c = node.childNodes[i];
  265. var r = findChild(id,c);
  266. if (r != null) {
  267. return r;
  268. }
  269. }
  270. return null;
  271. }
  272.  
  273. function getInetPage(address, func, target) {
  274. console.log("getInetPage : "+address);
  275. var req = new XMLHttpRequest();
  276. req.open( 'GET', address, true );
  277. req.onreadystatechange = function() {
  278. if (target != null) {
  279. var d = ["..","...","."];
  280. var str = target.innerHTML.split(" ");
  281. target.innerHTML = str[0]+" "+d[str[1].length-1];
  282. }
  283. };
  284. req.onload = function() {
  285. if (this.status != 200) {
  286. alert("pbr gm script: Error "+this.status+" loading "+address);
  287. }
  288. else {
  289. console.log("loaded: "+address)
  290. func(address,this);
  291. }
  292. };
  293.  
  294. req.send(null);
  295. return req;
  296. }
  297.  
  298. function GM_getInetPage(address, func, target) {
  299. console.log("GM_getInetPage : "+address);
  300. GM_xmlhttpRequest({
  301. method: 'GET',
  302. url: address,
  303. headers: {
  304. 'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
  305. 'Accept': 'application/atom+xml,application/xml,text/xml',
  306. },
  307. onload: function(page) {
  308. console.log("loaded: "+address)
  309. func(address,page);
  310. }
  311. });
  312. }
  313.