|
|
|
@@ -215,13 +215,13 @@ bool TemporaryThreatModifierEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Creature::Creature(bool isWorldObject): Unit(isWorldObject), MovableMapObject(), m_groupLootTimer(0), lootingGroupLowGUID(0), m_PlayerDamageReq(0), m_lootRecipientGroup(0),
|
|
|
|
|
Creature::Creature(bool isWorldObject): Unit(isWorldObject), MovableMapObject(), m_groupLootTimer(0), lootingGroupLowGUID(0), m_lootRecipientGroup(0),
|
|
|
|
|
m_corpseRemoveTime(0), m_respawnTime(0), m_respawnDelay(300), m_corpseDelay(60), m_wanderDistance(0.0f), m_boundaryCheckTime(2500),
|
|
|
|
|
m_transportCheckTimer(1000), lootPickPocketRestoreTime(0), m_reactState(REACT_AGGRESSIVE), m_defaultMovementType(IDLE_MOTION_TYPE),
|
|
|
|
|
m_spawnId(0), m_equipmentId(0), m_originalEquipmentId(0), 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_detectionDistance(20.0f), m_waypointID(0), m_path_id(0), m_formation(nullptr), _lastDamagedTime(nullptr), m_cannotReachTimer(0),
|
|
|
|
|
_isMissingSwimmingFlagOutOfCombat(false), m_assistanceTimer(0)
|
|
|
|
|
m_homePosition(), m_transportHomePosition(), m_creatureInfo(nullptr), m_creatureData(nullptr), m_detectionDistance(20.0f), m_waypointID(0), m_path_id(0), m_formation(nullptr), _lastDamagedTime(nullptr), m_cannotReachTarget(false), m_cannotReachTimer(0),
|
|
|
|
|
_isMissingSwimmingFlagOutOfCombat(false), m_assistanceTimer(0), _playerDamageReq(0), _damagedByPlayer(false)
|
|
|
|
|
{
|
|
|
|
|
m_regenTimer = CREATURE_REGEN_INTERVAL;
|
|
|
|
|
m_valuesCount = UNIT_END;
|
|
|
|
@@ -526,7 +526,7 @@ bool Creature::UpdateEntry(uint32 Entry, const CreatureData* data, bool changele
|
|
|
|
|
|
|
|
|
|
uint32 previousHealth = GetHealth();
|
|
|
|
|
uint32 previousMaxHealth = GetMaxHealth();
|
|
|
|
|
uint32 previousPlayerDamageReq = m_PlayerDamageReq;
|
|
|
|
|
uint32 previousPlayerDamageReq = _playerDamageReq;
|
|
|
|
|
|
|
|
|
|
SelectLevel(changelevel);
|
|
|
|
|
if (previousHealth > 0)
|
|
|
|
@@ -535,11 +535,11 @@ bool Creature::UpdateEntry(uint32 Entry, const CreatureData* data, bool changele
|
|
|
|
|
|
|
|
|
|
if (previousMaxHealth && previousMaxHealth > GetMaxHealth())
|
|
|
|
|
{
|
|
|
|
|
m_PlayerDamageReq = (uint32)(previousPlayerDamageReq * GetMaxHealth() / previousMaxHealth);
|
|
|
|
|
_playerDamageReq = (uint32)(previousPlayerDamageReq * GetMaxHealth() / previousMaxHealth);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
m_PlayerDamageReq = previousPlayerDamageReq;
|
|
|
|
|
_playerDamageReq = previousPlayerDamageReq;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -1831,14 +1831,14 @@ bool Creature::CanStartAttack(Unit const* who) const
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
// This set of checks is should be done only for creatures
|
|
|
|
|
if ((HasUnitFlag(UNIT_FLAG_IMMUNE_TO_NPC) && who->GetTypeId() != TYPEID_PLAYER) || // flag is valid only for non player characters
|
|
|
|
|
(HasUnitFlag(UNIT_FLAG_IMMUNE_TO_PC) && who->GetTypeId() == TYPEID_PLAYER)) // immune to PC and target is a player, return false
|
|
|
|
|
if ((IsImmuneToNPC() && who->GetTypeId() != TYPEID_PLAYER) || // flag is valid only for non player characters
|
|
|
|
|
(IsImmuneToPC() && who->GetTypeId() == TYPEID_PLAYER)) // immune to PC and target is a player, return false
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (Unit* owner = who->GetOwner())
|
|
|
|
|
if (owner->GetTypeId() == TYPEID_PLAYER && HasUnitFlag(UNIT_FLAG_IMMUNE_TO_PC)) // immune to PC and target has player owner
|
|
|
|
|
if (owner->GetTypeId() == TYPEID_PLAYER && IsImmuneToPC()) // immune to PC and target has player owner
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
// Do not attack non-combat pets
|
|
|
|
@@ -2369,7 +2369,7 @@ bool Creature::CanAssistTo(Unit const* u, Unit const* enemy, bool checkfaction /
|
|
|
|
|
if (IsCivilian())
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_NPC))
|
|
|
|
|
if (HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE) || IsImmuneToNPC())
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
// skip fighting creature
|
|
|
|
@@ -3578,3 +3578,30 @@ void Creature::ModifyThreatPercentTemp(Unit* victim, int32 percent, Milliseconds
|
|
|
|
|
m_Events.AddEvent(pEvent, m_Events.CalculateTime(duration.count()));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool Creature::IsDamageEnoughForLootingAndReward() const
|
|
|
|
|
{
|
|
|
|
|
return (m_creatureInfo->flags_extra & CREATURE_FLAG_EXTRA_NO_PLAYER_DAMAGE_REQ) || (_playerDamageReq == 0 && _damagedByPlayer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Creature::LowerPlayerDamageReq(uint32 unDamage, bool damagedByPlayer /*= true*/)
|
|
|
|
|
{
|
|
|
|
|
if (_playerDamageReq)
|
|
|
|
|
_playerDamageReq > unDamage ? _playerDamageReq -= unDamage : _playerDamageReq = 0;
|
|
|
|
|
|
|
|
|
|
if (!_damagedByPlayer)
|
|
|
|
|
{
|
|
|
|
|
_damagedByPlayer = damagedByPlayer;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Creature::ResetPlayerDamageReq()
|
|
|
|
|
{
|
|
|
|
|
_playerDamageReq = GetHealth() / 2;
|
|
|
|
|
_damagedByPlayer = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint32 Creature::GetPlayerDamageReq() const
|
|
|
|
|
{
|
|
|
|
|
return _playerDamageReq;
|
|
|
|
|
}
|
|
|
|
|