phone-server.lua

207 lines · 5.5 KB

Open raw

PHONE SERVER--

Copy & run

wget https://perlytiara.github.io/turtles.tips/raw/programs/BigGamingGamers/phone-server.lua
1--PHONE SERVER--
2
3local SERVER_PORT = 420
4local CLIENT_PORT = 0
5local SLOT_COUNT = 16
6
7
8local segmentation = 5
9if (#arg == 1) then
10 segmentation = tonumber(arg[1]) or segmentation
11elseif (#arg == 0) then
12 print(string.format("No segmentation size selected, defaulting to %d", segmentation))
13else
14 print('Too many args given...')
15 os.exit()
16end
17
18
19local modem = peripheral.wrap("left")
20modem.open(SERVER_PORT)
21
22local target = vector.new()
23local size = vector.new()
24local finish = vector.new()
25
26-- I STOLE --
27function split (inputstr, sep)
28 if sep == nil then
29 sep = "%s"
30 end
31 local t={}
32 for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
33 table.insert(t, str)
34 end
35 return t
36end
37
38function parseParams(data)
39 coords = {}
40 params = split(data, " ")
41
42 coords[1] = vector.new(params[1], params[2], params[3])
43 coords[2] = vector.new(params[4], params[5], params[6])
44
45 return (coords)
46end
47
48function getItemIndex(itemName)
49 for slot = 1, SLOT_COUNT, 1 do
50 local item = turtle.getItemDetail(slot)
51 if(item ~= nil) then
52 if(item["name"] == itemName) then
53 return slot
54 end
55 end
56 end
57end
58
59function checkFuel()
60 turtle.select(1)
61
62 if(turtle.getFuelLevel() < 50) then
63 print("Attempting Refuel...")
64 for slot = 1, SLOT_COUNT, 1 do
65 turtle.select(slot)
66 if(turtle.refuel(1)) then
67 return true
68 end
69 end
70 return false
71 else
72 return true
73 end
74end
75
76function deployFuelChest()
77 if (not checkFuel()) then
78 print("SERVER NEEDS FUEL...")
79 exit(1)
80 end
81 turtle.select(getItemIndex("enderstorage:ender_storage"))
82 turtle.up()
83 turtle.place()
84 turtle.down()
85end
86
87
88function deploy(startCoords, quarySize, endCoords, options)
89 --Place turtle from inventory
90 turtle.select(getItemIndex("computercraft:turtle_expanded"))
91 while(turtle.detect()) do
92 if sleep then sleep(0.3) else os.sleep(0.3) end
93 end
94
95 --Place and turn on turtle
96 turtle.place()
97 peripheral.call("front", "turnOn")
98
99
100 --Wait for client to send ping
101 event, side, senderChannel, replyChannel, msg, distance = os.pullEvent("modem_message")
102 if(msg ~= "CLIENT_DEPLOYED") then
103 print("No client deploy message, exitting...")
104 os.exit()
105 end
106
107
108 if(options["withStorage"]) then
109 --Set up ender chest
110 if (not checkFuel()) then
111 print("SERVER NEEDS FUEL...")
112 os.exit()
113 end
114 turtle.select(getItemIndex("enderstorage:ender_storage"))
115 turtle.up()
116 turtle.place()
117 turtle.down()
118 end
119
120 deployFuelChest()
121 local storageBit = options["withStorage"] and 1 or 0
122
123 -- Client is deployed
124 modem.transmit(CLIENT_PORT,
125 SERVER_PORT,
126 string.format("%d %d %d %d %d %d %d %d %d %d",
127 startCoords.x, startCoords.y, startCoords.z,
128 quarySize.x, quarySize.y, quarySize.z,
129 endCoords.x, endCoords.y, endCoords.z,
130 storageBit
131 ))
132end
133
134
135
136-- Return array of arbitrary size for each bot placement
137function getPositioningTable(x, z, segmaentationSize)
138 local xRemainder = x % segmaentationSize
139 local zRemainder = z % segmaentationSize
140
141 local xMain = x - xRemainder
142 local zMain = z - zRemainder
143
144 xRemainder = (xRemainder == 0 and segmaentationSize or xRemainder)
145 zRemainder = (zRemainder == 0 and segmaentationSize or zRemainder)
146
147 local positions = {}
148
149 for zi = 0, z - 1 , segmaentationSize do
150 for xi = 0, x - 1, segmaentationSize do
151
152 local dims = {xi, zi, segmaentationSize, segmaentationSize}
153 if(xi >= x - segmaentationSize and xi <= x - 1 ) then
154 dims = {xi, zi, xRemainder, segmaentationSize}
155 end
156
157 if(zi >= z - segmaentationSize and zi <= z - 1 ) then
158 dims = {xi, zi, segmaentationSize, zRemainder}
159 end
160
161 table.insert(positions, dims)
162 end
163 end
164
165 return table.pack(positions, xRemainder, zRemainder)
166end
167
168while (true) do
169 -- Wait for phone
170 print("Waiting for target signal...")
171 event, side, senderChannel, replyChannel, msg, distance = os.pullEvent("modem_message")
172
173 -- Parse out coordinates and options
174 local args = split(msg, " ")
175 local withStorage = args[#args]
176 withStorage = withStorage == "1" and true or false
177 data = parseParams(msg)
178 options = {}
179 options["withStorage"] = true
180
181 target = data[1]
182 size = data[2]
183
184 finish = vector.new(gps.locate())
185 finish.y = finish.y + 1
186 print(string.format( "RECEIVED QUARY REQUEST AT: %d %d %d", target.x, target.y, target.z))
187
188 tab, xDf, zDf = table.unpack(getPositioningTable(size.x, size.z, segmentation))
189
190 print(string.format("Deploying %d bots...", #tab))
191 for i = 1, #tab, 1 do
192 xOffset, zOffset, width, height = table.unpack(tab[i])
193 local offsetTarget = vector.new(target.x + xOffset, target.y, target.z + zOffset)
194 local sclaedSize = vector.new(width, size.y, height)
195
196 deploy(offsetTarget, sclaedSize, finish, options)
197 if sleep then sleep(1) else os.sleep(1) end
198 print(string.format( "Deploying to; %d %d %d %d %d", target.x + xOffset, target.y, target.z + zOffset, sclaedSize.x, sclaedSize.z))
199 end
200
201 -- All bots deployed, wait for last bot finished signal
202 event, side, senderChannel, replyChannel, msg, distance = os.pullEvent("modem_message")
203 turtle.digUp()
204
205end
206
207