All pastes #506654 Raw Edit

Miscellany

public text v1 · immutable
·published 2007-05-24 03:24 UTC
rendered paste body
void Spell::SpellEffectCreateItem(uint32 i) // Create item 
{
    Item* newItem;
    Item *add;
    uint8 slot;
    SlotResult slotresult;

    skilllinespell* skill = objmgr.GetSpellSkill(m_spellInfo->Id);

    for(int j=0; j<3; j++) // now create the Items
    {
        ItemPrototype *m_itemProto;
        m_itemProto = objmgr.GetItemPrototype( m_spellInfo->EffectSpellGroupRelation[j] );
        if (!m_itemProto)
             continue;

        if(m_spellInfo->EffectSpellGroupRelation[j] == 0)
            continue;

+        uint32 item_count;
+        if (m_itemProto->Class != ITEM_CLASS_CONSUMABLE || m_spellInfo->SpellFamilyName != SPELLFAMILY_MAGE)
+        {
+            int32 basePoints = m_spellInfo->EffectBasePoints[i];
+            int32 randomPoints = m_spellInfo->EffectDieSides[i];
+            if (randomPoints)
+                item_count = basePoints + irand(1, randomPoints);
+            else
+                item_count = basePoints + 1;
+        }
+        else if(p_caster->getLevel() >= m_spellInfo->spellLevel)
+            item_count = ((p_caster->getLevel() - (m_spellInfo->spellLevel-1))*2);
+        else
+            item_count = damage;
+
+       //conjure water ranks 7,8 & 9 and conjure food ranks 7 & 8 have different starting amounts
+       switch(m_spellInfo->Id)
+       {
+       case 27389 //Conjure Food 7
+       case 33718 //Conjure Food 8
+       case 10140 //Conjure Water 7
+       case 37420 //Conjure Water 8
+       case 27090 //Conjure Water 9
+               item_count += 8;
+               break;
+       }
+
+       //scale item_count down if its over 20
+       if(item_count > 20)
+               item_count = 20;

-        if(p_caster->GetItemInterface()->CanReceiveItem(m_itemProto, damage)) //reversed since it sends >1 as invalid and 0 as valid
+        if(p_caster->GetItemInterface()->CanReceiveItem(m_itemProto, item_count)) //reversed since it sends >1 as invalid and 0 as valid
        {
             SendCastResult(SPELL_FAILED_TOO_MANY_OF_ITEM);
            return;
        }
        
        slot = 0;
        add = p_caster->GetItemInterface()->FindItemLessMax(m_spellInfo->EffectSpellGroupRelation[j],1, false);
        if (!add)
        {
            slotresult = p_caster->GetItemInterface()->FindFreeInventorySlot(m_itemProto);
            if(!slotresult.Result)
            {
                  SendCastResult(SPELL_FAILED_TOO_MANY_OF_ITEM);
                  return;
            }
            
            newItem =objmgr.CreateItem(m_spellInfo->EffectSpellGroupRelation[i],p_caster);
            newItem->SetUInt64Value(ITEM_FIELD_CREATOR,m_caster->GetGUID());
-            newItem->SetUInt32Value(ITEM_FIELD_STACK_COUNT, damage);
+            newItem->SetUInt32Value(ITEM_FIELD_STACK_COUNT, item_count);

            if(p_caster->GetItemInterface()->SafeAddItem(newItem,slotresult.ContainerSlot, slotresult.Slot))
            {
                WorldPacket data(88);
-                p_caster->GetSession()->BuildItemPushResult(&data, p_caster->GetGUID(), 1, damage, m_spellInfo->EffectSpellGroupRelation[i] ,0,0xFF,1,0xFFFFFFFF);
+                p_caster->GetSession()->BuildItemPushResult(&data, p_caster->GetGUID(), 1, item_count, m_spellInfo->EffectSpellGroupRelation[i] ,0,0xFF,1,0xFFFFFFFF);
                p_caster->SendMessageToSet(&data, true);
            } else {
                delete newItem;
            }

            if(skill)
                DetermineSkillUp(skill->skilline);
        } 
        else 
        {
+            //scale item_count down if total stack will be more than 20
+           if(add->GetUInt32Value(ITEM_FIELD_STACK_COUNT) + item_count > 20)
+                item_count = 20 - add->GetUInt32Value(ITEM_FIELD_STACK_COUNT);
+
            add->SetCount(add->GetUInt32Value(ITEM_FIELD_STACK_COUNT) + item_count);
            WorldPacket data(88);
            p_caster->GetSession()->BuildItemPushResult(&data, p_caster->GetGUID(), 1, item_count, m_spellInfo->EffectSpellGroupRelation[i] ,0,0xFF,1,0xFFFFFFFF);
            p_caster->SendMessageToSet(&data, true);
            if(skill)
                DetermineSkillUp(skill->skilline);
        }
    }       
}