ET Battle Helper

A few interface tweaks to improve your battling experience

当前为 2017-10-16 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name ET Battle Helper
  3. // @version 0.7
  4. // @description A few interface tweaks to improve your battling experience
  5. // @author jimborino
  6. // @match http*://*.eternitytower.net/*
  7. // @run-at document-idle
  8. // @namespace https://greasyfork.org/users/156118
  9. // ==/UserScript==
  10.  
  11.  
  12.  
  13. (function() {
  14. 'use strict';
  15.  
  16. var storage = window.localStorage;
  17.  
  18. // Default settings, use window.ETBattleHelper in console to change settings
  19. unsafeWindow.ETBattleHelper = {
  20. showEnemyTargets: true,
  21. showPlayerTargets: true,
  22. highlightExecuteRange: true,
  23. showEnemyPercentHealth: true,
  24. highlightOwnTarget: true
  25. };
  26.  
  27.  
  28. if(storage.getItem("ETBattleHelper"))
  29. unsafeWindow.ETBattleHelper = JSON.parse(storage.getItem("ETBattleHelper"));
  30.  
  31. $(window).on("beforeunload", function() {
  32. storage.setItem("ETBattleHelper", JSON.stringify(unsafeWindow.ETBattleHelper));
  33. });
  34.  
  35. // a few styles
  36. $("<style type='text/css'> .playerTarget img { border: 1px solid red !important; } #target { font-size: 14px; text-transform: capitalize; } .battle-unit-container { max-width: 200px; } </style>").appendTo("head");
  37.  
  38. // Prevent typing in chat input box from triggering abilities
  39. setTimeout(function() { $("input#simple-chat-message").on("keyup", function(e) { e.stopPropagation(); }); }, 2000);
  40.  
  41. // Fix hovering for battle log drops
  42. var obs = new MutationObserver(function(mutations, observer) {
  43. $(".alert.alert-secondary div.d-flex div.align-items-center img").each(function() {
  44. $(this).parent().attr("title", $(this).attr("title"));
  45. });
  46. });
  47. obs.observe($("body").get(0), { childList: true, subtree: true });
  48.  
  49.  
  50. // Enemy HP % and targets
  51. Meteor.connection._stream.on("message", function(json) {
  52. var message = JSON.parse(json);
  53. if(message.msg == "changed" && message.collection == "redis" && message.id.includes("battles-")) {
  54. var battleState = JSON.parse(message.fields.value);
  55.  
  56. battleState.enemies.forEach(function(enemy) {
  57. var enemyTarget = getUnitById(enemy.target, battleState);
  58. if (enemyTarget !== undefined) {
  59. enemyTarget = enemyTarget.name;
  60. var enemyHealth = enemy.stats.health;
  61. var enemyHealthMax = enemy.stats.healthMax;
  62. var enemyHealthPercent = (enemyHealth / enemyHealthMax) * 100;
  63. var enemyImgEl = $("img#" + enemy.id);
  64. if(unsafeWindow.ETBattleHelper.highlightExecuteRange) {
  65. if(enemyHealthPercent < 30) {
  66. enemyImgEl.siblings(".progress.health-bar").css("box-shadow", "0 0 0 2px red");
  67. } else {
  68. enemyImgEl.siblings(".progress.health-bar").css("box-shadow", "none");
  69. }
  70. }
  71.  
  72. if(unsafeWindow.ETBattleHelper.showEnemyPercentHealth) {
  73. var enemyPercentEl = enemyImgEl.siblings("div#percent");
  74. if(enemyPercentEl.length > 0) {
  75. enemyPercentEl.html(enemyHealthPercent.toFixed(2) + "%");
  76. } else {
  77. enemyPercentEl = $("<div id='percent'>" + enemyHealthPercent.toFixed(2) + "%</div>");
  78. enemyPercentEl.insertBefore(enemyImgEl);
  79. }
  80. }
  81.  
  82. if(unsafeWindow.ETBattleHelper.showEnemyTargets) {
  83. var enemyTargetEl = enemyImgEl.siblings("div#target");
  84. if(enemyTargetEl.length > 0) {
  85. enemyTargetEl.html("( " + enemyTarget + " )");
  86. } else {
  87. enemyTargetEl = $("<div id='target'>( " + enemyTarget + " )</div>");
  88. enemyTargetEl.insertBefore(enemyImgEl);
  89. }
  90. }
  91. }
  92. });
  93.  
  94. battleState.units.forEach(function(unit) {
  95. var unitTarget = getUnitById(unit.target, battleState);
  96. var unitTargetId;
  97. if(unitTarget === undefined) { // player targets only change when the target is manually changed
  98. // for attacks after an enemy is dead, the target is always the first enemy
  99. if(battleState.enemies.length < 1) { // we receive an update when all enemies are dead
  100. return;
  101. }
  102. unitTargetId = battleState.enemies[0].id;
  103. unitTarget = battleState.enemies[0].name;
  104. } else {
  105. unitTargetId = unitTarget.id;
  106. unitTarget = unitTarget.name;
  107. }
  108. var unitImgEl = $("img#" + unit.id);
  109. if(unsafeWindow.ETBattleHelper.showPlayerTargets) {
  110. var unitTargetEl = unitImgEl.siblings("div#target");
  111. if(unitTargetEl.length > 0) {
  112. unitTargetEl.html("( " + unitTarget + " )");
  113. } else {
  114. unitTargetEl = $("<div id='target'>( " + unitTarget + " )</div>");
  115. unitTargetEl.insertBefore(unitImgEl);
  116. }
  117. }
  118.  
  119.  
  120.  
  121. if(unsafeWindow.ETBattleHelper.highlightOwnTarget) {
  122. $("img#" + unitTargetId).parent().addClass("playerTarget");
  123. $("img#" + unitTargetId).parent()
  124. .parent()
  125. .siblings()
  126. .children()
  127. .removeClass("playerTarget");
  128. }
  129.  
  130.  
  131. });
  132.  
  133. }
  134. });
  135.  
  136. // Recolor your damage splats
  137. var oldReceive = Meteor.connection._livedata_data;
  138. var userId = Meteor.userId();
  139.  
  140. Meteor.connection._livedata_data = function() {
  141. if(arguments[0].msg == "changed" && arguments[0].collection == "redis") {
  142. var battleState = JSON.parse(arguments[0].fields.value);
  143. battleState.tickEvents.forEach(function(tickEvent) {
  144. if(tickEvent.from == userId)
  145. tickEvent.customColor = "black";
  146. });
  147. arguments[0].fields.value = JSON.stringify(battleState);
  148. }
  149.  
  150. var ret = oldReceive.apply(this, arguments);
  151. return ret;
  152. };
  153.  
  154. function getUnitById(unitId, battleState) {
  155. return battleState.units.concat(battleState.enemies).find(function (el) {
  156. if (el.id == unitId) return true;
  157. });
  158. }
  159. })();