Смена фракции и класса с домашней страницы
// ==UserScript==// @name [HWM] All Class Change// @description Смена фракции и класса с домашней страницы// @author Komdosh (original ElMarado (Идею дал HWM_Quick_Class_Change от Рианти))// @version 2.1.0// @include https://www.heroeswm.ru/home.php*// @include https://www.lordswm.com/home.php*// @include https://178.248.235.15/home.php*// @icon https://app.box.com/representation/file_version_34029013909/image_2048/1.png?shared_name=hz97b2qwo2ycc5ospb7ccffn13w3ehc4// @license GPL-3.0+// @namespace https://gfork.dahi.icu/users/13829// ==/UserScript==(function() {'use strict';//***************************************************************************function requestInventoryCollection(onR###lt) {return new Promise(function (resolve, reject) {var xhr = new XMLHttpRequest();xhr.open('GET', encodeURI("/inventory.php"));xhr.overrideMimeType('text/xml; charset=windows-1251');xhr.onload = async function(){if (xhr.status === 200){// setInterval();var div = document.createElement( 'div' );div.id = 'kom-inventory-classes';div.style.display = 'none';div.innerHTML = xhr.responseText;document.getElementsByTagName('body')[0].appendChild( div );var respDoc = document.getElementsByTagName('body')[0].lastChild;const collection = respDoc.querySelectorAll("#inv_expandedBlock>div");var collectionItems = [];for(var i = 0; i < collection.length; ++i){const name = collection[i].querySelector('div').innerText.trim();if(collection[i].querySelector('.btn_disabled') == null){collectionItems.push({name: name, idx: i+1});}}onR###lt(collectionItems);respDoc.remove();}else {console.log('Request failed. Returned status of ' + xhr.status);}};xhr.send();});}const _ajaxTimeout = 5000;let sign = document.body.innerHTML.match(/sign=([a-z0-9]+)/);if (sign) sign = sign[1];else return;const allClasses = [[1, 'Рыцарь', 0, 'https://dcdn.heroeswm.ru/i/f/r1.png?v=1.1'],[1, 'Рыцарь света', 1, 'https://dcdn.heroeswm.ru/i/f/r101.png?v=1.1'],[2, 'Некромант', 0, 'https://dcdn.heroeswm.ru/i/f/r2.png?v=1.1'],[2, 'Некромант - повелитель смерти', 1, 'https://dcdn.heroeswm.ru/i/f/r102.png?v=1.1'],[3, 'Маг', 0, 'https://dcdn.heroeswm.ru/i/f/r3.png?v=1.1'],[3, 'Маг - разрушитель', 1, 'https://dcdn.heroeswm.ru/i/f/r103.png?v=1.1'],[4, 'Эльф', 0, 'https://dcdn.heroeswm.ru/i/f/r4.png?v=1.1'],[4, 'Эльф - заклинатель', 1, 'https://dcdn.heroeswm.ru/i/f/r104.png?v=1.1'],[5, 'Варвар', 0, 'https://dcdn.heroeswm.ru/i/f/r5.png?v=1.1'],[5, 'Варвар крови', 1, 'https://dcdn.heroeswm.ru/i/f/r105.png?v=1.1'],[5, 'Варвар - шаман', 2, 'https://dcdn.heroeswm.ru/i/f/r205.png?v=1.1'],[6, 'Темный эльф', 0, 'https://dcdn.heroeswm.ru/i/f/r6.png?v=1.1'],[6, 'Темный эльф - укротитель', 1, 'https://dcdn.heroeswm.ru/i/f/r106.png?v=1.1'],[7, 'Демон', 0, 'https://dcdn.heroeswm.ru/i/f/r7.png?v=1.1'],[7, 'Демон тьмы', 1, 'https://dcdn.heroeswm.ru/i/f/r107.png?v=1.1'],[8, 'Гном', 0, 'https://dcdn.heroeswm.ru/i/f/r8.png?v=1.1'],[8, 'Гном огня', 1, 'https://dcdn.heroeswm.ru/i/f/r108.png?v=1.1'],[9, 'Степной варвар', 0, 'https://dcdn.heroeswm.ru/i/f/r9.png?v=1.1'],[9, 'Степной варвар ярости', 1, 'https://dcdn.heroeswm.ru/i/f/r109.png?v=1.1'],[10, 'Фараон', 0, 'https://dcdn.heroeswm.ru/i/f/r10.png?v=1.1']];const SHOWING_FRACTION = 'SHOWING_FRACTION';let showingFraction = JSON.parse(localStorage.getItem(SHOWING_FRACTION));if (showingFraction == null) {showingFraction = {};for (const frIdx in allClasses) {const fraction = allClasses[frIdx];showingFraction[fraction[1]] = true;}localStorage.setItem(SHOWING_FRACTION, JSON.stringify(showingFraction));}const SHOWING_FRACTION_INV_COLLECTION = 'SHOWING_FRACTION_INV_COLLECTION';let showingFractionInvCollection = JSON.parse(localStorage.getItem(SHOWING_FRACTION_INV_COLLECTION));if (showingFractionInvCollection == null) {showingFractionInvCollection = {};for (const frIdx in allClasses) {const fraction = allClasses[frIdx];showingFractionInvCollection[fraction[1]] = '';}localStorage.setItem(SHOWING_FRACTION_INV_COLLECTION, JSON.stringify(showingFractionInvCollection));}// Делаем запрос на сервер.// target - адрес// params - передаваемые параметры// ajaxCallback - что выполнить при удачном исходе// timeoutHandler - что выполнить при неудачном (не получаем ответа в течении _ajaxTimeout мс)function postRequest(target, params, ajaxCallback, timeoutHandler) {const xmlhttp = new XMLHttpRequest();xmlhttp.onreadystatechange = function () {if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {ajaxCallback(xmlhttp.responseText);}}xmlhttp.open('GET', target + params, true);xmlhttp.overrideMimeType('text/plain; charset=windows-1251');xmlhttp.timeout = _ajaxTimeout;xmlhttp.ontimeout = function () {timeoutHandler();}xmlhttp.send(params);}// Сообщение игроку, если за 7 сек не получили ответа от сервера на смену класса/фракцииfunction showError() {document.body.style.cursor = 'default';alert('Ошибка, проверьте связь с интернетом.');}// функция смены класса/фракцииfunction changeFractClass(fr, cl, fractionName) {document.body.style.cursor = 'progress';postRequest("/castle.php", '?change_clr_to=' + (cl ? cl + '0' + fr : fr) + '&sign=' + sign,function () {const invCollection = showingFractionInvCollection[fractionName];if (invCollection != null && invCollection != '') {setTimeout(function () {postRequest("/inventory.php", '?all_on=' + invCollection + '&rand=' + (Math.random() * 1000000), function () {setTimeout(function () {location.reload();}, 300);}, function () {showError();});}, 250);} else {setTimeout(function () {location.reload();}, 300);}},function () {showError();});}// получаем место вставки иконок классаconst icons = document.querySelectorAll("a[href*='castle.php?change_faction_dialog']");const characterNameDiv = icons[0].parentNode;let icon = document.querySelectorAll("a[href*='castle.php?change_faction_dialog']")[0].querySelector('img');const cur_ico = 'https://dcdn.heroeswm.ru/i/f/' + icon.src.substring(icon.src.lastIndexOf("/") + 1, icon.src.length);// выводим все иконкиlet cur_fr;const fractionChangeContentDiv = document.createElement('div');createChangeFractionContent();characterNameDiv.append(document.createElement('br'));characterNameDiv.append(fractionChangeContentDiv);function createFractionImg(fraction, createOnClick) {const fractionImg = document.createElement('img');fractionImg.src = fraction[3];fractionImg.title = `Изменить на: ${fraction[1]}`;fractionImg.height = 15;fractionImg.width = 15;let style = "margin-left: 5px;";if (createOnClick) {style += "cursor: pointer;";}fractionImg.style = style;if (createOnClick) {fractionImg.onclick = function () {changeFractClass(fraction[0], fraction[2], fraction[1]);fractionImg.style.cursor = "cursor: progress; margin-left: 5px";};}return fractionImg;}function createChangeFractionContent() {fractionChangeContentDiv.innerHTML = '';for (const frIdx in allClasses) {const fraction = allClasses[frIdx];if (!showingFraction[fraction[1]]) {continue;}if (fraction[3] === cur_ico) {cur_fr = fraction[1];} else {fractionChangeContentDiv.append(createFractionImg(fraction, true));}}fractionChangeContentDiv.append(createSettingsLink());}function createSettingsLink() {const settingsLink = document.createElement('a');settingsLink.href = '#';settingsLink.style = 'margin-left: 5px';settingsLink.text = '(+)';let isSettingsOpen = false;let settingsContentDiv = null;settingsLink.onclick = () => {isSettingsOpen = !isSettingsOpen;settingsLink.text = isSettingsOpen ? '(-)' : '(+)';if (isSettingsOpen) {settingsContentDiv = document.createElement('div');const inventoryCollections = [];for (const frIdx in allClasses) {const fraction = allClasses[frIdx];const fractionAvailableDiv = document.createElement('div');const fractionCheckbox = document.createElement('input');fractionCheckbox.type = 'checkbox';fractionCheckbox.value = fraction[1];fractionCheckbox.checked = showingFraction[fraction[1]];fractionCheckbox.onchange = (event) => {showingFraction[fraction[1]] = event.currentTarget.checked;localStorage.setItem(SHOWING_FRACTION, JSON.stringify(showingFraction));};fractionAvailableDiv.append(fractionCheckbox);fractionAvailableDiv.append(createFractionImg(fraction, false));const inventoryCollection = document.createElement('select');const inventoryCollectionOption = document.createElement('option');inventoryCollectionOption.value = '';inventoryCollectionOption.innerText = '---';inventoryCollection.append(inventoryCollectionOption);inventoryCollection.onchange = (event)=>{showingFractionInvCollection[fraction[1]] = parseInt(event.target.value);localStorage.setItem(SHOWING_FRACTION_INV_COLLECTION, JSON.stringify(showingFractionInvCollection));};inventoryCollections.push({fraction: fraction[1], selectDOM: inventoryCollection});fractionAvailableDiv.append(inventoryCollection);settingsContentDiv.append(fractionAvailableDiv);characterNameDiv.append(settingsContentDiv);}requestInventoryCollection((items)=>{if(items == null){return;}for(var i = 0; i < items.length; ++i){for(var j = 0; j<inventoryCollections.length; ++j){const inventoryCollectionOption = document.createElement('option');inventoryCollectionOption.value = ''+items[i].idx;inventoryCollectionOption.innerText = items[i].name;inventoryCollections[j].selectDOM.append(inventoryCollectionOption);}}for(var s = 0; s < inventoryCollections.length; ++s){inventoryCollections[s].selectDOM.value = showingFractionInvCollection[inventoryCollections[s].fraction];}});} else {if (settingsContentDiv) {createChangeFractionContent();settingsContentDiv.remove();}}};return settingsLink;}})();