-- 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)
Warp Drive controller for OC
in Programming
Posted
This one worked fine to me.