Quote:
Originally Posted by ya.dingus
[You must be logged in to view images. Log in or Register.]
Like neither of you get it, I actually posted the source documentation to the original warrior post that had the chances per hit and broke the math down to the 5% margin you avoid being "stunned"
You two literally don't understand the following;
1. Bash does not always stun. It has a chance to stun. It's not guaranteed
2. It also has a less chance of hitting you than a normal hit
3. If a mob is lower than you in level by a decent amount, even if it bashes, it has a reduced chance to stun the lower level the monster is.
I'm literally feeding you guys the source material and you're not reading it.
|
You simply aren't reading, which is why you think we don't get it, and why you think your evidence is good.
I posted this earlier:
Quote:
Originally Posted by DeathsSilkyMist
[You must be logged in to view images. Log in or Register.]
No, FSI is only relevant when mobs bash you. Bash has 3 components:
1. Damage
2. Chance to interrupt spell
3. Chance to Stun (100% chance to interrupt spell)
FSI removes the chance to stun. This means you always have a chance to finish casting your spells when you get bashed, you never have to worry about the stun (auto interrupt). This is if you are facing the target. If they hit you from behind, you can still be stunned.
|
And I showed the source code for EQEMU in the other thread you made in the tank section (which you also didn't read):
Code:
bool can_stun = false;
int stunbash_chance = 0; // bonus
if (attacker) {
if (skill_used == EQ::skills::SkillBash) {
can_stun = true;
if (attacker->IsClient())
stunbash_chance = attacker->spellbonuses.StunBashChance +
attacker->itembonuses.StunBashChance +
attacker->aabonuses.StunBashChance;
}
else if (skill_used == EQ::skills::SkillKick &&
(attacker->GetLevel() > 55 || attacker->IsNPC()) && GetClass() == WARRIOR) {
can_stun = true;
}
bool is_immune_to_frontal_stun = false;
if (IsBot() || IsClient() || IsMerc()) {
if (
IsPlayerClass(GetClass()) &&
RuleI(Combat, FrontalStunImmunityClasses) & GetPlayerClassBit(GetClass())
) {
is_immune_to_frontal_stun = true;
}
if (
(
IsPlayerRace(GetBaseRace()) &&
RuleI(Combat, FrontalStunImmunityRaces) & GetPlayerRaceBit(GetBaseRace())
) ||
GetBaseRace() == RACE_OGGOK_CITIZEN_93
) {
is_immune_to_frontal_stun = true;
}
} else if (IsNPC()) {
if (
RuleB(Combat, NPCsUseFrontalStunImmunityClasses) &&
IsPlayerClass(GetClass()) &&
RuleI(Combat, FrontalStunImmunityClasses) & GetPlayerClassBit(GetClass())
) {
is_immune_to_frontal_stun = true;
}
if (
RuleB(Combat, NPCsUseFrontalStunImmunityRaces) &&
(
(
IsPlayerRace(GetBaseRace()) &&
RuleI(Combat, FrontalStunImmunityRaces) & GetPlayerRaceBit(GetBaseRace())
) ||
GetBaseRace() == RACE_OGGOK_CITIZEN_93
)
) {
is_immune_to_frontal_stun = true;
}
}
if (
is_immune_to_frontal_stun &&
!attacker->BehindMob(this, attacker->GetX(), attacker->GetY())
) {
can_stun = false;
}
if (GetSpecialAbility(UNSTUNABLE)) {
can_stun = false;
}
}
if (can_stun) {
int bashsave_roll = zone->random.Int(0, 100);
if (bashsave_roll > 98 || bashsave_roll > (55 - stunbash_chance)) {
// did stun -- roll other resists
// SE_FrontalStunResist description says any angle now a days
int stun_resist2 = spellbonuses.FrontalStunResist + itembonuses.FrontalStunResist +
aabonuses.FrontalStunResist;
if (zone->random.Int(1, 100) > stun_resist2) {
// stun resist 2 failed
// time to check SE_StunResist and mod2 stun resist
int stun_resist =
spellbonuses.StunResist + itembonuses.StunResist + aabonuses.StunResist;
if (zone->random.Int(0, 100) >= stun_resist) {
// did stun
// nothing else to check!
Stun(2000); // straight 2 seconds every time
}
else {
// stun resist passed!
if (IsClient())
MessageString(Chat::Stun, SHAKE_OFF_STUN);
}
}
else {
// stun resist 2 passed!
if (IsClient())
MessageString(Chat::Stun, AVOID_STUNNING_BLOW);
}
}
else {
// main stun failed -- extra interrupt roll
if (IsCasting() &&
!EQ::ValueWithin(casting_spell_id, 859, 1023)) // these spells are excluded
// 90% chance >< -- stun immune won't reach this branch though :(
if (zone->random.Int(0, 9) > 1)
InterruptSpell();
}
}
if (spell_id != SPELL_UNKNOWN && !iBuffTic) {
//see if root will break
if (IsRooted() && !FromDamageShield) // neotoyko: only spells cancel root
TryRootFadeByDamage(buffslot, attacker);
}
else if (spell_id == SPELL_UNKNOWN)
{
//increment chances of interrupting
if (IsCasting()) { //shouldnt interrupt on regular spell damage
attacked_count++;
LogCombat("Melee attack while casting. Attack count [{}]", attacked_count);
}
}
I have also shown videos where it shows I would save more HP with FSI preventing a stun than HP regen:
https://youtu.be/igpbLuNe0ls?t=440
https://youtu.be/uEgFcImQ9XU?t=18
You didn't even read
https://wiki.project1999.com/Sakuragi%27s_Warrior_Guide correctly. He is saying if a fight lasts 40 seconds and you get stunned for 2 seconds, the 2 seconds of being stunned is 5% of the total 40 seconds. A Warrior only cares about the raw stun time, since that is time they can't swing their weapons. Spell casters lose more time when getting stunned, because you also have to take into account the amount of time it takes to recast a spell. If you get stunned 4 seconds in to casting Malo, you end up wasting a minimum of 6 seconds (2 from stun and 4 from the spell you didn't finish).
If Sakuragi's math is correct:
1. Over 80 seconds a mob would use their secondary attack 10 times.
2. 8/10 of those secondary attacks would be bashes
3. 4/10 of those secondary attacks would hit
4. 2/10 of those bashes would stun
This means 1 stunning bash every 40 seconds, so I assume he thinks the stuns last for 2 seconds. Based on the source code I showed above, that seems correct.