View Single Post
  #7  
Old 01-30-2023, 03:53 PM
Jimjam Jimjam is online now
Planar Protector


Join Date: Jul 2013
Posts: 12,747
Default

 
Quote:
Originally Posted by DeathsSilkyMist [You must be logged in to view images. Log in or Register.]
Hehe unfortunately you won't be getting that award. OP is really talking about Shamans. He is bringing a conversation from the Priest forums over to here for some strange reason. I guess he didn't think the discussion was getting enough attention since it was off topic from the thread at hand. It became off topic due to him.

To further expand upon how FSI should work, I have included some code from the EQEMU GitHub within the spoiler below. The important code is marked in bold:

 

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);
			}
		}


As you can see, if you have FSI, the stun and extra interrupt check are bypassed completely. There is no other code in this function that calls the InterruptSpell() function. This means there is no special code to force interrupt a spell after a stun has been resisted via FSI.

Now, people are going to say "P99 has custom code changes that aren't in the EQEMU repository!", and that is true. But P99 is based on this code, and P99 didn't change every single line of code. If you want to claim that spells always get interrupted after FSI prevents a stun, you need to provide evidence to suggest the P99 developers changed this portion of code. Finding a discussion based on FSI where the developers contributed would be a great piece of evidence to suggest they at least looked at this section of code and made a decision about it. I haven't seen that, but I haven't scoured the forums either.

When it comes to Monks/Shadowknights/Warriors, racial Regeneration is a much bigger helper when it comes to soloing. It will significantly reduce your down times. Outside of soloing, it doesn't really do much. Most racials operate this way: you get the best utility from them when soloing, and lose most of their utility outside of that. FSI is specifically very good for Shamans, because it can save you during the pre-slow period of the fight (the first minute or so), where racial Regeneration is just too slow to save you. You will get a total of 80HP in that minute. When fighting mobs that hit for 140+, that isn't even 1 hit saved. Once the mob is slowed, no racial really matters since the fight is under control, barring any extreme exceptions like getting attacked by other mobs or something.

Even eq emu isn’t classic. Classic eq was janky!

The way bypassing stun checks in classic would work often returned an autointerrupt.

I think the best known one is landing a bash on a giant with a rune would auto interrupt it (because no stun check and no damage done bypassed all the checks so eq went ‘herp derp no checks passed so spell casting is interrupted).

FSI on a sk that would use rune for aggro/damage absorb was actually a draw back!
Reply With Quote