jaklsfjlsak

激光扫描发射器 水平跳船 投屏 v2

Apr 20th, 2025 (edited)
504
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- Laser‑Guided Warp System (“ztc”) with clean, scaled UI and full X,Y,Z reporting
  2.  
  3. -- 1) Wrap terminal + any attached monitors
  4. local screens = {}
  5.  
  6. -- Terminal wrapper
  7. table.insert(screens, {
  8.   clear              = function() term.clear(); term.setCursorPos(1,1) end,
  9.   getSize            = function() return term.getSize() end,
  10.   setTextColor       = term.setTextColor,
  11.   setBackgroundColor = term.setBackgroundColor,
  12.   setCursorPos       = term.setCursorPos,
  13.   write              = term.write,
  14. })
  15.  
  16. -- Monitor wrappers
  17. for _, side in ipairs(peripheral.getNames()) do
  18.   if peripheral.getType(side) == "monitor" then
  19.     local m = peripheral.wrap(side)
  20.     table.insert(screens, {
  21.       clear              = function() m.clear(); m.setCursorPos(1,1) end,
  22.       getSize            = function() return m.getSize() end,
  23.       setTextColor       = function(c) m.setTextColor(c) end,
  24.       setBackgroundColor = function(c) m.setBackgroundColor(c) end,
  25.       setCursorPos       = function(x,y) m.setCursorPos(x,y) end,
  26.       write              = function(txt) m.write(txt) end,
  27.       monitor            = m,
  28.     })
  29.   end
  30. end
  31.  
  32. -- 2) Auto‑scale monitors so 5 lines (1,3,5) will fit
  33. for _, s in ipairs(screens) do
  34.   if s.monitor then
  35.     local best = 0.5
  36.     for _, scale in ipairs({1, 0.5}) do
  37.       s.monitor.setTextScale(scale)
  38.       local w,h = s.getSize()
  39.       if w >= 40 and h >= 5 then
  40.         best = scale
  41.         break
  42.       end
  43.     end
  44.     s.monitor.setTextScale(best)
  45.   end
  46. end
  47.  
  48. -- 3) Helpers
  49. local function forAll(fn) for _,s in ipairs(screens) do fn(s) end end
  50. local function clearAll()
  51.   forAll(function(s)
  52.     -- fill with lightGray background first
  53.     s.setTextColor(colors.black)
  54.     s.setBackgroundColor(colors.lightGray)
  55.     s.clear()
  56.   end)
  57. end
  58.  
  59. -- 4) Header & Subtitle
  60. local titleText    = "Laser Guided Warp System"
  61. local subtitleText = "Emit Scanning Laser to Warp"
  62.  
  63. local function drawHeader()
  64.   forAll(function(s)
  65.     local w,_ = s.getSize()
  66.     -- Title on line 1 (white on black)
  67.     local xT = math.floor((w - #titleText)/2) + 1
  68.     s.setTextColor(colors.white)
  69.     s.setBackgroundColor(colors.black)
  70.     s.setCursorPos(xT, 1)
  71.     s.write(titleText)
  72.  
  73.     -- Subtitle on line 3 (black on lightGray)
  74.     local xS = math.floor((w - #subtitleText)/2) + 1
  75.     s.setTextColor(colors.black)
  76.     s.setBackgroundColor(colors.lightGray)
  77.     s.setCursorPos(xS, 3)
  78.     s.write(subtitleText)
  79.   end)
  80. end
  81.  
  82. -- 5) Setup warpdriveLaserCamera peripherals
  83. rednet.open("top")
  84. local lasers = peripheral.getNames()
  85. for i=#lasers,1,-1 do
  86.   if peripheral.getType(lasers[i]) ~= "warpdriveLaserCamera" then
  87.     table.remove(lasers, i)
  88.   else
  89.     peripheral.wrap(lasers[i]).beamFrequency(1420)
  90.   end
  91. end
  92.  
  93. -- 6) Initial draw
  94. clearAll()
  95. drawHeader()
  96.  
  97. -- 7) Dynamic coordinate line on row 5 (full X, Y, Z)
  98. local function updateCoords(x,y,z)
  99.   local line = string.format("Target: X:%d   Y:%d   Z:%d", x, y, z)
  100.   forAll(function(s)
  101.     local w,_ = s.getSize()
  102.     -- clear line 5
  103.     s.setTextColor(colors.black)
  104.     s.setBackgroundColor(colors.lightGray)
  105.     s.setCursorPos(1,5)
  106.     s.write(string.rep(" ", w))
  107.     -- write centered
  108.     local xs = math.floor((w - #line)/2) + 1
  109.     s.setCursorPos(xs,5)
  110.     s.write(line)
  111.   end)
  112. end
  113.  
  114. -- 8) Main loop: listen for laserScanning, refresh coords, broadcast
  115. while true do
  116.   local _, side, lx, ly, lz = os.pullEvent("laserScanning")
  117.   local tx = tonumber(lx)
  118.   local ty = tonumber(ly)
  119.   local tz = tonumber(lz)
  120.   updateCoords(tx, ty, tz)
  121.   rednet.broadcast({ x=tx, y=ty, z=tz }, "HorizontalJumpBroadcast")
  122. end
  123.  
Advertisement
Add Comment
Please, Sign In to add comment