193 lines
5.1 KiB
Plaintext
193 lines
5.1 KiB
Plaintext
-- Teleporters mod by Zeg9
|
|
-- Licensed under the WTFPL
|
|
-- Have fun :D
|
|
|
|
teleporters = {}
|
|
|
|
-- config
|
|
teleporters.go_up_effect = true
|
|
-- end
|
|
|
|
teleporters.block_groups = {cracky=2}
|
|
teleporters.copy_pos = function (_pos)
|
|
return {x=_pos.x, y=_pos.y, z=_pos.z}
|
|
end
|
|
|
|
teleporters.is_safe = function (pos)
|
|
ok = false
|
|
if minetest.env:get_node(pos).name ~= "air" then
|
|
pos.y = pos.y +1
|
|
if minetest.env:get_node(pos).name == "air" then
|
|
pos.y = pos.y +1
|
|
if minetest.env:get_node(pos).name == "air" then
|
|
ok = true
|
|
end
|
|
pos.y = pos.y -1
|
|
end
|
|
pos.y = pos.y -1
|
|
end
|
|
return ok
|
|
end
|
|
|
|
teleporters.find_safe = function (_pos)
|
|
pos = teleporters.copy_pos(_pos)
|
|
pos.x = pos.x +1 if teleporters.is_safe(pos) then return pos end
|
|
|
|
pos = teleporters.copy_pos(_pos)
|
|
pos.x = pos.x -1 if teleporters.is_safe(pos) then return pos end
|
|
|
|
pos = teleporters.copy_pos(_pos)
|
|
pos.z = pos.z +1 if teleporters.is_safe(pos) then return pos end
|
|
|
|
pos = teleporters.copy_pos(_pos)
|
|
pos.z = pos.z -1 if teleporters.is_safe(pos) then return pos end
|
|
|
|
return _pos
|
|
end
|
|
|
|
teleporters.network = {}
|
|
|
|
teleporters.file = minetest.get_worldpath()..'/teleporters'
|
|
|
|
teleporters.save = function()
|
|
local output = ''
|
|
for id, coords in pairs(teleporters.network) do output = output..id..':'..coords.x..','..coords.y..','..coords.z..';' end
|
|
local f = io.open(teleporters.file, "w")
|
|
f:write(output)
|
|
io.close(f)
|
|
end
|
|
|
|
teleporters.load = function()
|
|
local f = io.open(teleporters.file, "r")
|
|
if f then
|
|
local contents = f:read()
|
|
io.close(f)
|
|
if contents ~= nil then
|
|
local entries = contents:split(";")
|
|
for i,entry in pairs(entries) do
|
|
local id, coords = unpack(entry:split(":"))
|
|
local p = {}
|
|
p.x, p.y, p.z = string.match(coords, "^([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+)$")
|
|
if p.x and p.y and p.z then
|
|
teleporters.network[tonumber(id)] = {x = tonumber(p.x),y= tonumber(p.y),z = tonumber(p.z)}
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
teleporters.load()
|
|
|
|
teleporters.get_new_id = function()
|
|
id = 0
|
|
for k,_ in pairs(teleporters.network) do
|
|
if k > id then id = k end
|
|
end
|
|
return id+1
|
|
end
|
|
|
|
teleporters.make_formspec = function (meta)
|
|
formspec = "size[6,3]" ..
|
|
"label[0,0;Teleporter #"..meta:get_int("id").."]"..
|
|
"field[1,1.25;4.5,1;desc;Description;"..meta:get_string("infotext").."]"..
|
|
"button_exit[2,2;2,1;save;Save]"
|
|
return formspec
|
|
end
|
|
|
|
teleporters.teleport = function (params)
|
|
params.obj:setpos(params.pos)
|
|
end
|
|
|
|
-- Nodes and items
|
|
|
|
minetest.register_craftitem("teleporters:spiral", {
|
|
description = "Mese spiral",
|
|
inventory_image = "teleporters_spiral.png",
|
|
})
|
|
|
|
minetest.register_node("teleporters:base", {
|
|
description = "Teleporter base",
|
|
tiles = {"teleporters_base.png"},
|
|
groups = teleporters.block_groups,
|
|
light_source = 10,
|
|
})
|
|
|
|
minetest.register_node("teleporters:teleporter", {
|
|
description = "Teleporter",
|
|
tiles = {"teleporters_base.png^teleporters_spiral.png","teleporters_base.png"},
|
|
groups = teleporters.block_groups,
|
|
light_source = 10,
|
|
on_construct = function(pos)
|
|
id = teleporters.get_new_id()
|
|
teleporters.network[id] = pos
|
|
teleporters.save()
|
|
local meta = minetest.env:get_meta(pos)
|
|
meta:set_int("id",id)
|
|
meta:set_string("infotext","Teleporter")
|
|
meta:set_string("formspec",teleporters.make_formspec(meta))
|
|
end,
|
|
on_receive_fields = function(pos, formname, fields, sender)
|
|
if fields.desc then
|
|
local meta = minetest.env:get_meta(pos)
|
|
meta:set_string("infotext",fields.desc)
|
|
meta:set_string("formspec",teleporters.make_formspec(meta))
|
|
end
|
|
end,
|
|
})
|
|
|
|
-- ABM
|
|
|
|
minetest.register_abm({
|
|
nodenames = {"teleporters:teleporter"},
|
|
interval = 1,
|
|
chance = 1,
|
|
action = function(pos, node)
|
|
local meta = minetest.env:get_meta(pos)
|
|
pos.y = pos.y+.5
|
|
local objs = minetest.env:get_objects_inside_radius(pos, .5)
|
|
pos.y = pos.y -.5
|
|
for _, obj in pairs(objs) do
|
|
minetest.sound_play("teleporters_teleport",{pos=pos,gain=1,max_hear_distance=32})
|
|
if meta:get_int("id") %2 == 0 then newpos = teleporters.network[meta:get_int("id")-1]
|
|
else newpos = teleporters.network[meta:get_int("id")+1] end
|
|
if not newpos then newpos = pos end
|
|
newpos = teleporters.copy_pos(newpos)
|
|
minetest.sound_play("teleporters_teleport",{gain=1,to_player=obj:get_player_name()})
|
|
newpos = teleporters.find_safe(newpos)
|
|
newpos.y = newpos.y + .5
|
|
if teleporters.go_up_effect then
|
|
newpos.y = newpos.y -1
|
|
teleporters.teleport({obj=obj,pos=newpos})
|
|
newpos.y = newpos.y +1
|
|
minetest.after(.1, teleporters.teleport, {obj=obj,pos=newpos})
|
|
else
|
|
teleporters.teleport({obj=obj,pos=newpos})
|
|
end
|
|
end
|
|
end,
|
|
})
|
|
|
|
-- Crafting
|
|
|
|
minetest.register_craft({
|
|
output = '"teleporters:spiral" 16',
|
|
recipe = {
|
|
{"default:coal_lump","default:mese","default:coal_lump"},
|
|
{"default:mese","","default:mese"},
|
|
{"default:coal_lump","default:mese","default:coal_lump"}
|
|
}
|
|
})
|
|
|
|
minetest.register_craft({
|
|
output = '"teleporters:base" 4',
|
|
type = "shapeless",
|
|
recipe = {"default:steel_ingot","default:steel_ingot","default:mese","default:mese","bucket:bucket_lava"},
|
|
replacements = {{"bucket:bucket_lava", "bucket:bucket_empty"}}
|
|
})
|
|
|
|
minetest.register_craft({
|
|
output = "teleporters:teleporter",
|
|
recipe = { {"teleporters:spiral"}, {"teleporters:base"} },
|
|
})
|
|
|