Advertisement
Arc13

Player Detector MC1.8.9/CC1.79/LIP

Jan 1st, 2017
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 23.15 KB | None | 0 0
  1. local sVersion = "v0.8.5"
  2. local nBuild = 85
  3.  
  4. -- Variables par défaut
  5.  
  6. local sLogFormat = "#y#m#d.log"
  7. local sLogDir = "/playerd_logs/"
  8. local nRange = 16
  9. local nX = -211
  10. local nY = 74
  11. local nZ = 424
  12.  
  13. local useChatInterface = true
  14. local printLog = true
  15. local disableTerminateEvent = false
  16. local disableAutomaticUpdates = false
  17.  
  18. --[[
  19. Liste des variables pour les messages du chat :
  20.  
  21. #p : Nom du joueur qui entre/sort
  22. #M : Minute réelle
  23. #h : Heure réelle
  24. #d : Jour réel
  25. #m : Mois réel
  26. #y : Année réelle
  27. --]]
  28.  
  29. local joinMessage = "#p joined"
  30. local leftMessage = "#p left"
  31. local chatTo = {"your_name"}
  32. local chatName = "Player Probe "..sVersion.." on "..os.computerID()
  33. local canUseCommands = {"your_name"}
  34.  
  35. local tWhitelist = {}
  36.  
  37. local joinProgram = ""
  38. local leftProgram = ""
  39.  
  40. -- Fin des variables par défaut
  41.  
  42. -- Déclaration de la fonction au centre du programme
  43.  
  44. local function getTableDifference(oldTable, newTable)
  45.   if not newTable then
  46.     return false
  47.   end
  48.  
  49.   local tDifference = {}
  50.  
  51.   --[[
  52.  
  53.   print("oldTable :")
  54.  
  55.   for i = 1, #oldTable do
  56.     print(oldTable[i])
  57.   end
  58.  
  59.   print("newTable :")
  60.  
  61.   for i = 1, #newTable do
  62.     print(newTable[i])
  63.   end
  64.  
  65.   print("Différences :")
  66.  
  67.   --]]
  68.  
  69.   for i = 1, #oldTable do
  70.     local isOK = false
  71.  
  72.     local selectedTable = oldTable[i]
  73.     --print("J'ai "..selectedTable.." actuellement")
  74.  
  75.     for i = 1, #newTable do
  76.       --print("Je compare "..selectedTable.." avec "..newTable[i])
  77.  
  78.       if selectedTable == newTable[i] then
  79.         --print("OK")
  80.         isOK = true
  81.         break
  82.       end
  83.     end
  84.  
  85.     if isOK == false then
  86.       --print(selectedTable.." n'est pas dans table2")
  87.       table.insert(tDifference, selectedTable)
  88.     end
  89.   end
  90.  
  91.   return tDifference
  92. end
  93.  
  94. -- Fin de la déclaration
  95.  
  96. -- Init Environment
  97.  
  98. term.setBackgroundColor(colors.black)
  99. term.setTextColor(colors.white)
  100. term.clear()
  101. term.setCursorPos(1, 1)
  102. print("Player Detector Init Environment")
  103. term.setCursorPos(1, 2)
  104.  
  105. for i = 1, term.getSize() do
  106.   write(string.char(131))
  107. end
  108.  
  109. term.setCursorPos(1, 4)
  110.  
  111. if not fs.exists("player_detector.conf") then
  112.   print("\nNo config file found, init setup...")
  113.   local configFile = fs.open("player_detector.conf", "w")
  114.   configFile.write("{\nLogFormat = \"#y#m#d.log\", \nLogDir = \"/playerd_logs/\", \nnRange = 16, \nnX = -211, \nnY = 74, \nnZ = 424, \nuseChatInterface = true, \nprintLog = true, \ndisableTerminateEvent = false, \ndisableAutomaticUpdates = false, \njoinMessage = \"§r#p §3joined\", \nleftMessage = \"§r#p §6left\", \nchatTo = {\"your_name\"}, \nchatName = \"".."§r§oPlayer Probe on "..os.computerID().."\", \ncanUseCommands = {\"your_name\"}, \ntWhitelist = {}, \njoinProgram = \"\", \nleftProgram = \"\", \n}")
  115.   configFile.close()
  116.   print("\nFile created, a text editor will be prompt to edit settings, please save before quit the editor.")
  117.   print("Press any key to continue...")
  118.   os.pullEvent("key")
  119.  
  120.   shell.run("edit player_detector.conf")
  121.  
  122.   term.setBackgroundColor(colors.black)
  123.   term.setTextColor(colors.white)
  124.   term.clear()
  125.   term.setCursorPos(1, 1)
  126.   print("Player Detector Init Environment")
  127.   term.setCursorPos(1, 2)
  128.  
  129.   for i = 1, term.getSize() do
  130.     write(string.char(131))
  131.   end
  132.  
  133.   term.setCursorPos(1, 4)
  134. else
  135.   print("\nConfig file found")
  136. end
  137.  
  138. print("Loading settings...")
  139. settings.load("player_detector.conf")
  140.  
  141. sLogFormat = settings.get("LogFormat", sLogFormat)
  142. sLogDir = settings.get("LogDir", sLogDir)
  143. nRange = settings.get("nRange", nRange)
  144. nX = settings.get("nX", nX)
  145. nY = settings.get("nY", nY)
  146. nZ = settings.get("nZ", nZ)
  147. useChatInterface = settings.get("useChatInterface", useChatInterface)
  148. printLog = settings.get("printLog", printLog)
  149. disableTerminateEvent = settings.get("disableTerminateEvent", disableTerminateEvent)
  150. disableAutomaticUpdates = settings.get("disableAutomaticUpdates", disableAutomaticUpdates)
  151. joinMessage = settings.get("joinMessage", joinMessage)
  152. leftMessage = settings.get("leftMessage", leftMessage)
  153. chatTo = settings.get("chatTo", chatTo)
  154. chatName = settings.get("chatName", chatName)
  155. canUseCommands = settings.get("canUseCommands", canUseCommands)
  156. tWhitelist = settings.get("tWhitelist", tWhitelist)
  157. joinProgram = settings.get("joinProgram", joinProgram)
  158. leftProgram = settings.get("leftProgram", leftProgram)
  159.  
  160. disableAutomaticUpdates = true
  161.  
  162. -- Check new version
  163.  
  164. if not disableAutomaticUpdates then
  165.   print("\nChecking for updates...")
  166.  
  167.   local sBuildNet = http.get("http://pastebin.com/raw/yL1P3anx")
  168.   local nBuildNet = tonumber(sBuildNet.readAll())
  169.   sBuildNet.close()
  170.  
  171.   if nBuildNet > nBuild then
  172.     print("A new version is available ! (build "..nBuildNet..")")
  173.       --print("I'm running "..shell.getRunningProgram())
  174.       print("Downloading new version...")
  175.  
  176.       local sNewSoftware = http.get("http://pastebin.com/raw/7Jg670Ra")
  177.  
  178.       local sTempFile = fs.open(".temp", "w")
  179.       sTempFile.write(sNewSoftware.readAll())
  180.       sTempFile.close()
  181.  
  182.       sNewSoftware.close()
  183.  
  184.       if fs.exists(".temp") then
  185.         print("Downloaded succesfully, updating...")
  186.         fs.delete(shell.getRunningProgram())
  187.         fs.move(".temp", shell.getRunningProgram())
  188.         fs.delete(".temp")
  189.         write("Rebooting")
  190.       write(".")
  191.       sleep(1)
  192.       write(".")
  193.       sleep(1)
  194.       write(".")
  195.       sleep(1)
  196.       os.reboot()
  197.     else
  198.       print("Download fail...")
  199.     end
  200.   else
  201.     print("You are on the latest version")
  202.   end
  203. else
  204.   print("\nAutomatics updates are disabled.")
  205. end
  206.  
  207. print("")
  208.  
  209. if nRange > 20 then
  210.   printError("[WARN] Range is out of bound ("..nRange..")")
  211.   nRange = 20
  212.  
  213.   for i = 1, 5 do
  214.     write(".")
  215.     sleep(1)
  216.   end
  217. elseif nRange < 1 then
  218.   printError("[WARN] Range is out of bound ("..nRange..")")
  219.   nRange = 1
  220.  
  221.   for i = 1, 5 do
  222.     write(".")
  223.     sleep(1)
  224.   end
  225. end
  226.  
  227. print("Checking config file...")
  228. local tKeyAllowed = {"{", "LogFormat", "LogDir", "nRange", "nX", "nY", "nZ", "useChatInterface", "printLog", "disableTerminateEvent", "disableAutomaticUpdates", "joinMessage", "leftMessage", "chatTo", "chatName", "canUseCommands", "tWhitelist", "joinProgram", "leftProgram", "}"}
  229. local tPresentKeys = {}
  230. local tErroredKey = {}
  231. local tConfigLines = {}
  232. local sActualLine = ""
  233. local sScanningLine = ""
  234. local sScanningKey = ""
  235. local bScanResult = false
  236.  
  237. local configCheck = fs.open("player_detector.conf", "r")
  238.  
  239. while sActualLine ~= nil do
  240.   sActualLine = configCheck.readLine()
  241.   table.insert(tConfigLines, sActualLine)
  242. end
  243.  
  244. configCheck.close()
  245.  
  246. for i = 1, #tConfigLines do
  247.   sScanningLine = tConfigLines[i]
  248.   bScanResult = false
  249.  
  250.   for i = 1, #tKeyAllowed do
  251.     sScanningKey = sScanningLine:sub(1, #tKeyAllowed[i])
  252.     if sScanningKey == tKeyAllowed[i] then
  253.       bScanResult = true
  254.       break
  255.     end
  256.   end
  257.  
  258.   if bScanResult == false then
  259.     if not sScanningLine:sub(1, 7) == "LogFile" then
  260.       table.insert(tErroredKey, "L"..i.." > \""..sScanningLine.."\"")
  261.     end
  262.   else
  263.     table.insert(tPresentKeys, sScanningKey)
  264.   end
  265. end
  266.  
  267. if #tErroredKey > 0 then
  268.   if #tErroredKey == 1 then
  269.     printError("Errored key found :")
  270.   else
  271.     printError("Errored keys found :")
  272.   end
  273.   print("")
  274.  
  275.   textutils.pagedTabulate(tErroredKey)
  276.   print("\nPress any key to continue...")
  277.   os.pullEvent("key")
  278. else
  279.   print("No errored key found !")
  280. end
  281.  
  282. local tKeyDifference = getTableDifference(tKeyAllowed, tPresentKeys)
  283.  
  284. if #tKeyDifference > 0 then
  285.   if #tKeyDifference == 1 then
  286.     printError("Missing key found :")
  287.   else
  288.     printError("Missing keys found :")
  289.   end
  290.  
  291.   print("")
  292.   textutils.pagedTabulate(tKeyDifference)
  293.   print("")
  294.  
  295.   print("<          >")
  296.  
  297.   local nCurX, nCurY = term.getCursorPos()
  298.   term.setCursorPos(2, nCurY - 1)
  299.  
  300.   for i = 1, 10 do
  301.     sleep(1)
  302.     write("=")
  303.   end
  304.  
  305.   sleep(1)
  306. else
  307.   print("No missing key found !")
  308. end
  309.  
  310. --sleep(5)
  311.  
  312. -- End Init Environment
  313.  
  314. local bRun = true
  315.  
  316. local monX, monY = term.getSize()
  317. local oldMonX, oldMonY = term.getSize()
  318.  
  319. if monX < 29 then
  320.   printError("Resolution is too low !")
  321.   sleep(5)
  322. end
  323.  
  324. if disableTerminateEvent == true then
  325.   local oldPullEvent = os.pullEvent
  326.   os.pullEvent = os.pullEventRaw
  327. end
  328.  
  329. if not fs.exists("date") then
  330.   shell.run("pastebin get 8GiE70cH date")
  331. end
  332.  
  333. os.loadAPI("date")
  334.  
  335. local t = peripheral.find("EntityDetector")
  336. local p = peripheral.find("WorldInterface")
  337. local c = peripheral.find("ChatInterface")
  338.  
  339. local tSide = ""
  340. local pSide = ""
  341. local cSide = ""
  342.  
  343. local bScrollEffectDone = false
  344.  
  345. local chatInterfaceConnected = true
  346.  
  347. if not t then
  348.   error("No EntityDetector found !")
  349. end
  350.  
  351. if not p then
  352.   error("No WorldInterface found !")
  353. end
  354.  
  355. if not c then
  356.   chatInterfaceConnected = false
  357. else
  358.   c.setName(chatName)
  359. end
  360.  
  361. for i = 1, #peripheral.getNames() do
  362.   local sPeripheralType = peripheral.getType(peripheral.getNames()[i])
  363.  
  364.   if sPeripheralType == "EntityDetector" then
  365.     tSide = peripheral.getNames()[i]
  366.   elseif sPeripheralType == "WorldInterface" then
  367.     pSide = peripheral.getNames()[i]
  368.   elseif sPeripheralType == "ChatInterface" then
  369.     cSide = peripheral.getNames()[i]
  370.   end
  371. end
  372.  
  373. local tPlayers = {}
  374. local tOldPlayers = {}
  375. local tInventoryPlayers = {}
  376.  
  377. if not fs.exists(sLogDir) then
  378.   fs.makeDir(sLogDir)
  379. end
  380.  
  381. term.clear()
  382. term.setCursorPos(1, 1)
  383.  
  384. if monX >= 51 then
  385.   print("Player detector "..sVersion)
  386.   term.setCursorPos(monX - string.len(string.char(169).." arc13") + 1, 1)
  387.   term.write(string.char(169).." arc13")
  388.  
  389.   if term.isColor() then
  390.     term.setTextColor(colors.lightGray)
  391.   end
  392.  
  393.   term.setCursorPos(1, 3)
  394.   print("Listening at "..nX..", "..nY..", "..nZ.." (radius "..nRange..")")
  395.   print(p.getBlockInfos(nX, nY, nZ)["blockName"]..", "..p.getBiome(nX, nY, nZ).." biome")
  396.  
  397.   term.setCursorPos(1, 5)
  398. elseif monX < 51 and monX >= 29 then
  399.   print("Player detector "..sVersion)
  400.   term.setCursorPos(monX - string.len(string.char(169).." arc13") + 1, 1)
  401.   term.write(string.char(169).." arc13")
  402.   term.setCursorPos(1, 3)
  403.   print("X:"..nX..", Y:"..nY..", Z:"..nZ.." (R:"..nRange..")")
  404.  
  405.   term.setCursorPos(1, 4)
  406. end
  407.  
  408. if term.isColor() then
  409.   term.setTextColor(colors.gray)
  410. end
  411.  
  412. for i = 1, term.getSize() do
  413.   write(string.char(131))
  414. end
  415.  
  416. term.setTextColor(colors.white)
  417.  
  418. print("\n")
  419.  
  420. if not printLog then
  421.   print("Log here is disabled !")
  422. end
  423.  
  424. local function redrawHeader()
  425.   local oldCurX, oldCurY = term.getCursorPos()
  426.  
  427.   term.setCursorPos(1, 1)
  428.   term.clearLine()
  429.   print("Player detector "..sVersion)
  430.   term.setCursorPos(monX - string.len(string.char(169).." arc13") + 1, 1)
  431.   term.write(string.char(169).." arc13")
  432.  
  433.   if term.isColor() then
  434.     term.setTextColor(colors.gray)
  435.   end
  436.  
  437.   if bScrollEffectDone == true then
  438.     term.setCursorPos(1, 2)
  439.   else
  440.     if monX >= 51 then
  441.       term.setCursorPos(1, 5)
  442.     elseif monX < 51 and monX >= 29 then
  443.       term.setCursorPos(1, 4)
  444.     end
  445.   end
  446.  
  447.   for i = 1, term.getSize() do
  448.     write(string.char(131))
  449.   end
  450.  
  451.   term.setTextColor(colors.white)
  452.  
  453.   if monX < 29 then
  454.     term.clear()
  455.     term.setCursorPos(1, 1)
  456.     print("Resolution too low !")
  457.   end
  458.  
  459.   term.setCursorPos(oldCurX, oldCurY)
  460. end
  461.  
  462. local function scrollEffect()
  463.   sleep(5)
  464.  
  465.   local oldCurX, oldCurY = term.getCursorPos()
  466.  
  467.   for i = 1, 2 do
  468.     term.scroll(1)
  469.  
  470.     term.setCursorPos(1, 1)
  471.     print("Player detector "..sVersion)
  472.     term.setCursorPos(monX - string.len(string.char(169).." arc13") + 1, 1)
  473.     term.write(string.char(169).." arc13")
  474.     paintutils.drawLine(1, 2, monX, 2, colors.black)
  475.  
  476.     if monX < 51 and monX >= 29 and i == 2 then
  477.       term.setCursorPos(1, 2)
  478.  
  479.       if term.isColor() then
  480.         term.setTextColor(colors.gray)
  481.       end
  482.  
  483.       for i = 1, term.getSize() do
  484.         write(string.char(131))
  485.       end
  486.  
  487.       term.setTextColor(colors.white)
  488.     end
  489.  
  490.     sleep(0.2)
  491.   end
  492.   term.scroll(1)
  493.  
  494.   term.setCursorPos(1, 1)
  495.   print("Player detector "..sVersion)
  496.   term.setCursorPos(monX - string.len(string.char(169).." arc13") + 1, 1)
  497.   term.write(string.char(169).." arc13")
  498.  
  499.   if monX < 51 and monX >= 29 then
  500.     term.setCursorPos(1, 2)
  501.  
  502.     if term.isColor() then
  503.       term.setTextColor(colors.gray)
  504.     end
  505.  
  506.     for i = 1, term.getSize() do
  507.       write(string.char(131))
  508.     end
  509.  
  510.     term.setTextColor(colors.white)
  511.   end
  512.  
  513.   bScrollEffectDone = true
  514.  
  515.   redrawHeader()
  516.  
  517.   if monX >= 51 then
  518.     term.setCursorPos(oldCurX, oldCurY - 3)
  519.   elseif monX < 51 and monX >= 29 then
  520.     term.setCursorPos(oldCurX, oldCurY - 2)
  521.   end
  522. end
  523.  
  524. local function isInWhitelist(sPlayerName)
  525.   for i = 1, #tWhitelist do
  526.     if sPlayerName == tWhitelist[i] then
  527.       --c.sendPlayerMessage("arc13", "whitelisted")
  528.       return true
  529.     end
  530.   end
  531.  
  532.   --c.sendPlayerMessage("arc13", "not whitelisted")
  533.   return false
  534. end
  535.  
  536. local function getInventorySize(tInventory)
  537.   local i = 0
  538.  
  539.   for k, v in pairs(tInventory) do
  540.     i = i + 1
  541.   end
  542.  
  543.   return i
  544. end
  545.  
  546. local function getPlayers(range, x, y, z)
  547.   if not z then
  548.     return false
  549.   end
  550.  
  551.   local playerList = {}
  552.   local f = t.getEntityList(range, x, y, z)
  553.  
  554.   for k, v in pairs(f) do
  555.     if v.type == "EntityPlayerMP" then
  556.       table.insert(playerList, v.name)
  557.     end
  558.   end
  559.  
  560.   return playerList
  561. end
  562.  
  563. local function logJoin(sPlayerJoined)
  564.   if printLog then
  565.     if term.isColor() then
  566.       term.setTextColor(colors.lightGray)
  567.     end
  568.  
  569.     local sFormattedPlayer = ""
  570.  
  571.     if #tPlayers > 1 then
  572.       sFormattedPlayer = "players"
  573.     else
  574.       sFormattedPlayer = "player"
  575.     end
  576.  
  577.     write("["..date.formatDateTime("%h:%M")..", "..#tPlayers.." "..sFormattedPlayer.."] ")
  578.     term.setTextColor(colors.white)
  579.     print(sPlayerJoined.." join")
  580.   end
  581.  
  582.   local sLogName = sLogFormat
  583.   sLogName = sLogName:gsub("#m", date.formatDateTime("%m"))
  584.   sLogName = sLogName:gsub("#h", date.formatDateTime("%h"))
  585.   sLogName = sLogName:gsub("#d", date.formatDateTime("%d"))
  586.   sLogName = sLogName:gsub("#M", date.formatDateTime("%M"))
  587.   sLogName = sLogName:gsub("#y", date.formatDateTime("%y"))
  588.  
  589.   local file = fs.open(sLogDir..sLogName, fs.exists(sLogDir..sLogName) and "a" or "w")
  590.  
  591.   file.writeLine("["..date.formatDateTime("%h:%M").."] "..sPlayerJoined.." join")
  592.   file.close()
  593.  
  594.   tInventoryPlayers[sPlayerJoined] = {inventory = {}}
  595.   tInventoryPlayers[sPlayerJoined]["inventorySize"] = getInventorySize(t.getPlayerDetail(sPlayerJoined)[sPlayerJoined].inventory)
  596.  
  597.   for k, v in pairs(t.getPlayerDetail(sPlayerJoined)[sPlayerJoined].inventory) do
  598.     table.insert(tInventoryPlayers[sPlayerJoined]["inventory"], v.displayName)
  599.   end
  600.  
  601.   if useChatInterface == true and chatInterfaceConnected == true then
  602.     for i = 1, #chatTo do
  603.       local sMsg = string.gsub(joinMessage, "#p", "§l"..sPlayerJoined.."§r")
  604.       sMsg = sMsg:gsub("#M", date.formatDateTime("%M"))
  605.       sMsg = sMsg:gsub("#h", date.formatDateTime("%h"))
  606.       sMsg = sMsg:gsub("#d", date.formatDateTime("%d"))
  607.       sMsg = sMsg:gsub("#m", date.formatDateTime("%m"))
  608.       sMsg = sMsg:gsub("#y", date.formatDateTime("%y"))
  609.       c.sendPlayerMessage(chatTo[i], sMsg)
  610.     end
  611.   end
  612. end
  613.  
  614. local function logLeft(sPlayerLeft)
  615.   if printLog then
  616.     if term.isColor() then
  617.       term.setTextColor(colors.lightGray)
  618.     end
  619.  
  620.     local sFormattedPlayer = ""
  621.  
  622.     if #tPlayers > 1 then
  623.       sFormattedPlayer = "players"
  624.     else
  625.       sFormattedPlayer = "player"
  626.     end
  627.  
  628.     write("["..date.formatDateTime("%h:%M")..", "..#tPlayers.." "..sFormattedPlayer.."] ")
  629.     term.setTextColor(colors.white)
  630.     print(sPlayerLeft.." left")
  631.   end
  632.  
  633.   local sLogName = sLogFormat
  634.   sLogName = sLogName:gsub("#m", date.formatDateTime("%m"))
  635.   sLogName = sLogName:gsub("#h", date.formatDateTime("%h"))
  636.   sLogName = sLogName:gsub("#d", date.formatDateTime("%d"))
  637.   sLogName = sLogName:gsub("#M", date.formatDateTime("%M"))
  638.   sLogName = sLogName:gsub("#y", date.formatDateTime("%y"))
  639.  
  640.   local file = fs.open(sLogDir..sLogName, fs.exists(sLogDir..sLogName) and "a" or "w")
  641.  
  642.   file.writeLine("["..date.formatDateTime("%h:%M").."] "..sPlayerLeft.." left")
  643.  
  644.   if tInventoryPlayers[sPlayerLeft]["inventorySize"] ~= getInventorySize(t.getPlayerDetail(sPlayerLeft)[sPlayerLeft].inventory) then
  645.     print("Inventory has changed ! ("..getInventorySize(t.getPlayerDetail(sPlayerLeft)[sPlayerLeft].inventory).." items now, "..tInventoryPlayers[sPlayerLeft]["inventorySize"].." before)")
  646.  
  647.     local tCurrentInventory = {}
  648.  
  649.     for k, v in pairs(t.getPlayerDetail(sPlayerLeft)[sPlayerLeft].inventory) do
  650.       table.insert(tCurrentInventory, v.displayName)
  651.     end
  652.  
  653.     if getInventorySize(t.getPlayerDetail(sPlayerLeft)[sPlayerLeft].inventory) > tInventoryPlayers[sPlayerLeft]["inventorySize"] then
  654.       -- Un/plusieurs item(s) à/ont été(s) ajouté(s)
  655.       local tDifference = getTableDifference(tCurrentInventory, tInventoryPlayers[sPlayerLeft]["inventory"])
  656.  
  657.       file.writeLine("Inventory has changed (+) : ")
  658.  
  659.       file.write("/")
  660.  
  661.       for i = 1, #tDifference do
  662.         file.write(tDifference[i].."/")
  663.       end
  664.  
  665.       file.write("\n")
  666.     elseif getInventorySize(t.getPlayerDetail(sPlayerLeft)[sPlayerLeft].inventory) < tInventoryPlayers[sPlayerLeft]["inventorySize"] then
  667.       -- Un/plusieurs item(s) à/ont été(s) enlevée(s)
  668.       local tDifference = getTableDifference(tInventoryPlayers[sPlayerLeft]["inventory"], tCurrentInventory)
  669.  
  670.       file.writeLine("Inventory has changed (-) : ")
  671.  
  672.       file.write("/")
  673.  
  674.       for i = 1, #tDifference do
  675.         file.write(tDifference[i].."/")
  676.       end
  677.  
  678.       file.write("\n")
  679.     end
  680.   end
  681.  
  682.   file.close()
  683.  
  684.   if useChatInterface == true and chatInterfaceConnected == true then
  685.     for i = 1, #chatTo do
  686.       local sMsg = string.gsub(leftMessage, "#p", "§l"..sPlayerLeft.."§r")
  687.       sMsg = sMsg:gsub("#M", date.formatDateTime("%M"))
  688.       sMsg = sMsg:gsub("#h", date.formatDateTime("%h"))
  689.       sMsg = sMsg:gsub("#d", date.formatDateTime("%d"))
  690.       sMsg = sMsg:gsub("#m", date.formatDateTime("%m"))
  691.       sMsg = sMsg:gsub("#y", date.formatDateTime("%y"))
  692.       c.sendPlayerMessage(chatTo[i], sMsg)
  693.     end
  694.   end
  695. end
  696.  
  697. local function playerJoin(tPlayers, tOldPlayers)
  698.   local tDifference = getTableDifference(tPlayers, tOldPlayers)
  699.  
  700.   if joinProgram ~= "" and multishell then
  701.     local sTempPlayers = ""
  702.  
  703.     for i = 1, #tDifference do
  704.       sTempPlayers = sTempPlayers..tDifference[i]..","
  705.     end
  706.  
  707.     shell.openTab(joinProgram.." "..sTempPlayers)
  708.   end
  709.  
  710.   for i = 1, #tDifference do
  711.     if not isInWhitelist(tDifference[i]) then
  712.       logJoin(tDifference[i])
  713.  
  714.       redrawHeader()
  715.     else
  716.       if printLog then
  717.         print("Whitelisted : "..tDifference[i])
  718.       end
  719.     end
  720.   end
  721. end
  722.  
  723. local function playerLeft(tPlayers, tOldPlayers)
  724.   local tDifference = getTableDifference(tOldPlayers, tPlayers)
  725.  
  726.   if leftProgram ~= "" and multishell then
  727.     local sTempPlayers = ""
  728.  
  729.     for i = 1, #tDifference do
  730.       sTempPlayers = sTempPlayers..tDifference[i]..","
  731.     end
  732.  
  733.     shell.openTab(leftProgram.." "..sTempPlayers)
  734.   end
  735.  
  736.   for i = 1, #tDifference do
  737.     if not isInWhitelist(tDifference[i]) then
  738.       logLeft(tDifference[i])
  739.  
  740.       redrawHeader()
  741.     else
  742.       if printLog then
  743.         print("Whitelisted : "..tDifference[i])
  744.       end
  745.     end
  746.   end
  747. end
  748.  
  749. local function main()
  750.   while bRun do
  751.     tOldPlayers = tPlayers
  752.     tPlayers = getPlayers(nRange, nX, nY, nZ)
  753.  
  754.     if #tPlayers ~= #tOldPlayers then
  755.       if #tPlayers > #tOldPlayers then
  756.         os.queueEvent("player_join", tPlayers, tOldPlayers)
  757.  
  758.         threadJoin = coroutine.create(playerJoin)
  759.         coroutine.resume(threadJoin, tPlayers, tOldPlayers)
  760.       elseif #tPlayers < #tOldPlayers then
  761.         os.queueEvent("player_left", tPlayers, tOldPlayers)
  762.  
  763.         threadLeft = coroutine.create(playerLeft)
  764.         coroutine.resume(threadLeft, tPlayers, tOldPlayers)
  765.       end
  766.     end
  767.  
  768.     sleep(0.1)
  769.   end
  770. end
  771.  
  772. -- Inutilisable avant que les events soit fixés
  773. local function peripheralHandler()
  774.   while bRun do
  775.     redrawHeader()
  776.  
  777.     local sEvent, sSide = os.pullEvent()
  778.  
  779.     if sEvent == "peripheral" or sEvent == "peripheral_detach" then
  780.       print(sSide)
  781.       print(pSide)
  782.       print(tSide)
  783.       print(cSide)
  784.     end
  785.  
  786.     if sEvent == "peripheral" then
  787.       if peripheral.getType(sSide) == "ChatInterface" then
  788.         chatInterfaceConnected = true
  789.         print("[SYSTEM] ChatInterface connected")
  790.         cSide = sSide
  791.       end
  792.     elseif sEvent == "peripheral_detach" then
  793.       if sSide == pSide then
  794.         -- Le world interface à été détaché
  795.         error("[SYSTEM] WorldInterface disconnected")
  796.       elseif sSide == tSide then
  797.         -- L'entity detector à été détaché
  798.         error("[SYSTEM] EntityDetector disconnected")
  799.       elseif sSide == cSide then
  800.         -- Le chat interface à été détaché
  801.         chatInterfaceConnected = false
  802.         cSide = ""
  803.         print("[SYSTEM] ChatInterface disconnected")
  804.       end
  805.     end
  806.   end
  807. end
  808.  
  809. local function chatHandler()
  810.   while bRun do
  811.     local sEvent, sPlayer, sMessage = os.pullEvent("chat_message")
  812.  
  813.     for i = 1, #canUseCommands do
  814.       if sPlayer == canUseCommands[i] then
  815.         if sMessage == "##disable_chat" then
  816.           useChatInterface = false
  817.           c.sendPlayerMessage(sPlayer, "§rChat §6§ldisabled §r!")
  818.         elseif sMessage == "##enable_chat" then
  819.           useChatInterface = true
  820.           c.sendPlayerMessage(sPlayer, "§rChat §3§lenabled §r!")
  821.         elseif sMessage == "##stop" then
  822.           c.sendPlayerMessage(sPlayer, "§6Terminated")
  823.           os.pullEvent = oldPullEvent
  824.           bRun = false
  825.         elseif sMessage == "##get_players" then
  826.           local tPlayersToSend = getPlayers(nRange, nX, nY, nZ)
  827.  
  828.           local sMsgToSend = ""
  829.  
  830.           if #tPlayersToSend == 0 then
  831.             c.sendPlayerMessage(sPlayer, "§6No players detected")
  832.           elseif #tPlayersToSend == 1 then
  833.             c.sendPlayerMessage(sPlayer, "§rPlayer : §l"..tPlayersToSend[1])
  834.           else
  835.             for i = 1, #tPlayersToSend - 1 do
  836.               sMsgToSend = "§l"..sMsgToSend..tPlayersToSend[i].."§r, "
  837.             end
  838.  
  839.             sMsgToSend = sMsgToSend.."§l"..tPlayersToSend[#tPlayersToSend]
  840.  
  841.             c.sendPlayerMessage(sPlayer, "§r"..sMsgToSend)
  842.           end
  843.         end
  844.       end
  845.     end
  846.   end
  847. end
  848.  
  849. local function UIRefresh()
  850.   while bRun do
  851.     sleep(10)
  852.  
  853.     redrawHeader()
  854.   end
  855. end
  856.  
  857. local function resizeHandler()
  858.   while bRun do
  859.     event, side = os.pullEvent("monitor_resize")
  860.  
  861.     oldMonX, oldMonY = monX, monY
  862.  
  863.     monX, monY = term.getSize()
  864.  
  865.     if monX ~= oldMonX or monY ~= oldMonY then
  866.       -- Resolution has changed, the program run on a monitor
  867.  
  868.       if monX >= 29 then
  869.         redrawHeader()
  870.  
  871.         if bScrollEffectDone == true then
  872.           term.setCursorPos(1, 3)
  873.         else
  874.           if monX >= 51 then
  875.             term.setCursorPos(1, 6)
  876.           elseif monX < 51 and monX >= 29 then
  877.             term.setCursorPos(1, 5)
  878.           end
  879.         end
  880.       else
  881.         term.setCursorPos(1, 1)
  882.         print("Resolution too low !")
  883.       end
  884.     end
  885.   end
  886. end
  887.  
  888. parallel.waitForAll(main, chatHandler, scrollEffect, UIRefresh, resizeHandler)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement