Realm Relay auto nexus/pot

Posts 1–15 of 37 · Page 1 of 3
Realm Relay auto nexus/pot
I modified the autonexus.js that I got from DeVoidCoder's github. I added the capability to auto health pot. Nexus is still a priority. By default it is set to 25% for nexus and 35% for health potion. It only uses the health potions that you can store up to 6.

Warning: Use at your own risk. I am not responsible if you die while using this script.
 
test
Code:
// autonexus_pot.js
// original: autonexus.js by DeVoidCoder
// modified by: zekikez

var ID_MOVE = $.findPacketId("MOVE");
var ID_PLAYERHIT = $.findPacketId("PLAYERHIT");
var ID_SHOOT = $.findPacketId("SHOOT");
var ID_SHOOT2 = $.findPacketId("SHOOT2");
var ID_UPDATE = $.findPacketId("UPDATE");
var ID_CREATE_SUCCESS = $.findPacketId("CREATE_SUCCESS");
var ID_NEW_TICK = $.findPacketId("NEW_TICK");
var ID_AOE = $.findPacketId("AOE");
var ID_ESCAPE = $.findPacketId("ESCAPE");
var ID_USE_ITEM = $.findPacketId("USEITEM");
var ID_NOTIFICATION = $.findPacketId("NOTIFICATION");
var ID_MAPINFO = $.findPacketId("MAPINFO");

var STATDATA_MAXHEALTH = 0;
var STATDATA_HEALTH = 1;
var STATDATA_DEFENCEBONUS = 49

var nexusHealthPercentage = 25; // <--- modify this to the health % you want to nexus at
var playerObjectId = -1;
var _allowAutoNexus = true;  // <--- set to false if you do not want it to auto nexus

var health = -1;
var maxHealth = -1;
var defenceBonus = -1;
var bulletIdDamageMap = {};
var bEscapeToNexusSent = false; // true = don't confirm any more hits
var playerLocation = null;

// zekikez - auto health potion
var SLOTDATA_HEALTHPOT = 69;
var TIMEOUT_OFFSET = 250; // the amount of time before allowing to use the health potion again

var _potHealthPercentage = 35; // <--- modify this to the health % you want to pot at

var _clientTime = 0;
var _potHealthCount = 0;
var _skipHealthPotion = true;
var _timeoutAt = -1; 
var _mapName = "Nexus";

function onClientPacket(event) {
	if (bEscapeToNexusSent) {
		event.cancel();
		return;
	}
	var packet = event.getPacket();
	if (packet.time)
	{
		_clientTime = packet.time;
		if (_skipHealthPotion && _timeoutAt < _clientTime)
			_skipHealthPotion = false;
	}
	switch (packet.id()) {
		case ID_MOVE: {
			playerLocation = packet.newPosition;
			break;
		}
		case ID_PLAYERHIT: {
			// predict what the damage will be
			health -= getDamageEstimate(bulletIdDamageMap[packet.bulletId]);
			if (_mapName != "Nexus" && useBestEscape())
					event.cancel();
			break;
		}
	}
}

function onServerPacket(event) {
	var packet = event.getPacket();
	switch (packet.id()) {
		case ID_MAPINFO: {
			_mapName = packet.name;
			break;
		}	
		case ID_SHOOT2:
		case ID_SHOOT: {
			// store projectile damage...
			bulletIdDamageMap[packet.bulletId] = packet.damage;
			break;
		}
		case ID_UPDATE: {
			for (var i = 0; i < packet.newObjs.length; i++) {
				var objectData = packet.newObjs[i];
				if (objectData.status.objectId == playerObjectId) {
					for (var j = 0; j < objectData.status.data.length; j++) {
						var statData = objectData.status.data[j];
						// update player data...
						if (statData.obf0 == STATDATA_MAXHEALTH) {
							maxHealth = statData.obf1;
						} else if (statData.obf0 == STATDATA_HEALTH) {
							health = statData.obf1;
						} else if (statData.obf0 == STATDATA_DEFENCEBONUS) {
							defenceBonus = statData.obf1;
						} else if (statData.obf0 == SLOTDATA_HEALTHPOT) {
							_potHealthCount = statData.obf1;
						}
					}
				}
			}
			break;
		}
		case ID_CREATE_SUCCESS: {
			// keep the player's objectId
			playerObjectId = packet.objectId;
			break;
		}
		case ID_NEW_TICK: {
			for (var i = 0; i < packet.statuses.length; i++) {
				var status = packet.statuses[i];
				if (status.objectId == playerObjectId) {
					for (var j = 0; j < status.data.length; j++) {
						var statData = status.data[j];
						// update the player's health
						if (statData.obf0 == STATDATA_HEALTH) {
							health = statData.obf1;
						} else if (statData.obf0 == STATDATA_DEFENCEBONUS) {
							defenceBonus = statData.obf1;
						} else if (statData.obf0 == SLOTDATA_HEALTHPOT) {
							_potHealthCount = statData.obf1;
							$.echo("health pot count: " + _potHealthCount);
						}
					}
				}
			}
			break;
		}
		case ID_AOE: {
			if (playerLocation != null && playerLocation.distanceTo(packet.pos) <= packet.radius) {
				// predict what the damage will be
				health -= getDamageEstimate(packet.damage);
				if (_mapName != "Nexus" && useBestEscape())
					event.cancel();
			}
			break;
		}
	}
}

