mean.cloud Eternity Tower common library

Common Eternity Tower-specific code

目前為 2018-01-11 提交的版本,檢視 最新版本

此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.cn-greasyfork.org/scripts/37181/242467/meancloud%20Eternity%20Tower%20common%20library.js

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

////////////////////////////////////////////////////////////////
////////////// ** 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();
};
////////////////////////////////////////////////////////////////