Userscripty - tutorial
Posted: Sat 19. Feb 2022 0:17:01
Vzhledem k tomu, ze nekteri by radi meli presety na eventy a nechce se jim vecne vyklikavat jednotky z boje, tady je (pomerne snadne) reseni v podobe userscriptu.
Snazil jsem se to napsat jednoduse, aby to mohl pouzit kazdy.
Nerucim vam za predmety, co si rozflakate, protoze nekdy poslete utok se slabou armadou (treba si nekde rozbijete stit a pak poslete malou armadu bez hlavniho stitu)
Nicmene, pokud jsme 100% konfidentni, ze eventy dame, muzeme snadno nastavit, jaka armada se posle...
Jak zacit?
Staci si stahnout extension Tampermonkey (nejpopularnejsi manazer na vytvareni a pouzivani userscriptu) - nahore si vyberte, jaky prohlizec pouzivate.
Kousek pod odkazy na stahovani je video, jak nainstalovat.
Krok 1 - vytvoreni user scriptu
Staci kliknout na rozsireni (extension) Tampermonkey pravym tlacitkem mysi, a rozkliknout "Create a new user script..."
Krok 2 - vyplnovani dokumentace userscriptu
Z noveho userscriptu muzeme klidne vse smazat, dokumentaci staci vyplnit takto:
Vysvetlivky:
name je nazev user scriptu
author - kdo to napsal
include - na jake strance se userscript spusti (hvezdicky znamenaji, ze pred/po tom muze byt cokoliv - dalsi priklad treba *.landofice.com/utok.php?utok=chram (script se pusti na vsech chramech, svatynich, domech)
Krok 3 - kopirovani funkci
Do tohoto userscriptu zkopirujeme dolu tyto funkce, pro snadnejsi praci.
Vsechny maji u sebe nejakou dokumentaci.
Krok 4 - pouziti / nastavovani vyplnovani jednotek
Funkce uz mame, staci je jen pouzit.
Abychom tyto funkce mohli pouzit, potrebujeme ziskat jeste par veci.
1) Nejdriv zkontrolujeme, ze jsme na spravnem klanu - pouzijeme ID nejake jednotky (idealne jednotku, co budete mit 100% v klanu, ne velitele, co se muze nekde spalit a pak se zapomene ho vratit zpatky) - na pouziti existuje funkce doesUnitWithIdExist(unit_id).
unit_id se ziska pres inpect stranky - proste otevrete nejaky event, kdyz jste v tabulce, kliknete pravym tlacitkem na nejaky input, vyberte inspect
otevre se zdrojovy kod s tim, ze by melo ukazovat na input. Tento input bude mit name="id_CISLO" a id="num_CISLO" - proste opiste nebo zkopirujte cislo - toto se pouziva ve funkcich jako unit_id (jak pro kontrolu jednotky, tak pro vyplnovani inputu a nebo odskrtavani predmetu).
2) Titulek - ten se ziska jednoduse pres metodu getTitle() - nic vic neni potreba
3) Porovnani titulku s nazvu eventu, na ktere chceme upravovat armadu
4) Uprava poctu jednotek, odskrtavani predmetu (kdyz se treba nechce riskovat, ze se jednotka s malym poctem spali a riskuje se ztrata, nebo kdyz zombici maji tvrzene platy a nemuzou se hybat)
5) Po dokonceni staci zmacknout ctrl+s pro ulozeni scriptu (a nebo rozkliknout File - save).
Kdyz bych treba vzal sveho Dreadda a chtel si mirne upravit armadu, co se posila na obetiste, kod, co se prida do stale stejneho userscriptu, bude vypadat takto:
Pote se zobrazi v zalozce Installed Userscripts - tam je moznost usercript kdykoliv vypnout (napr. se klan rozflaka, ztrati upiry, co by meli stitovat, nebude potreba a tak)
Nove userscripty pak jde pridavat pres [+] a nebo pres rozkliknuti extensiony a "Create a new script..."
Pokud by se chtel scriptik udelat chytrejsi s pocty podle hlavniho stitu, slo by udelat treba takto:
Nazvy eventu kopirujte ze stranky a nebo si muzete upravit funkci getTitle, aby na konci bylo return title.toLowerCase() - cely retezec bude malymi pismenky. Nazvy eventu, pokud budete kopirovat ode me, si radsi overte
Pokud budete mit stejnou armadu na vice eventu, muzete hodit do podminky title == "nazev" || title == "nazev2" - pak se nemusi rozepisovat pro kazdy zvlast.
Kdyby neco nebylo dostatecne jasne, ptejte se, poradim.
A kdyby mel nekdo pripominky, jak neco vylepsit, at klidne napise, ja tomu nedal zrovna moc casu
Snazil jsem se to napsat jednoduse, aby to mohl pouzit kazdy.
Nerucim vam za predmety, co si rozflakate, protoze nekdy poslete utok se slabou armadou (treba si nekde rozbijete stit a pak poslete malou armadu bez hlavniho stitu)

