PDA

View Full Version : Ogres Immune to Frontal Melee Stuns


TheLieka
12-10-2007, 05:35 AM
Ogres are immune to stuns from frontal melee damage, such as bash.

in .\zone\attack.cpp change:
//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

//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
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.

//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
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:
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.

} 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.

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