- // ==UserScript==
- // @name melvor idle helper
- // @name:zh-TW melvor idle helper
- // @namespace https://melvoridle.com/
- // @version 0.2 (for melvor version:Alpha v0.17)
- // @description have 5 features : auto loot, auto eat food, auto replant, auto sell junk and auto light bonfire.
- // @description:zh-TW 共5種功能 : 自動掠奪、自動吃食物、自動種植、自動賣垃圾、自動燒柴。
- // @author cool9203
- // @match https://melvoridle.com/index.php
- // @include https://melvoridle.com/*
- // @grant none
- // ==/UserScript==
-
- //---------show log setting---------
- let SHOW_LOG_STATUS = false;
- let MELVOR_VERSION = "Alpha v0.17";
-
- //---------conditions setting---------
- let eat_food_size = 0.5;
- let sell_item_id = [];
- let junk_id = [648, 649, 650, 651, 652, 653, 654, 655];
- //let sell_item_id = [128, 129, 130, 131, 132, 669, 667, 670, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19];
-
- //---------global variable(don't edit this area)---------
- let auto_loot = false;
- let auto_sell_junk = false;
- let auto_eat_food = false;
- let auto_light_bonfire = false;
- let auto_re_plant = false;
-
-
- //---------show message status variable---------
-
-
-
- //---------features---------
-
- function loot(){
- console.log("start loot");
- lootAll();
- }
-
-
- function sell_junk(){
- console.log("start sell_junk");
- for (let i = 0; i < junk_id.length; i++){
- let result = getBankId(junk_id[i]);
- if (result != false){
- sell_item(result);
- }
- }
-
- for (let i = 0; i < sell_item_id.length; i++){
- let result = getBankId(sell_item_id[i]);
- if (result != false){
- sell_item(result);
- }
- }
- }
-
-
- function sell_item(index){
- let item_id = bank[index].id;
- console.log(`sell item: category=${items[item_id].category}, type=${items[item_id].type}, name=${items[item_id].name}`);
- selectBankItem(bank[index].id);
- sellQty = bank[index].qty;
- sellItem();
- document.querySelector(".swal2-confirm").click();
- }
-
-
- async function eat_food(){
- console.log("start eat_food");
- let max_hp = skillLevel[9] * 10;
- let now_hp = combatData["player"].hitpoints;
- let enemy_attack = parseInt( document.querySelector("#combat-enemy-strength-bonus").innerHTML.replace("(", "").replace(")", "").replace("-", "") );
-
- if (SHOW_LOG_STATUS){
- console.log(`enemy_attack:${enemy_attack}`);
- }
-
- if ((now_hp <= max_hp * eat_food_size) || (now_hp <= enemy_attack)){
- if (!equip_and_select_food()){ //if (not have any food) && ( (in combat) || (in thieving) )
- if (!isNaN(enemy_attack)){
- stopCombat(false, true, true);
- alert("you not have any food");
- }
- else if (npcID != null){
- pickpocket(npcID);
- alert("you not have any food");
- }
- return;
- }
-
- while (true){
- let my_progress = parseInt( document.querySelector("#combat-progress-attack-player").style.width.replace("%", "") );
- let enemy_progress = parseInt( document.querySelector("#combat-progress-attack-enemy").style.width.replace("%", "") );
- enemy_attack = parseInt( document.querySelector("#combat-enemy-strength-bonus").innerHTML.replace("(", "").replace(")", "").replace("-", "") );
- if (isNaN(enemy_attack) || my_progress <= 10 || (now_hp <= enemy_attack) || (npcID != null && (now_hp <= max_hp * eat_food_size)) ){
- if (SHOW_LOG_STATUS){
- console.log(` my_progress:${my_progress}\n enemy_progress:${enemy_progress}\n now_hp:${now_hp}\n enemy_attack:${enemy_attack}\n`);
- }
- break;
- }else{
- await delay(50);
- }
- }
-
- while (now_hp < max_hp * 0.98){
- eatFood();
- let eated_hp = combatData["player"].hitpoints;
- if (eated_hp == now_hp){
- if (eated_hp == max_hp || !equip_and_select_food()){
- break;
- }
- }else{
- if (SHOW_LOG_STATUS){
- console.log(`eat_food:${now_hp}->${eated_hp}`);
- }
- }
- now_hp = eated_hp;
- }
- }
- }
-
-
- function equip_and_select_food(){
- //get equippedFood count
- let equipped_food_count = 0;
- for (let i = 0; i < 3; i++){
- if (equippedFood[i].itemID != 0){
- equipped_food_count += 1;
- }
- }
-
- //equip food
- for (let i = 0; i < bank.length; i++){
- if (equipped_food_count == 3){
- break;
- }
- let item_id = bank[i].id;
- if (items[item_id].canEat == true){ //if can eat
- selectBankItem(item_id);
- equipFoodQty = bank[i].qty;
- equipFood();
- equipped_food_count += 1;
- i -= 1;
- }
- }
-
- //select food
- for (let i = 0; i < 3; i++){
- if (equippedFood[i].itemID != 0){
- selectEquippedFood(i);
- if (SHOW_LOG_STATUS){
- console.log("select food : equip and select food");
- }
- return true;
- }
- }
-
- //if cann't select equip food, need quit combat ot thieving
- if (SHOW_LOG_STATUS){
- console.log("not have any food to equip and select");
- }
- return false;
- }
-
-
- function light_bonfire(){
- console.log("start light_bonfire");
- lightBonfire();
- }
-
-
- function add_gloop_or_compost(i, j){
- console.log("start add_gloop");
- if (i === undefined || j === undefined){
- for (let i = 0; i < newFarmingAreas.length; i++){
- for (let j = 0; j < newFarmingAreas[i].patches.length; j++){
- gloop_or_compost(i ,j);
- }
- }
- }else{
- gloop_or_compost(i ,j);
- }
- }
-
-
- function gloop_or_compost(i, j){
- if(checkBankForItem(CONSTANTS.item.Weird_Gloop)) {
- addGloop(i,j);
- } else {
- if(checkBankForItem(CONSTANTS.item.Compost)) {
- if(bank[getBankId(CONSTANTS.item.Compost)].qty < 5) {
- buyQty = 5 - bank[getBankId(CONSTANTS.item.Compost)].qty
- buyCompost(true)
- }
- } else {
- buyQty = 5
- buyCompost(true)
- }
- addCompost(i,j,5)
- }
- }
-
-
- function re_plant(){
- for (let i = 0; i < newFarmingAreas.length; i++){
- for (let j = 0; j < newFarmingAreas[i].patches.length; j++){
- let farm_patches = newFarmingAreas[i].patches[j];
- let last_seed = farm_patches.seedID;
- let grown_id = items[last_seed].grownItemID;
- if (farm_patches.hasGrown){ //if now is grown
- if(checkBankForItem(grown_id) || (bankMax + baseBankMax) > bank.length){ //check last_seed grown item in bank or bank is full
- harvestSeed(i,j);
- if (checkBankForItem(last_seed)){
- add_gloop_or_compost(i, j);
- }
- }
- selectedPatch = [i,j];
- selectedSeed = last_seed;
- plantSeed();
- }
- }
- }
- }
-
- //---------option setting button---------
-
- function create_helper_setting_button(){
- let main_item = document.createElement("li");
- let a = document.createElement("a");
- let span = document.createElement("span");
-
- main_item.classList.add("nav-main-item");
- main_item.id = "helper_setting";
-
- a.classList.add("nav-main-link");
- a.classList.add("nav-compact");
-
- span.classList.add("nav-main-link-name");
- span.innerText = "helper setting";
-
- main_item.insertAdjacentElement("beforeend", a);
- a.insertAdjacentElement("beforeend", span);
-
- return main_item;
- }
-
-
- function create_helper_option(insert_obj, name, change_function, type, value){
- let option = document.createElement("input");
- option.classList.add("helper_option");
- option.type = type;
- option.value = value;
- option.style.display = "none";
- option.addEventListener("click", function(){
- change_function();
- });
-
- let label = document.createElement("label");
- label.classList.add("helper_option");
- label.innerText = name;
- label.style.display = "none";
-
- let next_line = document.createElement("br");
- next_line.classList.add("helper_option");
- next_line.style.display = "none";
-
- insert_obj.insertAdjacentElement("afterend", option);
- option.insertAdjacentElement("afterend", label);
- label.insertAdjacentElement("afterend", next_line);
-
- return next_line;
- }
-
-
- function helper_option_display(){
- let option_list = document.querySelectorAll(".helper_option");
-
- for (let i = 0; i < option_list.length; i++){
- if (option_list[i].style.display.length == 0){
- option_list[i].style.display = "none";
- }else{
- option_list[i].style.display = "";
- }
- }
- }
-
-
- //---------main---------
- (async function() {
- console.log("tampermonkey start");
- console.log("melvor idle helper version:", MELVOR_VERSION)
-
- //create helper button after setting_button and listen helper button.
- //listen action:show or hidden ".helper_option"
- let setting_button = document.querySelectorAll(".nav-main-item")[35];
- let helper_setting = create_helper_setting_button();
- setting_button.insertAdjacentElement("afterend", helper_setting);
- helper_setting.addEventListener("click", function(){
- helper_option_display();
- });
-
- //create option and bind option listen function
- let next_obj = create_helper_option(helper_setting, "", sell_junk, "button", "sell junk");
- next_obj = create_helper_option(next_obj, "", add_gloop_or_compost, "button", "add all gloop");
- next_obj = create_helper_option(next_obj, "", equip_and_select_food, "button", "equip and select food");
- next_obj = create_helper_option(next_obj, "auto loot", change_auto_loot, "checkbox", "");
- next_obj = create_helper_option(next_obj, "auto sell junk", change_auto_sell_junk, "checkbox", "");
- next_obj = create_helper_option(next_obj, "auto eat food", change_auto_eat_food, "checkbox", "");
- next_obj = create_helper_option(next_obj, "auto light bonfire", change_auto_light_bonfire, "checkbox", "");
- next_obj = create_helper_option(next_obj, "auto replant", change_auto_re_plant, "checkbox", "");
- })();
-
- function delay(ms){
- return new Promise((reslove, reject) => {
- setTimeout(() => {
- reslove("success");
- }, ms);
- });
- }
-
-
- //---------listen function---------
-
- function change_auto_loot(){
- if (auto_loot == false){
- loot();
- auto_loot = setInterval(loot, 10000);
- }else{
- clearInterval(auto_loot);
- auto_loot = false;
- }
- }
-
- function change_auto_sell_junk(){
- if (auto_sell_junk == false){
- sell_junk();
- auto_sell_junk = setInterval(sell_junk, 10000);
- }else{
- clearInterval(auto_sell_junk);
- auto_sell_junk = false;
- }
- }
-
- function change_auto_eat_food(){
- if (auto_eat_food == false){
- eat_food();
- auto_eat_food = setInterval(eat_food, 200);
- }else{
- clearInterval(auto_eat_food);
- auto_eat_food = false;
- }
- }
-
- function change_auto_light_bonfire(){
- if (auto_light_bonfire == false){
- light_bonfire();
- auto_light_bonfire = setInterval(light_bonfire, 20500);
- }else{
- clearInterval(auto_light_bonfire);
- auto_light_bonfire = false;
- }
- }
-
- function change_auto_re_plant(){
- if (auto_re_plant == false){
- re_plant();
- auto_re_plant = setInterval(re_plant, 301000);
- }else{
- clearInterval(auto_re_plant);
- auto_re_plant = false;
- }
- }