Homunculus skills are processed by char's AI

Forum closed. All further discussion to be discussed at https://github.com/OpenKore/

Moderators: Moderators, Developers

Message
Author
EternalHarvest
Developers
Developers
Posts: 1798
Joined: 05 Dec 2008, 05:42
Noob?: Yes

Homunculus skills are processed by char's AI

#1 Post by EternalHarvest »

http://rofan.ru/viewtopic.php?t=8818
Zloba wrote:Mercenary's skill configured:

Code: Select all

attackSkillSlot ... {
	lvl ...
	mercenary_sp >= ...
	monsters ...
	target ...
	maxUses X
           timeout Y
}
After that, character's skills configured.
When attacking a monster:
aiv

Code: Select all

ai_seq (auto) = skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use
skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use
skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use
skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use
skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use
skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use
skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use
skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use
skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use skill_use move attack
Active tasks: -
Inactive tasks: - 
ai print

Code: Select all

2: skill_use
{skillHandle=>'MA_DOUBLE',giveup=>{timeout=>'1',time=>'1263962710.12292'},ret=>'',skill_used=>'1',waitBeforeUse=>{timeout=>'',time=>'1263962710'},lv=>'7',y=>'',target=>'?o..',maxCastTime=
>{timeout=>'',time=>'1263962710.12294'},skill_use_last=>'1263962708.7456',minCastTime=>{timeout=>'',time=>'1263962710'},tag=>'',skillID=>'8207',prefix=>'attackSkillSlot_1'}

3: skill_use
{skillHandle=>'MA_DOUBLE',giveup=>{timeout=>'1',time=>'1263962710.10966'},ret=>'',skill_used=>'1',waitBeforeUse=>{timeout=>'',time=>'1263962710'},lv=>'7',y=>'',target=>'?o..',maxCastTime=
>{timeout=>'',time=>'1263962710.10968'},skill_use_last=>'1263962708.7456',minCastTime=>{timeout=>'',time=>'1263962710'},tag=>'',skillID=>'8207',prefix=>'attackSkillSlot_1'}

4: skill_use
{skillHandle=>'MA_DOUBLE',giveup=>{timeout=>'1',time=>'1263962710.09559'},ret=>'',skill_used=>'1',waitBeforeUse=>{timeout=>'',time=>'1263962710'},lv=>'7',y=>'',target=>'?o..',maxCastTime=
>{timeout=>'',time=>'1263962710.09561'},skill_use_last=>'1263962708.7456',minCastTime=>{timeout=>'',time=>'1263962710'},tag=>'',skillID=>'8207',prefix=>'attackSkillSlot_1'}

5: skill_use
{skillHandle=>'MA_DOUBLE',giveup=>{timeout=>'1',time=>'1263962710.08196'},ret=>'',skill_used=>'1',waitBeforeUse=>{timeout=>'',time=>'1263962710'},lv=>'7',y=>'',target=>'?o..',maxCastTime=
>{timeout=>'',time=>'1263962710.08199'},skill_use_last=>'1263962708.7456',minCastTime=>{timeout=>'',time=>'1263962710'},tag=>'',skillID=>'8207',prefix=>'attackSkillSlot_1'}

6: skill_use
{skillHandle=>'MA_DOUBLE',giveup=>{timeout=>'1',time=>'1263962710.0692'},ret=>'',skill_used=>'1',waitBeforeUse=>{timeout=>'',time=>'1263962710'},lv=>'7',y=>'',target=>'?o..',maxCastTime=>
{timeout=>'',time=>'1263962710.06922'},skill_use_last=>'1263962708.7456',minCastTime=>{timeout=>'',time=>'1263962710'},tag=>'',skillID=>'8207',prefix=>'attackSkillSlot_1'}

