Alex1979

Bank_experience

Jul 30th, 2015
341
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ----------------------------------------------------
  2. --                    Программа                   --  
  3. --         для хранения опыта в Майнкрафт         --
  4. --            с привязкой к базе SQL              --  
  5. --          проект http://computercraft.ru        --  
  6. --                 2015, © AlexCC                 --  
  7. ----------------------------------------------------
  8. local event=require("event")
  9. local term=require("term")
  10. local unicode=require("unicode")
  11. local computer=require("computer")
  12. local component=require("component")
  13. local radar=component.openperipheral_sensor
  14. local cb=component.command_block
  15. local gpu=component.gpu
  16. local inet = component.internet
  17. gpu.setDepth(4)
  18.  
  19. -- константы
  20. local VERSION = "0.1.1"
  21. local KEY = '1111111qwerty55555'
  22. -- Var
  23. local expPers = 0
  24. local expBank = 0
  25. local CLIENT = nil
  26. local TRANSFERCOUNT  = 50
  27.  
  28. -- ========= Кнопки ============ --
  29. Button = {}
  30. Button.__index = Button
  31. function Button.new(func, x, y, text, fore, back, width, nu)
  32.     self = setmetatable({}, Button)
  33.     self.form = '[ '
  34.     if width == nil then width = 0
  35.         else width = (width - unicode.len(text))-4
  36.     end
  37.     for i=1, math.floor(width/2) do
  38.         self.form = self.form.. ' '
  39.     end
  40.     self.form = self.form..text
  41.     for i=1, math.ceil(width/2) do
  42.         self.form = self.form.. ' '
  43.     end
  44.     self.form = self.form..' ]'
  45.     self.func = func
  46.     self.x = math.floor(x); self.y = math.floor(y)
  47.     self.fore = fore
  48.     self.back = back
  49.     self.visible = true
  50.     self.notupdate = nu or false
  51.     return self
  52. end
  53.  
  54. function Button:draw(fore, back)
  55.     if self.visible then
  56.         local fore = fore or self.fore
  57.         local back = back or self.back
  58.         gpu.setForeground(fore)
  59.         gpu.setBackground(back)
  60.         gpu.set(self.x, self.y, self.form)
  61.     end
  62. end
  63.  
  64. function Button:click(x, y)
  65.     if self.visible then
  66.         if y == self.y then
  67.             if x >= self.x and x < self.x + unicode.len(self.form) then
  68.                 self:draw(self.back, self.fore)
  69.                 local data = self.func()
  70.                 if not self.notupdate then self:draw() end
  71.                 return true, data
  72.             end
  73.         end
  74.     end
  75.   return false
  76. end
  77.  
  78. function buttonNew(buttons, func, x, y, text, fore, back, width, notupdate)
  79.     button = Button.new(func, x, y, text, fore, back, width, notupdate)
  80.     table.insert(buttons, button)
  81.     return button
  82. end
  83.  
  84. function buttonsDraw(buttons)
  85.     for i=1, #buttons do
  86.         buttons[i]:draw()
  87.     end
  88. end
  89.  
  90. function buttonsClick(buttons, x, y)
  91.     for i=1, #buttons do
  92.         ok, data = buttons[i]:click(x, y)
  93.         if ok then return data end
  94.     end
  95.     return nil
  96. end
  97. --===================================--
  98.  
  99. function setCenterText(y, w, text)
  100.     len=unicode.len(text)
  101.     local x=(w/2)-(len/2)
  102.     gpu.set(x, y, text)
  103. end
  104.  
  105. function runCommand(str) -- наша КБ-шка, куда же без нее)
  106.     cb.setCommand(str)
  107.     cb.executeCommand()
  108. end
  109.  
  110. function get(url) -- получить ответ от сервера (опыт из базы SQL)
  111.   local request, reason = inet.request(url)
  112.   if not request then return false end
  113.   local text = ''
  114.         while true do
  115.             local data, reason = request.read()
  116.             if not data then
  117.               request.close()
  118.               break
  119.             elseif #data > 0 then
  120.               text = text..data
  121.             end
  122.         end
  123.   return text
  124. end
  125.  
  126. function getBankExp(nick)  -- получение значения  опыта в банке (SQL)
  127.     return get('http://computercraft.ru/*************.php?type=exp&auth='..KEY..'&nick='..nick..'&action=get')
  128. end
  129.  
  130. function addBankExp(nick, amount) -- прибавить опыт на счет (SQL)
  131.     return get('http://computercraft.ru/*************.php?type=exp&auth='..KEY..'&nick='..nick..'&action=add&value='..amount)
  132. end
  133.  
  134. function giveUserExp(nick, exp) -- выдать опыт клиенту через КБ
  135.     runCommand("xp "..exp.." "..nick)
  136. end
  137.  
  138. function setNullUserExp(nick, lvl)  -- обнулить опыт клиенту
  139.     runCommand("xp -"..lvl.."L "..nick)
  140. end
  141.  
  142. function getUserExp(nick)   -- получить текущий опыт клиента (радар OpenPeripheral)
  143.     local currentExp
  144.     local exp  = radar.getPlayerByName(nick).all().player.experience
  145.     if exp.level >= 31 then
  146.         currentExp =  3.5*exp.level^2-151.5*exp.level+2220
  147.     elseif exp.level >= 16 and exp.level <= 30 then
  148.         currentExp = 1.5*exp.level^2 - 29.5*exp.level + 360
  149.     elseif exp.level<=15 then
  150.         currentExp = 17*exp.level
  151.     end
  152.     -- вернем полный опыт в абсолютных единицах, а также текущий уровень
  153.     return math.floor(exp.levelProgress*exp.nextLevelXp + currentExp) , exp.level
  154. end
  155.  
  156. function  clearSetScr(x,y) -- чистим экранчик
  157.     gpu.setForeground(0xffffff)
  158.     gpu.setBackground(0x000000)
  159.     gpu.setResolution(x,y)
  160.     term.clear()
  161. end
  162.  
  163. function drawGuestWindow()  -- рисуем гостевое окошко, чистим пользователей, трансфер в "серединку"
  164.     users={computer.users()}
  165.     for i=1, #users do
  166.         computer.removeUser(users[i])
  167.     end
  168.     clearSetScr(44,20)
  169.     gpu.setForeground(0x0000ff)
  170.     print([[
  171.       ______             _    
  172.       | ___ \           | |  
  173.       | |_/ / __ _ _ __ | | __
  174.       | ___ \/ _` | '_ \| |/ /
  175.       | |_/ / (_| | | | |   <
  176.       \____/ \__,_|_| |_|_|\_\
  177.            _____    ______        
  178.           |  ___|   | ___ \      
  179.           | |____  _| |_/ /      
  180.           |  __\ \/ /  __/        
  181.           | |___>  <| |          
  182.           \____/_/\_\_|  
  183.     ]])
  184.     gpu.setForeground(0x0000ff)
  185.     setCenterText(18, 44,' Банк опыта ☭, ©AlexCC')
  186.     setCenterText(19,44,' Проект http://computercraft.ru, 2015')
  187.     buttonsDraw(guestButtons)
  188.     TRANSFERCOUNT = 50
  189. end
  190.  
  191. function drawMineWindow()  -- рисуем основное окошко для трансфера, лочим ПК на клиента
  192.     computer.addUser(CLIENT)
  193.     expPers, current_lvl = getUserExp(CLIENT)
  194.     expBank = getBankExp(CLIENT)
  195.     clearSetScr(40,14)
  196.     gpu.setBackground(0x1e1e1e)
  197.     gpu.fill(1,1,40,6,' ')
  198.     gpu.setForeground(0xffffff)
  199.     setCenterText(2,40,' Привет, '..CLIENT..'!')
  200.     gpu.setForeground(0xffdb00)
  201.     gpu.set(6,3,'Ваш опыт в Банке:      '..expBank..' ед.')
  202.     gpu.set(6,4,'Ваш текущий опыт:      '..expPers..' ед.')
  203.     gpu.set(6,5,'Ваш текущий уровень:   '..current_lvl)
  204.     gpu.set(1,1,"╔")
  205.     gpu.set(40,1,"╗")
  206.     gpu.set(1,6,"╚")
  207.     gpu.set(40,6,"╝")
  208.     for i  = 2, 5 do
  209.         gpu.set(1, i,"║")
  210.         gpu.set(40, i,"║")
  211.     end
  212.     gpu.set(2,1, string.rep("═",38))
  213.     gpu.set(2,6, string.rep("═",38))
  214.     gpu.setBackground(0x000000)
  215.     gpu.setForeground(0xffffff)
  216.     gpu.set(19, 8, TRANSFERCOUNT..' %')
  217.     buttonsDraw(menuButtons)
  218. end
  219.  
  220. function  transferExpToUser() -- клиент снимает с банка опыт
  221.     expPers, current_lvl = getUserExp(CLIENT) -- уточним еще раз опыт клиента, он мог измениться при открытой сессии(клиент выпил бутылочку опыта или убил паука рядом)
  222.     local trans_exp = math.floor(TRANSFERCOUNT * expBank/100)
  223.     giveUserExp(CLIENT, trans_exp)
  224.     addBankExp(CLIENT, -trans_exp)
  225.     drawMineWindow()
  226. end
  227.  
  228. function  transferExpToBank() -- клиент отправляет опыт в банк на хранение
  229.     expPers, current_lvl = getUserExp(CLIENT)
  230.     local trans_exp = math.floor(TRANSFERCOUNT * expPers/100)
  231.     setNullUserExp(CLIENT, current_lvl + 1) -- обнулим весь опыт
  232.     giveUserExp(CLIENT, expPers - trans_exp) -- и выдадим разницу, что было и что отправлено
  233.     addBankExp(CLIENT, trans_exp) -- отправим в банк опыт игрока, который он выбрал в процентном соотношении
  234.     drawMineWindow()
  235. end
  236.  
  237. function min1()  -- уменьшить значение трансфера
  238.    TRANSFERCOUNT = TRANSFERCOUNT - 1
  239.    if TRANSFERCOUNT < 0 then TRANSFERCOUNT = 0 end
  240.    drawTransfer()
  241. end
  242.  
  243. function min10() -- уменьшить значение трансфера
  244.    TRANSFERCOUNT = TRANSFERCOUNT - 10
  245.    if TRANSFERCOUNT < 0 then TRANSFERCOUNT = 0 end
  246.    drawTransfer()
  247. end
  248.  
  249. function plus1() -- увеличить значение трансфера
  250.    TRANSFERCOUNT = TRANSFERCOUNT + 1
  251.    if TRANSFERCOUNT > 100 then TRANSFERCOUNT = 100 end
  252.    drawTransfer()
  253. end
  254.  
  255. function plus10() -- увеличить значение трансфера
  256.    TRANSFERCOUNT = TRANSFERCOUNT + 10
  257.    if TRANSFERCOUNT > 100 then TRANSFERCOUNT = 100 end
  258.    drawTransfer()
  259. end
  260.  
  261. function drawTransfer() -- нарисовать текущее значение процентика перевода опыта
  262.    gpu.setForeground(0xffffff)
  263.     gpu.setBackground(0x000000)
  264.    gpu.fill(19,8, 5, 1,' ')
  265.    gpu.set(19, 8, TRANSFERCOUNT..' %')
  266. end
  267.  
  268. function operatiOnOnBank() -- цикл операций с опытом, пока не сдохнет ивентпулл или клиент не выйдет в гостевое окно
  269.     drawMineWindow()
  270.     while true do
  271.     local name, address, x, y = event.pull(60, 'touch')
  272.         if name == 'touch' then
  273.             local result = buttonsClick(menuButtons, x, y)
  274.             if result == 'exit' then break end
  275.         else
  276.             break
  277.         end
  278.     end
  279. end
  280. -- тут будут храниться кнопки (группы кнопок)
  281. menuButtons = {}
  282. guestButtons = {}
  283. -- рисуем кнопки
  284. buttonNew(guestButtons, operatiOnOnBank, 13, 15, " НАЧАТЬ РАБОТУ ", 0xFFFFFF, 0x0000FF, 11)
  285. buttonNew(menuButtons, min10, 2, 8, "-10", 0xFFFFFF, 0x0000FF, 4)
  286. buttonNew(menuButtons, min1, 10, 8, "-1", 0xFFFFFF, 0x0000FF, 4)
  287. buttonNew(menuButtons, plus1, 26, 8, "+1", 0xFFFFFF, 0x0000FF, 4)
  288. buttonNew(menuButtons, plus10, 33, 8, "+10", 0xFFFFFF, 0x0000FF, 4)
  289. buttonNew(menuButtons, transferExpToBank, 8, 10, " Положить опыт в Банк  ", 0xFFFFFF, 0x0000FF, 20)
  290. buttonNew(menuButtons, transferExpToUser, 8, 12, " Забрать опыт из Банка ", 0xFFFFFF, 0x0000FF, 20)
  291. buttonNew(menuButtons, function() return 'exit' end, 16, 14, " Выход ", 0xFFFFFF, 0xFF0000, 10)
  292.  
  293. -- главный цикл программы, висит гостевое окно, ПК ни на кого не залочен
  294. while true do
  295.     drawGuestWindow()
  296.     local e, _, x, y, _, nick = event.pull('touch')
  297.     -- если был клик мышкой - проверяем кнопки
  298.     if e == 'touch' then
  299.         CLIENT = nick
  300.         buttonsClick(guestButtons, x, y)
  301.     end
  302. end
RAW Paste Data