Fail teleport if no 1×2×1 area is free
This commit is contained in:
parent
3b5e0f56eb
commit
67e39274c9
37
init.lua
37
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 over2 = minetest.get_node({x=pos.x,y=pos.y+2,z=pos.z})
|
||||||
local src = player:getpos()
|
local src = player:getpos()
|
||||||
local dest = {x=pos.x, y=math.ceil(pos.y)-0.5, z=pos.z}
|
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({
|
minetest.add_particlespawner({
|
||||||
amount = 25,
|
amount = 25,
|
||||||
time = 0.1,
|
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})
|
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)
|
player:setpos(dest)
|
||||||
minetest.add_particlespawner({
|
minetest.add_particlespawner({
|
||||||
amount = 25,
|
amount = 25,
|
||||||
@ -51,6 +60,8 @@ function teletool.teleport(player, pointed_thing)
|
|||||||
texture = "teletool_particle_arrival.png",
|
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)
|
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
|
end
|
||||||
|
|
||||||
minetest.register_tool("teletool:teletool_infinite", {
|
minetest.register_tool("teletool:teletool_infinite", {
|
||||||
@ -62,7 +73,7 @@ minetest.register_tool("teletool:teletool_infinite", {
|
|||||||
on_use = function(itemstack, user, pointed_thing)
|
on_use = function(itemstack, user, pointed_thing)
|
||||||
local failure = false
|
local failure = false
|
||||||
if(pointed_thing.type == "node") then
|
if(pointed_thing.type == "node") then
|
||||||
teletool.teleport(user, pointed_thing)
|
failure = not teletool.teleport(user, pointed_thing)
|
||||||
else
|
else
|
||||||
failure = true
|
failure = true
|
||||||
end
|
end
|
||||||
@ -91,9 +102,11 @@ if(minetest.get_modpath("technic")) then
|
|||||||
failure = true
|
failure = true
|
||||||
elseif meta.charge >= 1000 then
|
elseif meta.charge >= 1000 then
|
||||||
meta.charge = meta.charge - 1000
|
meta.charge = meta.charge - 1000
|
||||||
teletool.teleport(user, pointed_thing)
|
failure = not teletool.teleport(user, pointed_thing)
|
||||||
technic.set_RE_wear(itemstack, meta.charge, 50000)
|
if not failure then
|
||||||
itemstack:set_metadata(minetest.serialize(meta))
|
technic.set_RE_wear(itemstack, meta.charge, 50000)
|
||||||
|
itemstack:set_metadata(minetest.serialize(meta))
|
||||||
|
end
|
||||||
else
|
else
|
||||||
failure = true
|
failure = true
|
||||||
end
|
end
|
||||||
@ -123,7 +136,7 @@ if(minetest.get_modpath("mana") ~= nil) then
|
|||||||
local failure = false
|
local failure = false
|
||||||
if(pointed_thing.type == "node") then
|
if(pointed_thing.type == "node") then
|
||||||
if(mana.subtract(user:get_player_name(), 20)) then
|
if(mana.subtract(user:get_player_name(), 20)) then
|
||||||
teletool.teleport(user, pointed_thing)
|
failure = not teletool.teleport(user, pointed_thing)
|
||||||
else
|
else
|
||||||
failure = true
|
failure = true
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user