PDA

View Full Version : Defensive Proc Rates


squevis667
06-11-2012, 02:49 PM
As previously discussed here, defensive procs are unaffected by proc rate modifiers http://www.eqemulator.org/forums/showthread.php?t=34722.
This is because of this in attack.cpp:
for (int i = 0; i < MAX_PROCS; i++) {
if (MakeRandomInt(0, 100) < MakeRandomInt(0, 20)) {
ExecWeaponProc(DefensiveProcs[i].spellID, on);}
}

I am writing some custom spells that I want to have a 100% proc rate and rewrote the code as follows:
for (int i = 0; i < MAX_PROCS; i++) {
switch(DefensiveProcs[i].spellID)
{
case 9730:
case 9733:
case 9736:
case 9739:
case 9742:
ExecWeaponProc(DefensiveProcs[i].spellID, on);
break;
default:
if (MakeRandomInt(0, 100) < MakeRandomInt(0, 20))
{
ExecWeaponProc(DefensiveProcs[i].spellID, on);
}
}
}
I even deleted the:
if (MakeRandomInt(0, 100) < MakeRandomInt(0, 20))
to try to make it proc every time and that still does not work. I am not a C++ programmer. All of my experience is in C#, but the switch should fall through right? Regardless, if I make the default to proc every time, why does it still only proc every so often and not every attack? Is this handled somewhere else in the code or database as well?

lerxst2112
06-11-2012, 05:07 PM
The way you have it written, if TryDefensiveProc is called and passes the checks above the code you posted then for those particular spell IDs it should happen every time.

You should add debugging information to TriggerDefensiveProcs and TryDefensiveProc to log out the various reasons why they would not end up executing the procs. Just glancing at the code, the big thing is that damage must be done in order for them to trigger, and not every swing results in damage.