Code: Select all
The macro is currently not running. Press the start key <Delete> to begin.
You may use <End> key to stop/pause the script.
Resumed.
RoM Bot Version 2.45
Attempt to read playerAddress
self.Address: 0x287E400
X: -1070.00, Y:35.85, Z: -5370.16
XU: -0.38, YU:0.88, ZU: 0.29
mousePawn: 0x0
playerAddr: 0x1F670400
playerTarget: 0x0
RoM windows size is 0x0, uppder left corner at -3200, -32000
...rs/*****/Desktop/micromacro/scripts/rom/settings.lua:91: bad argument #1 to 'getKeyName' <<null>>
Please enter the script name to run.
Type in 'exit' <without quotes> to exit.
Script>Code: Select all
settings_default = {
	hotkeys = {
		MOVE_FORWARD = {key = _G.key.VK_W, modifier = nil},
		MOVE_BACKWARD = {key = _G.key.VK_S, modifier = nil},
		ROTATE_LEFT = {key = _G.key.VK_A, modifier = nil},
		ROTATE_RIGHT = {key = _G.key.VK_D, modifier = nil},
		STRAFF_LEFT = {key = _G.key.VK_Q, modifier = nil},
		STRAFF_RIGHT = {key = _G.key.VK_E, modifier = nil},
		JUMP = {key = _G.key.VK_SPACE, modifier = nil},
		TARGET = {key = _G.key.VK_TAB, modifier = nil},
		TARGET_FRIEND = {key = _G.key.J, modifier = nil},
		START_BOT = {key = _G.key.VK_DELETE, modifier = nil},
		STOP_BOT = {key = _G.key.VK_END, modifier = nil}
	},
	options = {
		ENABLE_FIGHT_SLOW_TURN = false,
		MELEE_DISTANCE = 45,
		LANGUAGE = "english",
		DEBUG_ASSERT = false,
	},
	profile = {
		options = {
			-- common options
			HP_LOW = 85,
			MP_LOW_POTION = 50,
			HP_LOW_POTION = 40,
			COMBAT_TYPE = "melee",
			COMBAT_RANGED_PULL = "true",	-- only for melee classes 
			COMBAT_DISTANCE = 200,
			ANTI_KS = true,
			WAYPOINTS = "myWaypoints.xml",
			RETURNPATH = nil,
			PATH_TYPE = "waypoints",
			WANDER_RADIUS = 500,
			WAYPOINT_DEVIATION = 0,
			LOOT = true,
			LOOT_TIME = 2000,
			LOOT_IN_COMBAT = true,
			LOOT_DISTANCE = nil,
			LOOT_PAUSE_AFTER = 10,	-- probability for short pause after loot to look more human
			POTION_COOLDOWN = 15,
			MAX_FIGHT_TIME = 12,
			DOT_PERCENT = 90,
			LOGOUT_TIME = 0,
			LOGOUT_SHUTDOWN = false,
			LOGOUT_WHEN_STUCK = true,
			MAX_UNSTICK_TRIALS = 10,
			TARGET_LEVELDIF_BELOW = 99,
			TARGET_LEVELDIF_ABOVE = 99,
			QUICK_TURN = false,
			MP_REST = 15,
			HP_REST = 15,
			RES_AUTOMATIC_AFTER_DEATH = false,	-- automatic resurrect after death true | false,
			
			-- expert options
			WAYPOINTS_REVERSE = false,	-- use the waypoint file in reverse order
			MAX_DEATHS = 10,		-- maximal death if automatic resurrect befor logout
			WAIT_TIME_AFTER_RES = 8000,	-- time to wait after resurrection, needs more on slow PCs
			RETURNPATH_SUFFIX = "_return",	-- suffix for default naming of returnpath
			HARVEST_SCAN_WIDTH = 10,	-- steps horizontal
			HARVEST_SCAN_HEIGHT = 8,	-- steps vertical
			HARVEST_SCAN_STEPSIZE = 35,	-- wide of every step
			HARVEST_SCAN_TOPDOWN = true,	-- true = top->down  false = botton->up
			HARVEST_SCAN_XMULTIPLIER = 1.0,	-- multiplier for scan width
			HARVEST_SCAN_YMULTIPLIER = 1.1,	-- multiplier for scan line height
			HARVEST_SCAN_YREST = 10,	-- scanspeed
			USE_SLEEP_AFTER_RESUME = false, -- enter sleep mode afer pressing pause key
			
		}, hotkeys = {}, skills = {}, friends = {},
		events = {
			onDeath = function () pauseOnDeath(); end,
			onLeaveCombat = nil,
			onSkillCast = nil,
		}
	},
};
settings = settings_default;
-- check if keys are double assigned or empty
check_keys = { };
function check_double_key_settings( _name, _key, _modifier )
	for i,v in pairs(check_keys) do
		if( v.key      == _key  and
		    v.modifier == _modifier ) then
				local modname, keyname;
				if( v.modifier ) then modname = getKeyName(v.modifier); end;
				if( v.key ) then keyname = getKeyName(v.modifier); end;
				local errstr = sprintf("Error: You assigned the key \'%s %s\' double: for \'%s\' and for \'%s\'.\n",
					tostring(modname), tostring(keyname), v.name, _name) .. "Please check your settings!";
				error(errstr, 0);
		if( _key == nil) then
			cprintf(cli.yellow, "Error: The key for \'%s\' is empty!\n", _name);
			error("Please check your settings!", 0);
		end
		end
	end;
	
	-- check the using of modifiers
	if( _modifier ~= nil) then
		cprintf(cli.yellow, "Due to technical reasons, we don't support "..
		   "modifiers like CTRL/ALT/SHIFT for hotkeys at the moment. "..
		   "Please change your hotkey %s-%s for \'%s\'\n", getKeyName(_modifier), getKeyName(_key), _name);
		   
		   -- only a warning for TARGET_FRIEND / else an error
		   if(_name == "TARGET_FRIEND") then
		   	cprintf(cli.yellow, "You can't use the player:target_NPC() function until changed!\n");
		   else
		   	error("Please check your settings!", 0);
		   end
	end
	
	local tmp = {};
	tmp.name = _name;
	tmp.key  = _key;
	tmp.modifier  = _modifier;	
	table.insert(check_keys, tmp);	
