您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Equips skin, gear, and abilities in configurable sets
// ==UserScript== // @name Eternity Tower Quick Sets // @icon https://www.eternitytower.net/favicon.png // @namespace http://mean.cloud/ // @version 1.25 // @description Equips skin, gear, and abilities in configurable sets // @match *://eternitytower.net/* // @match *://www.eternitytower.net/* // @match http://localhost:3000/* // @author [email protected] // @copyright 2017-2023, MeanCloud // @run-at document-end // @grant GM_getValue // @grant GM_setValue // @grant GM_deleteValue // ==/UserScript== //////////////////////////////////////////////////////////////// ////////////// ** SCRIPT GLOBAL INITIALIZATION ** ////////////// function startup() { ET_QuickSetsMod(); } PETQS_EquippedItems = []; PETQS_EquippedAbilities = []; PETQS_AllItems = []; PETQS_PageOn = 1; PETQS_PageMax = 10; PETQS_SetsPerPage = 8; //////////////////////////////////////////////////////////////// ET_QuickSetsMod = function() { //ET.MCMF.WantDebug = true; ET.MCMF.Ready(function() { Package.meteor.Meteor.connection._stream.on('message', function(sMeteorRawData) { try { var oMeteorData = JSON.parse(sMeteorRawData); //todo: use Meteor.connection._stores.abilities._getCollection()._collection try { if (oMeteorData.collection == "abilities") { if (oMeteorData.fields && oMeteorData.fields.learntAbilities) { PETQS_EquippedAbilities = []; jQ.makeArray(oMeteorData.fields.learntAbilities).forEach(function(oAbility, index, array) { try { if (oAbility.equipped) PETQS_EquippedAbilities.push(oAbility); } catch (err) { ET.MCMF.Log("Error with PETQS/ability: " + err); } }); } } } catch (err) { ET.MCMF.Log("Error with PETQS/abilities: " + err); } //todo: Meteor.connection._stores.items._getCollection()._collection try { if (oMeteorData.collection == "items") { if (oMeteorData.msg == "added") if (oMeteorData.fields && oMeteorData.fields.itemId && oMeteorData.fields.name && oMeteorData.fields.category) PETQS_AllItems.push(oMeteorData); if (oMeteorData.fields && oMeteorData.fields.equipped) { PETQS_EquippedItems.push(oMeteorData); } else { if (PETQS_EquippedItems.length > 0) { for (i = 0; i < PETQS_EquippedItems.length; i++) { if (PETQS_EquippedItems[i].id === oMeteorData.id) { PETQS_EquippedItems.splice(i, 1); break; } } } } } } catch (err) { ET.MCMF.Log("Error with PETQS/items: " + err); } } catch (err) { ET.MCMF.Log("Error with PETQS/meteor: " + err); } }); }); ET.MCMF.Loaded(function() { PETQS_PageOn = CInt(GM_getValue("PETQS_Page")); if (PETQS_PageOn === 0) PETQS_PageOn = 1; PETQS_TestUI(); }, "ETQS"); }; PETQS_TestUI = function() { jQ(".summaryList .summary-mining").remove(); try { if (jQ("div#PETQS_UI").length === 0) if (jQ("div.hidden-lg-down").length > 0) PETQS_CreateUI(); } catch (err) { } setTimeout(PETQS_TestUI, 1000); }; PETQS_CreateUI = function() { jQ("div#PETQS_UI").remove(); jQ(jQ("div.hidden-lg-down").children("div").get(0)).append ( "<div style=\"margin-top: 20px; border: 1px solid #dde; background-color: #fafbfd; padding: 5px; width: 280px; font-size: 14px;\" id=\"PETQS_UI\">" + "<div style=\"width: 270px; max-width: 270px; height: 22px; cursor: pointer;\" id=\"PETQS_Slotbar" + pad(1 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage), 2) + "\" onclick=\"javascript:PETQS_ClickedSet(" + (1 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage)).toFixed(0) + ",event);\">[empty set]</div>" + "<div style=\"width: 270px; max-width: 270px; height: 22px; cursor: pointer;\" id=\"PETQS_Slotbar" + pad(2 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage), 2) + "\" onclick=\"javascript:PETQS_ClickedSet(" + (2 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage)).toFixed(0) + ",event);\">[empty set]</div>" + "<div style=\"width: 270px; max-width: 270px; height: 22px; cursor: pointer;\" id=\"PETQS_Slotbar" + pad(3 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage), 2) + "\" onclick=\"javascript:PETQS_ClickedSet(" + (3 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage)).toFixed(0) + ",event);\">[empty set]</div>" + "<div style=\"width: 270px; max-width: 270px; height: 22px; cursor: pointer; margin-bottom: 4px;\" id=\"PETQS_Slotbar" + pad(4 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage), 2) + "\" onclick=\"javascript:PETQS_ClickedSet(" + (4 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage)).toFixed(0) + ",event);\">[empty set]</div>" + "<div style=\"width: 270px; max-width: 270px; height: 22px; cursor: pointer; border-top: 1px solid #dde;\" id=\"PETQS_Slotbar" + pad(5 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage), 2) + "\" onclick=\"javascript:PETQS_ClickedSet(" + (5 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage)).toFixed(0) + ",event);\">[empty set]</div>" + "<div style=\"width: 270px; max-width: 270px; height: 22px; cursor: pointer;\" id=\"PETQS_Slotbar" + pad(6 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage), 2) + "\" onclick=\"javascript:PETQS_ClickedSet(" + (6 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage)).toFixed(0) + ",event);\">[empty set]</div>" + "<div style=\"width: 270px; max-width: 270px; height: 22px; cursor: pointer;\" id=\"PETQS_Slotbar" + pad(7 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage), 2) + "\" onclick=\"javascript:PETQS_ClickedSet(" + (7 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage)).toFixed(0) + ",event);\">[empty set]</div>" + "<div style=\"width: 270px; max-width: 270px; height: 22px; cursor: pointer;\" id=\"PETQS_Slotbar" + pad(8 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage), 2) + "\" onclick=\"javascript:PETQS_ClickedSet(" + (8 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage)).toFixed(0) + ",event);\">[empty set]</div>" + "<div style=\"width: 270px; max-width: 270px; padding-top: 10px;\">" + "<input class=\"btn btn-secondary\" type=\"button\" value=\"Save #" + (1 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage)).toFixed(0) + "\" onclick=\"javascript:PETQS_SaveSet(" + (1 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage)).toFixed(0) + ");\" style=\"display: inline-block; padding: 4px 2px 4px 2px; margin: 0px 3px 1px 0px; width: 64px; font-size: 12px;\" />" + "<input class=\"btn btn-secondary\" type=\"button\" value=\"Save #" + (2 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage)).toFixed(0) + "\" onclick=\"javascript:PETQS_SaveSet(" + (2 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage)).toFixed(0) + ");\" style=\"display: inline-block; padding: 4px 2px 4px 2px; margin: 0px 3px 1px 0px; width: 64px; font-size: 12px;\" />" + "<input class=\"btn btn-secondary\" type=\"button\" value=\"Save #" + (3 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage)).toFixed(0) + "\" onclick=\"javascript:PETQS_SaveSet(" + (3 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage)).toFixed(0) + ");\" style=\"display: inline-block; padding: 4px 2px 4px 2px; margin: 0px 3px 1px 0px; width: 64px; font-size: 12px;\" />" + "<input class=\"btn btn-secondary\" type=\"button\" value=\"Save #" + (4 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage)).toFixed(0) + "\" onclick=\"javascript:PETQS_SaveSet(" + (4 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage)).toFixed(0) + ");\" style=\"display: inline-block; padding: 4px 2px 4px 2px; margin: 0px 3px 1px 0px; width: 64px; font-size: 12px;\" /><br />" + "<input class=\"btn btn-secondary\" type=\"button\" value=\"Save #" + (5 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage)).toFixed(0) + "\" onclick=\"javascript:PETQS_SaveSet(" + (5 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage)).toFixed(0) + ");\" style=\"display: inline-block; padding: 4px 2px 4px 2px; margin: 0px 3px 1px 0px; width: 64px; font-size: 12px;\" />" + "<input class=\"btn btn-secondary\" type=\"button\" value=\"Save #" + (6 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage)).toFixed(0) + "\" onclick=\"javascript:PETQS_SaveSet(" + (6 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage)).toFixed(0) + ");\" style=\"display: inline-block; padding: 4px 2px 4px 2px; margin: 0px 3px 1px 0px; width: 64px; font-size: 12px;\" />" + "<input class=\"btn btn-secondary\" type=\"button\" value=\"Save #" + (7 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage)).toFixed(0) + "\" onclick=\"javascript:PETQS_SaveSet(" + (7 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage)).toFixed(0) + ");\" style=\"display: inline-block; padding: 4px 2px 4px 2px; margin: 0px 3px 1px 0px; width: 64px; font-size: 12px;\" />" + "<input class=\"btn btn-secondary\" type=\"button\" value=\"Save #" + (8 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage)).toFixed(0) + "\" onclick=\"javascript:PETQS_SaveSet(" + (8 + ((PETQS_PageOn - 1) * PETQS_SetsPerPage)).toFixed(0) + ");\" style=\"display: inline-block; padding: 4px 2px 4px 2px; margin: 0px 3px 1px 0px; width: 64px; font-size: 12px;\" /><br />" + "<input class=\"btn btn-secondary\" type=\"button\" value=\"< Prev Page\" onclick=\"javascript:PETQS_PageChange(-1);\" style=\"display: inline-block; padding: 4px 2px 4px 2px; margin: 0px 3px 1px 0px; width: 131px; font-size: 12px;\" />" + "<input class=\"btn btn-secondary\" type=\"button\" value=\"Next Page >\" onclick=\"javascript:PETQS_PageChange(1);\" style=\"display: inline-block; padding: 4px 2px 4px 2px; margin: 0px 3px 1px 0px; width: 131px; font-size: 12px;\" /><br />" + "</div>" + "</div>" ); for (iSlot = 1; iSlot <= PETQS_SetsPerPage; iSlot++) PETQS_LoadSet(iSlot + ((PETQS_PageOn - 1) * PETQS_SetsPerPage)); }; PETQS_PageChange = function(iAmt) { PETQS_PageOn += iAmt; if (PETQS_PageOn <= 0) PETQS_PageOn = PETQS_PageMax; if (PETQS_PageOn > PETQS_PageMax) PETQS_PageOn = 1; GM_setValue("PETQS_Page", PETQS_PageOn.toString()); PETQS_CreateUI(); }; PETQS_UpdateSetTooltip = function(iSlot, bEmpty) { oEl = jQ("#PETQS_Slotbar" + pad(iSlot, 2)).get(0); if (!oEl) return; if (oEl._tippy) oEl._tippy.destroy(); jQ("#tooltip-PETQS_Slotbar" + pad(iSlot, 2)).remove(); jQ("body").append("<div class=\"item-tooltip-content my-tooltip-inner\" id=\"tooltip-PETQS_Slotbar" + pad(iSlot, 2) + "\"></div>"); if (bEmpty) { jQ("#tooltip-PETQS_Slotbar" + pad(iSlot, 2)).html ( " <h3 class=\"popover-title\" style=\"font-weight: normal; color: #3333ff;\">" + " " + (GM_getValue("PETQS_Name" + pad(iSlot, 2)) || "Quick Set #" + iSlot.toFixed(0)) + " </h3>" + " <div class=\"popover-content\">" + " set #" + iSlot.toFixed(0) + "<br />" + " this set is empty" + " </div>" ); } else { jQ("#tooltip-PETQS_Slotbar" + pad(iSlot, 2)).html ( " <h3 class=\"popover-title\" style=\"font-weight: bold; color: #3333ff;\">" + " " + (GM_getValue("PETQS_Name" + pad(iSlot, 2)) || "Quick Set #" + iSlot.toFixed(0)) + " </h3>" + " <div class=\"popover-content\">" + " set #" + iSlot.toFixed(0) + "<br />" + " <b>Left Click</b> to equip this set<br />" + " <b>Shift Click</b> to rename this set<br />" + " <b>Control Click</b> to delete this set" + " </div>" ); } tippy("#PETQS_Slotbar" + pad(iSlot, 2), { html: jQ("#tooltip-PETQS_Slotbar" + pad(iSlot, 2))[0], performance: !0, animateFill: !1, distance: 5 }); }; PETQS_ClickedSet = function(iSlot, e) { var bShiftPressed = false; var bCtrlPressed = false; try { if (e !== null) { if (e.shiftKey) bShiftPressed = true; if (e.ctrlKey) bCtrlPressed = true; } } catch (err) { } if (bShiftPressed) { var sSetName = prompt("Enter a new name for this set:", GM_getValue("PETQS_Name" + pad(iSlot, 2)) || "Quick Set #" + iSlot.toFixed(0)); if (sSetName !== null) { GM_setValue("PETQS_Name" + pad(iSlot, 2), sSetName.trim()); PETQS_LoadSet(iSlot); } } else if (bCtrlPressed) { if (confirm("Really delete set #" + iSlot.toFixed(0) + " (\"" + (GM_getValue("PETQS_Name" + pad(iSlot, 2)) || "Quick Set #" + iSlot.toFixed(0)) + "\")?")) { GM_deleteValue("PETQS_Name" + pad(iSlot, 2)); GM_deleteValue("PETQS_QS" + pad(iSlot, 2)); jQ("div#PETQS_Slotbar" + pad(iSlot, 2)).html("[empty set]"); PETQS_UpdateSetTooltip(iSlot, true); } } else PETQS_LoadSet(iSlot, true); }; PETQS_SkinEquipped = function() { //return Meteor.connection._stores.combat._getCollection()._collection._docs._map[ET.MCMF.CombatID].characterIcon; // CombatID no longer exists try { return Meteor.connection._stores.combat._getCollection().find({owner: Meteor.userId()}).fetch()[0].characterIcon; } catch (err) { } return ""; }; PETQS_ClassToImage = function(classId) { if (classId && IsValid(classId)) { if (classId == "wanderer") return "classWandererSmall.png" if (classId == "barbarian") return "classBarbarianSmall.png" if (classId == "duelist") return "classDuelistSmall.png" if (classId == "paladin") return "classPaladinSmall.png" if (classId == "ranger") return "classRangerSmall.png" if (classId == "sage") return "classSageSmall.png" if (classId == "tactician") return "classTacticianSmall.png" if (classId == "warmage") return "classWarMageSmall.png" if (classId == "wizard") return "classWizardSmall.png" } return "invis.gif" }; PETQS_ClassEquipped = function() { return window.ET.MCMF.WhichClass() }; PETQS_SaveSet = function(iSlot) { var sSetting = ""; sSetting += "class&&" + PETQS_ClassEquipped() + "||" + "skin&&" + PETQS_SkinEquipped() + "||"; try { jQ.makeArray(PETQS_EquippedItems).forEach(function(oEquippedItem, index, array) { //ET.MCMF.Log(oEquippedItem); try { var oEquippedItemToUse = oEquippedItem; if (!oEquippedItem.fields.category) { jQ.makeArray(PETQS_AllItems).forEach(function(oThisItem, index2, array2) { if ((oThisItem.id === oEquippedItem.id) && (oThisItem.fields.category)) { oEquippedItemToUse = oThisItem; //ET.MCMF.Log("--> ", oEquippedItemToUse); } }); } let oEquippedItemToUse_real = ET.MCMF.GetItem(oEquippedItemToUse.id) if (oEquippedItemToUse_real.category) if (oEquippedItemToUse_real.category === "mining") return; // skip this item (no mining tools) sSetting += "item&&" + oEquippedItemToUse.id + "&&" + oEquippedItemToUse_real.itemId + "&&" + oEquippedItemToUse_real.name + "&&" + oEquippedItemToUse_real.slot + "&&" + oEquippedItemToUse_real.icon + "&&" + (oEquippedItemToUse_real.quality ? oEquippedItemToUse_real.quality.toFixed(0) : "-1") + "&&" + (oEquippedItemToUse_real.enhanced ? "E" : "X") + "||"; } catch (err) { ET.MCMF.Log("Error with PETQS/saveItem: " + err); } }); } catch (err) { ET.MCMF.Log("Error with PETQS/saveItems: " + err); } try { jQ.makeArray(PETQS_EquippedAbilities).forEach(function(oEquippedAbility, index, array) { //ET.MCMF.Log(oEquippedAbility); try { sSetting += "ability&&" + oEquippedAbility.abilityId + "&&" + oEquippedAbility.name + "&&" + oEquippedAbility.slot + "&&" + oEquippedAbility.icon + "||"; } catch (err) { ET.MCMF.Log("Error with PETQS/saveAbility: " + err); } }); } catch (err) { ET.MCMF.Log("Error with PETQS/saveAbilities: " + err); } //ET.MCMF.Log("Save: PETQS_QS" + pad(iSlot, 2) + " = " + sSetting); GM_setValue("PETQS_QS" + pad(iSlot, 2), sSetting); PETQS_LoadSet(iSlot); }; PETQS_LoadSet = function(iSlot, bEquip = false) { var sRawSetting = GM_getValue("PETQS_QS" + pad(iSlot, 2)) || ""; //ET.MCMF.Log("Load: " + sRawSetting); if (sRawSetting === "") { PETQS_UpdateSetTooltip(iSlot, true); return; } var sSettingLines = jQ.makeArray(sRawSetting.split("||")); var sHotbarHTML = ""; const sImageSize = "22px"; if (bEquip) { /* ET.MCMF.CallGameCmd("abilities.unequipAll", "mainHand"); ET.MCMF.CallGameCmd("abilities.unequip", "offHand"); ET.MCMF.CallGameCmd("abilities.unequip", "head"); ET.MCMF.CallGameCmd("abilities.unequip", "chest"); ET.MCMF.CallGameCmd("abilities.unequip", "legs"); var equipmentCopy = PETQS_EquippedItems.slice(); if (equipmentCopy.length > 0) for (i = 0; i < equipmentCopy.length; i++) if (equipmentCopy[i].fields.category !== "mining") ET.MCMF.CallGameCmd("items.unequip", equipmentCopy[i].id, equipmentCopy[i].fields.itemId); */ ET.MCMF.CallGameCmd("abilities.unequipAll"); ET.MCMF.CallGameCmd("items.unequipAllCombat"); } console.log(sSettingLines) // look for skins and classes first sSettingLines.forEach(function(sSettingLine, index, array) { try { var sSettingVals = jQ.makeArray(sSettingLine.split("&&")); if (sSettingVals[0] == "skin") { //ET.MCMF.Log("skin: " + sSettingVals[1]); sHotbarHTML += "<img src=\"/icons/" + sSettingVals[1] + "\" class=\"extra-small-icon\" style=\"width: " + sImageSize + "; height: " + sImageSize + "; padding: 0px; margin: 0px; border: none;\" />"; if (bEquip) { //todo: use Meteor.connection._stores.skins._getCollection()._collection if (sSettingVals[1] == "character.svg") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "default"); if (sSettingVals[1] == "falconT1.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "archer_t1"); if (sSettingVals[1] == "falconT2.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "archer_t2"); if (sSettingVals[1] == "falconT1Color.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "archer_t1_color"); if (sSettingVals[1] == "falconT2Color.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "archer_t2_color"); if (sSettingVals[1] == "mitsyT1.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "mage_t1"); if (sSettingVals[1] == "mitsyT2.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "mage_t2"); if (sSettingVals[1] == "mitsyT1Color.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "mage_t1_color"); if (sSettingVals[1] == "mitsyT2Color.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "mage_t2_color"); if (sSettingVals[1] == "oliveT1.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "damage_t1"); if (sSettingVals[1] == "oliveT2.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "damage_t2"); if (sSettingVals[1] == "oliveT1Color.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "damage_t1_color"); if (sSettingVals[1] == "oliveT2Color.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "damage_t2_color"); if (sSettingVals[1] == "guyT1.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "tank_t1"); if (sSettingVals[1] == "guyT2.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "tank_t2"); if (sSettingVals[1] == "guyT1Color.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "tank_t1_color"); if (sSettingVals[1] == "guyT2Color.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "tank_t2_color"); if (sSettingVals[1] == "phoenixT1.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "phoenix_t1"); if (sSettingVals[1] == "phoenixT2.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "phoenix_t2"); if (sSettingVals[1] == "phoenixT1Color.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "phoenix_t1_color"); if (sSettingVals[1] == "phoenixT2Color.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "phoenix_t2_color"); if (sSettingVals[1] == "hitiT1.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "hiti_t1"); if (sSettingVals[1] == "hitiT1Color.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "hiti_t1_color"); if (sSettingVals[1] == "pugilistT1.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "pugilist_t1"); if (sSettingVals[1] == "pugilistT1Color.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "pugilist_t1_color"); if (sSettingVals[1] == "sandstormT1.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "sandstorm_t1"); if (sSettingVals[1] == "sandstormT1Color.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "sandstorm_t1_color"); if (sSettingVals[1] == "crowT1.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "crow_t1"); if (sSettingVals[1] == "crowT2.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "crow_t2"); if (sSettingVals[1] == "crowT1Color.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "crow_t1_color"); if (sSettingVals[1] == "crowT2Color.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "crow_t2_color"); if (sSettingVals[1] == "aldaT1.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "alda_t1"); if (sSettingVals[1] == "aldaT2.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "alda_t2"); if (sSettingVals[1] == "aldaT1Color.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "alda_t1_color"); if (sSettingVals[1] == "aldaT2Color.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "alda_t2_color"); if (sSettingVals[1] == "vallaT1.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "valla_t1"); if (sSettingVals[1] == "vallaT1Color.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "valla_t1_color"); if (sSettingVals[1] == "adalgarT1.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "adalgar_t1"); if (sSettingVals[1] == "adalgarT1Color.png") ET.MCMF.CallGameCmd("combat.updateCharacterIcon", "adalgar_t1_color"); } } else if (sSettingVals[0] == "class") { //ET.MCMF.Log("skin: " + sSettingVals[1]); sHotbarHTML += "<img src=\"/icons/" + PETQS_ClassToImage(sSettingVals[1]) + "\" class=\"extra-small-icon\" style=\"width: " + sImageSize + "; height: " + sImageSize + "; padding: 0px; margin: 0px; border: none;\" />"; } } catch (err) { } }); // look for gear for (i = 1; i <= 6; i++) { sSettingLines.forEach(function(sSettingLine) { try { var sSettingVals = jQ.makeArray(sSettingLine.split("&&")); if (sSettingVals[0] === "item") { if ((i == 1) && (sSettingVals[4] !== "mainHand")) return; if ((i == 2) && (sSettingVals[4] !== "offHand")) return; if ((i == 3) && (sSettingVals[4] !== "head")) return; if ((i == 4) && (sSettingVals[4] !== "neck")) return; if ((i == 5) && (sSettingVals[4] !== "chest")) return; if ((i == 6) && (sSettingVals[4] !== "legs")) return; //ET.MCMF.Log("item: " + sSettingVals[3]); sHotbarHTML += "<img src=\"/icons/" + sSettingVals[5] + "\" class=\"extra-small-icon\" style=\"width: " + sImageSize + "; height: " + sImageSize + "; padding: 0px; margin: 0px; border: none;\" />"; if (bEquip) ET.MCMF.CallGameCmd("items.equip", sSettingVals[1], sSettingVals[2]); } } catch (err) { } }); } // look for abilities for (i = 1; i <= 9; i++) { sSettingLines.forEach(function(sSettingLine) { try { var sSettingVals = jQ.makeArray(sSettingLine.split("&&")); if (sSettingVals[0] == "ability") { if ((i == 1) && (sSettingVals[3] != "mainHand")) return; if ((i == 2) && (sSettingVals[3] != "offHand")) return; if ((i == 3) && (sSettingVals[3] != "head")) return; if ((i == 4) && (sSettingVals[3] != "chest")) return; if ((i == 5) && (sSettingVals[3] != "legs")) return; if ((i == 6) && (sSettingVals[3] != (window.ET.MCMF.IsClass() ? "classAbil1" : "companion"))) return; if ((i == 7) && (sSettingVals[3] != "classAbil2")) return; if ((i == 8) && (sSettingVals[3] != "classAbil3")) return; if ((i == 9) && (sSettingVals[3] != "companion")) return; //ET.MCMF.Log("ability: " + sSettingVals[2]); if (i < 6) sHotbarHTML += "<img src=\"/icons/" + sSettingVals[4] + "\" class=\"extra-small-icon\" style=\"width: " + sImageSize + "; height: " + sImageSize + "; padding: 0px; margin: 0px; border: none;\" />"; if (bEquip) ET.MCMF.CallGameCmd("abilities.equip", sSettingVals[1]); } } catch (err) { } }); } jQ("div#PETQS_Slotbar" + pad(iSlot, 2)).html(sHotbarHTML); PETQS_UpdateSetTooltip(iSlot, false); }; //////////////////////////////////////////////////////////////// /////////////// ** common.js -- DO NOT MODIFY ** /////////////// time_val = function() { return CDbl(Math.floor(Date.now() / 1000)); }; IsValid = function(oObject) { if (oObject === undefined) return false; if (oObject === null) return false; return true; }; const CommonRandom = function(iMin, iMax) { return parseInt(iMin + Math.floor(Math.random() * iMax)); }; ShiftClick = function(oEl) { jQ(oEl).trigger(ShiftClickEvent()); }; ShiftClickEvent = function(target) { let shiftclickOrig = jQ.Event("click"); shiftclickOrig.which = 1; // 1 = left, 2 = middle, 3 = right //shiftclickOrig.type = "click"; // "mousedown" ? shiftclickOrig.shiftKey = true; shiftclickOrig.currentTarget = target; let shiftclick = jQ.Event("click"); shiftclick.which = 1; // 1 = left, 2 = middle, 3 = right //shiftclick.type = "click"; // "mousedown" ? shiftclick.shiftKey = true; shiftclick.currentTarget = target; shiftclick.originalEvent = shiftclickOrig; //document.ET_Util_Log(shiftclick); return shiftclick; }; if (!String.prototype.replaceAll) String.prototype.replaceAll = function(search, replace) { return ((replace === undefined) ? this.toString() : this.replace(new RegExp('[' + search + ']', 'g'), replace)); }; if (!String.prototype.startsWith) String.prototype.startsWith = function(search, pos) { return this.substr(((!pos) || (pos < 0)) ? 0 : +pos, search.length) === search; }; CInt = function(v) { try { if (!isNaN(v)) return Math.floor(v); if (typeof v === 'undefined') return parseInt(0); if (v === null) return parseInt(0); let t = parseInt(v); if (isNaN(t)) return parseInt(0); return Math.floor(t); } catch (err) { } return parseInt(0); }; CDbl = function(v) { try { if (!isNaN(v)) return parseFloat(v); if (typeof v === 'undefined') return parseFloat(0.0); if (v === null) return parseFloat(0.0); let t = parseFloat(v); if (isNaN(t)) return parseFloat(0.0); return t; } catch (err) { } return parseFloat(0.0); }; // dup of String.prototype.startsWith, but uses indexOf() instead of substr() startsWith = function (haystack, needle) { return (needle === "") || (haystack.indexOf(needle) === 0); }; endsWith = function (haystack, needle) { return (needle === "") || (haystack.substring(haystack.length - needle.length) === needle); }; Chopper = function(sText, sSearch, sEnd) { let sIntermediate = ""; if (sSearch === "") sIntermediate = sText.substring(0, sText.length); else { let iIndexStart = sText.indexOf(sSearch); if (iIndexStart === -1) return sText; sIntermediate = sText.substring(iIndexStart + sSearch.length); } if (sEnd === "") return sIntermediate; let iIndexEnd = sIntermediate.indexOf(sEnd); return (iIndexEnd === -1) ? sIntermediate : sIntermediate.substring(0, iIndexEnd); }; ChopperBlank = function(sText, sSearch, sEnd) { let sIntermediate = ""; if (sSearch === "") sIntermediate = sText.substring(0, sText.length); else { let iIndexStart = sText.indexOf(sSearch); if (iIndexStart === -1) return ""; sIntermediate = sText.substring(iIndexStart + sSearch.length); } if (sEnd === "") return sIntermediate; let iIndexEnd = sIntermediate.indexOf(sEnd); return (iIndexEnd === -1) ? "" : sIntermediate.substring(0, iIndexEnd); }; CondenseSpacing = function(text) { while (text.indexOf(" ") !== -1) text = text.replace(" ", " "); return text; }; // pad available both ways as pad(string, width, [char]) or string.pad(width, [char]) pad = function(sText, iWidth, sChar) { sChar = ((sChar !== undefined) ? sChar : ('0')); sText = sText.toString(); return ((sText.length >= iWidth) ? (sText) : (new Array(iWidth - sText.length + 1).join(sChar) + sText)); }; if (!String.prototype.pad) String.prototype.pad = function(iWidth, sChar) { sChar = ((sChar !== undefined) ? sChar : ('0')); sText = sText.toString(); return ((sText.length >= iWidth) ? (sText) : (new Array(iWidth - sText.length + 1).join(sChar) + sText)); }; String.prototype.toHHMMSS = function () { let sec_num = parseInt(this, 10); let hours = Math.floor(sec_num / 3600); let minutes = Math.floor((sec_num - (hours * 3600)) / 60); let seconds = sec_num - (hours * 3600) - (minutes * 60); if (hours < 10) {hours = "0"+hours;} if (minutes < 10) {minutes = "0"+minutes;} if (seconds < 10) {seconds = "0"+seconds;} return hours+':'+minutes+':'+seconds; }; String.prototype.toFriendlyTime = function () { let sec_num = parseInt(this, 10); let hours = Math.floor(sec_num / 3600); let minutes = Math.floor((sec_num - (hours * 3600)) / 60); let seconds = sec_num - (hours * 3600) - (minutes * 60); let out = ''; if (hours > 0) out = `${out}${hours}h`; if (minutes > 0) out = `${out}${minutes}m`; if (seconds > 0) out = `${out}${seconds}s`; return out; }; Number.prototype.toPercent = function () { try { let pct_val = parseFloat(this); if (pct_val >= 15.0) return pct_val.toFixed(0); return pct_val.toFixed(1).replace(".0", ""); } catch (err) { } return 'NaN'; }; is_visible = (function () { let x = window.pageXOffset ? window.pageXOffset + window.innerWidth - 1 : 0, y = window.pageYOffset ? window.pageYOffset + window.innerHeight - 1 : 0, relative = !!((!x && !y) || !document.elementFromPoint(x, y)); function inside(child, parent) { while(child){ if (child === parent) return true; child = child.parentNode; } return false; } return function (elem) { if ( hidden || elem.offsetWidth==0 || elem.offsetHeight==0 || elem.style.visibility=='hidden' || elem.style.display=='none' || elem.style.opacity===0 ) return false; let rect = elem.getBoundingClientRect(); if (relative) { if (!inside(document.elementFromPoint(rect.left + elem.offsetWidth/2, rect.top + elem.offsetHeight/2),elem)) return false; } else if ( !inside(document.elementFromPoint(rect.left + elem.offsetWidth/2 + window.pageXOffset, rect.top + elem.offsetHeight/2 + window.pageYOffset), elem) || ( rect.top + elem.offsetHeight/2 < 0 || rect.left + elem.offsetWidth/2 < 0 || rect.bottom - elem.offsetHeight/2 > (window.innerHeight || document.documentElement.clientHeight) || rect.right - elem.offsetWidth/2 > (window.innerWidth || document.documentElement.clientWidth) ) ) return false; if (window.getComputedStyle || elem.currentStyle) { let el = elem, comp = null; while (el) { if (el === document) {break;} else if(!el.parentNode) return false; comp = window.getComputedStyle ? window.getComputedStyle(el, null) : el.currentStyle; if (comp && (comp.visibility=='hidden' || comp.display == 'none' || (typeof comp.opacity !=='undefined' && comp.opacity != 1))) return false; el = el.parentNode; } } return true; }; })(); function sumObjectsByKey(...objs) { return objs.reduce((a, b) => { for (let k in b) { if (b.hasOwnProperty(k)) a[k] = (a[k] || 0) + b[k]; } return a; }, {}); } //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// ////////////// ** common_ET.js -- DO NOT MODIFY ** ///////////// if (window.ET === undefined) window.ET = { }; if ((window.ET.MCMF === undefined) || (CDbl(window.ET.MCMF.version) < 1.08)) // MeanCloud mod framework { window.ET.MCMF = { version: 1.08, TryingToLoad: false, WantDebug: false, WantFasterAbilityCDs: false, InBattle: false, FinishedLoading: false, Initialized: false, AbilitiesReady: false, InitialAbilityCheck: true, TimeLeftOnCD: 9999, TimeLastFight: 0, ToastMessageSuccess: function(msg) { toastr.success(msg); }, ToastMessageWarning: function(msg) { toastr.warning(msg); }, EventSubscribe: function(sEventName, fnCallback, sNote) { if (window.ET.MCMF.EventSubscribe_events === undefined) window.ET.MCMF.EventSubscribe_events = []; let newEvtData = {}; newEvtData.name = ((!sEventName.startsWith("ET:")) ? (`ET:${sEventName}`) : (sEventName)); newEvtData.callback = fnCallback; newEvtData.note = sNote; window.ET.MCMF.EventSubscribe_events.push(newEvtData); if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log(`Added event subscription '${sEventName}'!` + ((sNote === undefined) ? "" : ` (${sNote})`)); }, EventTrigger: function(sEventName) { if (window.ET.MCMF.EventSubscribe_events === undefined) return; window.ET.MCMF.EventSubscribe_events.forEach(function(oThisEvent) { if (sEventName === oThisEvent.name) { if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log(`FIRING '${oThisEvent.name}'!` + ((oThisEvent.note === undefined) ? "" : ` (${oThisEvent.note})`)); try { oThisEvent.callback(); } catch (err) { if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log("Exception:"); console.log(err); } } }); }, Log: function(msg) { try { let now = new Date(); let timestamp_date = `${(now.getMonth()+1)}/${now.getDate()}`; let timestamp_time = `${((now.getHours()===0)?12:((now.getHours()>12)?(now.getHours()-12):(now.getHours())))}:${now.getMinutes().toString().padStart(2,"0")}:${now.getSeconds().toString().padStart(2,"0")}${((now.getHours()< 2)?"a":"p")}`; console.log(`%c${timestamp_date} ${timestamp_time}%c ${msg}`, "color: #555;", "font-weight: bold;"); } catch (err) { } }, Time: function() // returns time in milliseconds (not seconds!) { return CInt((new Date()).getTime()); }, SubscribeToGameChannel: function(channel_name) { let oChannel; try { channel_name = channel_name.toString().trim(); let bAlreadySubscribed = false; window.jQ.makeArray(Object.keys(Meteor.connection._subscriptions).map(key => Meteor.connection._subscriptions[key])).forEach(function(oThisConnection) { try { if (oThisConnection.name === channel_name) bAlreadySubscribed = true; } catch (err) { } }); if (!bAlreadySubscribed) { Meteor.subscribe(channel_name); if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log(`Meteor::Subscribed to channel '${channel_name}'`); } } catch (err) { if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log(`Meteor::Exception in SubscribeToGameChannel("${channel_name}"):`); if (window.ET.MCMF.WantDebug) console.log(err); } return oChannel; }, IsClass: function() { const classData = Meteor.connection._stores.users._getCollection().find().fetch()[0].classData return typeof classData !== 'undefined' && typeof classData.currentClass !== 'undefined' }, WhichClass: function() { return Meteor.connection._stores.users._getCollection().find().fetch()[0]?.classData?.currentClass }, CraftingBuff: function() { let oDate, iTimeLeft; try { oDate = new Date(Meteor.connection._stores.state._getCollection().find({ name: "buffCrafting" }).fetch()[0].value.activeTo); iTimeLeft = ((oDate) > (new Date())) ? CInt(Math.floor(Math.abs(oDate - (new Date())) / 1000.0)) : 0; return { active: (iTimeLeft > 0), remaining: iTimeLeft, expires: oDate }; } catch (err) { } return { active: false, remaining: 0, expires: oDate }; }, CombatBuff: function() { let oDate, iTimeLeft; try { oDate = new Date(Meteor.connection._stores.state._getCollection().find({ name: "buffCombat" }).fetch()[0].value.activeTo); iTimeLeft = ((oDate) > (new Date())) ? CInt(Math.floor(Math.abs(oDate - (new Date())) / 1000.0)) : 0; return { active: (iTimeLeft > 0), remaining: iTimeLeft, expires: oDate }; } catch (err) { } return { active: false, remaining: 0, expires: oDate }; }, GatheringBuff: function() { let oDate, iTimeLeft; try { oDate = new Date(Meteor.connection._stores.state._getCollection().find({ name: "buffGathering" }).fetch()[0].value.activeTo); iTimeLeft = ((oDate) > (new Date())) ? CInt(Math.floor(Math.abs(oDate - (new Date())) / 1000.0)) : 0; return { active: (iTimeLeft > 0), remaining: iTimeLeft, expires: oDate }; } catch (err) { } return { active: false, remaining: 0, expires: oDate }; }, IsNewCombatTab: function() { try { if ((Router._currentRoute.getName() === "newCombat") || (window.location.href.indexOf("/newCombat") !== -1)) { return true; } } catch (err) { } return false; }, GetActiveTab: function() { let active_tab = ""; let current_route = Router._currentRoute.getName(); if (current_route === "gameHome") active_tab = "home"; if (current_route === "mining") active_tab = "mining"; if (current_route === "crafting") active_tab = "crafting"; if (current_route === "combat") active_tab = "combat"; if (current_route === "newCombat") active_tab = "combat"; if (current_route === "woodcutting") active_tab = "woodcutting"; if (current_route === "farming") active_tab = "farming"; if (current_route === "inscription") active_tab = "inscription"; if (current_route === "magic") active_tab = "magic"; if (current_route === "faq") active_tab = "faq"; if (current_route === "chat") active_tab = "chat"; if (current_route === "skills") active_tab = "skills"; if (current_route === "achievements") active_tab = "achievements"; if (current_route === "updates") active_tab = "updates"; if (active_tab === "") { if (window.location.href.indexOf("/gameHome") !== -1) active_tab = "home"; if (window.location.href.indexOf("/mining") !== -1) active_tab = "mining"; if (window.location.href.indexOf("/crafting") !== -1) active_tab = "crafting"; if (window.location.href.indexOf("/combat") !== -1) active_tab = "combat"; if (window.location.href.indexOf("/newCombat") !== -1) active_tab = "combat"; if (window.location.href.indexOf("/woodcutting") !== -1) active_tab = "woodcutting"; if (window.location.href.indexOf("/farming") !== -1) active_tab = "farming"; if (window.location.href.indexOf("/inscription") !== -1) active_tab = "inscription"; if (window.location.href.indexOf("/magic") !== -1) active_tab = "magic"; if (window.location.href.indexOf("/faq") !== -1) active_tab = "faq"; if (window.location.href.indexOf("/chat") !== -1) active_tab = "chat"; if (window.location.href.indexOf("/skills") !== -1) active_tab = "skills"; if (window.location.href.indexOf("/achievements") !== -1) active_tab = "achievements"; if (window.location.href.indexOf("/updates") !== -1) active_tab = "updates"; } return active_tab; }, GetActiveTabSection: function() { let active_tab_section = ""; try { let active_tab = window.ET.MCMF.GetActiveTab(); if (active_tab === "mining") active_tab_section = Meteor.connection._stores.users._getCollection().find().fetch()[0].uiState.miningTab; if (active_tab === "crafting") active_tab_section = Meteor.connection._stores.users._getCollection().find().fetch()[0].uiState.craftingFilter; if (active_tab === "combat") { if (window.ET.MCMF.IsNewCombatTab()) active_tab_section = Meteor.connection._stores.users._getCollection().find().fetch()[0].uiState.newCombatType; else active_tab_section = Meteor.connection._stores.users._getCollection().find().fetch()[0].uiState.combatTab; } if (active_tab === "farming") active_tab_section = Meteor.connection._stores.users._getCollection().find().fetch()[0].uiState.farmingTab; if (active_tab === "inscription") active_tab_section = Meteor.connection._stores.users._getCollection().find().fetch()[0].uiState.inscriptionFilter; if (active_tab === "achievements") active_tab_section = Meteor.connection._stores.users._getCollection().find().fetch()[0].uiState.achievementTab; if (active_tab === "magic") active_tab_section = Meteor.connection._stores.users._getCollection().find().fetch()[0].uiState.magicTab; active_tab_section = active_tab_section.trim().toLowerCase(); if (active_tab_section === "minepit") active_tab_section = "mine pit"; if (active_tab_section === "personalquest") active_tab_section = "personal quest"; if (active_tab_section === "tower") active_tab_section = "the tower"; if (active_tab_section === "battlelog") active_tab_section = "battle log"; if (active_tab_section === "pigment") active_tab_section = "pigments"; if (active_tab_section === "book") active_tab_section = "books"; if (active_tab_section === "magic_book") active_tab_section = "magic books"; if (active_tab_section === "spellbook") active_tab_section = "spell book"; if (active_tab_section.length === 0) throw "Invalid active tab section"; } catch (err) { try { active_tab_section = window.jQ(window.jQ("a.active").get(1)).text().trim().toLowerCase(); if (active_tab_section.length === 0) throw "Invalid active tab section"; } catch (err) { } } return active_tab_section; }, BattleSocket_UseAbility: function(abil, targ) { try { let sMsg = ''; if (targ === undefined) { sMsg = '["action",{"abilityId":"' + abil + '","targets":[],"caster":"' + window.ET.MCMF.UserID + '"}]'; if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log(`Battle socket emitting: '${sMsg}'`); battleSocket.emit ( "action", { abilityId: abil, targets: [], caster: window.ET.MCMF.UserID } ); } else { sMsg = '["action",{"abilityId":"' + abil + '","targets":["' + targ + '"],"caster":"' + window.ET.MCMF.UserID + '"}]'; if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log(`Battle socket emitting: '${sMsg}'`); battleSocket.emit ( "action", { abilityId: abil, targets: [targ], caster: window.ET.MCMF.UserID } ); } } catch (err) { } }, CallGameCmd: function() { try { if (arguments.length > 0) { let cmd = arguments[0]; let fnc = function() { }; if (arguments.length === 1) { if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log(`Calling: '${cmd}' with no data`); Package.meteor.Meteor.call(cmd, fnc); } else { let data1, data2, data3, data4; if (typeof arguments[arguments.length - 1] === "function") { fnc = arguments[arguments.length - 1]; if (arguments.length >= 3) data1 = arguments[1]; if (arguments.length >= 4) data2 = arguments[2]; if (arguments.length >= 5) data3 = arguments[3]; if (arguments.length >= 6) data4 = arguments[4]; } else { if (arguments.length >= 2) data1 = arguments[1]; if (arguments.length >= 3) data2 = arguments[2]; if (arguments.length >= 4) data3 = arguments[3]; if (arguments.length >= 5) data4 = arguments[4]; } if (data1 === undefined) { if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log(`Calling: '${cmd}' with no data`); Package.meteor.Meteor.call(cmd, fnc); } else if (data2 === undefined) { if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log(`Calling: '${cmd}' with { ${JSON.stringify(data1)} }`); Package.meteor.Meteor.call(cmd, data1, fnc); } else if (data3 === undefined) { if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log(`Calling: '${cmd}' with { ${JSON.stringify(data1)}, ${JSON.stringify(data2)} }`); Package.meteor.Meteor.call(cmd, data1, data2, fnc); } else if (data4 === undefined) { if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log(`Calling: '${cmd}' with { ${JSON.stringify(data1)}, ${JSON.stringify(data2)}, ${JSON.stringify(data3)} }`); Package.meteor.Meteor.call(cmd, data1, data2, data3, fnc); } else { if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log(`Calling: '${cmd}' with { ${JSON.stringify(data1)}, ${JSON.stringify(data2)}, ${JSON.stringify(data3)}, ${JSON.stringify(data4)} }`); Package.meteor.Meteor.call(cmd, data1, data2, data3, data4, fnc); } } } else if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log("Meteor::Warning, CallGameCmd() with no arguments!"); } catch (err) { if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log("Meteor::Exception in CallGameCmd():"); if (window.ET.MCMF.WantDebug) console.log(err); } }, SendGameCmd: function(cmd) { try { Meteor.connection._send(cmd); if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log(`Meteor::Sending: ${JSON.stringify(cmd)}`); } catch (err) { if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log(`Meteor::Exception in SendGameCmd(${JSON.stringify(cmd)}):`); if (window.ET.MCMF.WantDebug) console.log(err); } }, FasterAbilityUpdates: function() { try { window.ET.MCMF.SubscribeToGameChannel("abilities"); if ((window.ET.MCMF.WantFasterAbilityCDs) && (window.ET.MCMF.FinishedLoading) && (!window.ET.MCMF.InBattle) && (!window.ET.MCMF.AbilitiesReady)) window.ET.MCMF.CallGameCmd("abilities.gameUpdate"); } catch (err) { } setTimeout(window.ET.MCMF.FasterAbilityUpdates, 2000); }, PlayerInCombat: function() { return ((window.ET.MCMF.InBattle) || ((window.ET.MCMF.Time() - window.ET.MCMF.TimeLastFight) < 3)); }, AbilityCDTrigger: function() { try { if ((window.ET.MCMF.FinishedLoading) && (!window.ET.MCMF.PlayerInCombat())) { iTotalCD = 0; iTotalCDTest = 0; iHighestCD = 0; window.ET.MCMF.GetAbilities().forEach(function(oThisAbility) { if (oThisAbility.equipped) { if (parseInt(oThisAbility.currentCooldown) > 0) { iTotalCD += parseInt(oThisAbility.currentCooldown); if (iHighestCD < parseInt(oThisAbility.currentCooldown)) iHighestCD = parseInt(oThisAbility.currentCooldown); } } iTotalCDTest += parseInt(oThisAbility.cooldown); }); if ((iTotalCDTest > 0) && (iTotalCD === 0)) { if (!window.ET.MCMF.AbilitiesReady) { if (!window.ET.MCMF.InitialAbilityCheck) { if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log("<-- triggering ET:abilitiesReady -->"); window.ET.MCMF.EventTrigger("ET:abilitiesReady"); } } window.ET.MCMF.AbilitiesReady = true; window.ET.MCMF.TimeLeftOnCD = 0; } else { window.ET.MCMF.AbilitiesReady = false; window.ET.MCMF.TimeLeftOnCD = iHighestCD; } window.ET.MCMF.InitialAbilityCheck = false; } else { window.ET.MCMF.AbilitiesReady = false; window.ET.MCMF.TimeLeftOnCD = 9999; } } catch (err) { } setTimeout(window.ET.MCMF.AbilityCDTrigger, 500); }, BattleFloorRoom: "0.0", BattleFirstFrame: undefined, BattleUnitList: [], BattleUITemplate: undefined, LiveBattleData: function() { try { if (window.ET.MCMF.BattleUITemplate !== undefined) return window.ET.MCMF.BattleUITemplate.state.get("currentBattle"); } catch (err) { } return undefined; }, LastUnitIDList: '', InternalBattleTickMonitor: undefined, CombatStarted: function(forced) { if (!window.ET.MCMF.FinishedLoading) { setTimeout(window.ET.MCMF.CombatStarted, 100); return; } if (forced || (window.ET.MCMF.InternalBattleTickMonitor === undefined) || (window.ET.MCMF.BattleFirstFrame === undefined)) { window.ET.MCMF.InternalBattleTickMonitor = true; battleSocket.on('tick', function(oAllData) { let battleData = window.ET.MCMF.LiveBattleData(); if (battleData !== undefined) { /* if (battleData.floor !== undefined) { let currentFloorRoom = CInt(battleData.floor).toFixed(0) + "." + CInt(battleData.room).toFixed(0); if (window.ET.MCMF.BattleFloorRoom !== currentFloorRoom) { window.ET.MCMF.BattleFloorRoom = currentFloorRoom; window.ET.MCMF.BattleFirstFrame = undefined; } } */ let CurrentUnitIDList = ''; jQ.makeArray(battleData.enemies).forEach(function(oEnemyUnit) { CurrentUnitIDList += `${oEnemyUnit.id}|`; }); let bNewBattleFrameReset = false; jQ.makeArray(battleData.enemies).forEach(function(oEnemyUnit) { if (window.ET.MCMF.LastUnitIDList.indexOf(`${oEnemyUnit.id}|`) === -1) bNewBattleFrameReset = true; }); if (bNewBattleFrameReset) window.ET.MCMF.BattleFirstFrame = undefined; window.ET.MCMF.LastUnitIDList = CurrentUnitIDList; if (window.ET.MCMF.BattleFirstFrame === undefined) { window.ET.MCMF.BattleFirstFrame = battleData; if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log("<-- triggering ET:firstBattleFrame -->"); window.ET.MCMF.EventTrigger("ET:firstBattleFrame"); //window.ET.MCMF.Log("new BattleFirstFrame data:"); //console.log(window.ET.MCMF.BattleFirstFrame); } if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log("<-- triggering ET:combatTick -->"); window.ET.MCMF.EventTrigger("ET:combatTick"); } }); } }, InitGameTriggers: function() { if ((Package.meteor.Meteor === undefined) || (Package.meteor.Meteor.connection === undefined) || (Package.meteor.Meteor.connection._stream === undefined) || (Template.currentBattleUi === undefined)) { setTimeout(window.ET.MCMF.InitGameTriggers, 100); return; } window.ET.MCMF.EventSubscribe("ET:navigation", function() { window.ET.MCMF.InternalBattleTickMonitor = undefined; // re-trigger combat-start events when the battle socket is reconnected if (window.ET.MCMF.InBattle && window.ET.MCMF.IsNewCombatTab()) window.ET.MCMF.CombatStarted(true); }); Router.onRun(function() { if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log("<-- triggering ET:navigation -->"); window.ET.MCMF.EventTrigger("ET:navigation"); try { let sCurrentRoute = Router._currentRoute.getName(); if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log(`<-- triggering ET:navigation:${sCurrentRoute} -->`); window.ET.MCMF.EventTrigger(`ET:navigation:${sCurrentRoute}`); } catch (err) { } this.next(); }); // note: not a trustworthy method to get new battle unit data, since the templates will reuse and not trigger render from room to room Blaze._getTemplate("battleUnit").onRendered(function() { if ((this.data !== undefined) && (this.data.unit !== undefined)) window.ET.MCMF.BattleUnitList.push(this); }); Template.currentBattleUi.onCreated(function() { window.ET.MCMF.BattleUITemplate = this; }); Template.currentBattleUi.onDestroyed(function() { window.ET.MCMF.BattleUITemplate = undefined; window.ET.MCMF.BattleUnitList = []; }); Package.meteor.Meteor.connection._stream.on('message', function(sMeteorRawData) { //if (window.ET.MCMF.CombatID === undefined) // window.ET.MCMF.GetPlayerCombatData(); try { oMeteorData = JSON.parse(sMeteorRawData); ///////////////////////////////////////////////////////////////////////////////////////////////////////// // // BACKUP TO RETRIEVE USER AND COMBAT IDS // /* if (oMeteorData.collection === "users") if ((window.ET.MCMF.UserID === undefined) || (window.ET.MCMF.UserID.length !== 17)) window.ET.MCMF.UserID = oMeteorData.id; if (oMeteorData.collection === "combat") if ((window.ET.MCMF.CombatID === undefined) || (window.ET.MCMF.CombatID.length !== 17)) if (oMeteorData.fields.owner === window.ET.MCMF.UserID) window.ET.MCMF.CombatID = oMeteorData.id; */ // ///////////////////////////////////////////////////////////////////////////////////////////////////////// if (oMeteorData.collection === "battlesList") { window.ET.MCMF.AbilitiesReady = false; if ((oMeteorData.msg === "added") || (oMeteorData.msg === "removed")) { window.ET.MCMF.InternalBattleTickMonitor = undefined; window.ET.MCMF.BattleFirstFrame = undefined; window.ET.MCMF.BattleUnitList = []; window.ET.MCMF.InBattle = (oMeteorData.msg === "added"); if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log("<-- triggering ET:combat" + (((oMeteorData.msg === "added")) ? ("Start") : ("End")) + " -->"); window.ET.MCMF.EventTrigger("ET:combat" + (((oMeteorData.msg === "added")) ? ("Start") : ("End"))); if (window.ET.MCMF.InBattle) window.ET.MCMF.CombatStarted(); else window.ET.MCMF.BattleFloorRoom = "0.0"; } } if ((oMeteorData.collection === "battles") && (oMeteorData.msg === "added")) { if (oMeteorData.fields.finished) { window.ET.MCMF.WonLast = oMeteorData.fields.win; window.ET.MCMF.TimeLastFight = window.ET.MCMF.Time(); if (window.ET.MCMF.FinishedLoading) { if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log("<-- triggering ET:combat" + ((oMeteorData.fields.win) ? ("Won") : ("Lost")) + " -->"); window.ET.MCMF.EventTrigger("ET:combat" + ((oMeteorData.fields.win) ? ("Won") : ("Lost"))); } } else window.ET.MCMF.CombatStarted(); } } catch (err) { } }); }, PlayerHP: function() { return window.ET.MCMF.GetPlayerCombatData().stats.health; }, PlayerHPMax: function() { return window.ET.MCMF.GetPlayerCombatData().stats.healthMax; }, PlayerEnergy: function() { return window.ET.MCMF.GetPlayerCombatData().stats.energy; }, AbilityCDCalc: function() { iTotalCD = 0; iTotalCDTest = 0; iHighestCD = 0; window.ET.MCMF.GetAbilities().forEach(function(oThisAbility) { if (oThisAbility.equipped) { if (parseInt(oThisAbility.currentCooldown) > 0) { iTotalCD += parseInt(oThisAbility.currentCooldown); if (iHighestCD < parseInt(oThisAbility.currentCooldown)) iHighestCD = parseInt(oThisAbility.currentCooldown); } } iTotalCDTest += parseInt(oThisAbility.cooldown); }); if ((iTotalCDTest > 0) && (iTotalCD === 0)) { if (!window.ET.MCMF.AbilitiesReady) { if (!window.ET.MCMF.InitialAbilityCheck) { if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log("<-- triggering ET:abilitiesReady -->"); window.ET.MCMF.EventTrigger("ET:abilitiesReady"); } } window.ET.MCMF.AbilitiesReady = true; window.ET.MCMF.TimeLeftOnCD = 0; } else { window.ET.MCMF.AbilitiesReady = false; window.ET.MCMF.TimeLeftOnCD = iHighestCD; } window.ET.MCMF.InitialAbilityCheck = false; }, GetUnitCombatData: function(sUnitID) { let oCombatPlayerData; try { // get recent combat data from stored 'state' data in 'BattleUITemplate' template (comes from 'battleSocket') if (window.ET.MCMF.LiveBattleData() !== undefined) { jQ.makeArray(window.ET.MCMF.LiveBattleData().units).forEach(function(oCurrentUnit) { if (oCurrentUnit.id === sUnitID) oCombatPlayerData = oCurrentUnit; }); } } catch (err) { } return oCombatPlayerData; }, GetEnemyCombatData: function(sUnitID) { let oCombatEnemyData; try { // get recent combat data from stored 'state' data in 'BattleUITemplate' template (comes from 'battleSocket') if (window.ET.MCMF.LiveBattleData() !== undefined) { jQ.makeArray(window.ET.MCMF.LiveBattleData().enemies).forEach(function(oCurrentUnit) { if (oCurrentUnit.id === sUnitID) oCombatEnemyData = oCurrentUnit; }); } } catch (err) { } return oCombatEnemyData; }, GetPlayerCombatData: function() { try { Meteor.connection._stores.combat._getCollection().find().fetch().forEach(function(oThisCombatUnit) { if (oThisCombatUnit.owner === window.ET.MCMF.UserID) window.ET.MCMF.PlayerUnitData = oThisCombatUnit; }); // new: get updated combat data from stored 'state' data in 'BattleUITemplate' template (comes from 'battleSocket') if (window.ET.MCMF.LiveBattleData() !== undefined) { jQ.makeArray(window.ET.MCMF.LiveBattleData().units).forEach(function(oCurrentUnit) { if (oCurrentUnit.id === window.ET.MCMF.UserID) window.ET.MCMF.PlayerUnitData = oCurrentUnit; }); } } catch (err) { } return window.ET.MCMF.PlayerUnitData; }, GetAbilities: function() { return Meteor.connection._stores.abilities._getCollection().find().fetch()[0].learntAbilities; }, GetAdventures: function() { let oAdventureDetails = { AllAdventures: [], ShortAdventures: [], LongAdventures: [], EpicAdventures: [], PhysicalAdventures: [], MagicalAdventures: [], ActiveAdventures: [], CurrentAdventure: undefined }; // oThisAdventure // .duration {duration in seconds} (integer) // .endDate {end date/time} (Date()) (property only exists if the adventure is ongoing) // .floor {corresponding Tower Floor} (integer) // .icon "{imageofbattle.ext}" (string) // .id "{guid}" (13-digit alphanumeric string) // .length "short" / "long" / "epic" (string) // .level {general level} (integer) // .name "{Name of Battle}" (string) // .room {corresponding Tower Room in Tower Floor} (integer) // .type "physical" / "magic" (string) // .startDate {start date/time} (Date()) (property only exists if the adventure is ongoing) window.ET.MCMF.GetAdventures_raw().forEach(function(oThisAdventure) { try { oAdventureDetails.AllAdventures.push(oThisAdventure); if (oThisAdventure.length === "short") oAdventureDetails.ShortAdventures .push(oThisAdventure); if (oThisAdventure.length === "long") oAdventureDetails.LongAdventures .push(oThisAdventure); if (oThisAdventure.length === "epic") oAdventureDetails.EpicAdventures .push(oThisAdventure); if (oThisAdventure.type === "physical") oAdventureDetails.PhysicalAdventures.push(oThisAdventure); if (oThisAdventure.type === "magic") oAdventureDetails.MagicalAdventures .push(oThisAdventure); if (oThisAdventure.endDate !== undefined) oAdventureDetails.ActiveAdventures .push(oThisAdventure); } catch (err) { } }); oAdventureDetails.AllAdventures.sort(function(advA, advB) { if ((advA.startDate === undefined) && (advB.startDate !== undefined)) return 1; if ((advA.startDate !== undefined) && (advB.startDate === undefined)) return -1; if ((advA.startDate !== undefined) && (advB.startDate !== undefined)) { if (advA.startDate > advB.startDate) return 1; if (advA.startDate < advB.startDate) return -1; } if (advA.duration > advB.duration) return 1; if (advA.duration < advB.duration) return -1; return 0; }); oAdventureDetails.ActiveAdventures.sort(function(advA, advB) { if (advA.startDate > advB.startDate) return 1; if (advA.startDate < advB.startDate) return -1; return 0; }); oAdventureDetails.PhysicalAdventures.sort(function(advA, advB) { if (advA.duration > advB.duration) return 1; if (advA.duration < advB.duration) return -1; return 0; }); oAdventureDetails.MagicalAdventures.sort(function(advA, advB) { if (advA.duration > advB.duration) return 1; if (advA.duration < advB.duration) return -1; return 0; }); if (oAdventureDetails.ActiveAdventures.length > 0) oAdventureDetails.CurrentAdventure = oAdventureDetails.ActiveAdventures[0]; return oAdventureDetails; }, GetAdventures_raw: function() { try { return Meteor.connection._stores.adventures._getCollection().find().fetch()[0].adventures; } catch (err) { } return []; }, GetChats: function() { return Meteor.connection._stores.simpleChats._getCollection().find().fetch(); }, GetItem: function(in__id) { let oItems = window.ET.MCMF.GetItems({_id: in__id}); if (oItems.length > 0) return oItems[0]; return {}; }, GetItems: function() { let oItems; if (arguments.length === 0) oItems = jQ.makeArray(Meteor.connection._stores.items._getCollection().find().fetch()); else oItems = jQ.makeArray(Meteor.connection._stores.items._getCollection().find(arguments[0]).fetch()); for (let i = 0; i < oItems.length; i++) oItems[i] = window.ET.MCMF.AddItemConsts(oItems[i]); return oItems; }, AddItemConsts: function(oItem) { let oItemNew; let consts; try { consts = (IsValid(window) && IsValid(window.gameConstants)) ? window.gameConstants : (IsValid(unsafeWindow) && IsValid(unsafeWindow.gameConstants)) ? unsafeWindow.gameConstants : { }; oItemNew = { ...(oItem) }; oItemNew = { ...(oItemNew), ...(consts.ITEMS[oItemNew.itemId]) }; if (IsValid(oItemNew.produces) && IsValid(consts.FARMING) && IsValid(consts.FARMING.plants)) { oItemNew.plantingDetails = consts.FARMING.plants[oItemNew.produces]; if (IsValid(oItemNew.plantingDetails)) oItemNew.required = oItemNew.plantingDetails.required; } } catch (err) { } try { oItemNew = { ...(oItemNew), ...(oItem) }; oItemNew.stats = sumObjectsByKey(oItem.extraStats, consts.ITEMS[oItem.itemId].stats); } catch (err) { } try { if (typeof oItemNew['description'] === 'function') oItemNew.description = oItemNew.description(); } catch (err) { } return oItemNew; }, GetSkills: function() { return Meteor.connection._stores.skills._getCollection().find().fetch(); }, AnyJQ: function() { if (typeof jQ != 'undefined') return jQ; if (typeof window.jQ != 'undefined') return window.jQ; if (typeof $ !== 'undefined') return $; if (typeof window.$ !== 'undefined') return window.$; if (typeof jQuery != 'undefined') return jQuery; if (typeof window.jQuery != 'undefined') return window.jQuery; return undefined; }, Setup: function() { if ((!window.ET.MCMF.TryingToLoad) && (!window.ET.MCMF.FinishedLoading)) { // use whatever version of jQuery available to us window.ET.MCMF.AnyJQ()("body").append("<div id=\"ET_meancloud_bootstrap\" style=\"visibility: hidden; display: none;\"></div>"); window.ET.MCMF.TryingToLoad = true; window.ET.MCMF.Setup_Initializer(); } }, Setup_Initializer: function() { // wait for Meteor availability if ((Package === undefined) || (Package.meteor === undefined) || (Package.meteor.Meteor === undefined) || (Package.meteor.Meteor.connection === undefined) || (Package.meteor.Meteor.connection._stream === undefined)) { setTimeout(window.ET.MCMF.Setup_Initializer, 10); return; } if (!window.ET.MCMF.Initialized) { window.ET.MCMF.Initialized = true; window.ET.MCMF.Setup_SendDelayedInitializer(); window.ET.MCMF.InitGameTriggers(); window.ET.MCMF.Setup_remaining(); } }, Setup_SendDelayedInitializer: function() { try { jQ("div#ET_meancloud_bootstrap").trigger("ET:initialized"); window.ET.MCMF.EventTrigger("ET:initialized"); } catch (err) { setTimeout(window.ET.MCMF.Setup_SendDelayedInitializer, 100); } }, Setup_remaining: function() { try { if (Meteor === undefined) throw "[MCMF Setup] Not loaded yet: Meteor not initialized"; if (Meteor.connection === undefined) throw "[MCMF Setup] Not loaded yet: Meteor not initialized"; if (Meteor.connection._userId === undefined) throw "[MCMF Setup] Not loaded yet: Meteor not initialized"; window.ET.MCMF.UserID = Meteor.connection._userId; //window.ET.MCMF.UserName = Meteor.connection._stores.users._getCollection()._collection._docs._map[window.ET.MCMF.UserID].username; window.ET.MCMF.UserName = [...Meteor.connection._stores.users._getCollection()._collection._docs._map.values()][0].username; window.ET.MCMF.GetPlayerCombatData(); if (window.ET.MCMF.GetAbilities().length < 0) throw "[MCMF Setup] Not loaded yet: no abilities"; if (window.ET.MCMF.GetItems().length < 0) throw "[MCMF Setup] Not loaded yet: no items"; if (window.ET.MCMF.GetChats().length < 0) throw "[MCMF Setup] Not loaded yet: no chats"; if (window.ET.MCMF.GetSkills().length < 0) throw "[MCMF Setup] Not loaded yet: no skills"; // if the above is all good, then this should be no problem: window.ET.MCMF.AbilityCDTrigger(); // set up ability CD trigger window.ET.MCMF.AbilityCDCalc(); window.ET.MCMF.FasterAbilityUpdates(); // set up faster ability updates (do not disable, this is controlled via configurable setting) // trigger finished-loading event if (!window.ET.MCMF.FinishedLoading) { if (window.ET.MCMF.WantDebug) window.ET.MCMF.Log("<-- triggering ET:loaded -->"); window.ET.MCMF.EventTrigger("ET:loaded"); window.ET.MCMF.FinishedLoading = true; } } catch (err) // any errors and we retry setup { if (err.toString().indexOf("[MCMF Setup]") !== -1) { window.ET.MCMF.Log("ET MCMF setup exception:"); console.log(err); } setTimeout(window.ET.MCMF.Setup_remaining, 500); } }, // Ready means the mod framework has been initialized, but Meteor is not yet available Ready: function(fnCallback, sNote) { if (!window.ET.MCMF.Initialized) window.ET.MCMF.EventSubscribe("initialized", fnCallback, sNote); else fnCallback(); }, // Loaded means the mod framework and Meteor are fully loaded and available Loaded: function(fnCallback, sNote) { if (!window.ET.MCMF.FinishedLoading) window.ET.MCMF.EventSubscribe("loaded", fnCallback, sNote); else fnCallback(); }, }; window.ET.MCMF.Setup(); } //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// ////////// ** CORE SCRIPT STARTUP -- DO NOT MODIFY ** ////////// function LoadJQ(callback) { if (window.jQ === undefined) { var script=document.createElement("script");script.setAttribute("src","//ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js");script.addEventListener('load',function() { var subscript=document.createElement("script");subscript.textContent="window.jQ=jQuery.noConflict(true);("+callback.toString()+")();";document.body.appendChild(subscript); }, !1);document.body.appendChild(script); } else callback(); } LoadJQ(startup); ////////////////////////////////////////////////////////////////
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址