streets/api_register_all.lua
Thomas--S d8ec7f6191 Improve Signs
* Add light_source
* Add meshes
* Allow big signs
* Reduce texture size
2017-09-17 13:38:25 +02:00

349 lines
13 KiB
Lua

--[[
## StreetsMod 2.0 ##
Submod: streetsapi
Optional: false
Category: Init
]]
local register_surface_nodes = function(friendlyname, name, tiles, groups, sounds, craft)
minetest.register_node(":streets:" .. name, {
description = friendlyname,
tiles = tiles,
groups = groups,
sounds = sounds
})
minetest.register_craft(craft)
if minetest.get_modpath("moreblocks") then
stairsplus:register_all("streets", name, "streets:" .. name, {
description = friendlyname,
tiles = tiles,
groups = groups,
sounds = sounds
})
end
end
local register_sign_node = function(friendlyname, name, tiles, type, inventory_image, light_source)
if type == "minetest" then
tiles[5] = tiles[6] .. "^[colorize:#fff^[mask:(" .. tiles[6] .. "^" .. tiles[5] .. ")"
elseif type == "normal" or type == "big" then
tiles[2] = tiles[1] .. "^[colorize:#fff^[mask:(" .. tiles[1] .. "^" .. tiles[2] .. ")^[transformFX"
end
local def = {}
def.description = friendlyname
def.paramtype = "light"
def.paramtype2 = "facedir"
def.tiles = tiles
def.light_source = light_source
def.groups = { cracky = 3, not_in_creative_inventory = 1, sign = 1 }
def.drop = "streets:" .. name
if type == "minetest" then
def.drawtype = "nodebox"
def.inventory_image = tiles[6]
elseif type == "normal" or type == "big" then
def.drawtype = "mesh"
def.inventory_image = tiles[1]
end
if inventory_image then
def.inventory_image = inventory_image
end
local normal_def = table.copy(def)
local center_def = table.copy(def)
local polemount_def = table.copy(def)
if type == "minetest" then
normal_def.node_box = {
type = "fixed",
fixed = { -1 / 2, -1 / 2, 0.5, 1 / 2, 1 / 2, 0.45 }
}
center_def.node_box = {
type = "fixed",
fixed = { -1 / 2, -1 / 2, -0.025, 1 / 2, 1 / 2, 0.025 }
}
polemount_def.node_box = {
type = "fixed",
fixed = { -1 / 2, -1 / 2, 0.8, 1 / 2, 1 / 2, 0.85 }
}
elseif type == "normal" then
normal_def.mesh = "sign.obj"
center_def.mesh = "sign_center.obj"
polemount_def.mesh = "sign_polemount.obj"
elseif type == "big" then
normal_def.mesh = "sign_big.obj"
center_def.mesh = "sign_center_big.obj"
polemount_def.mesh = "sign_polemount_big.obj"
end
normal_def.selection_box = {
type = "fixed",
fixed = { -1 / 2, -1 / 2, 0.5, 1 / 2, 1 / 2, 0.45 }
}
center_def.selection_box = {
type = "fixed",
fixed = { -1 / 2, -1 / 2, -0.025, 1 / 2, 1 / 2, 0.025 }
}
polemount_def.selection_box = {
type = "fixed",
fixed = { -1 / 2, -1 / 2, 0.8, 1 / 2, 1 / 2, 0.85 }
}
normal_def.after_place_node = function(pos)
local behind_pos = { x = pos.x, y = pos.y, z = pos.z }
local node = minetest.get_node(pos)
local param2 = node.param2
if param2 == 0 then
behind_pos.z = behind_pos.z + 1
elseif param2 == 1 then
behind_pos.x = behind_pos.x + 1
elseif param2 == 2 then
behind_pos.z = behind_pos.z - 1
elseif param2 == 3 then
behind_pos.x = behind_pos.x - 1
end
local behind_node = minetest.get_node(behind_pos)
local behind_nodes = {}
behind_nodes["streets:roadwork_traffic_barrier"] = true
behind_nodes["streets:concrete_wall"] = true
behind_nodes["technic:concrete_post"] = true
local under_pos = { x = pos.x, y = pos.y - 1, z = pos.z }
local under_node = minetest.get_node(under_pos)
local under_nodes = {}
under_nodes["streets:roadwork_traffic_barrier"] = true
under_nodes["streets:concrete_wall"] = true
under_nodes["technic:concrete_post"] = true
local upper_pos = { x = pos.x, y = pos.y + 1, z = pos.z }
local upper_node = minetest.get_node(upper_pos)
if (minetest.registered_nodes[behind_node.name].groups.bigpole
and minetest.registered_nodes[behind_node.name].streets_pole_connection[param2][behind_node.param2 + 1] ~= 1)
or behind_nodes[behind_node.name] == true then
node.name = node.name .. "_polemount"
minetest.set_node(pos, node)
elseif (minetest.registered_nodes[under_node.name].groups.bigpole
and minetest.registered_nodes[under_node.name].streets_pole_connection["t"][under_node.param2 + 1] == 1)
or under_nodes[under_node.name] then
node.name = node.name .. "_center"
minetest.set_node(pos, node)
elseif minetest.registered_nodes[upper_node.name].groups.bigpole then
if minetest.registered_nodes[upper_node.name].streets_pole_connection["b"][upper_node.param2 + 1] == 1 then
node.name = node.name .. "_center"
minetest.set_node(pos, node)
end
end
end
minetest.register_node(":streets:" .. name, normal_def)
minetest.register_node(":streets:" .. name .. "_center", center_def)
minetest.register_node(":streets:" .. name .. "_polemount", polemount_def)
end
local register_marking_nodes = function(surface_friendlyname, surface_name, surface_tiles, surface_groups, surface_sounds, register_stairs, friendlyname, name, tex, r, basic)
local rotation_friendly = ""
if r == "r90" then
rotation_friendly = " (R90)"
tex = tex .. "^[transformR90"
elseif r == "r180" then
rotation_friendly = " (R180)"
tex = tex .. "^[transformR180"
elseif r == "r270" then
rotation_friendly = " (R270)"
tex = tex .. "^[transformR270"
end
if r ~= "" then
r = "_" .. r
end
for color = 1, 2 do
local colorname
if color == 1 then
colorname = "White"
elseif color == 2 then
colorname = "Yellow"
tex = "" .. tex .. "^[colorize:#ecb100"
end
minetest.register_tool(":streets:tool_" .. name:gsub("{color}", colorname:lower()) .. r, {
description = "Marking Tool: " .. friendlyname .. rotation_friendly .. " " .. colorname,
groups = { not_in_creative_inventory = 1 },
inventory_image = tex,
wield_image = tex,
on_place = function(itemstack, placer, pointed_thing)
local player_name = placer:get_player_name()
local pos = {}
if pointed_thing["type"] == "node" then
pos = pointed_thing.under
pos.y = pos.y + 1
else
return itemstack
end
if minetest.is_protected(pos, player_name) and not minetest.check_player_privs(player_name, { protection_bypass = true }) then
minetest.record_protection_violation(pos, name)
return
end
if minetest.get_node(pos).name == "air" then
minetest.set_node(pos, {
name = "streets:mark_" .. name:gsub("{color}", colorname:lower()) .. r,
param2 = minetest.dir_to_facedir(placer:get_look_dir())
})
else
return itemstack
end
local node = minetest.get_node(pos)
local lower_pos = { x = pos.x, y = pos.y - 1, z = pos.z }
local lower_node = minetest.get_node(lower_pos)
if lower_node and
minetest.registered_nodes[lower_node.name] and
minetest.registered_nodes[lower_node.name].groups and
minetest.registered_nodes[lower_node.name].groups.asphalt and
streets.surfaces.surfacetypes[lower_node.name] then
local lower_node_basename = streets.surfaces.surfacetypes[lower_node.name].name
lower_node.name = "streets:mark_" .. (node.name:sub(14)) .. "_on_" .. lower_node_basename
lower_node.param2 = node.param2
minetest.set_node(lower_pos, lower_node)
minetest.remove_node(pos)
elseif lower_node and
minetest.registered_nodes[lower_node.name] and
minetest.registered_nodes[lower_node.name].groups and
minetest.registered_nodes[lower_node.name].groups.asphalt and
minetest.registered_nodes[lower_node.name:gsub("asphalt", ("mark_" .. node.name:sub(14)) .. "_on_asphalt")] then
lower_node.name = lower_node.name:gsub("asphalt", ("mark_" .. node.name:sub(14)) .. "_on_asphalt")
minetest.set_node(lower_pos, lower_node)
minetest.remove_node(pos)
end
itemstack:add_wear(65535 / 75)
return itemstack
end,
})
minetest.register_node(":streets:mark_" .. name:gsub("{color}", colorname:lower()) .. r, {
description = "Marking Overlay: " .. friendlyname .. rotation_friendly .. " " .. colorname,
tiles = { tex, "streets_transparent.png" },
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
groups = { snappy = 3, attached_node = 1, oddly_breakable_by_hand = 1, not_in_creative_inventory = 1 },
sunlight_propagates = true,
walkable = false,
inventory_image = tex,
wield_image = tex,
node_box = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, -0.499, 0.5 }
},
selection_box = {
type = "fixed",
fixed = { -1 / 2, -1 / 2, -1 / 2, 1 / 2, -1 / 2 + 1 / 16, 1 / 2 }
},
drop = "",
})
local tiles = {}
tiles[1] = surface_tiles[1]
tiles[2] = surface_tiles[2] or surface_tiles[1] --If less than 6 textures are used, this'll "expand" them to 6
tiles[3] = surface_tiles[3] or surface_tiles[1]
tiles[4] = surface_tiles[4] or surface_tiles[1]
tiles[5] = surface_tiles[5] or surface_tiles[1]
tiles[6] = surface_tiles[6] or surface_tiles[1]
tiles[1] = tiles[1] .. "^(" .. tex .. ")"
tiles[5] = tiles[5] .. "^(" .. tex .. ")^[transformR180"
tiles[6] = tiles[6] .. "^(" .. tex .. ")"
local groups = streets.copytable(surface_groups)
groups.not_in_creative_inventory = 1
minetest.register_node(":streets:mark_" .. name:gsub("{color}", colorname:lower()) .. r .. "_on_" .. surface_name, {
description = surface_friendlyname .. " with Marking: " .. friendlyname .. rotation_friendly .. " " .. colorname,
groups = groups,
sounds = surface_sounds,
tiles = tiles,
paramtype2 = "facedir",
drop = "",
after_destruct = function(pos, oldnode)
local newnode = oldnode
newnode.name = oldnode.name:gsub("mark_(.-)_on_", "")
minetest.set_node(pos, newnode)
end,
})
minetest.register_craft({
output = "streets:mark_" .. name:gsub("{color}", colorname:lower()) .. r .. "_on_" .. surface_name,
type = "shapeless",
recipe = { "streets:" .. surface_name, "streets:mark_" .. name:gsub("{color}", colorname:lower()) }
})
if register_stairs and ( not streets.only_basic_stairsplus or basic ) and (minetest.get_modpath("moreblocks") or minetest.get_modpath("stairsplus")) then
local stairs_def = {
description = surface_friendlyname .. " with Marking: " .. friendlyname .. rotation_friendly .. " " .. colorname,
tiles = tiles,
groups = surface_groups,
sounds = surface_sounds,
drop = {
max_items = 1, -- Maximum number of items to drop.
items = {
-- Choose max_items randomly from this list.
{
items = { "" }, -- Choose one item randomly from this list.
rarity = 1, -- Probability of getting is 1 / rarity.
},
},
},
after_destruct = function(pos, oldnode)
local newnode = oldnode
newnode.name = oldnode.name:gsub("mark_(.-)_on_", "")
minetest.set_node(pos, newnode)
end,
}
stairsplus:register_stair("streets",
"mark_" .. name:gsub("{color}", colorname:lower()) .. r .. "_on_" .. surface_name,
"streets:mark_" .. name:gsub("{color}", colorname:lower()) .. r .. "_on_" .. surface_name,
stairs_def)
stairsplus:register_slab("streets",
"mark_" .. name:gsub("{color}", colorname:lower()) .. r .. "_on_" .. surface_name,
"streets:mark_" .. name:gsub("{color}", colorname:lower()) .. r .. "_on_" .. surface_name,
stairs_def)
stairsplus:register_slope("streets",
"mark_" .. name:gsub("{color}", colorname:lower()) .. r .. "_on_" .. surface_name,
"streets:mark_" .. name:gsub("{color}", colorname:lower()) .. r .. "_on_" .. surface_name,
stairs_def)
end
end
end
if streets.surfaces.surfacetypes then
for _, v in pairs(streets.surfaces.surfacetypes) do
register_surface_nodes(v.friendlyname, v.name, v.tiles, v.groups, v.sounds, v.craft)
if streets.labels.labeltypes then
for _, w in pairs(streets.labels.labeltypes) do
register_marking_nodes(v.friendlyname, v.name, v.tiles, v.groups, v.sounds, v.register_stairs, w.friendlyname, w.name, w.tex, "", w.basic)
if not streets.only_basic_stairsplus and w.rotation then
if w.rotation.r90 then
register_marking_nodes(v.friendlyname, v.name, v.tiles, v.groups, v.sounds, v.register_stairs, w.friendlyname, w.name, w.tex, "r90", w.basic)
end
if w.rotation.r180 then
register_marking_nodes(v.friendlyname, v.name, v.tiles, v.groups, v.sounds, v.register_stairs, w.friendlyname, w.name, w.tex, "r180", w.basic)
end
if w.rotation.r270 then
register_marking_nodes(v.friendlyname, v.name, v.tiles, v.groups, v.sounds, v.register_stairs, w.friendlyname, w.name, w.tex, "r270", w.basic)
end
elseif streets.only_basic_stairsplus and w.basic_rotation then
if w.basic_rotation.r90 then
register_marking_nodes(v.friendlyname, v.name, v.tiles, v.groups, v.sounds, v.register_stairs, w.friendlyname, w.name, w.tex, "r90", w.basic)
end
if w.basic_rotation.r180 then
register_marking_nodes(v.friendlyname, v.name, v.tiles, v.groups, v.sounds, v.register_stairs, w.friendlyname, w.name, w.tex, "r180", w.basic)
end
if w.basic_rotation.r270 then
register_marking_nodes(v.friendlyname, v.name, v.tiles, v.groups, v.sounds, v.register_stairs, w.friendlyname, w.name, w.tex, "r270", w.basic)
end
end
end
end
end
end
if streets.signs.signtypes then
for _, v in pairs(streets.signs.signtypes) do
register_sign_node(v.friendlyname, v.name, v.tiles, v.type, v.inventory_image, v.light_source)
end
end