end
function settings.load()
	local filename = getExecutionPath() .. "/settings.xml";
	local root = xml.open(filename);
	local elements = root:getElements();
	-- Specific to loading the hotkeys section of the file
	local loadHotkeys = function (node)
		local elements = node:getElements();
		for i,v in pairs(elements) do
			-- If the hotkey doesn't exist, create it.
			settings.hotkeys[ v:getAttribute("description") ] = { };
			settings.hotkeys[ v:getAttribute("description") ].key = key[v:getAttribute("key")];
			settings.hotkeys[ v:getAttribute("description") ].modifier = key[v:getAttribute("modifier")];
			if( key[v:getAttribute("key")] == nil ) then
				local err = sprintf("settings.xml error: %s does not have a valid hotkey!", v:getAttribute("description"));
				error(err, 0);
			end
			check_double_key_settings( v:getAttribute("description"), v:getAttribute("key"), v:getAttribute("modifier") );
		end
	end
	local loadOptions = function (node)
		local elements = node:getElements();
		for i,v in pairs(elements) do
			settings.options[ v:getAttribute("name") ] = v:getAttribute("value");
		end
	end
	-- load RoM keyboard bindings.txt file
	local function load_RoM_bindings_txt()
		
		local filename, file;
		
		local userprofilePath = os.getenv("USERPROFILE");
		local documentPaths = {
			userprofilePath .. "\\My Documents\\", -- English
			userprofilePath .. "\\Eigene Dateien\\", -- German
			userprofilePath .. "\\Mes Documents\\", -- French
			userprofilePath .. "\\Omat tiedostot\\", -- Finish
			userprofilePath .. "\\Belgelerim\\", -- Turkish
			userprofilePath .. "\\Mina Dokument\\", -- Swedish
			userprofilePath .. "\\Dokumenter\\", -- Danish
			userprofilePath .. "\\Documenti\\", -- Italian
			userprofilePath .. "\\Mijn documenten\\", -- Dutch
			userprofilePath .. "\\Moje dokumenty\\", -- Polish
			userprofilePath .. "\\Mis documentos\\", -- Spanish
--			"F:\\privat\\",
		};
		-- Select the first path that exists
		for i,v in pairs(documentPaths) do
			local filename = v .. "Runes of Magic\\bindings.txt"
			if( fileExists(filename) ) then
				file = io.open(filename, "r");
				cprintf(cli.green, "We read the hotkey settings from your "..
				   "bindings.txt file %s instead of using the settings.lua file.\n", filename)
			end
		end
		-- If we wern't able to locate a document path, return.
		if( file == nil ) then
			return;
		end
		-- Load bindings.txt into own table structure
		bindings = { name = { } };
		-- read the lines in table 'lines'
		for line in file:lines() do
			for name, key1, key2 in string.gfind(line, "(%w*)%s([%w+]*)%s*([%w+]*)") do
				bindings[name] = {};
				bindings[name].key1 = key1;
				bindings[name].key2 = key2;
				--settings.hotkeys[name].key = 
			end
		end
		local function bindHotkey(bindingName)
			local links = { -- Links forward binding names to hotkey names
				MOVEFORWARD = "MOVE_FORWARD",
				MOVEBACKWARD = "MOVE_BACKWARD",
				TURNLEFT = "ROTATE_LEFT",
				TURNRIGHT = "ROTATE_RIGHT",
				STRAFELEFT = "STRAFF_LEFT",
				STRAFERIGHT = "STRAFF_RIGHT",
				TARGETNEARESTENEMY = "TARGET",
				TARGETNEARESTFRIEND = "TARGET_FRIEND",	
			};
			local hotkeyName = bindingName;
			if(links[bindingName] ~= nil) then
				hotkeyName = links[bindingName];
			end;
			if( bindings[bindingName] ~= nil ) then
				if( bindings[bindingName].key1 ~= nil ) then
					-- Fix key names
					bindings[bindingName].key1 = string.gsub(bindings[bindingName].key1, "CTRL", "CONTROL");
					if( string.find(bindings[bindingName].key1, '+') ) then
						local parts = explode(bindings[bindingName].key1, '+');
						-- parts[1] = modifier
						-- parts[2] = key
						settings.hotkeys[hotkeyName].key = key["VK_" .. parts[2]];
						settings.hotkeys[hotkeyName].modifier = key["VK_" .. parts[1]];
					else
						settings.hotkeys[hotkeyName].key = key["VK_" .. bindings[bindingName].key1];
					end
					
					check_double_key_settings( hotkeyName, settings.hotkeys[hotkeyName].key, 
					  settings.hotkeys[hotkeyName].modifier );
				end
			end
		end
		bindHotkey("MOVEFORWARD");
		bindHotkey("MOVEBACKWARD");
		bindHotkey("TURNLEFT");
		bindHotkey("TURNRIGHT");
		bindHotkey("STRAFELEFT");
		bindHotkey("STRAFERIGHT");
		bindHotkey("JUMP");
		bindHotkey("TARGETNEARESTENEMY");
		bindHotkey("TARGETNEARESTFRIEND");
	end
	-- check ingame settings
	-- only if we can find the bindings.txt file
	local function check_ingame_settings( _name, _ingame_key)
		
		if( not bindings ) then		-- no bindings.txt file loaded
			return
		end;
		
		if( settings.hotkeys[_name].key ~= key["VK_"..bindings[_ingame_key].key1] and
		    settings.hotkeys[_name].key ~= key["VK_"..bindings[_ingame_key].key2] ) then
			cprintf(cli.yellow, "Your bot settings for hotkey \'%s\' in settings.xml "..
			   "don't match your RoM ingame keyboard settings.\n",
			        _name);
			error("Please check your settings!", 0);
		end
	end
	function checkHotkeys(_name, _ingame_key)
		if( not settings.hotkeys[_name] ) then
			error("ERROR: Global hotkey not set: " .. _name, 0);
		end
		
		-- check if settings.lua hotkeys match the RoM ingame settings
		-- check_ingame_settings( _name, _ingame_key);
	end
	for i,v in pairs(elements) do
		local name = v:getName();
		if( string.lower(name) == "hotkeys" ) then
			loadHotkeys(v);
		elseif( string.lower(name) == "options" ) then
			loadOptions(v);
		end
	end
	load_RoM_bindings_txt();	-- read bindings.txt from RoM user folder
	
	-- Check to make sure everything important is set
	--           bot hotkey name    RoM ingame key name         
	checkHotkeys("MOVE_FORWARD",   "MOVEFORWARD");
	checkHotkeys("MOVE_BACKWARD",  "MOVEBACKWARD");
	checkHotkeys("ROTATE_LEFT",    "TURNLEFT");
	checkHotkeys("ROTATE_RIGHT",   "TURNRIGHT");
	checkHotkeys("STRAFF_LEFT",    "STRAFELEFT");
	checkHotkeys("STRAFF_RIGHT",   "STRAFERIGHT");
	checkHotkeys("JUMP",           "JUMP");
	checkHotkeys("TARGET",         "TARGETNEARESTENEMY");
	checkHotkeys("TARGET_FRIEND",  "TARGETNEARESTFRIEND");
	
