taoshi

pimmarket.lua

Jan 20th, 2024 (edited)
105
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 44.53 KB | None | 0 0
  1. --=============================================================
  2. --2022.02.11-14...02.22..2024.01.21-26
  3. --=============================================================
  4. local market={} market.chest={} market.me={}
  5. market.version='1.10'
  6. local fs=require('filesystem')
  7. local component=require('component')
  8. local gpu=require('component').gpu
  9. local computer=require('computer')
  10. local pullSignal=computer.pullSignal
  11. local event=require('event')
  12. local table=require('table')
  13. local math=require('math')
  14. local port, send = 0xffef, 0xfffe
  15. local serialization=require("serialization")
  16. local zero, one = 0, 1
  17. local sx,xy= 72,24
  18. local unicode=require('unicode')
  19. local me, pim, selector = {}, {}, {}
  20. local tap,pos,menu = 0,1,'screenInit'
  21. if component.isAvailable('openperipheral_selector') then
  22.   selector = require('component').openperipheral_selector
  23. else selector = {setSlot=function(...) return nil end}
  24. end
  25. if component.isAvailable('pim') then
  26.   pim=require('component').pim
  27. end
  28. market.workmode='chest'
  29. market.link = 'unlinked'
  30. market.serverAddress = ''
  31. market.msgnum=14041
  32.  
  33. --лист с полями sell_price, buy_price, qty, display_name, damage и ключом raw_name
  34. market.itemlist = {}--содержит все оценённые предметы магазина
  35. market.chestList = {}--содержит предметы в сундуке связанном с терминалом
  36. market.inumList={} --содержит нумерованный список с айди предметов магазина
  37. market.inventory = {}--содержит список предметов текущего посетителя
  38. market.select='' --raw_name выбранного предмета--на техномагик id предмета
  39. market.mode='trade'
  40. market.chestShop=''--используемый сундук. содержит ссылку на компонет сундук или ме сеть
  41. market.number= '0'--означает число товара в покупке. также поле в установке цен
  42. market.substract =''--содержит число для вычета наличных
  43. market.owner={}
  44. market.shopLine=1
  45. market.selectedLine='1'
  46. market.player={status='player',name='name',uid='uid',balance='0',ban='-',cash='0'}
  47. --получаем название используемого торгового сундука. список сундуков GTImpact модпака
  48. market.component = {'neutronium','iridium','osmium','chrome','wolfram','titanium',
  49. 'hsla','aluminium','steel','wriron','chest','tile_extrautils_chestfull_name'}
  50.  
  51. for chest in pairs(market.component)do
  52.     if component.isAvailable(market.component[chest]) then
  53.         market.chestShop=require('component')[market.component[chest]]
  54.         market.workmode='chest'
  55.     end
  56. end
  57.  
  58. local modem={broadcast=function(...)end}
  59. if component.isAvailable('modem')then
  60.   modem = require ('component').modem
  61. end
  62. modem.open(port)
  63. modem.setWakeMessage('name')
  64. if component.isAvailable('me_interface') then
  65.     market.chestShop=require('component').me_interface
  66.     market.workmode='me'
  67.     me=market.chestShop
  68. end
  69.  
  70. market.pimmoney='customnpcs:npcMoney'..'&&'..'0.0'
  71. market.money='customnpcs:npcMoney'..'&&'..'0.0'
  72. local money={name='customnpcs:npcMoney',damage='0.0'}
  73.  
  74. --позаимствованная у BrightYC таблица цветов.добавлен мутно-зелёный
  75. local color = {
  76.     pattern = "%[0x(%x%x%x%x%x%x)]",
  77.     background = 0x000000,
  78.     pim = 0x46c8e3,
  79.     gray = 0x303030,
  80.     lightGray = 0x999999,
  81.     blackGray = 0x1a1a1a,
  82.     lime = 0x68f029,
  83.     greengray = 0x0bde31,
  84.     blackLime = 0x4cb01e,
  85.     orange = 0xf2b233,
  86.     blackOrange = 0xc49029,
  87.     blue = 0x4260f5,
  88.     blackBlue = 0x273ba1,
  89.     red = 0xff0000
  90. }
  91. --список перехватываемых событий
  92. market.events={player_on='pimWho',player_off='pimByeBye',touch='screenDriver',modem_message='serverResponse'}
  93. market.screen={}--лист для функциональных кнопок экрана. остальные выводятся сбросом листа их названий в market.place
  94. --содержит все используемые кнопки. Кнопки содержат поля: координаты x y,
  95. --размер по x y, текст, внутренняя позиция текста, цвета
  96. market.button={
  97.     eula1={x=5,xs=67,y=3,ys=1,text='Здравствуйте! Рады видеть вас!',tx=1,ty=0,bg=0x303030,fg=0x68f029},
  98.     eula2={x=5,xs=67,y=5,ys=1,text='Вас приветствует электронный магазин ПимМаркет.',tx=1,ty=0,bg=0x303030,fg=0x68f029},
  99.     eula3={x=5,xs=67,y=7,ys=1,text='Все покупки в магазине производятся за НПЦ мани.',tx=1,ty=0,bg=0x303030,fg=0x68f029},
  100.     eula4={x=5,xs=67,y=9,ys=1,text='Обменник эмов на НПЦ мани стоит на спавне -',tx=1,ty=0,bg=0x303030,fg=0x68f029},
  101.     eula5={x=5,xs=67,y=11,ys=1,text='сдача от покупки зачислится на Пим-счёт игрока.',tx=1,ty=0,bg=0x303030,fg=0x68f029},
  102.     eula6={x=5,xs=67,y=13,ys=1,text='Этот счёт автоматически используется при последующих покупках.',tx=1,ty=0,bg=0x303030,fg=0x68f029},
  103.     eula7={x=5,xs=67,y=15,ys=1,text='Все цены в магазине указаны в Эмах.',tx=1,ty=0,bg=0x303030,fg=0x68f029},
  104.     eula9={x=5,xs=67,y=19,ys=1,text='Если вы согласны с предоставленными условиями пользования',tx=1,ty=0,bg=0x303030,fg=0x68f029},
  105.     eula10={x=5,xs=67,y=21,ys=1,text='подтвердите согласием',tx=1,ty=0,bg=0x303030,fg=0x68f029},
  106.     eula11={x=30,xs=19,y=24,ys=1,text='СОГЛАСЕН/СОГЛАСНА',tx=1,ty=0,bg=0xf2b233,fg=0x111111},
  107.     eula12={x=51,xs=26,y=24,ys=1,text='discord автора:taoshi#2664',tx=0,ty=0,bg=0x103010,fg=0xf2b233},
  108.     eula13={x=1,xs=28,y=23,ys=1,text='по всем вопросам о товаре',tx=0,ty=0,bg=0x103010,fg=0xf2b233},
  109.     eula14={x=1,xs=28,y=24,ys=1,text='пишите владельцу варпа',tx=0,ty=0,bg=0x103010,fg=0xf2b233},
  110.  
  111.     player={x=3,xs=10,y=1,ys=1,text='name',tx=1,ty=0,bg=0x303030,fg=0x68f029},
  112.     status={x=3,xs=10,y=2,ys=1,text='player',tx=1,ty=0,bg=0x303030,fg=0x68f029},
  113.     mode={x=3,xs=10,y=3,ys=1,text='trade',tx=1,ty=0,bg=0x303030,fg=0x68f029},
  114.     totalitems={x=1,xs=19,y=24,ys=1,text=tostring(#market.inumList)..'items',tx=1,ty=0,bg=0x303030,fg=0x68f029},
  115.     cashname={x=3,xs=10,y=5,ys=1,text='НПЦ монеты',tx=0,ty=0,bg=0x303030,fg=0x68f029},
  116.     cash={x=3,xs=10,y=6,ys=1,text='NPC money:',tx=0,ty=0,bg=0x303030,fg=0x68f029},
  117.     balancename={x=3,xs=10,y=7,ys=1,text='ПИМ-мани:',tx=0,ty=0,bg=0x303030,fg=0x68f029},
  118.     balance={x=3,xs=10,y=8,ys=1,text='lua coins:',tx=0,ty=0,bg=0x303030,fg=0x68f029},
  119.  
  120.     one={x=17,xs=6,y=4,ys=3,text='1',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  121.     two={x=25,xs=6,y=4,ys=3,text='2',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  122.     free={x=33,xs=6,y=4,ys=3,text='3',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  123.     foo={x=17,xs=6,y=8,ys=3,text='4',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  124.     five={x=25,xs=6,y=8,ys=3,text='5',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  125.     six={x=33,xs=6,y=8,ys=3,text='6',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  126.     seven={x=17,xs=6,y=12,ys=3,text='7',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  127.     eight={x=25,xs=6,y=12,ys=3,text='8',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  128.     nine={x=33,xs=6,y=12,ys=3,text='9',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  129.     zero={x=25,xs=6,y=16,ys=3,text='0',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  130.     back={x=17,xs=6,y=16,ys=3,text='<-',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  131.     dot={x=33,xs=6,y=16,ys=3,text='.',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  132.     enternumber={x=33,xs=6,y=16,ys=3,text='OK',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  133.     set={x=41,xs=6,y=16,ys=3,text='ok',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  134.  
  135.     number={x=41,xs=12,y=8,ys=3,text='',tx=10,ty=1,bg=0x303030,fg=0x68f029},
  136.     select={x=41,xs=24,y=4,ys=3,text='item',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  137.     totalprice={x=41,xs=12,y=12,ys=3,text='',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  138.     incorrect={x=41,xs=20,y=12,ys=3,text='нехватка средств',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  139.     buyCancel={x=12,xs=45,y=10,ys=3,text='Извините, товар кончился. Вычтенные средства возвращены',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  140.  
  141.     newname={x=26,xs=4,y=16,ys=3,text='newname',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  142.     acceptbuy={x=41,xs=24,y=16,ys=3,text='подтвердить',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  143.     cancel={x=34,xs=10,y=24,ys=1,text='назад',tx=2,ty=0,bg=0x303030,fg=0x68f029},
  144.     find={x=48,xs=10,y=24,ys=1,text='поиск',tx=2,ty=0,bg=0x303030,fg=0x68f029},
  145.     findInput={x=60,xs=10,y=24,ys=1,text='Найти:',tx=2,ty=0,bg=0x303030,fg=0x68f029},
  146.  
  147.     welcome={x=24,xs=32,y=12,ys=3,text='добро пожаловать в ПимМаркет',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  148.     name={x=32,xs=24,y=8,ys=3,text='name',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  149.     wait={x=27,xs=24,y=16,ys=3,text='ждём ответ сервера...',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  150.     entrance={x=3,xs=72,y=2,ys=22,text='',tx=1,ty=1,bg=0x141414,fg=color.blackLime},
  151.     pim1={x=26,xs=24,y=6,ys=12,text='',tx=1,ty=1,bg=0x404040,fg=0x68f029},
  152.     pim2={x=28,xs=20,y=7,ys=10,text='Встаньте на PIM',tx=2,ty=4,bg=0x202020,fg=0x68f029},
  153.     buy={x=30,xs=16,y=8,ys=3,text='Купить',tx=5,ty=1,bg=0x303030,fg=0x68f029},
  154.     sell={x=30,xs=16,y=12,ys=3,text='Продать',tx=5,ty=1,bg=0x303030,fg=0x68f029},
  155.     full={x=16,xs=39,y=10,ys=3,text='Ваш инвентарь полон. Доступ закрыт.',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  156.     transfer={x=23,xs=30,y=16,ys=3,text='Перевод другому игроку',tx=4,ty=1,bg=0x303030,fg=0x68f029},
  157.  
  158.     transfer_name={x=24,xs=28,y=10,ys=3,text='Введите имя для перевода',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  159.     transfer_value={x=25,xs=26,y=10,ys=3,text='Введите сумму перевода',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  160.     transfer_not_registered={x=28,xs=26,y=18,ys=3,text='Нет в базе данных',tx=5,ty=1,bg=0x303030,fg=0x68f029},
  161.     transfer_tooBig={x=28,xs=19,y=18,ys=3,text='У вас нет столько',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  162.     transfer_complite={x=29,xs=20,y=18,ys=3,text='Перевод завершён',tx=2,ty=1,bg=0x303030,fg=0x68f029},
  163.  
  164.     shopUp={x=3,xs=10,y=12,ys=5,text='ВВЕРХ',tx=2,ty=2,bg=0x303030,fg=0x68f029},
  165.     shopDown={x=3,xs=10,y=18,ys=5,text='ВНИЗ',tx=3,ty=2,bg=0x303030,fg=0x68f029},
  166.     shopTopRight={x=21,xs=55,y=1,ys=1,text='Available items                           к-во     цена',tx=0,ty=0,bg=0xc49029,fg=0x000000},
  167.     shopFillRight={x=21,xs=40,y=2,ys=21,text='',tx=0,ty=0,bg=0x303030,fg=0x68f029},
  168.     shopVert={x=68,xs=1,y=2,ys=21,text=' ',tx=0,ty=0,bg=0xc49029,fg=0x111111},
  169.     attention={x=1,xs=80,y=1,ys=23,text='Ваше поведение возмутительно! Прощаемся!!!',tx=23,ty=12,bg=0x33ff00,fg=0xff0033}
  170. }
  171.  
  172. --это обработчик экрана.
  173. --содержит все функции вызываемые кнопками
  174. --в том числе меняющие содержимое экрана
  175. market.screenActions={}
  176. market.screenActions.find=function()return market.find() end
  177. market.screenActions.eula11=function()return market.mainMenu() end
  178. market.screenActions.sell=function()return false end
  179. market.screenActions.buy=function()return market.inShopMenu()end
  180. market.screenActions.transfer=function()return market.transfer()end
  181. market.screenActions.transfer_not_registered=function()return market.transfer()end
  182. market.screenActions.transfer_tooBig=function()return market.transferValue()end
  183. market.screenActions.transfer_complite=function()return market.mainMenu()end
  184. market.screenActions.one=function()market.number=market.number..'1' return market.inputNumber(1) end
  185. market.screenActions.two=function()market.number=market.number..'2' return market.inputNumber(2) end
  186. market.screenActions.free=function()market.number=market.number..'3' return market.inputNumber(3) end
  187. market.screenActions.foo=function()market.number=market.number..'4' return market.inputNumber(4) end
  188. market.screenActions.five=function()market.number=market.number..'5' return market.inputNumber(5) end
  189. market.screenActions.six=function()market.number=market.number..'6' return market.inputNumber(6) end
  190. market.screenActions.seven=function()market.number=market.number..'7' return market.inputNumber(7) end
  191. market.screenActions.eight=function()market.number=market.number..'8' return market.inputNumber(8) end
  192. market.screenActions.nine=function()market.number=market.number..'9' return market.inputNumber(9) end
  193. market.screenActions.zero=function()market.number=market.number..'0' return market.inputNumber(0) end
  194. market.screenActions.dot=function()market.number=market.number..'.' return market.inputNumber('.')end
  195. market.screenActions.back=function()if #market.number > 0 then
  196.     market.number=string.sub(market.number,1,#market.number-1) return market.inputNumber('-') end end
  197. market.screenActions.enternumber=function() return market.inputNumber('n')  end
  198. market.screenActions.acceptbuy=function() return market.getNewBalance() end
  199. --================================================================
  200. market.screenActions.shopTopRight=function() end
  201. market.screenActions.shopVert=function() end
  202. market.screenActions.shopUp=function() if market.shopLine > 15 then
  203.     market.shopLine=market.shopLine-15 end return market.showMeYourCandyesBaby(market.itemlist,market.inumList) end
  204. market.screenActions.shopDown=function() if market.itemlist.size-15 > market.shopLine then
  205.     market.shopLine=market.shopLine+15 end return market.showMeYourCandyesBaby(market.itemlist,market.inumList) end
  206. market.screenActions.shopFillRight=function(_,y)--ловит выбор игроком предмета
  207.     market.selectedLine = y+market.shopLine-2
  208.     if market.selectedLine <= #market.inumList then
  209.     market.select=market.inumList[market.lot[y]]
  210.   selector.setSlot(1,{id=market.itemlist[market.select].name,dmg=market.itemlist[market.select].damage})
  211.       tap = tap+1
  212.       if tap == 1 then
  213.         return market.userSelect(y)
  214.       elseif pos ~= math.floor(y) then
  215.         market.select=market.inumList[market.lot[pos]]
  216.         tap = 1
  217.         market.userSelect(pos,color.blackLime)
  218.         market.select=market.inumList[market.lot[y]]
  219.         return market.userSelect(y)
  220.       end
  221.   tap = 0
  222.     market.button.select.text=market.itemlist[market.select].display_name
  223.     market.button.select.xs=#market.itemlist[market.select].display_name+4
  224.     return market[market.mode](market.selectedLine)
  225.     end
  226. end
  227.  
  228. market.userSelect=function(y,color)
  229.   pos = math.floor(y)
  230.   color = color or 0xf800f8
  231.   gpu.setActiveBuffer(zero)
  232.   gpu.setForeground(color)
  233.   gpu.set(21,pos,market.itemlist[market.select].display_name)
  234.   gpu.setActiveBuffer(one)
  235.   return true
  236. end
  237.  
  238. market.screenActions.set=function()return market.inputNumber('set') end
  239. market.screenActions.cancel=function()
  240.   tap = 0
  241.     market.number = '0'
  242.     market.totalprice = '0'
  243.     market.button.number.text='0'
  244.     market.button.totalprice.text='0'
  245.   selector.setSlot(1,nil)
  246.   if menu == 'trade' then return market.inShopMenu()
  247.   elseif menu == 'inShopMenu' then return market.mainMenu()
  248.   else end
  249.   return market.mainMenu()
  250.  
  251. end
  252. --====================================================================================
  253. market.screenActions.status=function()
  254.     if market.player.status=='owner' then
  255.         if market.mode=='trade' then market.mode = 'edit'  
  256.         else
  257.             if market.mode == 'edit' then market.mode = 'rename'
  258.             else
  259.                 market.mode = 'trade'
  260.             end
  261.         end
  262.     else
  263.         market.mode = 'trade'  
  264.     end
  265.     market.button.mode.text=market.mode
  266.     return market.place({'mode'})
  267. end
  268. --================================================================
  269. market.mainMenu=function()
  270.   menu='main'
  271.     market.screen={'sell','buy','transfer'}
  272.     return market.replace()
  273. end
  274.  
  275. --вызов меню набора номера.
  276. market.trade=function()
  277.   menu='trade'
  278.     market.screen={'status','one','two','free','foo','five','six','seven','eight',
  279.     'nine','zero','back','enternumber','cancel'}
  280.     market.replace()
  281.     return market.place({'mode','number','select','totalprice','balancename','balance','cash','cashname','player'})
  282. end
  283.  
  284. --меню владельца для ввода цены
  285. market.edit=function()
  286.     market.screen={'status','one','two','free','foo','five','six','seven','eight',
  287.     'nine','zero','back','set','dot','cancel'}
  288.     market.replace()
  289.     return market.place({'mode','number','select','balance','cash','cashname','player'})
  290. end
  291.  
  292. --меню владельца для наименования
  293. market.rename=function(line)
  294.     market.clear(0x202020)
  295.     market.place({'select','newname'})
  296.     market.screen={}
  297.     market.itemlist[market.inumList[line]].display_name = market.inputString()
  298.     market.save_toFile(market.itemlist)
  299.     return market.inShopMenu()
  300. end
  301.  
  302. market.inputString=function()
  303.     local loop = true
  304.     local name=''
  305.     while loop do
  306.         local _,_,ch,scd = event.pull('key_down')
  307.         if ch then
  308.             if ch>30 then
  309.                 name=name..unicode.char(ch)
  310.             end
  311.  
  312.             if ch == 8 then name=string.sub(name,1,#name-1) end
  313.             if ch==0 and scd==211 then name=string.sub(name,1,#name-1) end
  314.             if ch==13 then loop = false end
  315.         market.button.newname.text=name..' '
  316.         market.button.newname.xs=#name+4
  317.         market.place({'newname'})
  318.         end
  319.     end
  320.     market.button.newname.text=''
  321.     market.button.newname.xs=2
  322.     return name
  323. end
  324.  
  325. --скромно перерисовывает поле цифрового ввода и следит за ним
  326. market.inputNumber=function(n)
  327.     if n == 'set' then return market.setPrice() end
  328.     if n == 'n' then return market.acceptBuy() end
  329.     if market.mode == 'trade' then
  330.         if tonumber(market.number) and tonumber(market.number)> market.itemlist[market.select].qty then
  331.                 market.number = tostring(market.itemlist[market.select].qty)
  332.         end
  333.         if #market.number > 5 then
  334.             if tonumber(market.number) and tonumber(market.number) > 999 then
  335.                 market.number = tostring(math.floor(999))
  336.             end
  337.         end
  338.     end
  339.     market.button.number.text = market.number..' '
  340.     market.button.number.xs = #market.itemlist[market.select].display_name+4
  341.     market.button.number.tx =
  342.     (#market.itemlist[market.select].display_name+4)/2-#market.button.number.text/2
  343.     local items= tonumber(market.number) or 0
  344.     local count= tonumber(market.itemlist[market.select].sell_price) or 0
  345.     market.button.totalprice.text = tostring((items*count))..'   '
  346.     market.button.totalprice.xs = #market.itemlist[market.select].display_name+4
  347.     market.button.totalprice.tx =
  348.     (#market.itemlist[market.select].display_name+4)/2-#market.button.totalprice.text/2
  349.     if market.mode == 'trade' then return market.place({'number','totalprice'}) end
  350.     return market.place({'number'})
  351. end
  352.  
  353. --обновляет состояние инвентаря, пишет кеш и баланс
  354. market.updateMoney=function()
  355.     market.player.cash=market.findCash()
  356.     market.button.cash.text=tostring(math.floor(market.player.cash))
  357.     market.button.balance.text=tostring(market.player.balance)
  358.     return true
  359. end
  360.  
  361. --проверяет есть ли у покупателя чем расплатиться
  362. market.checkPlayerMoney=function()
  363.     return tonumber(market.player.cash) + tonumber(market.player.balance)
  364.     >= tonumber(market.button.totalprice.text)
  365. end
  366.  
  367. --запрашивает подтверждение выбора и количества
  368. --осуществляет вызов продажи либо продаёт изымая нал/баланс
  369. market.acceptBuy=function()
  370.     --узнаём суммарную платёжеспособность покупателя
  371.     if market.checkPlayerMoney() then
  372.         market.screen={'acceptbuy','buyCancel','cancel'}
  373.         market.place({'acceptbuy'})
  374.     end
  375. end
  376. --на основе объёма покупки производим действия с балансом
  377. market.getNewBalance=function()
  378.     market.inventory = market.chest.get_inventoryitemlist(pim)
  379.     market.updateMoney()
  380.     local totalprice = tonumber(market.button.totalprice.text) or 0
  381.     if not market.checkPlayerMoney() then --поже, нас пытались обмануть.
  382.         market.replace({'attention'})
  383.         os.sleep(2)
  384.         return market.inShopMenu()
  385.     end
  386.     local balance = tonumber(market.player.balance)
  387.     if balance > 0 then
  388.         --если баланс не ниже суммы покупки
  389.         if balance >= totalprice then
  390.                 market.substract = 0
  391.                 market.balanceOP=totalprice
  392.             else --баланс ниже суммы покупки, но не 0
  393.                 --число монет к изъятию
  394.                 market.substract = math.floor(totalprice-balance)+1
  395.                 --сумма вычета с баланса
  396.                 market.balanceOP = totalprice-market.substract
  397.         end
  398.     else--если баланс 0, то он не может стать меньше!
  399.         market.substract = math.floor(totalprice)+1
  400.         --для автозачисления сдачи на баланс
  401.         market.balanceOP = totalprice-market.substract
  402.     end
  403.     local msg = {name=market.player.name,op='buy',number=market.msgnum,value=market.balanceOP}
  404.     return market.serverPost(msg)
  405.            
  406. end
  407.  
  408. --завершает продажу. забирает валюту. выдаёт предметы
  409. market.finalizeBuy=function()
  410.     market.clear()
  411.     --число монет к изъятию
  412.     local price = market.substract
  413.     --пушим в сундук монеты = оплата покупки
  414.     market.chest.fromInvToInv(pim,market.money,price,'pushItem')
  415.  
  416.     local id=market.select--рав-имя предмета
  417.   local damage=market.itemlist[id].damage
  418.   local count = 0
  419.   if tonumber(market.number) then count = tonumber(market.number) end
  420.     --пуллим из сундука = выдача товара
  421.     market[market.workmode].fromInvToInv(market.chestShop,id,count,'pullItem',price,damage)
  422.  
  423.     market.itemlist[id].qty=market.itemlist[id].qty - count
  424.     return market.inShopMenu()
  425. end
  426.  
  427. --завершает сессию установки цены овнером
  428. market.setPrice = function()
  429.     market.itemlist[market.select].sell_price = market.number
  430.     market.save_toFile(market.itemlist)
  431.     return market.inShopMenu()
  432. end
  433.  
  434. market.find = function()
  435. --market.place({'findInput'})
  436. --local name = market.inputString()
  437.  
  438. return true
  439. end
  440. --проверка наличия аккаунта.
  441. function market.isRegistered(bool)
  442.     market.clear(0x202020)
  443.     if not bool then
  444.         market.screen={'transfer_not_registered','cancel'}
  445.         return market.replace()
  446.     end
  447.     return market.transferValue()
  448. end
  449. --завершение трансфера. вывод уведомления
  450. function market.transferComplite()
  451.     market.screen={'transfer_complite'}
  452.     return market.replace()
  453. end
  454. --меню трансфера
  455. market.transfer=function()
  456.     market.clear(0x202020)
  457.     market.place({'transfer_name','newname','cancel'})
  458.     market.screen={'cancel'}
  459.     market.select = market.inputString()
  460.     local msg={name=market.player.name,name2=market.select,op='isRegistered',number=market.msgnum,value='0'}
  461.     return market.serverPost(msg)
  462. end
  463. market.transferValue=function()
  464.     market.clear(0x202020)
  465.     market.place({'transfer_value','newname','cancel'})
  466.     market.screen={'cancel'}
  467.     market.number ='not number'
  468.     while not tonumber(market.number) do
  469.         market.number = market.inputString()
  470.     end
  471.     if tonumber(market.player.balance) >= tonumber(market.number) then
  472.         local msg={name=market.player.name,name2=market.select,op='transfer',number=market.msgnum,value=market.number}
  473.         return market.serverPost(msg)   --market.inShopMenu()
  474.     else
  475.         market.screen = {'transfer_tooBig','cancel'}
  476.         return market.replace()
  477.     end
  478. end
  479. --==================================================================
  480. --pim & chest - components contains inventory
  481. --inventoryList - itemlist of csanning inventory
  482. --item_raw_name, count - raw name of item and count for migrate
  483. --op - type of operation in string format. itemPull or itemPush
  484. --device - определяет проверяемый инвентарь
  485. --передаёт выбранный предмет itemid в количестве count из целевого в назначенный инвентарь
  486. --параметр передачи задаётся агр. 'op'=itemPull or itemPush
  487. function market.chest.fromInvToInv(device,raw_name,count, op, damage)
  488.     local c, legalSlots=count, {}
  489.     local inventory=device.getAllStacks()
  490.     for pos,slot in pairs(inventory) do
  491.     local stack = slot.all()
  492.     local damage = 'damage'
  493.     if not stack[damage] then damage = 'dmg' end
  494.         if raw_name == stack.id..'&&'..stack[damage] then
  495.             table.insert(legalSlots, pos)
  496.         end
  497.     end
  498.  
  499.     for slot in pairs(legalSlots)do
  500.         local currentItem = device.getStackInSlot(legalSlots[slot])
  501.         local available=currentItem.qty
  502.         if c > 0 then
  503.             if c > available then
  504.                 c=c-available
  505.                 pim[op]('down',legalSlots[slot],available)--из слота в назначение
  506.             else
  507.                 pim[op]('down',legalSlots[slot],c)--остатки меньше стака
  508.                 c=0
  509.             end
  510.         end
  511.     end
  512.     return true
  513. end
  514.  
  515. function market.buyCancel(price)
  516.     market.me.fromInvToInv(me, market.money, price)
  517.     market.screen={'buyCancel','cancel'}
  518.     return market.replace()
  519. end
  520.  
  521. --!!!эта функция только выдаёт предметы!!!
  522. function market.me.fromInvToInv(_,id,count, _, price,damage)
  523.   local c=count or 0
  524.     local item=market.me.getItemDetail(id,damage)
  525.  
  526.     if not item or item.size < count then --предметы кончились. отмена покупки
  527.         return market.buyCancel(price)
  528.     end
  529.     local fp={id=item.name,dmg=item.damage}
  530.     while c > 0 do
  531.         if c > item.maxSize then
  532.             c=c-item.maxSize
  533.             me.exportItem(fp,'up',item.maxSize)
  534.         else
  535.             me.exportItem(fp,'up',c)
  536.             c=0
  537.         end
  538.     end
  539.     return true
  540. end
  541. --поиск требуемого предмета в ме хранилище
  542. function market.me.getItemDetail(id,damage)
  543.   local name=string.gsub(id,'&&'..damage,'')
  544.     local item=me.getItemsInNetwork({name=name,damage=damage})[1]
  545.   return item
  546. end
  547.  
  548. function market.findCash()
  549.     local cash, slots = 0, 0
  550.     if market.inventory[market.pimmoney] then
  551.         cash = market.inventory[market.pimmoney].qty
  552.         slots = market.inventory[market.pimmoney].slots
  553.     end
  554.     return cash,slots
  555. end
  556. --=============================================================
  557. --displayet items availabled for trading
  558. --создание экрана доступных к покупке предметов
  559. function market.showMeYourCandyesBaby(itemlist,inumList)
  560.   tap = 0
  561.   selector.setSlot(1,nil)
  562.     local pos=market.shopLine
  563.     local total=#inumList
  564.     local qty=0
  565.     market.lot={}
  566.   local y=2
  567.     --поиск предметов с к-вом больше чем 1
  568.     while pos <= total do
  569.         local item=inumList[pos]
  570.         if itemlist[item] and tonumber(itemlist[item].qty) > 0 then
  571.             market.lot[y]=pos
  572.             y=y+1
  573.         end
  574.         pos=pos+1
  575.         if y > 23 then pos=total+1 end
  576.     end
  577.  
  578.     gpu.setActiveBuffer(zero)
  579.     gpu.setBackground(0x111111)
  580.     gpu.setForeground(color.blackLime)
  581.     gpu.fill(21,2,42,21,' ')
  582.     gpu.fill(64,2,5,21,' ')
  583.     gpu.fill(72,2,5,21,' ')
  584.  
  585.     y=2
  586.     while y < 23 do
  587.         local item=inumList[market.lot[y]]
  588.     if itemlist[item] then
  589.         qty=tostring(math.floor(tonumber(itemlist[item].qty)))
  590.         gpu.set(21,y,itemlist[item].display_name)
  591.         gpu.set(64,y,qty)
  592.         gpu.set(72,y,tostring(itemlist[item].sell_price))
  593.     end
  594.         y=y+2
  595.     end
  596.  
  597.     gpu.setBackground(0x252525)
  598.     y=3
  599.     while y < 23 do
  600.         local item=inumList[market.lot[y]]
  601.     if itemlist[item] then
  602.         qty=tostring(math.floor(tonumber(itemlist[item].qty)))
  603.         gpu.set(21,y,"                                                       ")
  604.         gpu.set(21,y,itemlist[item].display_name)
  605.         gpu.set(64,y,qty)
  606.         gpu.set(72,y,tostring(itemlist[item].sell_price))
  607.     end
  608.         y=y+2
  609.     end
  610.  
  611.     gpu.setActiveBuffer(one)
  612.     return true
  613. end
  614.  
  615. market.isPlayerInventoryFull=function()
  616.     local emptySlot=false
  617.     for slot = 1,36 do
  618.         if not pim.getStackInSlot(slot) then emptySlot = true end
  619.     end
  620.     if not emptySlot then return market.full() end
  621.     return true
  622. end
  623. --обновим список предметов в МЕ
  624. market.itemListReplace=function()
  625.     market.inumList={}
  626.     market.chestList=market[market.workmode].get_inventoryitemlist(market.chestShop)
  627.     market.merge()
  628.     market.sort()
  629. end
  630. --отрисовывает поля меню выбора товара
  631. market.inShopMenu=function()
  632.   menu='inShopMenu'
  633.     --заглядываем в инвентарь игрока. просто любопытство, не более
  634.     market.inventory = market.chest.get_inventoryitemlist(pim)
  635.     --проверка на наличие свободных слотов у покупателя. если их нет - прощаемся
  636.     market.isPlayerInventoryFull()
  637.     --обновляем список товаров в магазине
  638.     market.itemListReplace()
  639.     --убираем из списка то, что не хотим показывать в списке товаров. Это либо нпц мани, либо аналогичный предмет
  640.     for n in pairs (market.inumList) do
  641.         if market.itemlist[market.inumList[n]].display_name=='gt.blockmetal4.12.name' then table.remove(market.inumList, n) end
  642.         if market.itemlist[market.inumList[n]].name==money.name then table.remove(market.inumList, n) end
  643.     if market.itemlist[market.inumList[n]].qty < 2 then table.remove(market.inumList, n) end
  644.   end
  645.     market.number=''
  646.     market.button.number.text=''
  647.    
  648.     --находим наличку в инвентаре игрока
  649.     market.updateMoney()
  650.     market.button.totalprice.text='0'
  651.     market.button.totalitems.text=#market.inumList..' type of items available'
  652.     market.screen={'status','shopUp','shopDown','shopFillRight','cancel','find'}
  653.     market.replace()
  654.     market.place({'shopVert','shopTopRight','mode','totalitems','balancename','balance','cash','cashname','player'})
  655.     return market.showMeYourCandyesBaby(market.itemlist,market.inumList)
  656. end
  657. --если инвентарь игрока полон
  658. market.full=function()
  659.     market.clear()
  660.     return market.place({'full'})
  661. end
  662. --===============================================
  663. --==--==--==--==--==--==--==--==--==--==--==--
  664. --сюда попадаем получая эвент  touch
  665. --эта функция обрабатывает касания экрана.
  666. --ориентируясь по списку в листе market.screen
  667. --вызывает одноименный кнопке метод в том случае,
  668. --если имя в эвенте совпадает с именем инвентаря на пим
  669. function market.screenDriver(e)
  670.     local x,y,name = e[3],e[4],e[6]
  671.     if name == market.player.name then
  672.         for f,string in pairs (market.screen) do
  673.             local button=market.button[string]
  674.             local a=(x >= button.x and x <= (button.xs+button.x-1)) and (y >= (button.y) and y <= (button.ys+button.y-1))
  675.             if a then
  676.                 return market.screenActions[market.screen[f]](x,y)
  677.             end
  678.         end
  679.     end
  680. end
  681. --==--==--==--==--==--==--==--==--==--==--==--
  682. --сюда попадает получая эвент player_on
  683. function market.pimWho(e)
  684.     --=================================
  685.     local who,uid=e[2],e[3]
  686.     market.events.touch='screenDriver'
  687.     market.events.player_on=nil
  688.     market.events.player_off='pimByeBye'
  689.     market.mode='trade'
  690.  
  691.     market.player.name=who
  692.     market.player.uid=uid
  693.     market.player.status = 'player'
  694.     for f=1, #market.owner do
  695.         if market.owner[f].UUID==uid and market.owner[f].name==who then
  696.             market.player.status = 'owner'
  697.         end
  698.     end
  699.     market.button.mode.text='trade'
  700.     market.button.status.text=market.player.status
  701.     market.button.player.text=market.player.name
  702.     market.money = market.pimmoney
  703.  
  704.     --здороваемся
  705.     market.button.name.text=who
  706.     market.button.name.xs=#who+4
  707.     market.button.name.x=36-#who/2
  708.     market.replace({'welcome','name','wait'})
  709.     --делаем запрос баланса на сервер
  710.     local msg={name=market.player.name,op='enter',number=market.msgnum,value='0'}
  711.     return market.serverPost(msg)
  712. end
  713.  
  714. --очистка и создание экрана ожидания
  715. --сюда попадаем получая эвент player_off
  716. function market.pimByeBye()
  717.     market.events.touch=nil
  718.     market.events.player_off=nil
  719.     market.events.player_on='pimWho'
  720.     market.player={}
  721.     market.inventory={}
  722.     market.screen={}
  723.     market.shopLine=1
  724.   selector.setSlot(1,nil)
  725.     return market.screenInit()
  726. end
  727. --=============================================================
  728. --сортируем лист в алфавитном порядке
  729. function market.sort()
  730.     local index=#market.inumList
  731.     local pos=1
  732.     while index > pos do
  733.         for int = index, pos, -1 do
  734.             if market.inumList[int] < market.inumList[pos] then
  735.                 market.inumList[pos], market.inumList[int] = market.inumList[int], market.inumList[pos]
  736.             end
  737.             if market.inumList[int] > market.inumList[index] then
  738.                 market.inumList[index], market.inumList[int] = market.inumList[int], market.inumList[index]
  739.             end
  740.         end
  741.         index=index-1
  742.         pos=pos+1
  743.     end
  744. end
  745. --подшивает актульный список предметов к основному
  746. function market.merge()
  747.     local index,size=1,market.chestList.size
  748.     market.chestList.size=nil
  749.     if not market.itemlist.size then market.itemlist.size=0 end
  750.     for id in pairs(market.chestList) do
  751.         market.inumList[index]=id
  752.         if type (market.itemlist[id]) == 'number' then do end
  753.   else
  754.      
  755.             if not market.itemlist[id] then
  756.                 market.itemlist[id]={}
  757.         market.itemlist[id].display_name = market.chestList[id].display_name
  758.         market.itemlist[id].name = market.chestList[id].name
  759.         market.itemlist[id].damage = market.chestList[id].damage
  760.                 market.itemlist[id].sell_price = '9999'
  761.                 market.itemlist[id].buy_price = '0'
  762.        
  763.                 --уменьшает к-во указанное в таблице на 1 относительно фактического к-ва предметов
  764.                 market.itemlist.size=market.itemlist.size+1
  765.             end
  766.      
  767.       market.itemlist[id].qty=market.chestList[id].qty-1
  768.       market.itemlist[id].slots=market.chestList[id].slots
  769.         end
  770.         index=index+1
  771.     end
  772.     market.chestList.size=size
  773. end
  774. --=================================================
  775. --scan inventory. return items table.
  776. --из самостоятельной одноцелевой в многоцелевую
  777. --на вход подать используемый компонент: пим или сундук.
  778. function market.chest.get_inventoryitemlist(device)
  779.     local inventory={}
  780.     inventory.size=0
  781.     local item=''
  782.  
  783.   local items=device.getAllStacks()
  784.   for n,slot in pairs(items) do item=slot.all()
  785.     --item получает поля display_name,dmg,id,name,nbt_hash,ore_dict
  786.         inventory=market.chest.setInventoryList(inventory,item,n)
  787.     end
  788.  
  789.     return inventory
  790. end
  791.  
  792. function market.me.get_inventoryitemlist()
  793.     local me_inventory={}
  794.     me_inventory.size=0
  795.     local item=''
  796.     local available=me.getItemsInNetwork()
  797.     local loop=#available
  798.    
  799.     for n=1,loop do
  800.         item=available[n]
  801.         me_inventory=market.me.setInventoryList(me_inventory,item,n)
  802.     end
  803.     return me_inventory
  804. end
  805.  
  806. function market.me.setInventoryList(me_inventory,item,n)
  807.   local id=''
  808.   --здесь item - это предмет из списка ме-сети
  809.     if item and not me_inventory[item.name..'&&'..item.damage] then
  810.         id=item.name..'&&'..item.damage
  811.         me_inventory[id]={}
  812.         me_inventory[id].display_name=item.label
  813.     me_inventory[id].damage=item.damage
  814.         me_inventory[id].sell_price='9999'
  815.         me_inventory[id].buy_price='0'
  816.         me_inventory[id].name=item.name
  817.         me_inventory[id].qty=item.size
  818.         me_inventory[id].slots={n}--индекс предмета в ме
  819.         me_inventory.size=me_inventory.size+1
  820.     else if item then
  821.         --print('эта часть точно работает?')
  822.         id=item.name..'&&'..item.damage
  823.         --me_inventory[id].qty=me_inventory[id].qty+item.size
  824.     me_inventory[id].qty=item.size
  825.         me_inventory[id].slots[#me_inventory[id].slots+1]=n
  826.         end
  827.     end
  828.     return me_inventory
  829. end
  830.  
  831. function market.chest.setInventoryList(inventory,item,n)
  832.   local id=''
  833.     if item then id=item.id..'&&'..item.dmg end
  834.   if not inventory[id] then
  835.         id=item.id..'&&'..item.dmg
  836.         inventory[id]={}
  837.         inventory[id].display_name=item.display_name
  838.     inventory[id].damage=item.dmg
  839.         inventory[id].sell_price=item.sell_price
  840.         inventory[id].buy_price=item.buy_price
  841.         inventory[id].name=item.id
  842.         inventory[id].qty=item.qty
  843.         inventory[id].slots={n}--номера слотов занимаемых предметом
  844.         inventory.size=inventory.size+1
  845.     else if item then
  846.         id=item.id..'&&'..item.dmg
  847.         inventory[id].qty=inventory[id].qty+item.qty
  848.         inventory[id].slots[#inventory[id].slots+1]=n
  849.         end
  850.     end
  851.     return inventory
  852. end
  853.  
  854. --load itemlist from file
  855. function market.load_fromFile()
  856.     --market.itemlist = {}
  857.     if not fs.exists('home/db.market') then
  858.         local db=io.open('db.market','w')
  859.         db:write('0'..'\n')
  860.     db:close()
  861.     end
  862.         local db=io.open('db.market','r')
  863.         local size=db:read('*line')
  864.         if tonumber(size) then
  865.             market.itemlist.size=size
  866.       local name,id,damage,display_name,sell_price,buy_price='','','','','',''
  867.        
  868.             for _=1, size do
  869.                 name=tostring(db:read('*line'))
  870.         display_name = tostring(db:read('*line'))
  871.         damage = tonumber(db:read('*line'))
  872.         sell_price=tonumber(db:read('*line'))
  873.         buy_price=tonumber(db:read('*line'))
  874.         id=name..'&&'..tostring(damage)
  875.        
  876.           market.itemlist[id]={
  877.             display_name=display_name,
  878.             name=name,
  879.             damage=damage,
  880.             sell_price=sell_price,
  881.             buy_price=buy_price
  882.          
  883.           }
  884.             end
  885.         end
  886.         db:close()
  887.     return true--itemlist
  888. end
  889.  
  890. --save itemlist to file
  891. function market.save_toFile()
  892.   local size=market.itemlist.size
  893.   market.itemlist.size=nil
  894.     local db=io.open('db.market','w')
  895.     db:write(tostring(size)..'\n')
  896.  
  897.     for id in pairs(market.itemlist)do
  898.         db:write(tostring(market.itemlist[id].name)..'\n')
  899.         db:write(tostring(market.itemlist[id].display_name)..'\n')
  900.     db:write(tostring(market.itemlist[id].damage)..'\n')
  901.         db:write(tostring(market.itemlist[id].sell_price)..'\n')
  902.         db:write(tostring(market.itemlist[id].buy_price)..'\n')
  903.     end
  904.  
  905.     market.itemlist.size=size
  906.     db:close()
  907.     return true
  908. end
  909.  
  910. --замена кнопок экрана: вызов очистки и прорисовки
  911. function market.replace()
  912.     market.clear(0x111111)
  913.  
  914.     return market.place(market.screen)
  915. end
  916.  
  917. --Очистка экрана ничего особенного. Обычный велосипед
  918. market.clear=function(background)
  919.     gpu.setActiveBuffer(zero)  
  920.     if not background then background=0x111111 end
  921.     local x,y=gpu.getViewport()
  922.     gpu.setBackground(background)
  923.     gpu.fill(1,1,x,y,' ')
  924.     gpu.setActiveBuffer(one)
  925.     return true
  926. end
  927. --размещает текущие одноцветные кнопки на экране
  928. market.place=function(buttons)
  929.     gpu.setActiveBuffer(zero)
  930.     for n in pairs(buttons)do
  931.         local b=market.button[buttons[n]]
  932.         gpu.setBackground(b.bg)
  933.         gpu.fill((b.x),(b.y),(b.xs),(b.ys),' ')
  934.         gpu.setForeground(b.fg)
  935.         gpu.set((b.x)+(b.tx),(b.y)+(b.ty),b.text)
  936.     end
  937.     gpu.setActiveBuffer(one)
  938.     return true
  939. end
  940.  
  941. function market.screenInit()
  942.     market.clear(0x202020)
  943.     return market.place({'entrance','pim1','pim2'})
  944. end
  945.  
  946. market.unlinked=function(address)
  947.     market.serverAddress = address
  948.     market.link = 'linked'
  949.     local msg={name='pimmarket',op='getOwners',number=market.msgnum,value=0}
  950.     return market.serverPost(msg)
  951. end
  952.  
  953. market.linked=function() return 'server already linked' end
  954.  
  955. --пытаемся получить сообщение подтверждающее операцию
  956. market.serverResponse=function(e)
  957.  
  958.     local msg,address = e[6],e[3]
  959.     --address - адрес отправителя
  960.     msg=serialization.unserialize(msg) or ''
  961.     --а нам ли сообщение?
  962.     if msg == 'name' or not msg.sender then return true
  963.     end
  964.     if msg.sender ~= modem.address then return true
  965.     end
  966.         --msg.number,msg.name,msg.value
  967.         --msg.op = {enter|buy|sell|balanceIn|balanceOut|
  968.         --getOwners|transfer|isRegistered}
  969.     modem.close(port)
  970.     market.events.modem_message=nil
  971.         --процедура регистрации терминала завершена. сохраняем адрес сервера
  972.     if msg.op=='connect'  then
  973.         return market[market.link](address)
  974.     end
  975.     if not market.serverAddress==address then
  976.         return "undefined server. access blocked"
  977.     end
  978.     if msg.name and msg.name == market.player.name then
  979.         market.player.balance = msg.balance
  980.         market.msgnum = market.msgnum + 1
  981.     end
  982.     --переход по коду совершённой операции
  983.     return market.modem[msg.op](msg)
  984. end
  985.  
  986. market.modem={}
  987. function market.modem.getOwners(msg)
  988.     market.owner=msg.owners
  989.  
  990.   if market.owner and market.owner[1] then
  991.     for _,user in pairs(computer.users())do
  992.       computer.removeUser(user)
  993.     end
  994.    
  995.     for _,owner in pairs(market.owner)do
  996.       computer.addUser(owner)
  997.     end
  998.   end
  999.   function component.keyboard.isAltDown()return end--:trollface:
  1000.     market.events.player_on='pimWho'
  1001.     return market.screenInit()
  1002. end
  1003. --запрашиваемый игрок не найден
  1004. function market.modem.regFalse(_)
  1005.     return market.isRegistered(false)
  1006. end
  1007. --запрашиваемый игрок найден
  1008. function market.modem.regTrue(_)
  1009.     return market.isRegistered(true)
  1010. end
  1011. --завершение перевода средств
  1012. function market.modem.transfer(_)
  1013.     return market.transferComplite()
  1014. end
  1015. --завершение покупки
  1016. function market.modem.buy(_)
  1017.     return market.finalizeBuy()
  1018. end
  1019. function market.modem.sell(_)
  1020.  
  1021. end
  1022. function market.modem.balanceIn(_)
  1023.  
  1024. end
  1025. function market.modem.balanceOut(_)
  1026.    
  1027. end
  1028. --от сервера получен баланс игрока
  1029. function market.modem.enter(_)
  1030.     return market.eula()
  1031. end
  1032.  
  1033. function market.eula()
  1034.     market.clear()
  1035.     market.button.eula14.text='пишите '..market.owner[1].name
  1036.     market.place({'eula1','eula2','eula3','eula4','eula5','eula6','eula7','eula9','eula10','eula12','eula13','eula14'})
  1037.     market.screen={'eula11'}
  1038.     return market.place(market.screen)
  1039. end
  1040.  
  1041. --отправка сообщений на сервер
  1042. function market.serverPost(msg)
  1043.     msg=serialization.serialize(msg)
  1044.     modem.broadcast(send,msg)
  1045.     --включаем прослушивание порта и добавляем в список обрабатываемых эвентов
  1046.     modem.open(port)
  1047.     market.events.modem_message='serverResponse'
  1048.     return true
  1049. end
  1050.  
  1051. function market.serverAccess()
  1052.     market.msgnum=tonumber('0x'..string.sub(modem.address,1,6))
  1053.     local msg={name='pimmarket',op='connect',number=market.msgnum,value=0}
  1054.     return market.serverPost(msg)
  1055. end
  1056.  
  1057. --перехват ивентов. надстройка над ОС
  1058. function computer.pullSignal(...)
  1059.     local e={pullSignal(...)}
  1060.     for event in pairs(market.events)do
  1061.         if event==e[1] then
  1062.             return market[market.events[event]](e)
  1063.         end
  1064.   end
  1065.     return table.unpack(e)
  1066. end
  1067. function adaptive()
  1068.   gpu.setResolution(76,24)
  1069.     gpu.allocateBuffer(1,1)
  1070.   return component.screen.getResolution()
  1071. end
  1072. --инициализация
  1073. function market.init()
  1074.     --надо сперва чекать сундук, затем на его основе подтягивать поля с ценой из файла
  1075.     --либо наоборот. в любом случае сундук апдейдит лист в файле и сохраняет его
  1076.     sx,sy = adaptive()
  1077.     market.mode='trade'
  1078.     print('load database from file...')
  1079.     market.load_fromFile()
  1080.     print('file loading succesfull')
  1081.     print('getting chest inventory...')
  1082.   --поместим список предметов из МЕ-сети в chestList
  1083.     market.chestList=market[market.workmode].get_inventoryitemlist(market.chestShop)
  1084.   --chestList.size = число позиций в ме сети
  1085.     --теперь апдейт листа путем добавления полей с отсутствующими айди из сундука в итемлист
  1086.     --а market.inumList будет содержать указатели присутствующих товаров в itemList
  1087.     print('merge tables')
  1088.   --
  1089.     market.merge()
  1090.     --сортировка нумерного листа торговли в алфавитный порядок
  1091.     print('sorting available items...')
  1092.     market.sort()
  1093.     print('save current database...')
  1094.     --и сохранение нового листа на диск?. когда, если не сейчас?
  1095.     market.save_toFile(market.itemlist)
  1096.     print('initialization complete')
  1097.     print('waiting for server access..')
  1098.     market.events.touch=nil
  1099.     market.events.player_off=nil
  1100.     market.events.player_on=nil
  1101.     return market.serverAccess()
  1102. end
  1103.  
  1104. market.init()
  1105. return market
Comments
  • taoshi
    80 days (edited)
    # text 0.40 KB | 0 0
    1. обновлено.
    2. добавлено удаление обработки кнопки alt во время работы
    3. добавлена установка списка пользователей в соответствии с админ листом
    4. не добавлено, но начато: адаптация разрешения экрана под текущий аспект монитора
Add Comment
Please, Sign In to add comment