diff options
-rw-r--r-- | sql/updates/7770_world_item_required_target.sql | 2 | ||||
-rw-r--r-- | src/game/Item.cpp | 10 | ||||
-rw-r--r-- | src/game/Item.h | 3 | ||||
-rw-r--r-- | src/game/ObjectMgr.cpp | 11 |
4 files changed, 20 insertions, 6 deletions
diff --git a/sql/updates/7770_world_item_required_target.sql b/sql/updates/7770_world_item_required_target.sql new file mode 100644 index 00000000000..1a3ba551099 --- /dev/null +++ b/sql/updates/7770_world_item_required_target.sql @@ -0,0 +1,2 @@ +ALTER TABLE `item_required_target` +ADD `maxPercentHealth` TINYINT(3) UNSIGNED NOT NULL DEFAULT 100; diff --git a/src/game/Item.cpp b/src/game/Item.cpp index 025a0a629aa..4c247d06be9 100644 --- a/src/game/Item.cpp +++ b/src/game/Item.cpp @@ -1028,12 +1028,22 @@ bool Item::IsBindedNotWith( Player const* player ) const bool ItemRequiredTarget::IsFitToRequirements( Unit* pUnitTarget ) const { + float uiPercentHP; + float uiHealth; + float uiMaxHealth; + if (pUnitTarget->GetTypeId() != TYPEID_UNIT) return false; if (pUnitTarget->GetEntry() != m_uiTargetEntry) return false; + uiHealth = pUnitTarget->GetHealth(); + uiMaxHealth = pUnitTarget->GetMaxHealth(); + uiPercentHP = ((uiHealth / uiMaxHealth) * 100); + if (m_uiMaxPercentHealth <= uiPercentHP) + return false; + switch(m_uiType) { case ITEM_TARGET_TYPE_CREATURE: diff --git a/src/game/Item.h b/src/game/Item.h index f1fd798d1e8..7cde4866c29 100644 --- a/src/game/Item.h +++ b/src/game/Item.h @@ -208,9 +208,10 @@ enum ItemRequiredTargetType struct ItemRequiredTarget { - ItemRequiredTarget(ItemRequiredTargetType uiType, uint32 uiTargetEntry) : m_uiType(uiType), m_uiTargetEntry(uiTargetEntry) {} + ItemRequiredTarget(ItemRequiredTargetType uiType, uint32 uiTargetEntry, float uiMaxPercentHealth) : m_uiType(uiType), m_uiTargetEntry(uiTargetEntry), m_uiMaxPercentHealth(uiMaxPercentHealth) {} ItemRequiredTargetType m_uiType; uint32 m_uiTargetEntry; + float m_uiMaxPercentHealth; // helpers bool IsFitToRequirements(Unit* pUnitTarget) const; diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index c449267e5f5..28b968fe44e 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -2422,7 +2422,7 @@ void ObjectMgr::LoadItemRequiredTarget() uint32 count = 0; - QueryResult_AutoPtr result = WorldDatabase.Query("SELECT entry,type,targetEntry FROM item_required_target"); + QueryResult_AutoPtr result = WorldDatabase.Query("SELECT entry,type,targetEntry,maxPercentHealth FROM item_required_target"); if (!result) { @@ -2442,9 +2442,10 @@ void ObjectMgr::LoadItemRequiredTarget() Field *fields = result->Fetch(); bar.step(); - uint32 uiItemId = fields[0].GetUInt32(); - uint32 uiType = fields[1].GetUInt32(); - uint32 uiTargetEntry = fields[2].GetUInt32(); + uint32 uiItemId = fields[0].GetUInt32(); + uint32 uiType = fields[1].GetUInt32(); + uint32 uiTargetEntry = fields[2].GetUInt32(); + float uiMaxPercentHealth = fields[3].GetUInt32(); ItemPrototype const* pItemProto = sItemStorage.LookupEntry<ItemPrototype>(uiItemId); @@ -2508,7 +2509,7 @@ void ObjectMgr::LoadItemRequiredTarget() continue; } - m_ItemRequiredTarget.insert(ItemRequiredTargetMap::value_type(uiItemId,ItemRequiredTarget(ItemRequiredTargetType(uiType),uiTargetEntry))); + m_ItemRequiredTarget.insert(ItemRequiredTargetMap::value_type(uiItemId,ItemRequiredTarget(ItemRequiredTargetType(uiType),uiTargetEntry,uiMaxPercentHealth))); ++count; } while (result->NextRow()); |