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(player->getLevel() >= m_spellInfo->spellLevel) + item_count = ((player->getLevel() - (m_spellInfo->spellLevel-1))*2); + else + item_count = damage; + //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); } } }