kamikaze: widen search area, add sponges as badnode
[waspsaliva.git] / clientmods / kamikaze / init.lua
blob89af4e6e2441ba27267a1a90e6e2de4adddc1f99
1 local fnd=false
2 local cpos={x=0,y=0,z=0}
3 local crange=500
4 local hud_wp=nil
5 local zz={x=0,y=64,z=0}
6 local badnodes={'mcl_tnt:tnt','mcl_sponges:sponge','mcl_sponges:sponge_wet'}
7 local searchheight=64
9 local function set_kwp(name,pos)
10 if hud_wp then
11 minetest.localplayer:hud_change(hud_wp, 'world_pos', pos)
12 minetest.localplayer:hud_change(hud_wp, 'name', name)
13 else
14 hud_wp = minetest.localplayer:hud_add({
15 hud_elem_type = 'waypoint',
16 name = name,
17 text = 'm',
18 number = 0x00ff00,
19 world_pos = pos
21 end
22 end
23 local nextzz=0
24 local function randomzz()
25 if nextzz > os.clock() then return false end
26 math.randomseed(os.time())
27 zz.x=math.random(-128,128)
28 zz.y=math.random(64,searchheight)
29 zz.z=math.random(-128,128)
30 nextzz=os.clock()+ 15
31 end
33 local function find_bad_things()
34 if fnd then return true end
35 local obs=minetest.localplayer.get_nearby_objects(crange)
36 local lp=minetest.localplayer:get_pos()
38 for k, v in ipairs(obs) do -- look for crystals first
39 if ( v:get_item_textures():find("mcl_end_crystal") ) then
40 cpos=v:get_pos()
41 set_kwp(v:get_item_textures(),v:get_pos())
42 fnd=true
43 return true
44 end
45 end
47 for k, v in ipairs(obs) do
48 if ( v:get_item_textures():find("arrow_box") ) then
49 cpos=v:get_pos()
50 set_kwp(v:get_item_textures(),v:get_pos())
51 fnd=true
52 return true
53 end
54 end
56 local epos=minetest.find_nodes_in_area(vector.add(lp,{x=79,y=79,z=79}), vector.add(lp,{x=-79,y=-79,z=-79}), badnodes, true)
57 local odst=0
58 if epos then
59 for k,v in pairs(epos) do for kk,vv in pairs(v) do
60 local dst=vector.distance(lp,vv)
61 if odst > dst then cpos=vv end
62 odst=dst
63 fnd=true
64 end end
65 if fnd then set_kwp('badnode',cpos) return true end
66 end
68 set_kwp('nothing found',zz)
69 randomzz()
70 fnd=false
71 return false
72 end
76 local function flythere()
77 minetest.settings:set_bool('noclip',true)
78 minetest.settings:set_bool("pitch_move",true)
79 minetest.settings:set_bool("continuous_forward",true)
80 autofly.aim(cpos)
81 core.set_keypress("special1", true)
82 end
84 local function stopflight()
85 minetest.settings:set_bool("continuous_forward",false)
86 minetest.settings:set_bool("noclip",false)
87 minetest.settings:set_bool("pitch_move",false)
88 core.set_keypress("special1", false)
89 minetest.after("0",function()
90 minetest.interact("start_digging")
91 minetest.dig_node(cpos)
92 fnd=false
93 end)
94 end
96 minetest.register_globalstep(function()
97 if not minetest.settings:get_bool("kamikaze") and not minetest.localplayer:get_name():find("kamikaze") then
98 if hud_wp then
99 minetest.localplayer:hud_remove(hud_wp) hud_wp=nil
100 minetest.settings:set_bool("continuous_forward",false)
101 minetest.settings:set_bool("noclip",false)
102 minetest.settings:set_bool("pitch_move",false)
103 core.set_keypress("special1", false)
104 fnd=false
106 return
109 local lp = minetest.localplayer:get_pos()
110 if not find_bad_things() then
111 if vector.distance(lp,zz) < 1 then
112 stopflight()
113 return
114 else
115 cpos=zz
117 elseif vector.distance(lp,cpos) < 1 then
118 stopflight()
119 return
121 flythere()
122 end)
124 minetest.register_on_death(function()
125 if not minetest.settings:get_bool("kamikaze") then return end
126 fnd=false
127 end)
129 minetest.register_cheat("Kamikaze", "Combat", "kamikaze")