mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 16:37:01 +00:00
[10050] Implement apply non-trade slot item enchanting at trade complete.
Base at original patch provided by arrai. Signed-off-by: VladimirMangos <vladimir@getmangos.com>
This commit is contained in:
parent
a248a1a32d
commit
64f959fb82
10 changed files with 438 additions and 183 deletions
|
|
@ -176,6 +176,15 @@ void SpellCastTargets::setItemTarget(Item* item)
|
|||
m_targetMask |= TARGET_FLAG_ITEM;
|
||||
}
|
||||
|
||||
void SpellCastTargets::setTradeItemTarget(Player* caster)
|
||||
{
|
||||
m_itemTargetGUID = ObjectGuid(uint64(TRADE_SLOT_NONTRADED));
|
||||
m_itemTargetEntry = 0;
|
||||
m_targetMask |= TARGET_FLAG_TRADE_ITEM;
|
||||
|
||||
Update(caster);
|
||||
}
|
||||
|
||||
void SpellCastTargets::setCorpseTarget(Corpse* corpse)
|
||||
{
|
||||
m_CorpseTargetGUID = corpse->GetGUID();
|
||||
|
|
@ -189,17 +198,20 @@ void SpellCastTargets::Update(Unit* caster)
|
|||
NULL;
|
||||
|
||||
m_itemTarget = NULL;
|
||||
if(caster->GetTypeId() == TYPEID_PLAYER)
|
||||
if (caster->GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
if(m_targetMask & TARGET_FLAG_ITEM)
|
||||
m_itemTarget = ((Player*)caster)->GetItemByGuid(m_itemTargetGUID);
|
||||
else if(m_targetMask & TARGET_FLAG_TRADE_ITEM)
|
||||
Player *player = ((Player*)caster);
|
||||
|
||||
if (m_targetMask & TARGET_FLAG_ITEM)
|
||||
m_itemTarget = player->GetItemByGuid(m_itemTargetGUID);
|
||||
else if (m_targetMask & TARGET_FLAG_TRADE_ITEM)
|
||||
{
|
||||
Player* pTrader = ((Player*)caster)->GetTrader();
|
||||
if(pTrader && m_itemTargetGUID.GetRawValue() < TRADE_SLOT_COUNT)
|
||||
m_itemTarget = pTrader->GetItemByTradeSlot(uint32(m_itemTargetGUID.GetRawValue()));
|
||||
if (TradeData* pTrade = player->GetTradeData())
|
||||
if (m_itemTargetGUID.GetRawValue() < TRADE_SLOT_COUNT)
|
||||
m_itemTarget = pTrade->GetTraderData()->GetItem(TradeSlots(m_itemTargetGUID.GetRawValue()));
|
||||
}
|
||||
if(m_itemTarget)
|
||||
|
||||
if (m_itemTarget)
|
||||
m_itemTargetEntry = m_itemTarget->GetEntry();
|
||||
}
|
||||
}
|
||||
|
|
@ -5185,6 +5197,31 @@ SpellCastResult Spell::CheckCast(bool strict)
|
|||
}
|
||||
}
|
||||
|
||||
// check trade slot case (last, for allow catch any another cast problems)
|
||||
if (m_targets.m_targetMask & TARGET_FLAG_TRADE_ITEM)
|
||||
{
|
||||
if (m_caster->GetTypeId() != TYPEID_PLAYER)
|
||||
return SPELL_FAILED_NOT_TRADING;
|
||||
|
||||
Player *pCaster = ((Player*)m_caster);
|
||||
TradeData* my_trade = pCaster->GetTradeData();
|
||||
|
||||
if (!my_trade)
|
||||
return SPELL_FAILED_NOT_TRADING;
|
||||
|
||||
TradeSlots slot = TradeSlots(m_targets.getItemTargetGUID());
|
||||
if (slot != TRADE_SLOT_NONTRADED)
|
||||
return SPELL_FAILED_ITEM_NOT_READY;
|
||||
|
||||
// if trade not complete then remember it in trade data
|
||||
if (!my_trade->IsInAcceptProcess())
|
||||
{
|
||||
// Spell will be casted at completing the trade. Silently ignore at this place
|
||||
my_trade->SetSpell(m_spellInfo->Id, m_CastItem);
|
||||
return SPELL_FAILED_DONT_REPORT;
|
||||
}
|
||||
}
|
||||
|
||||
// all ok
|
||||
return SPELL_CAST_OK;
|
||||
}
|
||||
|
|
@ -5578,13 +5615,20 @@ SpellCastResult Spell::CheckPower()
|
|||
|
||||
bool Spell::IgnoreItemRequirements() const
|
||||
{
|
||||
if (m_IsTriggeredSpell)
|
||||
return true;
|
||||
|
||||
/// Check if it's an enchant scroll. These have no required reagents even though their spell does.
|
||||
if (m_CastItem && m_CastItem->HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAGS_ENCHANT_SCROLL))
|
||||
return true;
|
||||
|
||||
if (m_IsTriggeredSpell)
|
||||
{
|
||||
/// Not own traded item (in trader trade slot) req. reagents including triggered spell case
|
||||
if (Item* targetItem = m_targets.getItemTarget())
|
||||
if (targetItem->GetOwnerGUID() != m_caster->GetGUID())
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue