Dead Frontier - storage deposit one / withdraw one

Adds buttons to deposit one to storage, or withdraw one from storage page

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        Dead Frontier - storage deposit one / withdraw one
// @namespace   Dead Frontier - Disk217
// @match       *://fairview.deadfrontier.com/onlinezombiemmo/index.php?page=50
// @version     0.0.13
// @author      Disk217
// @description Adds buttons to deposit one to storage, or withdraw one from storage page
// @require https://update.greasyfork.org/scripts/441829/1573182/Dead%20Frontier%20-%20API.js
// @require https://update.greasyfork.org/scripts/526316/1534016/Multiset.js
// @license MIT
// ==/UserScript==

// This userscript contains edited code from Shrike00 licenced under MIT, used under the terms of that licence.

(function() {
    'use strict';

    // Imports

	const UiUpdate = DeadFrontier.UiUpdate;

    const player_items = new DeadFrontier.PlayerItems();

    const inventory_holder = document.getElementById("inventoryholder");

    const deposit_button = makeDepositButton();
    deposit_button.addEventListener("click", function(e) {
        deposit_one_to_storage(player_items);
    });
    inventory_holder.appendChild(deposit_button);

    const withdraw_button = makeWithdrawButton();
    withdraw_button.addEventListener("click", function(e) {
        withdraw_one_from_storage(player_items);
    });
    inventory_holder.appendChild(withdraw_button);

    const refresh_button = makeRefreshButton();
    refresh_button.addEventListener("click", function(e) {
        refresh()
    });
    inventory_holder.appendChild(refresh_button);

    function filter(g, predicate) {
		return function*() {
			for (let e of g()) {
				if (predicate(e)) {
					yield e;
				}
			}
		}
	}

	function promiseWait(dt) {
		const promise = new Promise(function(resolve, reject) {
			setTimeout(function() {
				resolve();
			}, dt);
		});
		return promise;
	}

	function waitForElementId(id, timeout=1000) {
		const promise = new Promise(function(resolve, reject) {
			const start = performance.now();
			const check = setInterval(function() {
				const e = document.getElementById(id);
				if (e !== null) {
					clearInterval(check);
					resolve(e);
				}
				if (performance.now() - start > start) {
					clearInterval(check);
					reject();
				}
			}, 100);
		});
		return promise;
	}

    function emptyStorageSlots(player_items) {
			return Array.from(player_items.storageSlots()).filter((e) => e[1] === undefined).length;
		}

    function deposit_one_to_storage(player_items) {
        player_items.requestStorage().then( function() { return deposit_one_to_storage_promise(player_items) } )
    }

    function deposit_one_to_storage_promise(player_items) {
		const max_items_moved = 1
		let count = 0;
		const inventory_slots_to_move = [];
		for (let [inventory_slot, item] of player_items.inventoryItems()) {
			// Stop if inventory is full.
			if (count >= max_items_moved) {
				break;
			}
			if (!player_items.isLockedSlot(inventory_slot)) {
				inventory_slots_to_move.push(inventory_slot);
				count++;
			}
		}

        const storage_slots_moved_into = [];
		let active_promise = Promise.resolve();
		// move one item into storage
		for (let i = 0; i < inventory_slots_to_move.length; i++) {
			const update = UiUpdate.NO;
			active_promise = active_promise.then(function() {
				const inventory_slot = inventory_slots_to_move[i];
				const storage_slot = findFirstEmptyStorageSlot();
                if (storage_slot == false) return Promise.resolve();
				storage_slots_moved_into.push(storage_slot);
				return player_items.inventoryToStorage(inventory_slot, storage_slot, update);
			});
		}

        active_promise.then(function() {
			// Highlight elements.
			const storage = document.getElementById("normalContainer");
			const moved_into_storage_elements = Array.from(storage.querySelectorAll("div")).filter((div) => storage_slots_moved_into.includes(parseInt(div.getAttribute("data-slot"))));
			const elements_to_highlight = moved_into_storage_elements;
			for (const e of elements_to_highlight) {
				e.style.setProperty("background-color", "white");
				e.style.setProperty("box-shadow", "0 0 0 1px inset white");
			}
            const inventory = document.getElementById("inventory");
            const moved_from_inventory_elements = Array.from(inventory.querySelectorAll("td")).filter((td) => inventory_slots_to_move.includes(parseInt(td.dataset.slot)));
            for (const e of moved_from_inventory_elements) {
				e.style.setProperty("background-color", "red");
				e.style.setProperty("box-shadow", "0 0 0 1px inset white");
			}
			return promiseWait(400).then(function() {
				for (const e of elements_to_highlight) {
					e.style.removeProperty("background-color");
					e.style.removeProperty("box-shadow");
				}
                for (const e of moved_from_inventory_elements) {
					e.style.removeProperty("background-color");
					e.style.removeProperty("box-shadow");
				}
			})
		});
		return active_promise;
    }

    function withdraw_one_from_storage(player_items) {
        player_items.requestStorage().then( function() { return withdraw_one_from_storage_promise(player_items) } )
    }

    function withdraw_one_from_storage_promise(player_items) {
		const max_items_moved = 1
		let count = 0;
		const storage_slots_to_move = [];
        const min_to_move = storageTab * 40 + 1
        const first_to_not_move = (storageTab + 1) *40 + 1
		for (let [storage_slot, item] of player_items.storageItems()) {
            if ( storage_slot < min_to_move ) {
                continue
            }
			// Stop if inventory is full.
			if (count >= max_items_moved) {
				break;
			}
            if ( storage_slot >= first_to_not_move ) {
                break;
            }

            storage_slots_to_move.push(storage_slot)
            count++;
		}

        const inventory_slots_moved_into = [];
		let active_promise = Promise.resolve();
		// move one item into inventory
		for (let i = 0; i < storage_slots_to_move.length; i++) {
			const update = UiUpdate.NO
			active_promise = active_promise.then(function() {
				const storage_slot = storage_slots_to_move[i];
				const inventory_slot = findFirstEmptyGenericSlot("inv");
				inventory_slots_moved_into.push(inventory_slot);
				return player_items.storageToInventory(storage_slot, inventory_slot, update);
			});
		}

        active_promise.then(function() {
			// Highlight elements.
			const inventory = document.getElementById("inventory");
			const moved_into_inventory_elements = Array.from(inventory.querySelectorAll("td")).filter((td) => inventory_slots_moved_into.includes(parseInt(td.dataset.slot)));
			const elements_to_highlight = moved_into_inventory_elements;
			for (const e of elements_to_highlight) {
				e.style.setProperty("background-color", "white");
				e.style.setProperty("box-shadow", "0 0 0 1px inset white");
			}
            const storage = document.getElementById("normalContainer");
			const moved_from_storage_elements = Array.from(storage.querySelectorAll("div")).filter((div) => storage_slots_to_move.includes(parseInt(div.getAttribute("data-slot"))));
            for (const e of moved_from_storage_elements) {
				e.style.setProperty("background-color", "red");
				e.style.setProperty("box-shadow", "0 0 0 1px inset white");
			}
			return promiseWait(400).then(function() {
				for (const e of elements_to_highlight) {
					e.style.removeProperty("background-color");
					e.style.removeProperty("box-shadow");
				}
                for (const e of moved_from_storage_elements) {
					e.style.removeProperty("background-color");
					e.style.removeProperty("box-shadow");
				}
			})
		});
		return active_promise;
    }

    function refresh() {
        return player_items.requestStorage().then(populateStorage).then(populateInventory)
    }

    function makeDepositButton() {
		const button = document.createElement("button");
		button.innerHTML = "Deposit";
		button.style.setProperty("position", "absolute");
		button.style.setProperty("font-size", "15px");
		button.style.setProperty("text-align", "right");
		button.style.setProperty("left", "530px");
		button.style.setProperty("top", "35px");
		return button;
	}

    function makeWithdrawButton() {
		const button = document.createElement("button");
		button.innerHTML = "Withdraw";
		button.style.setProperty("position", "absolute");
		button.style.setProperty("font-size", "15px");
		button.style.setProperty("text-align", "right");
		button.style.setProperty("left", "600px");
		button.style.setProperty("top", "35px");
		return button;
	}

    function makeRefreshButton() {
		const button = document.createElement("button");
		button.innerHTML = "Refresh";
		button.style.setProperty("position", "absolute");
		button.style.setProperty("font-size", "15px");
		button.style.setProperty("text-align", "right");
		button.style.setProperty("left", "450px");
		button.style.setProperty("top", "35px");
		return button;
	}
})();