View difference between Paste ID: LUBcauBH and zyxqS7GC
SHOW: | | - or go back to the newest paste.
1-
os.loadAPI("json")
1+
-- Manipulator Laser Defense System
2
-- Originally made by Phaneron
3-
local sensor = peripheral.wrap("right")
3+
-- Modified by LDD (scrollable log, automatic laser detection, design change)
4-
--local gun1 = peripheral.wrap("manipulator_8")
4+
5-
--local gun2 = peripheral.wrap("manipulator_9")
5+
if (not fs.exists("json")) and (not json) then
6-
local manips,guns
6+
	print("No JSON API found! Downloading...")
7
	local prog = http.get("https://pastebin.com/raw/4nRg9CHU")
8
	if not prog then
9
		error("Couldn't download JSON API...")
10
	else
11
		local file = fs.open("json","w")
12
		file.write(prog.readAll())
13
		file.close()
14
		os.loadAPI("json")
15
	end
16
elseif fs.exists("json") and (not json) then	
17
	os.loadAPI("json")
18
end
19
20
local manips,guns,sensor
21
local scr_x,scr_y = term.getSize()
22
log = {}
23-
  guns = {}
23+
24
25
local logadd = function(input)
26
  log[#log+1] = {
27
    txt = input,
28
    time = os.time(),
29
    day = os.day(),
30
  }
31
end
32
33
local ts = tostring
34
35
local assignGuns = function()
36
  manips = {peripheral.find("manipulator")}
37
  guns = {} 
38
  for a = 1, #manips do
39
    if manips[a].fire then
40
      guns[#guns+1] = manips[a]
41
    elseif manips[a].sense then
42
		sensor = manips[a]
43
	end
44
  end
45
end
46
47
assignGuns()
48
49
if #guns == 0 then
50
  error("you've got no guns")
51
end
52
53
local tps = function(vis)
54
  if term.current().setVisible then
55
    term.current().setVisible(vis)
56
    return true
57
  else
58
    return false
59
  end
60
end
61
62
local cwrite = function(txt,y)
63-
phaneronHit = 0
63+
64
  term.setCursorPos((scr_x/2)-math.ceil(#txt/2),y or cy)
65-
-- leave EVERYTHING to me
65+
66
end
67
68
local function fire(gun, entity)
69
  local x = entity.x
70
  local y = entity.y
71
  local z = entity.z
72
  
73
  local pitch = -math.atan2(y, math.sqrt(x * x + z * z))
74
  local yaw = math.atan2(-x, y)
75
  gun.fire(math.deg(yaw), math.deg(pitch), 5)
76
  sleep(0.2)
77
end
78
79
local fuckEmUp = function(target)
80
  assignGuns()
81
  for a = 1, #guns do
82
    fire(guns[a],target)
83
  end
84
end
85-
  ["EldidiStroyrr"] = true --teehee
85+
86
local safeNames = {
87
  ["Phaneron"] = true,
88
  ["EldidiStroyrr"] = true, --teehee
89-
  --if name == "Phaneron" then
89+
90
  ["Cow"] = true,
91-
    if phaneronHit > 5 then
91+
92-
      error("hit 5 times"..phaneronHit)
92+
93
  ["Rabbit"] = true,
94-
 
94+
  ["MushroomCow"] = true,
95-
    
95+
96
  ["XPOrb"] = true,
97
  ["Painting"] = true,
98
  ["Arrow"] = true,
99
  ["plethora:laser"] = true,
100
}
101
102
function isATarget(name)
103
  if safeNames[name] then
104
    return false
105
  else
106
    return true
107
  end
108
end
109
110
term.setBackgroundColor(colors.black)
111
term.clear()
112
term.setTextColor(term.isColor() and colors.yellow or colors.lightGray)
113
cwrite("Phaneron Laser Defence System",2)
114
term.setTextColor(colors.gray)
115
cwrite("-- None shall pass! --",3)
116
term.setTextColor(colors.lightGray)
117
cwrite("(lasers: "..#guns..")\n",4)
118
term.setTextColor(colors.white)
119
print(" Log of worthless peons:\n")
120
local doTheSense = function()
121
  while true do
122-
      else 
122+
123-
        -- print(json.encode(r))
123+
124
      if isATarget(r.name) and r.x ~= nil then
125
        if r.x > 6 then
126
          logadd("Engaged: '"..r.name.."'")
127
          os.queueEvent("laserlog_update")
128
          fuckEmUp(r)
129
        end
130
      end
131
    end
132
  end
133
end
134
135
local renderLog = function(scroll,topY)
136
  tps(false)
137
  for a = topY,scr_y do
138
    term.setCursorPos(1,a)
139
    term.clearLine()
140
    local lpos = scroll+(a-(topY-1))
141
    if log[lpos] then
142
      term.blit(ts(lpos)..(" "):rep(#ts(#log)-#ts(lpos)),("8"):rep(#ts(#log)),("7"):rep(#ts(#log)))
143
      term.write(" "..log[lpos].txt)
144
    end
145
  end
146
  tps(true)
147
end
148
149
local endbuf = 6
150
local handleGUI = function()
151
  while true do
152
    local evt,dir = os.pullEvent()
153
    if evt == "mouse_scroll" then
154
      if dir+logscroll >= 0 and dir+logscroll <= (#log-(scr_y-endbuf)) then
155
        logscroll = dir+logscroll
156
        renderLog(logscroll,6)
157
      end
158
    elseif evt == "laserlog_update" then
159
      if logscroll >= (#log-(scr_y-endbuf)-1) then
160
        logscroll = #log-(scr_y-endbuf)
161
      end
162
      renderLog(logscroll,6)
163
    elseif evt == "key" then
164
      local scrolldist
165
      if dir == keys.up then
166
        scrolldist = -1
167
      elseif dir == keys.down then
168
        scrolldist = 1
169
      elseif dir == keys.pageUp then
170
        scrolldist = -(scr_y-endbuf)
171
      elseif dir == keys.pageDown then
172
        scrolldist = scr_y-endbuf
173
      elseif dir == keys.home then
174
        scrolldist = -#log
175
      elseif dir == keys["end"] then
176
        scrolldist = #log
177
      else
178
        scrolldist = 0
179
      end
180
      logscroll = math.max(0,math.min(logscroll+scrolldist,#log-(scr_y-endbuf)))
181
    end
182
  end
183
end
184
185
parallel.waitForAny(doTheSense,handleGUI)