Advertisement
Rochet2

Item upgrade/exchange script ~ Stack

Jan 2nd, 2012
2,608
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. local Check = false -- true: Do not show items the player can't buy, false: show all vendor items in the list, even if the player does not have the mats.
  3. -- Set NPC entry at the bottom!
  4.  
  5. local T = {}
  6. T.Items =
  7. {
  8. --  {{GivenItem, Amount}, {ReqItem1, Amount}, {ReqItem2, Amount}, ... {ReqItemN, Amount}}
  9.     {{25, 1}, {35, 1}},
  10.     {{25, 1}, {36, 1}},
  11.     {{25, 1}, {37, 1}},
  12.     {{25, 1}, {38, 1}},
  13.     {{25, 1}, {39, 1}},
  14.     {{25, 2}, {40, 3}, {38, 1}, {39, 1}, {36, 4}}, -- Testing multiple req items
  15.     {{25, 1}, {40, 1}},
  16.     {{25, 1}, {40, 1}},
  17.     {{25, 1}, {40, 1}},
  18.     {{25, 1}, {40, 1}},
  19.     {{25, 1}, {40, 1}},
  20.     {{25, 1}, {40, 1}},
  21.     {{25, 1}, {40, 1}},
  22.     {{25, 1}, {40, 1}},
  23.     {{25, 1}, {40, 1}},
  24.     {{25, 1}, {40, 1}},
  25.     {{25, 1}, {40, 1}},
  26.     {{25, 1}, {40, 1}},
  27.     {{25, 1}, {40, 1}},
  28.     {{25, 1}, {40, 1}},
  29.     {{25, 1}, {40, 1}},
  30.     {{25, 1}, {40, 1}},
  31.     {{25, 1}, {40, 1}},
  32.     {{25, 1}, {40, 1}},
  33.     {{25, 1}, {40, 1}},
  34.     {{25, 1}, {40, 1}},
  35.     {{25, 1}, {40, 1}},
  36.     {{25, 1}, {40, 1}},
  37.     {{25, 1}, {40, 1}},
  38.     {{25, 1}, {40, 1}},
  39.     {{25, 1}, {40, 1}},
  40.     {{25, 1}, {40, 1}},
  41.     {{25, 1}, {40, 1}},
  42.     {{25, 1}, {40, 1}},
  43.     {{25, 1}, {40, 1}},
  44.     {{25, 1}, {40, 1}},
  45.     {{25, 1}, {40, 1}},
  46.     {{25, 1}, {40, 1}},
  47.     {{25, 1}, {40, 1}},
  48.     {{25, 1}, {40, 1}},
  49.     {{25, 1}, {40, 1}},
  50.     {{25, 1}, {40, 1}},
  51.     {{25, 1}, {40, 1}},
  52.     {{25, 1}, {40, 1}},
  53.     {{25, 1}, {40, 1}},
  54.     {{35, 2}, {40, 1}}, -- Testing vendor with item entry 35
  55. }
  56.  
  57. T.Page = {}
  58. T.Buy = {}
  59. T.Options = 20
  60. local X = 10
  61.  
  62. function T.Count(Page)
  63.     if(not Page or Page < 1) then
  64.         return 1
  65.     else
  66.         return (Page*T.Options)
  67.     end
  68. end
  69.  
  70. function T.Max(Count, LData)
  71.     if(LData - Count >= T.Options) then
  72.         return Count+T.Options-1, true
  73.     else
  74.         return LData, false
  75.     end
  76. end
  77.  
  78. function T.Name(Entry)
  79.     return WorldDBQuery("SELECT Name1 FROM items WHERE entry = "..Entry):GetColumn(0):GetString()
  80. end
  81.  
  82. function T.Hello(pUnit, event, pPlayer)
  83.     local Items = {}
  84.     for k,v in ipairs(T.Items) do
  85.         local Add = true
  86.         for i = 2, #v do
  87.             if(Check and (not pPlayer:HasItem(v[i][1]) or pPlayer:GetItemCount(v[i][1]) < v[i][2])) then
  88.                 Add = false
  89.                 break
  90.             end
  91.         end
  92.         if(Add) then
  93.             Items[#Items+1] = {k, v[1][1], v[1][2]}
  94.         end
  95.     end
  96.     local str = tostring(pPlayer)
  97.     if(not T.Page[str] or T.Page[str] < 0) then
  98.         T.Page[str] = 0
  99.     end
  100.     local Page = T.Page[str]
  101.     local Count = T.Count(Page)
  102.     local Max, Next = T.Max(Count, #Items)
  103.     pUnit:GossipCreateMenu(100, pPlayer, 0)
  104.     if(Next) then
  105.         pUnit:GossipMenuAddItem(7, "Next page", 3, 0, '', 0)
  106.     end
  107.     if(Page > 0) then
  108.         pUnit:GossipMenuAddItem(7, "Previous page", 4, 0, '', 0)
  109.     end
  110.     pUnit:GossipMenuAddItem(4, "Refresh", 1, 0, '', 0)
  111.     pUnit:GossipMenuAddItem(1, "Preview page's items", X, 0, '', 0)
  112.     for k = Count, Max do
  113.         local Amount = ""
  114.         if(Items[k][3] > 1) then
  115.             Amount = Items[k][3].." "
  116.         end
  117.         local Name = T.Name(Items[k][2])
  118.         pUnit:GossipMenuAddItem(3, Amount..Name, X+Items[k][1], 0, '', 0)
  119.     end
  120.     pUnit:GossipSendMenu(pPlayer)
  121. end
  122.  
  123. function T.Select(pUnit, event, pPlayer, id, intid, code)
  124.     local str = tostring(pPlayer)
  125.     if(intid == 3) then
  126.         T.Page[str] = T.Page[str] + 1
  127.     elseif(intid == 4) then
  128.         T.Page[str] = T.Page[str] - 1
  129.     elseif(intid == 5) then
  130.         T.Select(pUnit, 666, pPlayer, id, T.Buy[str], code)
  131.         return
  132.     elseif(intid == X) then
  133.         pPlayer:GossipComplete()
  134.         pUnit:VendorRemoveAllItems()
  135.         local Items = {}
  136.         for k,v in ipairs(T.Items) do
  137.             local Add = true
  138.             for i = 2, #v do
  139.                 if(Check and (not pPlayer:HasItem(v[i][1]) or pPlayer:GetItemCount(v[i][1]) < v[i][2])) then
  140.                     Add = false
  141.                     break
  142.                 end
  143.             end
  144.             if(Add) then
  145.                 Items[#Items+1] = v[1][1]
  146.             end
  147.         end
  148.         local Page = T.Page[str]
  149.         local Count = T.Count(Page)
  150.         local Max, Next = T.Max(Count, #Items)
  151.         for k = Count, Max do
  152.             pUnit:VendorAddItem(Items[k], -1, 0)
  153.         end
  154.         pPlayer:SendVendorWindow(pUnit)
  155.         return
  156.     elseif(T.Items[intid-X]) then
  157.         if(event ~= 666) then
  158.             T.Buy[str] = intid
  159.             pPlayer:SendBroadcastMessage("You need these items to purchase:")
  160.             for i = 2, #T.Items[intid-X] do
  161.                 local Name = T.Name(T.Items[intid-X][i][1])
  162.                 pPlayer:SendBroadcastMessage(T.Items[intid-X][i][2].." \124cff00B0E4\124Hitem:"..T.Items[intid-X][i][1]..":0:0:0:0:0:0:0:0\124h["..Name.."]\124h\124r")
  163.             end
  164.             local Name = T.Name(T.Items[intid-X][1][1])
  165.             pUnit:GossipCreateMenu(100, pPlayer, 0)
  166.             pUnit:GossipMenuAddItem(1, "Buy "..T.Items[intid-X][1][2].." "..Name, 5, 0, "Buying "..T.Items[intid-X][1][2].." "..Name.."!", 0)
  167.             pUnit:GossipMenuAddItem(6, "Show price", intid, 0, '', 0)
  168.             pUnit:GossipMenuAddItem(7, "Back..", 1, 0, '', 0)
  169.             pUnit:GossipSendMenu(pPlayer)
  170.             return
  171.         else
  172.             local intid = intid-X
  173.             local Add = true
  174.             for i = 2, #T.Items[intid] do
  175.                 if(not pPlayer:HasItem(T.Items[intid][i][1]) or pPlayer:GetItemCount(T.Items[intid][i][1]) < T.Items[intid][i][2]) then
  176.                     Add = false
  177.                     break
  178.                 end
  179.             end
  180.             if(Add) then
  181.                 local Done = 0
  182.                 for k = 1, T.Items[intid][1][2] do
  183.                     if(pPlayer:AddItem(T.Items[intid][1][1], 1)) then
  184.                         Done = Done + 1
  185.                     else
  186.                         pPlayer:RemoveItem(T.Items[intid][1][1], Done)
  187.                         pPlayer:SendAreaTriggerMessage("Your inventory is too full")
  188.                         break
  189.                     end
  190.                 end
  191.                 if(Done == T.Items[intid][1][2]) then
  192.                     for i = 2, #T.Items[intid] do
  193.                         pPlayer:RemoveItem(T.Items[intid][i][1], T.Items[intid][i][2])
  194.                     end
  195.                 else
  196.                     T.Select(pUnit, 0, pPlayer, id, intid+X, code)
  197.                     return
  198.                 end
  199.             else
  200.                 pPlayer:SendAreaTriggerMessage("You do not have the required items")
  201.                 if(not Check) then
  202.                     T.Select(pUnit, 0, pPlayer, id, intid+X, code)
  203.                     return
  204.                 end
  205.             end
  206.         end
  207.     end
  208.     T.Hello(pUnit, event, pPlayer)
  209. end
  210.  
  211. local ID = 180001 -- NPC entry
  212. RegisterUnitGossipEvent(ID, 1, T.Hello)
  213. RegisterUnitGossipEvent(ID, 2, T.Select)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement