9551

WireVR-- virtual positioning API

Aug 20th, 2021 (edited)
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 11.72 KB | None | 0 0
  1. --*WireVR--
  2. --*computercraft OS for VR by 9551Dev--
  3. local middle = {x=0,z=0}
  4. local offset = {x=-0.5,z=-0.5}
  5. local power = 0.035
  6. local defects = 50
  7. local maxpower = 10
  8. local DefGroundLevel = 0
  9. local useCanvas = true
  10. local state = true
  11. local moveBack = true
  12. local GPcheckerQuality = 1
  13. local doMoves = 1
  14. local controls = {
  15.     forward = keys.w,
  16.     backward = keys.s,
  17.     left = keys.a,
  18.     right = keys.d,
  19.     shift = keys.leftShift,
  20.     jump = keys.space
  21. }
  22. if not fs.exists("ButtonH") then shell.run("pastebin get LTDZZZEJ ButtonH") end
  23. local b = require("ButtonH").terminal
  24.  
  25. local controlsList = {
  26.     ["forward"] = true,
  27.     ["backward"] = true,
  28.     ["left"] = true,
  29.     ["right"] = true,
  30.     ["shift"] = true,
  31.     ["jump"] = true
  32. }
  33. local per = peripheral.wrap("back")
  34. local vpos
  35. local eventQueue = {}
  36. local setGroundPerPos = {}
  37. local engineState = true
  38. local groundLevel = DefGroundLevel
  39. local currentPos = vector.new(0,0,0)
  40. local setPosition = function(x,y,z) currentPos = vector.new(x,y,z) end
  41. local setGroundLevel = function(height) DefGroundLevel = height end
  42. local useVposForMoveback
  43. local getVPOS = function()
  44.     local vpos = vpos or vector.new(0,0,0)
  45.     return vector.new(vpos.z,vpos.y,-vpos.x)
  46. end
  47. local floorVector = function(vec)
  48.     local x = math.floor(vec.x)
  49.     local y = math.floor(vec.y)
  50.     local z = math.floor(vec.z)
  51.     return vector.new(x,y,z)
  52. end
  53. local vecMathMin = function(vec,vec2)
  54.     local x = math.min(vec.x,vec2.x)
  55.     local y = math.min(vec.y,vec2.y)
  56.     local z = math.min(vec.z,vec2.z)
  57.     return vector.new(x,y,z)
  58. end
  59. local inVecMathMax = function(vec)
  60.     return math.max(vec.x,vec.y,vec.z)
  61. end
  62. local getVecLength = function(vec)
  63.     local x = #(tostring(vec.x))
  64.     local y = #(tostring(vec.y))
  65.     local z = #(tostring(vec.z))
  66.     return vector.new(x,y,z)
  67. end
  68. local meta
  69. local om
  70. local getPlayerData = function()
  71.     if meta then om = meta end
  72.     meta = per.getMetaOwner()
  73.     local meta = meta or om
  74.     return meta.yaw,meta.pitch,meta.isSprinting,meta.isSneaking
  75. end
  76. local getPlayerPos = function()
  77.     local x,_,z = gps.locate()
  78.     return x,z
  79. end
  80. local eventYield = function()
  81.     os.queueEvent("faked")
  82.     os.pullEvent("faked")
  83. end
  84. local isIn = function(posX,posY,startX,startY,length,height)
  85.     return posX >= startX and
  86.     posX <= startX + length and
  87.     posY >= startY and
  88.     posY <= startY + height
  89. end
  90. local move = function()
  91.     power = power + defects / 1000
  92.     local xy,_,zy = gps.locate()
  93.     local tempx,tempz
  94.     local Cnter = 0
  95.     while state do
  96.         if moveBack then
  97.             if Cnter == GPcheckerQuality then
  98.                 Cnter = 0
  99.                 tempx,_,tempz = gps.locate()
  100.             else
  101.                 Cnter = Cnter + 1
  102.             end
  103.             xy,zy = (tempx or xy), (tempz or zy)
  104.             local xyz,zyz = xy-(middle.x-offset.x),zy-(middle.z-offset.z)
  105.             for i=1,doMoves do
  106.                 local yaw = math.deg(math.atan2(-xyz, zyz))
  107.                 local power = math.min(math.sqrt(xyz^2+zyz^2)*power,maxpower)
  108.                 per.launch(yaw-180,0,power)
  109.             end
  110.         else
  111.             sleep(1)
  112.         end
  113.         sleep(0.1)
  114.     end
  115. end
  116. local menu = function()
  117.     engineState = false
  118.     sleep(0.5)
  119.     while state do
  120.         if eventQueue[controls.shift] then
  121.             sleep(0.5)
  122.             break
  123.         end
  124.         if useCanvas then
  125.             per.look(180,0);
  126.             (canvasMenuFunc or function() end)()
  127.         else
  128.             per.look(180,0);
  129.             (canvasFreeMenuFunc or function() end)()
  130.         end
  131.         sleep(0.5)
  132.     end
  133. end
  134. local jump = false
  135. local lookVector
  136. local vPos = function()
  137.     local YAW_ROT
  138.     local PITCH_ROT
  139.     local lookAng
  140.     local addUp
  141.     local keyUpEv
  142.     local keyDownEv
  143.     local ran = false
  144.     local keyDown = function()
  145.         while state do
  146.             _,keyDownEv = os.pullEvent("key")
  147.             if not eventQueue[keyDownEv] then
  148.                 eventQueue[keyDownEv] = true
  149.             end
  150.         end
  151.     end
  152.     local keyUp = function()
  153.         while state do
  154.             _,keyUpEv = os.pullEvent("key_up")
  155.             eventQueue[keyUpEv] = false
  156.         end
  157.     end
  158.     function lookVector(angle)
  159.         local rads = math.rad(angle - 180)
  160.         local divider = 4
  161.         local _,_,sprint,sneak = getPlayerData()
  162.         if sprint then divider = 2 end
  163.         if sneak then divider = 13 end
  164.         return {
  165.             x = math.cos(rads)/divider,
  166.             z = math.sin(rads)/divider
  167.         }
  168.     end
  169.     local MovementHandle = function()
  170.         while state do
  171.             if engineState then
  172.                 YAW_ROT,PITCH_ROT = getPlayerData()
  173.                 if not eventQueue[controls.right] and not eventQueue[controls.left] then
  174.                     lookAng = lookVector(YAW_ROT)
  175.                 elseif eventQueue[controls.right] then
  176.                     lookAng = lookVector(YAW_ROT+90)
  177.                 elseif eventQueue[controls.left] then
  178.                     lookAng = lookVector(YAW_ROT-90)
  179.                 end
  180.                 addUp = vector.new(lookAng.x,0,lookAng.z)
  181.                 if eventQueue[controls.right] or eventQueue[controls.left] then
  182.                     currentPos = currentPos:add(addUp)
  183.                 end
  184.                 if eventQueue[controls.forward] then
  185.                     if eventQueue[controls.right] or eventQueue[controls.left] then
  186.                         lookAng = lookVector(YAW_ROT)
  187.                         addUp = vector.new(lookAng.x,0,lookAng.z)
  188.                     end
  189.                     currentPos = currentPos:add(addUp)
  190.                 end
  191.                 if eventQueue[controls.backward] then
  192.                     if eventQueue[controls.right] or eventQueue[controls.left] then
  193.                         lookAng = lookVector(YAW_ROT)
  194.                         addUp = vector.new(lookAng.x,0,lookAng.z)
  195.                     end
  196.                     currentPos = currentPos:add(-addUp)
  197.                 end
  198.                 if eventQueue[controls.jump] then
  199.                     if not jump then
  200.                         jump = true
  201.                     end
  202.                 end
  203.                 vpos = currentPos
  204.                 ran = true
  205.             end
  206.             sleep(0.05)
  207.         end
  208.     end
  209.     local main = function()
  210.         while state do
  211.             local isEmptySpace = true
  212.             if ran then
  213.                 engineState = true
  214.                 YAW_ROT,PITCH_ROT = getPlayerData()
  215.                 for _,v in pairs(setGroundPerPos) do
  216.                     if isIn(currentPos.x,currentPos.z,v.f.x,v.f.z,v.t[1],v.t[2]) then
  217.                         groundLevel = v.fl
  218.                         isEmptySpace = false
  219.                     end
  220.                 end
  221.                 if isEmptySpace then
  222.                     groundLevel = DefGroundLevel
  223.                 end
  224.                 sleep(0.05)
  225.             end
  226.             sleep(0.05)
  227.         end
  228.     end
  229.         local gravity = function()
  230.             local jump
  231.             local animationQuality = 10
  232.             local GRAVITY_ACCELERATION_Y = -0.5
  233.             local JUMP_SPEED = 1.19/animationQuality
  234.             local GRAVITY = vector.new(0, GRAVITY_ACCELERATION_Y, 0)
  235.             local JUMP = vector.new(0, JUMP_SPEED, 0)
  236.             local playerVelocity = vector.new(0, 0, 0)
  237.             local lastTime = os.epoch("utc")
  238.             while state do
  239.                 if eventQueue[controls.jump] and jump then
  240.                     for _=1,animationQuality do
  241.                         currentPos = currentPos + JUMP
  242.                         sleep()
  243.                     end
  244.                 end
  245.                 local currentTime = os.epoch("utc")
  246.                 if currentPos.y > groundLevel then
  247.                     jump = false
  248.                     local diffTime = (os.epoch("utc") - lastTime) / 1000
  249.                     currentPos = currentPos + (playerVelocity * diffTime)
  250.                     playerVelocity = playerVelocity + GRAVITY
  251.                     if currentPos.y < groundLevel then currentPos.y = groundLevel end
  252.                 else
  253.                     jump = true
  254.                     playerVelocity = vector.new(0, 0, 0)
  255.                 end
  256.                 lastTime = currentTime
  257.                 os.sleep()
  258.             end
  259.         end
  260.     local menuRunner = function()
  261.         while state do
  262.             if eventQueue[controls.shift] and PITCH_ROT == 90 then
  263.                 menu()
  264.             end
  265.             sleep(0.1)
  266.         end
  267.     end
  268.     parallel.waitForAll(keyUp,keyDown,MovementHandle,gravity,menuRunner,main)
  269. end
  270. local safety = function()
  271.     local ran = false
  272.     while not ran do
  273.         if not ran and not state then
  274.             os.queueEvent("key",0)
  275.             os.queueEvent("key_up",0)
  276.             ran = true
  277.         end
  278.         sleep()
  279.     end
  280. end
  281. local LAUNCH = function() parallel.waitForAll(vPos,move,safety) end
  282. local getEventQueue = function() return eventQueue end
  283. local getEngineState = function() return engineState end
  284. local setMiddle = function(x,z) middle = {x=x,z=z} end
  285. local setOffset = function(x,z) offset = {x=x,z=z} end
  286. local setMaxPower = function(power) maxpower = math.min(power,10) end
  287. local canvasMenu = function(bool) useCanvas = bool end
  288. local getGroundLevel = function() return groundLevel end
  289. local getButtonAPI = function() return b end
  290. local setState = function(stateVar) state = stateVar end
  291. local doMoveBack = function(state) moveBack = state end
  292. local setGPcheckerQuality = function(value) GPcheckerQuality = value end
  293. local setMovePrecision = function(value) doMoves = value end
  294. local getAllPData = function()
  295.     local meta = per.getMetaOwner()
  296.     local x,y,z = gps.locate()
  297.     local playerData = {
  298.         rot = vector.new(meta.pitch, meta.yaw, 0),
  299.         loc = vector.new(x,y,z)
  300.     }
  301.     return playerData
  302. end
  303. local VPDT = function()
  304.     local meta = per.getMetaOwner()
  305.     local playerData = {
  306.         rot = vector.new(meta.pitch, meta.yaw, 0),
  307.         loc = getVPOS()
  308.     }
  309.     return playerData
  310. end
  311. local setControls = function(control,key)
  312.     if not controlsList[control] then
  313.         print("invalid control please use:")
  314.         for k,_ in pairs(controlsList) do
  315.             print(k)
  316.         end
  317.     end
  318.     if not keys[key] then print("invalid key") end
  319.     controls[control] = keys[key]
  320. end
  321. local colors2rgb = function(ins,mode)
  322.     if not mode then
  323.         mode = 255
  324.     end
  325.     local r,g,b = term.getPaletteColor(ins)
  326.     return r*mode,g*mode,b*mode
  327. end
  328. local setPosGround = function(StartTable,ScaleTable,GL)
  329.     table.insert(setGroundPerPos,{f=StartTable,t=ScaleTable,fl=GL})
  330. end
  331. local setMenuFunction = function(func,isCanvas)
  332.     if isCanvas then canvasMenuFunc = func
  333.     else canvasFreeMenuFunc = func end
  334. end
  335. return {
  336.     launch = LAUNCH,
  337.     setMaxPower = setMaxPower,
  338.     setOffset = setOffset,
  339.     setMiddle = setMiddle,
  340.     getVPos = getVPOS,
  341.     floorVector = floorVector,
  342.     getPlayerPos = getPlayerPos,
  343.     getPlayerData = getPlayerData,
  344.     eventYield = eventYield,
  345.     getEventQueue = getEventQueue,
  346.     lookVector = lookVector,
  347.     getEngineState = getEngineState,
  348.     setControls = setControls,
  349.     colors2rgb = colors2rgb,
  350.     setGroundLevel = setGroundLevel,
  351.     vecMathMin = vecMathMin,
  352.     canvasMenu = canvasMenu,
  353.     isIn = isIn,
  354.     setPosGround = setPosGround,
  355.     getGroundLevel = getGroundLevel,
  356.     setPosition = setPosition,
  357.     openMenu = menu,
  358.     getButtonAPI = getButtonAPI,
  359.     inVecMathMax = inVecMathMax,
  360.     getVecLength = getVecLength,
  361.     getAllPData = getAllPData,
  362.     setState = setState,
  363.     getVposARotation = VPDT,
  364.     doMoveBack = doMoveBack,
  365.     setMenuFunction = setMenuFunction,
  366.     setGPcheckerQuality = setGPcheckerQuality,
  367.     setMovePrecision = setMovePrecision
  368. }
  369.  
Add Comment
Please, Sign In to add comment