goddessmode: add shulker bullet
[waspsaliva.git] / clientmods / goddessmode / init.lua
blob16e83eef8b2aad48ea97ee1a30828ee01c996e7f
1 --
2 -- cora's defensive combat hax
6 local karange=14
8 local function checkair(pos)
9 local n=minetest.get_node_or_nil(pos)
10 if n==nil or n['name'] == 'air' then return true end
11 return false
12 end
14 local function checkbadblocks(pos)
15 local n=minetest.find_node_near(pos, 2, {'mcl_core:gravel','mcl_core:sand','mcl_core:lava_source','mcl_core:lava_flowing','mcl_core:water_source','mcl_core:water_flowing',
16 'mcl_core:obsidian','mcl_core:bedrock'}, true)
17 if n == nil then return false end
18 return true
19 end
20 local function checktrap()
21 local lp=minetest.localplayer:get_pos()
22 local air,nd=minetest.line_of_sight(vector.add(lp,{x=0,y=-2,z=0}), vector.add(lp,{x=0,y=50,z=0}))
23 if(not air) then
24 local tn=minetest.get_node_or_nil(nd)
25 if(tn == nil) then return false end
26 for k,v in ipairs({'mcl_core:lava_source','mcl_core:lava_flowing','mcl_core:water_source','mcl_core:water_flowing'}) do
27 if tn.name == v then return true end
28 end
29 end
30 return false
31 end
33 local function checkhead()
34 local ppos=vector.add(minetest.localplayer:get_pos(),{x=0,y=1,z=0})
35 if (checkair(ppos)) then return true end
36 return false
37 end
40 local function checkprojectile()
41 for k, v in ipairs(minetest.localplayer.get_nearby_objects(karange)) do
42 if ( v:get_item_textures():sub(-9) == "arrow_box") or ( v:get_item_textures():sub(-7) == "_splash") or v:get_item_textures():sub(-17) == "shulkerbullet.png" then
43 local lp=minetest.localplayer:get_pos()
44 local vel=v:get_velocity()
45 local dst=vector.distance(lp,v:get_pos())
46 if dst > 2 then return false end
47 if (vel.x == 0 and vel.y == 0 and vel.z ==0 ) then return false end
48 return true
49 end
50 end
51 return false
52 end
55 local function amautotool(pos)
56 local node=minetest.get_node_or_nil(pos)
57 if node == nil then return end
58 local player = minetest.localplayer
59 local inventory = minetest.get_inventory("current_player")
60 local node_groups = minetest.get_node_def(node.name).groups
61 local new_index = player:get_wield_index()
62 local is_better, best_time = false, math.huge
63 is_better, best_time = autotool.check_tool(player:get_wielded_item(), node_groups, best_time)
64 for index, stack in pairs(inventory.main) do
65 is_better, best_time = autotool.check_tool(stack, node_groups, best_time)
66 if is_better then
67 new_index = index - 1
68 end
69 end
70 player:set_wield_index(new_index)
71 end
73 local function get_2dpos_from_yaw(r,yaw)
74 local tg={x=0,y=0,z=0}
75 tg.x= r * math.sin(yaw)
76 tg.z= r * math.cos(yaw)
77 return tg
78 end
79 local function get_3dpos_from_yaw_and_pitch(r,yaw,pitch)
80 local tg={x=0,y=0,z=0}
81 tg.x= r * math.sin(yaw)
82 tg.y= r * math.sin(pitch)
83 tg.z= r * math.cos(yaw)
84 return tg
85 end
86 local function dhfree()
87 if not minetest.localplayer then return end
88 local n=vector.add(minetest.localplayer:get_pos(),{x=0,y=2,z=0})
89 local nd=minetest.get_node_or_nil(n)
90 if nd == nil then return end
91 while nd.name ~= "air" do
92 amautotool(n)
93 minetest.dig_node(n)
94 minetest.dig_node(vector.add(n,{x=0,y=-1,z=0}))
95 nd=minetest.get_node_or_nil(n)
96 end
97 end
98 local lastwrp=0
99 local function mwarp(pos)
100 if os.time() < lastwrp+1 then return end
101 lastwrp=os.time();
102 minetest.after("0.1",function() dhfree() end)
103 minetest.localplayer:set_pos(pos)
106 local function get_target(epos)
107 math.randomseed(os.time())
108 local t=vector.add(epos,get_3dpos_from_yaw_and_pitch(karange+1,math.random(90,240),math.random(90,135)))
109 if (checkbadblocks(t)) then
110 return get_target(epos)
111 elseif checkair(t) then
112 return t
113 else
114 amautotool(t)
116 return t
120 local function evade(ppos)
121 mwarp(get_target(ppos))
124 local function rro() -- reverse restraining order
126 for k, v in ipairs(minetest.localplayer.get_nearby_objects(karange+5)) do
127 local name=v:get_name()
128 if (v:is_player() and name ~= minetest.localplayer:get_name()) then
129 if fren.is_friend(name) then
130 minetest.settings:set_bool("killaura",false)
131 return end
132 local pos = v:get_pos()
133 pos.y = pos.y - 1
134 local mpos=minetest.localplayer:get_pos()
135 local distance=vector.distance(mpos,pos)
136 if distance < karange then
137 local trg=get_target(pos)
138 mwarp(trg)
139 minetest.after("0.2",function() autofly.aim(pos) end)
140 return
146 minetest.register_globalstep(function()
147 if minetest.settings:get_bool("goddess") then
148 local ppos=minetest.localplayer:get_pos()
149 rro()
150 if(checkprojectile()) then evade(ppos) end
151 if(checktrap()) then evade(ppos) end
152 if(not checkhead()) then dhfree() end
154 end)
155 minetest.register_chatcommand("dhf", { description = "", func = dhfree })
158 -- REG cheats on DF
159 if (_G["minetest"]["register_cheat"] ~= nil) then
160 minetest.register_cheat("Goddess Mode", "Combat", "goddess")
161 else
162 minetest.settings:set_bool('goddess',true)