Laser sentry Raw

This program finds hostile mobs and fires lasers at them, acting like a sentry tower.

We check that a manipulator exists and wrap it.

local modules = peripheral.find("manipulator")
if not modules then
	error("Cannot find manipulator", 0)
end

We require an entity sensor to find mobs and a laser to shoot at them. We error if neither exists.

if not modules.hasModule("plethora:laser") then error("Cannot find laser", 0) end
if not modules.hasModule("plethora:sensor") then error("Cannot find entity sensor", 0) end

We define a function which fires a laser towards an entity. This is a very naive implementation as it does not account for the entity moving between firing and impact. You could use the motionX, motionY and motionZ fields if you wish to add such functionality.

local function fire(entity)
	local x, y, z = entity.x, entity.y, entity.z
	local pitch = -math.atan2(y, math.sqrt(x * x + z * z))
	local yaw = math.atan2(-x, z)

	modules.fire(math.deg(yaw), math.deg(pitch), 5)
	sleep(0.2)
end

We build a lookup of mobs we wish to target, to avoid shooting non-hostile mobs.

local mobNames = { "Creeper", "Zombie", "Skeleton" }
local mobLookup = {}
for i = 1, #mobNames do
	mobLookup[mobNames[i]] = true
end

We now sense the vicinity and prepare to fire at them.

while true do
	local mobs = modules.sense()

First we build up a list of all mobs that we care about.

	local candidates = {}
	for i = 1, #mobs do
		local mob = mobs[i]
		if mobLookup[mob.name] then
			candidates[#candidates + 1] = mob
		end
	end

If we’ve got a mob then choose a random one and fire towards it. Otherwise, delay for a second before rescanning.

	if #candidates > 0 then
		local mob = candidates[math.random(1, #candidates)]
		fire(mob)
	else
		sleep(1)
	end
end