Nicmene, pokud jsme 100% konfidentni, ze eventy dame, muzeme snadno nastavit, jaka armada se posle...
Jak zacit?
Staci si stahnout extension Tampermonkey (nejpopularnejsi manazer na vytvareni a pouzivani userscriptu) - nahore si vyberte, jaky prohlizec pouzivate.
Kousek pod odkazy na stahovani je video, jak nainstalovat.
Krok 1 - vytvoreni user scriptu
Staci kliknout na rozsireni (extension) Tampermonkey pravym tlacitkem mysi, a rozkliknout "Create a new user script..."
Krok 2 - vyplnovani dokumentace userscriptu
Z noveho userscriptu muzeme klidne vse smazat, dokumentaci staci vyplnit takto:
Code: Select all
// ==UserScript==
// @name Land of Ice - eventy demon
// @version 0.1
// @description Upravy poctu poslanych jednotek do demonich eventu ve hre Land of Ice
// @author tady se podepiste
// @include *.landofice.com/utok.php?utok=eventy_demon
// ==/UserScript==
name je nazev user scriptu
author - kdo to napsal
include - na jake strance se userscript spusti (hvezdicky znamenaji, ze pred/po tom muze byt cokoliv - dalsi priklad treba *.landofice.com/utok.php?utok=chram (script se pusti na vsech chramech, svatynich, domech)
Krok 3 - kopirovani funkci
Do tohoto userscriptu zkopirujeme dolu tyto funkce, pro snadnejsi praci.
Vsechny maji u sebe nejakou dokumentaci.
Code: Select all
/**
* Ziska nadpis eventu, podle ktereho se rozlisuji treba chramy, demoni eventy a podobne
*/
function getTitle() {
var head = document.getElementsByTagName('h2');
return head[0].getInnerHTML();
}
/**
* Zkontroluje, zdali jednotka se zadanym unit_id vubec existuje (aby se napr. nevypnula cela armada pred posilanim)
* @param {int} unit_id - id jednotky, napr 1024
*/
function doesUnitWithIdExist(unit_id) {
var input = document.getElementById("num_" + unit_id);
return input != null;
}
/**
* Nastavi pocet jednotek na value k jednotce s IDckem unit_id
* @param {int} unit_id - id jednotky, napr 1024
* @param {int} value - zadany pocet jednotek, napr 1000
*/
function setValueToInputByUnitId(unit_id, value) {
setValueToInput("num_" + unit_id, value);
}
/**
* Nastavi pocet jednotek na value k jednotce s celym IDckem element_id
* @param {string} element_id - id elementu, napr "num_1024"
* @param {int} value - zadany pocet jednotek, napr 1000
*/
function setValueToInput(element_id, value) {
var input = document.getElementById(element_id); // ziska input s tezkym katapultem na mem klanu
if (input != null) {
input.value = value; // nastavi pocet jednotek
}
}
/**
* Vypne predmet pro jednotku s ID unit_id
* @param {int} unit_id - id jednotky, napr 1024
*/
function disableItemByUnitId(unit_id) {
disableItem("predmet_" + unit_id);
}
/**
* Vypne predmet na element_id
* @param {string} element_name - jmeno elementu, napr "predmet_1024"
*/
function disableItem(element_name) {
var input = document.getElementsByName(element_name)[0];
if (input != null) {
input.checked = false; // vypne predmet
}
}
/**
* Vynuluje vsechny inputy (idealni pro dreaddy, co chteji farmit s nekromancery jednotky)
*/
function emptyAllInputs() {
emptyAllInput();
}
/**
* Odesle formular a rovnou zautoci BEZ KLIKNUTI NA POTVRZENI UTOKU (doporucuji nepouzivat, max pokud chcete treba usetrit klik u vesnice, osady po nejake dobe)
*/
function attack() {
document.forms[0].submit();
}
Funkce uz mame, staci je jen pouzit.
Abychom tyto funkce mohli pouzit, potrebujeme ziskat jeste par veci.
1) Nejdriv zkontrolujeme, ze jsme na spravnem klanu - pouzijeme ID nejake jednotky (idealne jednotku, co budete mit 100% v klanu, ne velitele, co se muze nekde spalit a pak se zapomene ho vratit zpatky) - na pouziti existuje funkce doesUnitWithIdExist(unit_id).
unit_id se ziska pres inpect stranky - proste otevrete nejaky event, kdyz jste v tabulce, kliknete pravym tlacitkem na nejaky input, vyberte inspect
otevre se zdrojovy kod s tim, ze by melo ukazovat na input. Tento input bude mit name="id_CISLO" a id="num_CISLO" - proste opiste nebo zkopirujte cislo - toto se pouziva ve funkcich jako unit_id (jak pro kontrolu jednotky, tak pro vyplnovani inputu a nebo odskrtavani predmetu).
2) Titulek - ten se ziska jednoduse pres metodu getTitle() - nic vic neni potreba
3) Porovnani titulku s nazvu eventu, na ktere chceme upravovat armadu
4) Uprava poctu jednotek, odskrtavani predmetu (kdyz se treba nechce riskovat, ze se jednotka s malym poctem spali a riskuje se ztrata, nebo kdyz zombici maji tvrzene platy a nemuzou se hybat)
5) Po dokonceni staci zmacknout ctrl+s pro ulozeni scriptu (a nebo rozkliknout File - save).
Kdyz bych treba vzal sveho Dreadda a chtel si mirne upravit armadu, co se posila na obetiste, kod, co se prida do stale stejneho userscriptu, bude vypadat takto:
Code: Select all
if (doesUnitWithIdExist(1411)) { // zkontrolovani, ze jsme na spravne armade, kdyz by se vynechalo, script by zbytecne vyhledaval elementy, co neexistuji
var title = getTitle(); // ziskani titulku
if (title == "Obětiště") { // event je obetiste, upravime armadu, aby stitovali Upiri
setValueToInputByUnitId(1024, 8000); // vesnicani
setValueToInputByUnitId(1025, 2000); // zombie
disableItemByUnitId(1025); // vypnout tvrzene platy
setValueToInputByUnitId(1029, 20000); // kostlivci
disableItemByUnitId(1029); // vypnout prapor stinu
setValueToInputByUnitId(2574, 10000); // ghulove
} else if (title == "Hlídka zrádců") {
// vyplnit armadu
} else if (title == "Karavana démonů") {
// vyplnit armadu
}
}
Nove userscripty pak jde pridavat pres [+] a nebo pres rozkliknuti extensiony a "Create a new script..."
Pokud by se chtel scriptik udelat chytrejsi s pocty podle hlavniho stitu, slo by udelat treba takto:
Code: Select all
if (doesUnitWithIdExist(1411)) { // zkontrolovani, ze jsme na spravne armade
if (title == "Chrám Ledu" || title == "Svatyně Ledu" || title == "Dóm Ledu" || title == "Æthrova Svatyne" || title == "Svatyně Ohně") {
var upiri_input = document.getElementById("num_4053"); // ziskame input, na kterem jsou upiri
var hlavni_stit_hp = upiri_input.value * 40 * 0.5; // veme se pocet upiru, vynasovi se 40 (vychozi HP upiru) a pak hodi na polovinu (rezerva, kdyby neco dostatecne sundalo upiry, jinak je risk, ze by jednotky probili ostatni, co maji nizkou obranu a zbytecne by se ztratily predmety)
setValueToInputByUnitId(1024, Math.floor(hlavni_stit_hp/7-10)); // vesnicani
setValueToInputByUnitId(1025, Math.floor(hlavni_stit_hp/30)); // zombie
disableItemByUnitId(1025); // vypnout tvrzene platy
setValueToInputByUnitId(1029, Math.floor(hlavni_stit_hp/2-5)); // kostlivci
setValueToInputByUnitId(2574, Math.floor(hlavni_stit_hp/4-15)); // ghulove
}
}

Pokud budete mit stejnou armadu na vice eventu, muzete hodit do podminky title == "nazev" || title == "nazev2" - pak se nemusi rozepisovat pro kazdy zvlast.
Kdyby neco nebylo dostatecne jasne, ptejte se, poradim.

A kdyby mel nekdo pripominky, jak neco vylepsit, at klidne napise, ja tomu nedal zrovna moc casu