7: skill_use
{skillHandle=>'MA_DOUBLE',giveup=>{timeout=>'1',time=>'1263962710.05648'},ret=>'',skill_used=>'1',waitBeforeUse=>{timeout=>'',time=>'1263962710'},lv=>'7',y=>'',target=>'?o..',maxCastTime=
>{timeout=>'',time=>'1263962710.0565'},skill_use_last=>'1263962708.7456',minCastTime=>{timeout=>'',time=>'1263962710'},tag=>'',skillID=>'8207',prefix=>'attackSkillSlot_1'}

8: skill_use
{skillHandle=>'MA_DOUBLE',giveup=>{timeout=>'1',time=>'1263962710.04381'},ret=>'',skill_used=>'1',waitBeforeUse=>{timeout=>'',time=>'1263962710'},lv=>'7',y=>'',target=>'?o..',maxCastTime=
>{timeout=>'',time=>'1263962710.04383'},skill_use_last=>'1263962708.7456',minCastTime=>{timeout=>'',time=>'1263962710'},tag=>'',skillID=>'8207',prefix=>'attackSkillSlot_1'}
This + teleportAuto = 99% disconnect.
timeout, maxCastTime, minCastTime don't help.
Interesting behaviour of maxUses X: mercenary will use the skill X..2X times randomly.

User avatar
kLabMouse
Administrator
Administrator
Posts: 1301
Joined: 24 Apr 2008, 12:02

Re: [rofan] Mercenary skill spam

#2 Post by kLabMouse »

Can't Reproduce. Closed.

Technology
Super Moderators
Super Moderators
Posts: 801
Joined: 06 May 2008, 12:47
Noob?: No

Re: [rofan] Mercenary skill spam

#3 Post by Technology »

wait, this must be fixed.
One ST0 to rule them all? One PE viewer to find them!
One ST_kRO to bring them all and in the darkness bind them...

Mount Doom awaits us, fellowship of OpenKore!

User avatar
kLabMouse
Administrator
Administrator
Posts: 1301
Joined: 24 Apr 2008, 12:02

Re: [rofan] Mercenary skill spam

#4 Post by kLabMouse »

Technology wrote:wait, this must be fixed.
OK. Then we need Conditions to reproduce and fix it.

Lotus
Human
Human
Posts: 32
Joined: 26 Jan 2010, 12:07
Noob?: No

Re: [rofan] Mercenary skill spam

#5 Post by Lotus »

I had this problem,but. with just the game client itself. I don't remember which RO but the mercenary kept spamming skills till SP runs out and still kept spamming skills (blows up SP the moment regened to minimum req.).

I think the game server is responsible for this ?

User avatar
kLabMouse
Administrator
Administrator
Posts: 1301
Joined: 24 Apr 2008, 12:02

Re: [rofan] Mercenary skill spam

#6 Post by kLabMouse »

Lotus wrote:I had this problem,but. with just the game client itself. I don't remember which RO but the mercenary kept spamming skills till SP runs out and still kept spamming skills (blows up SP the moment regened to minimum req.).

I think the game server is responsible for this ?
May-be because OpenKore do not support(or broken decode) some packets about skill cast and such things.
So it keep spamming Task::Skill until the memory get full.

iamanoob
Plain Yogurt
Plain Yogurt
Posts: 82
Joined: 04 Apr 2008, 09:49

Re: [rofan] Mercenary skill spam

#7 Post by iamanoob »

i encounter this with ONE of my 20 sniper bots
with a correct servertype
it just spams Wind walk
though it never did
sometimes it fills up the AI queue

