Page 1 of 1
Need some help with my OnSkillCast for warrior
Posted: Sun Feb 13, 2011 4:23 pm
by Rom Botter
So i started working with my onskillcast in my profile, and found some nice info on the wiki and forums.
now i have the following code in my onskillcast section, just cant figure out why the bot doesnt accept it when i start it...
i have following:
Code: Select all
<onSkillCast>
local bool, count = target:hasDebuff("Disarmament IV");
if bool == false then
player:cast("KNIGHT_DISARMAMENT");
end;
local target = player:getTarget();
local bool, count = target:hasDebuff("Disarmament IV");
if bool == true then
player:cast("WARRIOR_SLASH");
end;
local target = player:getTarget();
local bool, count = target:hasDebuff("Bleed");
if bool == true then
player:cast("WARRIOR_PROBING_ATTACK");
end;
local target = player:getTarget();
local bool, count = target:hasDebuff("Vulnerable");
if bool == true then
player:cast("WARRIOR_OPEN_FLANK");
end;
</onSkillCast>
the error i get is:
Code: Select all
...player.lua:669: onSkillCast error: [string "..."]:2: attempt to index global 'target' <a nuill value>
any help would be much appreciated ^^
Re: Need some help with my OnSkillCast for warrior
Posted: Sun Feb 13, 2011 9:33 pm
by rock5
The error message says it all, 'target is null value'. When does getTarget() return nil? When you don't have anything targeted. Just do a check to see if target is nil and continue from there. Hopefully that will work.
BTW. this will all become obsolete once I release the changes I'm making to get buff info from memory. Those sort of checks will be done automatically. I've already done the changes, I'm just updating the skills.xml database with all the buff data which is going to take me awhile.
Re: Need some help with my OnSkillCast for warrior
Posted: Sun Feb 13, 2011 9:39 pm
by lisa
Yup don't forgot onskillcast also occurs when you cast buffs and such, it's not just for when you attack.
Re: Need some help with my OnSkillCast for warrior
Posted: Mon Feb 14, 2011 6:26 am
by Rom Botter
removed buffs from profile, now it still gets an error, AFTER it killed a mob... so even when its not casting skills (or just done casting a skill) it still checks the onskillcast and since theres no mob (or atleast a dead mob...) i get nill error
tried putting:
Code: Select all
local bool, count = player:getTarget();
if bool == true then
before every check, but the bot wont accept that ...
is there maybe a page on the wiki that goes into more advanced details about what u can use or make checks on in the onskillcast section?
Re: Need some help with my OnSkillCast for warrior
Posted: Mon Feb 14, 2011 6:47 am
by Germangold
so we do have
onSkillCast
onDeath
onLevelUp
onLeaveCombat
onLoad
as event triggers
why dont use
Code: Select all
if( self.Battling ) then
your code
or is a event like
onCombat
more usefull?
Re: Need some help with my OnSkillCast for warrior
Posted: Mon Feb 14, 2011 6:50 am
by lisa
rock5 posted some code a week or so again, wish I could remember it. It did code for if the skill was **. So basically the code checked if the skill would be
KNIGHT_DISARMAMENT and then it would do the code after that check and if the skill being used wasn't KNIGHT_DISARMAMENT then it wouldn't do the code, obviously.
It was very handy code, just wish I could remember lol
was something like
Code: Select all
if KNIGHT_DISARMAMENT = true then **** end
I doubt that is the actual code though
Re: Need some help with my OnSkillCast for warrior
Posted: Mon Feb 14, 2011 8:50 am
by rock5
I think this is all wrong. You're trying to totally control your attack sequence in the <onSkillCast> section. That will never work properly. The <onSkillCast> section is mostly used to follow 1 skill after another. What you are doing is checking buffs. You need to do that before the skill is used. What you really need to use is the <onPreSkillCast> section. Try something like this;
Code: Select all
<onPreSkillCast>
player:update()
local target = player:getTarget()
if arg1 == "KNIGHT_DISARMAMENT" and target:hasBuff("Disarmament IV") then
return false
elseif arg1 == "WARRIOR_SLASH" and not target:hasBuff("Disarmament IV") then
return false
elseif arg1 == "WARRIOR_PROBING_ATTACK" and not target:hasDebuff("Bleed") then
return false
elseif arg1 == "WARRIOR_OPEN_FLANK" and not target:hasDebuff("Vulnerable") then
return false
end
return true
</onPreSkillCast>
Re: Need some help with my OnSkillCast for warrior
Posted: Mon Feb 14, 2011 9:16 am
by lisa
That looks like the code I was thinking of, I better add it to my file so I can "remember" it =)
Re: Need some help with my OnSkillCast for warrior
Posted: Mon Feb 14, 2011 10:16 am
by Rom Botter
rock5 wrote:I think this is all wrong. You're trying to totally control your attack sequence in the <onSkillCast> section. That will never work properly. The <onSkillCast> section is mostly used to follow 1 skill after another. What you are doing is checking buffs. You need to do that before the skill is used. What you really need to use is the <onPreSkillCast> section. Try something like this;
Code: Select all
<onPreSkillCast>
player:update()
local target = player:getTarget()
if arg1 == "KNIGHT_DISARMAMENT" and target:hasBuff("Disarmament IV") then
return false
elseif arg1 == "WARRIOR_SLASH" and not target:hasBuff("Disarmament IV") then
return false
elseif arg1 == "WARRIOR_PROBING_ATTACK" and not target:hasDebuff("Bleed") then
return false
elseif arg1 == "WARRIOR_OPEN_FLANK" and not target:hasDebuff("Vulnerable") then
return false
end
return true
</onPreSkillCast>
yes i want total control over the skill casting of my warrior, i want it to make "combo's" with the skills thatfollow eachother up like:
Disarmament stacked 4 times to lower their defense
Slash to give them Bleed
Probing attack (target needs bleed) to make them vulnerable
Open flank ( target needs to be vulnerable)
and then repeat those skills in that way to gain best damage/DPS
here is my profile, i changed the onpreskillcast again to do it skill by skill and put the skills on autouse="false"... now the bot is not using any skills at all
Code: Select all
<?xml version="1.0" encoding="utf-8"?>
<profile>
<options>
<!-- Try the bot with a new char mage -->
<!-- At the pioneer village. Use demo.xml waypoint file -->
<option name="HP_LOW" value="85" />
<option name="MP_LOW_POTION" value="60" />
<option name="HP_LOW_POTION" value="70" />
<option name="USE_HP_POTION" value="best" /> <!-- potion select strategy: best|minstack -->
<option name="USE_MANA_POTION" value="best" /> <!-- potion select strategy: best|minstack -->
<!-- Rest if HP or Mana is below that level -->
<option name="HP_REST" value="30" />
<option name="MP_REST" value="35" />
<!-- Shopping options, how many of what do you want to keep in your inventory -->
<option name="HEALING_POTION" value="550" />
<option name="MANA_POTION" value="550" />
<option name="ARROW_QUIVER" value="0" />
<option name="THROWN_BAG" value="0" />
<option name="POISON" value="0" />
<!-- either false or arrow or thrown -->
<option name="RELOAD_AMMUNITION" value="false" /> <!-- false|arrow|thrown -->
<!-- Combat options -->
<option name="COMBAT_TYPE" value="" /> <!-- leave empty or choose ranged/melee if not using class default -->
<option name="COMBAT_RANGED_PULL" value="true" /> <!-- only important for melees -->
<option name="COMBAT_DISTANCE" value="50" />
<option name="MAX_FIGHT_TIME" value="8" /> <!-- Max time without damage before break -->
<option name="DOT_PERCENT" value="90" />
<option name="ANTI_KS" value="true" />
<option name="MAX_TARGET_DIST" value="150" />
<!-- Attack monsters 3 levels above or 10 below your level -->
<option name="TARGET_LEVELDIF_ABOVE" value="8" />
<option name="TARGET_LEVELDIF_BELOW" value="5" />
<!-- Waypoint and movement settings -->
<option name="WAYPOINTS" value="" /> <!-- leave empty to show a list -->
<option name="RETURNPATH" value="" />
<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="true" />
<!-- Loot settings -->
<option name="LOOT" value="true" />
<option name="LOOT_IN_COMBAT" value="true" />
<option name="LOOT_DISTANCE" value="150" />
<option name="LOOT_PAUSE_AFTER" value="0" /> <!-- probability in % for a short rest -->
<!-- Harvest options -->
<option name="HARVEST_DISTANCE" value="120" />
<!-- 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" />
<option name="MAX_DEATHS" value="20" /> <!-- Log out after this many deaths -->
<!-- For more options and documentation see the RoM Bot Wiki: -->
<!-- http://www.solarstrike.net/wiki/index.php5?title=RoM_Bot -->
</options>
<friends>
<!-- names of friends we help fighting or enemys we don't want to attack -->
<!-- for umlauts use \129 (ue),\132 (ae),\148 (oe) e.g. K\132fer -->
<friend name="Deadland Sand Scorpion Pupa" />
<friend name="Neep" />
<friend name="Red Skipper" />
<friend name="Wild Pango" />
</friends>
<mobs>
<!-- names of mobs we want to attack -->
<!-- if no names defined we will attack all mobs -->
<mob name="" />
<mob name="" />
<mob name="" />
</mobs>
<hotkeys>
<!-- to communicate with the RoM API / define ingame dummy macro at place 1 -->
<hotkey name="MACRO" modifier="" key="VK_0" />
</hotkeys>
<!-- define your skills depending from your actual primary class -->
<!-- see the example for a priest/mage -->
<!-- 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" modifier="" hotkey="VK_4" priority="110" inbattle="true" hpper="15" />
<skill name="PRIEST_HOLY_AURA" modifier="" hotkey="VK_7" priority="100" inbattle="true" hpper="24" />
<skill name="PRIEST_URGENT_HEAL" modifier="" hotkey="VK_2" priority="100" hpper="30" />
<skill name="PRIEST_REGENERATE" modifier="" hotkey="VK_6" priority="90" />
<skill name="PRIEST_RISING_TIDE" modifier="" hotkey="VK_3" priority="80" />
<skill name="MAGE_FIREBALL" modifier="" hotkey="VK_8" priority="70" />
<skill name="PRIEST_WAVE_ARMOR" modifier="" 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" rebuffcut="60" inbattle="false" /> -->
</skills_priest>
<skills_warrior>
<skill name="WARRIOR_OPEN_FLANK" modifier="" hotkey="VK_5" priority="85" autouse="false" />
<skill name="WARRIOR_PROBING_ATTACK" modifier="" hotkey="VK_4" priority="90" autouse="false" />
<skill name="WARRIOR_SLASH" modifier="" hotkey="VK_3" priority="100" autouse="false" />
<skill name="KNIGHT_DISARMAMENT" modifier="" hotkey="VK_2" priority="110" autouse="false" />
<!-- <skill name="WARRIOR_MOON_CLEAVE" modifier="" hotkey="VK_7" priority="80" /> -->
<!-- <skill name="WARRIOR_BLASTING_CYCLONE" modifier="" hotkey="VK_6" priority="70" /> -->
</skills_warrior>
<skills_scout>
<skill name="SCOUT_SHOT" modifier="" hotkey="VK_2" priority="85" maxuse="3" />
<skill name="SCOUT_VAMPIRE_ARROWS" modifier="" hotkey="VK_3" priority="105" />
<skill name="SCOUT_AUTOSHOT" modifier="" hotkey="VK_4" priority="90" />
<skill name="SCOUT_WIND_ARROWS" modifier="" hotkey="VK_5" priority="95" />
<skill name="KNIGHT_ENHANCED_ARMOR" modifier="" hotkey="VK_9" priority="90" />
</skills_scout>
<skills_rogue>
<skill name="ROGUE_SHADOWSTAB" modifier="" hotkey="VK_2" priority="90" />
<skill name="ROGUE_LOW_BLOW" modifier="" hotkey="VK_4" priority="80" />
</skills_rogue>
<skills_mage>
<skill name="MAGE_FLAME" modifier="" hotkey="VK_3" priority="80" />
<skill name="MAGE_ELEMENTAL_CATALYST" modifier="" hotkey="VK_2" priority="30" inbattle="true" />
</skills_mage>
<skills_knight>
<skill name="KNIGHT_HOLY_STRIKE" modifier="" hotkey="VK_2" priority="35" />
<skill name="KNIGHT_DISARMAMENT" modifier="" hotkey="VK_3" priority="100" />
<skill name="KNIGHT_MANA_RETURN" modifier="" hotkey="VK_4" priority="105" autouse="false" />
<skill name="KNIGHT_HOLY_SEAL" modifier="" hotkey="VK_5" priority="95" />
<skill name="KNIGHT_ENHANCED_ARMOR" modifier="" hotkey="VK_6" priority="95" />
<skill name="KNIGHT_RESOLUTION" modifier="" hotkey="VK_7" priority="95" hpper="30" />
</skills_knight>
<skills_warden>
<skill name="WARDEN_CHARGED_CHOP" modifier="" hotkey="VK_2" priority="90" />
<skill name="WARDEN_ENERGY_ABSORB" modifier="" hotkey="VK_3" priority="80" inbattle="true" hpper="25" />
</skills_warden>
<skills_druid>
<skill name="DRUID_RECOVER" modifier="" hotkey="VK_2" priority="90" hpper="30" />
<skill name="DRUID_EARTH_ARROW" modifier="" hotkey="VK_3" priority="80" />
</skills_druid>
<onLoad><![CDATA[
-- Additional Lua code to execute after loading the profile
-- and before the bot starts. e.g. You could overwrite profile settings here
-- like: changeProfileOption("HP_REST", 60);
]]></onLoad>
<onDeath><![CDATA[
-- Additional Lua code to execute on death
-- pauseOnDeath(); -- Stop the script
-- player:logout(); -- logout
]]></onDeath>
<onLeaveCombat><![CDATA[
-- Additional Lua code to execute after killing an enemy
]]></onLeaveCombat>
<onLevelup><![CDATA[
-- Additional Lua code to execute after having a levelup
-- and levelup the skills for a new character (mage or priest recommended)
-- e.g. sendMacro("SetSpellPoint(_tabnr, _skillnr);"); would levelup a skill
]]></onLevelup>
<onPreSkillCast>
local bool, count = target:hasDebuff("Disarmament IV");
if bool == false then
player:cast("KNIGHT_DISARMAMENT");
elseif bool == true then
player:cast("WARRIOR_SLASH");
end;
local bool2, count = target:hasDebuff("Bleed");
if bool2 == false then
player:cast("WARRIOR_SLASH");
elseif bool2 == true then
player:cast("WARRIOR_PROBING_ATTACK");
end;
local bool3, count = target:hasDebuff("Vulnerable");
if bool3 == false then
player:cast("WARRIOR_PROBING_ATTACK");
elseif bool3 == true then
player:cast("WARRIOR_OPEN_FLANK");
end;
</onPreSkillCast>
</profile>
made 3 different bools which are checked separately with the target:hasDebuff with options for both true and false, bot is not using any attacks except for the auto attack (hotkey 1 xD)
Re: Need some help with my OnSkillCast for warrior
Posted: Mon Feb 14, 2011 10:44 am
by rock5
Nope, still looks wrong. Follow the logic. If it casts disarmament from the skills list it will go into <onSkillCast> and cast Disarmament again which will raise it to 'II' then it will cast Slash to apply Bleed. Then it will caste Probing Attack to apply Vulnerable. Then it will go back to the skill list. What do you have as your second skill? Slash? If so it will cast Slash then go into <onSkillCast> again. Disarmament is still not 'IV' so that casts again. Your target is bleeding so it casts Probing Attack.The target is Vulnerable so it does Open Flank.
So that's;
Disarmament -- from skill list
Disarmament
Slash
Probing Attack
Slash -- from skill list
Disarmament
Probing Attack
Open Flank
I don't think that's the order you wanted it to cast. Whereas my idea checks and stops skills from casting before it casts if the appropriate buff doesn't exist. Mine should go;
Disarmament
Disarmament
Disarmament
Disarmament
Slash
Probing Attack
Open Flank
Re: Need some help with my OnSkillCast for warrior
Posted: Mon Feb 14, 2011 11:03 am
by Rom Botter
wow... guess i wasnt thinking logical, but now u said it i see what u mean.
from
Code: Select all
<onPreSkillCast>
player:update()
local target = player:getTarget()
if arg1 == "KNIGHT_DISARMAMENT" and target:hasBuff("Disarmament IV") then
return false
elseif arg1 == "WARRIOR_SLASH" and not target:hasBuff("Disarmament IV") then
return false
elseif arg1 == "WARRIOR_PROBING_ATTACK" and not target:hasDebuff("Bleed") then
return false
elseif arg1 == "WARRIOR_OPEN_FLANK" and not target:hasDebuff("Vulnerable") then
return false
end
return true
</onPreSkillCast>
i just dont understand where the bot will get the info where states what arg1 is...
shouldnt there be a place that says something like:
or something like that?
btw did u see my old post, or the one where i edited my profile in? cuz the codes were different...
Re: Need some help with my OnSkillCast for warrior
Posted: Mon Feb 14, 2011 11:17 am
by JackBlonder
onPreSkillCast delivers an argument arg1 which is the actual skill to be casted.
Re: Need some help with my OnSkillCast for warrior
Posted: Mon Feb 14, 2011 8:06 pm
by rock5
[quote=Rom Botter]now the bot is not using any skills at all[/quote]That's because you set all the skills to autouse=false. The onSkillCast and onPreSkillCast code are only executed when the bot uses a skill from the list(that does not include when you use the skill yourself using the player:cast() command). If no skill is used then those codes don't go off.
You are not using <onPreSkillCast> section properly. It is executed before the skill so that you can do some extra checks before casting the skill. If it returns true, it will cast the skill otherwise it wont cast the skill. Consider it like a filter. In my examples, the bot will still try to cast all the skills but the onpreskillcast section will only allow Disarmament through until it reaches 'IV'. Then it will only let Slash through until there is a bleed affect. Then it will only let Probing Attack through until the target is Vulnerable. Then it will only let open flank through while all those debuffs are active.
Have you tried my example?
Re: Need some help with my OnSkillCast for warrior
Posted: Wed Feb 16, 2011 2:52 am
by rock5
As promised, buffs have been added.
http://www.solarstrike.net/phpBB3/viewt ... uff#p18941
You can now pretty much do all this with just the skill settings.
Re: Need some help with my OnSkillCast for warrior
Posted: Wed Feb 16, 2011 7:34 am
by Rom Botter
rock5 wrote:Rom Botter wrote:now the bot is not using any skills at all
That's because you set all the skills to autouse=false. The onSkillCast and onPreSkillCast code are only executed when the bot uses a skill from the list(that does not include when you use the skill yourself using the player:cast() command). If no skill is used then those codes don't go off.
You are not using <onPreSkillCast> section properly. It is executed before the skill so that you can do some extra checks before casting the skill. If it returns true, it will cast the skill otherwise it wont cast the skill. Consider it like a filter. In my examples, the bot will still try to cast all the skills but the onpreskillcast section will only allow Disarmament through until it reaches 'IV'. Then it will only let Slash through until there is a bleed affect. Then it will only let Probing Attack through until the target is Vulnerable. Then it will only let open flank through while all those debuffs are active.
Have you tried my example?
yes i tried (to understand it) but i just could not comprehend the code... how to implement it..
im stopping trying to understand this.... its giving me a major headache...
thanks for all ur info and trying to help me with this, its just not for me...
(btw i want to understand it, not being spoon fed everything...)
thanks again tho for all the help!!!