Guest User

railGui

a guest
Apr 14th, 2025
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.46 KB | Source Code | 0 0
  1. -- Globals --
  2. messageTimerKey = nil;
  3. message = "";
  4. selectedMinecartId = nil;
  5. minecartDetailsMode = false;
  6. helpMode = false;
  7. minecartDetector = peripheral.find("minecartDetector");
  8. rails = nil;
  9. minecarts = nil;
  10.  
  11. -- Functions --
  12. function addMessage(messageIn)
  13.     message = messageIn;
  14.     messageTimerKey = os.startTimer(3);
  15. end
  16.  
  17. function getSelectedMinecartRowNumber()
  18.     for i, minecart in pairs(minecarts) do
  19.         if (minecart.Id == selectedMinecartId) then
  20.             return i;
  21.         end
  22.     end
  23.     return -1;
  24. end
  25.  
  26. function detect()
  27.     rails = minecartDetector.listRails();
  28.     minecarts = minecartDetector.listMinecarts();
  29.  
  30.     if getSelectedMinecartRowNumber() == -1 then
  31.         if #minecarts==0 then
  32.             selectedMinecartId = nil;
  33.         else
  34.             selectedMinecartId = minecarts[1].Id;
  35.         end
  36.     end
  37. end
  38.  
  39. function previousMinecart()
  40.     detect();
  41.     local rowNumber = getSelectedMinecartRowNumber();
  42.     if rowNumber == -1 then
  43.         return
  44.     end
  45.  
  46.     if rowNumber < 2 then
  47.         selectedMinecartId = minecarts[1].Id;
  48.     else
  49.         selectedMinecartId = minecarts[rowNumber - 1].Id;
  50.     end
  51. end
  52.  
  53. function nextMinecart()
  54.     detect();
  55.     local rowNumber = getSelectedMinecartRowNumber();
  56.     if rowNumber == -1 then
  57.         return
  58.     end
  59.  
  60.     if rowNumber >= #minecarts then
  61.         selectedMinecartId = minecarts[#minecarts].Id;
  62.     else
  63.         selectedMinecartId = minecarts[rowNumber + 1].Id;
  64.     end
  65. end
  66.  
  67. function getColorForRail(rail)
  68.     if rail.X == 0 and rail.Z == 0 then
  69.         return colors.cyan;
  70.     end
  71.     return colors.blue;
  72. end
  73.  
  74. -- Draw UI --
  75. function draw()
  76.     detect();
  77.     pixels = {};
  78.  
  79.     for _, rail in pairs(rails) do
  80.         local key = "" .. rail.X .. ":" .. rail.Z;
  81.         pixels[key] = {};
  82.         pixels[key].bg = getColorForRail(rail);
  83.         pixels[key].x = rail.X;
  84.         pixels[key].z = rail.Z;
  85.         pixels[key].c = " ";
  86.         pixels[key].fg = colors.white;
  87.     end
  88.  
  89.     for _, minecart in pairs(minecarts) do
  90.         local key = "" .. math.floor(minecart.X) .. ":" .. math.floor(minecart.Z);
  91.         if pixels[key] == nil then
  92.             pixels[key] = {};
  93.             pixels[key].bg = colors.black;
  94.             pixels[key].x = math.floor(minecart.X);
  95.             pixels[key].z = math.floor(minecart.Z);
  96.         end
  97.         if minecart.Id == selectedMinecartId then
  98.             pixels[key].c = string.char(127);
  99.         else
  100.             pixels[key].c = string.char(143);
  101.         end
  102.         pixels[key].fg = colors.white;
  103.     end
  104.  
  105.     local w, h = term.getSize();
  106.  
  107.     if helpMode then
  108.         term.setBackgroundColor(colors.black);
  109.         term.setTextColor(colors.blue);
  110.         term.setCursorPos(w / 2 - 13, h / 2 - 4);
  111.         term.write("+------------------------+");
  112.         term.setCursorPos(w / 2 - 13, h / 2 - 3);
  113.         term.write("|   H  : show this page  |");
  114.         term.setCursorPos(w / 2 - 13, h / 2 - 2);
  115.         term.write("|   T  : exit to shell   |");
  116.         term.setCursorPos(w / 2 - 13, h / 2 - 1);
  117.         term.write("|  QE  : switch minecart |");
  118.         term.setCursorPos(w / 2 - 13, h / 2);
  119.         term.write("| WASD : move minecart   |");
  120.         term.setCursorPos(w / 2 - 13, h / 2 + 1);
  121.         term.write("|   X  : stop minecart   |");
  122.         term.setCursorPos(w / 2 - 13, h / 2 + 2);
  123.         term.write("|   Z  : show minecart   |");
  124.         term.setCursorPos(w / 2 - 13, h / 2 + 3);
  125.         term.write("+------------------------+");
  126.     elseif minecartDetailsMode and selectedMinecartId ~= nil then
  127.         local minecart = minecartDetector.getMinecart(selectedMinecartId);
  128.         term.setBackgroundColor(colors.black);
  129.         term.setTextColor(colors.blue);
  130.         term.setCursorPos(w / 2 - 21, h / 2 - 4);
  131.         term.write("+------------------------------------------+");
  132.         term.setCursorPos(w / 2 - 21, h / 2 - 3);
  133.         term.write("|        Id       :                        |");
  134.         term.setCursorPos(w / 2 - 1, h / 2 - 3);
  135.         term.write(minecart.Id);
  136.         term.setCursorPos(w / 2 - 21, h / 2 - 2);
  137.         term.write("|       Type      :                        |");
  138.         term.setCursorPos(w / 2 - 1, h / 2 - 2);
  139.         term.write(minecart.Type);
  140.         term.setCursorPos(w / 2 - 21, h / 2 - 1);
  141.         term.write("|       UUID      :                        |");
  142.         term.setCursorPos(w / 2 - 1, h / 2 - 1);
  143.         term.write(string.sub(minecart.UUID,1,23));
  144.         term.setCursorPos(w / 2 - 21, h / 2);
  145.         term.write("| Is Name Visible :                        |");
  146.         term.setCursorPos(w / 2 - 1, h / 2);
  147.         term.write(minecart.IsNameVisible);
  148.         term.setCursorPos(w / 2 - 21, h / 2 + 1);
  149.         term.write("|       Name      :                        |");
  150.         term.setCursorPos(w / 2 - 1, h / 2 + 1);
  151.         term.write(minecart.Name);
  152.         term.setCursorPos(w / 2 - 21, h / 2 + 2);
  153.         term.write("+------------------------------------------+");
  154.     else
  155.         term.setBackgroundColor(colors.black);
  156.         term.clear();
  157.         for _, pixel in pairs(pixels) do
  158.             term.setCursorPos(pixel.x + w / 2, pixel.z + h / 2);
  159.             term.setBackgroundColor(pixel.bg);
  160.             term.setTextColor(pixel.fg);
  161.             term.write(pixel.c);
  162.         end
  163.     end
  164.     term.setCursorPos(1, h);
  165.     term.setBackgroundColor(colors.black);
  166.     term.setTextColor(colors.blue);
  167.     term.write(message);
  168. end
  169.  
  170. -- Main loop --
  171. loopTimerKey = os.startTimer(1); -- sometimes stopped
  172. while true do
  173.     draw();
  174.     local event, key, id = os.pullEvent();
  175.     if event == "timer" then
  176.         if key == loopTimerKey then
  177.             loopTimerKey = os.startTimer(1);
  178.         end
  179.         if key == messageTimerKey then
  180.             message = "";
  181.         end
  182.     end
  183.     if event == "minecart_stepped_in" then
  184.         addMessage("Minecart detected: " .. id);
  185.     end
  186.     if event == "minecart_stepped_out" then
  187.         addMessage("Minecart lost: " .. id);
  188.     end
  189.     if event == "key" then
  190.         if minecartDetailsMode or helpMode then
  191.             minecartDetailsMode = false;
  192.             helpMode = false;
  193.         else
  194.             if key == keys.t then
  195.                 break ;
  196.             elseif key == keys.z then
  197.                 minecartDetailsMode = true;
  198.             elseif key == keys.h then
  199.                 helpMode = true;
  200.             elseif key == keys.x and selectedMinecartId ~= nil then
  201.                 minecartDetector.stopMinecart(selectedMinecartId);
  202.             elseif key == keys.w and selectedMinecartId ~= nil then
  203.                 minecartDetector.moveMinecart(selectedMinecartId, "north");
  204.             elseif key == keys.a and selectedMinecartId ~= nil then
  205.                 minecartDetector.moveMinecart(selectedMinecartId, "west");
  206.             elseif key == keys.s and selectedMinecartId ~= nil then
  207.                 minecartDetector.moveMinecart(selectedMinecartId, "south");
  208.             elseif key == keys.d and selectedMinecartId ~= nil then
  209.                 minecartDetector.moveMinecart(selectedMinecartId, "east");
  210.             elseif key == keys.q then
  211.                 previousMinecart();
  212.             elseif key == keys.e then
  213.                 nextMinecart();
  214.             else
  215.                 addMessage("Press H for help, T for exit");
  216.             end
  217.         end
  218.     end
  219. end
  220.  
  221. -- catch T as char event --
  222. os.pullEvent();
  223. term.setCursorPos(1, 1);
  224. term.setBackgroundColor(colors.black);
  225. term.clear();
Advertisement
Add Comment
Please, Sign In to add comment