end
function settings.loadProfile(_name)
	-- Delete old profile settings (if they even exist), restore defaults
	settings.profile = settings_default.profile;
	local filename = getExecutionPath() .. "/profiles/" .. _name .. ".xml";
	local root = xml.open(filename);
	local elements = root:getElements();
	local loadOptions = function(node)
		local elements = node:getElements();
		for i,v in pairs(elements) do
			settings.profile.options[v:getAttribute("name")] = v:getAttribute("value");
		end
	end
	local loadHotkeys = function(node)
		local elements = node:getElements();
		for i,v in pairs(elements) do
			settings.profile.hotkeys[v:getAttribute("name")] = {};
			settings.profile.hotkeys[v:getAttribute("name")].key = key[v:getAttribute("key")];
			settings.profile.hotkeys[v:getAttribute("name")].modifier = key[v:getAttribute("modifier")];
			if( key[v:getAttribute("key")] == nil ) then
				local err = sprintf("Profile error: Please set a valid key for "..
				  "hotkey %s in your profile file \'%s.xml\'.", tostring(v:getAttribute("name")), name );
				error(err, 0);
			end
			check_double_key_settings( v:getAttribute("name"), v:getAttribute("key"), v:getAttribute("modifier") );
		end
	end
	local loadOnDeathEvent = function(node)
		local luaCode = tostring(node:getValue());
		if( string.len(luaCode) > 0 and string.find(luaCode, "%w") ) then
			settings.profile.events.onDeath = loadstring(luaCode);
			if( type(settings.profile.events.onDeath) ~= "function" ) then
				settings.profile.events.onDeath = nil;
			end;
		end
	end
	local loadOnLeaveCombatEvent = function(node)
		local luaCode = tostring(node:getValue());
		if( string.len(luaCode) > 0 and string.find(luaCode, "%w") ) then
			settings.profile.events.onLeaveCombat = loadstring(luaCode);
			if( type(settings.profile.events.onLeaveCombat) ~= "function" ) then
				settings.profile.events.onLeaveCombat = nil;
			end;
		end
	end
	local loadOnSkillCastEvent = function(node)
		local luaCode = tostring(node:getValue());
		if( string.len(luaCode) > 0 and string.find(luaCode, "%w") ) then
			settings.profile.events.onSkillCast = loadstring(luaCode);
			if( type(settings.profile.events.onSkillCast) ~= "function" ) then
				settings.profile.events.onSkillCast = nil;
			end;
		end
	end
	local skillSort = function(tab1, tab2)
		if( tab2.priority < tab1.priority ) then
			return true;
		end;
		return false;
	end
	local loadSkills = function(node)
		local elements = node:getElements();
		for i,v in pairs(elements) do
			local name, hotkey, modifier, level;
			name = v:getAttribute("name");
			hotkey = key[v:getAttribute("hotkey")];
			modifier = key[v:getAttribute("modifier")];
			level = v:getAttribute("level");
			check_double_key_settings( v:getAttribute("name"), v:getAttribute("hotkey") );
			-- Over-ride attributes
			local priority, maxhpper, inbattle, pullonly, maxuse
			priority = v:getAttribute("priority");
			maxhpper = tonumber(v:getAttribute("hpper"));
			inbattle = v:getAttribute("inbattle");
			pullonly = v:getAttribute("pullonly");
			maxuse = tonumber(v:getAttribute("maxuse"));
			-- check if 'wrong' options are set
			if( v:getAttribute("mana")      or
			    v:getAttribute("manainc")   or
			    v:getAttribute("rage")      or
			    v:getAttribute("energy")    or
			    v:getAttribute("concentration")      or
			    v:getAttribute("range")     or
			    v:getAttribute("cooldown")  or
			    v:getAttribute("minrange")  or
			    v:getAttribute("type")      or
			    v:getAttribute("target")    or
			    v:getAttribute("casttime") ) then
			    	cprintf(cli.yellow, "The options \'mana\', \'manainc\', \'rage\', "..
			    	   "\'energy\', \'concentration\', \'range\', "..
			    	   "\'cooldown\', \'minrange\', \'type\', \'target\' and \'casttime\' "..
			    	   "are no valid options for your skill \'%s\' in your profile \'%s.xml\'. "..
			    	   "Please delete them and restart!\n", name, _name);
			    	   error("Bot finished due of errors above.\n", 0);
			end;
			if( v:getAttribute("modifier") ) then
			    	cprintf(cli.yellow, "The options \'modifier\' "..
			    	  "for your skill \'%s\' in your profile \'%s.xml\' "..
			    	  "is not supported at the moment. "..
			    	  "Please delete it and restart!\n", name, _name);
				error("Bot finished due of errors above.\n", 0);
			end;
			if( name == nil) then
			    	cprintf(cli.yellow, "You defined an \'empty\' skill name in "..
			    	  "your profile \'%s.xml\'. Please delete or correct "..
			    	  "that line!\n", _name);
				error("Bot finished due of errors above.\n", 0);
			end;
			if( inbattle ~= nil ) then
				if( inbattle == "true" or 
				    inbattle == true ) then
					inbattle = true;
				elseif( inbattle == "false"  or
					inbattle == false ) then
					inbattle = false;
				else
						cprintf(cli.yellow, "You defined an wrong option inbattle=\'%s\' at skill %s in "..
						  "your profile \'%s.xml\'. Please delete or correct "..
						  "that line!\n", inbattle, name, _name);
					error("Bot finished due of errors above.\n", 0);
				end;
			end
			if( pullonly ~= nil ) then
				if( pullonly == "true" or
					pullonly == true ) then
					pullonly = true;
				else
						cprintf(cli.yellow, "You defined an wrong option pullonly=\'%s\' at skill %s in "..
						  "your profile \'%s.xml\'. Only \'true\' is possible. Please delete or correct "..
						  "that line!\n", pullonly, name, _name);
					error("Bot finished due of errors above.\n", 0);
				end;
			end
			if( level == nil or level < 1 ) then
				level = 1;
			end
			local baseskill = database.skills[name];
			if( not baseskill ) then
				local err = sprintf("ERROR: \'%s\' is not defined in the database!", name);
				error(err, 0);
			end
			local tmp = CSkill(database.skills[name]);
			tmp.hotkey = hotkey;
			tmp.modifier = modifier;
			tmp.Level = level;
			if( toggleable ) then tmp.Toggleable = toggleable; end;
			if( priority ) then tmp.priority = priority; end
			if( maxhpper ) then tmp.MaxHpPer = maxhpper; end;
			if( inbattle ~= nil ) then tmp.InBattle = inbattle; end;
			if( pullonly == true ) then tmp.pullonly = pullonly; end;
			if( maxuse ) then tmp.maxuse = maxuse; end;
			table.insert(settings.profile.skills, tmp);
		end
		table.sort(settings.profile.skills, skillSort);
	end
	local loadFriends = function(node)
		local elements = node:getElements();
		for i,v in pairs(elements) do
			local name = v:getAttribute("name");
			table.insert(settings.profile.friends, name);
		end
	end
	local hf_temp = _name;	-- remember profile name shortly
	for i,v in pairs(elements) do
		local name = v:getName();
		if( string.lower(name) == "options" ) then
			loadOptions(v);
		elseif( string.lower(name) == "hotkeys" ) then
			loadHotkeys(v);
		elseif( string.lower(name) == "skills" ) then
			loadSkills(v);
		elseif( string.lower(name) == "friends" ) then
			loadFriends(v);
		elseif( string.lower(name) == "ondeath" ) then
			loadOnDeathEvent(v);
		elseif( string.lower(name) == "onleavecombat" ) then
			loadOnLeaveCombatEvent(v);
		elseif( string.lower(name) == "onskillcast" ) then
			loadOnSkillCastEvent(v);
		elseif( string.lower(name) == "skills_warrior"  and
		        player.Class1 == CLASS_WARRIOR ) then
			loadSkills(v);
		elseif( string.lower(name) == "skills_scout"  and
		        player.Class1 == CLASS_SCOUT ) then
			loadSkills(v);
		elseif( string.lower(name) == "skills_rogue"  and
		        player.Class1 == CLASS_ROGUE ) then
			loadSkills(v);
		elseif( string.lower(name) == "skills_mage"  and
		        player.Class1 == CLASS_MAGE ) then
			loadSkills(v);
		elseif( string.lower(name) == "skills_priest"  and
		        player.Class1 == CLASS_PRIEST ) then
			loadSkills(v);
		elseif( string.lower(name) == "skills_knight"  and
		        player.Class1 == CLASS_KNIGHT ) then
			loadSkills(v);
		elseif( string.lower(name) == "skills_runedancer"  and
		        player.Class1 == CLASS_RUNEDANCER ) then
			loadSkills(v);
		elseif( string.lower(name) == "skills_druid"  and
		        player.Class1 == CLASS_DRUID ) then
			loadSkills(v);
		else		-- warning for other stuff and misspellings
			if ( string.lower(name) ~= "skills_warrior"     and
			     string.lower(name) ~= "skills_scout"       and
		 	     string.lower(name) ~= "skills_rogue"       and
	 		     string.lower(name) ~= "skills_mage"        and
			     string.lower(name) ~= "skills_priest"      and
			     string.lower(name) ~= "skills_knight"      and
			     string.lower(name) ~= "skills_runedancer"  and
			     string.lower(name) ~= "skills_druid" )     then
				cprintf(cli.yellow, tostring(language[60]), string.lower(tostring(name)),
					tostring(hf_temp));
			end;
		end
	end
	function checkProfileHotkeys(name)
		if( not settings.profile.hotkeys[name] ) then
			error("ERROR: Hotkey not set for this profile: " ..name, 0);
		end
	end
	-- Check to make sure everything important is set
	checkProfileHotkeys("ATTACK");
	-- default combat type if not in profile defined
	if( settings.profile.options.COMBAT_TYPE ~= "ranged" and 
	    settings.profile.options.COMBAT_TYPE ~= "melee" ) then
		if( player.Class1 == CLASS_WARRIOR or
		    player.Class1 == CLASS_ROGUE   or
--		    player.Class1 == CLASS_RUNEDANCER  or
		    player.Class1 == CLASS_KNIGHT  ) then
			settings.profile.options.COMBAT_TYPE  = "melee";
		elseif(
		    player.Class1 == CLASS_PRIEST  or
		    player.Class1 == CLASS_SCOUT   or
--		    player.Class1 == CLASS_DRUID   or
		    player.Class1 == CLASS_MAGE    ) then
			settings.profile.options.COMBAT_TYPE  = "ranged";
		else
			error("undefined player.Class1 in settings.lua", 0);
		end;
	end