The bot is able to use that skill on the client but not on kore
idk why... :(
Image
DARKest Ninja

User avatar
kLabMouse
Administrator
Administrator
Posts: 1301
Joined: 24 Apr 2008, 12:02

Re: [rofan] Mercenary skill spam

#8 Post by kLabMouse »

May-be Try this little patch?

Code: Select all

Index: Slave.pm
===================================================================
--- Slave.pm    (revision 7495)
+++ Slave.pm    (working copy)
@@ -450,23 +450,25 @@
         $args->{attackMethod}{type} = "weapon";
         
         ### attackSkillSlot begin
-        for (my ($i, $prefix) = (0, 'attackSkillSlot_0'); $prefix = "attackSkillSlot_$i" and exists $config{$prefix}; $i++) {
-            next unless $config{$prefix};
-            if (checkSelfCondition($prefix) && checkMonsterCondition("${prefix}_target", $target)) {
-                my $skill = new Skill(auto => $config{$prefix});
-                next unless $slave->checkSkillOwnership ($skill);
+        if (! AI::is(qw(skill_use))) { # This one could be our, so wait till the skill is casted (not wery optimal).
+            for (my ($i, $prefix) = (0, 'attackSkillSlot_0'); $prefix = "attackSkillSlot_$i" and exists $config{$prefix}; $i++) {
+                next unless $config{$prefix};
+                if (checkSelfCondition($prefix) && checkMonsterCondition("${prefix}_target", $target)) {
+                    my $skill = new Skill(auto => $config{$prefix});
+                    next unless $slave->checkSkillOwnership ($skill);
                 
-                next if $config{"${prefix}_maxUses"} && $target->{skillUses}{$skill->getHandle()} >= $config{"${prefix}_maxUses"};
-                next if $config{"${prefix}_target"} && !existsInList($config{"${prefix}_target"}, $target->{name});
+                    next if $config{"${prefix}_maxUses"} && $target->{skillUses}{$skill->getHandle()} >= $config{"${prefix}_maxUses"};
+                    next if $config{"${prefix}_target"} && !existsInList($config{"${prefix}_target"}, $target->{name});
                 
-                my $lvl = $config{"${prefix}_lvl"};
-                my $maxCastTime = $config{"${prefix}_maxCastTime"};
-                my $minCastTime = $config{"${prefix}_minCastTime"};
-                debug "Slave attackSkillSlot on $target->{name} ($target->{binID}): ".$skill->getName()." (lvl $lvl)\n", "monsterSkill";
-                my $skillTarget = $config{"${prefix}_isSelfSkill"} ? $slave : $target;
-                AI::ai_skillUse2($skill, $lvl, $maxCastTime, $minCastTime, $skillTarget, $prefix);
-                $ai_v{$prefix . "_time"}{$ID} = time;
-                last;
+                    my $lvl = $config{"${prefix}_lvl"};
+                    my $maxCastTime = $config{"${prefix}_maxCastTime"};
+                    my $minCastTime = $config{"${prefix}_minCastTime"};
+                    debug "Slave attackSkillSlot on $target->{name} ($target->{binID}): ".$skill->getName()." (lvl $lvl)\n", "monsterSkill";
+                    my $skillTarget = $config{"${prefix}_isSelfSkill"} ? $slave : $target;
+                    AI::ai_skillUse2($skill, $lvl, $maxCastTime, $minCastTime, $skillTarget, $prefix);
+                    $ai_v{$prefix . "_time"}{$ID} = time;
+                    last;
+                }
             }
         }
         ### attackSkillSlot end
But I suggest, to implement own Skill_use code, so AI::Slave not depends on AI::queue.

Arukas
Human
Human
Posts: 24
Joined: 01 Sep 2008, 02:11
Noob?: Yes

Re: homunculus attack problem

#9 Post by Arukas »

r7499 pRO ...

problem persist when i set

Code: Select all

attackSkillSlot Caprice {
	lvl 5
	homunculus_sp >= 30
}
and set it to

Code: Select all

attackAuto 0
attackAuto_party 0
homunculus_attackAuto 2
homunculus_attackAuto_party 2
homunculus doesn't attack players on pvp, even monsters

EternalHarvest
Developers
Developers
Posts: 1798
Joined: 05 Dec 2008, 05:42
Noob?: Yes

Re: [rofan] Mercenary skill spam

#10 Post by EternalHarvest »

It should just use slave AI queue for skills, and have attackSkillSlot etc handlers in Actor where they will trigger only on current Actor's skills.

Locked