· last year · May 26, 2024, 05:45 PM
1-- Cloned
2-- Misc Useful Functions
3-- Required by most other programs
4-- <Flexico64@gmail.com>
5
6-------------------------------------------
7-- |¯¯] || |¯¯] \\// /\ |¯\ [¯¯] --
8-- | ] ||_ | ] >< | | | / ][ --
9-- || |__] |__] //\\ |||| || [__] --
10-------------------------------------------
11
12local log_file = "log.txt"
13local options_file = "flex_options.cfg"
14
15-- Defaults; can be changed in config file
16local modem_channel = 6464
17local name_color
18if term.isColor() then
19 name_color = "yellow"
20else
21 name_color = "lightGray"
22end --if/else
23
24
25function getPeripheral(name)
26 local x,sides
27 sides = { "top", "bottom", "left",
28 "right", "front", "back" }
29 local periph = {}
30 for x=1,#sides do
31 if peripheral.getType(sides[x]) == name then
32 periph[#periph+1] = sides[x]
33 end --if
34 end --for
35 return periph
36end --function
37
38
39local modem
40local hasModem = false
41local x = getPeripheral("modem")
42if #x > 0 then
43 hasModem = true
44 modem = peripheral.wrap(x[1])
45 modem.open(modem_channel)
46end --if
47
48function modemOff()
49 local x = getPeripheral("modem")
50 if #x > 0 then
51 modem.close(modem_channel)
52 end --if
53end --function
54
55
56local file
57if not fs.exists(log_file) then
58 file = fs.open(log_file,"w")
59 file.close()
60end --if
61
62
63
64function optionsExport()
65 if fs.exists(options_file) then
66 fs.delete(options_file)
67 end
68 local file
69 while file == nil do
70 file = fs.open(options_file,"w")
71 end
72 file.writeLine("# Flex API Options File #\n")
73 file.writeLine("modem_channel="
74 ..tostring(modem_channel))
75 file.writeLine("name_color="..name_color.."\n")
76 file.close()
77 return true
78end --function
79
80
81function optionsImport()
82 if not fs.exists(options_file) then
83 return false
84 end
85 local file
86 while file == nil do
87 file = fs.open(options_file, "r")
88 end
89
90 local x = file.readLine()
91 while x ~= nil do
92 if string.find(x,"modem_channel")==1 then
93 modem_channel = tonumber(string.sub(x,15))
94 elseif string.find(x,"name_color")==1 then
95 name_color = string.sub(x,12)
96 end --if/else
97 x = file.readLine()
98 end --while
99
100 file.close()
101 return true
102end --function
103
104
105if not optionsImport() then
106 optionsExport()
107end --if
108
109
110
111--==============================--
112
113
114-- Inventory Condense
115function condense(n)
116 if n == nil then n = 1 end
117 n = math.floor(n)
118 if n < 1 or n > 16 then
119 n = 1
120 end --if
121
122 local x,y,slot
123 slot = turtle.getSelectedSlot()
124 for x=n+1,16 do
125 if turtle.getItemCount(x) > 0 then
126
127 for y=n,x-1 do
128 if turtle.getItemCount(y) == 0 or
129 turtle.getItemDetail(x)["name"] ==
130 turtle.getItemDetail(y)["name"] and
131 turtle.getItemSpace(y) > 0 then
132 turtle.select(x)
133 turtle.transferTo(y)
134 end --if
135 if turtle.getItemCount(x) == 0 then
136 break
137 end --if
138 end --for
139
140 end --if
141 end --for
142 turtle.select(slot)
143end --function
144
145
146-- Round n to p decimal places
147function round(n,p)
148 if p == nil then p = 0 end
149 n = n*math.pow(10,p)
150 local m = n - math.floor(n)
151 if m < 0.5 then
152 return math.floor(n) / math.pow(10,p)
153 else
154 return math.ceil(n) / math.pow(10,p)
155 end --if/else
156end --function
157
158
159-- Number to String
160-- Optionally a max length if not an integer
161function tostr(num,len)
162 num = tostring(num)
163 local sci = ""
164
165 local e = string.find(num,"e")
166 if e ~= nil then
167 -- Separate exponent from number
168 sci = string.sub(num,e,-1)
169 num = string.sub(num,1,e-1)
170 end --if
171
172 if string.find(num,"%.") ~= nil then
173 -- Remove extra zeroes from decimal
174 while string.sub(num,string.len(num)) == "0" do
175 num = string.sub(num,1,string.len(num)-1)..""
176 end --while
177 end --if
178
179 if string.sub(num,-1) == "." then
180 -- If all trailing zeroes are gone, erase decimal point
181 num = string.sub(num,1,-2)..""
182 end --if
183
184 if len == nil then
185 -- If no max length specified
186 return num..sci..""
187 end --if
188
189 while string.len(num) + string.len(sci) > len do
190 -- If too long, cut off a decimal digit
191 num = string.sub(num,1,-2)..""
192 end --while
193
194 return num..sci..""
195
196end --function
197
198
199-- Evaluate Expression
200function eval(expression)
201 local solution, err = loadstring(
202 "return "..expression)
203 if err then error(err,2) end
204 local sol = pcall(solution)
205 if not sol then
206 error("Invalid Expression",2)
207 end
208 return solution()
209end --function
210
211
212-- Press any Key
213function getKey()
214 local event, key_code = os.pullEvent("key")
215 return key_code
216end --function
217function keyPress() return getKey() end
218
219
220
221
222-------------------------------
223-- [¯¯] |¯¯] \\// [¯¯] --
224-- || | ] >< || --
225-- || |__] //\\ || --
226-------------------------------
227-- /¯] /¯\ || /¯\ |¯\ --
228-- | [ | O | ||_ | O | | / --
229-- \_] \_/ |__] \_/ | \ --
230-------------------------------
231
232hexchars = "0123456789ABCDEF"
233
234-- Start with named value, get hex char
235function getHex(x)
236 if x == nil then
237 error("Number expected, got nil", 2)
238 end
239 x = round(math.log(x)/math.log(2))
240 if x < 0 or x > 15 then
241 error("Invalid color number", 2)
242 end --if
243 return string.sub(hexchars,x+1,x+1)
244end --function
245
246-- Start with hex char, get named value
247function getVal(x)
248 local z = string.find(hexchars,x)
249 if z == nil then return nil end
250 return math.pow(2,z-1)
251end --function
252
253local send_depth, print_depth = 0, 0
254
255
256
257-------------------------------
258-- Multicolor Print Function --
259-------------------------------
260
261function printColors(message,textColor)
262 local x,y,z,t,skip,margin
263 local xmax,ymax = term.getSize()
264 local oldColor = term.getTextColor()
265 if textColor == nil then
266 textColor = oldColor
267 else
268
269 end --if
270
271 margin = ""
272 for x=1,print_depth do
273 margin = margin.." "
274 end --for
275
276 if type(message) == "table" then
277 if print_depth == 0 then
278 printColors("#0{")
279 end --if
280 print_depth = print_depth + 1
281
282 for x,y in pairs(message) do
283 if type(y) == "table" then
284 printColors(margin.." "..tostring(x).." #0= {",textColor)
285 printColors(y,textColor)
286 else
287 printColors(margin.." "..tostring(x).." #0= #"..
288 getHex(textColor)..tostring(y),textColor)
289 end --if/else
290 end --for
291
292 print_depth = print_depth - 1
293 printColors(margin.."#0}")
294 return
295
296 end --if
297
298 if type(textColor) == "number" then
299 message = "#"..getHex(textColor)
300 ..tostring(message)
301 end --if
302
303 for t=1,string.len(message) do
304
305 skip = false
306 while string.sub(message,t,t) == "#" and
307 not skip do
308
309 -- Found legit "#"
310 if string.sub(message,t+1,t+1) == "#" then
311 message = string.sub(message,1,t)..
312 string.sub(message,t+2)..""
313 skip = true
314
315 else
316 textColor = getVal(string.sub(message,t+1,t+1))
317
318 if textColor == nil then
319 textColor = colors.white
320 end --if
321
322 -- This bit clears out # escapes
323 if t == 1 then
324 message = string.sub(message,3)..""
325 elseif t < string.len(message) then
326 message = string.sub(message,1,t-1)..
327 string.sub(message,t+2)..""
328 elseif t == string.len(message) then
329 message = string.sub(message,1,t-1)..""
330 end --if/else
331
332 end --if
333
334 if t > string.len(message) then
335 break
336 end --if
337
338 end --while (is escape char)
339
340 if t > string.len(message) then
341 break
342 end --if
343
344 -- Actually Print Character
345 x,y = term.getCursorPos()
346 term.setTextColor(textColor)
347
348 if textColor == colors.gray then
349 --term.setBackgroundColor(colors.lightGray)
350
351 elseif textColor == colors.black then
352 term.setBackgroundColor(colors.lightGray)
353
354 end --if/else
355 term.write(string.sub(message,t,t))
356 term.setBackgroundColor(colors.black)
357
358 if t >= string.len(message) then
359 break
360 end --if
361
362 -- Loop Around to Next Row
363 xmax,ymax = term.getSize()
364 if string.sub(message,t,t) == "\n" or x >= xmax then
365 x = 1
366 if y < ymax-1 then
367 y = y + 1
368 else
369 print("")
370 end --if/else
371 else
372 x = x + 1
373 end --if/else
374 term.setCursorPos(x,y)
375
376 end --for
377
378 term.setTextColor(oldColor)
379 print("")
380
381end --function
382
383
384
385------------------------------
386-- Print/Broadcast Function --
387------------------------------
388
389function send(message,textColor)
390 local x,y,z,id,nameColor
391 local oldColor = term.getTextColor()
392
393 local margin = ""
394 for x=1,send_depth do
395 margin = margin.." "
396 end --for
397
398 if type(message) == "table" then
399 if send_depth == 0 then
400 send("#0{")
401 end --if
402 send_depth = send_depth + 1
403
404 for x,y in pairs(message) do
405 if type(y) == "table" then
406 send(margin.." "..tostring(x).." #0= {",textColor)
407 send(y,textColor)
408 else
409 send(margin.." "..tostring(x).." #0= #"
410 ..getHex(textColor)..tostring(y),textColor)
411 end --if/else
412 end --for
413
414 send_depth = send_depth - 1
415 send(margin.."#0}")
416 return
417
418 end --if
419
420
421 if message == nil then
422 message = "nil"
423 end --if
424
425 message = tostring(message)
426 if textColor == nil then
427 textColor = colors.white
428 end --if
429 nameColor = eval("colors."..name_color)
430
431 printColors(message)
432
433 file = fs.open(log_file,"a")
434 file.writeLine(message)
435 file.close()
436
437 if hasModem then
438 id = "#"..getHex(nameColor)..
439 tostring(os.getComputerID()).."#0"
440
441 if os.getComputerLabel() ~= nil then
442 id = id.."|#"..getHex(nameColor)..
443 os.getComputerLabel().."#0"
444 end --if
445
446 id = id..": #"..getHex(textColor)..
447 message..""
448
449 modem.transmit(modem_channel,
450 modem_channel+1,id)
451 sleep(0.1)
452 end --if (hasModem)
453
454 term.setTextColor(oldColor)
455 sleep(0.02)
456end --function (print/broadcast)
457
458
459--================================--
460
461
462args = {...}
463
464if args[1]=="color" or args[1]=="colors" then
465 z = ""
466 for x=0,15 do
467 y = string.sub(hexchars,x+1,x+1)..""
468 z = z.."#"..y..y.."#0 "
469 end --for
470 printColors(z)
471 return
472
473elseif args[1] == "edit" then
474 shell.run("edit "..options_file)
475 optionsImport()
476
477end --if/else
478
479
480
481-------------------------------------------
482-- /¯¯] |¯¯] [¯¯] |¯\ /\ [¯¯] /\ --
483--| [¯| | ] || | | | | || | | --
484-- \__| |__] || |_/ |||| || |||| --
485-------------------------------------------
486
487
488function getBlock(dir)
489 dir = dir or "fwd"
490 local block,meta
491
492 if dir=="fwd" then
493 block,meta = turtle.inspect()
494 elseif dir=="up" then
495 block,meta = turtle.inspectUp()
496 elseif dir=="down" then
497 block,meta = turtle.inspectDown()
498 end
499
500 if block then
501 block = meta["name"]
502 meta = meta["metadata"]
503 return block,meta
504 else
505 return "minecraft:air",nil
506 end --if
507
508end --function
509
510function getBlockUp()
511 return getBlock("up")
512end
513
514function getBlockDown()
515 return getBlock("down")
516end
517
518
519function isBlock(key,dir)
520 if type(key) == "string" then
521 key = { key }
522 end --if
523 if type(key) ~= "table" then
524 error("Expected string or table, got "
525 ..type(key), 2)
526 return false
527 end --if
528
529 local block = getBlock(dir)
530 local x
531 for x=1,#key do
532
533 if string.find(key[x],":") ~= nil then
534 if block == key[x] then
535 return true
536 end --if
537
538 else
539 if string.find(block,key[x]) ~= nil then
540 return true
541 end --if
542
543 end --if/else
544 end --for
545
546 return false
547end --function
548
549function isBlockUp(key)
550 return isBlock(key, "up")
551end
552
553function isBlockDown(key)
554 return isBlock(key, "down")
555end
556
557
558
559local fluid = { "air", "water", "lava",
560 "acid", "blood", "poison" }
561
562function isFluid(dir)
563 return isBlock(fluid, "fwd")
564end
565
566function isFluidUp()
567 return isBlock(fluid, "up")
568end
569
570function isFluidDown()
571 return isBlock(fluid, "down")
572end
573
574
575
576function isItem(key,slot)
577 if key == nil then return false end
578
579 local slot_old = turtle.getSelectedSlot()
580 if type(slot) ~= "number" then
581 slot = slot_old
582 end --if
583
584 if type(key) == "table" then
585 local x
586 for x=1,#key do
587 if isItem(key[x],slot) then
588 return true
589 end --if
590 end --for
591 return false
592 end --if
593
594 if turtle.getItemCount(slot) == 0 then
595 return false
596 end --if
597
598 local name = turtle.getItemDetail(slot)["name"]
599
600 return ( string.find(name,key) ~= nil )
601end --function
602
603
604