hook/project.lua

91 lines
2.7 KiB
Lua

minetest.register_entity("hook:power",{
hp_max = 100,
physical = true,
collisionbox = {-0.2,-0.2,-0.2, 0.2,0.2,0.2},
visual = "mesh",
mesh = "hook_hook.obj",
visual_size = {x=10, y=10},
textures = {"hook_iron.png"},
is_visible = true,
makes_footstep_sound = false,
timer2=0,
d=0,
uname="",
locked=false,
on_activate=function(self, staticdata)
if hook.user==nil then
self.object:remove()
return self
end
self.d=hook.user:get_look_dir()
self.fd=minetest.dir_to_facedir(self.d)
self.uname=hook.user:get_player_name()
self.user=hook.user
self.locked=hook.locked
hook.user=nil
if self.fd==3 then
self.fd=1
elseif self.fd==1 then
self.fd=3
elseif self.fd==2 then
self.fd=0
elseif self.fd==0 then
self.fd=2
end
end,
on_step= function(self, dtime)
self.timer2=self.timer2+dtime
local pos=self.object:get_pos()
local kill=0
if hook.slingshot_def({x=pos.x+self.d.x,y=pos.y,z=pos.z+self.d.z},"walkable") and not hook.slingshot_def({x=pos.x+self.d.x,y=pos.y+1,z=pos.z+self.d.z},"walkable")
and hook.is_hook(pos,self.uname) and hook.is_hook({x=pos.x,y=pos.y+1,z=pos.z},self.uname) then
kill=1
if self.locked then
if self.user:get_inventory():contains_item("main", "hook:climb_rope_locked")==false then
self.object:remove()
return self
end
if hook.is_hook({x=pos.x,y=pos.y+1,z=pos.z},self.uname) then
minetest.set_node({x=pos.x,y=pos.y+1,z=pos.z},{name = "hook:hooking",param2=self.fd})
minetest.get_meta({x=pos.x,y=pos.y+1,z=pos.z}):set_int("a",1)
else
return self
end
self.user:get_inventory():remove_item("main", "hook:climb_rope_locked")
for i=0,20,1 do
if hook.is_hook({x=pos.x,y=pos.y-i,z=pos.z},self.uname) then
minetest.set_node({x=pos.x,y=pos.y-i,z=pos.z},{name = "hook:rope3",param2=self.fd})
else
break
end
minetest.get_meta({x=pos.x,y=pos.y-i,z=pos.z}):set_string("owner",self.uname)
end
else
if self.user:get_inventory():contains_item("main", "hook:climb_rope")==false then
self.object:remove()
return self
end
if hook.is_hook({x=pos.x,y=pos.y+1,z=pos.z},self.uname) then
minetest.set_node({x=pos.x,y=pos.y+1,z=pos.z},{name = "hook:hooking",param2=self.fd})
minetest.get_meta({x=pos.x,y=pos.y+1,z=pos.z}):set_int("a",1)
else
return self
end
self.user:get_inventory():remove_item("main", "hook:climb_rope")
for i=0,20,1 do
if hook.is_hook({x=pos.x,y=pos.y-i,z=pos.z},self.uname) then
minetest.set_node({x=pos.x,y=pos.y-i,z=pos.z},{name = "hook:rope2",param2=self.fd})
else
break
end
end
end
end
if self.timer2>3 or kill==1 then
self.object:remove()
end
return self
end,
})