[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:
VladimirMangos 2010-06-11 22:46:16 +04:00
parent a248a1a32d
commit 64f959fb82
10 changed files with 438 additions and 183 deletions

View file

@ -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;
}