PDA

View Full Version : Flee Patch to stop mobs fleeing if other mobs are also in combat against the player


Derision
06-12-2008, 02:43 PM
Here is a patch to implement changes to flee such that mobs won't flee if the player at the top of their hatelist
has other mobs on their hatelist which are not green cons, feared/fleeing or mezzed and are within aggro range of the
player.

http://www.rama.demon.co.uk/smartflee.patch

The main change is a new method added to the HateList class:


int32 HateList::GetHatedCount(Mob *hater, bool CountGreens, bool CountFearedOrMezzed, bool RangeCheck)


I also added Mob::IsFeared which returns the state of the curfp flag.

The final change is to call HateList::GetHatedCount from CheckFlee

Oh, and I added a rule:


RULE_BOOL ( Combat, FleeIfNotAlone, false) // If false, mobs won't flee if other mobs are in combat with it.


The default value (false) enables the new code. Setting it to true will make the mob flee like at present even
if there are other mobs in combat.

Angelox
06-12-2008, 10:05 PM
I just caught this one, I'll give it a run, thanks!

trevius
06-13-2008, 12:32 AM
Nice! The fleeing code is really getting cleaned up and tuned nicely! Thanks for another nice update, Derision! I will give this a shot as well when I get back from vacation.

Derision
06-13-2008, 07:21 PM
I was just looking at this code again, and I obviously never tested this patch with FleeIfNotAlone
set to true (i.e. the new code disabled). If FleeIfNotAlone==true, then the mobs won't flee at all.

After applying the patch in my original post. change the rule check in fearpath.cpp from:


if(!RuleB(Combat, FleeIfNotAlone) && hate_top->hate_list.GetHatedCount(hate_top, false, false, true)<=1)
StartFleeing();


to:


if(RuleB(Combat, FleeIfNotAlone) || (!RuleB(Combat, FleeIfNotAlone) && hate_top->hate_list.GetHatedCount(hate_top, false, false, true)<=1))
StartFleeing();


Then the rule should work correctly to disable the new functionality if required when FleeIfNotAlone is set to true.

Scorpious2k
06-18-2008, 10:03 AM
This will be in version 1113.

Aramid
06-27-2008, 10:52 AM
Was looking thru the 1118 code in fearpath.cpp and this is how it is now.
if( RuleB(Combat, FleeIfNotAlone)
|| ( !RuleB(Combat, FleeIfNotAlone)
&& hate_top->hate_list.GetHatedCount(hate_top, false, false, true)< 2 ) )
StartFleeing();


In Derision's code, it's <=1 , not <2. Which is the correct value?
Probably has the same effect no matter which number.

Derision
06-27-2008, 02:44 PM
<=1 and <2 are equivalent (as the return value being checked is an integer). I don't know why it was changed.