fishermedders

mm tg

Dec 20th, 2019
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.77 KB | None | 0 0
  1. --Json Library by ElvishJerrico
  2.  
  3. ------------------------------------------------------------------ utils
  4. local controls = {["\n"]="\\n", ["\r"]="\\r", ["\t"]="\\t", ["\b"]="\\b", ["\f"]="\\f", ["\""]="\\\"", ["\\"]="\\\\"}
  5.  
  6. local function isArray(t)
  7. local max = 0
  8. for k,v in pairs(t) do
  9. if type(k) ~= "number" then
  10. return false
  11. elseif k > max then
  12. max = k
  13. end
  14. end
  15. return max == #t
  16. end
  17.  
  18. local whites = {['\n']=true; ['\r']=true; ['\t']=true; [' ']=true; [',']=true; [':']=true}
  19. function removeWhite(str)
  20. while whites[str:sub(1, 1)] do
  21. str = str:sub(2)
  22. end
  23. return str
  24. end
  25.  
  26. ------------------------------------------------------------------ encoding
  27.  
  28. local function encodeCommon(val, pretty, tabLevel, tTracking)
  29. local str = ""
  30.  
  31. -- Tabbing util
  32. local function tab(s)
  33. str = str .. ("\t"):rep(tabLevel) .. s
  34. end
  35.  
  36. local function arrEncoding(val, bracket, closeBracket, iterator, loopFunc)
  37. str = str .. bracket
  38. if pretty then
  39. str = str .. "\n"
  40. tabLevel = tabLevel + 1
  41. end
  42. for k,v in iterator(val) do
  43. tab("")
  44. loopFunc(k,v)
  45. str = str .. ","
  46. if pretty then str = str .. "\n" end
  47. end
  48. if pretty then
  49. tabLevel = tabLevel - 1
  50. end
  51. if str:sub(-2) == ",\n" then
  52. str = str:sub(1, -3) .. "\n"
  53. elseif str:sub(-1) == "," then
  54. str = str:sub(1, -2)
  55. end
  56. tab(closeBracket)
  57. end
  58.  
  59. -- Table encoding
  60. if type(val) == "table" then
  61. assert(not tTracking[val], "Cannot encode a table holding itself recursively")
  62. tTracking[val] = true
  63. if isArray(val) then
  64. arrEncoding(val, "[", "]", ipairs, function(k,v)
  65. str = str .. encodeCommon(v, pretty, tabLevel, tTracking)
  66. end)
  67. else
  68. arrEncoding(val, "{", "}", pairs, function(k,v)
  69. assert(type(k) == "string", "JSON object keys must be strings", 2)
  70. str = str .. encodeCommon(k, pretty, tabLevel, tTracking)
  71. str = str .. (pretty and ": " or ":") .. encodeCommon(v, pretty, tabLevel, tTracking)
  72. end)
  73. end
  74. -- String encoding
  75. elseif type(val) == "string" then
  76. str = '"' .. val:gsub("[%c\"\\]", controls) .. '"'
  77. -- Number encoding
  78. elseif type(val) == "number" or type(val) == "boolean" then
  79. str = tostring(val)
  80. else
  81. error("JSON only supports arrays, objects, numbers, booleans, and strings", 2)
  82. end
  83. return str
  84. end
  85.  
  86. function encode(val)
  87. return encodeCommon(val, false, 0, {})
  88. end
  89.  
  90. function encodePretty(val)
  91. return encodeCommon(val, true, 0, {})
  92. end
  93.  
  94. ------------------------------------------------------------------ decoding
  95.  
  96. local decodeControls = {}
  97. for k,v in pairs(controls) do
  98. decodeControls[v] = k
  99. end
  100.  
  101. function parseBoolean(str)
  102. if str:sub(1, 4) == "true" then
  103. return true, removeWhite(str:sub(5))
  104. else
  105. return false, removeWhite(str:sub(6))
  106. end
  107. end
  108.  
  109. function parseNull(str)
  110. return nil, removeWhite(str:sub(5))
  111. end
  112.  
  113. local numChars = {['e']=true; ['E']=true; ['+']=true; ['-']=true; ['.']=true}
  114. function parseNumber(str)
  115. local i = 1
  116. while numChars[str:sub(i, i)] or tonumber(str:sub(i, i)) do
  117. i = i + 1
  118. end
  119. local val = tonumber(str:sub(1, i - 1))
  120. str = removeWhite(str:sub(i))
  121. return val, str
  122. end
  123.  
  124. function parseString(str)
  125. str = str:sub(2)
  126. local s = ""
  127. while str:sub(1,1) ~= "\"" do
  128. local next = str:sub(1,1)
  129. str = str:sub(2)
  130. assert(next ~= "\n", "Unclosed string")
  131.  
  132. if next == "\\" then
  133. local escape = str:sub(1,1)
  134. str = str:sub(2)
  135.  
  136. next = assert(decodeControls[next..escape], "Invalid escape character")
  137. end
  138.  
  139. s = s .. next
  140. end
  141. return s, removeWhite(str:sub(2))
  142. end
  143.  
  144. function parseArray(str)
  145. str = removeWhite(str:sub(2))
  146.  
  147. local val = {}
  148. local i = 1
  149. while str:sub(1, 1) ~= "]" do
  150. local v = nil
  151. v, str = parseValue(str)
  152. val[i] = v
  153. i = i + 1
  154. str = removeWhite(str)
  155. end
  156. str = removeWhite(str:sub(2))
  157. return val, str
  158. end
  159.  
  160. function parseObject(str)
  161. str = removeWhite(str:sub(2))
  162.  
  163. local val = {}
  164. while str:sub(1, 1) ~= "}" do
  165. local k, v = nil, nil
  166. k, v, str = parseMember(str)
  167. val[k] = v
  168. str = removeWhite(str)
  169. end
  170. str = removeWhite(str:sub(2))
  171. return val, str
  172. end
  173.  
  174. function parseMember(str)
  175. local k = nil
  176. k, str = parseValue(str)
  177. local val = nil
  178. val, str = parseValue(str)
  179. return k, val, str
  180. end
  181.  
  182. function parseValue(str)
  183. local fchar = str:sub(1, 1)
  184. if fchar == "{" then
  185. return parseObject(str)
  186. elseif fchar == "[" then
  187. return parseArray(str)
  188. elseif tonumber(fchar) ~= nil or numChars[fchar] then
  189. return parseNumber(str)
  190. elseif str:sub(1, 4) == "true" or str:sub(1, 5) == "false" then
  191. return parseBoolean(str)
  192. elseif fchar == "\"" then
  193. return parseString(str)
  194. elseif str:sub(1, 4) == "null" then
  195. return parseNull(str)
  196. end
  197. return nil
  198. end
  199.  
  200. function decode(str)
  201. str = removeWhite(str)
  202. t = parseValue(str)
  203. return t
  204. end
  205.  
  206. function decodeFromFile(path)
  207. local file = assert(fs.open(path, "r"))
  208. local decoded = decode(file.readAll())
  209. file.close()
  210. return decoded
  211. end
  212.  
  213. --Finding a Peripheral
  214. function findPeripheral(pType)
  215. local pList = {}
  216. for _,pName in pairs(peripheral.getNames()) do
  217. if peripheral.getType(pName) == pType then
  218. table.insert(pList, peripheral.wrap(pName))
  219. end
  220. end
  221. return unpack(pList)
  222. end
  223. peripheral.find = findPeripheral
  224.  
  225. --Start of program
  226. oBridge = peripheral.find("openperipheral_glassesbridge")
  227. oSensor = peripheral.find("openperipheral_sensor")
  228.  
  229. function fGetPlayers()
  230. local sData = http.get("http://tekkit.craftersland.net:25800/up/world/world/").readAll()
  231. sData = string.gsub(sData, "\\", "\\\\")
  232. local tData = decode(sData)
  233. return tData["players"]
  234. end
  235.  
  236. tRendered = {}
  237. tForceAdd = {}
  238. function fRenderTable()
  239. tRendered = {}
  240. local tPlayers = fGetPlayers()
  241. if tSettings["mode"] == 1 then
  242. for i = 1,#tPlayers do
  243. if tPlayers[i] ~= nil then
  244. --print(i .. " " .. tPlayers[i]["name"] .. " " .. #tPlayers .. " " .. #tSettings["staff_blacklist"])
  245. for iv = 1,#tSettings["staff_blacklist"] do
  246. --print(iv .. " " .. tSettings["staff_blacklist"][iv])
  247. if tPlayers[i]["name"] == tSettings["staff_blacklist"][iv] then
  248. table.remove(tPlayers,i)
  249. end
  250. end
  251. end
  252. end
  253. end
  254. for i = 1,#tForceAdd do
  255. tNewPlayer = {["name"]=tForceAdd[i],["x"]=0,["y"]=64,["z"]=0,["world"]="fake-player"}
  256. tPlayers[#tPlayers+1] = tNewPlayer
  257. end
  258. for i = 1,#tPlayers do
  259. tSensorData = oSensor.getPlayerData(tPlayers[i]["name"])
  260. tPlayers[i]["world"] = "?"
  261. if tSensorData then
  262. tPlayers[i].x = math.floor(4073+tSensorData.position.x)
  263. tPlayers[i].y = math.floor(39+tSensorData.position.y)
  264. tPlayers[i].z = math.floor(3776+tSensorData.position.z)
  265. tPlayers[i].world = "world"
  266. end
  267. sRender = ""
  268. sName = tPlayers[i]["name"]
  269. for si = #tPlayers[i]["name"],17 do
  270. sName = sName .. " "
  271. end
  272. sRender = sRender .. sName
  273. sX = tostring(tPlayers[i]["x"])
  274. if not string.find(sX, "-") then
  275. sX = " " .. sX
  276. end
  277. for si = #sX,6 do
  278. sX = sX .. " "
  279. end
  280. sRender = sRender .. sX
  281. sY = tostring(tPlayers[i]["y"])
  282. if not string.find(sY, "-") then
  283. sY = " " .. sY
  284. end
  285. for si = #sY,4 do
  286. sY = sY .. " "
  287. end
  288. sRender = sRender .. sY
  289. sZ = tostring(tPlayers[i]["z"])
  290. if not string.find(sZ, "-") then
  291. sZ = " " .. sZ
  292. end
  293. for si = #sZ,6 do
  294. sZ = sZ .. " "
  295. end
  296. sRender = sRender .. sZ
  297. sWorld = tPlayers[i]["world"]
  298. for si = #tPlayers[i]["world"],6 do
  299. sWorld = sWorld .. " "
  300. end
  301. sRender = sRender .. sWorld
  302. tRendered[tPlayers[i]["name"]] = {}
  303. tRendered[tPlayers[i]["name"]]["render"] = sRender
  304. tRendered[tPlayers[i]["name"]]["name"] = tPlayers[i].name
  305. tRendered[tPlayers[i]["name"]]["sx"] = sX
  306. tRendered[tPlayers[i]["name"]]["sy"] = sY
  307. tRendered[tPlayers[i]["name"]]["sz"] = sZ
  308. tRendered[tPlayers[i]["name"]]["x"] = tPlayers[i].x
  309. tRendered[tPlayers[i]["name"]]["y"] = tPlayers[i].y
  310. tRendered[tPlayers[i]["name"]]["z"] = tPlayers[i].z
  311. tRendered[tPlayers[i]["name"]]["world"] = tPlayers[i].world
  312. end
  313. --[[for _,tRender in pairs(tRendered) do
  314. print(tRender["render"])
  315. end]]--
  316. end
  317.  
  318. function fDirection(nX1, nZ1, nX2, nZ2)
  319. local dir = math.atan2(nZ2 - nZ1, nX2 - nX1)
  320. if dir > 2.75 or dir < -2.74 then
  321. return "W"
  322. elseif dir > -2.75 and dir < -1.95 then
  323. return "NW"
  324. elseif dir > -1.96 and dir < -1.17 then
  325. return "N"
  326. elseif dir > -1.18 and dir < -0.38 then
  327. return "NE"
  328. elseif dir > -0.39 and dir < 0.40 then
  329. return "E"
  330. elseif dir > 0.39 and dir < 1.19 then
  331. return "SE"
  332. elseif dir > 1.18 and dir < 1.96 then
  333. return "S"
  334. elseif dir > 1.96 and dir < 2.76 then
  335. return "SW"
  336. end
  337. end
  338.  
  339. function fDistance(nX1, nY1, nX2, nY2)
  340. return math.floor(math.sqrt(math.pow(nX2-nX1,2)+math.pow(nY2-nY1,2)))
  341. end
  342.  
  343. function fGetTextSize(sText)
  344. local tSizing = {
  345. ["f"] = 4,
  346. ["i"] = 1,
  347. ["k"] = 4,
  348. ["l"] = 2,
  349. ["t"] = 3,
  350. ["I"] = 3,
  351. ["!"] = 1,
  352. ["@"] = 6,
  353. ["*"] = 4,
  354. ["("] = 4,
  355. [")"] = 4,
  356. ["~"] = 6,
  357. ["["] = 3,
  358. ["]"] = 3,
  359. ["{"] = 4,
  360. ["}"] = 4,
  361. ["|"] = 1,
  362. [";"] = 1,
  363. ["'"] = 2,
  364. [":"] = 1,
  365. [","] = 1,
  366. ["."] = 1,
  367. ["<"] = 4,
  368. [">"] = 4,
  369. [" "] = 2,
  370. }
  371. nSize = 0
  372. for i = 1,#sText do
  373. if tSizing[sText.sub(i,i)] ~= nil then
  374. nSize = nSize + tSizing[sText.sub(i,i)]
  375. else
  376. nSize = nSize + 5
  377. end
  378. end
  379. return nSize
  380. end
  381.  
  382. function fRefreshSettings()
  383. oSettingsFile = fs.open("tracker_settings","r")
  384. sSettings = oSettingsFile.readAll()
  385. oSettingsFile.close()
  386. tSettings = textutils.unserialize(sSettings)
  387. end
  388.  
  389. function fSaveSettings()
  390. oSettingsFile = fs.open("tracker_settings","w")
  391. oSettingsFile.write(textutils.serialize(tSettings))
  392. oSettingsFile.close()
  393. end
  394.  
  395. function fAllowed(sUser)
  396. for i = 1,#tSettings["priv_users"] do
  397. if tSettings["priv_users"][i] == sUser then
  398. return true
  399. end
  400. end
  401. return false
  402. end
  403.  
  404. function fAddChatMessage(sMessage,nColor,nTicks,sPlayer)
  405. table.insert(tMessages,{["message"]=sMessage,["color"]=nColor,["player"]=sPlayer,["ticks"]=nTicks,["currentticks"]=nTicks})
  406. end
  407.  
  408. --Program start
  409.  
  410. tSettings = {}
  411.  
  412. if not fs.exists("tracker_settings") then
  413. oSettings = fs.open("tracker_settings","w")
  414. tSettings = {
  415. ["priv_users"]={"Fisher","XMedders","ZeeDerpMaster","RewVenN"},
  416. ["staff_blacklist"]={"Henkekalmar","mikewerf_","DragonSlayer","urss333","zombsta123","Brunyman","EPICfighters","Exief","Ness27","Reverser"},
  417. ["mode"]=1
  418. }
  419. oSettings.write(textutils.serialize(tSettings))
  420. oSettings.close()
  421. end
  422.  
  423. fRefreshSettings()
  424.  
  425. tModuleLocs = {
  426. ["tracker"] = {7,20},
  427. ["welcome"] = {7,7}
  428. }
  429.  
  430. tResolution = {}
  431. tResolution["windowed"] = {959,507}
  432. tResolution["full"] = {959,539}
  433.  
  434. tMessages = {}
  435.  
  436. function fMainLoop()
  437. while true do
  438. fRenderTable()
  439. tUsers = oBridge.getUsers()
  440. for i = 1,#tUsers do
  441. if fAllowed(tUsers[i]) then
  442. tSurface = oBridge.getUserSurface(tUsers[i])
  443. tSurface.clear()
  444. -----------------------
  445. --*******************--
  446. --* Welcome Section *--
  447. --*******************--
  448. -----------------------
  449. nIterator = 0
  450. for _,tRender in pairs(tRendered) do
  451. nIterator = nIterator + 1
  452. end
  453. sWelcome = "Welcome back, " .. tUsers[i] .. "! " .. tostring(nIterator) .. " players online!"
  454. --sWelcome = tostring(nIterator)
  455. tSurface.addGradientBox(tModuleLocs["welcome"][1],tModuleLocs["welcome"][2],fGetTextSize(sWelcome)+2,12,0x000000,0.7,0xFFFFFF,0.7,1)
  456. tSurface.addLiquid(tModuleLocs["welcome"][1]+1,tModuleLocs["welcome"][2]+1,fGetTextSize(sWelcome), 10, "mobessence")
  457. tSurface.addText(tModuleLocs["welcome"][1]+2,tModuleLocs["welcome"][2]+2,sWelcome, 0xFFFFFF)
  458.  
  459. --------------------
  460. --****************--
  461. --* Chat Section *--
  462. --****************--
  463. --------------------
  464. for im = 1,#tMessages do
  465. if tMessages[im]["player"] == tUsers[i] or tMessages[im]["player"] == "message_all" then
  466. tSurface.addText((tResolution["windowed"][1]/2)-50+2,tResolution["windowed"][2]-80-(10*im),tMessages[im]["message"],tMessages[im]["color"])
  467. end
  468. end
  469.  
  470. -----------------------
  471. --*******************--
  472. --* Tracker Section *--
  473. --*******************--
  474. -----------------------
  475. nIterator = 1
  476. for _,tRender in pairs(tRendered) do
  477. nIterator = nIterator + 1
  478. end
  479. nGradientWidth = 265
  480. if tRendered[tUsers[i]] ~= nil then
  481. nGradientWidth = 330
  482. end
  483. tSurface.addGradientBox(tModuleLocs["tracker"][1],tModuleLocs["tracker"][2],nGradientWidth,(nIterator*10)-4,0x000000,0.7,0x404040,0.7,1)
  484. nIterator = 1
  485. for _,tRender in pairs(tRendered) do
  486. nColor = 0xFFFFFF
  487. if nIterator % 2 == 0 then
  488. nColor = 0xFFFFFF
  489. else
  490. nColor = 0xC0C0C0
  491. end
  492. tSurface.addText(tModuleLocs["tracker"][1]+4,tModuleLocs["tracker"][2]+(nIterator*10)-6,tRender["name"],nColor)
  493. tSurface.addText(tModuleLocs["tracker"][1]+110+4,tModuleLocs["tracker"][2]+(nIterator*10)-6,tostring(tRender["sx"]),nColor)
  494. tSurface.addText(tModuleLocs["tracker"][1]+150+4,tModuleLocs["tracker"][2]+(nIterator*10)-6,tostring(tRender["sy"]),nColor)
  495. tSurface.addText(tModuleLocs["tracker"][1]+190+4,tModuleLocs["tracker"][2]+(nIterator*10)-6,tostring(tRender["sz"]),nColor)
  496. tSurface.addText(tModuleLocs["tracker"][1]+230+4,tModuleLocs["tracker"][2]+(nIterator*10)-6,tRender["world"],nColor)
  497. if tRendered[tUsers[i]] ~= nil then
  498. if tRender["name"] == tUsers[i] then
  499. tSurface.addText(tModuleLocs["tracker"][1]+270+4,tModuleLocs["tracker"][2]+(nIterator*10)-6,"-",nColor)
  500. else
  501. tSurface.addText(tModuleLocs["tracker"][1]+270+4,tModuleLocs["tracker"][2]+(nIterator*10)-6,fDirection(tonumber(tRendered[tUsers[i]]["x"]),tonumber(tRendered[tUsers[i]]["z"]),tonumber(tRender["x"]),tonumber(tRender["z"])),nColor)
  502. end
  503. if tRender["name"] == tUsers[i] then
  504. tSurface.addText(tModuleLocs["tracker"][1]+290+4,tModuleLocs["tracker"][2]+(nIterator*10)-6,"-",nColor)
  505. else
  506. if tRender["world"] ~= "?" then
  507. tSurface.addText(tModuleLocs["tracker"][1]+290+4,tModuleLocs["tracker"][2]+(nIterator*10)-6,fDistance(tonumber(tRendered[tUsers[i]]["x"]),tonumber(tRendered[tUsers[i]]["z"]),tonumber(tRender["x"]),tonumber(tRender["z"])).."m",nColor)
  508. else
  509. tSurface.addText(tModuleLocs["tracker"][1]+290+4,tModuleLocs["tracker"][2]+(nIterator*10)-6,"?m",nColor)
  510. end
  511. end
  512. end
  513. nIterator = nIterator + 1
  514. end
  515. end
  516. end
  517. os.startTimer(0.25)
  518. tEvent = {os.pullEvent()}
  519. end
  520. end
  521.  
  522. function fChatLoop()
  523. while true do
  524. print("looping!")
  525. tEvent = {os.pullEvent("chat_command")}
  526. print("$$" .. tEvent[2])
  527. tCmdArgs = {}
  528. for sArg in string.gmatch(tEvent[2],"%S+") do
  529. table.insert(tCmdArgs, sArg)
  530. end
  531. if tCmdArgs[1] == "move" then
  532. if tModuleLocs[tCmdArgs[2]] ~= nil then
  533. if tonumber(tCmdArgs[3]) and tonumber(tCmdArgs[4]) then
  534. tModuleLocs[tCmdArgs[2]][1] = tonumber(tCmdArgs[3])
  535. tModuleLocs[tCmdArgs[2]][2] = tonumber(tCmdArgs[4])
  536. end
  537. end
  538. end
  539. if tCmdArgs[1] == "add" then
  540. if tCmdArgs[2] ~= nil then
  541. tForceAdd[#tForceAdd+1] = tCmdArgs[2]
  542. end
  543. end
  544. if tCmdArgs[1] == "remove" then
  545. if tCmdArgs[2] ~= nil then
  546. for i = 1,#tForceAdd do
  547. if tForceAdd[i] == tCmdArgs[2] then
  548. table.remove(tForceAdd,i)
  549. end
  550. end
  551. end
  552. end
  553. if tCmdArgs[1] == "kill" then
  554. tUsers = oBridge.getUsers()
  555. for i = 1,#tUsers do
  556. tSurface = oBridge.getUserSurface(tUsers[i])
  557. tSurface.clear()
  558. end
  559. error("Killed by " .. tEvent[3] .. "!")
  560. end
  561. if tCmdArgs[1] == "mode" then
  562. tSettings["mode"] = tonumber(tCmdArgs[2])
  563. fSaveSettings()
  564. end
  565. if tCmdArgs[1] == "testchat" then
  566. fAddChatMessage(tCmdArgs[2],0xFF0000,100,tEvent[3])
  567. end
  568. end
  569. end
  570.  
  571. function fChatTimer()
  572. while true do
  573. sleep(0.05)
  574. for i = 1,#tMessages do
  575. if tMessages[i]["currentticks"] == 0 then
  576. table.remove(tMessages, i)
  577. else
  578. tMessages[i]["currentticks"] = tMessages[i]["currentticks"]-1
  579. end
  580. end
  581. end
  582. end
  583.  
  584. while true do
  585. parallel.waitForAny(fMainLoop,fChatLoop,fChatTimer)
  586. --sleep(0.05)
  587. end
  588. print(fDirection(0,10,0,0))
  589. --print(#fGetPlayers())
Advertisement
Add Comment
Please, Sign In to add comment