|
|
![](/forums/images/Darkness/misc/spacer.gif) |
![](/forums/images/Darkness/misc/spacer.gif) |
![](/forums/images/Darkness/misc/spacer.gif) |
![](/forums/images/Darkness/misc/q1.jpg) |
|
![](/forums/images/Darkness/misc/q1-1.jpg) |
![](/forums/images/Darkness/misc/q4.jpg) |
|
![](/forums/images/Darkness/misc/q4-1.jpg) |
![](/forums/images/Darkness/misc/a1.jpg) |
|
![](/forums/images/Darkness/misc/a1-1.jpg) |
|
Development::Feature Requests Post suggestions/feature requests here. |
![Old](/forums/images/Darkness/statusicon/post_old.gif)
03-24-2017, 10:11 AM
|
![ChaosSlayerZ's Avatar](image.php?s=361bba3e62bb2b74f4b5aabf1f3dc606&u=100496&dateline=1489668896) |
Demi-God
|
|
Join Date: Mar 2009
Location: Umm
Posts: 1,492
|
|
Request/Question - always aggros npc
Forgive me if I am out of date on this but here is what I know:
Back when I was actively messing with the server, I learned that in order to make npc always aggro on a player regardless of a level (like lev 5 undead aggro on lev 50 players) you had to set their INT below 75. Which is a bit awkward and obscure and most people don't even know this. I know npc stats probably not used for much, but wouldn't it be better to change that and set it with proper npc Flag instead, like we do for Special Attacks? ( http://wiki.eqemulator.org/p?NPC_Spe...tacks&frm=Main)
Thank You!
|
![Old](/forums/images/Darkness/statusicon/post_old.gif)
03-24-2017, 01:13 PM
|
Discordant
|
|
Join Date: Oct 2016
Posts: 445
|
|
Could this ruletype help ?
Code:
RULE_INT(Aggro, IntAggroThreshold, 75) // Int <= this will aggro regardless of level difference.
|
![Old](/forums/images/Darkness/statusicon/post_old.gif)
03-24-2017, 01:25 PM
|
![ChaosSlayerZ's Avatar](image.php?s=361bba3e62bb2b74f4b5aabf1f3dc606&u=100496&dateline=1489668896) |
Demi-God
|
|
Join Date: Mar 2009
Location: Umm
Posts: 1,492
|
|
Yeah, but I think its sort of weird assigning it to a stat score rather than having a special attack flag.
|
![Old](/forums/images/Darkness/statusicon/post_old.gif)
03-24-2017, 01:44 PM
|
Discordant
|
|
Join Date: Oct 2016
Posts: 445
|
|
Quote:
Originally Posted by ChaosSlayerZ
Yeah, but I think its sort of weird assigning it to a stat score rather than having a special attack flag.
|
Yes, I agree with you. It is a weird way of doing it.
|
![Old](/forums/images/Darkness/statusicon/post_old.gif)
03-24-2017, 03:09 PM
|
![ghanja's Avatar](image.php?s=361bba3e62bb2b74f4b5aabf1f3dc606&u=183697&dateline=1414682103) |
Dragon
|
|
Join Date: Aug 2012
Location: Hershey, PA
Posts: 499
|
|
Quote:
Originally Posted by ChaosSlayerZ
Yeah, but I think its sort of weird assigning it to a stat score rather than having a special attack flag.
|
I experienced a brain fart initially. So the request is to make it a special attack. Hmm.
|
![Old](/forums/images/Darkness/statusicon/post_old.gif)
03-24-2017, 05:02 PM
|
![ChaosSlayerZ's Avatar](image.php?s=361bba3e62bb2b74f4b5aabf1f3dc606&u=100496&dateline=1489668896) |
Demi-God
|
|
Join Date: Mar 2009
Location: Umm
Posts: 1,492
|
|
Quote:
Originally Posted by ghanja
I experienced a brain fart initially. So the request is to make it a special attack. Hmm.
|
Exactly ![Wink](http://www.eqemulator.net/forums/images/smilies/icon_wink.gif) Like the similar things here:
http://wiki.eqemulator.org/p?NPC_Spe...tacks&frm=Main
|
![Old](/forums/images/Darkness/statusicon/post_old.gif)
04-13-2017, 01:24 AM
|
![Coenxai's Avatar](image.php?s=361bba3e62bb2b74f4b5aabf1f3dc606&u=207135&dateline=1423800108) |
Hill Giant
|
|
Join Date: Dec 2013
Posts: 151
|
|
This is a pretty basic change guys.
You'll need to add the special ability. Here's an example:
Code:
common.h
IGNORE_ROOT_AGGRO_RULES = 42,
CASTING_RESIST_DIFF = 43,
COUNTER_AVOID_DAMAGE = 44,
PROX_AGGRO = 45,
ALWAYS_AGGRO = 46, <-----
MAX_SPECIAL_ATTACK = 47
Then, just add it in where it fits your goal. Such as:
Code:
aggro.cpp
Mob::CheckWillAggro
...
if (RuleB(Aggro, UseLevelAggro) && ((
( GetLevel() >= 18 )
||(GetBodyType() == BT_Undead)
||( mob->IsClient() && mob->CastToClient()->IsSitting() )
||( mob->GetLevelCon(GetLevel()) != CON_GREEN )
||( GetSpecialAbility(ALWAYS_AGGRO) ))
After that, add the special ability to the NPC's that you desire. Voilą.
That function is so abhorrent it deserves an award.
__________________
"The true sign of intelligence is not knowledge but imagination."
|
![Old](/forums/images/Darkness/statusicon/post_old.gif)
04-13-2017, 02:37 AM
|
![The_Beast's Avatar](image.php?s=361bba3e62bb2b74f4b5aabf1f3dc606&u=230422&dateline=1516595651) |
Discordant
|
|
Join Date: May 2016
Location: Under a rock
Posts: 290
|
|
How does this current rule fit into that ? Because I'm ok, with it so far.
Code:
RULE_BOOL(Aggro, UseLevelAggro, true) // Level 18+ and Undead will aggro regardless of level difference. (this will disable Rule:IntAggroThreshold if set to true)
|
![Old](/forums/images/Darkness/statusicon/post_old.gif)
04-13-2017, 07:47 AM
|
Fire Beetle
|
|
Join Date: Aug 2012
Posts: 20
|
|
you would have to have pretty low intelligence to attack a a lvl 50 at lvl 5. maybe that's the reasoning? =p
|
![](/forums/images/Darkness/misc/a4.gif) |
|
![](/forums/images/Darkness/misc/a6.gif) |
![Old](/forums/images/Darkness/statusicon/post_old.gif)
04-13-2017, 10:18 PM
|
![ChaosSlayerZ's Avatar](image.php?s=361bba3e62bb2b74f4b5aabf1f3dc606&u=100496&dateline=1489668896) |
Demi-God
|
|
Join Date: Mar 2009
Location: Umm
Posts: 1,492
|
|
Quote:
Originally Posted by Coenxai
This is a pretty basic change guys.
You'll need to add the special ability. Here's an example:
Code:
common.h
IGNORE_ROOT_AGGRO_RULES = 42,
CASTING_RESIST_DIFF = 43,
COUNTER_AVOID_DAMAGE = 44,
PROX_AGGRO = 45,
ALWAYS_AGGRO = 46, <-----
MAX_SPECIAL_ATTACK = 47
Then, just add it in where it fits your goal. Such as:
Code:
aggro.cpp
Mob::CheckWillAggro
...
if (RuleB(Aggro, UseLevelAggro) && ((
( GetLevel() >= 18 )
||(GetBodyType() == BT_Undead)
||( mob->IsClient() && mob->CastToClient()->IsSitting() )
||( mob->GetLevelCon(GetLevel()) != CON_GREEN )
||( GetSpecialAbility(ALWAYS_AGGRO) ))
After that, add the special ability to the NPC's that you desire. Voilą.
That function is so abhorrent it deserves an award.
|
Thank You Coenxai!
Would be great our devs would add this to the official source!
BTW the mob doesn't necessarily needs to be Undead ![Wink](http://www.eqemulator.net/forums/images/smilies/icon_wink.gif)
It can be any type of mob that's needs to be always aggro ![Wink](http://www.eqemulator.net/forums/images/smilies/icon_wink.gif)
|
![](/forums/images/Darkness/misc/a1.gif) |
|
![](/forums/images/Darkness/misc/a3.gif) |
![Old](/forums/images/Darkness/statusicon/post_old.gif)
04-13-2017, 11:04 PM
|
![Coenxai's Avatar](image.php?s=361bba3e62bb2b74f4b5aabf1f3dc606&u=207135&dateline=1423800108) |
Hill Giant
|
|
Join Date: Dec 2013
Posts: 151
|
|
Delete this post.
__________________
"The true sign of intelligence is not knowledge but imagination."
|
![Old](/forums/images/Darkness/statusicon/post_old.gif)
04-13-2017, 11:05 PM
|
![Coenxai's Avatar](image.php?s=361bba3e62bb2b74f4b5aabf1f3dc606&u=207135&dateline=1423800108) |
Hill Giant
|
|
Join Date: Dec 2013
Posts: 151
|
|
Quote:
Originally Posted by The_Beast
How does this current rule fit into that ? Because I'm ok, with it so far.
Code:
RULE_BOOL(Aggro, UseLevelAggro, true) // Level 18+ and Undead will aggro regardless of level difference. (this will disable Rule:IntAggroThreshold if set to true)
|
It will aggro regardless of BodyType with the special ability. Undead will aggro regardless of special ability.
__________________
"The true sign of intelligence is not knowledge but imagination."
|
![Old](/forums/images/Darkness/statusicon/post_old.gif)
04-14-2017, 12:11 AM
|
![ChaosSlayerZ's Avatar](image.php?s=361bba3e62bb2b74f4b5aabf1f3dc606&u=100496&dateline=1489668896) |
Demi-God
|
|
Join Date: Mar 2009
Location: Umm
Posts: 1,492
|
|
Quote:
Originally Posted by Coenxai
It will aggro regardless of BodyType with the special ability. Undead will aggro regardless of special ability.
|
actually it would be better if Undead don't always aggro automatically - because you may want undead that don't aggro. (not all undead on live were always aggro - there was a number of undead in various places/levels that obeyed level difference green status)
So its better to have all mobs without default rules, and then apply the "always aggro" flag where actually needed.
|
![](/forums/images/Darkness/misc/a4.gif) |
|
![](/forums/images/Darkness/misc/a6.gif) |
![Old](/forums/images/Darkness/statusicon/post_old.gif)
04-14-2017, 12:17 AM
|
![Coenxai's Avatar](image.php?s=361bba3e62bb2b74f4b5aabf1f3dc606&u=207135&dateline=1423800108) |
Hill Giant
|
|
Join Date: Dec 2013
Posts: 151
|
|
Quote:
Originally Posted by ChaosSlayerZ
actually it would be better if Undead don't always aggro automatically - because you may want undead that don't aggro. (not all undead on live were always aggro - there was a number of undead in various places/levels that obeyed level difference green status)
So its better to have all mobs without default rules, and then apply the "always aggro" flag where actually needed.
|
You can have a mob of type BT_Undead that doesn't aggro. This purely relates to FACTION_THREATENLY && FACTION_SCOWLS.
I'm going to post slightly more readable aggro code.
I didn't test this properly but it should work.
Code:
aggro.cpp
bool Mob::CheckWillAggro(Mob *mob) {
if(!mob)
return false;
if (mob->IsClient()) {
if (!mob->CastToClient()->ClientFinishedLoading() || mob->CastToClient()->IsHoveringForRespawn() || mob->CastToClient()->zoning || !mob->CastToClient()->Connected()
|| mob->CastToClient()->GetGM() || mob->CastToClient()->IsLD() || mob->CastToClient()->IsBecomeNPC() || mob->IsInvisible(this))
return false;
}
Mob *ownr = mob->GetOwner();
if (ownr && ownr->IsClient() && !ownr->CastToClient()->ClientFinishedLoading() || mob == ownr)
return false;
// Don't aggro new clients if we are already engaged unless PROX_AGGRO is set. WHY ARE WE CHECKING COMBAT AND AGGRO RANGE? THIS SHOULD BE COMBINED.
if (IsEngaged() && !GetSpecialAbility(PROX_AGGRO) || GetSpecialAbility(PROX_AGGRO) && !CombatRange(mob)) {
Log(Logs::Moderate, Logs::Aggro, "%s is in combat, and does not have prox_aggro, or does and is out of combat range with %s", GetName(), mob->GetName());
return false;
}
float AggroRange, t1, t2, t3;
AggroRange = GetAggroRange();
t1 = mob->GetX() - GetX();
t2 = mob->GetY() - GetY();
t3 = mob->GetZ() - GetZ();
if (t1 < 0)
t1 = 0 - t1;
if (t2 < 0)
t2 = 0 - t2;
if (t3 < 0)
t3 = 0 - t3;
if ((t1 > AggroRange) || (t2 > AggroRange) || (t3 > AggroRange))
return false;
float dist2 = DistanceSquared(mob->GetPosition(), m_Position);
float AggroRange2 = AggroRange*AggroRange;
if (dist2 > AggroRange2)
return false;
FACTION_VALUE fv = mob->GetReverseFactionCon(this);
uint8 MyLevel = GetLevel();
int heroicCHA_mod = mob->itembonuses.HeroicCHA/25; // 800 Heroic CHA cap
if(heroicCHA_mod > THREATENLY_ARRGO_CHANCE)
heroicCHA_mod = THREATENLY_ARRGO_CHANCE;
if (MyLevel >= RuleI(Aggro, LevelAggro) || (GetBodyType() == BT_Undead && MyLevel >= RuleI(Aggro, UndeadLevelAggro)) || GetINT() <= RuleI(Aggro, IntAggroThreshold)
|| mob->IsClient() && mob->CastToClient()->IsSitting() || GetSpecialAbility(ALWAYS_AGGRO) || mob->GetLevelCon(GetLevel()) != CON_GREEN) {
if (fv == FACTION_SCOWLS || fv == FACTION_THREATENLY && zone->random.Roll(THREATENLY_ARRGO_CHANCE - heroicCHA_mod)
|| (mob->GetPrimaryFaction() != GetPrimaryFaction() && mob->GetPrimaryFaction() == -4 && GetOwner() == nullptr)) {
if (CheckLosFN(mob)) {
Log(Logs::Detail, Logs::Aggro, "Check aggro for %s target %s.", GetName(), mob->GetName());
return(mod_will_aggro(mob, this));
}
}
}
Log(Logs::Detail, Logs::Aggro, "InZone: %d | Dist^2: %f | Range^2: %f | Faction: %d | Con: %d | Int: %d | MyLevel: %d", mob->InZone(), dist2, AggroRange2, fv, GetINT(), GetLevelCon(mob->GetLevel()), MyLevel);
return false;
}
Code:
ruletypes.h
RULE_CATEGORY(Aggro)
RULE_BOOL(Aggro, SmartAggroList, true)
RULE_INT(Aggro, SittingAggroMod, 35) //35%
RULE_INT(Aggro, MeleeRangeAggroMod, 10) //10%
RULE_INT(Aggro, CurrentTargetAggroMod, 0) //0% -- will prefer our current target to any other; makes it harder for our npcs to switch targets.
RULE_INT(Aggro, CriticallyWoundedAggroMod, 100) //100%
RULE_INT(Aggro, SpellAggroMod, 100)
RULE_INT(Aggro, SongAggroMod, 33)
RULE_INT(Aggro, PetSpellAggroMod, 10)
RULE_REAL(Aggro, TunnelVisionAggroMod, 0.75) //people not currently the top hate generate this much hate on a Tunnel Vision mob
RULE_INT(Aggro, MaxScalingProcAggro, 400) // Set to -1 for no limit. Maxmimum amount of aggro that HP scaling SPA effect in a proc will add.
RULE_INT(Aggro, IntAggroThreshold, 75) // Int <= this will aggro regardless of level difference.
RULE_BOOL(Aggro, AllowTickPulling, false) // tick pulling is an exploit in an NPC's call for help fixed sometime in 2006 on live
RULE_BOOL(Aggro, UseLevelAggro, true)
RULE_INT(Aggro, LevelAggro, 18)
RULE_INT(Aggro, UndeadLevelAggro, 6)
RULE_INT(Aggro, ClientAggroCheckInterval, 6) // Interval in which clients actually check for aggro - in seconds
RULE_CATEGORY_END()
Code:
common.h
...
COUNTER_AVOID_DAMAGE = 44,
PROX_AGGRO = 45,
ALWAYS_AGGRO = 46, <---
MAX_SPECIAL_ATTACK = 47
__________________
"The true sign of intelligence is not knowledge but imagination."
|
![](/forums/images/Darkness/misc/a1.gif) |
|
![](/forums/images/Darkness/misc/a3.gif) |
![Old](/forums/images/Darkness/statusicon/post_old.gif)
04-14-2017, 12:31 AM
|
![ChaosSlayerZ's Avatar](image.php?s=361bba3e62bb2b74f4b5aabf1f3dc606&u=100496&dateline=1489668896) |
Demi-God
|
|
Join Date: Mar 2009
Location: Umm
Posts: 1,492
|
|
I am not exactly sure what BT_Undead is? and how its different from just Undead?
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
All times are GMT -4. The time now is 06:39 PM.
|
|
![](/forums/images/Darkness/misc/s1.jpg) |
|
![](/forums/images/Darkness/misc/s1-1.jpg) |
|
|
|
![](/forums/images/Darkness/misc/z1.jpg) |
|
![](/forums/images/Darkness/misc/z1-1.jpg) |
|
![](/forums/images/Darkness/misc/side3.jpg) |