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