Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local kinetic = peripheral.find "plethora:kinetic"
- local modem = peripheral.find "modem"
- local laser = peripheral.find "plethora:laser"
- local sensor = peripheral.find "plethora:sensor"
- modem.open(70)
- local p = true
- local target = vector.new(gps.locate())
- local function calc_yaw_pitch(v)
- local pitch = -math.atan2(v.y, math.sqrt(v.x * v.x + v.z * v.z))
- local yaw = math.atan2(-v.x, v.z)
- return math.deg(yaw), math.deg(pitch)
- end
- local mob_names = { "Creeper", "Zombie", "Skeleton", "Blaze" }
- local mob_lookup = {}
- for _, mob in pairs(mob_names) do
- mob_lookup[mob] = true
- end
- local function calc_distance(entity)
- return math.sqrt(entity.x * entity.x + entity.y * entity.y + entity.z * entity.z)
- end
- local function sentry()
- while true do
- local mobs = sensor.sense()
- local nearest
- for _, mob in pairs(mobs) do
- if mob_lookup[mob.name] then
- mob.distance = calc_distance(mob)
- if nearest == nil or mob.distance < nearest.distance then
- nearest = mob
- end
- end
- end
- if nearest then
- local y, p = calc_yaw_pitch(vector.new(nearest.x, nearest.y, nearest.z))
- laser.fire(y, p, 0.5)
- sleep(0.2)
- else
- sleep(0.5)
- end
- end
- end
- local function fly()
- while true do
- kinetic.launch(0,270,0.320)
- sleep(0.2)
- end
- end
- parallel.waitForAll(
- fly,
- function()
- while true do
- local current = vector.new(gps.locate())
- local displacement = target - current
- if displacement:length() > 0.1 then
- displacement = displacement + vector.new(0, 0.3, 0)
- local y, p = calc_yaw_pitch(displacement)
- local pow = math.min(displacement:length() * 0.08, 2.0)
- print(y, p, pow)
- kinetic.launch(y, p, pow)
- end
- sleep(1)
- end
- end,
- function()
- while true do
- event, side, frequency, replyFrequency, message, distance = os.pullEvent("modem_message")
- if message == "up" then
- target.y = target.y + 1
- elseif message == "down" then
- target.y = target.y - 1
- elseif message == "north" then
- target.z = target.z - 1
- elseif message == "south" then
- target.z = target.z + 1
- elseif message == "west" then
- target.x = target.x - 1
- elseif message == "east" then
- target.x = target.x + 1
- end
- end
- end,
- sentry
- )
- --[[
- local xDev = tarX - x
- local yDev = tarY - y
- local zDev = tarZ - z
- if yDev+0.1 < 0 then
- local power = math.min(math.abs(yDev) / 6 ,0.1)
- print(power, "down", y, tarY, power, yDev)
- kinetic.launch(0,90, power)
- end
- if yDev-0.1 > 0 then
- local power = math.min(math.abs(yDev) / 6 ,0.1)
- print(power, "up", y, tarY, power, yDev)
- kinetic.launch(0,270, power)
- end
- if xDev+0.1 < 0 then
- local power = math.min(math.abs(xDev) / 8 ,0.33)
- print(power, "west", x, tarX, power, xDev)
- kinetic.launch(90,0, power)
- sleep(0.1)
- kinetic.launch(270,0, power * 0.75)
- end
- if xDev-0.1 > 0 then
- local power = math.min(math.abs(xDev) / 8 ,0.33)
- print(power, "east", x, tarX, power, xDev)
- kinetic.launch(270,0, power)
- sleep(0.1)
- kinetic.launch(90,0, power * 0.75)
- end
- if zDev+0.1 < 0 then
- local power = math.min(math.abs(zDev) / 8 ,0.33)
- print(power, "north", z, tarZ, power, zDev)
- kinetic.launch(180,0, power)
- sleep(0.1)
- kinetic.launch(0,0, power * 0.75)
- end
- if zDev-0.1 > 0 then
- local power = math.min(math.abs(zDev) / 8 ,0.33)
- print(power, "south", z, tarZ, power, zDev)
- kinetic.launch(0,0, power)
- sleep(0.1)
- kinetic.launch(180,0, power * 0.75)
- end
- end
- ]]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement