All pastes #506891 Raw Edit

Stuff

public text v1 · immutable
·published 2007-05-24 08: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;
//code added

		 uint32 item_count;
		sLog.outDetail("Spell Family Name flag = %u", m_spellInfo->SpellFamilyName);
        if (m_itemProto->Class != ITEM_CLASS_CONSUMABLE)
        {
            int32 basePoints = m_spellInfo->EffectBasePoints[i];
            int32 randomPoints = m_spellInfo->EffectDieSides[i];
            if (randomPoints)
                item_count = basePoints + rand() % 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, 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, item_count);

            if(p_caster->GetItemInterface()->SafeAddItem(newItem,slotresult.ContainerSlot, slotresult.Slot))
            {
                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);
            } 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)
           {
                uint32 item_count_filled;
                item_count_filled = 20 - add->GetUInt32Value(ITEM_FIELD_STACK_COUNT);
                add->SetCount(20);
    
                slotresult = p_caster->GetItemInterface()->FindFreeInventorySlot(m_itemProto);
                if(!slotresult.Result)
                    item_count = item_count_filled;
                else
                {
                    newItem =objmgr.CreateItem(m_spellInfo->EffectSpellGroupRelation[i],p_caster);
                    newItem->SetUInt64Value(ITEM_FIELD_CREATOR,m_caster->GetGUID());
                    newItem->SetUInt32Value(ITEM_FIELD_STACK_COUNT, item_count - item_count_filled);

                    if(!p_caster->GetItemInterface()->SafeAddItem(newItem,slotresult.ContainerSlot, slotresult.Slot))
                    {
                        delete newItem;
                        item_count = item_count_filled;
                    }
                }
            }
            else
                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);
            p_caster->SendMessageToSet(&data, true);
            if(skill)
                DetermineSkillUp(skill->skilline);
        }
    }       
}