From 2ae84e2faf6b3884ce949299c1914e2d3e438a9d Mon Sep 17 00:00:00 2001 From: Chero Date: Thu, 27 May 2021 13:42:48 +0200 Subject: [PATCH] fix(Core/Creature): Creatures will periodically call for assistance. (#5065) --- .../game/Entities/Creature/Creature.cpp | 35 ++++++++++++++++++- src/server/game/Entities/Creature/Creature.h | 6 ++++ src/server/game/Entities/Unit/Unit.cpp | 3 ++ src/server/game/World/IWorld.h | 1 + src/server/game/World/World.cpp | 3 +- src/server/worldserver/worldserver.conf.dist | 12 +++++-- 6 files changed, 56 insertions(+), 4 deletions(-) diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 6673e5e5d..ce7ff3e12 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -169,7 +169,7 @@ Creature::Creature(bool isWorldObject): Unit(isWorldObject), MovableMapObject(), m_spawnId(0), m_equipmentId(0), m_originalEquipmentId(0), m_originalAnimTier(UNIT_BYTE1_FLAG_GROUND), m_AlreadyCallAssistance(false), m_AlreadySearchedAssistance(false), m_regenHealth(true), m_AI_locked(false), m_meleeDamageSchoolMask(SPELL_SCHOOL_MASK_NORMAL), m_originalEntry(0), m_moveInLineOfSightDisabled(false), m_moveInLineOfSightStrictlyDisabled(false), m_homePosition(), m_transportHomePosition(), m_creatureInfo(nullptr), m_creatureData(nullptr), m_waypointID(0), m_path_id(0), m_formation(nullptr), _lastDamagedTime(nullptr), m_cannotReachTarget(false), m_cannotReachTimer(0), - _isMissingSwimmingFlagOutOfCombat(false) + _isMissingSwimmingFlagOutOfCombat(false), m_assistanceTimer(0) { m_regenTimer = CREATURE_REGEN_INTERVAL; m_valuesCount = UNIT_END; @@ -656,6 +656,24 @@ void Creature::Update(uint32 diff) } } + // Call for assistance if not disabled + if (m_assistanceTimer) + { + if (m_assistanceTimer <= diff) + { + if (CanPeriodicallyCallForAssistance()) + { + SetNoCallAssistance(false); + CallAssistance(); + } + m_assistanceTimer = sWorld->getIntConfig(CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD); + } + else + { + m_assistanceTimer -= diff; + } + } + if (!IsInEvadeMode() && IsAIEnabled) { // do not allow the AI to be changed during update @@ -3237,3 +3255,18 @@ void Creature::SetLastDamagedTimePtr(std::shared_ptr const& val) { _lastDamagedTime = val; } + +bool Creature::CanPeriodicallyCallForAssistance() const +{ + if (!IsInCombat()) + return false; + + // Unable to call for assistance + if (HasUnitState(UNIT_STATE_DIED | UNIT_STATE_POSSESSED)) + return false; + + if (!CanHaveThreatList()) + return false; + + return true; +} diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 98d62de98..303c6a283 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -358,6 +358,8 @@ public: } void RefreshSwimmingFlag(bool recheck = false); + void SetAssistanceTimer(uint32 value) { m_assistanceTimer = value; } + protected: bool CreateFromProto(ObjectGuid::LowType guidlow, uint32 Entry, uint32 vehId, const CreatureData* data = nullptr); bool InitEntry(uint32 entry, const CreatureData* data = nullptr); @@ -417,6 +419,8 @@ protected: private: void ForcedDespawn(uint32 timeMSToDespawn = 0); + [[nodiscard]] bool CanPeriodicallyCallForAssistance() const; + //WaypointMovementGenerator vars uint32 m_waypointID; uint32 m_path_id; @@ -434,6 +438,8 @@ private: bool _isMissingSwimmingFlagOutOfCombat; + uint32 m_assistanceTimer; + void applyInhabitFlags(); }; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 4ca79276b..e74675ab2 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -9902,6 +9902,7 @@ bool Unit::Attack(Unit* victim, bool meleeAttack) creature->SendAIReaction(AI_REACTION_HOSTILE); creature->CallAssistance(); + creature->SetAssistanceTimer(sWorld->getIntConfig(CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD)); } // delay offhand weapon attack to next attack time @@ -13058,6 +13059,8 @@ void Unit::ClearInCombat() if (HasFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_TAPPED)) SetUInt32Value(UNIT_DYNAMIC_FLAGS, creature->GetCreatureTemplate()->dynamicflags); + creature->SetAssistanceTimer(0); + // Xinef: will be recalculated at follow movement generator initialization if (!IsPet() && !IsCharmed()) return; diff --git a/src/server/game/World/IWorld.h b/src/server/game/World/IWorld.h index 5608873eb..383d17e9e 100644 --- a/src/server/game/World/IWorld.h +++ b/src/server/game/World/IWorld.h @@ -251,6 +251,7 @@ enum WorldIntConfigs CONFIG_CHATFLOOD_MUTE_TIME, CONFIG_EVENT_ANNOUNCE, CONFIG_CREATURE_FAMILY_ASSISTANCE_DELAY, + CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD, CONFIG_CREATURE_FAMILY_FLEE_DELAY, CONFIG_WORLD_BOSS_LEVEL_DIFF, CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF, diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 705b4136b..20186e06f 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1040,7 +1040,8 @@ void World::LoadConfigSettings(bool reload) m_float_configs[CONFIG_CREATURE_FAMILY_FLEE_ASSISTANCE_RADIUS] = sConfigMgr->GetOption("CreatureFamilyFleeAssistanceRadius", 30.0f); m_float_configs[CONFIG_CREATURE_FAMILY_ASSISTANCE_RADIUS] = sConfigMgr->GetOption("CreatureFamilyAssistanceRadius", 10.0f); - m_int_configs[CONFIG_CREATURE_FAMILY_ASSISTANCE_DELAY] = sConfigMgr->GetOption("CreatureFamilyAssistanceDelay", 1500); + m_int_configs[CONFIG_CREATURE_FAMILY_ASSISTANCE_DELAY] = sConfigMgr->GetOption("CreatureFamilyAssistanceDelay", 2000); + m_int_configs[CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD] = sConfigMgr->GetOption("CreatureFamilyAssistancePeriod", 3000); m_int_configs[CONFIG_CREATURE_FAMILY_FLEE_DELAY] = sConfigMgr->GetOption("CreatureFamilyFleeDelay", 7000); m_int_configs[CONFIG_WORLD_BOSS_LEVEL_DIFF] = sConfigMgr->GetOption("WorldBossLevelDiff", 3); diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index e8681942b..4988fa3c6 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -1449,9 +1449,17 @@ CreatureFamilyAssistanceRadius = 10 # # CreatureFamilyAssistanceDelay # Description: Time (in milliseconds) before creature assistance call. -# Default: 1500 - (1.5 Seconds) +# Default: 2000 - (2 Seconds) -CreatureFamilyAssistanceDelay = 1500 +CreatureFamilyAssistanceDelay = 2000 + +# +# CreatureFamilyAssistancePeriod +# Description: Time (in milliseconds) before next creature assistance call. +# Default: 3000 - (3 Seconds) + 0 - (Disabled) + +CreatureFamilyAssistancePeriod = 3000 # # CreatureFamilyFleeDelay