RPGBot

rpgmo bot... click [Bot] in top right to turn on/off. type "/enemy <name>" to add enemies to the list

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey, το Greasemonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

You will need to install an extension such as Tampermonkey to install this script.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Userscripts για να εγκαταστήσετε αυτόν τον κώδικα.

You will need to install an extension such as Tampermonkey to install this script.

Θα χρειαστεί να εγκαταστήσετε μια επέκταση διαχείρισης κώδικα χρήστη για να εγκαταστήσετε αυτόν τον κώδικα.

(Έχω ήδη έναν διαχειριστή κώδικα χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Έχω ήδη έναν διαχειριστή στυλ χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

// ==UserScript==
// @name         RPGBot
// @namespace    http://whatever.com/
// @version      1.337
// @description  rpgmo bot... click [Bot] in top right to turn on/off. type "/enemy <name>" to add enemies to the list
// @author       Frank Wolf
// @match        http://rpg.mo.ee/
// @grant        none
// @run-at       document-end
// ==/UserScript==


var btn = document.createElement("span");
btn.id = 'bot';
btn.innerText = '[ Bot ] ';
btn.style.color = 'red';
btn.onclick = function(){ toggle(); }
document.getElementById('toolbar_padding_holder').appendChild(btn);

//document.getElementById('toolbar_padding_holder').innerHTML += "<span id='bot' style='color:red;'> [Bot] </span>&nbsp;";
//document.getElementById('bot').setAttribute('onclick', "if (this.style.color == 'lime') {this.style.color = 'red';} else {this.style.color = 'lime';} startingPos.x = players[0].i; startingPos.y = players[0].j;");
Chat.client_commands['/en'] = function(a){ window.newEnemy = a.join(' '); };
Chat.client_commands['/scan'] = function(){
	for (var x=0; x<100; x++) {
		for (var y=0; y<100; y++) {
			if (!obj_g(on_map[current_map][x][y]).name) continue;
			if (obj_g(on_map[current_map][x][y]).name.toLowerCase().includes('[rare]')) {
				alert(x +' '+ y);
			}
		}
	}
};


function scan() { // can every so often for a rare
	for (var x=0; x<100; x++) {
		for (var y=0; y<100; y++) {
			if (!obj_g(on_map[current_map][x][y]).name) continue;
			if (obj_g(on_map[current_map][x][y]).name.toLowerCase().includes('[rare]')) alert(x +' '+ y);
			else console.log('nothing found');
		}
	}
}

function toggle() { // change color of [Bot], save position
	if (document.getElementById('bot').style.color == 'lime') {document.getElementById('bot').style.color = 'red';}
	else {document.getElementById('bot').style.color = 'lime';}
	startingPos.x = players[0].i;
	startingPos.y = players[0].j;
}

function target(enemy) {
	Socket.send("set_target", { target: enemy.id });
	players[0].path = enemy.path;
}

var startingPos = {}; // no starting position before starting the bot
var delay = 0; // dynamic delay
var enemies =   ['nothing',
                 'sapphire dragon']; // 69 27

setInterval(scan, 120000); // scan for rares every so often
setTimeout(erobot, 10000); // first run

function erobot() {
	setTimeout(erobot, 2000 + delay); // put this below any events that would cause extra delay
	var offset =  6; // 6; // max spots in any direction
	var maxView = 13; // 13; // width height of board. 17 should be good in fullscreen mode
	var coordX, coordY;
	var tempPath; // placeholder for shortest plath
	var enemy = {};

    enemy.path = new Array(100); // primed with long path. trying to find the smallest path
	delay = 0; // reset any additional delay for this loop
    updateEnemies(); // what even is this?

    if (document.getElementById('bot').style.color == 'red') {return;} // bots off
	if (inAFight) {return;} // exit if were in a fight
	if (players[0].path.length > 0) {return;} // exit if already walking somewhere
	if (skills[0].health.current*1.4 < players[0].params.health) {fatso(); return;} // eat if were low on health
	if (document.getElementById("captcha_menu").style.display == "block") {Music.sound_effect("notification"); return;} // exit if captchas up
	if (document.getElementById('penalty_points_bonus').innerText < 0) {return;} // exit if he have -1 captcha points
	if (document.getElementById("captcha_bonus_assign_form").style.display == "block") {return;} // exit if captchas up
	for (var z=0; z<enemies.length; z++) {
		for (var x=0; x<maxView; x++) {
			for (var y=0; y<maxView; y++) {
				coordX = players[0].i - offset+x;
				coordY = players[0].j - offset+y; //console.log(obj_g(on_map[current_map][coordX][coordY]));
				if (coordX < 0 || coordY < 0) continue; // < 0 would be off board and give error
                if (!obj_g(on_map[current_map][coordX][coordY]).name) continue;
				if (obj_g(on_map[current_map][coordX][coordY]).name.toLowerCase() != enemies[z].toLowerCase()) continue; // skip if not on enemies list
                if ( (players[0].i+1 == coordX && players[0].j == coordY) ||
                   (players[0].i-1 == coordX && players[0].j == coordY) ||
                   (players[0].j+1 == coordY && players[0].i == coordX) ||
                   (players[0].j-1 == coordY && players[0].i == coordX) ) { // enemy right next to us
					enemy.path = tempPath;
					enemy.i = coordX;
					enemy.j = coordY;
					enemy.id = on_map[current_map][coordX][coordY].id;
                    target(enemy);
					 console.log('right next to us');
                    return;
				}
				tempPath = findPathFromTo(players[0], {'i':coordX, 'j':coordY}, players[0]); // how long is the path to enemy
				if (tempPath.length === 0) continue; // skip, no path to enemy
				if (tempPath.length < enemy.path.length) { // find the shortest path
					enemy.path = tempPath;
					enemy.i = coordX;
					enemy.j = coordY;
					enemy.id = on_map[current_map][coordX][coordY].id;
				}
			}
		}
	}
	if (enemy.id) {target(enemy);}
	else { // no enemies, try walking back to where the bot started
		let coords = {};
		let range = {};
		range.x = Math.abs(startingPos.x - players[0].i);
		range.y = Math.abs(startingPos.y - players[0].j);

		if (range.x > 6) range.x = 6;
		if (range.y > 6) range.y = 6;

		for (var x=0; x<range.x; x++) {
			for (var y=0; y<range.y; y++) {
				if (players[0].i <= startingPos.x) coords.x = players[0].i + range.x - x;
				else coords.x = players[0].i - range.x + x;

				if (players[0].j <= startingPos.y) coords.y = players[0].j + range.y - x;
				else coords.y = players[0].j - range.y + y;

				let path = findPathFromTo(players[0], {'i':coords.x, 'j':coords.y}, players[0]);
				console.log(path);
				if (path.length > 0) {
					players[0].path = path;
					return;
				}
			}
		}
	}
}
// the effort of life would be worth it if there was an ultimate goal
function updateEnemies() { // what is this even?
    if (!window.newEnemy) return;
    else if (enemies.indexOf(window.newEnemy) == -1) {
        enemies.push(window.newEnemy);
        window.newEnemy = ''; console.log(enemies);
    }
    else {
        enemies.splice(enemies.indexOf(window.newEnemy), 1);
        window.newEnemy = ''; console.log(enemies);
    }
}

function fatso() { // this part works, but greasyfork wont let me post with it. assholes
	if (inAFight) {return;} // exit if were in a fight
	var tempItem;
	var lowestHeal;
	var lowestHealIndex;
	var count = 0;
	for (var i=0; i<players[0].temp.inventory.length; i++) {
		tempItem = item_base[players[0].temp.inventory[i].id];
		if (!tempItem.params.heal) continue; // not healing item
		if (!lowestHeal || tempItem.params.heal < lowestHeal) { // havent set first heal item, or found lower one
			lowestHeal = tempItem.params.heal; // found lower heal item
			lowestHealIndex = i;
			count = 0;
		}
		if (!lowestHeal) continue; // lowest heal not set yet
		if (tempItem.params.heal == lowestHeal) count++;
	}
	if (!lowestHealIndex) return; // nothing to eat was found
	var healthGap = players[0].params.health - skills[0].health.current;
	var foodClicks = Math.floor( healthGap/lowestHeal );
	if (count < foodClicks) foodClicks = count; // not enough food to get

	for (var k=0; k<foodClicks; k++) {
		setTimeout(function(){inventoryClick(lowestHealIndex); console.log('eating');}, k*220);
	}
	//inventoryClick(lowestHealIndex);
}

function bestWeapon() { // player asked for this to be a mods function
	var tempItem;
	var highestDmg;
	var highestDmgIndex;
	for (var i=0; i<players[0].temp.inventory.length; i++) {
		tempItem = item_base[players[0].temp.inventory[i].id];
		if (!tempItem.params.power) continue; // not healing item
		if (!highestDmg || tempItem.params.power > highestDmg) { // havent set first heal item, or found lower one
			highestDmg = tempItem.params.power;
			highestDmgIndex = i;
		}
	}
	if (!highestDmgIndex) return; // nothing to eat was found
	console.log(highestDmgIndex);
	inventoryClick(highestDmgIndex);
}






//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////// Proper Fishing //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////

var drops = [
	{"id":127,"name":"cage"},
	{"id":78,"name":"lionfish"},
	{"id":14,"name":"salmon"},
	{"id":16,"name":"bass"},
	{"id":1370,"name":"eel"},
	{"id":86,"name":"angel"},
	{"id":100,"name":"shark"},
	{"id":98,"name":"manta"},
	{"id":1368,"name":"frog"},
	{"id":72,"name":"sardine"},
	{"id":10,"name":"trout"},
	{"id":8,"name":"perch"},
	{id:33, name:'tin'},
	//{id:185, name:'silver'},
	{id:186, name:'coal'},
	//{id:184, name:'gold'},
	{id:4, name:'sword'},
	{id:272, name:'bones'},
	//{id:484, name:'Wgold'}
];

var action = {i:30, j:90};

function toggleDrop(id, name) {
	for(var i=0; i<drops.length; i++) {
		if (drops[i].id == id) {
			drops.splice(i, 1); // add id and name to drops array
			return;
		}
	}
	var newDrop = {}; // necessary?
	newDrop.id = id;
	newDrop.name = name;
	drops.push(newDrop);
}
// inventory updated
Inventory.client_inventory_changed = function() {
	hasClass(document.getElementById("pet_nest_form"), "hidden") || Breeding.open_nest();
	windowOpen && (FormHelper.is_form_visible("forging") && Forge.forging_open(),
	FormHelper.is_form_visible("recycle") && Forge.recycle_open(),
	FormHelper.is_form_visible("enchanting") && Forge.enchanting_open(),
	FormHelper.is_form_visible("fletching") && Fletching.open(),
	"block" == document.getElementById("cabinet_form").style.display && Chest.cabinet_open(!0),
	FormHelper.is_form_visible("armor_stand") && ArmorStand.open()),
	  console.log(players[0].temp.inventory[players[0].temp.inventory.length-1].id +' '+ players[0].temp.inventory[players[0].temp.inventory.length-1].selected); // log id
	if (players[0].temp.inventory.length == 40) setTimeout(dropShit, 5000);
	if (document.getElementById("captcha_menu").style.display == "block") {setTimeout(function(){ Music.sound_effect("notification"); }, 750); return;} // exit if captchas up
}
function dropShit() {
	let found = []; // items we found to be droppeg
	for (var i=0; i<players[0].temp.inventory.length; i++) {
			var invoItem = players[0].temp.inventory[i].id;
			for (records in drops) { // dont use for in here?
					if (invoItem == drops[records].id) {
							if (found.indexOf(drops[records].id) == -1) {
									found.push(drops[records].id);
									 console.log(found);console.log('found');
									Socket.send("inventory_destroy", {
											//item_id: drops[records].id,
											item_id: found[found.length-1],
											all: !0
									});
							}
					}
			}
	}
	setTimeout(function(){
			0 == players[0].path.length && "object" == typeof selected_object && selected_object.activities && selected_object.activities[0] && 0 < selected_object.activities[0].length && inDistance(players[0].i, players[0].j, selected_object.i, selected_object.j) && ActionMenu.act(0);
			selected_object = obj_g(on_map[current_map][action.i][action.j], players[0]);
	}, 2000);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


Chat.remove_line= function(a, b) {
	SpectateWindow.iframe && SpectateWindow.sendMessage({
		action: "remove_line_slave",
		line: a,
		moderator: b
	});
	for (var d = document.getElementsByClassName("chat_" + a), e = 0, g = d.length; e < g; e++) {
		var h = d[e];
		if (h) {
			var k = /(.*?)&gt;/g.exec(h.innerHTML)[0];
			h.innerHTML += k + " &lt;" + _ti("Message removed by {player}", {
				player: b
			}) + "&gt;"
		}
	}
	for (d = chat_history.length - 1; 0 <= d; d--) { // dont support censorship
		if (chat_history[d] && chat_history[d].id && chat_history[d].id == a) {
			chat_history[d].text += "<" + _ti("Message removed by {player}", {
				player: b
			}) + ">";
			break
		}
	}
}


// make transaction item clicky
Market.client_transaction_offers= function(a) {
    for (var b = 0, d = a.length; b < d; b++)
        a[b].available = parseInt(a[b].available),
            a[b].classes = b % 2 ? "row even" : "row";
    market_transaction_offers = a;
    document.getElementById("market_transaction_offers").innerHTML = Market.client_transaction_offers_template()({
        results: a
    });
    var listings = document.getElementById("market_transaction_offers").getElementsByClassName('row');
    for (var i=0; i<listings.length; i++) {
        id = listings[i].cells[1].childNodes[0].getAttribute("item_id");
        listings[i].cells[1].childNodes[0].setAttribute("onClick", "Market.find_buy("+id+")");
    }
}