diff options
author | Meji <alvaro.megias@outlook.com> | 2023-03-30 18:54:27 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-30 18:54:27 +0200 |
commit | 81ea6f54d93ee10b03e6432c6071e0d0983796a2 (patch) | |
tree | 8e94c4d807ee69c2a3800f8cd9c360c460952a24 | |
parent | 229a7ac79d38b9db76387f92e846c04c151ad3aa (diff) |
Core/Creatures: Compute CombatReach and BoundingRadius using DisplayScale (#28863)
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 24 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/Creature.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Object/ObjectDefines.h | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Pet/Pet.cpp | 7 | ||||
-rw-r--r-- | src/server/game/Entities/Pet/Pet.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 25 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 8 | ||||
-rw-r--r-- | src/server/game/Events/GameEventMgr.cpp | 16 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_modify.cpp | 11 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_npc.cpp | 3 | ||||
-rw-r--r-- | src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp | 2 |
13 files changed, 47 insertions, 59 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 2d8ebcc7783..aae2db1fab3 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -414,7 +414,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (CreatureTemplate const* ci = sObjectMgr->GetCreatureTemplate(e.action.morphOrMount.creature)) { CreatureModel const* model = ObjectMgr::ChooseDisplayId(ci); - target->ToCreature()->SetDisplayId(model->CreatureDisplayID, model->DisplayScale); + target->ToCreature()->SetDisplayId(model->CreatureDisplayID); TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_MORPH_TO_ENTRY_OR_MODEL: Creature {} set displayid to {}", target->GetGUID().ToString(), model->CreatureDisplayID); } diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 67bdf7a915e..10265627b55 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -536,8 +536,7 @@ bool Creature::InitEntry(uint32 entry, CreatureData const* data /*= nullptr*/) return false; } - SetDisplayId(model.CreatureDisplayID, model.DisplayScale); - SetNativeDisplayId(model.CreatureDisplayID, model.DisplayScale); + SetDisplayId(model.CreatureDisplayID, true); // Load creature equipment if (!data) @@ -2247,10 +2246,7 @@ void Creature::Respawn(bool force) CreatureModel display(GetNativeDisplayId(), GetNativeDisplayScale(), 1.0f); if (sObjectMgr->GetCreatureModelRandomGender(&display, GetCreatureTemplate())) - { - SetDisplayId(display.CreatureDisplayID, display.DisplayScale); - SetNativeDisplayId(display.CreatureDisplayID, display.DisplayScale); - } + SetDisplayId(display.CreatureDisplayID, true); GetMotionMaster()->InitializeDefault(); @@ -3251,26 +3247,26 @@ void Creature::SetObjectScale(float scale) if (CreatureModelInfo const* minfo = sObjectMgr->GetCreatureModelInfo(GetDisplayId())) { - SetBoundingRadius((IsPet() ? 1.0f : minfo->bounding_radius) * scale); - SetCombatReach((IsPet() ? DEFAULT_PLAYER_COMBAT_REACH : minfo->combat_reach) * scale); + SetBoundingRadius((IsPet() ? 1.0f : minfo->bounding_radius) * scale * GetDisplayScale()); + SetCombatReach((IsPet() ? DEFAULT_PLAYER_COMBAT_REACH : minfo->combat_reach) * scale * GetDisplayScale()); } } -void Creature::SetDisplayId(uint32 modelId, float displayScale /*= 1.f*/) +void Creature::SetDisplayId(uint32 displayId, bool setNative /*= false*/) { - Unit::SetDisplayId(modelId, displayScale); + Unit::SetDisplayId(displayId, setNative); - if (CreatureModelInfo const* minfo = sObjectMgr->GetCreatureModelInfo(modelId)) + if (CreatureModelInfo const* modelInfo = sObjectMgr->GetCreatureModelInfo(displayId)) { - SetBoundingRadius((IsPet() ? 1.0f : minfo->bounding_radius) * GetObjectScale()); - SetCombatReach((IsPet() ? DEFAULT_PLAYER_COMBAT_REACH : minfo->combat_reach) * GetObjectScale()); + SetBoundingRadius((IsPet() ? 1.0f : modelInfo->bounding_radius) * GetObjectScale() * GetDisplayScale()); + SetCombatReach((IsPet() ? DEFAULT_PLAYER_COMBAT_REACH : modelInfo->combat_reach) * GetObjectScale() * GetDisplayScale()); } } void Creature::SetDisplayFromModel(uint32 modelIdx) { if (CreatureModel const* model = GetCreatureTemplate()->GetModelByIdx(modelIdx)) - SetDisplayId(model->CreatureDisplayID, model->DisplayScale); + SetDisplayId(model->CreatureDisplayID); } void Creature::SetTarget(ObjectGuid const& guid) diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index f086743b079..c5ea0be20e9 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -77,7 +77,7 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma float GetNativeObjectScale() const override; void SetObjectScale(float scale) override; - void SetDisplayId(uint32 displayId, float displayScale = 1.f) override; + void SetDisplayId(uint32 displayId, bool setNative = false) override; void SetDisplayFromModel(uint32 modelIdx); void DisappearAndDie() { ForcedDespawn(0); } diff --git a/src/server/game/Entities/Object/ObjectDefines.h b/src/server/game/Entities/Object/ObjectDefines.h index ec2a9d22ff3..b34767faa51 100644 --- a/src/server/game/Entities/Object/ObjectDefines.h +++ b/src/server/game/Entities/Object/ObjectDefines.h @@ -38,6 +38,7 @@ #define DEFAULT_PLAYER_BOUNDING_RADIUS 0.388999998569489f // player size, also currently used (correctly?) for any non Unit world objects #define DEFAULT_PLAYER_COMBAT_REACH 1.5f +#define DEFAULT_PLAYER_DISPLAY_SCALE 1.0f #define MIN_MELEE_REACH 2.0f #define NOMINAL_MELEE_RANGE 5.0f #define MELEE_RANGE (NOMINAL_MELEE_RANGE - MIN_MELEE_REACH * 2) //center to center for players diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index 99c70474cad..10283386cc6 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -271,8 +271,7 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petEntry, uint32 petnumber, bool c m_charmInfo->SetPetNumber(petInfo->PetNumber, IsPermanentPetFor(owner)); - SetDisplayId(petInfo->DisplayId); - SetNativeDisplayId(petInfo->DisplayId); + SetDisplayId(petInfo->DisplayId, true); uint8 petlevel = petInfo->Level; ReplaceAllNpcFlags(UNIT_NPC_FLAG_NONE); ReplaceAllNpcFlags2(UNIT_NPC_FLAG_2_NONE); @@ -1832,9 +1831,9 @@ float Pet::GetNativeObjectScale() const return Guardian::GetNativeObjectScale(); } -void Pet::SetDisplayId(uint32 modelId, float displayScale /*= 1.f*/) +void Pet::SetDisplayId(uint32 modelId, bool setNative /*= false*/) { - Guardian::SetDisplayId(modelId, displayScale); + Guardian::SetDisplayId(modelId, setNative); if (!isControlled()) return; diff --git a/src/server/game/Entities/Pet/Pet.h b/src/server/game/Entities/Pet/Pet.h index 2a0dfde8466..0a671d6d549 100644 --- a/src/server/game/Entities/Pet/Pet.h +++ b/src/server/game/Entities/Pet/Pet.h @@ -52,7 +52,7 @@ class TC_GAME_API Pet : public Guardian void RemoveFromWorld() override; float GetNativeObjectScale() const override; - void SetDisplayId(uint32 modelId, float displayScale = 1.f) override; + void SetDisplayId(uint32 modelId, bool setNative = false) override; PetType getPetType() const { return m_petType; } void setPetType(PetType type) { m_petType = type; } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 5875c671799..9037c15c88b 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -22395,8 +22395,7 @@ void Player::InitDisplayIds() return; } - SetDisplayId(model->DisplayID); - SetNativeDisplayId(model->DisplayID); + SetDisplayId(model->DisplayID, true); SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::StateAnimID), sDB2Manager.GetEmptyAnimStateID()); } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 51db897043a..6a422b65201 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -5986,10 +5986,7 @@ void Unit::SetMinion(Minion *minion, bool apply) minion->SetWildBattlePetLevel(pet->PacketInfo.Level); if (uint32 display = pet->PacketInfo.DisplayID) - { - minion->SetDisplayId(display); - minion->SetNativeDisplayId(display); - } + minion->SetDisplayId(display, true); } } } @@ -10147,14 +10144,26 @@ void Unit::RecalculateObjectScale() SetObjectScale(std::max(scale, scaleMin)); } -void Unit::SetDisplayId(uint32 modelId, float displayScale /*= 1.f*/) +void Unit::SetDisplayId(uint32 displayId, bool setNative /*= false*/) { - SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::DisplayID), modelId); + float displayScale = DEFAULT_PLAYER_DISPLAY_SCALE; + + if (IsCreature() && !IsPet()) + if (CreatureModel const* model = ToCreature()->GetCreatureTemplate()->GetModelWithDisplayId(displayId)) + displayScale = model->DisplayScale; + + SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::DisplayID), displayId); SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::DisplayScale), displayScale); + if (setNative) + { + SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::NativeDisplayID), displayId); + SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::NativeXDisplayScale), displayScale); + } + // Set Gender by modelId - if (CreatureModelInfo const* minfo = sObjectMgr->GetCreatureModelInfo(modelId)) - SetGender(Gender(minfo->gender)); + if (CreatureModelInfo const* modelInfo = sObjectMgr->GetCreatureModelInfo(displayId)) + SetGender(Gender(modelInfo->gender)); } void Unit::RestoreDisplayId(bool ignorePositiveAurasPreventingMounting /*= false*/) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 39c60a575cc..21d047580e9 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1652,15 +1652,11 @@ class TC_GAME_API Unit : public WorldObject virtual float GetNativeObjectScale() const { return 1.0f; } virtual void RecalculateObjectScale(); uint32 GetDisplayId() const { return m_unitData->DisplayID; } - virtual void SetDisplayId(uint32 modelId, float displayScale = 1.f); + float GetDisplayScale() const { return m_unitData->DisplayScale; } + virtual void SetDisplayId(uint32 displayId, bool setNative = false); uint32 GetNativeDisplayId() const { return m_unitData->NativeDisplayID; } float GetNativeDisplayScale() const { return m_unitData->NativeXDisplayScale; } void RestoreDisplayId(bool ignorePositiveAurasPreventingMounting = false); - void SetNativeDisplayId(uint32 displayId, float displayScale = 1.f) - { - SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::NativeDisplayID), displayId); - SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::NativeXDisplayScale), displayScale); - } void SetTransformSpell(uint32 spellid) { m_transformSpell = spellid;} uint32 GetTransformSpell() const { return m_transformSpell;} diff --git a/src/server/game/Events/GameEventMgr.cpp b/src/server/game/Events/GameEventMgr.cpp index e3bdf6ad270..12e9c070bfd 100644 --- a/src/server/game/Events/GameEventMgr.cpp +++ b/src/server/game/Events/GameEventMgr.cpp @@ -1395,22 +1395,14 @@ void GameEventMgr::ChangeEquipOrModel(int16 event_id, bool activate) itr->second.equipement_id_prev = creature->GetCurrentEquipmentId(); itr->second.modelid_prev = creature->GetDisplayId(); creature->LoadEquipment(itr->second.equipment_id, true); - if (itr->second.modelid > 0 && itr->second.modelid_prev != itr->second.modelid && - sObjectMgr->GetCreatureModelInfo(itr->second.modelid)) - { - creature->SetDisplayId(itr->second.modelid); - creature->SetNativeDisplayId(itr->second.modelid); - } + if (itr->second.modelid > 0 && itr->second.modelid_prev != itr->second.modelid && sObjectMgr->GetCreatureModelInfo(itr->second.modelid)) + creature->SetDisplayId(itr->second.modelid, true); } else { creature->LoadEquipment(itr->second.equipement_id_prev, true); - if (itr->second.modelid_prev > 0 && itr->second.modelid_prev != itr->second.modelid && - sObjectMgr->GetCreatureModelInfo(itr->second.modelid_prev)) - { - creature->SetDisplayId(itr->second.modelid_prev); - creature->SetNativeDisplayId(itr->second.modelid_prev); - } + if (itr->second.modelid_prev > 0 && itr->second.modelid_prev != itr->second.modelid && sObjectMgr->GetCreatureModelInfo(itr->second.modelid_prev)) + creature->SetDisplayId(itr->second.modelid_prev, true); } } }); diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index ded5f48b7e5..49f04af4593 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -495,15 +495,12 @@ public: //Edit Player or Creature Scale static bool HandleModifyScaleCommand(ChatHandler* handler, char const* args) { - float Scale; + float scale; Unit* target = handler->getSelectedUnit(); - if (CheckModifySpeed(handler, args, target, Scale, 0.1f, 10.0f, false)) + if (CheckModifySpeed(handler, args, target, scale, 0.1f, 10.0f, false)) { - NotifyModification(handler, target, LANG_YOU_CHANGE_SIZE, LANG_YOURS_SIZE_CHANGED, Scale); - if (Creature* creatureTarget = target->ToCreature()) - creatureTarget->SetDisplayId(creatureTarget->GetDisplayId(), Scale); - else - target->SetObjectScale(Scale); + NotifyModification(handler, target, LANG_YOU_CHANGE_SIZE, LANG_YOURS_SIZE_CHANGED, scale); + target->SetObjectScale(scale); return true; } return false; diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index 94023ff1db4..75e622d8d88 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -693,8 +693,7 @@ public: return false; } - creature->SetDisplayId(displayId); - creature->SetNativeDisplayId(displayId); + creature->SetDisplayId(displayId, true); creature->SaveToDB(); diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp index 4f7854702a0..07b9282f17d 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp @@ -139,7 +139,7 @@ struct boss_felmyst : public BossAI me->Relocate(madrigosa); me->SetDisplayFromModel(0); - me->SetNativeDisplayId(me->GetDisplayId()); + me->SetDisplayId(me->GetDisplayId(), true); } void Reset() override |