2020-09-22 05:56:25 -07:00
enderpearl = { }
2020-09-09 08:40:29 -07:00
local t = minetest.get_translator ( " enderpearl " )
2020-09-22 05:56:25 -07:00
local callbacks = { }
2020-09-09 08:40:29 -07:00
----------------------
-- ! Item Section ! --
----------------------
minetest.register_craftitem ( " enderpearl:ender_pearl " , {
2020-10-25 15:06:42 -07:00
description = " Enderpearl \n " .. t ( " Left click to throw it@nIt will teleport you on the node it hit making you 2 damage@n(it won't work if you launch it in an unloaded world area) " ) ,
2020-09-09 08:40:29 -07:00
inventory_image = " enderpearl.png " ,
stack_max = 16 ,
on_use =
function ( _ , player , pointed_thing )
2020-12-21 05:44:03 -08:00
local throw_starting_pos = vector.add ( { x = 0 , y = 1.5 , z = 0 } , player : get_pos ( ) )
local ender_pearl = minetest.add_entity ( throw_starting_pos , " enderpearl:thrown_ender_pearl " , player : get_player_name ( ) )
2020-09-09 08:40:29 -07:00
minetest.after ( 0 , function ( ) player : get_inventory ( ) : remove_item ( " main " , " enderpearl:ender_pearl " ) end )
2020-12-21 05:44:03 -08:00
minetest.sound_play ( " enderpearl_throw " , { max_hear_distance = 10 , pos = player : get_pos ( ) } )
2020-09-09 08:40:29 -07:00
end ,
} )
------------------------
-- ! Entity Section ! --
------------------------
-- entity declaration
local thrown_ender_pearl = {
initial_properties = {
hp_max = 1 ,
physical = true ,
collide_with_objects = false ,
collisionbox = { - 0.2 , - 0.2 , - 0.2 , 0.2 , 0.2 , 0.2 } ,
visual = " wielditem " ,
visual_size = { x = 0.4 , y = 0.4 } ,
textures = { " enderpearl:ender_pearl " } ,
spritediv = { x = 1 , y = 1 } ,
initial_sprite_basepos = { x = 0 , y = 0 } ,
pointable = false ,
speed = 56 ,
gravity = 32 ,
damage = 2 ,
2020-09-22 05:56:25 -07:00
lifetime = 10
2020-09-09 08:40:29 -07:00
} ,
player_name = " "
}
2020-09-13 15:26:34 -07:00
function thrown_ender_pearl : on_step ( dtime , moveresult )
2020-09-09 08:40:29 -07:00
local collided_with_node = moveresult.collisions [ 1 ] and moveresult.collisions [ 1 ] . type == " node "
2020-09-22 05:56:25 -07:00
if collided_with_node then
2020-09-09 15:50:36 -07:00
local player = minetest.get_player_by_name ( self.player_name )
2020-09-09 08:40:29 -07:00
2020-12-21 05:44:03 -08:00
if not player then
2020-09-09 08:40:29 -07:00
self.object : remove ( )
2020-09-22 05:56:25 -07:00
return
elseif player : get_meta ( ) : get_string ( " ep_can_teleport " ) == " false " then
self.object : remove ( )
return
2020-09-09 08:40:29 -07:00
end
2020-09-22 06:37:55 -07:00
-- removing fall damage
player : add_player_velocity ( vector.multiply ( player : get_player_velocity ( ) , - 1 ) )
2020-10-25 15:15:52 -07:00
player : set_pos ( vector.add ( self.object : get_pos ( ) , { x = 0 , y = 1 , z = 0 } ) )
2020-09-09 08:40:29 -07:00
player : set_hp ( player : get_hp ( ) - self.initial_properties . damage , " enderpearl " )
2020-12-21 05:44:03 -08:00
minetest.sound_play ( " enderpearl_teleport " , { max_hear_distance = 10 , pos = player : get_pos ( ) } )
2020-09-22 05:56:25 -07:00
for i = 1 , # callbacks do
local node = minetest.get_node ( moveresult.collisions [ 1 ] . node_pos )
callbacks [ i ] ( node )
end
2020-09-09 08:40:29 -07:00
self.object : remove ( )
end
end
function thrown_ender_pearl : on_activate ( staticdata )
2020-12-21 05:44:03 -08:00
if not staticdata or not minetest.get_player_by_name ( staticdata ) then
2020-09-09 08:40:29 -07:00
self.object : remove ( )
2020-12-21 05:44:03 -08:00
return
2020-09-09 08:40:29 -07:00
end
self.player_name = staticdata
2020-12-21 05:44:03 -08:00
local player = minetest.get_player_by_name ( staticdata )
local yaw = player : get_look_horizontal ( )
local pitch = player : get_look_vertical ( )
local dir = player : get_look_dir ( )
self.object : set_rotation ( { x = - pitch , y = yaw , z = 0 } )
self.object : set_velocity ( {
x = ( dir.x * self.initial_properties . speed ) ,
y = ( dir.y * self.initial_properties . speed ) ,
z = ( dir.z * self.initial_properties . speed ) ,
} )
self.object : set_acceleration ( { x = dir.x *- 4 , y =- self.initial_properties . gravity , z = dir.z *- 4 } )
2020-09-09 08:40:29 -07:00
minetest.after ( self.initial_properties . lifetime , function ( ) self.object : remove ( ) end )
end
2020-09-22 05:56:25 -07:00
minetest.register_entity ( " enderpearl:thrown_ender_pearl " , thrown_ender_pearl )
---------------------------
-- ! Callbacks Section ! --
---------------------------
-- on_teleport(hit_node)
function enderpearl . on_teleport ( func )
table.insert ( callbacks , func )
end
-----------------------
-- ! Utils Section ! --
-----------------------
function enderpearl . block_teleport ( player , duration )
if duration then
minetest.after ( duration , function ( )
if minetest.get_player_by_name ( player : get_player_name ( ) ) then
player : get_meta ( ) : set_string ( " ep_can_teleport " , " " )
end
end )
end
player : get_meta ( ) : set_string ( " ep_can_teleport " , " false " )
2020-10-25 15:06:42 -07:00
end