Advertisement
Corbinhol

FarmServer

Jul 24th, 2021 (edited)
336
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.94 KB | None | 0 0
  1. os.execute("clear"); --Clears the screen before displaying anything
  2. --Basic Variables and Do Dads
  3. local component = require("component");
  4. local serialization = require("serialization");
  5. local event = require("event");
  6. local thread = require("thread");
  7.  
  8. local filesystem = require("filesystem");
  9. local redstoneList = component.list("redstone");
  10. local network = component.modem
  11.  
  12. local runServer = false;
  13.  
  14. local farmWidth = 4;
  15. local farmHeight = 5;
  16.  
  17. local addressFile = "/server/addresses.dat";
  18. local dataFile = "/server/farmData.dat";
  19.  
  20. local dataFileBACK = "/server/farmData_backup.dat";
  21.  
  22. local farmGrid = {};
  23. local addresses = {};
  24.  
  25. local ver = "0.1.0";
  26. local serverPort = 63;
  27. local runSetup = true;
  28.  
  29. local threads = {};
  30.  
  31. --Basic Functions
  32. function waitUntilEnter() --Waits For User Input
  33.     local userInput = io.read();
  34.     return;
  35. end
  36.  
  37. function saveTable(input, fileIn) --Saves Table
  38.     file = io.open(fileIn, "w");
  39.     local ser = serialization.serialize(input);
  40.     file:write(ser);
  41.     file:close();
  42.     file:flush();
  43. end
  44.  
  45. function loadTable(file) --Loads Table
  46.     local fileIn = io.open(file, "r");
  47.     local serInput = fileIn:read();
  48.     fileIn:close();
  49.     fileIn:flush();
  50.     return serialization.unserialize(serInput);
  51. end
  52.  
  53. --External Functions
  54. function setRedstoneSignal(x, y, signal) --Sets Redstone Signal
  55.     --print("Command Recognized");
  56.     redAddress = addresses[tonumber(x)][tonumber(y)];
  57.     --print(redAddress);
  58.     local redstoneIO = component.proxy(redAddress);
  59.     for i = 0, 5, 1 do
  60.         redstoneIO.setOutput(i, signal);
  61.     end
  62.     return true;
  63. end
  64.  
  65. function getRedstoneAddress() --Checks Which Redstone IO has a red Signal
  66.     for it, comp in pairs(redstoneList) do
  67.         compont = component.proxy(it);
  68.         for z = 0, 5, 1 do
  69.             if compont.getInput(z) > 0 then
  70.                 return it;
  71.             end
  72.         end
  73.     end
  74.     return false;
  75. end
  76.  
  77. function shutdown()
  78.     print("Shutting Down Server!");
  79.     network.close(serverPort);
  80.     print("Closed port " .. serverPort);
  81.     print("Creating Backup Files Just in case.");
  82.     if filesystem.exists(dataFileBACK) then filesystem.remove(dataFileBACK) end
  83.    
  84.     os.execute("cp " .. dataFile .. " " .. dataFileBACK);
  85.    
  86.     print("Saving Current Configuration...");
  87.     os.execute("del " .. dataFile);
  88.     saveTable(farmGrid, dataFile);
  89.    
  90.     print("Auto Running All Farms");
  91.     for i=1, farmWidth, 1 do
  92.         for t=1, farmHeight, 1 do
  93.             setRedstoneSignal(i, t, 0);
  94.         end
  95.     end
  96.     print("All Farms Enabled!");
  97.     os.execute("shutdown");
  98. end
  99.  
  100.  
  101. function setup() --Setup Initial Variables : First Time
  102.     local farmX = {};
  103.     local addressX = {};
  104.     print("Starting Cailibration Process");
  105.     print("Please enable lever on the corresponding Redstone IO Ports, and Press Enter After");
  106.         for x = 1, farmWidth, 1 do --Each X Coordinate
  107.             local farmY = {};
  108.             local addressY = {};
  109.             for y = 1, farmHeight, 1 do
  110.                 local loop = true;
  111.                 local farm = {};
  112.                 farm["crop"] = "N/A";
  113.                 farm["status"] = true;
  114.                 while loop == true do
  115.                     print("Please Turn Redstone Signal On, and Press enter");
  116.                     print("[" .. x .. "," .. y .. "]");
  117.                     waitUntilEnter();
  118.                     addressY[y] = getRedstoneAddress();
  119.                    
  120.                     --Set Farm Grid Variables
  121.                    
  122.                         if addressY[y] == false then
  123.                             print("ERROR. No Redstone Signal Found! Going Back.");
  124.                         else
  125.                             loop = false;
  126.                         end
  127.                 end --End While
  128.                 print("Redstone Address Set To " .. addressY[y]);
  129.                 print("--------------------------------------------------------");
  130.                 farmY[y] = farm;
  131.                
  132.             end --End Y For
  133.         addressX[x] = addressY;
  134.         farmX[x] = farmY;
  135.         end --End X For
  136.     filesystem.makeDirectory("/server/");
  137.     saveTable(addressX, addressFile);
  138.     saveTable(farmX, dataFile);
  139.     runServer = false;
  140. end --End Function
  141.  
  142. function init()
  143.     print("Starting Server...");
  144.     print("Loading addresses");
  145.     addresses = loadTable(addressFile);
  146.     if addresses ~= nil then print("Addresses Loaded Successfully");
  147.     else print("Error Loading addresses, Stopping Server"); runServer = false; return; end
  148.    
  149.     print("Loading Farm Grid Data");
  150.     farmGrid = loadTable(dataFile);
  151.     if farmGrid ~= nil then print("Farm Grid Loaded Successfully");
  152.     else print("Error Loading Farm Grid, Stopping Server"); runServer = false; return; end
  153.    
  154.     print("Opening Port " .. serverPort);
  155.     portStat = network.open(serverPort);
  156.     if portStat == false then
  157.         print("Error Opening Port " .. serverPort .. ". Stopping Server");
  158.         runServer = false;
  159.         return;
  160.     else
  161.         print("Successfully Opened " .. serverPort .. "!");
  162.     end
  163.    
  164.     print("Setting Farming Stations");
  165.     for i = 1, farmWidth, 1 do
  166.         for t=1,farmHeight,1 do
  167.             local currentFarm = farmGrid[i][t];
  168.             if currentFarm["status"] == true then
  169.                 setRedstoneSignal(i, t, 0);
  170.             else
  171.                 setRedstoneSignal(i, t, 15);
  172.             end
  173.         end
  174.     end
  175.    
  176.     print("Server Successfully Initiated!");
  177.     event.listen("interrupted", shutdown);
  178.     print("------------------------------------------");
  179. end
  180.  
  181. --Start Server
  182. print("-------------------------");
  183. print("-Farm Server-");
  184. print("Version: " .. ver);
  185. print("-------------------------");
  186. print("Checking to see if Essential Directorys/Files Exist");
  187. if filesystem.exists("/server/") == true then --Checking To See if Setup is needed
  188.     print("Directory Exists");
  189.         if filesystem.exists(addressFile) == true then
  190.             if filesystem.exists(dataFile) == true then
  191.                     runServer = true;
  192.                     runSetup = false;
  193.                     print("Everything Seems In Order, Starting Server");
  194.             else
  195.                 print("Data File Non Existent, Initiating Setup");
  196.             end
  197.         else
  198.             print("Address File Non Existent, Initiating Setup");
  199.         end
  200. else
  201.     print("Directory Non Existent, Initiating Setup");
  202. end
  203. print("-------------------------");
  204. if runSetup == true then setup();  end
  205. init();
  206.  
  207.  
  208.  
  209. function funnelMessage(from, port, message)
  210.     print("[" .. from .. "] " .. message);
  211.     local input = serialization.unserialize(message);
  212.     local cmd = input[1];
  213.     if cmd == "shutdown" then shutdown(); network.send(from, port, "Shutting Down Server"); --end of shutdown
  214.     elseif cmd == "whois" then if input[2] == "farmController" then network.send(from, port, network.address) end --end of whois
  215.     elseif cmd == "disableFarm" then farmGrid[tonumber(input[2])][tonumber(input[3])]["status"] = false; setRedstoneSignal(tonumber(input[2]), tonumber(input[3]), 15); network.send(from, port, "Disabled")
  216.     elseif cmd == "enableFarm" then farmGrid[tonumber(input[2])][tonumber(input[3])]["status"] = true; setRedstoneSignal(tonumber(input[2]), tonumber(input[3]), 0); network.send(from, port, "Enabled")
  217.     elseif cmd == "setCrop" then farmGrid[tonumber(input[2])][tonumber(input[3])]["crop"] = input[4];
  218.     else print("Command Not Found");
  219.     end
  220.    
  221.     print(farmGrid[1][1]["crop"]);
  222.     print(farmGrid[1][1]["status"]);
  223. end
  224. print("-------------------------")
  225. if runServer == true then
  226.     while runServer == true do
  227.         print("Now Listening For Signals");
  228.         local _, _, from, port, _, message = event.pull("modem_message")
  229.         local thr = thread.create(funnelMessage, from, port, message);
  230.         thr:detach();
  231.        
  232.     end
  233. end
  234. shutdown();
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement