EQEmulator Forums

EQEmulator Forums (https://www.eqemulator.org/forums/index.php)
-   Development::Server Code Submissions (https://www.eqemulator.org/forums/forumdisplay.php?f=669)
-   -   Ogres Immune to Frontal Melee Stuns (https://www.eqemulator.org/forums/showthread.php?t=23963)

TheLieka 12-10-2007 05:35 AM

Ogres Immune to Frontal Melee Stuns
 
Ogres are immune to stuns from frontal melee damage, such as bash.

in .\zone\attack.cpp change:
Code:

            //check stun chances if bashing
                if (skill_used == BASH && GetLevel() < 56) {
                        int stun_resist = itembonuses.StunResist+spellbonuses.StunResist;
                        if(stun_resist <= 0 || MakeRandomInt(0,99) >= stun_resist) {
                                mlog(COMBAT__HITS, "Stunned. We had %dpercent resist chance.");
                                Stun(0);
                        } else {
                                mlog(COMBAT__HITS, "Stun Resisted. We had %dpercent resist chance.");
                        }
                }
               
                if(spell_id != SPELL_UNKNOWN) {
                        //see if root will break
                        if (IsRooted()) { // neotoyko: only spells cancel root
                                if(GetAA(aaEnhancedRoot))
                                {
                                        if (MakeRandomInt(0, 99) < 10) {
                                                mlog(COMBAT__HITS, "Spell broke root! 10percent chance");
                                                BuffFadeByEffect(SE_Root, buffslot); // buff slot is passed through so a root w/ dam doesnt cancel itself
                                        } else {
                                                mlog(COMBAT__HITS, "Spell did not break root. 10 percent chance");
                                        }
                                }
                                else
                                {
                                        if (MakeRandomInt(0, 99) < 20) {
                                                mlog(COMBAT__HITS, "Spell broke root! 20percent chance");
                                                BuffFadeByEffect(SE_Root, buffslot); // buff slot is passed through so a root w/ dam doesnt cancel itself
                                        } else {
                                                mlog(COMBAT__HITS, "Spell did not break root. 20 percent chance");
                                        }
                                }                       
                        }
                }
                else{
                        //increment chances of interrupting
                        if(IsCasting()) { //shouldnt interrupt on regular spell damage
                                attacked_count++;
                                mlog(COMBAT__HITS, "Melee attack while casting. Attack count %d", attacked_count);
                        }
                }

to

Code:

            //check stun chances if bashing
                //Lieka Edit:  Making Ogres immune to frontal stun damage
                if (skill_used == BASH && GetLevel() < 56) {
                        int stun_resist = itembonuses.StunResist+spellbonuses.StunResist;
                        if((stun_resist <= 0 || MakeRandomInt(0,99) >= stun_resist) && ((this->GetBaseRace() != OGRE) || attacker->BehindMob(this, attacker->GetX(), attacker->GetY()))) {
                                mlog(COMBAT__HITS, "Stunned. We had %dpercent resist chance.");
                                Stun(0);
                        } else if (this->GetBaseRace() == OGRE && this->IsClient() && !attacker->BehindMob(this, attacker->GetX(), attacker->GetY())) {
                                //Message(15,"Ogres are immune to frontal melee stuns."); //Lieka Edit:  Debug message
                                mlog(COMBAT__HITS, "Stun Resisted. Ogres are immune to frontal melee stuns.");
                        }
else {
                                mlog(COMBAT__HITS, "Stun Resisted. We had %dpercent resist chance.");
                        }
                }
               
                if(spell_id != SPELL_UNKNOWN) {
                        //see if root will break
                        if (IsRooted()) { // neotoyko: only spells cancel root
                                if(GetAA(aaEnhancedRoot))
                                {
                                        if (MakeRandomInt(0, 99) < 10) {
                                                mlog(COMBAT__HITS, "Spell broke root! 10percent chance");
                                                BuffFadeByEffect(SE_Root, buffslot); // buff slot is passed through so a root w/ dam doesnt cancel itself
                                        } else {
                                                mlog(COMBAT__HITS, "Spell did not break root. 10 percent chance");
                                        }
                                }
                                else
                                {
                                        if (MakeRandomInt(0, 99) < 20) {
                                                mlog(COMBAT__HITS, "Spell broke root! 20percent chance");
                                                BuffFadeByEffect(SE_Root, buffslot); // buff slot is passed through so a root w/ dam doesnt cancel itself
                                        } else {
                                                mlog(COMBAT__HITS, "Spell did not break root. 20 percent chance");
                                        }
                                }                       
                        }
                }
                else{
                        //increment chances of interrupting
                        if(IsCasting()) { //shouldnt interrupt on regular spell damage
                                attacked_count++;
                                mlog(COMBAT__HITS, "Melee attack while casting. Attack count %d", attacked_count);
                        }
                }


soulshot 12-10-2007 07:16 AM

nice
 
Very nice. Hope to see this in game soon =)

-Mard

Knightly 12-31-2007 10:16 PM

Awesome. I just started playing around with an Ogre today and noticed this needed to be fixed. You saved me a lot of time. :)

One thing I did differently though is to make the Ogre check first. Six of one, half dozen of the other though.
Code:

            //check stun chances if bashing
        if (skill_used == BASH && GetLevel() < 56) {
                int stun_resist = itembonuses.StunResist+spellbonuses.StunResist;
                if(this->GetBaseRace() == OGRE && this->IsClient() && !attacker->BehindMob(this, attacker->GetX(), attacker->GetY())) {
                        mlog(COMBAT__HITS, "Stun Resisted. Ogres are immune to frontal melee stuns.");
                } else {
                        if(stun_resist <= 0 || MakeRandomInt(0,99) >= stun_resist) {
                                mlog(COMBAT__HITS, "Stunned. We had %dpercent resist chance.");
                                Stun(0);
                        } else {
                                mlog(COMBAT__HITS, "Stun Resisted. We had %dpercent resist chance.");
                        }
                }
        }


fathernitwit 01-02-2008 04:49 PM

Quote:

Originally Posted by Knightly (Post 141389)
One thing I did differently though is to make the Ogre check first. Six of one, half dozen of the other though.

Actually, I dont think it works unless you switch it around. Knightly's fix is correct. You only reach the else cases if it is already resisted.

TheLieka 01-03-2008 04:00 AM

Maybe I'm misunderstanding my own code, but I'm reading it as this:
Code:

        if (skill_used == BASH && GetLevel() < 56) {
                        int stun_resist = itembonuses.StunResist+spellbonuses.StunResist;
                        if((stun_resist <= 0 || MakeRandomInt(0,99) >= stun_resist) && ((this->GetBaseRace() != OGRE) || attacker->BehindMob(this, attacker->GetX(), attacker->GetY()))) {
                                mlog(COMBAT__HITS, "Stunned. We had %dpercent resist chance.");
                                Stun(0);

The stun roll lands. If the target is not an Ogre (not immune to stuns), or if the attacker is behind the target (no race is immune to stuns from melee attacks to the back), then proceed with the stun.

Code:

                        } else if (this->GetBaseRace() == OGRE && this->IsClient() && !attacker->BehindMob(this, attacker->GetX(), attacker->GetY())) {
                                //Message(15,"Ogres are immune to frontal melee stuns."); //Lieka Edit:  Debug message
                                mlog(COMBAT__HITS, "Stun Resisted. Ogres are immune to frontal melee stuns.");

One of the following has happened to get us here:
The stun roll failed or the target is an Ogre.
If the target is an ogre, and the attacker is not behind the ogre (we checked this already in the previous step, but checking it again), then log that the stun was resisted because it was a an attempt at a frontal melee stun on an ogre.

Code:

        } else {
                                mlog(COMBAT__HITS, "Stun Resisted. We had %dpercent resist chance.");
                        }
                }

This is the catch all, but we should only get here if the stun roll failed, so log that it failed.


Maybe I'm missing something, but I've had the code live on my server for quite a while without any further complaints about Ogres getting stunned.

Dax

fathernitwit 01-03-2008 06:25 PM

ah. Didnt realize that you duplicated the ogre logic on the end of the first contidional (line too long). So yours gets the same job done, but I think the readability is lower and it will do twice as much work in the ogre case.

WildcardX 02-13-2008 12:06 PM

FNW asked me to commit this fix for him. I'll add it in tonight or tomorrow.

Thank you for your contribution to the eqemu server code!

WildcardX 02-13-2008 12:15 PM

Actually, KLS already committed this in build 1071, so never mind (/bonk FNW).


All times are GMT -4. The time now is 12:30 PM.

Powered by vBulletin®, Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.