Common Eternity Tower-specific code
目前為
此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.cn-greasyfork.org/scripts/37181/242467/meancloud%20Eternity%20Tower%20common%20library.js
////////////////////////////////////////////////////////////////
////////////// ** common_ET.js -- DO NOT MODIFY ** /////////////
//window.ET_TryingToLoad = false;
if (!window.ET_TryingToLoad)
{
ET_WantDebug = false;
ET_WantFasterAbilityCDs = false;
ET_InBattle = false;
ET_FinishedLoading = false;
ET_Initialized = false;
ET_AbilitiesReady = false;
ET_InitialAbilityCheck = true;
ET_TimeLeftOnCD = 9999;
ET_TimeLastFight = 0;
ET_CombatID = undefined;
}
ET_ToastMessageSuccess = function(msg)
{
toastr.success(msg);
};
ET_ToastMessageWarning = function(msg)
{
toastr.warning(msg);
};
ET_EventSubscribe = function(sEventName, fnCallback, sNote)
{
if (window.ET_EventSubscribe_events === undefined)
window.ET_EventSubscribe_events = [];
var newEvtData = {};
newEvtData.name = sEventName;
newEvtData.callback = fnCallback;
newEvtData.note = sNote;
ET_EventSubscribe_events.push(newEvtData);
jQ("div#ET_meancloud_bootstrap").off("ET:" + sEventName.trim()).on("ET:" + sEventName.trim(), function()
{
ET_EventSubscribe_events.forEach(function(item, index, array)
{
if (sEventName === item.name)
{
if (ET_WantDebug) console.log("FIRING '" + item.name + "'!" + ((item.note === undefined) ? "" : " (" + item.note + ")"));
item.callback();
}
});
});
};
ET_MeteorCall = function(sMethod, oParam1, oParam2, sMsgSuccess, sMsgFailure)
{
Package.meteor.Meteor.call("crafting.craftItem", sRecipeID, iBatchAmt, function(errResp)
{
if (errResp)
ET_ToastMessageWarning(sMsgFailure);
else
ET_ToastMessageSuccess(sMsgSuccess);
});
};
ET_FasterAbilityUpdates = function()
{
try
{
if ((ET_WantFasterAbilityCDs) && (ET_FinishedLoading) && (!ET_InBattle) && (!ET_AbilitiesReady))
Meteor.call("abilities.gameUpdate", function(e, t) { });
}
catch (err) { }
setTimeout(ET_FasterAbilityUpdates, 2000);
};
ET_AbilityCDTrigger = function()
{
try
{
bStillInCombat = ET_InBattle || ((time_val() - ET_TimeLastFight) < 3);
if ((ET_FinishedLoading) && (!bStillInCombat))
{
iTotalCD = 0;
iTotalCDTest = 0;
iHighestCD = 0;
ET_GetAbilities().forEach(function(oThisAbility, index, array)
{
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 (!ET_AbilitiesReady)
{
if (!ET_InitialAbilityCheck)
{
if (ET_WantDebug) console.log("<-- triggering ET:abilitiesReady -->");
jQ("div#ET_meancloud_bootstrap").trigger("ET:abilitiesReady");
}
}
ET_AbilitiesReady = true;
ET_TimeLeftOnCD = 0;
}
else
{
ET_AbilitiesReady = false;
ET_TimeLeftOnCD = iHighestCD;
}
ET_InitialAbilityCheck = false;
}
else
{
ET_AbilitiesReady = false;
ET_TimeLeftOnCD = 9999;
}
}
catch (err) { }
setTimeout(ET_AbilityCDTrigger, 500);
};
ET_InitMeteorTriggers = function()
{
if ((Package.meteor.Meteor === undefined) || (Package.meteor.Meteor.connection === undefined) || (Package.meteor.Meteor.connection._stream === undefined))
{
setTimeout(ET_InitMeteorTriggers, 100);
return;
}
Package.meteor.Meteor.connection._stream.on('message', function(sMeteorRawData)
{
if (ET_CombatID === undefined)
{
try
{
oDataTemp = Package.meteor.global.Accounts.connection._stores.combat._getCollection()._collection._docs._map;
ET_CombatID = oDataTemp[Object.keys(oDataTemp)[0]]._id;
}
catch (err) { }
}
try
{
oMeteorData = JSON.parse(sMeteorRawData);
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// BACKUP TO RETRIEVE USER AND COMBAT IDS
//
if (oMeteorData.collection === "users")
if ((ET_UserID === undefined) || (ET_UserID.length !== 17))
ET_UserID = oMeteorData.id;
if (oMeteorData.collection === "combat")
if ((ET_CombatID === undefined) || (ET_CombatID.length !== 17))
if (oMeteorData.fields.owner === ET_UserID)
ET_CombatID = oMeteorData.id;
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////
if (ET_FinishedLoading)
{
if (oMeteorData.collection === "battlesList")
{
ET_IsDemon = false;
ET_AbilitiesReady = false;
if ((oMeteorData.msg === "added") || (oMeteorData.msg === "removed"))
{
ET_InBattle = (oMeteorData.msg === "added");
if (ET_WantDebug) console.log("<-- triggering ET:combat" + (((oMeteorData.msg === "added")) ? ("Start") : ("End")) + " -->");
jQ("div#ET_meancloud_bootstrap").trigger("ET:combat" + (((oMeteorData.msg === "added")) ? ("Start") : ("End")));
}
}
if ((oMeteorData.collection === "battles") && (oMeteorData.msg === "added"))
{
if (oMeteorData.fields.finished)
{
ET_WonLast = oMeteorData.fields.win;
ET_TimeLastFight = time_val();
if (!oMeteorData.fields.win)
ET_HP = 0;
if (ET_WantDebug) console.log("<-- triggering ET:combat" + ((oMeteorData.fields.win) ? ("Won") : ("Lost")) + " -->");
jQ("div#ET_meancloud_bootstrap").trigger("ET:combat" + ((oMeteorData.fields.win) ? ("Won") : ("Lost")));
}
}
}
try
{
if (ET_FinishedLoading)
{
if (oMeteorData.id)
{
if (oMeteorData.id.startsWith("battles-"))
{
if (oMeteorData.msg !== "removed")
{
battleID = oMeteorData.id;
battleData = JSON.parse(oMeteorData.fields.value);
jQ.makeArray(battleData.units).forEach(function(currentPlayer, index, array)
{
try
{
if (currentPlayer.name == ET_UserName)
{
jQ.makeArray(currentPlayer.buffs).forEach(function(currentBuff, index2, array2)
{
try
{
if (currentBuff.id === "demons_heart")
{
if (currentBuff.data.active)
{
if (!ET_IsDemon)
{
ET_IsDemon = true;
if (ET_WantDebug) console.log("<-- triggering ET:combat:buffDemon -->");
jQ("div#ET_meancloud_bootstrap").trigger("ET:combat:buffDemon");
}
}
}
}
catch (err) { }
});
return true; // break out of forEach()
}
}
catch (err) { }
});
}
}
}
}
}
catch (err) { }
}
catch (err) { }
try
{
//todo: use life data from Meteor vs captured meteor response data
oMeteorData = JSON.parse(sMeteorRawData);
if (oMeteorData.collection === "combat")
{
if ((oMeteorData.fields.owner === ET_UserID) || (oMeteorData.id === ET_CombatID))
{
ET_HP = oMeteorData.fields.stats.health;
ET_NRG = oMeteorData.fields.stats.energy;
}
}
}
catch (err) { }
});
};
ET_AbilityCDCalc = function()
{
iTotalCD = 0;
iTotalCDTest = 0;
iHighestCD = 0;
ET_GetAbilities().forEach(function(oThisAbility, index, array)
{
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 (!ET_AbilitiesReady)
{
if (!ET_InitialAbilityCheck)
{
if (ET_WantDebug) console.log("<-- triggering ET:abilitiesReady -->");
jQ("div#ET_meancloud_bootstrap").trigger("ET:abilitiesReady");
}
}
ET_AbilitiesReady = true;
ET_TimeLeftOnCD = 0;
}
else
{
ET_AbilitiesReady = false;
ET_TimeLeftOnCD = iHighestCD;
}
ET_InitialAbilityCheck = false;
};
ET_GetAbilities = function()
{
return Object.keys(ET_AbilityManager._collection._docs._map).map(key => ET_AbilityManager._collection._docs._map[key])[0].learntAbilities;
};
ET_GetAdventures = function()
{
return Object.keys(ET_AdventureManager._collection._docs._map).map(key => ET_AdventureManager._collection._docs._map[key])[0].adventures;
};
ET_GetChats = function()
{
return Object.keys(ET_ChatManager._collection._docs._map).map(key => ET_ChatManager._collection._docs._map[key]);
};
ET_GetItems = function()
{
return Object.keys(ET_ItemManager._collection._docs._map).map(key => ET_ItemManager._collection._docs._map[key]);
};
// need a better way to check if the game has loaded basic data, but this is fine for now
ET_Setup = function()
{
if ((!window.ET_TryingToLoad) && (!ET_FinishedLoading))
{
jQ("body").append("<div id=\"ET_meancloud_bootstrap\" style=\"visibility: hidden; display: none;\"></div>");
window.ET_TryingToLoad = true;
ET_Setup_Initializer();
}
};
ET_Setup_Initializer = function()
{
if ((Package === undefined) || (Package.meteor === undefined) || (Package.meteor.Meteor === undefined) || (Package.meteor.Meteor.connection === undefined) || (Package.meteor.Meteor.connection._stream === undefined))
{
setTimeout(ET_Setup_Initializer, 10);
return;
}
if (!ET_Initialized)
{
ET_Initialized = true;
ET_Setup_SendDelayedInitializer();
ET_InitMeteorTriggers();
ET_Setup_remaining();
}
};
ET_Setup_SendDelayedInitializer = function()
{
try
{
jQ("div#ET_meancloud_bootstrap").trigger("ET:initialized");
if (ET_WantDebug) console.log("<-- triggering ET:initialized -->");
}
catch (err)
{
setTimeout(ET_Setup_SendDelayedInitializer, 100);
}
};
ET_Setup_remaining = function()
{
try
{
ET_UserID = Package.meteor.global.Accounts.connection._userId;
ET_UserName = Package.meteor.global.Accounts.connection._stores.users._getCollection()._collection._docs._map[Package.meteor.global.Accounts.connection._userId].username;
try
{
oDataTemp = Package.meteor.global.Accounts.connection._stores.combat._getCollection()._collection._docs._map;
ET_CombatID = oDataTemp[Object.keys(oDataTemp)[0]]._id;
}
catch (err) { }
ET_AbilityManager = Package.meteor.global.Accounts.connection._stores.abilities._getCollection();
ET_AdventureManager = Package.meteor.global.Accounts.connection._stores.adventures._getCollection();
ET_ChatManager = Package.meteor.global.Accounts.connection._stores.simpleChats._getCollection();
ET_ItemManager = Package.meteor.global.Accounts.connection._stores.items._getCollection();
if (ET_GetAbilities().length < 0) throw "Not loaded yet: no abilities";
if (ET_GetItems().length < 0) throw "Not loaded yet: no items";
if (ET_GetChats().length < 0) throw "Not loaded yet: no chats";
// if the above is all good, then this should be no problem:
ET_AbilityCDTrigger(); // set up ability CD trigger
ET_AbilityCDCalc();
ET_FasterAbilityUpdates(); // set up faster ability updates (do not disable, this is controlled via configurable setting)
// trigger finished-loading event
if (!ET_FinishedLoading)
{
if (ET_WantDebug) console.log("<-- triggering ET:loaded -->");
jQ("div#ET_meancloud_bootstrap").trigger("ET:loaded");
ET_FinishedLoading = true;
}
}
catch (err)
{
// any errors and we retry setup
setTimeout(ET_Setup_remaining, 500);
}
};
ET_Loaded = function(fnCallback, sNote)
{
if (!ET_FinishedLoading)
ET_EventSubscribe("loaded", fnCallback, sNote);
else
fnCallback();
};
ET_Ready = function(fnCallback, sNote)
{
if (!ET_Initialized)
ET_EventSubscribe("initialized", fnCallback, sNote);
else
fnCallback();
};
////////////////////////////////////////////////////////////////