capturetheflag/mods/ctf/ctf_map/nodes.lua

192 lines
5.9 KiB
Lua

-- Backwards compat
minetest.register_alias("ctf_map:ind_stone", "ctf_map:stone")
-- Special nodes
minetest.register_node("ctf_map:ignore", {
description = "Artificial Ignore", -- this may need to be given a more appropriate name
drawtype = "airlike",
paramtype = "light",
sunlight_propagates = true,
walkable = true,
pointable = false,
diggable = false,
buildable_to = false,
air_equivalent = true,
groups = {immortal = 1, disable_suffocation = 1},
})
minetest.register_node("ctf_map:ind_glass", {
description = "Indestructible Barrier Glass",
drawtype = "glasslike_framed",
tiles = {"default_glass.png", "default_glass_detail.png"},
inventory_image = minetest.inventorycube("default_glass.png"),
paramtype = "light",
sunlight_propagates = true,
is_ground_content = false,
walkable = true,
buildable_to = false,
pointable = ctf_core.settings.server_mode == "mapedit",
groups = {immortal = 1},
sounds = default.node_sound_glass_defaults()
})
minetest.register_node("ctf_map:ind_glass_red", {
description = "Indestructible Red Barrier Glass",
drawtype = "glasslike",
tiles = {"ctf_map_glass_red.png"},
inventory_image = minetest.inventorycube("ctf_map_glass_red.png"),
paramtype = "light",
sunlight_propagates = true,
is_ground_content = false,
walkable = true,
buildable_to = false,
use_texture_alpha = false,
alpha = 0,
pointable = ctf_core.settings.server_mode == "mapedit",
groups = {immortal = 1},
sounds = default.node_sound_glass_defaults()
})
ctf_map.barrier_nodes[minetest.get_content_id("ctf_map:ind_glass_red")] = minetest.CONTENT_AIR
minetest.register_node("ctf_map:ind_stone_red", {
description = "Indestructible Red Barrier Stone",
groups = {immortal = 1},
tiles = {"ctf_map_stone_red.png"},
is_ground_content = false
})
ctf_map.barrier_nodes[minetest.get_content_id("ctf_map:ind_stone_red")] = minetest.get_content_id("default:stone")
minetest.register_node("ctf_map:killnode", {
description = "Kill Node",
drawtype = "glasslike",
tiles = {"ctf_map_killnode.png"},
paramtype = "light",
sunlight_propogates = true,
walkable = false,
pointable = ctf_core.settings.server_mode == "mapedit",
damage_per_second = 20,
is_ground_content = false,
groups = {immortal = 1},
sounds = default.node_sound_glass_defaults(),
})
local mod_prefixes = {
default = "";
stairs = "";
wool = "wool_";
}
-- See Lua API, section "Node-only groups"
local preserved_groups = {
bouncy = true;
fence = true;
connect_to_raillike = true;
disable_jump = true;
fall_damage_add_percent = true;
slippery = true;
}
local function make_immortal(def)
local groups = {immortal = 1}
for group in pairs(preserved_groups) do
groups[group] = def.groups[group]
end
def.groups = groups
def.floodable = false
def.description = def.description and ("Indestructible " .. def.description)
end
local queue = {}
for name, def in pairs(minetest.registered_nodes) do
local mod, nodename = name:match"(..-):(.+)"
local prefix = mod_prefixes[mod]
if nodename and prefix and name ~= "default:torch" and
not (def.groups and (def.groups.immortal or def.groups.not_in_creative_inventory)) then
local new_name = "ctf_map:" .. prefix .. nodename -- HACK to preserve backwards compatibility
local new_def = table.copy(def)
if def.drop == name then
new_def.drop = new_name
end
make_immortal(new_def)
table.insert(queue, {name = new_name, def = new_def})
end
end
for _, node in pairs(queue) do
minetest.register_node(node.name, node.def)
end
minetest.register_alias("ctf_map:torch", "default:torch")
minetest.register_alias("ctf_map:torch_wall", "default:torch_wall")
minetest.register_alias("ctf_map:torch_ceiling", "default:torch_ceiling")
--
--- credit for most of code goes to tsm_chests mod used by CTF 2.0
local chest_formspec =
"size[8,9]" ..
"list[current_name;main;0,0.3;8,4;]" ..
"list[current_player;main;0,4.85;8,1;]" ..
"list[current_player;main;0,6.08;8,3;8]" ..
"listring[current_name;main]" ..
"listring[current_player;main]" ..
default.get_hotbar_bg(0,4.85)
minetest.register_node("ctf_map:chest", {
description = "Treasure Chest",
tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
"default_chest_side.png", "default_chest_side.png", "default_chest_front.png"},
paramtype2 = "facedir",
groups = {immortal = 1},
light_source = 2,
is_ground_content = false,
sounds = default.node_sound_wood_defaults(),
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", "Treasure Chest")
meta:set_string("formspec", chest_formspec)
local inv = meta:get_inventory()
inv:set_size("main", 8*4)
end,
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
if player then
minetest.chat_send_player(player:get_player_name(),
"You're not allowed to put things in treasure chests!")
return 0
end
end,
can_dig = function(pos,player)
local meta = minetest.get_meta(pos);
local inv = meta:get_inventory()
return inv:is_empty("main")
end,
on_metadata_inventory_move = function(pos, from_list, from_index,
to_list, to_index, count, player)
minetest.log("action", player:get_player_name() ..
" moves stuff in chest at " .. minetest.pos_to_string(pos))
end,
on_metadata_inventory_put = function(pos, listname, index, stack, player)
minetest.log("action", string.format("%s puts %s to treasure chest at %s",
player:get_player_name(),
stack:to_string(),
minetest.pos_to_string(pos)
))
end,
on_metadata_inventory_take = function(pos, listname, index, stack, player)
minetest.log("action", string.format("%s takes %s from treasure chest at %s",
player:get_player_name(),
stack:to_string(),
minetest.pos_to_string(pos)
))
local inv = minetest.get_inventory({type = "node", pos = pos})
if not inv or inv:is_empty("main") then
minetest.set_node(pos, {name="air"})
minetest.show_formspec(player:get_player_name(), "", player:get_inventory_formspec())
end
end,
})