diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 20 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/Creature.h | 1 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 19 | ||||
-rw-r--r-- | src/server/game/World/World.h | 2 | ||||
-rw-r--r-- | src/server/worldserver/worldserver.conf.dist | 15 |
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 + +# ################################################################################################### ################################################################################################### |