Advertisement
Brodur

tc.lua

Apr 14th, 2019
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.66 KB | None | 0 0
  1. --- Turret Control
  2. -- Helps manage OpenModularTurrets turret blocks that have serial IO
  3. -- @Author: Brodur
  4. -- @Version: 2.3
  5. -- @Requires:
  6. -- https://pastebin.com/WvF00A71 : JSON Utility functions
  7. -- https://pastebin.com/pLpe4zPb : Menu functions
  8. -- https://pastebin.com/SKwM2UZH : Lua JSON Library
  9.  
  10. local term = require("term")
  11. local component = require("component")
  12. local event = require("event")
  13. local json = require("json")
  14. local menu = require("menu")
  15. local jsonutil = require("jsonutil")
  16. local fs = require("filesystem")
  17.  
  18. local m = {}
  19. local tb = "turret_base"
  20. local lb = "-------------------------------"
  21.  
  22. local mmopts = {
  23.   "Summary",
  24.   "Targeting",
  25.   "User Admin",
  26.   "Push Config",
  27.   "Exit"
  28. }
  29.  
  30. local db = {}
  31. local toRemove = {}
  32. local jsondir = "/home/settings.json"
  33.  
  34. --- Trims strings
  35. -- Gets rid of trailing white space or special characters.
  36. -- @param s The string to trim.
  37. -- @return The trimmed string.
  38. function trim(s)
  39.    return (s:gsub("^%s*(.-)%s*$", "%1"))
  40. end
  41.  
  42. --- Summary output
  43. -- Outputs the summary of a selected turret.
  44. function m.summary()
  45.   term.setCursor(1,1)
  46.   print(mmopts[1] .. "\n")
  47.   print("Trusted players")
  48.   print(lb)
  49.  
  50.   for k,v in pairs(db.users) do
  51.     print(" - " .. k, v and "[Admin]" or "[Trusted]")
  52.   end
  53.   print("\nAttacks")
  54.   print(lb)
  55.   print("Mobs:\t\t" .. tostring(db.targets.setAttacksMobs))
  56.   print("Neutrals:\t" .. tostring(db.targets.setAttacksNeutrals))
  57.   print("Players:\t" .. tostring(db.targets.setAttacksPlayers))
  58.  
  59.   print("\n\nPress enter to continue...")
  60.   term.read()
  61. end
  62.  
  63. --- Set Attack
  64. -- Sets the attack setting for all turrets.
  65. -- @param flag      1 or 2, corresponds to true or false, toggles the attack mode.
  66. -- @param option    Which option was chosen in the target function
  67. function m.setAttack(flag, option)
  68. local methods = {"setAttacksMobs", "setAttacksNeutrals", "setAttacksPlayers"}
  69.   local arguments = {true, false}
  70.   db.targets[methods[option]] = arguments[flag]
  71.   db.hasChanges = true
  72. end
  73.  
  74. ---Target
  75. -- Selects the targeting parameter
  76. function m.target()
  77.   local options = {"Attack Mobs", "Attack Neutrals", "Attack Players", "Exit"}
  78.   local opt = -1
  79.   while opt ~= #options do  
  80.     opt = menu.list(options, mmopts[2])
  81.     if opt ~= #options then
  82.       local flag = menu.dialog(options[opt], "True", "False")
  83.       m.setAttack(flag, opt)
  84.     else break end
  85.   end
  86. end
  87.  
  88. --- Add Trusted Player
  89. -- Adds a trusted player to all turrets, either with or without admin privileges.
  90. -- @param player    The player to add.
  91. -- @param usrType   1 for trusted, 2 for admin.
  92. function m.addTrustedPlayer(player, usrType)
  93.   local args = {false, true}
  94.   for k,_ in pairs(db.users) do
  95.     if player == k then error("Cannot add a user that already exists!") end
  96.   end
  97.   db.users[player] = args[usrType]
  98.   db.hasChanges = true
  99. end
  100.  
  101. --- Remove Trusted Player
  102. -- Removes a user from the trusted players list.
  103. -- @param player  The user to remove.
  104. function m.removeTrustedPlayer(player)
  105.   toRemove[#toRemove+1] = player
  106.   db.users[player] = nil
  107.   db.hasChanges = true
  108. end
  109.  
  110. --- Users
  111. -- Launches the add or remove user dialog
  112. function m.users()
  113.   local options = {"Add a trusted user", "Remove a trused user","Exit"}
  114.   local opt = -1
  115.   while opt ~= #options do
  116.     opt = menu.list(options, mmopts[3])
  117.     if opt == 1 then
  118.       local userTypes = {"Trusted", "Admin"}
  119.       term.write("Add a trusted player: ")
  120.       local player  = trim(term.read())
  121.       local usrType = menu.dialog("User or Admin?", "User", "Admin")
  122.       local opt = menu.dialog("Add \'" .. player .. "\' as " .. userTypes[usrType] .." type user?", "Confirm", "Cancel")
  123.       if opt == 1 then
  124.         m.addTrustedPlayer(player, usrType)
  125.       end
  126.     end
  127.     if opt == 2 then
  128.       local users = {"Cancel"}
  129.       for k,v in pairs(db.users) do users[#users+1] = k end
  130.       local user = -1
  131.       while user ~= 1 do
  132.         user = menu.list(users, "Select a user")
  133.         if user ~= 1 then
  134.           local player = users[user]
  135.           local confirm = menu.dialog("Remove \'" .. player .. "\' from trusted users?", "Confirm", "Cancel")
  136.           if confirm == 1 then
  137.             m.removeTrustedPlayer(player)
  138.             table.remove(users, user)
  139.           end
  140.         end
  141.       end
  142.     end
  143.   end
  144. end
  145.  
  146. --- Distribute Json
  147. -- Disseminates the settings from the database to all turrets.
  148. function m.distribJson()
  149.   for _,v in pairs(db.turrets) do
  150.     for _,player in pairs(toRemove) do
  151.       component.invoke(v, "removeTrustedPlayer", player)
  152.     end
  153.  
  154.     for user,priv in pairs(db.users) do
  155.       component.invoke(v, "addTrustedPlayer", user, priv)
  156.     end
  157.     for meth,bool in pairs(db.targets) do
  158.       component.invoke(v, meth, bool)
  159.     end
  160.   end
  161.   toRemove= {}
  162. end
  163.  
  164. --- Sub menu
  165. -- Determines which menu function to call.
  166. -- @param index The selected index in the main menu options table.
  167. function m.subMenu(index)
  168.   local turrets = {}
  169.   for k in pairs(component.list(tb)) do turrets[#turrets+1] = k end
  170.   db.turrets = turrets
  171.  
  172.   if index == mmopts[1] then m.summary() end
  173.   if index == mmopts[2] then m.target() end
  174.   if index == mmopts[3] then m.users() end
  175.   if index == mmopts[4] then m.distribJson() end
  176. end    
  177.  
  178. --- On Load
  179. -- Initializes the database and grabs the initial turrets.
  180. function m.onLoad()
  181.   if not fs.exists(jsondir) then
  182.     db = {
  183.         hasChanges=false,
  184.         targets={setAttacksMobs=false,
  185.                  setAttacksNeutrals=false,
  186.                  setAttacksPlayers=false
  187.                 },
  188.         turrets = {},
  189.         users = {}
  190.     }
  191.     jsonutil.save(db, jsondir)
  192.   end
  193.                    
  194.   db = jsonutil.load(jsondir)
  195.   for k in pairs(component.list(tb)) do db.turrets[#db.turrets+1] = k end
  196.   m.main()
  197. end
  198.  
  199. --- Main
  200. -- Launches the main logic and displays the top level menu.
  201. function m.main()
  202.   local mmoptTitle = "Main Menu"
  203.   local mmopt = -1
  204.  
  205.   while mmopt ~= #mmopts do
  206.     if db.hasChanges then
  207.       jsonutil.save(db, jsondir)
  208.       db.hasChanges = false
  209.       m.distribJson()
  210.     end
  211.     if mmopt ~= #mmopts then
  212.       mmopt = menu.list(mmopts, mmoptTitle)
  213.       m.subMenu(mmopts[mmopt])
  214.     end
  215.   end
  216. end
  217.  
  218. --- On Component Added
  219. -- Push the stored config when a new turret is detected.
  220. -- @param eventType The type of event, passed by event listener.
  221. -- @param address   The hardware address of the new component.
  222. -- @param componentType     The type of the new component.
  223. -- @todo figure out why the event listener is not firing all of the time, until that is figured disregard this function
  224. -- function onComponentAdded(eventType, address, componentType)
  225. --   if componentType == "turret_base" then
  226. --     distribJson()
  227. --   end
  228. -- end
  229.  
  230. -- event.listen("component_added", onComponentAdded)
  231. m.onLoad()
  232. return m
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement