KoCByte

A Kingdoms of Camelot Mod

当前为 2016-05-05 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name KoCByte
  3. // @version 0.4
  4. // @description A Kingdoms of Camelot Mod
  5. // @namespace kocbyte.com
  6. // @icon http://www.gravatar.com/avatar/f93cdced9c9b863a7d9e4b9988886015
  7. // @include http://www.kocbyte.therealmsbeyond.com/*
  8. // @include https://www.kocbyte.therealmsbeyond.com/*
  9. // @include *.kingdomsofcamelot.com/fb/e2/src/main_src.php*
  10. // @include http://*
  11. // @grant unsafeWindow
  12. // @grant GM_getValue
  13. // @grant GM_setValue
  14. // @grant GM_deleteValue
  15. // @grant GM_xmlhttpRequest
  16. // @grant GM_openInTab
  17. // @grant GM_log
  18. // @grant GM_listValues
  19. // @grant GM_getResourceText
  20. // @grant GM_addStyle
  21. // @grant GM_registerMenuCommand
  22. // @require http://code.jquery.com/jquery-latest.min.js
  23. // @resource foundation https://www.kocbyte.therealmsbeyond.com/client/style.css
  24. // ==/UserScript==
  25.  
  26. //============================================================================
  27.  
  28. var fdtn = GM_getResourceText("foundation");
  29. GM_addStyle(fdtn);
  30.  
  31. var uW = unsafeWindow;
  32. var Tabs = {};
  33. var mainPop;
  34. var kbPopUpTopClass = 'kbPopTop';
  35.  
  36. var Options = {
  37. kbWinIsOpen: false,
  38. currentTab: 'Mod',
  39. };
  40.  
  41. var kb = {
  42. uid: 0,
  43. name: '',
  44. domain: 0,
  45. allianceId: 0,
  46. allianceName: '',
  47. misted: 0,
  48. cities: [],
  49. domains: [],
  50. seed: null,
  51. authedSites: null,
  52. currentUrl: document.location.toString(),
  53. currentWebFolder: document.location.host+document.location.pathname.replace(/\\/g, '/').replace(/\/[^\/]*\/?$/, '')+'/',
  54. removedMixPanel: false,
  55. site: 'http://www.kocbyte.therealmsbeyond.com/',
  56. url: 'http://www.kocbyte.therealmsbeyond.com/ajax/listener.php',
  57. storagePrefix: 'KoCByte_',
  58. citiesSaved: '',
  59. citiesLastSent: 0,
  60. sendInfoDelay: 1000*60*60*6,
  61. sendSeedDelay: 1000*60*60*24,
  62. updateCheckDelay: 1000*60*60*24,
  63. scriptId: 19269,
  64. scriptVer: 0.2,
  65. sendInfoTimer: null,
  66. taskTimer: null,
  67. imgs: [],
  68. generateRandomNumber: function(min, max){
  69. if(min >= max){
  70. return null;
  71. }else{
  72. return Math.round(min+((max-min)*Math.random()));
  73. }
  74. },
  75. createUrl: function(page){
  76. return 'https://www'+(uW.g_server)+'.kingdomsofcamelot.com/fb/e2/src/'+page;
  77. },
  78. createAjaxUrl: function(page){
  79. return 'https://www'+(uW.g_server)+'.kingdomsofcamelot.com/fb/e2/src/ajax/'+page+'.php';
  80. },
  81. getAjaxParams: function(){
  82. if(uW && uW.g_ajaxparams){
  83. return JSON.parse(JSON.stringify(uW.g_ajaxparams));
  84. }
  85. },
  86. setValueObject: function(k, v){
  87. v = JSON.stringify(v);
  88. GM_setValue(k, v);
  89. },
  90. getValueObject: function(k, dv){
  91. var v = GM_getValue(k, dv);
  92. if(!v || v === undefined){
  93. return null;
  94. }
  95. v = JSON.parse(v);
  96. if(!v){
  97. if(!dv){
  98. v = null;
  99. }
  100. else{
  101. v = dv;
  102. }
  103. }
  104. return v;
  105. },
  106. setValue: function(k, v){
  107. GM_setValue(k, v);
  108. },
  109. getValue: function(k, dv){
  110. return(GM_getValue(k, dv));
  111. },
  112. deleteValue: function(k){
  113. GM_deleteValue(k);
  114. },
  115. getDomains: function(force){
  116. if(uW.g_ajaxparams){
  117. var now = new Date().getTime()*1;
  118. var wait = 86400000;//1 day
  119. var k = kb.storagePrefix+'getDomains_lastcheck';
  120. var lastsent = kb.getValue(k,0);
  121. if(force || 1*lastsent+wait < now){
  122. var args = {};
  123. args.v2 = true;
  124. var json = kb.sendToKabam(args,'myServers',null,true);
  125. if(json && json.selectableServers && json.selectableServers.servers){
  126. var domains = [];
  127. for(var i in json.selectableServers.servers){
  128. var d = json.selectableServers.servers[i].serverId;
  129. domains.push(1*d);
  130. }
  131. domains.sort();
  132. kb.log('getDomains();');
  133. kb.setValue(''+k,''+now);
  134. return domains;
  135. }
  136. }else{
  137. var playerdomains=kb.getValue('domains');
  138. if(!playerdomains){
  139. playerdomains = [];
  140. playerdomains.push(1*kb.domain);
  141. return playerdomains;
  142. }else{
  143. return JSON.parse(''+playerdomains);
  144. }
  145. }
  146. }
  147. },
  148. getSavedInfo: function(){
  149. return(kb.getValue('ajaxparams', null));
  150. },
  151. getSavedServerId: function(){
  152. return(kb.getValue('sid'));
  153. },
  154. getCurrentCityId: function(){
  155. if(uW && uW.currentcityid){
  156. return JSON.parse(JSON.stringify(uW.currentcityid));
  157. }
  158. },
  159. getCities: function(){
  160. var seed = kb.getSeed();
  161. if(seed && seed.cities){
  162. return JSON.parse(JSON.stringify(seed.cities));
  163. }
  164. },
  165. gameInfoSave: function(){
  166. if(uW && uW.seed){
  167. kb.setValue('domain', kb.domain);
  168. kb.setValue('uid', kb.uid);
  169. kb.setValue('name', kb.name);
  170. kb.setValue('allianceId', kb.allianceId);
  171. kb.setValue('allianceName', kb.allianceName);
  172. kb.setValue('misted', kb.misted);
  173. kb.setValueObject('cities', kb.cities);
  174. kb.setValueObject('domains', kb.domains);
  175.  
  176. var current = null;
  177. var saved = null;
  178. var tmp = null;
  179. var thekey = '';
  180. //seed
  181. tmp = [];
  182. for(var i in kb.seed){
  183. thekey = kb.storagePrefix+'SEED_'+i;
  184. kb.setValueObject(thekey,kb.seed[i]);
  185. tmp.push(i);
  186. //console.log(kb.getValueObject(thekey));
  187. }
  188. kb.setValueObject(kb.storagePrefix+'SEEDKEYS',tmp);
  189. //cities
  190. current = kb.getValueObject('cities');
  191. thekey = kb.storagePrefix+'CITIES';
  192. saved = kb.getValueObject(thekey);
  193. if(current != saved){
  194. kb.setValueObject( kb.storagePrefix+'CITIES',current);
  195. }
  196. kb.setValueObject('acctIds', kb.acctIds);
  197. }
  198. },
  199. gameInfoLoad: function(){
  200. if(uW && uW.seed){
  201. kb.uid = kb.getUserId();
  202. kb.name = kb.getUserName();
  203. kb.domain = kb.getServerId();
  204. kb.domains = kb.getDomains();
  205. kb.allianceId = kb.getPlayerAllianceId();
  206. kb.allianceName = kb.getPlayerAllianceName();
  207. kb.misted = kb.getPlayerMist();
  208. kb.cities = kb.getCities();
  209. kb.authedSites = kb.authorizedWebsiteGet();
  210. kb.storagePrefix = kb.uid+'_'+kb.domain+'_';
  211. kb.seed = kb.getSeed();
  212. kb.acctIds = kb.getSavedUserIds(kb.uid);
  213. }else{
  214. kb.uid = kb.getValue('uid');
  215. kb.name = kb.getValue('name');
  216. kb.domain = kb.getValue('domain');
  217. kb.domains = kb.getValueObject('domains');
  218. kb.allianceId = kb.getValue('allianceId');
  219. kb.allianceName = kb.getValue('allianceName');
  220. kb.misted = kb.getValue('misted');
  221. kb.cities = kb.getValueObject('cities');
  222. kb.authedSites = kb.authorizedWebsiteGet();
  223. kb.storagePrefix = kb.uid+'_'+kb.domain+'_';
  224.  
  225. //the seed is too large to store as one string so we have to reassemble
  226. kb.seed = {};
  227. kb.seedKEYS = kb.getValueObject(kb.storagePrefix+'SEEDKEYS');
  228. if(kb.seedKEYS){
  229. var prefix = kb.storagePrefix+'SEED_';
  230. var k='';
  231. for(var i in kb.seedKEYS){
  232. k = kb.seedKEYS[i];
  233. kb.seed[k] = JSON.parse(kb.getValue(prefix+k));
  234. }
  235. }
  236. kb.acctIds = kb.getSavedUserIds();
  237. }
  238. },
  239. getServerId: function(){
  240. if(uW && uW.g_server){
  241. return (1*uW.g_server);
  242. }
  243. },
  244. getSavedUserIds: function(uid){
  245. var uids = kb.getValueObject('acctIds',[uid]);
  246. if(uid){
  247. if(!$.inArray(uid,uids)){
  248. uids.push(uid);
  249. }
  250. }
  251. return uids;
  252. },
  253. getUserId: function(){
  254. if(uW && uW.g_ajaxparams && uW.g_ajaxparams.tvuid){
  255. return JSON.parse(JSON.stringify(uW.g_ajaxparams.tvuid));
  256. }
  257. },
  258. getUserName: function(){
  259. if(uW && uW.seed && uW.seed.player && uW.seed.player.name){
  260. return JSON.parse(JSON.stringify(uW.seed.player.name));
  261. }
  262. },
  263. getSeed: function(){
  264. if(uW && uW.seed){
  265. return JSON.parse(JSON.stringify(uW.seed));
  266. }
  267. },
  268. getPlayerAllianceId: function(){
  269. if(uW && uW.seed && uW.seed.allianceDiplomacies && uW.seed.allianceDiplomacies.allianceId){
  270. return JSON.parse(JSON.stringify(uW.seed.allianceDiplomacies.allianceId));
  271. }
  272. return 0;
  273. },
  274. getPlayerAllianceName: function(){
  275. if(uW && uW.seed && uW.seed.allianceDiplomacies && uW.seed.allianceDiplomacies.allianceName){
  276. return JSON.parse(JSON.stringify(uW.seed.allianceDiplomacies.allianceName));
  277. }
  278. return '';
  279. },
  280. getPlayerMist: function(){
  281. var result=0;
  282. if(uW && uW.seed && uW.seed.playerEffects && uW.seed.playerEffects.fogExpire){
  283. result = uW.seed.playerEffects.fogExpire;
  284. var timestamp = Math.floor(new Date().getTime()/1000);
  285. if(timestamp > result){
  286. result=0;
  287. }
  288. }
  289. return JSON.parse(JSON.stringify(result));
  290. },
  291. blockList: function(left, top, width){
  292. var grids = 3;
  293. var bl = [];
  294. for(var x=0; x<grids; x++){
  295. var xx = left + (x*5);
  296. if(xx > 745)
  297. xx -= 750;
  298. for(var y=0; y<grids; y++){
  299. var yy = top + (y*5);
  300. if(yy > 745)
  301. yy -= 750;
  302. bl.push ('bl_'+ xx +'_bt_'+ yy);
  303. }
  304. }
  305. return bl.join("%2C");
  306. },
  307. sendToKB: function(type,payload,callback){
  308. var url = kb.url;
  309. var obj = {};
  310. kb.log('building the object to send');
  311. if(type == 'info'){
  312. obj = {
  313. domain: (1*uW.g_server),
  314. uid: uW.g_ajaxparams.tvuid,
  315. name: uW.seed.player.name,
  316. prefix: uW.seed.player.prefix,
  317. might: uW.seed.player.might,
  318. glory: uW.seed.player.glory,
  319. gloryMax: uW.seed.player.maxGlory,
  320. alliance: {
  321. id: uW.seed.allianceDiplomacies.allianceId,
  322. name: uW.seed.allianceDiplomacies.allianceName
  323. },
  324. misted: (kb.getPlayerMist()) ? true : false,
  325. data: payload,
  326. wilds: uW.seed.wilderness,
  327. cities: uW.seed.cities,
  328. };
  329. }
  330. if(type == 'map'){
  331. var rawData = [];
  332. for(var i = 0; i < kb.cities.length; i++){
  333. var x = kb.cities[i][2];
  334. var y = kb.cities[i][3];
  335. var width = 75;
  336. var left = parseInt(x / 5) * 5;
  337. var top = parseInt(y / 5) * 5;
  338. width = parseInt((width+4) / 5) * 5;
  339. var blockString = kb.blockList(left, top, width);
  340. var params = uW.Object.clone(uW.g_ajaxparams);
  341. params.blocks = blockString;
  342. var block = kb.sendToKabam(params,'fetchMapTiles',null);
  343. rawData.push(block);
  344. }
  345. var alliances = {};
  346. var users = {};
  347. var tiles = {};
  348. tiles.city = {};
  349. tiles.wild = {};
  350. for(var a = 0; a < rawData.length; a++){
  351. var allis = JSON.parse(JSON.stringify(rawData[a].allianceNames));
  352. $.each(allis, function(k, v){
  353. var key = k.replace(/^a/, '');
  354. alliances[key] = v;
  355. });
  356. var us = JSON.parse(JSON.stringify(rawData[a].userInfo));
  357. $.each(us, function(u, uData){
  358. var uid = u.replace(/^u/, '');
  359. users[uid] = {
  360. might: uData.m,
  361. prefix: (uData.s == 'M') ? 'Lord' : 'Lady',
  362. name: uData.n,
  363. alliance: uData.a
  364. };
  365. });
  366. var theTiles = JSON.parse(JSON.stringify(rawData[a].data));
  367. $.each(theTiles, function(t, tData){
  368. if(tData.cityNum){ // is a city
  369. tiles.city[tData.tileCityId] = {
  370. owner: tData.tileUserId,
  371. x: tData.xCoord,
  372. y: tData.yCoord,
  373. name: tData.cityName,
  374. province: tData.tileProvinceId,
  375. misted: tData.misted,
  376. tid: tData.tileId
  377. };
  378. }else{ // not a city
  379. if(tData.tileUserId !== null && tData.tileUserId !== undefined && tData.tileUserId !== 0){ // if it's not owned, we don't care
  380. tiles.wild[tData.tileId] = {
  381. owner: tData.tileUserId,
  382. city: tData.tileCityId,
  383. x: tData.xCoord,
  384. y: tData.yCoord,
  385. province: tData.tileProvinceId,
  386. misted: tData.misted,
  387. level: tData.tileLevel,
  388. type: tData.tileType,
  389. };
  390. }
  391. }
  392. });
  393. }
  394. obj = {
  395. a: alliances,
  396. u: users,
  397. t: tiles,
  398. domain: (1*uW.g_server),
  399. };
  400. }
  401. if(type == 'seed'){
  402. obj = payload;
  403. }
  404. kb.log('do the send thing: GM_xmlhttpRequest');
  405. var args='mode='+type+'&data='+encodeURIComponent(JSON.stringify(obj));
  406. GM_xmlhttpRequest({
  407. "method": 'POST',
  408. "url": url,
  409. "data": args,
  410. "headers": {
  411. "Content-type" : "application/x-www-form-urlencoded"
  412. },
  413. "onreadystatechange": function(r) {
  414. },
  415. "onload": function(r) {
  416. if(r && r.status!=200){
  417. var s='';
  418. s=s+"\n"+'url='+url;
  419. s=s+"\n"+'data='+JSON.stringify(obj);
  420. if(r.status){s=s+"\n"+'status:'+r.status;}
  421. if(r.statusText){s=s+"\n"+'statusText'+r.statusText;}
  422. if(r.responseHeaders){s=s+"\n"+'responseHeaders'+r.responseHeaders;}
  423. if(r.responseText){s=s+"\n"+'responseText'+r.responseText;}
  424. if(r.readyState){s=s+"\n"+'readyState'+r.readyState;}
  425. kb.log(s);
  426. }
  427. if(callback) {
  428. callback(r);
  429. }
  430. }
  431. });
  432. },
  433. sendToKabam: function(args,page,callback){
  434. var async = false;
  435. var data = JSON.parse(JSON.stringify(uW.g_ajaxparams));
  436. for(var i in args){
  437. data[i] = args[i];
  438. }
  439. var url = kb.createAjaxUrl(page);
  440. var str = '';
  441. for(var k in data){
  442. str = str+'&'+k+'='+data[k];
  443. }
  444. str = str.substr(1);
  445. if(callback){
  446. async = true;
  447. }
  448. var result = null;
  449. $.ajax({
  450. 'type': "POST",
  451. 'url': url,
  452. 'data': str,
  453. 'async': async,
  454. 'success': function(str){
  455. result = JSON.parse(str);
  456. if(!result){
  457. result = str;
  458. }
  459. }
  460. });
  461. return result;
  462. },
  463. saveInfo: function(){
  464. var info = JSON.stringify(kb.getCurrentInfo());
  465. if(info){
  466. var sid = kb.getServerId();
  467. kb.setValue('ajaxparams',info);
  468. kb.setValue('sid',sid);
  469. }
  470. },
  471. sendInfo: function(force){
  472. if(uW.g_ajaxparams && uW.g_server){
  473. kb.log('checking if time to send');
  474. var now = new Date().getTime();
  475. var k = kb.storagePrefix+'lastsent_ajaxparams';
  476. var lastsent = kb.getValue(k,0);
  477. if(force || 1*lastsent+kb.sendInfoDelay<now){
  478. kb.log('sending');
  479. var savedkey = kb.storagePrefix+'saved_ajaxparams';
  480. var saved = JSON.parse(kb.getValue(savedkey,null));
  481. var json = kb.getAjaxParams();
  482. if(force || saved != json){
  483. kb.setValue(k,''+now+'');
  484. kb.setValue(savedkey,''+JSON.stringify(json));
  485. kb.sendToKB('info',json);
  486. kb.sendToKB('map', json);
  487. kb.log('send_info() complete.');
  488. }
  489. }
  490. }
  491. },
  492. sendSeed: function(force){
  493. if(uW.g_ajaxparams && uW.g_server){
  494. var now = new Date().getTime();
  495. var k = kb.storagePrefix+'lastsent_seed';
  496. var lastsent = kb.getValue(k,0);
  497. if(force || 1*lastsent+kb.sendSeedDelay<now){
  498. kb.setValue(k,''+now+'');
  499. var json = kb.getSeed();
  500. kb.sendToKB('seed',json);
  501. kb.log('send_seed();');
  502. }
  503. }
  504. },
  505. doTask: function(){
  506. var now = new Date().getTime();
  507. kb.setValue('lasttaskrun',''+now+'');
  508. kb.setValue('currentdomain',''+kb.getServerId()+'');
  509. var command = kb.getValue('command', '');
  510. if (command !== '') {
  511. kb.setValue('command','');
  512. kb.log('command=' + command);
  513. var x = 0;
  514. var y = 0;
  515. var cmd = command.split('|');
  516. var s = cmd.shift();
  517. var type = cmd.shift();
  518. if(!s || s==='' || 1*s===kb.domain){
  519. switch (type) {
  520. case 'evalscript':
  521. kb.scriptAdd(cmd[0]);
  522. break;
  523. case 'includescript':
  524. kb.scriptInclude(cmd[0]);
  525. break;
  526. case 'location':
  527. x = kb.sanatizeInt(cmd[0]);
  528. y = kb.sanatizeInt(cmd[1]);
  529. kb.mapMove(x,y);
  530. break;
  531. case 'setbookmark':
  532. x = kb.sanatizeInt(cmd[0]);
  533. y = kb.sanatizeInt(cmd[1]);
  534. var n = 'loc';
  535. if(cmd[2]){
  536. n = kb.sanatizeString(cmd[2]);
  537. }
  538. kb.bookmarkAdd(x,y,n);
  539. break;
  540. case 'deletebookmark'://does not work
  541. x = kb.sanatizeInt(cmd[0]);
  542. y = kb.sanatizeInt(cmd[1]);
  543. kb.bookmarkDelete(x,y);
  544. break;
  545. default:
  546. break;
  547. }
  548. }
  549. }
  550. },
  551. showTime: function(timestamp,version){
  552. var now = null;
  553. if(timestamp){
  554. now = new Date(timestamp);
  555. }else{
  556. now = new Date();
  557. }
  558. var hours = now.getHours();
  559. var minutes = now.getMinutes();
  560. var seconds = now.getSeconds();
  561. var timeValue = "" + ((hours >12) ? hours -12 :hours);
  562. if (timeValue == "0") timeValue = 12;
  563. timeValue += ((minutes < 10) ? ":0" : ":") + minutes;
  564. timeValue += ((seconds < 10) ? ":0" : ":") + seconds;
  565. timeValue += (hours >= 12) ? " PM" : " AM";
  566. return timeValue;
  567. },
  568. log: function(msg,targetId,replaceIt){
  569. var consoleStr = 'KoCByte: '+kb.domain+' @ '+kb.showTime()+': '+msg;
  570. uW.console.log(consoleStr);
  571. var elem = null;
  572. if(targetId){
  573. elem = $('#'+targetId);
  574. }else{
  575. elem = $('#'+kb.elemPrefix+'-tabs-kocbyte-log-generic-result');
  576. }
  577. if(elem && elem.length == 1){
  578. var html = '';
  579. var type = $.type(msg);
  580. if(type == 'string'){
  581. msg.replace(/</gi,"&lt;");
  582. msg.replace(/>/gi,"&gt;");
  583. html = '<div>'+kb.showTime()+' '+msg+'</div>';
  584. }else{
  585. msg = JSON.stringify(msg,null,"\t");
  586. msg = msg.replace(/</gi,'&lt;');
  587. msg = msg.replace(/>/gi,'&gt;');
  588. html = '<pre>'+kb.showTime()+"\n"+msg+'</pre>';
  589. }
  590. if(replaceIt == 1){
  591. elem.html(html);
  592. }else{
  593. var n = elem.children().length;
  594. if(n > 30){
  595. elem.children(':last').remove();
  596. }
  597. elem.prepend(html);
  598. }
  599. }
  600. },
  601. authorizedWebsiteGet: function(){
  602. var websites = JSON.parse(''+kb.getValue('authedSites',null));
  603. if(!websites){
  604. websites = ['www.kocbyte.therealmsbeyond.com'];
  605. }
  606. if($.inArray($(websites),'www.kocbyte.therealmsbeyond.com') != -1){
  607. websites.push('www.kocbyte.therealmsbeyond.com');
  608. }
  609. return websites;
  610. },
  611. authorizedWebsiteAdd: function(url){
  612. var websites = JSON.parse(''+kb.getValue('authedSites',null));
  613. if(!websites){
  614. websites = ['www.kocbyte.therealmsbeyond.com'];
  615. }
  616. if($.inArray($(websites),url) > -1){
  617. websites.push(url);
  618. var sites = websites.filter(function(elem, pos) {
  619. return websites.indexOf(elem) == pos;
  620. });
  621. kb.setValue('authedSites',''+JSON.stringify(sites));
  622. return true;
  623. }else{
  624. return false;
  625. }
  626. }
  627. };
  628.  
  629. kb.imgs[0]='data:image/png;base64,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';
  630.  
  631. var AutoUpdater = {
  632. id: 19269,
  633. URL: 'https://greasyfork.org/en/scripts/19269-kocbyte/code/KoCByte.user.js',
  634. name: 'KoCByte',
  635. homepage: 'https://greasyfork.org/en/scripts/19269-kocbyte',
  636. version: kb.scriptVer,
  637. call: function(response) { kb.log("Checking for "+this.name+" Update!");
  638. var _s = this;
  639. GM_xmlhttpRequest({
  640. method: 'GET',
  641. url: _s.URL,
  642. onload: function(xpr) {_s.compare(xpr,response);},
  643. onerror: function(xpr) {_s.compare({responseText:""},response);}
  644. });
  645. },
  646. compareVersion: function(remoteVer, localVer) {
  647. return (parseInt(remoteVer) > parseInt(localVer)) ? true :false;
  648. },
  649. compare: function(xpr,response) {
  650. this.xversion=(/@version\s*(.*?)\s*$/m.exec(xpr.responseText));
  651. if(this.xversion){
  652. this.xversion = this.xversion[1];
  653. }else{
  654. if(response){
  655. uW.Modal.showAlert('<div align="center">Unable to check for updates to '+this.name+'.<br>Please change the update options or visit the<br><a href="'+this.homepage+'" target="_blank">script homepage</a></div>');
  656. }
  657. kb.log("Unable to check for updates");
  658. return;
  659. }
  660. this.xrelnotes=/\/\/\s*@releasenotes\s+(.+)\s*\n/i.exec(xpr.responseText);
  661. if (this.xrelnotes) this.xrelnotes = this.xrelnotes[1];
  662. var updated = this.compareVersion(this.xversion, this.version);
  663. if (updated) {
  664. kb.log('New Version Available!');
  665. var body = '<BR><DIV align=center><FONT size=3><B>New version '+this.xversion+' is available!</b></font></div><BR>';
  666. if (this.xrelnotes){
  667. body+='<BR><div align="center" style="border:0;width:470px;height:120px;max-height:120px;overflow:auto"><b>New Features!</b><p>'+this.xrelnotes+'</p></div><BR>';
  668. }
  669. body+='<BR><DIV align=center><a class="gemButtonv2 green" id="doBotUpdate">Update</a></div>';
  670. this.ShowUpdate(body);
  671. }else{
  672. kb.log("No updates available");
  673. if(response){
  674. uW.Modal.showAlert('<div align="center">No updates available for '+this.name+' at this time.</div>');
  675. }
  676. }
  677. },
  678. check: function() {
  679. var now = uW.unixtime();
  680. var lastCheck = 0;
  681. if (GM_getValue('updated_'+this.id, 0)) lastCheck = parseInt(GM_getValue('updated_'+this.id, 0));
  682. if (now > (lastCheck + 60*1)) this.call(false);
  683. },
  684. ShowUpdate: function (body) {
  685. var now = uW.unixtime();
  686. setUpdate = function(){
  687. GM_setValue('updated_'+AutoUpdater.id, now);
  688. };
  689. kb.modal(this.name, body, setUpdate);
  690. document.getElementById('doBotUpdate').addEventListener('click', this.doUpdate, false);
  691. },
  692. doUpdate: function () {
  693. uW.cm.ModalManager.closeAll();
  694. uW.cm.ModalManager.close();
  695. var now = uW.unixtime();
  696. GM_setValue('updated_'+AutoUpdater.id, now);
  697. GM_openInTab(AutoUpdater.URL);
  698. },
  699. };
  700.  
  701. var tabManager = {
  702. tabList : {}, // {name, obj, div}
  703. currentTab : null,
  704. init: function(mainDiv){
  705. var t = tabManager;
  706. var sorter = [];
  707. for(var k in Tabs){
  708. if(!Tabs[k].tabDisabled){
  709. t.tabList[k] = {};
  710. t.tabList[k].name = k;
  711. t.tabList[k].obj = Tabs[k];
  712. if(Tabs[k].tabLabel != null)
  713. t.tabList[k].label = Tabs[k].tabLabel;
  714. else
  715. t.tabList[k].label = k;
  716. if(Tabs[k].tabOrder != null)
  717. sorter.push([Tabs[k].tabOrder, t.tabList[k]]);
  718. else
  719. sorter.push([1000, t.tabList[k]]);
  720. t.tabList[k].div = document.createElement('div');
  721. }
  722. }
  723.  
  724. sorter.sort (function (a,b){return a[0]-b[0];});
  725. var m = '<table cellspacing="3" class="kbMainTab"><tr>';
  726. for (var i=0; i<sorter.length; i++) {
  727. m += '<td class="spacer"></td><td align="center" class="notSel" id="kbtc'+ sorter[i][1].name +'"><a><span>'+ sorter[i][1].label +'</span></a></td>';
  728. //m += '<td align="center" class="notSel" id="kbtc'+ sorter[i][1].name +'"><a><span>'+ sorter[i][1].label +'</span></a></td>';
  729. if((i+1)%9 === 0) m+='</tr><tr>';
  730. }
  731. m+='</tr></table>';
  732. //m += '<td class=spacer width=90% align=right>'+ Version +'&nbsp;</td></tr></table>';
  733. mainPop.getMainTopDiv().innerHTML = m;
  734. for(var n in t.tabList){
  735. if(t.tabList[n].name == Options.currentTab)
  736. t.currentTab = t.tabList[n] ;
  737. document.getElementById('kbtc'+ n).addEventListener('click', this.e_clickedTab, false);
  738. var div = t.tabList[n].div;
  739. div.style.display = 'none';
  740. div.style.height = '100%';
  741. uW.console.log(div);
  742. mainDiv.appendChild(div);
  743. try{
  744. t.tabList[n].obj.init(div);
  745. }catch(e){
  746. div.innerHTML = "INIT ERROR: "+ e;
  747. }
  748. }
  749. if(t.currentTab == null)
  750. t.currentTab = sorter[0][1];
  751. t.setTabStyle (document.getElementById('kbtc'+ t.currentTab.name), true);
  752. t.currentTab.div.style.display = 'block';
  753. },
  754. hideTab: function(){
  755. var t = tabManager;
  756. t.currentTab.obj.hide();
  757. },
  758. showTab: function(){
  759. var t = tabManager;
  760. t.currentTab.obj.show();
  761. },
  762. setTabStyle: function(e, selected){
  763. if(selected){
  764. e.className = 'sel';
  765. } else {
  766. e.className = 'notSel';
  767. }
  768. },
  769. e_clickedTab : function(e){
  770. var t = tabManager;
  771. var newTab = t.tabList[e.target.parentNode.parentNode.id.substring(4)];
  772. if(t.currentTab.name != newTab.name){
  773. t.setTabStyle(document.getElementById ('kbtc'+ t.currentTab.name), false);
  774. t.setTabStyle(document.getElementById ('kbtc'+ newTab.name), true);
  775. t.currentTab.obj.hide ();
  776. t.currentTab.div.style.display = 'none';
  777. t.currentTab = newTab;
  778. newTab.div.style.display = 'block';
  779. Options.currentTab = newTab.name;
  780. }
  781. newTab.obj.show();
  782. },
  783. };
  784.  
  785. var WinManager = {
  786. wins: {}, // prefix : kbPopup obj
  787. didHide: [],
  788. get: function(prefix){
  789. var t = WinManager;
  790. return t.wins[prefix];
  791. },
  792. add: function(prefix, pop){
  793. var t = WinManager;
  794. t.wins[prefix] = pop;
  795. if(uW.cpopupWins == null)
  796. uW.cpopupWins = {};
  797. uW.cpopupWins[prefix] = pop;
  798. },
  799. hideAll: function(){
  800. var t = WinManager;
  801. t.didHide = [];
  802. for(var k in t.wins){
  803. if(t.wins[k].isShown()){
  804. t.didHide.push (t.wins[k]);
  805. t.wins[k].show (false);
  806. }
  807. }
  808. },
  809. restoreAll: function(){
  810. var t = WinManager;
  811. for(var i=0; i<t.didHide.length; i++)
  812. t.didHide[i].show(true);
  813. },
  814. delete: function(prefix){
  815. var t = WinManager;
  816. delete t.wins[prefix];
  817. delete uW.cpopupWins[prefix];
  818. }
  819. };
  820.  
  821. // creates a 'popup' div
  822. // prefix must be a unique (short) name for the popup window
  823. function kbPopup(prefix, x, y, width, height, onClose) {
  824. var pop = WinManager.get(prefix);
  825. if(pop){
  826. pop.show (false);
  827. return pop;
  828. }
  829. this.BASE_ZINDEX = 111111;
  830. // protos ...
  831. this.show = show;
  832. this.toggleHide = toggleHide;
  833. this.getTopDiv = getTopDiv;
  834. this.getMainTopDiv = getMainTopDiv;
  835. this.getMainDiv = getMainDiv;
  836. this.getJQMainDiv = getJQMainDiv;
  837. this.getLayer = getLayer;
  838. this.setLayer = setLayer;
  839. this.getLocation = getLocation;
  840. this.setLocation = setLocation;
  841. this.focusMe = focusMe;
  842. this.isShown = isShown;
  843. this.unfocusMe = unfocusMe;
  844. this.centerMe = centerMe;
  845. this.destroy = destroy;
  846. this.autoHeight = autoHeight;
  847. // object vars ...
  848. this.div = document.createElement('div');
  849. this.prefix = prefix;
  850. this.onClose = onClose;
  851. var t = this;
  852. this.div.className = 'kbPopup '+ prefix +'_kbPopup';
  853. this.div.id = prefix +'_outer';
  854. this.div.style.background = "#fff";
  855. this.div.style.zIndex = this.BASE_ZINDEX;
  856. this.div.style.display = 'none';
  857. this.div.style.width = width + 'px';
  858. this.div.style.height = height + 'px';
  859. this.div.style.maxHeight = height + 'px';
  860. this.div.style.overflowY = 'show';
  861. this.div.style.position = "absolute";
  862. this.div.style.top = y +'px';
  863. this.div.style.left = x + 'px';
  864. var topClass = '';
  865. if(kbPopUpTopClass==null)
  866. topClass = 'kbPopupTop '+ prefix +'_kbPopupTop';
  867. else
  868. topClass = kbPopUpTopClass +' '+ prefix +'_'+ kbPopUpTopClass;
  869. var m = '<table cellspacing=0 width=100% ><tr id="'+ prefix +'_bar" class="'+ topClass +'"><td width=99% valign=bottom><SPAN id="'+ prefix +'_top"></span></td>';
  870. m = m + '<td id='+ prefix +'_X align=right valign=middle onmouseover="this.style.cursor=\'pointer\'" style="color:#fff; background:#333; font-weight:bold; font-size:14px; padding:0px 5px; -moz-border-radius-topright: 20px;">x</td></tr>';
  871. m = m + '</table><table cellspacing=0 width=100% ><tr><td height=100% valign=top class="kbPopMain '+ prefix +'_kbPopMain" colspan=2 id="'+ prefix +'_main"></td></tr></table>';
  872. document.body.appendChild(this.div);
  873. this.div.innerHTML = m;
  874. document.getElementById(prefix+'_X').addEventListener ('click', e_XClose, false);
  875. this.div.addEventListener('mousedown', e_divClicked, false);
  876. WinManager.add(prefix, this);
  877. function e_divClicked(){
  878. t.focusMe();
  879. }
  880. function e_XClose(){
  881. t.show(false);
  882. if (t.onClose != null)
  883. t.onClose();
  884. }
  885. function autoHeight(onoff){
  886. if(onoff)
  887. t.div.style.height = '';
  888. else
  889. t.div.style.height = t.div.style.maxHeight;
  890. }
  891. function focusMe(){
  892. t.setLayer(5);
  893. for(var k in uW.cpopupWins){
  894. if(k != t.prefix)
  895. uW.cpopupWins[k].unfocusMe();
  896. }
  897. }
  898. function unfocusMe(){
  899. t.setLayer(-5);
  900. }
  901. function getLocation(){
  902. return {x: parseInt(this.div.style.left), y: parseInt(this.div.style.top)};
  903. }
  904. function setLocation(loc){
  905. t.div.style.left = loc.x +'px';
  906. t.div.style.top = loc.y +'px';
  907. }
  908. function destroy(){
  909. document.body.removeChild(t.div);
  910. WinManager.delete (t.prefix);
  911. }
  912. function centerMe(parent){
  913. var coords;
  914. if(parent == null){
  915. coords = getClientCoords(document.body);
  916. }else
  917. coords = getClientCoords(parent);
  918. var x = ((coords.width - parseInt(t.div.style.width)) / 2) + coords.x;
  919. var y = ((coords.height - parseInt(t.div.style.height)) / 2) + coords.y;
  920. if(x<0)
  921. x = 0;
  922. if(y<0)
  923. y = 0;
  924. t.div.style.left = x +'px';
  925. t.div.style.top = y +'px';
  926. }
  927. function setLayer(zi){
  928. t.div.style.zIndex = ''+ (this.BASE_ZINDEX + zi);
  929. }
  930. function getLayer(){
  931. return parseInt(t.div.style.zIndex) - this.BASE_ZINDEX;
  932. }
  933. function getTopDiv(){
  934. return document.getElementById(this.prefix+'_top');
  935. }
  936. function getMainDiv(){
  937. return document.getElementById(this.prefix+'_main');
  938. }
  939. function getJQMainDiv(){
  940. return $('#'+this.prefix+'_main');
  941. }
  942. function getMainTopDiv(){
  943. return document.getElementById(this.prefix+'_top');
  944. }
  945. function isShown (){
  946. return t.div.style.display == 'block';
  947. }
  948. function show(tf){
  949. if (tf){
  950. t.div.style.display = 'block';
  951. t.focusMe ();
  952. } else {
  953. t.div.style.display = 'none';
  954. }
  955. return tf;
  956. }
  957. function toggleHide(t){
  958. if (t.div.style.display == 'block') {
  959. return t.show (false);
  960. } else {
  961. return t.show (true);
  962. }
  963. }
  964. }
  965.  
  966. function getClientCoords(e){
  967. if (e==null)
  968. return {x:null, y:null, width:null, height:null};
  969. var ret = {x:0, y:0, width:e.clientWidth, height:e.clientHeight};
  970. while (e.offsetParent != null){
  971. ret.x += e.offsetLeft;
  972. ret.y += e.offsetTop;
  973. e = e.offsetParent;
  974. }
  975. return ret;
  976. }
  977.  
  978. function eventHideShow(){
  979. if(mainPop.toggleHide(mainPop)){
  980. tabManager.showTab();
  981. Options.kbWinIsOpen = true;
  982. } else {
  983. tabManager.hideTab();
  984. Options.kbWinIsOpen = false;
  985. }
  986. }
  987.  
  988. function createButton(label,id){
  989. var a=document.createElement('a');
  990. a.className='button20';
  991. a.id = id;
  992. a.innerHTML='<span style="color: #ff6">'+ label +'</span>';
  993. return a;
  994. }
  995.  
  996. function AddMainTabLink(text, eventListener, mouseListener){
  997. var a = createButton(text,'botbutton');
  998. a.className='tab';
  999. var tabs=document.getElementById('main_engagement_tabs');
  1000. if(!tabs){
  1001. tabs=document.getElementById('topnav_msg');
  1002. if(tabs)
  1003. tabs=tabs.parentNode;
  1004. }
  1005. if(tabs){
  1006. var e = tabs.parentNode;
  1007. var gmTabs = null;
  1008. for(var i=0; i<e.childNodes.length; i++){
  1009. var ee = e.childNodes[i];
  1010. if (ee.tagName && ee.tagName=='DIV' && ee.className=='tabs_engagement' && ee.id!='main_engagement_tabs'){
  1011. gmTabs = ee;
  1012. break;
  1013. }
  1014. }
  1015. if(gmTabs == null){
  1016. gmTabs = document.createElement('div');
  1017. gmTabs.className='tabs_engagement';
  1018. gmTabs.style.background='#ca5';
  1019. tabs.parentNode.insertBefore (gmTabs, tabs);
  1020. gmTabs.style.whiteSpace='nowrap';
  1021. gmTabs.style.width='735px';
  1022. gmTabs.lang = 'en_PB';
  1023. }
  1024. gmTabs.style.height='0%';
  1025. gmTabs.style.overflow='auto';
  1026. gmTabs.appendChild(a);
  1027. a.addEventListener('click',eventListener, false);
  1028. if(mouseListener != null)
  1029. a.addEventListener('mousedown',mouseListener, true);
  1030. return a;
  1031. }
  1032. return null;
  1033. }
  1034.  
  1035. Tabs.Mod = {
  1036. tabOrder: 1,
  1037. tabDisabled: false,
  1038. tabLabel: 'Mod',
  1039. myDiv: null,
  1040. timer: null,
  1041. init: function(div){ // called once, upon script startup
  1042. var t = Tabs.Mod;
  1043. t.myDiv = div;
  1044. var str = '';
  1045. str = str + '<div class="row">';
  1046. str = str + ' <div class="large-4 columns text-center">';
  1047. str = str + ' <strong>Mod</strong><br />';
  1048. str = str + ' <button id="'+kb.elemPrefix+'-main-update">Update</button>&nbsp;v<span id="'+kb.elemPrefix+'-main-version">'+kb.scriptVer+'</span>';
  1049. str = str + ' </div>';
  1050. str = str + ' <div class="large-4 columns end text-center">';
  1051. str = str + ' <strong>Website</strong><br />';
  1052. str = str + ' <button id="'+kb.elemPrefix+'-website-visit"><span>Visit Site</span></button><br />';
  1053. str = str + ' <button id="'+kb.elemPrefix+'-website-updateinfo"><span>Send Info</span></button>';
  1054. str = str + ' </div>';
  1055. str = str + '</div>';
  1056. str = str + '<div class="row">';
  1057. str = str + ' <div class="large-12 columns">';
  1058. str = str + ' &nbsp;';
  1059. str = str + ' </div>';
  1060. str = str + '</div>';
  1061. str = str + '<div class="row">';
  1062. str = str + ' <div class="large-12 columns">';
  1063. str = str + ' &nbsp;';
  1064. str = str + ' </div>';
  1065. str = str + '</div>';
  1066. str = str + '<div class="row">';
  1067. str = str + ' <div class="large-12 columns text-center">';
  1068. str = str + ' <strong>Log</strong>';
  1069. str = str + ' </div>';
  1070. str = str + '</div>';
  1071. str = str + '<div class="row">';
  1072. str = str + ' <div class="large-12 columns">';
  1073. str = str + ' <pre id="'+kb.elemPrefix+'-log-result">Log text goes here</pre>';
  1074. str = str + ' </div>';
  1075. str = str + '</div>';
  1076. str = str + '<div class="row">';
  1077. str = str + ' <div class="large-12 columns">';
  1078. str = str + ' &nbsp;';
  1079. str = str + ' </div>';
  1080. str = str + '</div>';
  1081. str = str + '<div class="row">';
  1082. str = str + ' <div class="large-12 columns">';
  1083. str = str + ' &nbsp;';
  1084. str = str + ' </div>';
  1085. str = str + '</div>';
  1086. str = str + '<div class="row">';
  1087. str = str + ' <div class="large-12 columns text-center">';
  1088. str = str + ' <strong>Debug</strong>';
  1089. str = str + ' </div>';
  1090. str = str + '</div>';
  1091. str = str + '<div class="row">';
  1092. str = str + ' <div class="large-12 columns">';
  1093. str = str + ' <pre id="'+kb.elemPrefix+'-debug-result">Debug text goes here</pre>';
  1094. str = str + ' </div>';
  1095. str = str + '</div>';
  1096. $container = mainPop.getJQMainDiv();
  1097. $container.html(str);
  1098. $('#'+kb.elemPrefix+'-main-update').click(function(){
  1099. AutoUpdater.check(false);
  1100. });
  1101. $('#'+kb.elemPrefix+'-website-updateinfo').click(function(){
  1102. kb.sendInfo(1);
  1103. });
  1104. $('#'+kb.elemPrefix+'-website-visit').click(function(){
  1105. GM_openInTab(kb.site);
  1106. });
  1107. },
  1108. hide: function(){ // called whenever the main window is hidden, or another tab is selected
  1109. var t = Tabs.Mod;
  1110. },
  1111. show: function(){ // called whenever this tab is shown
  1112. var t = Tabs.Mod;
  1113. },
  1114. };
  1115.  
  1116. function init(){
  1117. var styles = 'a.ptButton20 {color:#ffff80}';
  1118. styles = styles + ' table.kbMainTab { empty-cells: show; margin-left: 5px; margin-top: 4px; padding: 1px; padding-left:5px;}';
  1119. styles = styles + ' table.kbMainTab tr td a {color:inherit }';
  1120. styles = styles + ' table.kbMainTab tr td {height:60%; empty-cells:show; padding: 0px 4px 0px 4px; margin-top:5px; white-space:nowrap; border: 1px solid; border-style: none none solid none; -moz-border-radius:5px; }';
  1121. styles = styles + ' table.kbMainTab tr td.spacer {padding: 0px 0px;}';
  1122. styles = styles + ' table.kbMainTab tr td.notSel { color: #ffffff; font-size: 12px; font-weight:bold; -moz-border-radius: 10px; -moz-box-shadow: 0px 1px 3px #357544; text-shadow: -1px 1px 3px #666666; border: solid #615461 1px; background: -moz-linear-gradient(top, #6ff28e, #196b2c);}';
  1123. styles = styles + ' table.kbMainTab tr td.sel { color: #000000; font-size: 12px; font-weight:bold; -moz-border-radius: 10px; -moz-box-shadow: 0px 1px 3px #357544; text-shadow: -1px 1px 3px #CECECE; border: solid #615461 1px; background: -moz-linear-gradient(top, #6ff28e, #196b2c);}';
  1124. styles = styles + ' table.kbMainTab tr td:hover { color: #191919; font-size: 12px; font-weight:bold; text-shadow: -1px 1px 3px #CECECE; background: -moz-linear-gradient(top, #43cc7e, #20a129)}';
  1125. styles = styles + ' tr.kbPopTop td { background-color:transparent; border:none; height: 21px; padding:0px;}';
  1126. styles = styles + ' tr.kbretry_kbPopTop td { background-color:#a00; color:#fff; border:none; height: 21px; padding:0px; }';
  1127. styles = styles + ' tr.kbMainPopTop td { background-color:#ded; border:none; height: 42px; width:80%; padding:0px; }';
  1128. styles = styles + ' tr.kbretry_kbMainPopTop td { background-color:#a00; color:#fff; border:none; height: 42px; padding:0px; }';
  1129. styles = styles + ' .kbPopMain { border:1px solid #000000; -moz-box-shadow:inset 0px 0px 10px #6a6a6a; -moz-border-radius-bottomright: 20px; -moz-border-radius-bottomleft: 20px;}';
  1130. styles = styles + ' .kbPopup {border:5px ridge #666; opacity:'+(parseFloat(Options.Opacity)<'0.5'?'0.5':Options.Opacity)+'; -moz-border-radius:25px; -moz-box-shadow: 1px 1px 5px #000000; z-index:999999;}';
  1131. styles = styles + ' span.kbTextFriendly {color: #080}';
  1132. styles = styles + ' span.kbTextHostile {color: #800}';
  1133. styles = styles + ' .kbButCancel {background-color:#a00; font-weight:bold; color:#fff}';
  1134. styles = styles + ' div.indent25 {padding-left:25px}';
  1135. styles = styles + ' .kbdivHeader {transparent;height: 16px;border-bottom:0px solid #000000;font-weight:bold;font-size:11px;opacity:0.75;margin-left:0px;margin-right:0px;margin-top:1px;margin-bottom:0px;padding-top:4px;padding-right:10px;vertical-align:text-top;align:left;background-color:#335577;}';
  1136. styles = styles + ' .kbdivLink {color:#000;text-decoration:none;}';
  1137. styles = styles + ' .kbdivLink:Hover {color:#000;text-decoration:none;}';
  1138. styles = styles + ' .kbdivLink:Active {color:#000;text-decoration:none;}';
  1139. styles = styles + ' .kbdivHide {display:none}';
  1140. mainPop = new kbPopup (kb.elemPrefix, 40, 40, 725,600, function (){
  1141. tabManager.hideTab();
  1142. Options.kbWinIsOpen=false;
  1143. });
  1144. mainPop.autoHeight (true);
  1145.  
  1146. mainPop.getMainDiv().innerHTML = '<style>'+ styles +'</style>';
  1147. AddMainTabLink('KoCByte', eventHideShow, null);
  1148. tabManager.init(mainPop.getMainDiv());
  1149. kb.log('Gathering game info');
  1150. kb.gameInfoLoad();
  1151. if(!kb.uid || !kb.domain){
  1152. return;
  1153. }
  1154. kb.log('Saving game info');
  1155. kb.gameInfoSave();
  1156. //kb.watchtraffic();
  1157. //kb.interface_addcss();
  1158. kb.log('send_info()');
  1159. kb.sendInfo(1);
  1160. kb.sendSeed(1);
  1161. kb.sendInfoTimer=window.setInterval(function(){
  1162. kb.sendInfo();
  1163. }, kb.sendInfoDelay);
  1164. kb.sendSeedTimer=window.setInterval(function(){
  1165. kb.sendSeed();
  1166. }, kb.sendSeedDelay);
  1167. setTimeout(function(){AutoUpdater.check();},15000);
  1168. kb.taskTimer=window.setInterval(function(){
  1169. kb.doTask();
  1170. },1000*1);
  1171. }
  1172.  
  1173. kb.elemPrefix = 'kb-'+kb.generateRandomNumber(0,65535);
  1174. init();