Core/Hooks: Added hook CanApplySoulboundFlag for item

This commit is contained in:
Winfidonarleyan
2019-08-29 18:28:53 +07:00
parent 52e284df44
commit 8b9bad0b02
3 changed files with 17 additions and 1 deletions

View File

@@ -415,6 +415,7 @@ bool Item::LoadFromDB(uint32 guid, uint64 owner_guid, Field* fields, uint32 entr
uint32 duration = fields[3].GetUInt32();
SetUInt32Value(ITEM_FIELD_DURATION, duration);
// update duration if need, and remove if not need
if ((proto->Duration == 0) != (duration == 0))
{
@@ -428,8 +429,9 @@ bool Item::LoadFromDB(uint32 guid, uint64 owner_guid, Field* fields, uint32 entr
SetSpellCharges(i, atoi(tokens[i]));
SetUInt32Value(ITEM_FIELD_FLAGS, fields[5].GetUInt32());
// Remove bind flag for items vs NO_BIND set
if (IsSoulBound() && proto->Bonding == NO_BIND /*[AZTH] force soulbound using an unknown flag as workaround */ && !HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAG_UNK1) /*[/AZTH]*/)
if (IsSoulBound() && proto->Bonding == NO_BIND && sScriptMgr->CanApplySoulboundFlag(this, proto))
{
ApplyModFlag(ITEM_FIELD_FLAGS, ITEM_FLAG_SOULBOUND, false);
need_save = true;

View File

@@ -2811,6 +2811,17 @@ void ScriptMgr::OnItemCreate(Item* item, ItemTemplate const* itemProto, Player c
FOREACH_SCRIPT(MiscScript)->OnItemCreate(item, itemProto, owner);
}
bool ScriptMgr::CanApplySoulboundFlag(Item* item, ItemTemplate const* proto)
{
bool ret = true;
FOR_SCRIPTS_RET(MiscScript, itr, end, ret) // return true by default if not scripts
if (!itr->second->CanApplySoulboundFlag(item, proto))
ret = false; // we change ret value only when scripts return false
return ret;
}
void ScriptMgr::OnConstructObject(Object* origin)
{
FOREACH_SCRIPT(MiscScript)->OnConstructObject(origin);

View File

@@ -1403,6 +1403,8 @@ public:
virtual void OnItemCreate(Item* /*item*/, ItemTemplate const* /*itemProto*/, Player const* /*owner*/) { }
virtual bool CanApplySoulboundFlag(Item* /*item*/, ItemTemplate const* /*proto*/) { return true; }
virtual bool CanItemApplyEquipSpell(Player* /*player*/, Item* /*item*/) { return true; }
virtual bool CanSendAuctionHello(WorldSession const* /*session*/, uint64 /*guid*/, Creature* /*creature*/) { return true; }
@@ -1878,6 +1880,7 @@ class ScriptMgr
void OnConstructInstanceSave(InstanceSave* origin);
void OnDestructInstanceSave(InstanceSave* origin);
void OnItemCreate(Item* item, ItemTemplate const* itemProto, Player const* owner);
bool CanApplySoulboundFlag(Item* item, ItemTemplate const* proto);
bool CanItemApplyEquipSpell(Player* player, Item* item);
bool CanSendAuctionHello(WorldSession const* session, uint64 guid, Creature* creature);
void ValidateSpellAtCastSpell(Player* player, uint32& oldSpellId, uint32& spellId, uint8& castCount, uint8& castFlags);