aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp20
-rw-r--r--src/server/game/Entities/Creature/Creature.h1
-rw-r--r--src/server/game/World/World.cpp19
-rw-r--r--src/server/game/World/World.h2
-rw-r--r--src/server/worldserver/worldserver.conf.dist15
5 files changed, 57 insertions, 0 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index e34d570e73f..1945c0608ea 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -1433,9 +1433,29 @@ bool Creature::CanStartAttack(Unit const* who, bool force) const
if (!CanCreatureAttack(who, force))
return false;
+ // No aggro from gray creatures
+ if (CheckNoGrayAggroConfig(who->getLevelForTarget(this), getLevelForTarget(who)))
+ return false;
+
return IsWithinLOSInMap(who);
}
+
+bool Creature::CheckNoGrayAggroConfig(uint32 playerLevel, uint32 creatureLevel) const
+{
+ if (Trinity::XP::GetColorCode(playerLevel, creatureLevel) != XP_GRAY)
+ return false;
+
+ uint32 notAbove = sWorld->getIntConfig(CONFIG_NO_GRAY_AGGRO_ABOVE);
+ uint32 notBelow = sWorld->getIntConfig(CONFIG_NO_GRAY_AGGRO_BELOW);
+ if (notAbove == 0 && notBelow == 0)
+ return false;
+
+ if (playerLevel <= notBelow || (playerLevel >= notAbove && notAbove > 0))
+ return true;
+ return false;
+}
+
float Creature::GetAttackDistance(Unit const* player) const
{
float aggroRate = sWorld->getRate(RATE_CREATURE_AGGRO);
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h
index 842624e0c01..a3230dd98ba 100644
--- a/src/server/game/Entities/Creature/Creature.h
+++ b/src/server/game/Entities/Creature/Creature.h
@@ -766,6 +766,7 @@ class Creature : public Unit, public GridObject<Creature>, public MapObject
private:
void ForcedDespawn(uint32 timeMSToDespawn = 0);
+ bool CheckNoGrayAggroConfig(uint32 playerLevel, uint32 creatureLevel) const; // No aggro from gray creatures
//WaypointMovementGenerator vars
uint32 m_waypointID;
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 3b110b77723..fe3c4b76167 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1189,6 +1189,25 @@ void World::LoadConfigSettings(bool reload)
m_int_configs[CONFIG_CHARDELETE_HEROIC_MIN_LEVEL] = sConfigMgr->GetIntDefault("CharDelete.Heroic.MinLevel", 0);
m_int_configs[CONFIG_CHARDELETE_KEEP_DAYS] = sConfigMgr->GetIntDefault("CharDelete.KeepDays", 30);
+ // No aggro from gray mobs
+ m_int_configs[CONFIG_NO_GRAY_AGGRO_ABOVE] = sConfigMgr->GetIntDefault("NoGrayAggro.Above", 0);
+ m_int_configs[CONFIG_NO_GRAY_AGGRO_BELOW] = sConfigMgr->GetIntDefault("NoGrayAggro.Below", 0);
+ if (m_int_configs[CONFIG_NO_GRAY_AGGRO_ABOVE] > m_int_configs[CONFIG_MAX_PLAYER_LEVEL])
+ {
+ TC_LOG_ERROR("server.loading", "NoGrayAggro.Above (%i) must be in range 0..%u. Set to %u.", m_int_configs[CONFIG_NO_GRAY_AGGRO_ABOVE], m_int_configs[CONFIG_MAX_PLAYER_LEVEL], m_int_configs[CONFIG_MAX_PLAYER_LEVEL]);
+ m_int_configs[CONFIG_NO_GRAY_AGGRO_ABOVE] = m_int_configs[CONFIG_MAX_PLAYER_LEVEL];
+ }
+ if (m_int_configs[CONFIG_NO_GRAY_AGGRO_BELOW] > m_int_configs[CONFIG_MAX_PLAYER_LEVEL])
+ {
+ TC_LOG_ERROR("server.loading", "NoGrayAggro.Below (%i) must be in range 0..%u. Set to %u.", m_int_configs[CONFIG_NO_GRAY_AGGRO_BELOW], m_int_configs[CONFIG_MAX_PLAYER_LEVEL], m_int_configs[CONFIG_MAX_PLAYER_LEVEL]);
+ m_int_configs[CONFIG_NO_GRAY_AGGRO_BELOW] = m_int_configs[CONFIG_MAX_PLAYER_LEVEL];
+ }
+ if (m_int_configs[CONFIG_NO_GRAY_AGGRO_ABOVE] > 0 && m_int_configs[CONFIG_NO_GRAY_AGGRO_ABOVE] < m_int_configs[CONFIG_NO_GRAY_AGGRO_BELOW])
+ {
+ TC_LOG_ERROR("server.loading", "NoGrayAggro.Below (%i) cannot be greater than NoGrayAggro.Above (%i). Set to %i.", m_int_configs[CONFIG_NO_GRAY_AGGRO_BELOW], m_int_configs[CONFIG_NO_GRAY_AGGRO_ABOVE], m_int_configs[CONFIG_NO_GRAY_AGGRO_ABOVE]);
+ m_int_configs[CONFIG_NO_GRAY_AGGRO_BELOW] = m_int_configs[CONFIG_NO_GRAY_AGGRO_ABOVE];
+ }
+
///- Read the "Data" directory from the config file
std::string dataPath = sConfigMgr->GetStringDefault("DataDir", "./");
if (dataPath.empty() || (dataPath.at(dataPath.length()-1) != '/' && dataPath.at(dataPath.length()-1) != '\\'))
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index ac7193e4267..2526516d778 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -369,6 +369,8 @@ enum WorldIntConfigs
CONFIG_CHARTER_COST_ARENA_2v2,
CONFIG_CHARTER_COST_ARENA_3v3,
CONFIG_CHARTER_COST_ARENA_5v5,
+ CONFIG_NO_GRAY_AGGRO_ABOVE,
+ CONFIG_NO_GRAY_AGGRO_BELOW,
INT_CONFIG_VALUE_COUNT
};
diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
index 6c0820f99be..9cb25475ecf 100644
--- a/src/server/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
@@ -2701,6 +2701,21 @@ Calculate.Creature.Zone.Area.Data = 0
Calculate.Gameoject.Zone.Area.Data = 0
#
+# NoGrayAggro
+# Description: Gray mobs will not aggro players above/below some levels
+# NoGrayAggro.Above: If player is at this level or above, gray mobs will not attack
+# NoGrayAggro.Below: If player is at this level or below, gray mobs will not attack
+# Example: You can for example make players free from gray until they reach level 30.
+# Then gray will start to attack them, until they reach max level (80 for example):
+# NoGrayAggro.Above = 80
+# NoGrayAggro.Below = 29
+# Default: 0 - (Blizzlike)
+#
+
+NoGrayAggro.Above = 0
+NoGrayAggro.Below = 0
+
+#
###################################################################################################
###################################################################################################