You'll need this:
Code:
private static long RandSeed = 3721; // Generate a random int value inside the max value public static int Get(int nMax) { return Get(nMax, false); } public static int Get(int nMin, int nMax) { if (nMin > nMax) { Console.WriteLine("[Rand] Min value cant be higher than max value."); return 0; } return nMin + Get(nMax - nMin); } // Generate a random int value inside the max value, may be reseted public static int Get(int nMax, bool bReset) { if (bReset) RandSeed = DateTime.Now.Ticks; long x = 0xffffffff; double i; long final; RandSeed *= ((long)134775813); RandSeed += 1; RandSeed = RandSeed % x; i = ((double)RandSeed) / (double)0xffffffff; final = (long)(nMax * i); return (int)final; }
After that.... you can use this:
Code:
#region ITEM_UPGRADE/IMPROVE public void UpEquipmentQuality(uint idEquipment, uint idTreasure) { Item pTreasure = pItemPack.FindItemById(idTreasure); if (pTreasure == null) return; if (pTreasure.GetTypeId() != 1088000) { SendSysMsg(EN_RES.STR_DRAGONBALL); return; } Item pItem = pItemPack.FindItemById(idEquipment); if (pItem == null) return; // quality int nQuality = pItem.GetQuality(); // get info uint idNewType = 0; int nChance = 0; if (!GetUpEpQualityInfo(pItem, ref nChance, ref idNewType, true)) return; // show time pItemPack.DelItem(idTreasure); if (Rand.Get(100) < nChance) { // succeed pItem.SetTypeId(idNewType); // durability int nAmountLimit = pItem.GetAmountLimit(); if (Rand.Get(100) < 2) { nAmountLimit += (Rand.Get(3) + 1) * 100; pItem.SetAmount((ushort)nAmountLimit); pItem.SetAmountLimit((ushort)nAmountLimit); } /*int nDurEffect = pItem->GetGemDurEffect(700000+pItem->GetInt(ITEMDATA_GEM1)); nDurEffect += pItem->GetGemDurEffect(700000+pItem->GetInt(ITEMDATA_GEM2)); if (nDurEffect > 0) { nAmountLimit = nAmountLimit*(100+nDurEffect)/100; pItem->SetInt(ITEMDATA_AMOUNTLIMIT, nAmountLimit, UPDATE_FALSE); pItem->SetInt(ITEMDATA_AMOUNT, nAmountLimit, UPDATE_FALSE); }*/ // gem hole if (Rand.Get(100) < 1) { if (pItem.GetHole(1) == 0) { pItem.SetHole(1, 255); SendSysMsg("Congratulations! You have openned a socket into your item while improving it's quality."); } else if (pItem.GetHole(2) == 0) { pItem.SetHole(2, 255); SendSysMsg("Congratulations! You have openned a socket into your item while improving it's quality."); } } // inform client SendPacket(MsgItem.Create(pItem.GetId(), 255, MsgItem._MSG_REMOVE)); SendPacket(MsgItemInfo.Create(pItem, 1)); SendPacket(MsgItem.Create(pItem.GetId(), 0, MsgItem._MSG_ADD)); } else { // failed // decrease durability int nAmountLimit = pItem.GetAmountLimit(); //PERCENT_DECDUR = 5 if (Rand.Get(100) < 5) { if (nAmountLimit / 100 > 1) { nAmountLimit -= 100; pItem.SetAmountLimit((ushort)nAmountLimit); } } int nAmountNew = nAmountLimit; int nOrgAmountLimit = pItem.GetInfo().usAmountLimit; nAmountNew -= nOrgAmountLimit / 2; if (nAmountNew > pItem.GetAmountLimit()) nAmountNew = pItem.GetAmountLimit() / 2; pItem.SetAmount((ushort)nAmountNew); SendPacket(MsgItem.Create(pItem.GetId(), 255, MsgItem._MSG_REMOVE)); SendPacket(MsgItemInfo.Create(pItem, 1)); SendPacket(MsgItem.Create(pItem.GetId(), 0, MsgItem._MSG_ADD)); } } public void UpEquipmentLevel(uint idEquipment, uint idTreasure) { Item pTreasure = pItemPack.FindItemById(idTreasure); if (pTreasure == null) return; if (pTreasure.GetTypeId() != 1088001 && pTreasure.GetTypeId() != 1088002) { SendSysMsg(EN_RES.STR_METEOR); return; } Item pItem = pItemPack.FindItemById(idEquipment); if (pItem == null) return; // get info uint idNewType = 0; int nChance = 0; if (!GetUpEpLevelInfo(pItem, ref nChance, ref idNewType, true)) return; // divoice item effect if (pTreasure.GetTypeId() == 1088002) nChance = nChance * 130 / 100; // show time pItemPack.DelItem(idTreasure); if (Rand.Get(100) < nChance) { // succeed pItem.SetTypeId(idNewType); pItem.SetAmount(pItem.GetInfo().usAmount); pItem.SetAmountLimit(pItem.GetInfo().usAmountLimit); // durability int nAmountLimit = pItem.GetAmountLimit(); ; if (Rand.Get(100) < 2) { nAmountLimit += (Rand.Get(3) + 1) * 100; pItem.SetAmount((ushort)nAmountLimit); pItem.SetAmountLimit((ushort)nAmountLimit); } /*int nDurEffect = pItem->GetGemDurEffect(700000+pItem->GetInt(ITEMDATA_GEM1)); nDurEffect += pItem->GetGemDurEffect(700000+pItem->GetInt(ITEMDATA_GEM2)); if (nDurEffect > 0) { nAmountLimit = nAmountLimit*(100+nDurEffect)/100; pItem->SetInt(ITEMDATA_AMOUNTLIMIT, nAmountLimit, UPDATE_FALSE); pItem->SetInt(ITEMDATA_AMOUNT, nAmountLimit, UPDATE_FALSE); }*/ // gem hole if (Rand.Get(100) < 1) { if (pItem.GetHole(1) == 0) { pItem.SetHole(1, 255); SendSysMsg("Congratulations! You have openned a socket into your item while improving it's quality."); } else if (pItem.GetHole(2) == 0) { pItem.SetHole(2, 255); SendSysMsg("Congratulations! You have openned a socket into your item while improving it's quality."); } } // inform client SendPacket(MsgItem.Create(pItem.GetId(), 255, MsgItem._MSG_REMOVE)); SendPacket(MsgItemInfo.Create(pItem, 1)); SendPacket(MsgItem.Create(pItem.GetId(), 0, MsgItem._MSG_ADD)); } else { // failed // decrease durability int nAmountLimit = pItem.GetAmountLimit(); //PERCENT_DECDUR = 5 if (Rand.Get(100) < 5) { if (nAmountLimit / 100 > 1) { nAmountLimit -= 100; pItem.SetAmountLimit((ushort)nAmountLimit); } } int nAmountNew = nAmountLimit; int nOrgAmountLimit = pItem.GetInfo().usAmountLimit; nAmountNew -= nOrgAmountLimit / 2; if (nAmountNew > pItem.GetAmountLimit()) nAmountNew = pItem.GetAmountLimit() / 2; pItem.SetAmount((ushort)nAmountNew); SendPacket(MsgItem.Create(pItem.GetId(), 255, MsgItem._MSG_REMOVE)); SendPacket(MsgItemInfo.Create(pItem, 1)); SendPacket(MsgItem.Create(pItem.GetId(), 0, MsgItem._MSG_ADD)); } } public bool GetUpEpLevelInfo(Item pItem, ref int nChance, ref uint idNewType, bool bSendHint/*=false*/) { idNewType = ChkUpEqLevel(pItem, bSendHint); if (idNewType == 0) return false; uint idType = pItem.GetTypeId(); nChance = 100; if (pItem.IsShield() || pItem.IsArmor() || pItem.IsHelmet()) { uint nLev = (idType % 100) / 10; switch (nLev) { case 5: nChance = 50; break; case 6: nChance = 40; break; case 7: nChance = 30; break; case 8: case 9: nChance = 20; break; default: nChance = 500; break; } byte nQuality = (byte)(idType % 10); switch (nQuality) { case 6: nChance = nChance * 90 / 100; break; case 7: nChance = nChance * 70 / 100; break; case 8: nChance = nChance * 30 / 100; break; case 9: nChance = nChance * 10 / 100; break; default: break; } } else { uint nLev = (idType % 1000) / 10; switch (nLev) { case 11: nChance = 95; break; case 12: nChance = 90; break; case 13: nChance = 85; break; case 14: nChance = 80; break; case 15: nChance = 75; break; case 16: nChance = 70; break; case 17: nChance = 65; break; case 18: nChance = 60; break; case 19: nChance = 55; break; case 20: nChance = 50; break; case 21: nChance = 45; break; case 22: nChance = 40; break; default: nChance = 500; break; } byte nQuality = (byte)(idType % 10); switch (nQuality) { case 6: nChance = nChance * 90 / 100; break; case 7: nChance = nChance * 70 / 100; break; case 8: nChance = nChance * 30 / 100; break; case 9: nChance = nChance * 10 / 100; break; default: break; } } // change range nChance = Math.Min(100, Math.Max(1, nChance)); return true; } public uint ChkUpEqLevel(Item pItem, bool bSendHint/*=false*/) { if (pItem == null || !pItem.IsEquipment()) return 0; int nQuality = pItem.GetQuality(); if (nQuality < 3) return 0; if (pItem.GetAmount() / 100 < pItem.GetAmountLimit() / 100) { if (bSendHint) SendSysMsg(EN_RES.STR_REPAIR_THEN_UPGRADE); return 0; } uint idType = pItem.GetTypeId(); uint idNewType = idType; if (pItem.IsShield() || pItem.IsArmor() || pItem.IsHelmet()) { if ((idType / 10) % 10 >= 9) { if (pItem.IsArmor()) { idNewType += 5000; } else if (pItem.IsHelmet()) { uint nThousand = (idType / 1000) % 10; idNewType -= nThousand * 1000; idNewType += 2000; uint nTen = (idType / 10) % 10; idNewType -= nTen * 10; idNewType += nThousand * 10; } // change detection... if (idType == idNewType) { // no change if (bSendHint) SendSysMsg(EN_RES.STR_UPGRADE_NOMORE); return 0; } else { // got new to uplev if (DbItem.GetInfo(idNewType).id > 0) { // new type found return idNewType; } else { if (bSendHint) SendSysMsg(EN_RES.STR_UPGRADE_NOMORE); return 0; } } } while (true) { idNewType += 10; if (DbItem.GetInfo(idNewType).id > 0) break; // not found this type if ((idNewType / 10) % 10 >= 9) { if (bSendHint) SendSysMsg(EN_RES.STR_UPGRADE_NOMORE); return 0; } } } else { if ((idType / 10) % 100 >= 22) { if (bSendHint) SendSysMsg(EN_RES.STR_UPGRADE_NOMORE); return 0; } while (true) { idNewType += 10; if (DbItem.GetInfo(idNewType).id > 0) break; // not found if ((idNewType % 1000) / 10 >= 22) { if (bSendHint) SendSysMsg(EN_RES.STR_UPGRADE_NOMORE); return 0; } } } return idNewType; } public bool GetUpEpQualityInfo(Item pItem, ref int nChance, ref uint idNewType, bool bSendHint) { idNewType = ChkUpEqQuality(pItem, bSendHint); if (idNewType == 0) return false; // chance nChance = 100; switch (pItem.GetQuality()) { case 6: nChance = 50; break; case 7: nChance = 33; break; case 8: nChance = 20; break; } int nFactor = pItem.GetInfo().ucLevel; if (nFactor > 70) nChance = nChance * (100 - (nFactor - 70) * 1) / 100; nChance = Math.Max(1, nChance); return true; } public uint ChkUpEqQuality(Item pItem, bool bSendHint) { if (pItem == null || !pItem.IsEquipment()) return 0; if (pItem.GetAmount() < pItem.GetAmountLimit()) { if (bSendHint) SendSysMsg(EN_RES.STR_REPAIR_THEN_IMPROVE); return 0; } int nQuality = pItem.GetQuality(); if (nQuality < 3 || nQuality >= 9) { if (bSendHint) SendSysMsg(EN_RES.STR_SUPERIOR_ALREADY); return 0; } uint idType = pItem.GetTypeId(); if (nQuality < 5) idType = (idType / 10) * 10 + 5; uint idNewType = idType + 1; if (DbItem.GetInfo(idNewType).id == 0) { if (bSendHint) SendSysMsg(EN_RES.STR_CONNOT_IMPROVE); return 0; } return idNewType; } #endregion
Some methods you shall search into TQ released source...
Tested by me.... i feel like was trying to upgrade/improve items in real co hahahahahaha was like "THAT FU** FAILED AGAIN"
Cyaa!!