endCode: Select all
<profile>
	<options>
		<!-- Try the bot with a new char mage or priest         -->
		<!-- At the pioneer village. Use demo.xml waypoint file -->
		<option name="HP_LOW"        value="85" />
		<option name="MP_LOW_POTION" value="50" />
		<option name="HP_LOW_POTION" value="40" />
		<option name="POTION_COOLDOWN"    value="15" />
		<!-- Combat options -->
		<option name="COMBAT_TYPE"        value="ranged" />	<!-- Choose ranged/melee if not using class default -->
		<option name="COMBAT_RANGED_PULL" value="false" /> <!-- only important for melees -->
		<option name="COMBAT_DISTANCE"    value="500" />
		<option name="MAX_FIGHT_TIME"     value="15" />	<!-- Max time without damage before break -->
		<option name="DOT_PERCENT"        value="90" />
		<option name="ANTI_KS"            value="true" />
		<!-- Waypoint and movement settings -->
		<option name="WAYPOINTS"		value="bigharvest.xml" />
		<option name="RETURNPATH"		value="bigharvest.xml" />
		<option name="PATH_TYPE"		value="waypoints" />	<!-- waypoints | wander -->
		<option name="WANDER_RADIUS"		value="500" />
		<option name="WAYPOINT_DEVIATION"	value="0" />
		<option name="QUICK_TURN" 		value="false" />
		<!-- Attack monsters 3 levels above or 10 below your level -->
		<option name="TARGET_LEVELDIF_ABOVE" value="3" />
		<option name="TARGET_LEVELDIF_BELOW" value="10" />
		
		<!-- Loot settings -->
		<option name="LOOT"               value="true" />
		<option name="LOOT_IN_COMBAT"     value="true" />
		<option name="LOOT_DISTANCE"      value="100" />
		<option name="LOOT_PAUSE_AFTER"   value="10" />		<!-- probability in % for a short rest -->
		<!-- Rest if HP or Mana is below that level -->
		<option name="HP_REST" value="15" />
		<option name="MP_REST" value="15" />
		<!-- Log out and resurrect settings -->
		<option name="LOGOUT_TIME" value="0" />			<!-- in minutes, 0 = timer disabled -->
		<option name="LOGOUT_SHUTDOWN" value="false" />
		<option name="LOGOUT_WHEN_STUCK" value="true" />
		<option name="RES_AUTOMATIC_AFTER_DEATH" value="true" />
	</options>
	<friends>
		<!-- names of friends we help fighting or enemys we don't want to attack -->
		<friend name="MyOtherCharacter1" />
		<friend name="MyOtherCharacter2" />
		<friend name="Elite_Mob_Name1" />
		<friend name="Elite_Mob_Name2" />
	</friends>
	<hotkeys>
		<hotkey name="HP_POTION"    key="VK_MINUS" />
		<hotkey name="MP_POTION"    key="VK_PLUS" />
		<hotkey name="ATTACK"       key="VK_0" />
		<hotkey name="RES_MACRO"    key="VK_9" />
		<hotkey name="LOGOUT_MACRO" key="VK_9" />
	</hotkeys>
	<!-- define your skills depending from your actual primary class -->
	<!-- see the example for a priest/mage respectively mage/priest  -->
	<!-- delete skills you don't have or don't want to use.          -->
	<!-- For more skills to use see /database/skills.xml             -->
	<!-- demo skills for LvL 1 character for all classes             -->
	<skills_priest> 
	        <skill name="PRIEST_SOUL_SOURCE"   hotkey="VK_4" priority="110" inbattle="true" hpper="15" />
	        <skill name="PRIEST_HOLY_AURA"     hotkey="VK_7" priority="100" inbattle="true" hpper="24" />
	        <skill name="PRIEST_URGENT_HEAL"   hotkey="VK_2" priority="100" hpper="30"  />
	        <skill name="PRIEST_REGENERATE"    hotkey="VK_6" priority="90" />
		<skill name="PRIEST_RISING_TIDE"   hotkey="VK_3" priority="80" />
	        <skill name="MAGE_FIREBALL"        hotkey="VK_8" priority="70" />
	        <skill name="PRIEST_WAVE_ARMOR"    hotkey="VK_5" priority="40"  inbattle="true" />
	        <!--skill name="PRIEST_SOUL_BOND"     hotkey="VK_T" priority="30" /> -->
	        <!--skill name="PRIEST_MAGIC_BARRIER" hotkey="VK_F" priority="20" /> -->
	</skills_priest>   
	<skills_warrior> 
		<skill name="WARRIOR_SLASH"          hotkey="VK_2" priority="90" />
		<skill name="WARRIOR_PROBING_ATTACK" hotkey="VK_4" priority="80" />
		<skill name="WARRIOR_OPEN_FLANK"     hotkey="VK_5" priority="70" />		
	</skills_warrior>
	<skills_scout> 
		<skill name="SCOUT_SHOT"        hotkey="VK_2" priority="90" />
		<skill name="SCOUT_AUTOSHOT"    hotkey="VK_4" priority="80" />
		<skill name="SCOUT_WIND_ARROWS" hotkey="VK_5" priority="70" />	
	</skills_scout>
	<skills_rogue> 
		<skill name="ROGUE_SHADOWSTAB"  hotkey="VK_2" priority="90" />
		<skill name="ROGUE_LOW_BLOW"    hotkey="VK_4" priority="80" />
	</skills_rogue>
	<skills_mage>
	        <skill name="PRIEST_HOLY_AURA"      hotkey="VK_7" priority="110" hpper="30" inbattle="true" />
	        <skill name="PRIEST_URGENT_HEAL"    hotkey="VK_2" priority="100" hpper="30"  />
	        <skill name="MAGE_PLASMA_ARROW"     hotkey="VK_4" priority="90" />
	        <skill name="MAGE_FLAME"            hotkey="VK_1" priority="80" />
	        <skill name="PRIEST_REGENERATE"     hotkey="VK_6" priority="70" />
	        <skill name="MAGE_ESSENCE_OF_MAGIC" hotkey="VK_8" priority="60" />
	        <!--skill name="PRIEST_MAGIC_BARRIER"  hotkey="VK_F" priority="50" /> -->     
	</skills_mage>     
	<skills_knight>
		<skill name="KNIGHT_HOLY_STRIKE"  hotkey="VK_3" priority="90" />
		<skill name="KNIGHT_HOLY_SHIELD"  hotkey="VK_4" priority="80"  inbattle="true" hpper="15" />
		<skill name="KNIGHT_HOLY_SEAL"    hotkey="VK_5" priority="70" />
		<skill name="KNIGHT_PUNISHMENT"   hotkey="VK_2" priority="60" />
	</skills_knight>
	<skills_runedancer> 
	</skills_runedancer>
	<skills_druid> 
	</skills_druid>
	<onDeath>
		-- Additional Lua code to execute on death
		-- pauseOnDeath(); -- Stop the script
	</onDeath>
	<onLeaveCombat>
		-- Additional Lua code to execute after killing an enemy
	</onLeaveCombat>
	<onSkillCast>
		-- Additional Lua code to execute when casting a skill
		-- Note: arg1 contains the skill being used.
		-- i.e. arg1.Name will be the name of the skill being cast.
	</onSkillCast>
</profile>

 ) while botting.
  ) while botting.