diff --git a/init.lua b/init.lua index c9c4d92..1ea666f 100644 --- a/init.lua +++ b/init.lua @@ -14,6 +14,22 @@ function teletool.teleport(player, pointed_thing) local over2 = minetest.get_node({x=pos.x,y=pos.y+2,z=pos.z}) local src = player:getpos() local dest = {x=pos.x, y=math.ceil(pos.y)-0.5, z=pos.z} + local destnode = minetest.get_node(dest) + + -- This trick prevents the player's head to spawn in a walkable node if the player clicked on the lower side of a node + -- NOTE: This piece of code must be updated as soon the collision boxes of players become configurable + local destnode_above = minetest.get_node({x=dest.x, y=dest.y + 1, z=dest.z}) + if minetest.registered_nodes[destnode_above.name].walkable then + dest.y = dest.y - 1 + end + + -- The destination must be collision free + local destnode = minetest.get_node(dest) + if minetest.registered_nodes[destnode.name].walkable then + return false + end + + minetest.add_particlespawner({ amount = 25, time = 0.1, @@ -29,13 +45,6 @@ function teletool.teleport(player, pointed_thing) }) minetest.sound_play( {name="teletool_teleport1", gain=1}, {pos=src, max_hear_distance=12}) - -- This trick prevents the player's head to spawn in a walkable node if the player clicked on the lower side of a node - -- NOTE: This piece of code must be updated as soon the collision boxes of players become configurable - local destnode = minetest.get_node({x=dest.x, y=dest.y+1, z=dest.z}) - if minetest.registered_nodes[destnode.name].walkable then - dest.y = dest.y - 1 - end - player:setpos(dest) minetest.add_particlespawner({ amount = 25, @@ -51,6 +60,8 @@ function teletool.teleport(player, pointed_thing) texture = "teletool_particle_arrival.png", }) minetest.after(0.5, function(dest) minetest.sound_play( {name="teletool_teleport2", gain=1}, {pos=dest, max_hear_distance=12}) end, dest) + + return true end minetest.register_tool("teletool:teletool_infinite", { @@ -62,7 +73,7 @@ minetest.register_tool("teletool:teletool_infinite", { on_use = function(itemstack, user, pointed_thing) local failure = false if(pointed_thing.type == "node") then - teletool.teleport(user, pointed_thing) + failure = not teletool.teleport(user, pointed_thing) else failure = true end @@ -91,9 +102,11 @@ if(minetest.get_modpath("technic")) then failure = true elseif meta.charge >= 1000 then meta.charge = meta.charge - 1000 - teletool.teleport(user, pointed_thing) - technic.set_RE_wear(itemstack, meta.charge, 50000) - itemstack:set_metadata(minetest.serialize(meta)) + failure = not teletool.teleport(user, pointed_thing) + if not failure then + technic.set_RE_wear(itemstack, meta.charge, 50000) + itemstack:set_metadata(minetest.serialize(meta)) + end else failure = true end @@ -123,7 +136,7 @@ if(minetest.get_modpath("mana") ~= nil) then local failure = false if(pointed_thing.type == "node") then if(mana.subtract(user:get_player_name(), 20)) then - teletool.teleport(user, pointed_thing) + failure = not teletool.teleport(user, pointed_thing) else failure = true end