Advertisement
Guest User

C&C:TA CNCOpt+ Link Button for SC + forgotten attacks

a guest
Jan 30th, 2015
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 27.52 KB | None | 0 0
  1. // ==UserScript==
  2. // @version 1.7.6b+
  3. // @downloadURL https://chertosha.com/cncoptbutton.user.js
  4. // @name C&C:TA CNCOpt+ Link Button for SC + forgotten attacks
  5. // @namespace http://cncopt.com/
  6. // @icon http://cncopt.com/favicon.ico
  7. // @description Creates a "CNCOpt" button when selecting a base in Command & Conquer: Tiberium Alliances. The share button takes you to http://cncopt.com/ and fills in the selected base information so you can analyze or share the base.
  8. // @include http*://prodgame*.alliances.commandandconquer.com/*/index.aspx*
  9. // @include http*://*.cncopt.com/*
  10. // @include http*://cncopt.com/*
  11. // @include http*://chertosha.com/*
  12. // @grant GM_log
  13. // @grant GM_setValue
  14. // @grant GM_getValue
  15. // @grant GM_registerMenuCommand
  16. // @grant GM_xmlhttpRequest
  17. // @grant GM_updatingEnabled
  18. // @grant unsafeWindow
  19. // @contributor PythEch (http://http://userscripts.org/users/220246)
  20. // @contributor jerbri (http://userscripts.org/users/507954)
  21. // @contributor Der_Flake
  22. // ==/UserScript==
  23. /*
  24.  
  25. 2013-03-03: Special thanks to jerbri for fixing this up so it worked again!
  26. 2012-11-25: Special thanks to PythEch for fixing this up so it worked again!
  27.  
  28. */
  29.  
  30. var scity = null;
  31. var tcity = null;
  32. var tbase = null;
  33. try {
  34. unsafeWindow.__cncopt_version = "1.7.6";
  35. (function () {
  36. var cncopt_main = function () {
  37.  
  38. var defense_unit_map = {
  39. /* GDI Defense Units */"GDI_Wall": "w",
  40. "GDI_Cannon": "c",
  41. "GDI_Antitank Barrier": "t",
  42. "GDI_Barbwire": "b",
  43. "GDI_Turret": "m",
  44. "GDI_Flak": "f",
  45. "GDI_Art Inf": "r",
  46. "GDI_Art Air": "e",
  47. "GDI_Art Tank": "a",
  48. "GDI_Def_APC Guardian": "g",
  49. "GDI_Def_Missile Squad": "q",
  50. "GDI_Def_Pitbull": "p",
  51. "GDI_Def_Predator": "d",
  52. "GDI_Def_Sniper": "s",
  53. "GDI_Def_Zone Trooper": "z",
  54. /* Nod Defense Units */"NOD_Def_Antitank Barrier": "t",
  55. "NOD_Def_Art Air": "e",
  56. "NOD_Def_Art Inf": "r",
  57. "NOD_Def_Art Tank": "a",
  58. "NOD_Def_Attack Bike": "p",
  59. "NOD_Def_Barbwire": "b",
  60. "NOD_Def_Black Hand": "z",
  61. "NOD_Def_Cannon": "c",
  62. "NOD_Def_Confessor": "s",
  63. "NOD_Def_Flak": "f",
  64. "NOD_Def_MG Nest": "m",
  65. "NOD_Def_Militant Rocket Soldiers": "q",
  66. "NOD_Def_Reckoner": "g",
  67. "NOD_Def_Scorpion Tank": "d",
  68. "NOD_Def_Wall": "w",
  69.  
  70. /* Forgotten Defense Units */"FOR_Wall": "w",
  71. "FOR_Barbwire_VS_Inf": "b",
  72. "FOR_Barrier_VS_Veh": "t",
  73. "FOR_Inf_VS_Inf": "g",
  74. "FOR_Inf_VS_Veh": "r",
  75. "FOR_Inf_VS_Air": "q",
  76. "FOR_Sniper": "n",
  77. "FOR_Mammoth": "y",
  78. "FOR_Veh_VS_Inf": "o",
  79. "FOR_Veh_VS_Veh": "s",
  80. "FOR_Veh_VS_Air": "u",
  81. "FOR_Turret_VS_Inf": "m",
  82. "FOR_Turret_VS_Inf_ranged": "a",
  83. "FOR_Turret_VS_Veh": "v",
  84. "FOR_Turret_VS_Veh_ranged": "d",
  85. "FOR_Turret_VS_Air": "f",
  86. "FOR_Turret_VS_Air_ranged": "e",
  87. "": ""
  88. };
  89.  
  90. var offense_unit_map = {
  91. /* GDI Offense Units */"GDI_APC Guardian": "g",
  92. "GDI_Commando": "c",
  93. "GDI_Firehawk": "f",
  94. "GDI_Juggernaut": "j",
  95. "GDI_Kodiak": "k",
  96. "GDI_Mammoth": "m",
  97. "GDI_Missile Squad": "q",
  98. "GDI_Orca": "o",
  99. "GDI_Paladin": "a",
  100. "GDI_Pitbull": "p",
  101. "GDI_Predator": "d",
  102. "GDI_Riflemen": "r",
  103. "GDI_Sniper Team": "s",
  104. "GDI_Zone Trooper": "z",
  105.  
  106. /* Nod Offense Units */"NOD_Attack Bike": "b",
  107. "NOD_Avatar": "a",
  108. "NOD_Black Hand": "z",
  109. "NOD_Cobra": "r",
  110. "NOD_Commando": "c",
  111. "NOD_Confessor": "s",
  112. "NOD_Militant Rocket Soldiers": "q",
  113. "NOD_Militants": "m",
  114. "NOD_Reckoner": "k",
  115. "NOD_Salamander": "l",
  116. "NOD_Scorpion Tank": "o",
  117. "NOD_Specter Artilery": "p",
  118. "NOD_Venom": "v",
  119. "NOD_Vertigo": "t",
  120. "": ""
  121. };
  122.  
  123.  
  124. function findTechLayout(city) {
  125. for (var k in city) {
  126. //console.log(typeof(city[k]), "1.city[", k, "]", city[k])
  127. if ((typeof (city[k]) == "object") && city[k] && 0 in city[k] && 8 in city[k]) {
  128. if ((typeof (city[k][0]) == "object") && city[k][0] && city[k][0] && 0 in city[k][0] && 15 in city[k][0]) {
  129. if ((typeof (city[k][0][0]) == "object") && city[k][0][0] && "BuildingIndex" in city[k][0][0]) {
  130. return city[k];
  131. }
  132. }
  133. }
  134. }
  135. return null;
  136. }
  137.  
  138. function findBuildings(city) {
  139. var cityBuildings = city.get_CityBuildingsData();
  140. for (var k in cityBuildings) {
  141. if (PerforceChangelist >= 376877) {
  142. if ((typeof (cityBuildings[k]) === "object") && cityBuildings[k] && "d" in cityBuildings[k] && "c" in cityBuildings[k] && cityBuildings[k].c > 0) {
  143. return cityBuildings[k].d;
  144. }
  145. } else {
  146. if ((typeof (cityBuildings[k]) === "object") && cityBuildings[k] && "l" in cityBuildings[k]) {
  147. return cityBuildings[k].l;
  148. }
  149. }
  150. }
  151. }
  152.  
  153. function isOffenseUnit(unit) {
  154. return (unit.get_UnitGameData_Obj().n in offense_unit_map);
  155. }
  156.  
  157. function isDefenseUnit(unit) {
  158. return (unit.get_UnitGameData_Obj().n in defense_unit_map);
  159. }
  160.  
  161. function getUnitArrays(city) {
  162. var ret = [];
  163. for (var k in city) {
  164. if ((typeof (city[k]) == "object") && city[k]) {
  165. for (var k2 in city[k]) {
  166. if (PerforceChangelist >= 376877) {
  167. if ((typeof (city[k][k2]) == "object") && city[k][k2] && "d" in city[k][k2]) {
  168. var lst = city[k][k2].d;
  169. if ((typeof (lst) == "object") && lst) {
  170. for (var i in lst) {
  171. if (typeof (lst[i]) == "object" && lst[i] && "get_CurrentLevel" in lst[i]) {
  172. ret.push(lst);
  173. }
  174. }
  175. }
  176. }
  177. } else {
  178. if ((typeof (city[k][k2]) == "object") && city[k][k2] && "l" in city[k][k2]) {
  179. var lst = city[k][k2].l;
  180. if ((typeof (lst) == "object") && lst) {
  181. for (var i in lst) {
  182. if (typeof (lst[i]) == "object" && lst[i] && "get_CurrentLevel" in lst[i]) {
  183. ret.push(lst);
  184. }
  185. }
  186. }
  187. }
  188. }
  189. }
  190. }
  191. }
  192. return ret;
  193. }
  194.  
  195. function getDefenseUnits(city) {
  196. var arr = getUnitArrays(city);
  197. for (var i = 0; i < arr.length; ++i) {
  198. for (var j in arr[i]) {
  199. if (isDefenseUnit(arr[i][j])) {
  200. return arr[i];
  201. }
  202. }
  203. }
  204. return [];
  205. }
  206.  
  207. function getOffenseUnits(city) {
  208. var arr = getUnitArrays(city);
  209. for (var i = 0; i < arr.length; ++i) {
  210. for (var j in arr[i]) {
  211. if (isOffenseUnit(arr[i][j])) {
  212. return arr[i];
  213. }
  214. }
  215. }
  216. return [];
  217. }
  218.  
  219.  
  220. function cncopt_create() {
  221. console.log("CNCOpt Link Button v" + window.__cncopt_version + " loaded");
  222. var cncopt = {
  223. selected_base: null,
  224. keymap: {
  225. /* GDI Buildings */"GDI_Accumulator": "a",
  226. "GDI_Refinery": "r",
  227. "GDI_Trade Center": "u",
  228. "GDI_Silo": "s",
  229. "GDI_Power Plant": "p",
  230. "GDI_Construction Yard": "y",
  231. "GDI_Airport": "d",
  232. "GDI_Barracks": "b",
  233. "GDI_Factory": "f",
  234. "GDI_Defense HQ": "q",
  235. "GDI_Defense Facility": "w",
  236. "GDI_Command Center": "e",
  237. "GDI_Support_Art": "z",
  238. "GDI_Support_Air": "x",
  239. "GDI_Support_Ion": "i",
  240. /* Forgotten Buildings */"FOR_Silo": "s",
  241. "FOR_Refinery": "r",
  242. "FOR_Tiberium Booster": "b",
  243. "FOR_Crystal Booster": "v",
  244. "FOR_Trade Center": "u",
  245. "FOR_Defense Facility": "w",
  246. "FOR_Construction Yard": "y",
  247. "FOR_Harvester_Tiberium": "h",
  248. "FOR_Defense HQ": "q",
  249. "FOR_Harvester_Crystal": "n",
  250. /* Nod Buildings */"NOD_Refinery": "r",
  251. "NOD_Power Plant": "p",
  252. "NOD_Harvester": "h",
  253. "NOD_Construction Yard": "y",
  254. "NOD_Airport": "d",
  255. "NOD_Trade Center": "u",
  256. "NOD_Defense HQ": "q",
  257. "NOD_Barracks": "b",
  258. "NOD_Silo": "s",
  259. "NOD_Factory": "f",
  260. "NOD_Harvester_Crystal": "n",
  261. "NOD_Command Post": "e",
  262. "NOD_Support_Art": "z",
  263. "NOD_Support_Ion": "i",
  264. "NOD_Accumulator": "a",
  265. "NOD_Support_Air": "x",
  266. "NOD_Defense Facility": "w",
  267. //"NOD_Tech Lab": "",
  268. //"NOD_Recruitment Hub": "X",
  269. //"NOD_Temple of Nod": "X",
  270.  
  271. /* GDI Defense Units */"GDI_Wall": "w",
  272. "GDI_Cannon": "c",
  273. "GDI_Antitank Barrier": "t",
  274. "GDI_Barbwire": "b",
  275. "GDI_Turret": "m",
  276. "GDI_Flak": "f",
  277. "GDI_Art Inf": "r",
  278. "GDI_Art Air": "e",
  279. "GDI_Art Tank": "a",
  280. "GDI_Def_APC Guardian": "g",
  281. "GDI_Def_Missile Squad": "q",
  282. "GDI_Def_Pitbull": "p",
  283. "GDI_Def_Predator": "d",
  284. "GDI_Def_Sniper": "s",
  285. "GDI_Def_Zone Trooper": "z",
  286. /* Nod Defense Units */"NOD_Def_Antitank Barrier": "t",
  287. "NOD_Def_Art Air": "e",
  288. "NOD_Def_Art Inf": "r",
  289. "NOD_Def_Art Tank": "a",
  290. "NOD_Def_Attack Bike": "p",
  291. "NOD_Def_Barbwire": "b",
  292. "NOD_Def_Black Hand": "z",
  293. "NOD_Def_Cannon": "c",
  294. "NOD_Def_Confessor": "s",
  295. "NOD_Def_Flak": "f",
  296. "NOD_Def_MG Nest": "m",
  297. "NOD_Def_Militant Rocket Soldiers": "q",
  298. "NOD_Def_Reckoner": "g",
  299. "NOD_Def_Scorpion Tank": "d",
  300. "NOD_Def_Wall": "w",
  301.  
  302. /* Forgotten Defense Units */"FOR_Wall": "w",
  303. "FOR_Barbwire_VS_Inf": "b",
  304. "FOR_Barrier_VS_Veh": "t",
  305. "FOR_Inf_VS_Inf": "g",
  306. "FOR_Inf_VS_Veh": "r",
  307. "FOR_Inf_VS_Air": "q",
  308. "FOR_Sniper": "n",
  309. "FOR_Mammoth": "y",
  310. "FOR_Veh_VS_Inf": "o",
  311. "FOR_Veh_VS_Veh": "s",
  312. "FOR_Veh_VS_Air": "u",
  313. "FOR_Turret_VS_Inf": "m",
  314. "FOR_Turret_VS_Inf_ranged": "a",
  315. "FOR_Turret_VS_Veh": "v",
  316. "FOR_Turret_VS_Veh_ranged": "d",
  317. "FOR_Turret_VS_Air": "f",
  318. "FOR_Turret_VS_Air_ranged": "e",
  319.  
  320. /* GDI Offense Units */"GDI_APC Guardian": "g",
  321. "GDI_Commando": "c",
  322. "GDI_Firehawk": "f",
  323. "GDI_Juggernaut": "j",
  324. "GDI_Kodiak": "k",
  325. "GDI_Mammoth": "m",
  326. "GDI_Missile Squad": "q",
  327. "GDI_Orca": "o",
  328. "GDI_Paladin": "a",
  329. "GDI_Pitbull": "p",
  330. "GDI_Predator": "d",
  331. "GDI_Riflemen": "r",
  332. "GDI_Sniper Team": "s",
  333. "GDI_Zone Trooper": "z",
  334.  
  335. /* Nod Offense Units */"NOD_Attack Bike": "b",
  336. "NOD_Avatar": "a",
  337. "NOD_Black Hand": "z",
  338. "NOD_Cobra": "r",
  339. "NOD_Commando": "c",
  340. "NOD_Confessor": "s",
  341. "NOD_Militant Rocket Soldiers": "q",
  342. "NOD_Militants": "m",
  343. "NOD_Reckoner": "k",
  344. "NOD_Salamander": "l",
  345. "NOD_Scorpion Tank": "o",
  346. "NOD_Specter Artilery": "p",
  347. "NOD_Venom": "v",
  348. "NOD_Vertigo": "t",
  349.  
  350. "<last>": "."
  351. },
  352. make_sharelink: function () {
  353. try {
  354. var selected_base = cncopt.selected_base;
  355. var city_id = selected_base.get_Id();
  356. var city = ClientLib.Data.MainData.GetInstance().get_Cities().GetCity(city_id);
  357. var own_city = ClientLib.Data.MainData.GetInstance().get_Cities().get_CurrentOwnCity();
  358. var alliance = ClientLib.Data.MainData.GetInstance().get_Alliance();
  359. var server = ClientLib.Data.MainData.GetInstance().get_Server();
  360. var doLinkCity = (city.get_CityFaction() > 2 ? own_city.get_CityFaction() : city.get_CityFaction());
  361. var doCity = (city.get_CityFaction() > 2 ? own_city : city);
  362. tbase = selected_base;
  363. tcity = city;
  364. scity = own_city;
  365. //console.log("Target City: ", city);
  366. //console.log("Own City: ", own_city);
  367. //var link = "http://cncopt.com/?map=";
  368. var link = "http://chertosha.com/cncoptplusFA.html??cncoptt=http://cncopt.com/?map=";
  369. link += "3|"; /* link version */
  370. switch (city.get_CityFaction()) {
  371. case 1:
  372. /* GDI */
  373. link += "G|";
  374. break;
  375. case 2:
  376. /* NOD */
  377. link += "N|";
  378. break;
  379. case 3:
  380. /* FOR faction - unseen, but in GAMEDATA */
  381. case 4:
  382. /* Forgotten Bases */
  383. case 5:
  384. /* Forgotten Camps */
  385. case 6:
  386. /* Forgotten Outposts */
  387. link += "F|";
  388. break;
  389. default:
  390. console.log("cncopt: Unknown faction: " + city.get_CityFaction());
  391. link += "E|";
  392. break;
  393. }
  394. //switch (own_city.get_CityFaction()) {
  395. switch (doLinkCity) {
  396. case 1:
  397. /* GDI */
  398. link += "G|";
  399. break;
  400. case 2:
  401. /* NOD */
  402. link += "N|";
  403. break;
  404. case 3:
  405. /* FOR faction - unseen, but in GAMEDATA */
  406. case 4:
  407. /* Forgotten Bases */
  408. case 5:
  409. /* Forgotten Camps */
  410. case 6:
  411. /* Forgotten Outposts */
  412. link += "F|";
  413. break;
  414. default:
  415. console.log("cncopt: Unknown faction: " + own_city.get_CityFaction());
  416. link += "E|";
  417. break;
  418. }
  419. link += city.get_PosX() + ":" + city.get_PosY() + ":" + city.get_Name()+"|";
  420. defense_units = []
  421. for (var i = 0; i < 20; ++i) {
  422. var col = [];
  423. for (var j = 0; j < 9; ++j) {
  424. col.push(null);
  425. }
  426. defense_units.push(col)
  427. }
  428. var defense_unit_list = getDefenseUnits(city);
  429. if (PerforceChangelist >= 376877) {
  430. for (var i in defense_unit_list) {
  431. var unit = defense_unit_list[i];
  432. defense_units[unit.get_CoordX()][unit.get_CoordY() + 8] = unit;
  433. }
  434. } else {
  435. for (var i = 0; i < defense_unit_list.length; ++i) {
  436. var unit = defense_unit_list[i];
  437. defense_units[unit.get_CoordX()][unit.get_CoordY() + 8] = unit;
  438. }
  439. }
  440.  
  441. offense_units = []
  442. for (var i = 0; i < 20; ++i) {
  443. var col = [];
  444. for (var j = 0; j < 9; ++j) {
  445. col.push(null);
  446. }
  447. offense_units.push(col)
  448. }
  449.  
  450. //var offense_unit_list = getOffenseUnits(own_city);
  451. var offense_unit_list = getOffenseUnits(doCity);
  452. if (PerforceChangelist >= 376877) {
  453. for (var i in offense_unit_list) {
  454. var unit = offense_unit_list[i];
  455. offense_units[unit.get_CoordX()][unit.get_CoordY() + 16] = unit;
  456. }
  457. } else {
  458. for (var i = 0; i < offense_unit_list.length; ++i) {
  459. var unit = offense_unit_list[i];
  460. offense_units[unit.get_CoordX()][unit.get_CoordY() + 16] = unit;
  461. }
  462. }
  463.  
  464. var techLayout = findTechLayout(city);
  465. var buildings = findBuildings(city);
  466. for (var i = 0; i < 20; ++i) {
  467. row = [];
  468. for (var j = 0; j < 9; ++j) {
  469. var spot = i > 16 ? null : techLayout[j][i];
  470. var level = 0;
  471. var building = null;
  472. if (spot && spot.BuildingIndex >= 0) {
  473. building = buildings[spot.BuildingIndex];
  474. level = building.get_CurrentLevel();
  475. }
  476. var defense_unit = defense_units[j][i];
  477. if (defense_unit) {
  478. level = defense_unit.get_CurrentLevel();
  479. }
  480. var offense_unit = offense_units[j][i];
  481. if (offense_unit) {
  482. level = offense_unit.get_CurrentLevel();
  483. }
  484. if (level > 1) {
  485. link += level;
  486. }
  487.  
  488. switch (i > 16 ? 0 : city.GetResourceType(j, i)) {
  489. case 0:
  490. if (building) {
  491. var techId = building.get_MdbBuildingId();
  492. if (GAMEDATA.Tech[techId].n in cncopt.keymap) {
  493. link += cncopt.keymap[GAMEDATA.Tech[techId].n];
  494. } else {
  495. console.log("cncopt [5]: Unhandled building: " + techId, building);
  496. link += ".";
  497. }
  498. } else if (defense_unit) {
  499. if (defense_unit.get_UnitGameData_Obj().n in cncopt.keymap) {
  500. link += cncopt.keymap[defense_unit.get_UnitGameData_Obj().n];
  501. } else {
  502. console.log("cncopt [5]: Unhandled unit: " + defense_unit.get_UnitGameData_Obj().n);
  503. link += ".";
  504. }
  505. } else if (offense_unit) {
  506. if (offense_unit.get_UnitGameData_Obj().n in cncopt.keymap) {
  507. link += cncopt.keymap[offense_unit.get_UnitGameData_Obj().n];
  508. } else {
  509. console.log("cncopt [5]: Unhandled unit: " + offense_unit.get_UnitGameData_Obj().n);
  510. link += ".";
  511. }
  512. } else {
  513. link += ".";
  514. }
  515. break;
  516. case 1:
  517. /* Crystal */
  518. if (spot.BuildingIndex < 0) link += "c";
  519. else link += "n";
  520. break;
  521. case 2:
  522. /* Tiberium */
  523. if (spot.BuildingIndex < 0) link += "t";
  524. else link += "h";
  525. break;
  526. case 4:
  527. /* Woods */
  528. link += "j";
  529. break;
  530. case 5:
  531. /* Scrub */
  532. link += "h";
  533. break;
  534. case 6:
  535. /* Oil */
  536. link += "l";
  537. break;
  538. case 7:
  539. /* Swamp */
  540. link += "k";
  541. break;
  542. default:
  543. console.log("cncopt [4]: Unhandled resource type: " + city.GetResourceType(j, i));
  544. link += ".";
  545. break;
  546. }
  547. }
  548. }
  549. /* Tack on our alliance bonuses */
  550. if (alliance && scity.get_AllianceId() == tcity.get_AllianceId()) {
  551. link += "|" + alliance.get_POITiberiumBonus();
  552. link += "|" + alliance.get_POICrystalBonus();
  553. link += "|" + alliance.get_POIPowerBonus();
  554. link += "|" + alliance.get_POIInfantryBonus();
  555. link += "|" + alliance.get_POIVehicleBonus();
  556. link += "|" + alliance.get_POIAirBonus();
  557. link += "|" + alliance.get_POIDefenseBonus();
  558. }
  559. if (server.get_TechLevelUpgradeFactorBonusAmount() != 1.20) {
  560. link += "|newEconomy";
  561. }
  562.  
  563. //console.log(link);
  564. window.open(link, "_blank");
  565. } catch (e) {
  566. console.log("cncopt [1]: ", e);
  567. }
  568. }
  569. };
  570. if (!webfrontend.gui.region.RegionCityMenu.prototype.__cncopt_real_showMenu) {
  571. webfrontend.gui.region.RegionCityMenu.prototype.__cncopt_real_showMenu = webfrontend.gui.region.RegionCityMenu.prototype.showMenu;
  572. }
  573.  
  574. var check_ct = 0;
  575. var check_timer = null;
  576. var button_enabled = 123456;
  577. /* Wrap showMenu so we can inject our Sharelink at the end of menus and
  578. * sync Base object to our cncopt.selected_base variable */
  579. webfrontend.gui.region.RegionCityMenu.prototype.showMenu = function (selected_base) {
  580. try {
  581. var self = this;
  582. //console.log(selected_base);
  583. cncopt.selected_base = selected_base;
  584. if (this.__cncopt_initialized != 1) {
  585. this.__cncopt_initialized = 1;
  586. this.__cncopt_links = [];
  587. for (var i in this) {
  588. try {
  589. if (this[i] && this[i].basename == "Composite") {
  590. var link = new qx.ui.form.Button("CNCOpt+", "http://cncopt.com/favicon.ico");
  591. link.addListener("execute", function () {
  592. var bt = qx.core.Init.getApplication();
  593. bt.getBackgroundArea().closeCityInfo();
  594. cncopt.make_sharelink();
  595. });
  596. this[i].add(link);
  597. this.__cncopt_links.push(link)
  598. }
  599. } catch (e) {
  600. console.log("cncopt [2]: ", e);
  601. }
  602. }
  603. }
  604. var tf = false;
  605. switch (selected_base.get_VisObjectType()) {
  606. case ClientLib.Vis.VisObject.EObjectType.RegionCityType:
  607. switch (selected_base.get_Type()) {
  608. case ClientLib.Vis.Region.RegionCity.ERegionCityType.Own:
  609. tf = true;
  610. break;
  611. case ClientLib.Vis.Region.RegionCity.ERegionCityType.Alliance:
  612. case ClientLib.Vis.Region.RegionCity.ERegionCityType.Enemy:
  613. tf = true;
  614. break;
  615. }
  616. break;
  617. case ClientLib.Vis.VisObject.EObjectType.RegionGhostCity:
  618. tf = false;
  619. console.log("cncopt: Ghost City selected.. ignoring because we don't know what to do here");
  620. break;
  621. case ClientLib.Vis.VisObject.EObjectType.RegionNPCBase:
  622. tf = true;
  623. break;
  624. case ClientLib.Vis.VisObject.EObjectType.RegionNPCCamp:
  625. tf = true;
  626. break;
  627. }
  628.  
  629. var orig_tf = tf;
  630.  
  631. function check_if_button_should_be_enabled() {
  632. try {
  633. tf = orig_tf;
  634. var selected_base = cncopt.selected_base;
  635. var still_loading = false;
  636. if (check_timer != null) {
  637. clearTimeout(check_timer);
  638. }
  639.  
  640. /* When a city is selected, the data for the city is loaded in the background.. once the
  641. * data arrives, this method is called again with these fields set, but until it does
  642. * we can't actually generate the link.. so this section of the code grays out the button
  643. * until the data is ready, then it'll light up. */
  644. if (selected_base && selected_base.get_Id) {
  645. var city_id = selected_base.get_Id();
  646. var city = ClientLib.Data.MainData.GetInstance().get_Cities().GetCity(city_id);
  647. //if (!city || !city.m_CityUnits || !city.m_CityUnits.m_DefenseUnits) {
  648. //console.log("City", city);
  649. //console.log("get_OwnerId", city.get_OwnerId());
  650. if (!city || city.get_OwnerId() == 0) {
  651. still_loading = true;
  652. tf = false;
  653. }
  654. } else {
  655. tf = false;
  656. }
  657. if (tf != button_enabled) {
  658. button_enabled = tf;
  659. for (var i = 0; i < self.__cncopt_links.length; ++i) {
  660. self.__cncopt_links[i].setEnabled(tf);
  661. }
  662. }
  663. if (!still_loading) {
  664. check_ct = 0;
  665. } else {
  666. if (check_ct > 0) {
  667. check_ct--;
  668. check_timer = setTimeout(check_if_button_should_be_enabled, 100);
  669. } else {
  670. check_timer = null;
  671. }
  672. }
  673. } catch (e) {
  674. console.log("cncopt [3]: ", e);
  675. tf = false;
  676. }
  677. }
  678.  
  679. check_ct = 50;
  680. check_if_button_should_be_enabled();
  681. } catch (e) {
  682. console.log("cncopt [3]: ", e);
  683. }
  684. this.__cncopt_real_showMenu(selected_base);
  685. }
  686. }
  687.  
  688.  
  689. /* Nice load check (ripped from AmpliDude's LoU Tweak script) */
  690. function cnc_check_if_loaded() {
  691. try {
  692. if (typeof qx != 'undefined') {
  693. a = qx.core.Init.getApplication(); // application
  694. if (a) {
  695. cncopt_create();
  696. } else {
  697. window.setTimeout(cnc_check_if_loaded, 1000);
  698. }
  699. } else {
  700. window.setTimeout(cnc_check_if_loaded, 1000);
  701. }
  702. } catch (e) {
  703. if (typeof console != 'undefined') console.log(e);
  704. else if (window.opera) opera.postError(e);
  705. else GM_log(e);
  706. }
  707. }
  708. if (/commandandconquer\.com/i.test(document.domain)) window.setTimeout(cnc_check_if_loaded, 1000);
  709. }
  710.  
  711. // injecting because we can't seem to hook into the game interface via unsafeWindow
  712. // (Ripped from AmpliDude's LoU Tweak script)
  713. var script_block = document.createElement("script");
  714. txt = cncopt_main.toString();
  715. script_block.innerHTML = "(" + txt + ")();";
  716. script_block.type = "text/javascript";
  717. if (/commandandconquer\.com/i.test(document.domain)) document.getElementsByTagName("head")[0].appendChild(script_block);
  718. })();
  719. } catch (e) {
  720. GM_log(e);
  721. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement