mcwarpupdater lua

This commit is contained in:
YuRaNnNzZZ 2014-08-17 18:27:47 +04:00
parent 88dff16aef
commit f2a3f19bf1

View file

@ -1,483 +0,0 @@
if not term.isColor() then
print("Advanced computer required")
exit()
end
print("loading...")
-- set alarm side if you need this
Alarm = "top"
Style = {
CDeflt = colors.white,
BGDeflt = colors.blue,
CTitle = colors.black,
BGTitle = colors.cyan,
CWarn = colors.white,
BGWarn = colors.red
}
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.writeLine(textutils.serialize(SData))
file.close()
end
function ReadData()
local file = fs.open("shipdata.txt", "r")
SData = textutils.unserialize(file.readAll())
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 = warp.get_dx()
local dz = warp.get_dz()
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 = warp.get_energy_level()
Show(" Energy = "..math.floor(energy / 1000000).." % ("..energy.."EU)")
Show(" Attached players = "..warp.get_attached_players())
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)")
local event, keycode = os.pullEvent("key")
if keycode == 21 then
return true
else
return false
end
end
function Warp()
rs.setOutput(Alarm, false)
sleep(1)
warp.set_direction(SData.Direction)
if IsInHyper then
warp.set_mode(2)
else
warp.set_mode(1)
end
warp.do_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
sleep(0.3)
SData.Distance = tonumber(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.")
os.pullEvent("key")
CalcRealDistance()
else
if not IsInHyper then
SData.Distance = SData.Distance - RealDistance
end
warp.set_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()
local event, keycode = os.pullEvent("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()
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...")
warp.dim_setp(GFront, GRight, GUp)
warp.dim_setn(GBack, GLeft, GDown)
Weight = warp.get_ship_size()
end
function Summon()
Clear()
ShowTitle("<==== Summon players ====>")
local players = Explode(",", warp.get_attached_players())
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
warp.summon_all()
else
input = tonumber(input)
warp.summon(input - 1)
end
end
function JumpToBeacon()
Clear()
ShowTitle("<==== Jump to beacon ====>")
sleep(0.3)
term.write("Enter beacon frequency: ")
local freq = tostring(read())
rs.setOutput(Alarm, true)
if Confirm() then
rs.setOutput(Alarm, false)
warp.set_mode(4)
warp.set_beacon_frequency(freq)
warp.do_jump()
end
rs.setOutput(Alarm, false)
end
function JumpToGate()
Clear()
ShowTitle("<==== Jump to JumpGate ====>")
sleep(0.3)
term.write("Enter jumpgate name: ")
local name = tostring(read())
rs.setOutput(Alarm, true)
if Confirm() then
rs.setOutput(Alarm, false)
warp.set_mode(6)
warp.set_target_jumpgate(name)
warp.do_jump()
end
rs.setOutput(Alarm, false)
end
function SetShipName()
Clear()
ShowTitle("<==== Set ship name ====>")
sleep(0.3)
term.write("Enter ship name: ")
SData.Shipname = tostring(read())
os.setComputerLabel(SData.Shipname)
warp.set_core_frequency(SData.Shipname)
SaveData()
os.reboot()
end
if fs.exists("shipdata.txt") then
ReadData()
else
SData = {
Summon = false,
Distance = 1,
Direction = 0,
Shipname = ""
}
end
SetColorDeflt()
Side = { "bottom", "top", "back", "left", "right" }
for i = 1,5 do
if peripheral.getType(Side[i]) == "warpcore" then
warp = peripheral.wrap(Side[i])
break
else
warp = nil
end
end
if warp == nil then
ShowWarning("No warpcore controller detected")
os.pullEvent("key")
os.reboot()
end
if SData.Shipname == "" then
SetShipName()
end
Title = "<JumpShip \""..SData.Shipname.."\">"
if SData.Summon then
warp.summon_all()
end
GFront, GRight, GUp = warp.dim_getp()
GBack, GLeft, GDown = warp.dim_getn()
IsInHyper = warp.is_in_hyperspace()
repeat
X = warp.get_x()
sleep(0.3)
until X ~= nil
Y = warp.get_y()
Z = warp.get_z()
repeat
isAttached = warp.isAttached()
sleep(0.3)
until isAttached ~= false
repeat
Weight = warp.get_ship_size()
sleep(0.3)
until Weight ~= nil
CalcRealDistance()
warp.set_mode(1)
mainloop = true
while(mainloop) do
Clear()
ShowInfo()
term.setCursorPos(1, 15)
SetColorTitle()
ShowMenu("D - Dimensions, M - Toggle summon, N - Ship name")
ShowMenu("S - Set Warp Data, J - Jump, G - Jump to JumpGate")
ShowMenu("B - Jump to Beacon, H - Jump to Hyperspace")
ShowMenu("C - Summon crew, X - Shutdown WarpCore and Exit")
SetColorDeflt()
local event, keycode = os.pullEvent("key")
if keycode == 31 then
SetDirection()
SetDistance()
SaveData()
elseif keycode == 50 then
if SData.Summon then
SData.Summon = false
else
SData.Summon = true
end
SaveData()
elseif keycode == 32 then
SetDimensions()
SaveData()
elseif keycode == 36 then
rs.setOutput(Alarm, true)
if Confirm() then
Warp()
end
rs.setOutput(Alarm, false)
elseif keycode == 46 then
Summon()
elseif keycode == 48 then
JumpToBeacon()
elseif keycode == 34 then
JumpToGate()
elseif keycode == 35 then
rs.setOutput(Alarm, true)
if Confirm() then
rs.setOutput(Alarm, false)
warp.set_mode(5)
warp.do_jump()
end
rs.setOutput(Alarm, false)
elseif keycode == 45 then
mainloop = false
elseif keycode == 49 then
SetShipName()
end
end
if SData.Summon then
SData.Summon = false
SaveData()
end
Clear()
print("wish you good")
warp.set_mode(0)
sleep(0.5)
os.shutdown()