Advertisement
Lion4ever

Reconstruct Computer State

Dec 4th, 2013
314
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. if clearEventLog then
  2.     print("Already initialised!")
  3.     return false
  4. end
  5. local KeyToClearLog = 59
  6. local TasksBetweenSleeps = 50
  7.  
  8. local stepsTaken = 0
  9. local isRestoring = fs.exists(".events")
  10. local fileInstance
  11. local waitingFor
  12.  
  13. local function overwrite(originaltable,originalname, fake, funcType)
  14.     originaltable[originalname] = function(...)
  15.         if isRestoring then
  16.             if not fileInstance then
  17.                 fileInstance = fs.open(".events","r")
  18.             end
  19.             stepsTaken = stepsTaken + 1
  20.             if funcType == 1 and stepsTaken > TasksBetweenSleeps then
  21.                 stepsTaken = 0
  22.                 os.queueEvent("isomnia")
  23.                 fake("isomnia")
  24.             end
  25.             local fakeEvent = fileInstance.readLine()
  26.             if not fakeEvent or #fakeEvent == 0 then
  27.                 isRestoring = false
  28.                 fileInstance.close()
  29.                 fileInstance = fs.open(".events","a")
  30.                 if waitingFor then
  31.                     if waitingFor[1] == "timer" then
  32.                         fileInstance.write(textutils.serialize(waitingFor))
  33.                         fileInstance.write("\n")
  34.                         return unpack(waitingFor)
  35.                     end
  36.                 end
  37.                 return originaltable[originalname](...) --recursive pull
  38.             end
  39.             local fakeTable = textutils.unserialize(fakeEvent)
  40.             if fakeTable and fakeTable[1] then
  41.                 if fakeTable[1] == "terminate" then
  42.                     error( "Terminated", 0 )
  43.                 end
  44.                 if fakeTable[2] and fakeTable[2] == "timerStart" then
  45.                     waitingFor = {"timer",fakeTable[1]}
  46.                     return fakeTable[1]
  47.                 end
  48.                 if fakeTable[1] == "timer" then
  49.                     waitingFor = nil
  50.                 end
  51.             end
  52.             return unpack(fakeTable)
  53.         else
  54.             if not fileInstance then
  55.                 fileInstance = fs.open(".events","w")
  56.             end
  57.             local event = {fake(...)}
  58.             if event ~= nil and event[1] ~= nil then
  59.                 if funcType == 2 and tonumber(event[1]) then
  60.                     event[2] = "timerStart"
  61.                 end
  62.                     fileInstance.write(textutils.serialize(event))
  63.                     fileInstance.write("\n")
  64.                 if #event==2 and event[1] == "key" and event[2] == KeyToClearLog then
  65.                     clearEventLog()
  66.                 end
  67.                 if event[1] == "terminate" then
  68.                     error( "Terminated", 0 )
  69.                 end
  70.             end
  71.             return unpack(event)
  72.         end
  73.     end
  74. end
  75. function clearEventLog(noOutput)
  76.     fileInstance.close()
  77.     fileInstance = nil
  78.     fs.delete(".events")
  79.     if not noOutput then
  80.         local x,y = term.getCursorPos()
  81.         write("Event Log deleted!")
  82.         term.setCursorPos(x,y)
  83.     end
  84.     return true
  85. end
  86. local pull = os.pullEventRaw
  87. overwrite(os,"pullEvent",pull,1)
  88. local rand = math.random
  89. overwrite(math,"random",rand,0)
  90. local timer = os.startTimer
  91. overwrite(os,"startTimer",timer,2)
  92. local peri = peripheral.call
  93. overwrite(peripheral,"call",peri,0)
  94. local shutdown = os.shutdown
  95. os.shutdown = function()
  96.     clearEventLog(true)
  97.     shutdown()
  98. end
  99. local reboot = os.reboot
  100. os.reboot = function()
  101.     clearEventLog(true)
  102.     reboot()
  103. end
  104. if turtle then
  105.     for name,func in pairs(turtle.native) do
  106.         local privateFunc = func
  107.         overwrite(turtle,name,privateFunc,3)
  108.     end
  109. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement