2 -- cora's defensive combat hax
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
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
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}))
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
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
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
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
)
70 player
:set_wield_index(new_index
)
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
)
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
)
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
94 minetest
.dig_node(vector
.add(n
,{x
=0,y
=-1,z
=0}))
95 nd
=minetest
.get_node_or_nil(n
)
99 local function mwarp(pos
)
100 if os
.time() < lastwrp
+1 then return end
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
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)
132 local pos
= v
:get_pos()
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
)
139 minetest
.after("0.2",function() autofly
.aim(pos
) end)
146 minetest
.register_globalstep(function()
147 if minetest
.settings
:get_bool("goddess") then
148 local ppos
=minetest
.localplayer
:get_pos()
150 if(checkprojectile()) then evade(ppos
) end
151 if(checktrap()) then evade(ppos
) end
152 if(not checkhead()) then dhfree() end
155 minetest
.register_chatcommand("dhf", { description
= "", func
= dhfree
})
159 if (_G
["minetest"]["register_cheat"] ~= nil) then
160 minetest
.register_cheat("Goddess Mode", "Combat", "goddess")
162 minetest
.settings
:set_bool('goddess',true)