function getDamageEstimate(baseDamage) {
        // not a perfect damage calculation at all, but good enough for govt work
        var damage = baseDamage - defenceBonus;
        if (damage < 0.15 * baseDamage) {
			damage = 0.15 * baseDamage;
        }
        if (isNaN(damage)) {
			// return 100; 
			return 0; // if damage is undefined then just wait for next tick to health update.
        }
        return damage;
}


// Determines best action based on current health percentage
// returns true if an action happens 
function useBestEscape() {
	// if the predicted health percentage is below nexusHealthPercentage...
	var curPercentage = 100 * health / maxHealth;
	//$.echo("Current Health: " + health + " / " + maxHealth + " = "  + curPercentage);
	if (_allowAutoNexus && curPercentage <= nexusHealthPercentage) {
		useNexus();
		return true;
	}
	else if (!_skipHealthPotion && _potHealthCount > 0 && curPercentage <= _potHealthPercentage) {
		useHealthPotion();
		return true;
	}
	return false;
}

// creates ESCAPE packet and sends to server
function useNexus() {
	$.echo("Used Nexus");
	var escapePacket = $.createPacket(ID_ESCAPE);
	$.sendToServer(escapePacket);
	bEscapeToNexusSent = true; // this prevents any additional packets from being sent
}

// creates a USE_ITEM packet with the health potion details
function useHealthPotion() {
	_potHealthCount--;
	$.echo("Used Health Potion: " + _potHealthCount);
	var useitemPacket = $.createPacket(ID_USE_ITEM);
	useitemPacket.time = _clientTime + 50; // ? not sure if increment is needed
	useitemPacket.slotObject = $.createSlotObject();
	useitemPacket.slotObject.objectType = 2594; // health potion type
	useitemPacket.slotObject.slotId = 254; // health potion slotid
	useitemPacket.slotObject.objectId = playerObjectId; // player id
	useitemPacket.itemUsePos = playerLocation; // should randomly offset a bit. (this should be where the cursor is pointing)
	useitemPacket.useType = 0;
	$.sendToServer(useitemPacket);
	// Notify user that a potion was used and show the remaining number of pots
	autoNexusPot_Notify("Used Health Potion! Count: " + _potHealthCount);
	_skipHealthPotion = true;
	_timeoutAt = _clientTime + TIMEOUT_OFFSET;
}

function autoNexusPot_Notify(text) {
	var notificationPacket = $.createPacket(ID_NOTIFICATION);
	notificationPacket.objectId = playerObjectId;
	notificationPacket.message = "{\"key\":\"blank\",\"tokens\":{\"data\":\"" + text + "\"}}";
	notificationPacket.color = 0x33FFFF;;
	$.sendToClient(notificationPacket);
}
Would this still drink HP pots even if you're in the Nexus?
this should not drink hp pots even if you're in the nexus.
To know the amount of hp you nexused at, change the line 176 for
Code:
$.echo("Nexused at " + health +" HP.");
All credits to zekikez!
Hello zekikez!

I have a question, is the function onServerPacket() is the function that handles the packet the server send? I'm trying to figure out your code and I'm not too good at reverse enginnering (if I can say it).
I can't find the github any more :/ Anyone have a link?
does anyone know how to turn the auto hp pot into an auto priest tome?
(sorry for the bump)
Quote Originally Posted by lookbehindyou View Post
does anyone know how to turn the auto hp pot into an auto priest tome?
(sorry for the bump)
Change the useitem (hp pot) into useitem (if character == priest, use item ability
)
For me this worked a lot greater than using the autonexus from modselector no offence to anyone.

I really like realmrelay keep pushing the scripts out sorry im such a leecher guys but i cant have 1000 professions.

here are the values I used on my 6/8 wizard and it works very well for me


Auto nexus 35%
Auto HP 45%

I'm a conservative guy
This script has saved my ass so many times. The part that calculates incoming bullet damage and nexuses off that is a lifesaver.
Quote Originally Posted by 059 View Post
This script has saved my ass so many times. The part that calculates incoming bullet damage and nexuses off that is a lifesaver.
If i understood that right, if u are at O2 and theres his shotgun directly coming to you and would kill you this script nexuses before it hits?
var bEscapeToNexusSent = false; // true = don't confirm any more hits

what exactly does that do when set to true? and i cant connect if i do set it to true.
Quote Originally Posted by FainTMako View Post
var bEscapeToNexusSent = false; // true = don't confirm any more hits

what exactly does that do when set to true? and i cant connect if i do set it to true.
I'm wondering too.
it does not work in devoids original example autonexus as well.
Quote Originally Posted by FainTMako View Post
var bEscapeToNexusSent = false; // true = don't confirm any more hits
do not change that line. it is just written there to declare i.e. initialize the variable as a boolean type (yes no), not for u to edit.


if look further down in the code you'll see:

bEscapeToNexusSent = true; // this prevents any additional packets from being sent

getting set to true after it sends the nexus command.

now idk the exact workings, but i can imagine that if we would still receive, compute and send packets after nexussing, one of them could basically be like, "here's another projectile that hit us, oh wait, this kills you, let me tell that to the server".
again, im no expert, and i have my doubts (since the bEscapeToNexusSent is only used for client packets), but in theory this should prevent all deaths, assuming that the server needs a death confirmation from the client, which might not be true.
Posts 1–15 of 37 · Page 1 of 3

Post a Reply

Similar Threads

Tags for this Thread

None

Need help?