SHOW:
|
|
- or go back to the newest paste.
1 | local sensor = peripheral.wrap "left" | |
2 | local laser = peripheral.wrap "right" | |
3 | ||
4 | local function fire(entity) | |
5 | local x, y, z = entity.x, entity.y, entity.z | |
6 | local pitch = -math.atan2(y, math.sqrt(x * x + z * z)) | |
7 | local yaw = math.atan2(-x, z) | |
8 | ||
9 | laser.fire(math.deg(yaw), math.deg(pitch), 5) | |
10 | sleep(0.2) | |
11 | end | |
12 | ||
13 | - | local mobNames = { "Creeper", "Zombie", "Skeleton", "Blaze"} |
13 | + | local mob_names = { "Creeper", "Zombie", "Skeleton", "Blaze"} |
14 | - | local mobLookup = {} |
14 | + | local mob_lookup = {} |
15 | - | for i = 1, #mobNames do |
15 | + | for _, mob in pairs(mob_names) do |
16 | - | mobLookup[mobNames[i]] = true |
16 | + | mob_lookup[mob] = true |
17 | end | |
18 | ||
19 | local function distance(entity) | |
20 | return math.sqrt(entity.x * entity.x + entity.y * entity.y + entity.z * entity.z) | |
21 | - | local candidates = {} |
21 | + | |
22 | - | for i = 1, #mobs do |
22 | + | |
23 | - | local mob = mobs[i] |
23 | + | |
24 | - | if mobLookup[mob.name] then |
24 | + | |
25 | - | candidates[#candidates + 1] = mob |
25 | + | local nearest |
26 | for _, mob in pairs(mobs) do | |
27 | if mob_lookup[mob.name] then | |
28 | - | if #candidates > 0 then |
28 | + | mob.distance = distance(mob) |
29 | - | local mob = candidates[math.random(1, #candidates)] |
29 | + | if nearest == nil or mob.distance < nearest.distance then |
30 | - | fire(mob) |
30 | + | nearest = mob |
31 | end | |
32 | end | |
33 | end | |
34 | if nearest then | |
35 | fire(entity) | |
36 | else | |
37 | sleep(0.5) | |
38 | end | |
39 | end |