minetest_teletool/init.lua

168 lines
5.2 KiB
Lua
Raw Normal View History

2014-07-14 07:32:20 -07:00
if (minetest.get_modpath("intllib")) then
dofile(minetest.get_modpath("intllib").."/intllib.lua")
S = intllib.Getter(minetest.get_current_modname())
else
S = function ( s ) return s end
end
2014-10-12 14:23:01 -07:00
teletool = {}
2015-02-13 23:44:30 -08:00
teletool.settings = {}
2014-10-12 14:23:01 -07:00
function teletool.teleport(player, pointed_thing)
local pos = pointed_thing.above
local src = player:getpos()
local dest = {x=pos.x, y=math.ceil(pos.y)-0.5, z=pos.z}
local over = {x=dest.x, y=dest.y+1, z=dest.z}
local destnode = minetest.get_node({x=dest.x, y=math.ceil(dest.y), z=dest.z})
local overnode = minetest.get_node({x=over.x, y=math.ceil(over.y), z=over.z})
minetest.log("action", "[teletool] dest: "..minetest.pos_to_string(dest))
minetest.log("action", "[teletool] over: "..minetest.pos_to_string(over))
-- 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
if minetest.registered_nodes[overnode.name].walkable then
dest.y = dest.y - 1
end
-- The destination must be collision free
destnode = minetest.get_node({x=dest.x, y=math.ceil(dest.y), z=dest.z})
if minetest.registered_nodes[destnode.name].walkable then
return false
end
2014-10-12 15:02:22 -07:00
minetest.add_particlespawner({
amount = 25,
time = 0.1,
minpos = {x=src.x-0.4, y=src.y+0.25, z=src.z-0.4},
maxpos = {x=src.x+0.4, y=src.y+0.75, z=src.z+0.4},
minvel = {x=-0.1, y=-0.1, z=-0.1},
maxvel = {x=0, y=0.1, z=0},
minexptime=1,
maxexptime=1.5,
minsize=1,
maxsize=1.25,
texture = "teletool_particle_departure.png",
})
2014-10-12 14:23:01 -07:00
minetest.sound_play( {name="teletool_teleport1", gain=1}, {pos=src, max_hear_distance=12})
2014-10-12 14:23:01 -07:00
player:setpos(dest)
2014-10-12 15:02:22 -07:00
minetest.add_particlespawner({
amount = 25,
time = 0.1,
minpos = {x=dest.x-0.4, y=dest.y+0.25, z=dest.z-0.4},
maxpos = {x=dest.x+0.4, y=dest.y+0.75, z=dest.z+0.4},
minvel = {x=0, y=-0.1, z=0},
maxvel = {x=0.1, y=0.1, z=0.1},
minexptime=1,
maxexptime=1.5,
minsize=1,
maxsize=1.25,
texture = "teletool_particle_arrival.png",
})
2014-10-12 14:23:01 -07:00
minetest.after(0.5, function(dest) minetest.sound_play( {name="teletool_teleport2", gain=1}, {pos=dest, max_hear_distance=12}) end, dest)
return true
2014-10-12 14:23:01 -07:00
end
minetest.register_tool("teletool:teletool_infinite", {
description = S("infinite point teleporter"),
2014-07-14 07:32:20 -07:00
range = 20.0,
tool_capabilities = {},
wield_image = "teletool_teletool_infinite.png",
inventory_image = "teletool_teletool_infinite.png",
2014-07-14 07:32:20 -07:00
on_use = function(itemstack, user, pointed_thing)
2015-02-13 23:11:50 -08:00
local failure = false
2014-07-14 07:32:20 -07:00
if(pointed_thing.type == "node") then
failure = not teletool.teleport(user, pointed_thing)
else
failure = true
end
if failure then
minetest.sound_play( {name="teletool_fail", gain=0.5}, {pos=user:getpos(), max_hear_distance=4})
end
return itemstack
end,
})
if(minetest.get_modpath("technic")) then
technic.register_power_tool("teletool:teletool_technic", 50000)
minetest.register_tool("teletool:teletool_technic", {
description = S("electronic point teleporter"),
range = 20.0,
tool_capabilities = {},
wield_image = "teletool_teletool_technic.png",
inventory_image = "teletool_teletool_technic.png",
on_use = function(itemstack, user, pointed_thing)
local failure = false
if(pointed_thing.type == "node") then
2014-10-12 14:23:01 -07:00
local meta = minetest.deserialize(itemstack:get_metadata())
2015-02-15 16:02:26 -08:00
if not meta or not meta.charge then
failure = true
elseif meta.charge >= 1000 then
2014-10-12 14:23:01 -07:00
meta.charge = meta.charge - 1000
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
2015-02-13 23:11:50 -08:00
else
failure = true
2014-10-12 14:23:01 -07:00
end
else
failure = true
end
if failure then
minetest.sound_play( {name="teletool_fail", gain=0.5}, {pos=user:getpos(), max_hear_distance=4})
end
return itemstack
end,
-- Technic data
wear_represents = "technic_RE_charge",
on_refill = technic.refill_RE_charge
})
end
if(minetest.get_modpath("mana") ~= nil) then
minetest.register_tool("teletool:teletool_mana", {
description = S("magical point teleporter"),
range = 20.0,
tool_capabilities = {},
wield_image = "teletool_teletool_mana.png",
inventory_image = "teletool_teletool_mana.png",
on_use = function(itemstack, user, pointed_thing)
local failure = false
if(pointed_thing.type == "node") then
2015-02-13 23:44:30 -08:00
if(mana.subtract(user:get_player_name(), 20)) then
failure = not teletool.teleport(user, pointed_thing)
2015-02-13 23:44:30 -08:00
else
failure = true
end
else
failure = true
end
if failure then
minetest.sound_play( {name="teletool_fail", gain=0.5}, {pos=user:getpos(), max_hear_distance=4})
end
return itemstack
end,
})
end
if(minetest.get_modpath("default") ~= nil and minetest.get_modpath("technic") ~= nil) then
minetest.register_craft({
output = "teletool:teletool_technic",
recipe = {
{"", "default:mese_crystal", ""},
{"technic:stainless_steel_ingot", "technic:red_energy_crystal", "technic:stainless_steel_ingot"},
{"technic:stainless_steel_ingot", "technic:battery", "technic:stainless_steel_ingot"}
}
})
end
minetest.register_alias("teletool:teletool", "teletool:teletool_infinite")