Jump to content
  • Sky
  • Blueberry
  • Slate
  • Blackcurrant
  • Watermelon
  • Strawberry
  • Orange
  • Banana
  • Apple
  • Emerald
  • Chocolate
  • Charcoal

Sasszem

Members
  • Content Count

    1
  • Joined

  • Last visited

Posts posted by Sasszem

  1.     -- Component lib for access to the gpu
        local component = require "component"
         
        -- Put term lib into local space..
        local term = require "term"
         
        -- Other libs we need as well
        local textutils = require("serialization") -- CC to OC. The 'serialize' method is used the same here i think....
        local gpu = component.getPrimary("gpu")
        local fs = require("filesystem")
        local event = require("event")
        local keyboard = require("keyboard")
        local os=require("os")
        -- 'term' Compatibility. These libs are similar in interface but OC lib has shorter method names. 
        term.setCursorPos, term.getCursorPos = term.setCursor, term.getCursor
        term.setTextColor, term.setBackgroundColor = gpu.setForeground, gpu.setBackground
        read=term.read 
        sleep=os.sleep
        print("loading...")
        warp = component.warpdriveShipController
         
        Style = {
         CDeflt = 0xFFFFFF,
         BGDeflt = 0x0000FF,
         CTitle = 0x000000,
         BGTitle = 0x0092FF,
         CWarn = 0xFFFFFF,
         BGWarn = 0xFF0000
        }
         
        function SetColorDeflt()
         term.setBackgroundColor(Style.BGDeflt)
         term.setTextColor(Style.CDeflt)
        end
         
        function SetColorTitle()
         term.setBackgroundColor(Style.BGTitle)
         term.setTextColor(Style.CTitle)
        end
         
        function SetColorWarn()
         term.setBackgroundColor(Style.BGWarn)
         term.setTextColor(Style.CWarn)
        end
         
        function Clear()
         term.clear()
         term.setCursorPos(1,1)
        end
         
        function Show(Text)
         term.write(Text)
         local xt,yt = term.getCursorPos()
         term.setCursorPos(1, yt+1)
        end
         
        function ShowTitle(Text)
         SetColorTitle()
         term.setCursorPos(12, 1)
         Show(Text)
         SetColorDeflt()
        end
         
        function ShowMenu(Text)
         term.write(Text)
         local xt, yt = term.getCursorPos()
         for i = xt, 51 do
          term.write(" ")
         end
         term.setCursorPos(1, yt+1)
        end
         
        function ShowWarning(Text)
          SetColorWarn()
          term.setCursorPos(10, 19)
          term.write(" "..Text.." ")
          SetColorDeflt()
        end
         
        function SaveData()
         local file = fs.open("shipdata.txt", "w")
         file:write(textutils.serialize(SData))
         file:close()
        end
         
        function ReadData()
         local file = fs.open("shipdata.txt", "r")
         local size=fs.size("shipdata.txt")
         local rawD=file:read(size)
         print(rawD)
         SData = textutils.unserialize(rawD)
         file:close()
        end
         
        function Explode(d, p)
         local t, ll
         t = {}
         ll = 0
         if(#p == 1) then return {p} end
         while true do
          l = string.find(p ,d, ll, true)
          if l ~= nil then 
           table.insert(t, string.sub(p, ll, l-1))
           ll = l+1
          else
           table.insert(t, string.sub(p, ll))
           break
          end
         end
         return t
        end
         
        function ShowDirection()
         if SData.Direction == 1 then
          Show(" Direction        = Up")
         elseif SData.Direction == 2 then
          Show(" Direction        = Down")
         elseif SData.Direction == 0 then
          Show(" Direction        = Front")
         elseif SData.Direction == 180 then
          Show(" Direction        = Back")
         elseif SData.Direction == 90 then
          Show(" Direction        = Left")
         elseif SData.Direction == 255 then
          Show(" Direction        = Right")
         end
        end
         
        function CalcRealDistance()
         if IsInHyper then
          RealDistance = SData.Distance * 100
          MinimumDistance = 1
          JumpCost = (1000 * Weight) + (1000 * SData.Distance)
         else
          if SData.Direction == 1 or SData.Direction == 2 then
           MinimumDistance = GUp + GDown
           RealDistance = SData.Distance + MinimumDistance
          elseif SData.Direction == 0 or SData.Direction == 180 then
           MinimumDistance = GFront + GBack
           RealDistance = SData.Distance + MinimumDistance
          elseif SData.Direction == 90 or SData.Direction == 255 then
           MinimumDistance = GLeft + GRight
           RealDistance = SData.Distance + MinimumDistance
          end
          MinimumDistance = MinimumDistance + 1
          JumpCost = (10 * Weight) + (100 * SData.Distance)
         end
        end
         
        function CalcNewCoords(cx, cy, cz)
         local res = {x=cx, y=cy, z=cz}
         if SData.Direction == 1 then
          res.y = res.y + RealDistance
         elseif SData.Direction == 2 then
          res.y = res.y - RealDistance
         end
         local dx = component.warpdriveShipController.direction("X")
         local dz = component.warpdriveShipController.direction("Z")
         if dx ~= 0 then
          if SData.Direction == 0 then
           res.x = res.x + (RealDistance * dx)
          elseif SData.Direction == 180 then
           res.x = res.x - (RealDistance * dx)
          elseif SData.Direction == 90 then
           res.z = res.z + (RealDistance * dx)
          elseif SData.Direction == 255 then
           res.z = res.z - (RealDistance * dx)
          end
         else
          if SData.Direction == 0 then
           res.z = res.z + (RealDistance * dz)
          elseif SData.Direction == 180 then
           res.z = res.z - (RealDistance * dz)
          elseif SData.Direction == 90 then
           res.x = res.x + (RealDistance * dz)
          elseif SData.Direction == 255 then
           res.x = res.x - (RealDistance * dz)
          end
         end
         return res
        end
         
        function ShowInfo()
         ShowTitle(Title)
         Show("Core:")
         Show(" x, y, z          = "..X..", "..Y..", "..Z)
         local energy = component.warpdriveShipController.energy()
         Show(" Energy           = "..math.floor(energy / 1000000).." % ("..energy.."EU)")
         Show(" Attached players = "..component.warpdriveShipController.getAttachedPlayers())
         Show("Dimensions:")
         Show(" Front, Right, Up = "..GFront..", "..GRight..", "..GUp)
         Show(" Back, Left, Down = "..GBack..", "..GLeft..", "..GDown)
         Show(" Size             = "..Weight.." blocks")
         Show("Warp data:")
         ShowDirection()
         local dest = CalcNewCoords(X, Y, Z)
         Show(" Distance         = "..RealDistance.." ("..JumpCost.."EU, "..math.floor(energy/JumpCost).." jumps)")
         Show(" Dest.coordinates = "..dest.x..", "..dest.y..", "..dest.z)
         if SData.Summon then
          Show(" Summon after     = Yes")
         else
          Show(" Summon after     = No")
         end
        end
         
        function Confirm()
         ShowWarning("Are you sure? (y/n)")
         ev, p1, p2, p3, p4, p5 = event.pull("key_down")
         local char = keyboard.keys[p3]
         if char == 'y' then
          return true
         else
          return false
         end
        end
         
        function Warp()
         os.sleep(1)
         component.warpdriveShipController.direction(SData.Direction)
         if IsInHyper then
          component.warpdriveShipController.mode(2)
         else
          component.warpdriveShipController.mode(1)
         end
         component.warpdriveShipController.jump()
        end
         
        function SetDistance()
         Clear()
         ShowTitle("<====  Set distance  ====>")
         SData.Distance = 0
         CalcRealDistance()
         MaximumDistance = MinimumDistance + 127
         if IsInHyper then
          term.write("Distance * 100 (min "..MinimumDistance..", max "..MaximumDistance.."): ")
         else
          term.write("Distance (min "..MinimumDistance..", max "..MaximumDistance.."): ")
         end
         os.sleep(0.3)
         SData.Distance = tonumber(term.read())
         if SData.Distance == nil then SData.Distance = 1 end
         if SData.Distance < MinimumDistance or SData.Distance > MaximumDistance then
          SData.Distance = 1
          ShowWarning("Wrong distance. Try again.")
          event.pull("key")
          CalcRealDistance()
         else
          if not IsInHyper then
           SData.Distance = SData.Distance - RealDistance
          end
          warp.distance(SData.Distance)
          CalcRealDistance()
         end
        end
         
        function SetDirection()
     local drun = true
     while(drun) do
      Clear()
      ShowTitle("<==== Set direction ====>")
      ShowDirection()
      term.setCursorPos(1, 16)
      SetColorTitle()
      ShowMenu("Use directional keys")
      ShowMenu("W/S keys for Up/Down")
      ShowMenu("Enter - confirm")
      SetColorDeflt()
      _,_,_,keycode=event.pull("key")
      if keycode == 200 then
       SData.Direction = 0
      elseif keycode == 17 then
       SData.Direction = 1
      elseif keycode == 203 then
       SData.Direction = 90
      elseif keycode == 205 then
       SData.Direction = 255
      elseif keycode == 208 then
       SData.Direction = 180
      elseif keycode == 31 then
       SData.Direction = 2
      elseif keycode == 28 then
       drun = false
      end
     end
    end
     
    function SetDimensions()
     Clear()
     os.sleep(0.3)
     ShowTitle("<==== Set dimensions ====>")
     term.write(" Front ("..GFront..") : ")
     GFront = tonumber(read())
     term.write(" Right ("..GRight..") : ")
     GRight = tonumber(read())
     term.write(" Up    ("..GUp..") : ")
     GUp = tonumber(read())
     term.write(" Back  ("..GBack..") : ")
     GBack = tonumber(read())
     term.write(" Left  ("..GLeft..") : ")
     GLeft = tonumber(read())
     term.write(" Down  ("..GDown..") : ")
     GDown = tonumber(read())
     term.write("Setting dimensions...")
     component.warpdriveShipController.dim_positive(GFront, GRight, GUp)
     component.warpdriveShipController.dim_negative(GBack, GLeft, GDown)
    end
     
    function Summon()
     Clear()
     ShowTitle("<==== Summon players ====>")
     local players = Explode(",", component.warpdriveShipController.getAttachedPlayers())
     for i = 1, #players do
      Show(i..". "..players[i])
     end
     SetColorTitle()
     ShowMenu("Enter player number")
     ShowMenu("or press enter to summon everyone")
     SetColorDeflt()
     sleep(0.3)
     term.write(":")
     local input = read()
     if input == "" then
      component.warpdriveShipController.summon_all()
     else
      input = tonumber(input)
      component.warpdriveShipController.summon(input - 1)
     end
    end
     
    function JumpToBeacon()
     Clear()
     ShowTitle("<==== Jump to beacon ====>")
     sleep(0.3)
     term.write("Enter beacon frequency: ")
     local freq = tostring(read())
     if Confirm() then
      component.warpdriveShipController.mode(4)
      component.warpdriveShipController.beaconFrequency(freq)
      component.warpdriveShipController.jump()
     end
    end
     
    function JumpToGate()
     Clear()
     ShowTitle("<==== Jump to JumpGate ====>")
     os.sleep(0.3)
     term.write("Enter jumpgate name: ")
     local name = tostring(read())
     if Confirm() then
      print(name)
      os.sleep(10)
      component.warpdriveShipController.mode(6)
      component.warpdriveShipController.targetJumpgate(name)
      component.warpdriveShipController.jump()
     
    end
    end
     
     
    if fs.exists("shipdata.txt") then
     ReadData()
    else
     SData = {
      Summon = false,
      Distance = 1,
      Direction = 0
     }
    end
     
    component.gpu.setResolution(50, 20)
    SetColorDeflt()
     
    component.getPrimary("warpdriveShipController") 
     
    if SData.Summon then
     component.warpdriveShipController.summon_all()
    end
     
    GFront, GRight, GUp = component.warpdriveShipController.dim_positive()
    GBack, GLeft, GDown = component.warpdriveShipController.dim_negative()
    IsInHyper = component.warpdriveShipController.isInHyperspace()
    X, Y, Z  = component.warpdriveShipController.position()
    Weight = component.warpdriveShipController.getShipSize()
     
    CalcRealDistance()
     
    component.warpdriveShipController.mode(1)
     
    mainloop = true
    while(mainloop) do
     Clear()
     ShowInfo()
     term.setCursorPos(1, 15)
     SetColorTitle()
     ShowMenu("D - Dimensions, M - Toggle summon")
     ShowMenu("S - Set Warp Data, J - Jump, G - Jump to JumpGate")
     ShowMenu("B - Jump to Beacon, H -Jump to Hyperspace")
     ShowMenu("C - Summon, X - Shutdown WarpCore and Exit")
     SetColorDeflt()
     ev, p1, p2, p3, p4, p5 = event.pull("key_down")
     if ev == "key_down" then
      local char = keyboard.keys[p3]
        if char == "s" then
       SetDirection()
       SetDistance()
       SaveData()
      elseif char == "m" then
       if SData.Summon then
        SData.Summon = false
       else
        SData.Summon = true
       end
      SaveData()
      elseif char == "d" then
       SetDimensions()
       SaveData()
      elseif char == "j" then
       if Confirm() then
        Warp()
       end
      elseif char == "c" then
       Summon()
      elseif char == "b" then
       JumpToBeacon()
      elseif char == "g" then
       JumpToGate()
      elseif char == "h" then
       if Confirm() then
        component.warpdriveShipController.mode(5)
        component.warpdriveShipController.jump()
       end
      elseif char == "x" then
       mainloop = false
      end
     end
    end
     
    if SData.Summon then
     SData.Summon = false
     SaveData()
    end
    Clear()
    print("Shutting Down")
    component.warpdriveShipController.mode(0)
    os.sleep(0.5)
    

    This one worked fine to me.

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use and Privacy Policy.