mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
- Clean up spell facing behavior a bit. Visual target behavior should now be a lot smoother.
- Clean up Creature.cpp. NULL -> nullptr, gotta love it.
- Renamed some recently added members of Creature to match code style.
(cherry picked from commit 1cf1d4a1ea)
This commit is contained in:
@@ -56,7 +56,7 @@ TrainerSpell const* TrainerSpellData::Find(uint32 spell_id) const
|
||||
if (itr != spellList.end())
|
||||
return &itr->second;
|
||||
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool VendorItemData::RemoveItem(uint32 item_id, uint8 type)
|
||||
@@ -80,7 +80,7 @@ VendorItem const* VendorItemData::FindItemCostPair(uint32 item_id, uint32 extend
|
||||
for (VendorItemList::const_iterator i = m_items.begin(); i != m_items.end(); ++i)
|
||||
if ((*i)->item == item_id && (*i)->ExtendedCost == extendedCost && (*i)->Type == type)
|
||||
return *i;
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
uint32 CreatureTemplate::GetRandomValidModelId() const
|
||||
@@ -185,7 +185,7 @@ _pickpocketLootRestore(0), m_corpseRemoveTime(0), m_respawnTime(0),
|
||||
m_respawnDelay(300), m_corpseDelay(60), m_respawnradius(0.0f), m_boundaryCheckTime(2500), m_combatPulseTime(0), m_combatPulseDelay(0), m_reactState(REACT_AGGRESSIVE),
|
||||
m_defaultMovementType(IDLE_MOTION_TYPE), m_spawnId(UI64LIT(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_homePosition(), m_transportHomePosition(), m_creatureInfo(NULL), m_creatureData(NULL), m_waypointID(0), m_path_id(0), m_formation(NULL)
|
||||
m_originalEntry(0), m_homePosition(), m_transportHomePosition(), m_creatureInfo(nullptr), m_creatureData(nullptr), m_waypointID(0), m_path_id(0), m_formation(nullptr), m_focusSpell(nullptr), m_focusDelay(0)
|
||||
{
|
||||
m_regenTimer = CREATURE_REGEN_INTERVAL;
|
||||
m_valuesCount = UNIT_END;
|
||||
@@ -200,16 +200,14 @@ m_originalEntry(0), m_homePosition(), m_transportHomePosition(), m_creatureInfo(
|
||||
m_CombatDistance = 0;//MELEE_RANGE;
|
||||
|
||||
ResetLootMode(); // restore default loot mode
|
||||
TriggerJustRespawned = false;
|
||||
m_TriggerJustRespawned = false;
|
||||
m_isTempWorldObject = false;
|
||||
_focusSpell = NULL;
|
||||
_focusDelay = 0;
|
||||
}
|
||||
|
||||
Creature::~Creature()
|
||||
{
|
||||
delete i_AI;
|
||||
i_AI = NULL;
|
||||
i_AI = nullptr;
|
||||
|
||||
//if (m_uint32Values)
|
||||
// TC_LOG_ERROR("entities.unit", "Deconstruct Creature Entry = %u", GetEntry());
|
||||
@@ -493,9 +491,9 @@ bool Creature::UpdateEntry(uint32 entry, CreatureData const* data /*= nullptr*/)
|
||||
|
||||
void Creature::Update(uint32 diff)
|
||||
{
|
||||
if (IsAIEnabled && TriggerJustRespawned)
|
||||
if (IsAIEnabled && m_TriggerJustRespawned)
|
||||
{
|
||||
TriggerJustRespawned = false;
|
||||
m_TriggerJustRespawned = false;
|
||||
AI()->JustRespawned();
|
||||
if (m_vehicleKit)
|
||||
m_vehicleKit->Reset();
|
||||
@@ -770,7 +768,7 @@ void Creature::DoFleeToGetAssistance()
|
||||
float radius = sWorld->getFloatConfig(CONFIG_CREATURE_FAMILY_FLEE_ASSISTANCE_RADIUS);
|
||||
if (radius >0)
|
||||
{
|
||||
Creature* creature = NULL;
|
||||
Creature* creature = nullptr;
|
||||
|
||||
CellCoord p(Trinity::ComputeCellCoord(GetPositionX(), GetPositionY()));
|
||||
Cell cell(p);
|
||||
@@ -978,7 +976,7 @@ bool Creature::isCanTrainingAndResetTalentsOf(Player* player) const
|
||||
Player* Creature::GetLootRecipient() const
|
||||
{
|
||||
if (!m_lootRecipient)
|
||||
return NULL;
|
||||
return nullptr;
|
||||
|
||||
return ObjectAccessor::FindConnectedPlayer(m_lootRecipient);
|
||||
}
|
||||
@@ -986,7 +984,7 @@ Player* Creature::GetLootRecipient() const
|
||||
Group* Creature::GetLootRecipientGroup() const
|
||||
{
|
||||
if (m_lootRecipientGroup.IsEmpty())
|
||||
return NULL;
|
||||
return nullptr;
|
||||
|
||||
return sGroupMgr->GetGroupByGUID(m_lootRecipientGroup);
|
||||
}
|
||||
@@ -995,7 +993,7 @@ void Creature::SetLootRecipient(Unit* unit)
|
||||
{
|
||||
// set the player whose group should receive the right
|
||||
// to loot the creature after it dies
|
||||
// should be set to NULL after the loot disappears
|
||||
// should be set to nullptr after the loot disappears
|
||||
|
||||
if (!unit)
|
||||
{
|
||||
@@ -1635,7 +1633,7 @@ void Creature::setDeathState(DeathState s)
|
||||
if (sWorld->getBoolConfig(CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY) || isWorldBoss())
|
||||
SaveRespawnTime();
|
||||
|
||||
ReleaseFocus(); // remove spellcast focus (this also clears unit target)
|
||||
ReleaseFocus(nullptr, false); // remove spellcast focus
|
||||
SetTarget(ObjectGuid::Empty); // drop target - dead mobs shouldn't ever target things
|
||||
|
||||
SetUInt64Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE);
|
||||
@@ -1664,7 +1662,7 @@ void Creature::setDeathState(DeathState s)
|
||||
//if (IsPet())
|
||||
// setActive(true);
|
||||
SetFullHealth();
|
||||
SetLootRecipient(NULL);
|
||||
SetLootRecipient(nullptr);
|
||||
ResetPlayerDamageReq();
|
||||
|
||||
UpdateMovementFlags();
|
||||
@@ -1742,7 +1740,7 @@ void Creature::Respawn(bool force)
|
||||
{
|
||||
//reset the AI to be sure no dirty or uninitialized values will be used till next tick
|
||||
AI()->Reset();
|
||||
TriggerJustRespawned = true;//delay event to next tick so all creatures are created on the map before processing
|
||||
m_TriggerJustRespawned = true;//delay event to next tick so all creatures are created on the map before processing
|
||||
}
|
||||
|
||||
uint32 poolid = GetSpawnId() ? sPoolMgr->IsPartOfAPool<Creature>(GetSpawnId()) : 0;
|
||||
@@ -1842,7 +1840,7 @@ bool Creature::isWorldBoss() const
|
||||
SpellInfo const* Creature::reachWithSpellAttack(Unit* victim)
|
||||
{
|
||||
if (!victim)
|
||||
return NULL;
|
||||
return nullptr;
|
||||
|
||||
for (uint32 i=0; i < CREATURE_MAX_SPELLS; ++i)
|
||||
{
|
||||
@@ -1888,13 +1886,13 @@ SpellInfo const* Creature::reachWithSpellAttack(Unit* victim)
|
||||
continue;
|
||||
return spellInfo;
|
||||
}
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
SpellInfo const* Creature::reachWithSpellCure(Unit* victim)
|
||||
{
|
||||
if (!victim)
|
||||
return NULL;
|
||||
return nullptr;
|
||||
|
||||
for (uint32 i=0; i < CREATURE_MAX_SPELLS; ++i)
|
||||
{
|
||||
@@ -1938,7 +1936,7 @@ SpellInfo const* Creature::reachWithSpellCure(Unit* victim)
|
||||
continue;
|
||||
return spellInfo;
|
||||
}
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// select nearest hostile unit within the given distance (regardless of threat list).
|
||||
@@ -1948,7 +1946,7 @@ Unit* Creature::SelectNearestTarget(float dist, bool playerOnly /* = false */) c
|
||||
Cell cell(p);
|
||||
cell.SetNoCreate();
|
||||
|
||||
Unit* target = NULL;
|
||||
Unit* target = nullptr;
|
||||
|
||||
{
|
||||
if (dist == 0.0f)
|
||||
@@ -1974,7 +1972,7 @@ Unit* Creature::SelectNearestTargetInAttackDistance(float dist) const
|
||||
Cell cell(p);
|
||||
cell.SetNoCreate();
|
||||
|
||||
Unit* target = NULL;
|
||||
Unit* target = nullptr;
|
||||
|
||||
if (dist > MAX_VISIBILITY_DISTANCE)
|
||||
{
|
||||
@@ -1998,7 +1996,7 @@ Unit* Creature::SelectNearestTargetInAttackDistance(float dist) const
|
||||
|
||||
Player* Creature::SelectNearestPlayer(float distance) const
|
||||
{
|
||||
Player* target = NULL;
|
||||
Player* target = nullptr;
|
||||
|
||||
Trinity::NearestPlayerInObjectRangeCheck checker(this, distance);
|
||||
Trinity::PlayerLastSearcher<Trinity::NearestPlayerInObjectRangeCheck> searcher(this, target, checker);
|
||||
@@ -2294,7 +2292,7 @@ void Creature::SendZoneUnderAttackMessage(Player* attacker)
|
||||
uint32 enemy_team = attacker->GetTeam();
|
||||
WorldPackets::Misc::ZoneUnderAttack packet;
|
||||
packet.AreaID = GetAreaId();
|
||||
sWorld->SendGlobalMessage(packet.Write(), NULL, (enemy_team == ALLIANCE ? HORDE : ALLIANCE));
|
||||
sWorld->SendGlobalMessage(packet.Write(), nullptr, (enemy_team == ALLIANCE ? HORDE : ALLIANCE));
|
||||
}
|
||||
|
||||
void Creature::SetInCombatWithZone()
|
||||
@@ -2682,13 +2680,13 @@ void Creature::SetTarget(ObjectGuid const& guid)
|
||||
bool Creature::FocusTarget(Spell const* focusSpell, WorldObject const* target)
|
||||
{
|
||||
// already focused
|
||||
if (_focusSpell)
|
||||
if (m_focusSpell)
|
||||
return false;
|
||||
|
||||
if ((!target || target == this) && !focusSpell->GetCastTime()) // instant cast, untargeted (or self-targeted) spell doesn't need any facing updates
|
||||
return false;
|
||||
|
||||
_focusSpell = focusSpell;
|
||||
m_focusSpell = focusSpell;
|
||||
|
||||
// "instant" creature casts that require re-targeting will be delayed by a short moment to prevent facing bugs
|
||||
bool shouldDelay = false;
|
||||
@@ -2724,15 +2722,9 @@ bool Creature::FocusTarget(Spell const* focusSpell, WorldObject const* target)
|
||||
}
|
||||
if (shouldDelay)
|
||||
shouldDelay = !(focusSpell->IsTriggered() || focusSpell->GetCastTime() || focusSpell->GetSpellInfo()->IsChanneled());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// tell the creature that it should reacquire its current target after the cast is done (this is handled in ::Attack)
|
||||
// player pets don't need to do this, as they automatically reacquire their target on focus release
|
||||
if (!IsPet())
|
||||
MustReacquireTarget();
|
||||
|
||||
bool canTurnDuringCast = !focusSpell->GetSpellInfo()->HasAttribute(SPELL_ATTR5_DONT_TURN_DURING_CAST);
|
||||
// Face the target - we need to do this before the unit state is modified for no-turn spells
|
||||
if (target)
|
||||
@@ -2755,16 +2747,16 @@ bool Creature::IsFocusing(Spell const* focusSpell, bool withDelay)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (focusSpell && (focusSpell != _focusSpell))
|
||||
if (focusSpell && (focusSpell != m_focusSpell))
|
||||
return false;
|
||||
|
||||
if (!_focusSpell)
|
||||
if (!m_focusSpell)
|
||||
{
|
||||
if (!withDelay || !_focusDelay)
|
||||
if (!withDelay || !m_focusDelay)
|
||||
return false;
|
||||
if (GetMSTimeDiffToNow(_focusDelay) > 1000) // @todo figure out if we can get rid of this magic number somehow
|
||||
if (GetMSTimeDiffToNow(m_focusDelay) > 1000) // @todo figure out if we can get rid of this magic number somehow
|
||||
{
|
||||
_focusDelay = 0; // save checks in the future
|
||||
m_focusDelay = 0; // save checks in the future
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -2774,23 +2766,25 @@ bool Creature::IsFocusing(Spell const* focusSpell, bool withDelay)
|
||||
|
||||
void Creature::ReleaseFocus(Spell const* focusSpell, bool withDelay)
|
||||
{
|
||||
if (!_focusSpell)
|
||||
if (!m_focusSpell)
|
||||
return;
|
||||
|
||||
// focused to something else
|
||||
if (focusSpell && focusSpell != _focusSpell)
|
||||
if (focusSpell && focusSpell != m_focusSpell)
|
||||
return;
|
||||
|
||||
if (IsPet() && GetVictim()) // player pets do not use delay system
|
||||
SetGuidValue(UNIT_FIELD_TARGET, EnsureVictim()->GetGUID());
|
||||
if (IsPet()) // player pets do not use delay system
|
||||
SetGuidValue(UNIT_FIELD_TARGET, GetVictim() ? EnsureVictim()->GetGUID() : ObjectGuid::Empty);
|
||||
else
|
||||
SetGuidValue(UNIT_FIELD_TARGET, ObjectGuid::Empty);
|
||||
// tell the creature that it should reacquire its actual target after the delay expires (this is handled in ::Attack)
|
||||
// player pets don't need to do this, as they automatically reacquire their target on focus release
|
||||
MustReacquireTarget();
|
||||
|
||||
if (_focusSpell->GetSpellInfo()->HasAttribute(SPELL_ATTR5_DONT_TURN_DURING_CAST))
|
||||
if (m_focusSpell->GetSpellInfo()->HasAttribute(SPELL_ATTR5_DONT_TURN_DURING_CAST))
|
||||
ClearUnitState(UNIT_STATE_CANNOT_TURN);
|
||||
|
||||
_focusSpell = nullptr;
|
||||
_focusDelay = (!IsPet() && withDelay) ? getMSTime() : 0; // don't allow re-target right away to prevent visual bugs
|
||||
m_focusSpell = nullptr;
|
||||
m_focusDelay = (!IsPet() && withDelay) ? getMSTime() : 0; // don't allow re-target right away to prevent visual bugs
|
||||
}
|
||||
|
||||
void Creature::StartPickPocketRefillTimer()
|
||||
|
||||
@@ -779,10 +779,10 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma
|
||||
|
||||
//Formation var
|
||||
CreatureGroup* m_formation;
|
||||
bool TriggerJustRespawned;
|
||||
bool m_TriggerJustRespawned;
|
||||
|
||||
Spell const* _focusSpell; ///> Locks the target during spell cast for proper facing
|
||||
uint32 _focusDelay;
|
||||
Spell const* m_focusSpell; ///> Locks the target during spell cast for proper facing
|
||||
uint32 m_focusDelay;
|
||||
|
||||
CreatureTextRepeatGroup m_textRepeat;
|
||||
};
|
||||
|
||||
@@ -1370,7 +1370,7 @@ class TC_GAME_API Unit : public WorldObject
|
||||
void _removeAttacker(Unit* pAttacker); // must be called only from Unit::AttackStop()
|
||||
Unit* getAttackerForHelper() const; // If someone wants to help, who to give them
|
||||
bool Attack(Unit* victim, bool meleeAttack);
|
||||
void MustReacquireTarget() { m_shouldReacquireTarget = true; } // flags the Unit for forced target reacquisition in the next ::Attack call
|
||||
void MustReacquireTarget() { m_shouldReacquireTarget = true; } // flags the Unit for forced (client displayed) target reacquisition in the next ::Attack call
|
||||
void CastStop(uint32 except_spellid = 0);
|
||||
bool AttackStop();
|
||||
void RemoveAllAttackers();
|
||||
|
||||
Reference in New Issue
Block a user