您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
Custom page functions rewritten.
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyfork.icu/scripts/5426/19768/GOTA_Extender_Custom.js
var customDoLog = function() { }; var customAnimatedCoinsInit = function (b, a, e, g) { if (isWeb()) { var c, d, f, h, k = { images: ["/images/animations/coin_flip.png"], animations: { all: [0, 32] }, frames: { regX: 0, height: 60, count: 33, regY: 0, width: 61 } }, m = { images: ["/images/animations/coin_sparkle.png"], animations: { all: { frames: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] } }, frames: [ [0, 0, 128, 128, 0, 0, 0], [128, 0, 128, 128, 0, 0, 0], [256, 0, 128, 128, 0, 0, 0], [384, 0, 128, 128, 0, 0, 0], [512, 0, 128, 128, 0, 0, 0], [640, 0, 128, 128, 0, 0, 0], [768, 0, 128, 128, 0, 0, 0], [896, 0, 128, 128, 0, 0, 0], [0, 128, 128, 128, 0, 0, 0], [128, 128, 128, 128, 0, 0, 0], [256, 128, 128, 128, 0, 0, 0], [384, 128, 128, 128, 0, 0, 0], [512, 128, 128, 128, 0, 0, 0], [640, 128, 128, 128, 0, 0, 0], [768, 128, 128, 128, 0, 0, 0] ] }, l, n, p = false; //EXTENDER :: Modification, seriously? // bugfix: b.offset is undefined (offset from button to silver visually) if (null === b || null === b || b.length == 0) { return; } else if (null === a || null === a) { return; } else { if (null === e || null === e) e = [ 0, 0 ]; if (null === g || null === g) g = [0, 0]; d = $("<canvas>").attr({ id: "animatedCoins", "class": "coinCanvasAnimation", width: "130", height: "120" }).prependTo($("body")); c = d[0]; h = $("<canvas>").attr({ id: "animatedCoinsSparkle", "class": "coinCanvasAnimation", width: "130", height: "120" }).prependTo($("body")); f = h[0]; c = new createjs.Stage(c); f = new createjs.Stage(f); null === b.offset() ? (h.remove(), d.remove(), console.warn("animatedCoins: startingElement.offset() is null. Exiting script.")) : null === a.offset() ? (h.remove(), d.remove(), console.warn("animatedCoins: endingElement.offset() is null. Exiting script.")) : (d.offset({ left: b.offset().left + e[0], top: b.offset().top + e[1] }), h.offset({ left: b.offset().left + e[0], top: b.offset().top + e[1] }), e = new createjs.SpriteSheet(k), m = new createjs.SpriteSheet(m), l = new createjs.Sprite(e), l.x = 30, l.y = 25, n = new createjs.Sprite(m), l.on("animationend", function (c, f) { c.visible = false; doLog("animation end"); null === b.offset() ? (h.remove(), d.remove(), console.error("animatedCoins: startingElement.offset() is null")) : null === a.offset() ? (h.remove(), d.remove(), console.error("animatedCoins: endingElement.offset() is null")) : (h.offset({ left: a.offset().left + g[0], top: a.offset().top + g[1] }), n.visible = true, n.gotoAndPlay("all"), l.stop(), p = true); }), n.on("animationend", function (a, b) { n.visible = false; p && (n.stop(), d.fadeOut(500, function (a) { d.remove(); }), h.remove()); }), l.gotoAndPlay("all"), n.gotoAndPlay("all"), f.addChild(n), c.addChild(l), createjs.Ticker.setFPS(30), createjs.Ticker.addEventListener("tick", c), createjs.Ticker.addEventListener("tick", f), $(d).animate({ left: a.offset().left + g[0], top: a.offset().top + g[1] }, 1E3)); } } }; var customDoInstantSpeedUp = function doInstantSpeedUp(c, a, callback) { var b = buildingById(c), d = getCurrentSpeedUpType(b.producing_archetype_id, b.recipe_symbol); // EXTENDER :: Modification if (instantSpeedCost(b.build_remaining, d) > 0) { console.log('EXTENDER :: The instant speed up costs money. Exiting...'); return false; } if (false == hasGold(instantSpeedCost(b.build_remaining, d), function () { doInstantSpeedUp(c, true, callback); }, a) && true != a) return false; playSound("coins"); return speedBuild(-1, c, callback); }; var customDoFinishProduction = function doFinishProduction(c, callback) { var a = buildingByItemId(c), b = itemFromId(a.producing_archetype_id); userContext.lastFinish = a.symbol; doLog("doFinishProduction: building_id=" + c + " symbol=" + a.symbol + " producing=" + b.symbol); "Upgrade" !== b.slot && (analytics.track("Production Finish", { building_symbol: a.symbol, item_symbol: b.symbol, item_category: b.slot }), analytics.wizardtrack("Production Finish", { building_symbol: a.symbol, item_symbol: b.symbol, item_category: b.slot })); var d = "finish-" + c; userLock(d) && (playSound("build"), isWeb() && $("#collect_" + a.symbol).html(""), $.ajax({ url: "/play/finish_production/" + c, dataType: "JSON", success: function (a) { console.log(a); doLog("doFinishProduction: succeess "); freeLock(d); var b = buildingByItemId(c, a.building); userContext.playerData.character = a.character; userContext.playerData.user.money = a.user.money; userContext.playerData.stat.onboarding = a.stat.onboarding; userContext.playerData.stat.num_items_produced = a.stat.num_items_produced; userContext.playerData.stat.produced_stone = a.stat.produced_stone; userContext.playerData.stat.building_upgrades_finished = a.stat.building_upgrades_finished; b.producing_archetype_id = null; b.modifier = null; b.recipe_symbol = null; var f = extractItemBySymbol(playerInventory, b.symbol); f.effective_upgrade_level = a.building.effective_upgrade_level; f.producing_archetype_id = null; f.modifier = null; f.recipe_symbol = null; // EXTENDER :: Modification, execute current code ONLY if there's a produced item returned! if (a.produced_item) { if (userContext.intCurrentRecipeIndex = null, doLog("doFinishProduction: data.produced_item.id=" + a.produced_item.id + " quantity=" + a.produced_item.quantity), insertInventoryFromItem(playerInventory, a.produced_item), theNewItem = extractItemById(playerInventory, a.produced_item.id), 1 == a.is_loot) { 0 < a.enhanced_loot_roll ? dialogAlert({ style: "alert", text: "The result of your production (enhanced) is: " + a.produced_full_name, items: [theNewItem], heading: "You have produced...", button1: "Okay" }) : dialogAlert({ style: "alert", text: "The result of your production is: " + a.produced_full_name, items: [theNewItem], heading: "You have produced...", button1: "Okay" }); } else if (0 < a.affix_chance) { var m; m = "" + ("You have a " + a.affix_chance_from_stats + "% chance to produce a superior-quality item from your talents, equipment and buildings."); a.bonus_item_name && (m += " Your " + a.bonus_item_name + " adds another +" + a.affix_chance_from_bonus + "% chance to produce a superior-quality item from your talents, equipment and buildings."); m = a.affix_roll1 <= a.affix_chance && a.affix_roll2 <= a.affix_chance ? m + "<p/>Critical Success! You obtained a superb result!" : a.affix_roll1 > a.affix_chance && a.affix_roll2 > a.affix_chance ? m + "<p/>You obtained a normal result." : m + "<p/>Success! You obtained a good result."; dialogAlert({ style: "alert", text: m, items: [theNewItem], heading: a.produced_full_name, button1: "Okay" }); } userContext.newBldgOrUpgrade = true; var q; "Upgrade" != theNewItem.slot ? (userContext.newProducedItem = theNewItem, isWeb() && $("#collect_" + f.symbol).html(renderUpgradeCollect(f)), isWeb() && $("#build_panel_action_" + f.id).html(renderBuildPanelAction(f)), isWeb() && $("#speed_button_" + f.id).hide()) : q = theNewItem.symbol; isWeb() ? (renderBuildingInventory(userContext.playerData), renderBuildingsOnScreen(userContext.playerData)) : (f = null, f = null == q ? { symbol: b.symbol, status: "idle" } : { symbol: b.symbol, status: "idle", upgrade: q }, iosSignal("finish_production", "update", f), isAndroid() && mobileCooldownDataSignal([{ mode: "building", symbol: b.symbol }]), refreshActiveBuildingPanel(), $("#building_tab_prod, .buildingupgradetree").fadeTo("slow", "1")); uiEvent("do_finish_production"); uiEvent("building_panel_" + userContext.activeBuildingPanel); a.produced_item && "stacks_of_coins" == a.produced_item.symbol && retrievePlayerData(true, function (a) { userContext.playerData.quests = a.quests; reRenderQuestActionItems(); }); "Upgrade" == theNewItem.slot && buildingUpgradePanel(b.symbol); updatePlayerInfo(userContext.playerData); updateAllStatus(); } // EXTENDER :: Modification if (typeof (callback) != "undefined" && typeof (callback) == "function") { console.log("EXTENDER :: Calling callback: "); console.log(callback); callback(); } } })); }; var customDoProduction = function (c, a, b, d, g, callback) { userContext.lastFinish = null; null == b && (b = 1); doLog("doProduction: symbol=" + c + " producer=" + a + " quantity=" + b); var p = null, f = "", m = null, q = "", k = null, D = null; uiEvent("start_production"); null == userContext.playerData.stat.num_shop_items_started && (userContext.playerData.stat.num_shop_items_started = 0); userContext.playerData.stat.num_shop_items_started += 1; for (var u = 0; u < userContext.recipeData.length; u++) if (console.log("DEBUG: n=" + userContext.recipeData[u].category + ", symbol: " + userContext.recipeData[u].output), g == userContext.recipeData[u].symbol || null == g && (userContext.recipeData[u].output == c || userContext.recipeData[u].output_loot == c) && userContext.recipeData[u].category == a) { p = userContext.recipeData[u]; p.output == c ? (k = itemFromSymbol(c), q = k.full_name) : (p.output_loot == c && (m = c), q = p.name); D = u; components = userContext.recipeData[u].input.split(","); quantity_components = userContext.recipeData[u].input_quantity.split(","); var s = itemFromSymbol(userContext.recipeData[u].category); if (true == userContext.recipeData[u].unlocked) { if (1 < userContext.recipeData[u].input.length) for (s = 0; s < components.length; s++) { var y = itemFromSymbol(components[s]), w = false; 0 == s && true == userContext.recipeData[u].evolution && (w = true); w = sumInventoryQuantity(y.symbol, w); if (parseInt(quantity_components[s]) * b > w) { "" == f && (f = "You need more of the following:<p/>"); f += "<div>"; if (4 <= userContext.playerData.character.level) switch (components[s]) { case "stone": case "iron": case "fur": case "ore": case "horse": case "riverways_fish_consumable": case "smallfolk": case "wood": case "cloth": case "grains": w = parseInt(quantity_components[s]) * b - w; if (cost_item = itemFromSymbol("pennyroyal")) var z = cost_item.price_perk_points * w; f += '<div id="basic_resource_' + components[s] + '">'; f += itemMiniView(y, { extra_styles: "left:-70px", quantity_override: w }); f += '<span style="position: relative; left: 250px; top: -88px" class="btnwrap btnmed btnprice" onclick="getBasicResource(\'' + components[s] + "'," + w + ',true);"><span class="btnedge"><a class="btngold">Get Now</a><em>for</em><strong>' + z + "</strong></span></span>"; f += "</div>"; break; default: f += itemMiniView(y); } f += "</div>"; f += "<p>" + y.howto + "</p>"; } } } else f = "You need <em>" + s.full_name + "</em> to produce that."; break; } if ("" != f) doAlert("Requirements: " + q, f), analytics.track("Production Blocked-Resources", { item_symbol: c }), analytics.wizardtrack("Production Blocked-Resources", { item_symbol: c }); else if (p && hasMoney(p.craft_cost * b, function () { doProduction(c, a, b, d, g); })) { f = JSON.parse(JSON.stringify(userContext.playerData.inventory)); u = []; p.output == c ? (k = itemFromSymbol(c), q = k.full_name) : (p.output_loot == c && (m = c), q = p.name); components = p.input.split(","); quantity_components = p.input_quantity.split(","); s = itemFromSymbol(p.category); if (true == p.unlocked && (userContext.intCurrentRecipeIndex = D, 1 < p.input.length)) for (s = 0; s < components.length; s++) y = itemFromSymbol(components[s]), w = false, 0 == s && true == p.evolution && (w = true), depleteItems(y.symbol, parseInt(quantity_components[s]) * b, null, u, w); q = ""; D = null; for (s = 0; s < u.length; s++) if (y = itemFromSymbol(u[s].symbol), u[s].full_name != y.full_name) D = JSON.parse(JSON.stringify(u[s])), q += "[" + u[s].full_name + "]"; else if (itemHasSeals(u[s]) && (!u[s].preserve_attributes || false == u[s].preserve_attributes)) D = JSON.parse(JSON.stringify(u[s])), y = generateSealNameList(u[s]), q += "[" + u[s].full_name + " : " + y + "]"; // EXTENDER :: Modification if (true != d && null != D && !extender_confirmSuperiorMaterials) { return playerInventory = JSON.parse(JSON.stringify(f)), userContext.playerData.inventory = playerInventory, dialogAlert({ style: "confirm", margin_top: 100, items: [D], button2: "Not Now", button2_action: function () { closeAlert(); }, button1: "Confirm", button1_action: function () { closeAlert(); return doProduction(c, a, b, true, g); }, heading: "Confirm Superior Materials", text: "Producing this item now will consume superior versions of your materials: " + q + "<p/>Are you sure you want to contribute superior versions of materials to produce this item?" }), false; } var I = buildingBySymbol(userContext.activeBuildingPanel); I.build_remaining = p.craft_duration * b; I.original_build_seconds = p.craft_duration * b; I.build_progress = 0; "" != p.output && (I.producing_archetype_id = itemFromSymbol(p.output).id); I.recipe_symbol = p.symbol; I.action_sub_id = b; f = renderBuildingConstruction(I); isWeb() && $("#bc_" + I.id).html(f); displayBuildingCooldown(I); "Upgrade" == itemFromId(I.producing_archetype_id).slot ? buildingUpgradePanel(userContext.activeBuildingPanel, true, false) : (buildingUpgradePanel(userContext.activeBuildingPanel, true, false, true), buildingTabProd(), isWeb() && $("#collect_" + I.symbol).html(renderUpgradeCollect(I))); p = "/play/set_production"; p = (m ? p + ("?loot_symbol=" + m + "&producer_symbol=" + a) : k ? p + ("/" + c + "?producer_symbol=" + a) : p + ("?producer_symbol=" + a)) + ("&quantity=" + b); g && (p += "&recipe_symbol=" + g); $.ajax({ url: p, dataType: "JSON", success: function (a) { userContext.prodProgressShow = null; userContext.playerData.stat.num_shop_items_started = a.num_shop_items_started; updateAllStatus(); uiEvent("do_production"); isWeb() || iosSignal("building", "cooldown", mobileCooldownData({ mode: "building", symbol: I.symbol, flag: "production_started" })); // EXTENDER :: Modification if (typeof (callback) != "undefined" && typeof (callback) == "function") { console.log("EXTENDER :: Calling callback: "); console.log(callback); callback(); } } }); } }; var customBuildTimerUpdate = function (c, a, b) { $("#timer-" + c).html(renderBuildTime(a)); $("#timer-panel-" + c).html(renderBuildTime(a)); percent = 100 - 100 * (a / b); $("#progress-" + c).html('<span style="width:' + percent + '%;"></span>'); var d = buildingById(c); d.build_remaining = a; markup = renderBuildPanelAction(d); $("#speed_button_" + c).show(); $("#build_panel_action_" + c).html(markup); $("#production_timer_" + c).html(renderBuildTime(d.build_remaining, true)); $("#production_timer_upper_" + c).html(renderBuildTime(d.build_remaining)); $("#production_progress_" + c).css({ width: percent + "%" }); $("#duration_long_" + c).html(durationLong(buildTimerDescription(d), a, b)); a--; userContext.doBuildId == c && (300 >= a ? ($("#speed_up_skip_block").hide(), $("#speed_up_skip_use").show()) : ($("#speed_up_skip_use").hide(), $("#speed_up_skip_block").show()), $(".speed_building_" + c).html() != renderSpeedUpButton(c) && $(".speed_building_" + c).html(renderSpeedUpButton(c))); d.cooldown = a; d.original_cooldown_seconds = b; displayBuildingCooldown(d); 0 < a || (closeSpeedUp(), finalizeBuildingConstruction(d), clearBuildingTimer(d.symbol)); // EXTENDER :: Modification REVISE if (a == 300 - 1) { doInstantSpeedUp(c); doFinishProduction(d.item_id); setTimeout(function () { var el = getElement(d.symbol); if (el) { executeElement(el); } }, extender_queueDelay * 1000); } }; var customDoCollect = function (c) { lock_name = "collect-" + c; if (userLock(lock_name)) { var a = buildingByItemId(c); 0 < predictCollect(a) && (playSound("coins"), isWeb() && animatedCoins.init($("#collectbtn"), $("#silver"), [-10, -40], [-72, -44])); uiEvent("collect_" + buildingSymbolFromItemId(c), userContext.PlayerData); the_url = "/play/collect_building/" + c + "?client_seqnum=" + userContext.player_data_seqnum; isWeb() || showSpinner(); $.ajax({ url: the_url, dataType: "JSON", success: function (b) { freeLock(lock_name); doLog("doCollect: building_id=" + c + " data.money=" + b.money); updateSilver(b.money); updateBaseTime(b.base_time); a.last_collected_at = b.last_collected_at; userContext.playerData.stat.buildings_collected = b.buildings_collected; userContext.playerData.stat.onboarding = b.onboarding; isWeb() || (iosSignal("building_collected"), hideSpinner()); isWeb() && $("#collect_" + a.symbol).html(renderUpgradeCollect(a)); buildingUpgradePanel(a.symbol); b = renderBuildingOwned(a); isWeb() && $("#bc_" + a.id).html(b); updateAllStatus(); questListings(); // EXTENDER :: Modification closeModalLarge('modal_dialogs_top'); } }); } }; var customClaimDaily = function () { showSpinner(); $.ajax({ url: "/play/advice_claim_daily", dataType: "JSON", success: function (c) { hideSpinner(); // EXTENDER :: Modification // bugfix: undefined silver and gold if (c.status && c.status == "OK") { return; } $("#claimed_holder").html("<h5>Claimed</h5>"); updateSilver(c.total_silver); updateGold(c.total_gold); $(".claimrewardchest").hide(); $("#daily_reward_statview").html(itemStatViewFromSymbol(c.item, { produce: "Continue", produce_callback: "welcomeClaimed" })); $("#dailynewsbtn").removeClass("btnglow"); var a = buildingBySymbol("keep"); userContext.playerData.stat.daily_streak_claimed = userContext.playerData.stat.daily_streak; a && $("#bc_" + a.id).html(renderBuildingOwned(a)); isWeb() || iosSignal("daily_reward_claimed", null, c.item); // EXTENDER :: Modification $(".welcomemodal").hide(); } }); return false; } var customFinishAll = function () { console.log("EXTENDER :: Checking buildings..."); for (var i = 0; i < userContext.buildingsData.length; i++) { var b = userContext.buildingsData[i]; if (buildingFinished(b)) { console.log("EXTENDER :: Attempt to finish production on " + b.symbol); doFinishProduction(b.item_id, finishAll); return; } } alert('Done'); console.log("EXTENDER :: All buildings are now finished."); } var customApplySelectedUpgrade = function(c, a, callback) { lock_name = "upgrade-" + c.id; userContext.lastFinish = null; var b; if (0 < c.gold && null == a) doGoldUnlock(c.id, function() { applySelectedUpgrade(c, true, callback); }); else if (hasMoney(c.silver, function() { applySelectedUpgrade(c, a, c.silver); }) && userLock(lock_name)) { var d = buildingUpgradeResourceCheck(c.building_id, c.id); if (isWeb()) { if (null != d.markup && "" != d.markup) { doAlert("Resources Required", "You need additional resources to construct that upgrade:<p/>" + d.markup); return false; } } else if (null != d.strMissingComponentText) { if (isAndroid()) { iosSignal("building", "upgrade_fail", d); return false; } return d; } b = d.item; playSound("build"); var g = buildingById(c.building_id); itemFromSymbol(g.symbol); d = extractItemBySymbol(userContext.playerData.inventory, g.symbol).upgrade_level - 1; 0 > d && (d = 0); userContext.buildIndex++; g.build_progress = 0; g.producing_archetype_id = b.id; $.ajax({ url: "/play/apply_upgrade/" + c.id, dataType: "JSON", success: function(result) { freeLock(lock_name); if (result.resource_list) for (var i = 0; i < result.resource_list.length; i++) { var m = extractItemBySymbol(playerInventory, result.resource_list[i]); m && (m.quantity -= parseInt(result.resource_quantities[i])); } updateSilver(result.money); updateBaseTime(result.base_time); userContext.playerData.stat.onboarding = result.onboarding; userContext.playerData.stat.building_upgrades_added = result.building_upgrades_added; g.build_remaining = result.build_remaining; g.original_build_seconds = result.original_build_seconds; displayBuildingCooldown(g); isWeb() && buildingUpgradePanel(g.symbol); result = renderBuildingConstruction(g); $("#bc_" + g.id).html(result); uiEvent("add_" + userContext.activeBuildingPanel, userContext.PlayerData); selectedUpgrade = extractItemBySymbol(playerInventory, b.symbol); q_upgrade = 1; selectedUpgrade && (q_upgrade = selectedUpgrade.quantity + 1); $("#addbtn_container").html(addButtonUpgrade(b, false, q_upgrade)); isWeb() ? selectUpgrade(userContext.activeUpgrade) : iosSignal("building", "cooldown", mobileCooldownData({ mode: "building", symbol: g.symbol, flag: "production_started" })); questListings(); analytics.track("Building Apply-Upgrade", { building: userContext.activeBuildingPanel, upgrade: itemData[itemById[c.id]].symbol, cost: itemData[itemById[c.id]].cost }); analytics.wizardtrack("Building Apply-Upgrade", { building: userContext.activeBuildingPanel, upgrade: itemData[itemById[c.id]].symbol, cost: itemData[itemById[c.id]].cost }); // EXTENDER :: Modification if (typeof (callback) != "undefined" && typeof (callback) == "function") { console.log("EXTENDER :: Calling callback: "); console.log(callback); callback(); } } }); } return false; } var customSpeedBuild = function speedBuild(c, a, callback) { $("#modal_dialogs_top2").hide(); doLog("speedBuild: speed_item=" + c + " item_id=" + a); $.ajax({ url: "/play/build_now/" + a + "?complete=" + c, dataType: "JSON", success: function(b) { console.log("speedBuild: returned, data.building.id=" + b.building.id); userContext.playerData.user.money = b.user.money; userContext.playerData.stat.onboarding = b.stat.onboarding; userContext.playerData.chapter = b.chapter; var d = buildingById(a, b.building); doLog("speedBuild: speed_item:"); doLog(b.speed_item); b.speed_item && insertInventoryFromItem(userContext.playerData.inventory, b.speed_item); insertInventoryFromItem(userContext.playerData.inventory, b.produced_item); logLastItem("speedBuild:A"); userContext.buildingsData && (userContext.playerData.buildings = userContext.buildingsData); playerInventory && (userContext.playerData.inventory = playerInventory); userContext.chapterData = b.chapter; d && (analytics.track("SpeedUp-Building", { building: d.symbol, speed_item: c }), analytics.wizardtrack("SpeedUp-Building", { building: d.symbol, speed_item: c })); userContext.buildIndex++; logLastItem("speedBuild:B"); finalizeBuildingConstruction(d); isItemBuildingUpgrade(d) || null == d.producing_archetype_id && null == d.recipe_symbol ? (renderBuildingInventory(userContext.playerData, buildingUpgradePanel, userContext.activeBuildingPanel, true), isWeb() || iosSignal("building", "cooldown", mobileCooldownData({ mode: "building", symbol: d.symbol, flag: "speed_up" }))) : (userContext.craftingItemFinished = true, renderBuildingInventory(userContext.playerData, buildingUpgradePanelProd, userContext.activeBuildingPanel, true), $("#collect_" + d.symbol).html(renderUpgradeCollect(d)), $("#build_panel_action_" + d.id).html(renderBuildPanelAction(d)), $("#speed_button_" + d.id).hide()); renderBuildingsOnScreen(userContext.playerData); d && uiEvent("building_panel_" + d.symbol); // EXTENDER :: Modification if (typeof (callback) != "undefined" && typeof (callback) == "function") { console.log("EXTENDER :: Calling callback: "); console.log(callback); callback(); } } }); };