random-stuff/computercraft/cartdrone.lua

136 lines
3.7 KiB
Lua

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
]]