update castles, areas, areas_protector, bakedclay, signs_lib,

bees, blox, bobblocks, coloredwood, homedecor, technic,
currency, digilines, digistguff, facade, farming_redo,
framedglass, gloopblocks, ilights, led_marquee, maptools,
mesecons, moreblocks, moreores, mymillwork, plasticbox,
replacer, ropes, street_signs, solidcolor, stained_glass,
teleport_request, unified_inventory, unifieddyes, worldedit,

add basic_signs, notify_hud_provider
This commit is contained in:
Vanessa Dannenberg 2019-09-11 13:58:21 -04:00
parent 6af5d5da3f
commit 94fa40c6f7
1793 changed files with 18564 additions and 3970 deletions

View File

@ -215,6 +215,9 @@ minetest.register_node("anvil:anvil", {
end,
on_rightclick = function(pos, node, clicker, itemstack)
if not clicker or not itemstack then
return
end
local meta = minetest.get_meta(pos)
local name = clicker:get_player_name()

View File

@ -1,21 +1,29 @@
Areas mod for Minetest 0.4.8+
=============================
Areas mod for Minetest
======================
Dependencies
------------
Minetest 5.0.0+ is recommended, but 0.4.16+ should work as well.
Configuration
-------------
If you wish to specify configuration options, such as whether players are
allowed to protect their own areas with the `protect` command (disabled by
default), you should check settings.lua and set the appropriate settings in your
server's configuration file (probably `minetest.conf`).
Open the tab `Settings -> All Settings -> Mods -> areas` to get a list of all
possible settings.
For server owners: Check `settingtypes.txt` and modify your `minetest.conf`
according to the wanted setting changes.
Tutorial
--------
To protect an area you must first set the corner positions of the area.
In order to set the corner positions you can run:
1) Specify the corner positions of the area you would like to protect.
Use one of the following commands:
* `/area_pos set` and punch the two corner nodes to set them.
* `/area_pos set1/set2` and punch only the first or second corner node to
set them one at a time.
@ -23,25 +31,25 @@ In order to set the corner positions you can run:
* `/area_pos1/2 X Y Z` to set one of the positions to the specified
coordinates.
Once you have set the border positions you can protect the area by running one
of the following commands:
2) Protect the selected area by running one of the following commands:
* `/set_owner <OwnerName> <AreaName>` -- If you have the `areas` privilege.
* `/protect <AreaName>` -- If you have the `areas` privilege or the server
administrator has enabled area self-protection.
The area name is used only for informational purposes (so that you know what
an area is for). It is not used for any other purpose.
The area name is used only for informational purposes and has no functional
importance.
For example: `/set_owner SomePlayer Mese city`
Now that you own an area you may want to add sub-owners to it. You can do this
with the `add_owner` command. Anyone with an area can use the `add_owner`
command on their areas. Before using the `add_owner` command you have to
select the corners of the sub-area as you did for `set_owner`. If your markers
are still around your original area and you want to grant access to your
entire area you will not have to re-set them. You can also use `select_area` to
place the markers at the corners of an existing area if you've reset your
3) You now own an area. You may now add sub-owners to it if you want to (see command `/add_owner`). Before using the `/add_owner` command you have to
select the corners of the sub-area as you did in step 1.
If your markers are still around your original area and you want to grant
access to your entire area you will not have to re-set them. Use `/select_area` to place the markers at the corners of an existing area if you've reset your
markers and want to grant access to a full area.
The `add_owner` command expects three arguments:
The `/add_owner` command expects three arguments:
1. The ID number of the parent area (the area that you want to add a
sub-area to).
2. The name of the player that will own the sub-area.

View File

@ -14,7 +14,7 @@ minetest.register_globalstep(function(dtime)
for _, player in pairs(minetest.get_connected_players()) do
local name = player:get_player_name()
local pos = vector.round(player:getpos())
local pos = vector.round(player:get_pos())
pos = vector.apply(pos, function(p)
return math.max(math.min(p, 2147483), -2147483)
end)

View File

@ -32,7 +32,7 @@ if not minetest.registered_privileges[areas.config.self_protection_privilege] th
})
end
if minetest.settings:get_bool("log_mod") then
if minetest.settings:get_bool("log_mods") then
local diffTime = os.clock() - areas.startTime
minetest.log("action", "areas loaded in "..diffTime.."s.")
end

View File

@ -53,7 +53,7 @@ minetest.register_chatcommand("area_pos1", {
elseif param == "" then
local player = minetest.get_player_by_name(name)
if player then
pos = player:getpos()
pos = player:get_pos()
else
return false, "Unable to get position."
end
@ -80,7 +80,7 @@ minetest.register_chatcommand("area_pos2", {
elseif param == "" then
local player = minetest.get_player_by_name(name)
if player then
pos = player:getpos()
pos = player:get_pos()
else
return false, "Unable to get position."
end

View File

@ -2,44 +2,45 @@ local world_path = minetest.get_worldpath()
areas.config = {}
local function setting(tp, name, default)
local full_name = "areas."..name
local function setting(name, tp, default)
local full_name = "areas." .. name
local value
if tp == "boolean" then
if tp == "bool" then
value = minetest.settings:get_bool(full_name)
default = value == nil and minetest.is_yes(default)
elseif tp == "string" then
value = minetest.settings:get(full_name)
elseif tp == "position" then
elseif tp == "v3f" then
value = minetest.setting_get_pos(full_name)
elseif tp == "number" then
default = value == nil and minetest.string_to_pos(default)
elseif tp == "float" or tp == "int" then
value = tonumber(minetest.settings:get(full_name))
local v, other = default:match("^(%S+) (.+)")
default = value == nil and tonumber(other and v or default)
else
error("Invalid setting type!")
error("Cannot parse setting type " .. tp)
end
if value == nil then
value = default
assert(default ~= nil, "Cannot parse default for " .. full_name)
end
--print("add", name, default, value)
areas.config[name] = value
end
local file = io.open(areas.modpath .. "/settingtypes.txt", "r")
for line in file:lines() do
local name, tp, value = line:match("^areas%.(%S+) %(.*%) (%S+) (.*)")
if value then
setting(name, tp, value)
end
end
file:close()
--------------
-- Settings --
--------------
setting("string", "filename", world_path.."/areas.dat")
setting("filename", "string", world_path.."/areas.dat")
-- Allow players with a privilege create their own areas
-- within the maximum size and number.
setting("boolean", "self_protection", false)
setting("string", "self_protection_privilege", "interact")
setting("position", "self_protection_max_size", {x=64, y=128, z=64})
setting("number", "self_protection_max_areas", 4)
-- For players with the areas_high_limit privilege.
setting("position", "self_protection_max_size_high", {x=512, y=512, z=512})
setting("number", "self_protection_max_areas_high", 32)
-- legacy_table (owner_defs) compatibility. Untested and has known issues.
setting("boolean", "legacy_table", false)
-- configure the refresh delay for the name displays in the HUD
setting("number", "tick", 0.5)

38
areas/settingtypes.txt Normal file
View File

@ -0,0 +1,38 @@
# This file is parsed in "settings.lua". Check regex first.
# Static paths do not work well with settings
#areas.filename (Configuration file path) string (world_path)/areas.dat
# Allow players with a privilege create their own areas using /protect
# within the specified size and amount limits.
areas.self_protection (Self protection) bool false
# Self protection: Privilege required to protect an area
areas.self_protection_privilege (Self protection: Required privs) string interact
# Refresh delay for the name displays in the HUD in seconds
areas.tick (HUD update delay) float 0.5 0 100
# Enable the legacy owner_defs metatable mode. Untested and possibly unstable
areas.legacy_table (Legacy owner_defs metatable) bool false
[Self protection (normal)]
# Self protection (normal): Maximal size of the protectable area
# Only enter positive whole numbers for the coordinate values or you'll mess up stuff.
areas.self_protection_max_size (Maximal area size) v3f (64, 128, 64)
# Self protection (normal): Maximal amount of protected areas per player
areas.self_protection_max_areas (Maximal area count) int 4
[Self protection (high)]
# Self protection (normal): Maximal size of the protectable area
# This setting applies for plyaers with the privilege 'areas_high_limit'
areas.self_protection_max_size_high (Maximal area size) v3f (512, 512, 512)
# Self protection (normal): Maximal amount of protected areas per player
# Only enter positive whole numbers for the coordinate values or you'll mess up stuff.
# This setting applies for plyaers with the privilege 'areas_high_limit'
areas.self_protection_max_areas_high (Maximal area count) float 32

View File

@ -9,7 +9,21 @@ local function red(str)
return minetest.colorize("#FF5555",str)
end
local radius = minetest.setting_get("areasprotector_radius") or 8
local radius_large = minetest.setting_get("areasprotector_radius_large")
or minetest.setting_get("areasprotector_radius")
or 16
local height_large = minetest.setting_get("areasprotector_height_large")
or minetest.setting_get("areasprotector_radius_large")
or minetest.setting_get("areasprotector_radius")
or 16
local radius_small = minetest.setting_get("areasprotector_radius_small")
or 7
local height_small = minetest.setting_get("areasprotector_height_small")
or minetest.setting_get("areasprotector_radius_small")
or 7
local function remove_display(pos)
local objs = minetest.get_objects_inside_radius(pos, 0.5)
@ -18,8 +32,130 @@ local function remove_display(pos)
end
end
minetest.register_node("areasprotector:protector",{
description = "Protector Block",
local function on_place(itemstack, player, pointed, radius, height, sizeword)
local pos = pointed.above
local pos1 = vector.add(pos,vector.new(radius, height, radius))
local pos2 = vector.add(pos,vector.new(-radius, -height, -radius))
local name = player:get_player_name()
local perm,err = areas:canPlayerAddArea(pos1,pos2,name)
if not perm then
minetest.chat_send_player(name,red("You are not allowed to protect that area: ")..err)
return itemstack
end
local id = areas:add(name,"Protected by Protector Block at "..minetest.pos_to_string(pos, 0),pos1,pos2)
areas:save()
local msg = string.format("The area from %s to %s has been protected as #%s",cyan(minetest.pos_to_string(pos1)),cyan(minetest.pos_to_string(pos2)),cyan(id))
minetest.chat_send_player(name,msg)
minetest.set_node(pos,{name="areasprotector:protector_"..sizeword})
local meta = minetest.get_meta(pos)
local infotext = string.format("Protecting area %d owned by %s",id,name)
meta:set_string("infotext",infotext)
meta:set_int("area_id",id)
meta:set_string("owner",name)
if not minetest.setting_getbool("creative_mode") then
itemstack:take_item()
end
return itemstack
end
local function after_dig(pos, oldnode, oldmetadata, digger, sizeword)
if oldmetadata and oldmetadata.fields then
local owner = oldmetadata.fields.owner
local id = tonumber(oldmetadata.fields.area_id)
local playername = digger:get_player_name()
if areas.areas[id] and areas:isAreaOwner(id,owner) then
if digger:get_player_control().sneak then
local inv = digger:get_inventory()
if not creative_mode then
if inv:room_for_item("main", "default:steel_ingot 6") then
inv:remove_item("main", "areasprotector:protector_"..sizeword.." 1")
inv:add_item("main", "default:steel_ingot 6")
else
minetest.chat_send_player(playername, "No room for the replacement ingots, just digging the protector and deleting the area normally.")
areas:remove(id)
areas:save()
end
else
inv:remove_item("main", "areasprotector:protector_"..sizeword.." 1")
end
else
areas:remove(id)
areas:save()
end
end
end
end
local function on_punch(pos, node, puncher, sizeword)
local objs = minetest.get_objects_inside_radius(pos,.5) -- a radius of .5 since the entity serialization seems to be not that precise
local removed = false
for _, o in pairs(objs) do
if (not o:is_player()) and o:get_luaentity().name == "areasprotector:display_"..sizeword then
o:remove()
removed = true
end
end
if not removed then -- nothing was removed: there wasn't the entity
minetest.add_entity(pos, "areasprotector:display_"..sizeword)
minetest.after(4, remove_display, pos)
end
end
local function on_step(self, dtime, sizeword)
if minetest.get_node(self.object:getpos()).name ~= "areasprotector:protector_"..sizeword then
self.object:remove()
return
end
end
local function make_display_nodebox(radius, height)
local nb_radius = radius + 0.55
local nb_height = height + 0.55
local t = {
-- sides
{ -nb_radius, -nb_height, -nb_radius, -nb_radius, nb_height, nb_radius },
{ -nb_radius, -nb_height, nb_radius, nb_radius, nb_height, nb_radius },
{ nb_radius, -nb_height, -nb_radius, nb_radius, nb_height, nb_radius },
{ -nb_radius, -nb_height, -nb_radius, nb_radius, nb_height, -nb_radius },
-- top
{ -nb_radius, nb_height, -nb_radius, nb_radius, nb_height, nb_radius },
-- bottom
{ -nb_radius, -nb_height, -nb_radius, nb_radius, -nb_height, nb_radius },
-- middle (surround protector)
{-.55,-.55,-.55, .55,.55,.55},
}
return t
end
local nbox = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
}
minetest.register_node("areasprotector:protector_large", {
description = "Protector Block (large volume)",
groups = {cracky=1},
tiles = {
"default_steel_block.png",
"default_steel_block.png",
"default_steel_block.png^areasprotector_large_overlay.png^basic_materials_padlock.png"
},
paramtype = "light",
drawtype = "nodebox",
node_box = nbox,
on_place = function(itemstack, player, pointed_thing)
on_place(itemstack, player, pointed_thing, radius_large, height_large, "large")
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
after_dig(pos, oldnode, oldmetadata, digger, "large")
end,
on_punch = function(pos, node, puncher)
on_punch(pos, node, puncher, "large")
end
})
minetest.register_node("areasprotector:protector_small", {
description = "Protector Block (small volume)",
groups = {cracky=1},
tiles = {
"default_steel_block.png",
@ -28,126 +164,98 @@ minetest.register_node("areasprotector:protector",{
},
paramtype = "light",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
},
on_place = function(itemstack,player,pointed)
local pos = pointed.above
local pos1 = vector.add(pos,vector.new(radius,radius,radius))
local pos2 = vector.add(pos,vector.new(-1*radius,-1*radius,-1*radius))
local name = player:get_player_name()
local perm,err = areas:canPlayerAddArea(pos1,pos2,name)
if not perm then
minetest.chat_send_player(name,red("You are not allowed to protect that area: ")..err)
return itemstack
end
local id = areas:add(name,"Protected by Protector Block",pos1,pos2)
areas:save()
local msg = string.format("The area from %s to %s has been protected as #%s",cyan(minetest.pos_to_string(pos1)),cyan(minetest.pos_to_string(pos2)),cyan(id))
minetest.chat_send_player(name,msg)
minetest.set_node(pos,{name="areasprotector:protector"})
local meta = minetest.get_meta(pos)
local infotext = string.format("Protecting area %d owned by %s",id,name)
meta:set_string("infotext",infotext)
meta:set_int("area_id",id)
meta:set_string("owner",name)
if not minetest.setting_getbool("creative_mode") then
itemstack:take_item()
end
return itemstack
node_box = nbox,
on_place = function(itemstack, player, pointed_thing)
on_place(itemstack, player, pointed_thing, radius_small, height_small, "small")
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
if oldmetadata and oldmetadata.fields then
local owner = oldmetadata.fields.owner
local id = tonumber(oldmetadata.fields.area_id)
local playername = digger:get_player_name()
if areas.areas[id] and areas:isAreaOwner(id,owner) then
if digger:get_player_control().sneak then
local inv = digger:get_inventory()
if not creative_mode then
if inv:room_for_item("main", "default:steel_ingot 6") then
inv:remove_item("main", "areasprotector:protector 1")
inv:add_item("main", "default:steel_ingot 6")
else
minetest.chat_send_player(playername, "No room for the replacement ingots, just digging the protector and deleting the area normally.")
areas:remove(id)
areas:save()
end
else
inv:remove_item("main", "areasprotector:protector 1")
end
else
areas:remove(id)
areas:save()
end
end
end
after_dig(pos, oldnode, oldmetadata, digger, "small")
end,
on_punch = function(pos, node, puncher)
local objs = minetest.get_objects_inside_radius(pos,.5) -- a radius of .5 since the entity serialization seems to be not that precise
local removed = false
for _, o in pairs(objs) do
if (not o:is_player()) and o:get_luaentity().name == "areasprotector:display" then
o:remove()
removed = true
end
end
if not removed then -- nothing was removed: there wasn't the entity
minetest.add_entity(pos, "areasprotector:display")
minetest.after(4, remove_display, pos)
end
on_punch(pos, node, puncher, "small")
end
})
-- entities code below (and above) mostly copied-pasted from Zeg9's protector mod
minetest.register_entity("areasprotector:display", {
-- wielditem seems to be scaled to 1.5 times original node size
local vsize = {x=1.0/1.5, y=1.0/1.5}
local ecbox = {0, 0, 0, 0, 0, 0}
minetest.register_entity("areasprotector:display_large", {
physical = false,
collisionbox = {0,0,0,0,0,0},
collisionbox = ecbox,
visual = "wielditem",
visual_size = {x=1.0/1.5,y=1.0/1.5}, -- wielditem seems to be scaled to 1.5 times original node size
textures = {"areasprotector:display_node"},
visual_size = vsize,
textures = {"areasprotector:display_node_large"},
on_step = function(self, dtime)
if minetest.get_node(self.object:getpos()).name ~= "areasprotector:protector" then
self.object:remove()
return
end
end,
on_step(self, dtime, "large")
end
})
local nb_radius = radius + 0.55
minetest.register_entity("areasprotector:display_small", {
physical = false,
collisionbox = ecbox,
visual = "wielditem",
visual_size = vsize,
textures = {"areasprotector:display_node_small"},
on_step = function(self, dtime)
on_step(self, dtime, "small")
end
})
minetest.register_node("areasprotector:display_node", {
minetest.register_node("areasprotector:display_node_large", {
tiles = {"areasprotector_display.png"},
walkable = false,
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
-- sides
{ -nb_radius, -nb_radius, -nb_radius, -nb_radius, nb_radius, nb_radius },
{ -nb_radius, -nb_radius, nb_radius, nb_radius, nb_radius, nb_radius },
{ nb_radius, -nb_radius, -nb_radius, nb_radius, nb_radius, nb_radius },
{ -nb_radius, -nb_radius, -nb_radius, nb_radius, nb_radius, -nb_radius },
-- top
{ -nb_radius, nb_radius, -nb_radius, nb_radius, nb_radius, nb_radius },
-- bottom
{ -nb_radius, -nb_radius, -nb_radius, nb_radius, -nb_radius, nb_radius },
-- middle (surround protector)
{-.55,-.55,-.55, .55,.55,.55},
},
fixed = make_display_nodebox(radius_large, height_large)
},
selection_box = {
type = "regular",
},
paramtype = "light",
groups = {dig_immediate=3,not_in_creative_inventory=1},
drop = "",
drop = ""
})
minetest.register_node("areasprotector:display_node_small", {
tiles = {"areasprotector_display.png"},
walkable = false,
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = make_display_nodebox(radius_small, height_small)
},
selection_box = {
type = "regular",
},
paramtype = "light",
groups = {dig_immediate=3,not_in_creative_inventory=1},
drop = ""
})
minetest.register_craft({
output = "areasprotector:protector",
output = "areasprotector:protector_small 2",
type = "shapeless",
recipe = {"default:steelblock","basic_materials:padlock"},
})
minetest.register_craft({
output = "areasprotector:protector_large",
type = "shapeless",
recipe = {
"areasprotector:protector_small",
"areasprotector:protector_small",
"areasprotector:protector_small",
"areasprotector:protector_small",
"areasprotector:protector_small",
"areasprotector:protector_small",
"areasprotector:protector_small",
"areasprotector:protector_small"
}
})
minetest.register_alias("areasprotector:protector", "areasprotector:protector_large")
minetest.register_alias("areasprotector:display_node", "areasprotector:display_node_large")

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 B

View File

@ -7,6 +7,7 @@ https://forum.minetest.net/viewtopic.php?id=8890
Changelog:
- 0.8 - Cooking clay block in furnace gives natural baked clay which you can dye
- 0.7 - Added support for stairsplus so that stairs are registered properly
- 0.6 - Added 3 new flowers and a new grass that are used for missing dyes
- 0.5 - Now using minecraft recipe to colour baked clay (8x baked clay, 1x dye in centre)
@ -15,4 +16,4 @@ Changelog:
- 0.2 - Any colour of baked clay can be re-dyed into another colour
- 0.1 - Initial Release
Lucky Blocks: 8
Lucky Blocks: 9

View File

@ -2,6 +2,7 @@
-- Baked Clay by TenPlus1
local clay = {
{"natural", "Natural"},
{"white", "White"},
{"grey", "Grey"},
{"black", "Black"},
@ -35,15 +36,16 @@ for _, clay in pairs(clay) do
})
-- craft from dye and any baked clay
minetest.register_craft({
output = "bakedclay:" .. clay[1] .. " 8",
recipe = {
{"group:bakedclay", "group:bakedclay", "group:bakedclay"},
{"group:bakedclay", "dye:" .. clay[1], "group:bakedclay"},
{"group:bakedclay", "group:bakedclay", "group:bakedclay"}
},
})
if clay[1] ~= "natural" then
minetest.register_craft({
output = "bakedclay:" .. clay[1] .. " 8",
recipe = {
{"group:bakedclay", "group:bakedclay", "group:bakedclay"},
{"group:bakedclay", "dye:" .. clay[1], "group:bakedclay"},
{"group:bakedclay", "group:bakedclay", "group:bakedclay"}
},
})
end
-- register stairsplus stairs if found
if stairsplus_mod then
@ -84,7 +86,7 @@ end
minetest.register_craft({
type = "cooking",
output = "bakedclay:white",
output = "bakedclay:natural",
recipe = "default:clay",
})
@ -253,17 +255,35 @@ lucky_block:add_blocks({
{"dro", {"bakedclay:"}, 10, true},
{"fal", {p.."black", p.."blue", p.."brown", p.."cyan", p.."dark_green",
p.."dark_grey", p.."green", p.."grey", p.."magenta", p.."orange",
p.."pink", p.."red", p.."violet", p.."white", p.."yellow"}, 0},
p.."pink", p.."red", p.."violet", p.."white", p.."yellow", p.."natural"}, 0},
{"fal", {p.."black", p.."blue", p.."brown", p.."cyan", p.."dark_green",
p.."dark_grey", p.."green", p.."grey", p.."magenta", p.."orange",
p.."pink", p.."red", p.."violet", p.."white", p.."yellow"}, 0, true},
p.."pink", p.."red", p.."violet", p.."white", p.."yellow", p.."natural"}, 0, true},
{"dro", {p.."delphinium"}, 5},
{"dro", {p.."lazarus"}, 5},
{"dro", {p.."mannagrass"}, 5},
{"dro", {p.."thistle"}, 6},
{"flo", 5, {p.."black", p.."blue", p.."brown", p.."cyan", p.."dark_green",
p.."dark_grey", p.."green", p.."grey", p.."magenta", p.."orange",
p.."pink", p.."red", p.."violet", p.."white", p.."yellow"}, 2},
{"flo", 5, {p.."natural", p.."black", p.."blue", p.."brown", p.."cyan",
p.."dark_green", p.."dark_grey", p.."green", p.."grey", p.."magenta",
p.."orange", p.."pink", p.."red", p.."violet", p.."white", p.."yellow"}, 2},
{"nod", "default:chest", 0, {
{name = p.."natural", max = 30},
{name = p.."black", max = 30},
{name = p.."blue", max = 30},
{name = p.."brown", max = 30},
{name = p.."cyan", max = 30},
{name = p.."dark_green", max = 30},
{name = p.."dark_grey", max = 30},
{name = p.."green", max = 30},
{name = p.."grey", max = 30},
{name = p.."magenta", max = 30},
{name = p.."orange", max = 30},
{name = p.."pink", max = 30},
{name = p.."red", max = 30},
{name = p.."violet", max = 30},
{name = p.."white", max = 30},
{name = p.."yellow", max = 30},
}},
})
end

Binary file not shown.

After

Width:  |  Height:  |  Size: 296 B

600
basic_signs/LICENSE Normal file
View File

@ -0,0 +1,600 @@
License for code: LGPL 3.0
License for media and all other assets: CC-by-SA 4.0
###############################################################################
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.
###############################################################################
Attribution-ShareAlike 4.0 International
=======================================================================
Creative Commons Corporation ("Creative Commons") is not a law firm and
does not provide legal services or legal advice. Distribution of
Creative Commons public licenses does not create a lawyer-client or
other relationship. Creative Commons makes its licenses and related
information available on an "as-is" basis. Creative Commons gives no
warranties regarding its licenses, any material licensed under their
terms and conditions, or any related information. Creative Commons
disclaims all liability for damages resulting from their use to the
fullest extent possible.
Using Creative Commons Public Licenses
Creative Commons public licenses provide a standard set of terms and
conditions that creators and other rights holders may use to share
original works of authorship and other material subject to copyright
and certain other rights specified in the public license below. The
following considerations are for informational purposes only, are not
exhaustive, and do not form part of our licenses.
Considerations for licensors: Our public licenses are
intended for use by those authorized to give the public
permission to use material in ways otherwise restricted by
copyright and certain other rights. Our licenses are
irrevocable. Licensors should read and understand the terms
and conditions of the license they choose before applying it.
Licensors should also secure all rights necessary before
applying our licenses so that the public can reuse the
material as expected. Licensors should clearly mark any
material not subject to the license. This includes other CC-
licensed material, or material used under an exception or
limitation to copyright. More considerations for licensors:
wiki.creativecommons.org/Considerations_for_licensors
Considerations for the public: By using one of our public
licenses, a licensor grants the public permission to use the
licensed material under specified terms and conditions. If
the licensor's permission is not necessary for any reason--for
example, because of any applicable exception or limitation to
copyright--then that use is not regulated by the license. Our
licenses grant only permissions under copyright and certain
other rights that a licensor has authority to grant. Use of
the licensed material may still be restricted for other
reasons, including because others have copyright or other
rights in the material. A licensor may make special requests,
such as asking that all changes be marked or described.
Although not required by our licenses, you are encouraged to
respect those requests where reasonable. More considerations
for the public:
wiki.creativecommons.org/Considerations_for_licensees
=======================================================================
Creative Commons Attribution-ShareAlike 4.0 International Public
License
By exercising the Licensed Rights (defined below), You accept and agree
to be bound by the terms and conditions of this Creative Commons
Attribution-ShareAlike 4.0 International Public License ("Public
License"). To the extent this Public License may be interpreted as a
contract, You are granted the Licensed Rights in consideration of Your
acceptance of these terms and conditions, and the Licensor grants You
such rights in consideration of benefits the Licensor receives from
making the Licensed Material available under these terms and
conditions.
Section 1 -- Definitions.
a. Adapted Material means material subject to Copyright and Similar
Rights that is derived from or based upon the Licensed Material
and in which the Licensed Material is translated, altered,
arranged, transformed, or otherwise modified in a manner requiring
permission under the Copyright and Similar Rights held by the
Licensor. For purposes of this Public License, where the Licensed
Material is a musical work, performance, or sound recording,
Adapted Material is always produced where the Licensed Material is
synched in timed relation with a moving image.
b. Adapter's License means the license You apply to Your Copyright
and Similar Rights in Your contributions to Adapted Material in
accordance with the terms and conditions of this Public License.
c. BY-SA Compatible License means a license listed at
creativecommons.org/compatiblelicenses, approved by Creative
Commons as essentially the equivalent of this Public License.
d. Copyright and Similar Rights means copyright and/or similar rights
closely related to copyright including, without limitation,
performance, broadcast, sound recording, and Sui Generis Database
Rights, without regard to how the rights are labeled or
categorized. For purposes of this Public License, the rights
specified in Section 2(b)(1)-(2) are not Copyright and Similar
Rights.
e. Effective Technological Measures means those measures that, in the
absence of proper authority, may not be circumvented under laws
fulfilling obligations under Article 11 of the WIPO Copyright
Treaty adopted on December 20, 1996, and/or similar international
agreements.
f. Exceptions and Limitations means fair use, fair dealing, and/or
any other exception or limitation to Copyright and Similar Rights
that applies to Your use of the Licensed Material.
g. License Elements means the license attributes listed in the name
of a Creative Commons Public License. The License Elements of this
Public License are Attribution and ShareAlike.
h. Licensed Material means the artistic or literary work, database,
or other material to which the Licensor applied this Public
License.
i. Licensed Rights means the rights granted to You subject to the
terms and conditions of this Public License, which are limited to
all Copyright and Similar Rights that apply to Your use of the
Licensed Material and that the Licensor has authority to license.
j. Licensor means the individual(s) or entity(ies) granting rights
under this Public License.
k. Share means to provide material to the public by any means or
process that requires permission under the Licensed Rights, such
as reproduction, public display, public performance, distribution,
dissemination, communication, or importation, and to make material
available to the public including in ways that members of the
public may access the material from a place and at a time
individually chosen by them.
l. Sui Generis Database Rights means rights other than copyright
resulting from Directive 96/9/EC of the European Parliament and of
the Council of 11 March 1996 on the legal protection of databases,
as amended and/or succeeded, as well as other essentially
equivalent rights anywhere in the world.
m. You means the individual or entity exercising the Licensed Rights
under this Public License. Your has a corresponding meaning.
Section 2 -- Scope.
a. License grant.
1. Subject to the terms and conditions of this Public License,
the Licensor hereby grants You a worldwide, royalty-free,
non-sublicensable, non-exclusive, irrevocable license to
exercise the Licensed Rights in the Licensed Material to:
a. reproduce and Share the Licensed Material, in whole or
in part; and
b. produce, reproduce, and Share Adapted Material.
2. Exceptions and Limitations. For the avoidance of doubt, where
Exceptions and Limitations apply to Your use, this Public
License does not apply, and You do not need to comply with
its terms and conditions.
3. Term. The term of this Public License is specified in Section
6(a).
4. Media and formats; technical modifications allowed. The
Licensor authorizes You to exercise the Licensed Rights in
all media and formats whether now known or hereafter created,
and to make technical modifications necessary to do so. The
Licensor waives and/or agrees not to assert any right or
authority to forbid You from making technical modifications
necessary to exercise the Licensed Rights, including
technical modifications necessary to circumvent Effective
Technological Measures. For purposes of this Public License,
simply making modifications authorized by this Section 2(a)
(4) never produces Adapted Material.
5. Downstream recipients.
a. Offer from the Licensor -- Licensed Material. Every
recipient of the Licensed Material automatically
receives an offer from the Licensor to exercise the
Licensed Rights under the terms and conditions of this
Public License.
b. Additional offer from the Licensor -- Adapted Material.
Every recipient of Adapted Material from You
automatically receives an offer from the Licensor to
exercise the Licensed Rights in the Adapted Material
under the conditions of the Adapter's License You apply.
c. No downstream restrictions. You may not offer or impose
any additional or different terms or conditions on, or
apply any Effective Technological Measures to, the
Licensed Material if doing so restricts exercise of the
Licensed Rights by any recipient of the Licensed
Material.
6. No endorsement. Nothing in this Public License constitutes or
may be construed as permission to assert or imply that You
are, or that Your use of the Licensed Material is, connected
with, or sponsored, endorsed, or granted official status by,
the Licensor or others designated to receive attribution as
provided in Section 3(a)(1)(A)(i).
b. Other rights.
1. Moral rights, such as the right of integrity, are not
licensed under this Public License, nor are publicity,
privacy, and/or other similar personality rights; however, to
the extent possible, the Licensor waives and/or agrees not to
assert any such rights held by the Licensor to the limited
extent necessary to allow You to exercise the Licensed
Rights, but not otherwise.
2. Patent and trademark rights are not licensed under this
Public License.
3. To the extent possible, the Licensor waives any right to
collect royalties from You for the exercise of the Licensed
Rights, whether directly or through a collecting society
under any voluntary or waivable statutory or compulsory
licensing scheme. In all other cases the Licensor expressly
reserves any right to collect such royalties.
Section 3 -- License Conditions.
Your exercise of the Licensed Rights is expressly made subject to the
following conditions.
a. Attribution.
1. If You Share the Licensed Material (including in modified
form), You must:
a. retain the following if it is supplied by the Licensor
with the Licensed Material:
i. identification of the creator(s) of the Licensed
Material and any others designated to receive
attribution, in any reasonable manner requested by
the Licensor (including by pseudonym if
designated);
ii. a copyright notice;
iii. a notice that refers to this Public License;
iv. a notice that refers to the disclaimer of
warranties;
v. a URI or hyperlink to the Licensed Material to the
extent reasonably practicable;
b. indicate if You modified the Licensed Material and
retain an indication of any previous modifications; and
c. indicate the Licensed Material is licensed under this
Public License, and include the text of, or the URI or
hyperlink to, this Public License.
2. You may satisfy the conditions in Section 3(a)(1) in any
reasonable manner based on the medium, means, and context in
which You Share the Licensed Material. For example, it may be
reasonable to satisfy the conditions by providing a URI or
hyperlink to a resource that includes the required
information.
3. If requested by the Licensor, You must remove any of the
information required by Section 3(a)(1)(A) to the extent
reasonably practicable.
b. ShareAlike.
In addition to the conditions in Section 3(a), if You Share
Adapted Material You produce, the following conditions also apply.
1. The Adapter's License You apply must be a Creative Commons
license with the same License Elements, this version or
later, or a BY-SA Compatible License.
2. You must include the text of, or the URI or hyperlink to, the
Adapter's License You apply. You may satisfy this condition
in any reasonable manner based on the medium, means, and
context in which You Share Adapted Material.
3. You may not offer or impose any additional or different terms
or conditions on, or apply any Effective Technological
Measures to, Adapted Material that restrict exercise of the
rights granted under the Adapter's License You apply.
Section 4 -- Sui Generis Database Rights.
Where the Licensed Rights include Sui Generis Database Rights that
apply to Your use of the Licensed Material:
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
to extract, reuse, reproduce, and Share all or a substantial
portion of the contents of the database;
b. if You include all or a substantial portion of the database
contents in a database in which You have Sui Generis Database
Rights, then the database in which You have Sui Generis Database
Rights (but not its individual contents) is Adapted Material,
including for purposes of Section 3(b); and
c. You must comply with the conditions in Section 3(a) if You Share
all or a substantial portion of the contents of the database.
For the avoidance of doubt, this Section 4 supplements and does not
replace Your obligations under this Public License where the Licensed
Rights include other Copyright and Similar Rights.
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
c. The disclaimer of warranties and limitation of liability provided
above shall be interpreted in a manner that, to the extent
possible, most closely approximates an absolute disclaimer and
waiver of all liability.
Section 6 -- Term and Termination.
a. This Public License applies for the term of the Copyright and
Similar Rights licensed here. However, if You fail to comply with
this Public License, then Your rights under this Public License
terminate automatically.
b. Where Your right to use the Licensed Material has terminated under
Section 6(a), it reinstates:
1. automatically as of the date the violation is cured, provided
it is cured within 30 days of Your discovery of the
violation; or
2. upon express reinstatement by the Licensor.
For the avoidance of doubt, this Section 6(b) does not affect any
right the Licensor may have to seek remedies for Your violations
of this Public License.
c. For the avoidance of doubt, the Licensor may also offer the
Licensed Material under separate terms or conditions or stop
distributing the Licensed Material at any time; however, doing so
will not terminate this Public License.
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
License.
Section 7 -- Other Terms and Conditions.
a. The Licensor shall not be bound by any additional or different
terms or conditions communicated by You unless expressly agreed.
b. Any arrangements, understandings, or agreements regarding the
Licensed Material not stated herein are separate from and
independent of the terms and conditions of this Public License.
Section 8 -- Interpretation.
a. For the avoidance of doubt, this Public License does not, and
shall not be interpreted to, reduce, limit, restrict, or impose
conditions on any use of the Licensed Material that could lawfully
be made without permission under this Public License.
b. To the extent possible, if any provision of this Public License is
deemed unenforceable, it shall be automatically reformed to the
minimum extent necessary to make it enforceable. If the provision
cannot be reformed, it shall be severed from this Public License
without affecting the enforceability of the remaining terms and
conditions.
c. No term or condition of this Public License will be waived and no
failure to comply consented to unless expressly agreed to by the
Licensor.
d. Nothing in this Public License constitutes or may be interpreted
as a limitation upon, or waiver of, any privileges and immunities
that apply to the Licensor or You, including from the legal
processes of any jurisdiction or authority.
=======================================================================
Creative Commons is not a party to its public
licenses. Notwithstanding, Creative Commons may elect to apply one of
its public licenses to material it publishes and in those instances
will be considered the “Licensor.” The text of the Creative Commons
public licenses is dedicated to the public domain under the CC0 Public
Domain Dedication. Except for the limited purpose of indicating that
material is shared under a Creative Commons public license or as
otherwise permitted by the Creative Commons policies published at
creativecommons.org/policies, Creative Commons does not authorize the
use of the trademark "Creative Commons" or any other trademark or logo
of Creative Commons without its prior written consent including,
without limitation, in connection with any unauthorized modifications
to any of its public licenses or any other arrangements,
understandings, or agreements concerning use of licensed material. For
the avoidance of doubt, this paragraph does not form part of the
public licenses.
Creative Commons may be contacted at creativecommons.org.

7
basic_signs/README Normal file
View File

@ -0,0 +1,7 @@
This project provides colored metal wall signs, and an extension to the
default wooden signs, to place either a wall sign, a yard sign, or a
hanging-from-ceiling sign, depending on where the user points.
Most items herein were originally part of signs_lib.
Requires signs_lib commit 4ff54c9a (2019-09-11) or later.

138
basic_signs/crafting.lua Normal file
View File

@ -0,0 +1,138 @@
minetest.register_craft({
output = "basic_signs:sign_wall_locked",
type = "shapeless",
recipe = {
"default:sign_wall_wood",
"basic_materials:padlock",
},
})
-- craft recipes for the metal signs
minetest.register_craft( {
output = "basic_signs:sign_wall_green",
recipe = {
{ "dye:dark_green", "dye:white", "dye:dark_green" },
{ "", "default:sign_wall_steel", "" }
},
})
minetest.register_craft( {
output = "basic_signs:sign_wall_green 2",
recipe = {
{ "dye:dark_green", "dye:white", "dye:dark_green" },
{ "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" }
},
})
minetest.register_craft( {
output = "basic_signs:sign_wall_yellow",
recipe = {
{ "dye:yellow", "dye:black", "dye:yellow" },
{ "", "default:sign_wall_steel", "" }
},
})
minetest.register_craft( {
output = "basic_signs:sign_wall_yellow 2",
recipe = {
{ "dye:yellow", "dye:black", "dye:yellow" },
{ "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" }
},
})
minetest.register_craft( {
output = "basic_signs:sign_wall_red",
recipe = {
{ "dye:red", "dye:white", "dye:red" },
{ "", "default:sign_wall_steel", "" }
},
})
minetest.register_craft( {
output = "basic_signs:sign_wall_red 2",
recipe = {
{ "dye:red", "dye:white", "dye:red" },
{ "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" }
},
})
minetest.register_craft( {
output = "basic_signs:sign_wall_white_red",
recipe = {
{ "dye:white", "dye:red", "dye:white" },
{ "", "default:sign_wall_steel", "" }
},
})
minetest.register_craft( {
output = "basic_signs:sign_wall_white_red 2",
recipe = {
{ "dye:white", "dye:red", "dye:white" },
{ "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" }
},
})
minetest.register_craft( {
output = "basic_signs:sign_wall_white_black",
recipe = {
{ "dye:white", "dye:black", "dye:white" },
{ "", "default:sign_wall_steel", "" }
},
})
minetest.register_craft( {
output = "basic_signs:sign_wall_white_black 2",
recipe = {
{ "dye:white", "dye:black", "dye:white" },
{ "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" }
},
})
minetest.register_craft( {
output = "basic_signs:sign_wall_orange",
recipe = {
{ "dye:orange", "dye:black", "dye:orange" },
{ "", "default:sign_wall_steel", "" }
},
})
minetest.register_craft( {
output = "basic_signs:sign_wall_orange 2",
recipe = {
{ "dye:orange", "dye:black", "dye:orange" },
{ "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" }
},
})
minetest.register_craft( {
output = "basic_signs:sign_wall_blue",
recipe = {
{ "dye:blue", "dye:white", "dye:blue" },
{ "", "default:sign_wall_steel", "" }
},
})
minetest.register_craft( {
output = "basic_signs:sign_wall_blue 2",
recipe = {
{ "dye:blue", "dye:white", "dye:blue" },
{ "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" }
},
})
minetest.register_craft( {
output = "basic_signs:sign_wall_brown",
recipe = {
{ "dye:brown", "dye:white", "dye:brown" },
{ "", "default:sign_wall_steel", "" }
},
})
minetest.register_craft( {
output = "basic_signs:sign_wall_brown 2",
recipe = {
{ "dye:brown", "dye:white", "dye:brown" },
{ "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" }
},
})

3
basic_signs/depends.txt Normal file
View File

@ -0,0 +1,3 @@
default
signs_lib
basic_materials

273
basic_signs/init.lua Normal file
View File

@ -0,0 +1,273 @@
-- Basic wall/yard/metal signs
-- these were originally part of signs_lib
basic_signs = {}
basic_signs.path = minetest.get_modpath(minetest.get_current_modname())
dofile(basic_signs.path .. "/crafting.lua")
local S, NS = dofile(basic_signs.path .. "/intllib.lua")
basic_signs.gettext = S
local cbox
-- array : color, translated color, default text color
local sign_colors = {
{"green", S("green"), "f"},
{"yellow", S("yellow"), "0"},
{"red", S("red"), "f"},
{"white_red", S("white_red"), "4"},
{"white_black", S("white_black"), "0"},
{"orange", S("orange"), "0"},
{"blue", S("blue"), "f"},
{"brown", S("brown"), "f"},
}
function basic_signs.determine_sign_type(pos, placer, itemstack, pointed_thing)
local playername = placer:get_player_name()
local pt_name = minetest.get_node(pointed_thing.under).name
local node = minetest.get_node(pos) -- since we're in after-place, this will be the wall sign itself
if minetest.is_protected(pointed_thing.under, playername) then
minetest.record_protection_violation(pointed_thing.under, playername)
return itemstack
end
if minetest.registered_nodes[pt_name] and
minetest.registered_nodes[pt_name].on_rightclick and
not placer:get_player_control().sneak then
return minetest.registered_nodes[pt_name].on_rightclick(pos, node, placer, itemstack, pointed_thing)
elseif signs_lib.check_for_pole(pos, pointed_thing) then
minetest.swap_node(pos, {name = "default:sign_wall_wood_onpole", param2 = node.param2})
else
local lookdir = placer:get_look_dir()
print(dump(lookdir))
local newparam2 = minetest.dir_to_facedir(lookdir)
if node.param2 == 0 then
minetest.swap_node(pos, {name = "basic_signs:hanging_sign", param2 = newparam2})
elseif node.param2 == 1 then
minetest.swap_node(pos, {name = "basic_signs:yard_sign", param2 = newparam2})
end
signs_lib.update_sign(pos)
end
if not creative.is_enabled_for(playername) then
itemstack:take_item()
end
return itemstack
end
for _, onpole in ipairs({"", "_onpole"}) do
local nci = nil
local on_rotate = signs_lib.wallmounted_rotate
local pole_mount_tex = nil
if onpole == "_onpole" then
nci = 1
on_rotate = nil
pole_mount_tex = "signs_lib_pole_mount.png" -- the metal straps on back, if needed
end
local wood_groups = table.copy(signs_lib.standard_wood_groups)
wood_groups.not_in_creative_inventory = nci
local steel_groups = table.copy(signs_lib.standard_steel_groups)
steel_groups.not_in_creative_inventory = nci
cbox = signs_lib.make_selection_boxes(35, 25, onpole)
minetest.override_item("default:sign_wall_wood"..onpole, {
after_place_node = basic_signs.determine_sign_type
})
minetest.register_node("basic_signs:sign_wall_locked"..onpole, {
description = S("Locked Sign"),
paramtype = "light",
sunlight_propagates = true,
paramtype2 = "wallmounted",
drawtype = "mesh",
node_box = cbox,
selection_box = cbox,
mesh = "signs_lib_standard_wall_sign"..onpole..".obj",
tiles = {
"basic_signs_sign_wall_locked.png",
"signs_lib_sign_wall_steel_edges.png",
pole_mount_tex
},
inventory_image = "basic_signs_sign_wall_locked_inv.png",
wield_image = "basic_signs_sign_wall_locked_inv.png",
groups = wood_groups,
default_color = "0",
on_construct = signs_lib.construct_sign,
on_destruct = signs_lib.destruct_sign,
after_place_node = function(pos, placer, itemstack, pointed_thing)
signs_lib.after_place_node(pos, placer, itemstack, pointed_thing, true)
end,
on_receive_fields = signs_lib.receive_fields,
on_punch = signs_lib.update_sign,
can_dig = signs_lib.can_modify,
on_rotate = on_rotate,
number_of_lines = signs_lib.standard_lines,
horiz_scaling = signs_lib.standard_hscale,
vert_scaling = signs_lib.standard_vscale,
line_spacing = signs_lib.standard_lspace,
font_size = signs_lib.standard_fsize,
x_offset = signs_lib.standard_xoffs,
y_offset = signs_lib.standard_yoffs,
chars_per_line = signs_lib.standard_cpl,
entity_info = {
mesh = "signs_lib_standard_wall_sign_entity"..onpole..".obj",
yaw = signs_lib.wallmounted_yaw
},
drop = "basic_signs:sign_wall_locked"
})
table.insert(signs_lib.lbm_restore_nodes, "basic_signs:sign_wall_locked"..onpole)
table.insert(signs_lib.lbm_restore_nodes, "locked_sign:sign_wall_locked"..onpole)
minetest.register_alias("locked_sign:sign_wall_locked", "basic_signs:sign_wall_locked")
cbox = signs_lib.make_selection_boxes(35, 25, onpole, 0, 0, 0, true)
for i, color in ipairs(sign_colors) do
minetest.register_node("basic_signs:sign_wall_steel_"..color[1]..onpole, {
description = S("Sign (@1, steel)", color[2]),
paramtype = "light",
sunlight_propagates = true,
paramtype2 = "facedir",
drawtype = "mesh",
node_box = cbox,
selection_box = cbox,
mesh = "signs_lib_standard_wall_sign_facedir"..onpole..".obj",
tiles = {
"basic_signs_steel_"..color[1]..".png",
"signs_lib_sign_wall_steel_edges.png",
pole_mount_tex
},
inventory_image = "basic_signs_steel_"..color[1].."_inv.png",
wield_image = "basic_signs_steel_"..color[1].."_inv.png",
groups = steel_groups,
default_color = color[3],
on_construct = signs_lib.construct_sign,
on_destruct = signs_lib.destruct_sign,
after_place_node = signs_lib.after_place_node,
on_receive_fields = signs_lib.receive_fields,
on_punch = signs_lib.update_sign,
on_rotate = on_rotate,
number_of_lines = signs_lib.standard_lines,
horiz_scaling = signs_lib.standard_hscale,
vert_scaling = signs_lib.standard_vscale,
line_spacing = signs_lib.standard_lspace,
font_size = signs_lib.standard_fsize,
x_offset = signs_lib.standard_xoffs,
y_offset = signs_lib.standard_yoffs,
chars_per_line = signs_lib.standard_cpl,
entity_info = {
mesh = "signs_lib_standard_wall_sign_entity"..onpole..".obj",
yaw = signs_lib.standard_yaw
},
drop = "signs:sign_wall_steel_"..color[1]
})
table.insert(signs_lib.lbm_restore_nodes, "basic_signs:sign_wall_steel_"..color[1]..onpole)
table.insert(signs_lib.lbm_restore_nodes, "signs:sign_wall_"..color[1]..onpole)
minetest.register_alias("signs:sign_wall_"..color[1], "basic_signs:sign_wall_steel_"..color[1])
end
end
cbox = signs_lib.make_selection_boxes(35, 34.5, false, 0, -1.25, -19.69, true)
local nci_wood_groups = table.copy(signs_lib.standard_wood_groups)
nci_wood_groups.not_in_creative_inventory = 1
minetest.register_node("basic_signs:yard_sign", {
description = "Wooden yard sign",
paramtype = "light",
sunlight_propagates = true,
paramtype2 = "facedir",
drawtype = "mesh",
node_box = cbox,
selection_box = cbox,
mesh = "basic_signs_yard_sign.obj",
tiles = {
"signs_lib_sign_wall_wooden.png",
"signs_lib_sign_wall_wooden_edges.png",
"default_wood.png"
},
inventory_image = "default_sign_wood.png",
wield_image = "default_sign_wood.png",
groups = nci_wood_groups,
default_color = "0",
on_construct = signs_lib.construct_sign,
on_destruct = signs_lib.destruct_sign,
after_place_node = signs_lib.after_place_node,
on_receive_fields = signs_lib.receive_fields,
on_punch = signs_lib.update_sign,
on_rotate = on_rotate,
number_of_lines = signs_lib.standard_lines,
horiz_scaling = signs_lib.standard_hscale,
vert_scaling = signs_lib.standard_vscale,
line_spacing = signs_lib.standard_lspace,
font_size = signs_lib.standard_fsize,
x_offset = signs_lib.standard_xoffs,
y_offset = signs_lib.standard_yoffs,
chars_per_line = signs_lib.standard_cpl,
entity_info = {
mesh = "basic_signs_yard_sign_entity.obj",
yaw = signs_lib.standard_yaw
},
drop = "default:sign_wall_wood"
})
table.insert(signs_lib.lbm_restore_nodes, "basic_signs:yard_sign")
table.insert(signs_lib.lbm_restore_nodes, "signs:sign_yard")
minetest.register_alias("signs:sign_yard", "basic_signs:yard_sign")
cbox = signs_lib.make_selection_boxes(35, 32, false, 0, 3, -18.5, true)
minetest.register_node("basic_signs:hanging_sign", {
description = "Wooden sign, hanging",
paramtype = "light",
sunlight_propagates = true,
paramtype2 = "facedir",
drawtype = "mesh",
node_box = cbox,
selection_box = cbox,
mesh = "basic_signs_hanging_sign.obj",
tiles = {
"signs_lib_sign_wall_wooden.png",
"signs_lib_sign_wall_wooden_edges.png",
"basic_signs_ceiling_hangers.png"
},
inventory_image = "default_sign_wood.png",
wield_image = "default_sign_wood.png",
groups = nci_wood_groups,
default_color = "0",
on_construct = signs_lib.construct_sign,
on_destruct = signs_lib.destruct_sign,
after_place_node = signs_lib.after_place_node,
on_receive_fields = signs_lib.receive_fields,
on_punch = signs_lib.update_sign,
on_rotate = on_rotate,
number_of_lines = signs_lib.standard_lines,
horiz_scaling = signs_lib.standard_hscale,
vert_scaling = signs_lib.standard_vscale,
line_spacing = signs_lib.standard_lspace,
font_size = signs_lib.standard_fsize,
x_offset = signs_lib.standard_xoffs,
y_offset = signs_lib.standard_yoffs,
chars_per_line = signs_lib.standard_cpl,
entity_info = {
mesh = "basic_signs_hanging_sign_entity.obj",
yaw = signs_lib.standard_yaw
},
drop = "default:sign_wall_wood"
})
table.insert(signs_lib.lbm_restore_nodes, "basic_signs:hanging_sign")
table.insert(signs_lib.lbm_restore_nodes, "signs:sign_hanging")
minetest.register_alias("signs:sign_hanging", "basic_signs:hanging_sign")
-- insert the old wood sign-on-fencepost into signs_lib's conversion LBM
table.insert(signs_lib.old_fenceposts_with_signs, "signs:sign_post")
signs_lib.old_fenceposts["signs:sign_post"] = "default:fence_wood"
signs_lib.old_fenceposts_replacement_signs["signs:sign_post"] = "default:sign_wall_wood_onpole"

45
basic_signs/intllib.lua Normal file
View File

@ -0,0 +1,45 @@
-- Fallback functions for when `intllib` is not installed.
-- Code released under Unlicense <http://unlicense.org>.
-- Get the latest version of this file at:
-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua
local function format(str, ...)
local args = { ... }
local function repl(escape, open, num, close)
if escape == "" then
local replacement = tostring(args[tonumber(num)])
if open == "" then
replacement = replacement..close
end
return replacement
else
return "@"..open..num..close
end
end
return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl))
end
local gettext, ngettext
if minetest.get_modpath("intllib") then
if intllib.make_gettext_pair then
-- New method using gettext.
gettext, ngettext = intllib.make_gettext_pair()
else
-- Old method using text files.
gettext = intllib.Getter()
end
end
-- Fill in missing functions.
gettext = gettext or function(msgid, ...)
return format(msgid, ...)
end
ngettext = ngettext or function(msgid, msgid_plural, n, ...)
return format(n==1 and msgid or msgid_plural, ...)
end
return gettext, ngettext

97
basic_signs/locale/de.po Normal file
View File

@ -0,0 +1,97 @@
# German Translation for the signs_lib mod.
# Copyright (C) 2018 Vanessa Ezekowitz
# This file is distributed under the same license as the signs_lib package.
# Xanthin, 2017.
# CodeXP <codexp@gmx.net>, 2018.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-07-31 18:31+0200\n"
"PO-Revision-Date: 2018-03-24 22:00+0100\n"
"Last-Translator: CodeXP <codexp@gmx.net>\n"
"Language-Team: \n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.8.12\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: init.lua
msgid "Write"
msgstr "schreiben"
#: init.lua
msgid "Locked sign, owned by @1\n"
msgstr "gesperrter Schild, gehört @1\n"
#: init.lua
msgid "locked "
msgstr "gesperrt "
#: init.lua
#, fuzzy
msgid "@1 wrote \"@2\" to @3sign at @4"
msgstr "@1 schrieb \"@2\" auf das @3Schild bei @4"
#: init.lua
msgid "Sign"
msgstr "Schild"
#: init.lua
msgid "Can edit all locked signs"
msgstr "Kann alle gesperrte Schilder bearbeiten"
#: init.lua
msgid "Locked Sign"
msgstr "gesperrter Schild"
#: init.lua
msgid "green"
msgstr "grün"
#: init.lua
msgid "yellow"
msgstr "gelb"
#: init.lua
msgid "red"
msgstr "rot"
#: init.lua
msgid "white_red"
msgstr "weißrot"
#: init.lua
msgid "white_black"
msgstr "schwarzweiß"
#: init.lua
msgid "orange"
msgstr "orange"
#: init.lua
msgid "blue"
msgstr "blau"
#: init.lua
msgid "brown"
msgstr "braun"
#: init.lua
msgid "Sign (@1, metal)"
msgstr "Schild (@1, Metall)"
#: init.lua
msgid "Attempt to register unknown node as fence"
msgstr "Versuch ein unbekanntes Element als Zaun zu registrieren"
#: init.lua
msgid "Registered @1 and @2"
msgstr "Registrierte @1 und @2"
#: init.lua
msgid "[MOD] signs loaded"
msgstr "[MOD] Schilder-Mod geladen"

95
basic_signs/locale/es.po Normal file
View File

@ -0,0 +1,95 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-07-31 18:22+0200\n"
"PO-Revision-Date: 2017-07-31 18:30+0200\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.8.12\n"
"Last-Translator: Carlos Barraza\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Language: es\n"
#: init.lua
msgid "Locked sign, owned by @1\n"
msgstr ""
#: init.lua
msgid "locked "
msgstr "bloqueada "
#: init.lua
msgid "@1 wrote \"@2\" to @3sign at @4"
msgstr "@1 escribio \"@2\" en el cartel @3en @4"
#: init.lua
msgid "Sign"
msgstr "Letrero"
#: init.lua
msgid "Can edit all locked signs"
msgstr ""
#: init.lua
#, fuzzy
msgid "Locked Sign"
msgstr "Letrero bloqueada"
#: init.lua
msgid "green"
msgstr "verde"
#: init.lua
msgid "yellow"
msgstr "amarillo"
#: init.lua
msgid "red"
msgstr "rojo"
#: init.lua
#, fuzzy
msgid "white_red"
msgstr "rojo y blanco"
#: init.lua
#, fuzzy
msgid "white_black"
msgstr "negro y blanco"
#: init.lua
msgid "orange"
msgstr "naranja"
#: init.lua
msgid "blue"
msgstr "azul"
#: init.lua
msgid "brown"
msgstr "marrón"
#: init.lua
#, fuzzy
msgid "Sign (@1, metal)"
msgstr "Letrero (@1, metal)"
#: init.lua
msgid "Attempt to register unknown node as fence"
msgstr ""
#: init.lua
msgid "Registered @1 and @2"
msgstr "Registrado @1 y @2"
#: init.lua
msgid "[MOD] signs loaded"
msgstr "[MOD] signs cargados"

91
basic_signs/locale/fr.po Normal file
View File

@ -0,0 +1,91 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-07-31 18:13+0200\n"
"PO-Revision-Date: 2017-07-31 18:22+0200\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.8.12\n"
"Last-Translator: fat115 <fat115@framasoft.org>\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"Language: fr\n"
#: init.lua
msgid "Locked sign, owned by @1\n"
msgstr "Panneau verrouillé, appartient à @1\n"
#: init.lua
msgid "locked "
msgstr "verrouillé "
#: init.lua
msgid "@1 wrote \"@2\" to @3sign at @4"
msgstr "@1 a écrit \"@2\" sur le panneau @3en @4"
#: init.lua
msgid "Sign"
msgstr "Panneau"
#: init.lua
msgid "Can edit all locked signs"
msgstr "Peut modifier les panneaux verrouillés"
#: init.lua
msgid "Locked Sign"
msgstr "Panneau (verrouillé)"
#: init.lua
msgid "green"
msgstr "vert"
#: init.lua
msgid "yellow"
msgstr "jaune"
#: init.lua
msgid "red"
msgstr "rouge"
#: init.lua
msgid "white_red"
msgstr "rouge et blanc"
#: init.lua
msgid "white_black"
msgstr "noir et blanc"
#: init.lua
msgid "orange"
msgstr "orange"
#: init.lua
msgid "blue"
msgstr "bleu"
#: init.lua
msgid "brown"
msgstr "marron"
#: init.lua
msgid "Sign (@1, metal)"
msgstr "Panneau (@1, métal)"
#: init.lua
msgid "Attempt to register unknown node as fence"
msgstr "Tentative d'enregistrer un nœud inconnu comme barrière"
#: init.lua
msgid "Registered @1 and @2"
msgstr "Enregistrement de @1 et @"
#: init.lua
msgid "[MOD] signs loaded"
msgstr "[MOD] signs chargé"

91
basic_signs/locale/ms.po Normal file
View File

@ -0,0 +1,91 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-07-31 18:00+0200\n"
"PO-Revision-Date: 2017-11-17 02:38+0800\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.0.4\n"
"Last-Translator: \n"
"Plural-Forms: nplurals=1; plural=0;\n"
"Language: ms\n"
#: init.lua
msgid "Locked sign, owned by @1\n"
msgstr "Papan tanda berkunci, milik @1\n"
#: init.lua
msgid "locked "
msgstr "berkunci "
#: init.lua
msgid "@1 wrote \"@2\" to @3sign at @4"
msgstr "@1 menulis \"@2\" atas papan tanda @3dekat @4"
#: init.lua
msgid "Sign"
msgstr "Papan Tanda"
#: init.lua
msgid "Can edit all locked signs"
msgstr "Boleh sunting semua papan tanda berkunci"
#: init.lua
msgid "Locked Sign"
msgstr "Papan Tanda Berkunci"
#: init.lua
msgid "green"
msgstr "hijau"
#: init.lua
msgid "yellow"
msgstr "kuning"
#: init.lua
msgid "red"
msgstr "merah"
#: init.lua
msgid "white_red"
msgstr "putih_merah"
#: init.lua
msgid "white_black"
msgstr "putih_hitam"
#: init.lua
msgid "orange"
msgstr "jingga"
#: init.lua
msgid "blue"
msgstr "biru"
#: init.lua
msgid "brown"
msgstr "perang"
#: init.lua
msgid "Sign (@1, metal)"
msgstr "Papan Tanda (@1, logam)"
#: init.lua
msgid "Attempt to register unknown node as fence"
msgstr "Cuba untuk mendaftar nod tidak diketahui sebagai pagar"
#: init.lua
msgid "Registered @1 and @2"
msgstr "Telah daftar @1 dan @2"
#: init.lua
msgid "[MOD] signs loaded"
msgstr "[MODS] signs telah dimuatkan"

94
basic_signs/locale/ru.po Normal file
View File

@ -0,0 +1,94 @@
# Russian Translation for the signs_lib mod.
# Copyright (C) 2018 Vanessa Ezekowitz
# This file is distributed under the same license as the signs_lib package.
# CodeXP <codexp@gmx.net>, 2018.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: signs_lib\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-24 22:23+0100\n"
"PO-Revision-Date: \n"
"Last-Translator: CodeXP <codexp@gmx.net>\n"
"Language-Team: \n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: init.lua
msgid "Write"
msgstr "записать"
#: init.lua
msgid "Locked sign, owned by @1\n"
msgstr "защищенная табличка, пренадлежит @1\n"
#: init.lua
msgid "locked "
msgstr "защищенный "
#: init.lua
msgid "@1 wrote \"@2\" to @3sign at @4"
msgstr "@1 записал \"@2\" в @3sign на @4"
#: init.lua
msgid "Sign"
msgstr "табличка"
#: init.lua
msgid "Can edit all locked signs"
msgstr "Может редактировать все защищенные таблички"
#: init.lua
msgid "Locked Sign"
msgstr "защищенная табличка"
#: init.lua
msgid "green"
msgstr "зеленая"
#: init.lua
msgid "yellow"
msgstr "желтая"
#: init.lua
msgid "red"
msgstr "красная"
#: init.lua
msgid "white_red"
msgstr "краснобелая"
#: init.lua
msgid "white_black"
msgstr "чернобелая"
#: init.lua
msgid "orange"
msgstr "оранжевая"
#: init.lua
msgid "blue"
msgstr "синея"
#: init.lua
msgid "brown"
msgstr "коричневая"
#: init.lua
msgid "Sign (@1, metal)"
msgstr "Табличка (@1, металл)"
#: init.lua
msgid "Attempt to register unknown node as fence"
msgstr "Попытка зарегистрировать неизвестный узел как забор"
#: init.lua
msgid "Registered @1 and @2"
msgstr "Зарегистрировано @1 для @2"
#: init.lua
msgid "[MOD] signs loaded"
msgstr "[MOD] мод табличек загружен"

View File

@ -0,0 +1,94 @@
# LANGUAGE Translation for the signs_lib mod.
# Copyright (C) 2018 Vanessa Ezekowitz
# This file is distributed under the same license as the signs_lib package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: signs_lib\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-24 22:23+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: init.lua
msgid "Write"
msgstr ""
#: init.lua
msgid "Locked sign, owned by @1\n"
msgstr ""
#: init.lua
msgid "locked "
msgstr ""
#: init.lua
msgid "@1 wrote \"@2\" to @3sign at @4"
msgstr ""
#: init.lua
msgid "Sign"
msgstr ""
#: init.lua
msgid "Can edit all locked signs"
msgstr ""
#: init.lua
msgid "Locked Sign"
msgstr ""
#: init.lua
msgid "green"
msgstr ""
#: init.lua
msgid "yellow"
msgstr ""
#: init.lua
msgid "red"
msgstr ""
#: init.lua
msgid "white_red"
msgstr ""
#: init.lua
msgid "white_black"
msgstr ""
#: init.lua
msgid "orange"
msgstr ""
#: init.lua
msgid "blue"
msgstr ""
#: init.lua
msgid "brown"
msgstr ""
#: init.lua
msgid "Sign (@1, metal)"
msgstr ""
#: init.lua
msgid "Attempt to register unknown node as fence"
msgstr ""
#: init.lua
msgid "Registered @1 and @2"
msgstr ""
#: init.lua
msgid "[MOD] signs loaded"
msgstr ""

View File

@ -0,0 +1,62 @@
# Blender v2.79 (sub 0) OBJ File: 'basic_signs wooden hanging sign.blend'
# www.blender.org
o Cube
v 0.437500 -0.312500 0.031250
v 0.437500 -0.312500 -0.031250
v 0.437500 0.312500 0.031250
v 0.437500 0.312500 -0.031250
v -0.437500 -0.312500 0.031250
v -0.437500 -0.312500 -0.031250
v -0.437500 0.312500 0.031250
v -0.437500 0.312500 -0.031250
v 0.437500 -0.312500 0.031250
v 0.437500 -0.312500 -0.031250
v 0.437500 0.312500 0.031250
v 0.437500 0.312500 -0.031250
v -0.437500 -0.312500 0.031250
v -0.437500 -0.312500 -0.031250
v -0.437500 0.312500 0.031250
v -0.437500 0.312500 -0.031250
v 0.500000 0.312500 0.000000
v 0.500000 0.500000 0.000000
v -0.500000 0.312500 0.000000
v -0.500000 0.500000 0.000000
vt 0.468750 0.812500
vt 0.031250 0.812500
vt 0.031250 0.187500
vt 0.468750 0.187500
vt 0.531250 0.812500
vt 0.968750 0.812500
vt 0.968750 0.187500
vt 0.531250 0.187500
vt 0.234375 0.000000
vt 0.234375 1.000000
vt 0.015625 1.000000
vt 0.015625 -0.000000
vt 0.609375 -0.000000
vt 0.609375 1.000000
vt 0.390625 1.000000
vt 0.390625 -0.000000
vt 0.765625 0.000000
vt 0.765625 1.000000
vt 1.000000 0.812500
vt 1.000000 1.000000
vt 0.000000 1.000000
vt -0.000000 0.812500
vn 0.0000 0.0000 -1.0000
vn 0.0000 -0.0000 1.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 1.0000 0.0000 0.0000
vn -1.0000 0.0000 0.0000
g Cube_Cube_front-back
s off
f 8/1/1 4/2/1 2/3/1 6/4/1
f 3/5/2 7/6/2 5/7/2 1/8/2
g Cube_Cube_edges
f 13/9/3 14/10/3 10/11/3 9/12/3
f 11/13/4 12/14/4 16/15/4 15/16/4
f 11/13/5 9/17/5 10/18/5 12/14/5
f 13/9/6 15/16/6 16/15/6 14/10/6
g Cube_Cube_hangers
f 19/19/1 20/20/1 18/21/1 17/22/1

View File

@ -0,0 +1,15 @@
# Blender v2.79 (sub 0) OBJ File: 'basic_signs wooden hanging sign--entity.blend'
# www.blender.org
o Cube
v 0.406250 -0.281250 -0.039063
v 0.406250 0.281250 -0.039062
v -0.406250 -0.281250 -0.039063
v -0.406250 0.281250 -0.039062
vt 0.906250 0.781250
vt 0.093750 0.781250
vt 0.093750 0.218750
vt 0.906250 0.218750
vn 0.0000 0.0000 -1.0000
g Cube_Cube_None
s off
f 4/1/1 2/2/1 1/3/1 3/4/1

View File

@ -0,0 +1,85 @@
# Blender v2.79 (sub 0) OBJ File: 'basic_signs wooden yard sign.blend'
# www.blender.org
o Cube
v 0.437500 -0.250000 -0.000000
v 0.437500 -0.250000 -0.062500
v 0.437500 0.375000 0.000000
v 0.437500 0.375000 -0.062500
v -0.437500 -0.250000 -0.000000
v -0.437500 -0.250000 -0.062500
v -0.437500 0.375000 0.000000
v -0.437500 0.375000 -0.062500
v 0.437500 -0.250000 -0.000000
v 0.437500 -0.250000 -0.062500
v 0.437500 0.375000 0.000000
v 0.437500 0.375000 -0.062500
v -0.437500 -0.250000 -0.000000
v -0.437500 -0.250000 -0.062500
v -0.437500 0.375000 0.000000
v -0.437500 0.375000 -0.062500
v 0.062500 -0.500000 0.000000
v 0.062500 0.250000 0.000000
v 0.062500 -0.500000 0.062500
v 0.062500 0.250000 0.062500
v -0.062500 -0.500000 0.000000
v -0.062500 0.250000 0.000000
v -0.062500 -0.500000 0.062500
v -0.062500 0.250000 0.062500
vt 0.468750 0.812500
vt 0.031250 0.812500
vt 0.031250 0.187500
vt 0.468750 0.187500
vt 0.531250 0.812500
vt 0.968750 0.812500
vt 0.968750 0.187500
vt 0.531250 0.187500
vt 0.234375 0.000000
vt 0.234375 1.000000
vt 0.015625 1.000000
vt 0.015625 -0.000000
vt 0.609375 -0.000000
vt 0.609375 1.000000
vt 0.390625 1.000000
vt 0.390625 -0.000000
vt 0.765625 0.000000
vt 0.765625 1.000000
vt 0.000000 0.750000
vt 2.000000 0.750000
vt 2.000000 0.875000
vt 0.000000 0.875000
vt 0.000000 0.125000
vt 2.000000 0.125000
vt 2.000000 0.375000
vt 0.000000 0.375000
vt 2.000000 0.500000
vt 0.000000 0.500000
vt 0.812500 0.875000
vt 0.562500 0.875000
vt 0.562500 1.000000
vt 0.812500 1.000000
vt 0.125000 0.875000
vt 0.375000 0.875000
vt 0.375000 1.000000
vt 0.125000 1.000000
vn 0.0000 0.0000 -1.0000
vn 0.0000 -0.0000 1.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 1.0000 0.0000 0.0000
vn -1.0000 0.0000 0.0000
g Cube_Cube_front-back
s off
f 8/1/1 4/2/1 2/3/1 6/4/1
f 3/5/2 7/6/2 5/7/2 1/8/2
g Cube_Cube_edges
f 13/9/3 14/10/3 10/11/3 9/12/3
f 11/13/4 12/14/4 16/15/4 15/16/4
f 11/13/5 9/17/5 10/18/5 12/14/5
f 13/9/6 15/16/6 16/15/6 14/10/6
g Cube_Cube_default_wood
f 17/19/5 18/20/5 20/21/5 19/22/5
f 19/23/2 20/24/2 24/25/2 23/26/2
f 23/26/6 24/25/6 22/27/6 21/28/6
f 21/28/1 22/27/1 18/20/1 17/19/1
f 19/29/3 23/30/3 21/31/3 17/32/3
f 24/33/4 20/34/4 18/35/4 22/36/4

View File

@ -0,0 +1,15 @@
# Blender v2.79 (sub 0) OBJ File: 'basic_signs wooden yard sign.blend'
# www.blender.org
o Cube
v 0.406250 -0.218750 -0.070313
v 0.406250 0.343750 -0.070312
v -0.406250 -0.218750 -0.070313
v -0.406250 0.343750 -0.070312
vt 0.906250 0.781250
vt 0.093750 0.781250
vt 0.093750 0.218750
vt 0.906250 0.218750
vn 0.0000 0.0000 -1.0000
g Cube_Cube_None
s off
f 4/1/1 2/2/1 1/3/1 3/4/1

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 927 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 932 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 922 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 915 B

View File

Before

Width:  |  Height:  |  Size: 106 B

After

Width:  |  Height:  |  Size: 106 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 925 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 898 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 935 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 913 B

View File

Before

Width:  |  Height:  |  Size: 102 B

After

Width:  |  Height:  |  Size: 102 B

File diff suppressed because it is too large Load Diff

View File

@ -116,6 +116,7 @@ for _, nodeclass in ipairs(NodeClass) do
groups = {cracky=3, ud_param2_colorable = 1},
sounds = default.node_sound_stone_defaults(),
on_construct = unifieddyes.on_construct,
on_dig = unifieddyes.on_dig
})
minetest.register_node("blox:cobble_"..nodeclass, {
@ -133,6 +134,7 @@ for _, nodeclass in ipairs(NodeClass) do
groups = {cracky=3, ud_param2_colorable = 1},
sounds = default.node_sound_stone_defaults(),
on_construct = unifieddyes.on_construct,
on_dig = unifieddyes.on_dig
})
minetest.register_node("blox:wood_"..nodeclass, {
@ -150,6 +152,7 @@ for _, nodeclass in ipairs(NodeClass) do
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,flammable=3, ud_param2_colorable = 1},
sounds = default.node_sound_wood_defaults(),
on_construct = unifieddyes.on_construct,
on_dig = unifieddyes.on_dig
})
table.insert(blox.old_89_color_nodes, "blox:stone_"..nodeclass)
@ -169,6 +172,7 @@ minetest.register_node("blox:wood_tinted", {
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,flammable=3, ud_param2_colorable = 1},
sounds = default.node_sound_wood_defaults(),
on_construct = unifieddyes.on_construct,
on_dig = unifieddyes.on_dig
})
minetest.register_node("blox:stone_square", {
@ -181,6 +185,7 @@ minetest.register_node("blox:stone_square", {
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,flammable=3, ud_param2_colorable = 1},
sounds = default.node_sound_wood_defaults(),
on_construct = unifieddyes.on_construct,
on_dig = unifieddyes.on_dig
})
minetest.register_node("blox:cobble_tinted", {
@ -193,6 +198,7 @@ minetest.register_node("blox:cobble_tinted", {
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,flammable=3, not_in_creative_inventory = 1, ud_param2_colorable = 1},
sounds = default.node_sound_wood_defaults(),
on_construct = unifieddyes.on_construct,
on_dig = unifieddyes.on_dig
})
minetest.register_node("blox:stone_tinted", {
@ -205,6 +211,7 @@ minetest.register_node("blox:stone_tinted", {
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,flammable=3, not_in_creative_inventory = 1, ud_param2_colorable = 1},
sounds = default.node_sound_wood_defaults(),
on_construct = unifieddyes.on_construct,
on_dig = unifieddyes.on_dig,
drop = {
items = {
{items = {"blox:cobble_tinted"}, inherit_color = true },

View File

@ -52,6 +52,7 @@ minetest.register_node("bobblocks:block", {
},
on_rightclick = bobblocks.update_bobblock,
on_construct = unifieddyes.on_construct,
on_dig = unifieddyes.on_dig,
})
minetest.register_node("bobblocks:block_off", {
@ -71,6 +72,7 @@ minetest.register_node("bobblocks:block_off", {
},
on_rightclick = bobblocks.update_bobblock,
on_construct = unifieddyes.on_construct,
on_dig = unifieddyes.on_dig,
})
-- Block Poles
@ -94,6 +96,7 @@ minetest.register_node("bobblocks:pole", {
},
on_rightclick = bobblocks.update_bobblock,
on_construct = unifieddyes.on_construct,
on_dig = unifieddyes.on_dig,
})
minetest.register_node("bobblocks:pole_off", {
@ -117,6 +120,7 @@ minetest.register_node("bobblocks:pole_off", {
},
on_rightclick = bobblocks.update_bobblock,
on_construct = unifieddyes.on_construct,
on_dig = unifieddyes.on_dig,
})
-- old nodes grandfathered-in because they have a different texture or usage than the colored ones.
@ -151,6 +155,7 @@ minetest.register_node("bobblocks:wavyblock", {
},
on_rightclick = bobblocks.update_bobblock,
on_construct = unifieddyes.on_construct,
on_dig = unifieddyes.on_dig,
})
minetest.register_node("bobblocks:wavyblock_off", {
@ -171,6 +176,7 @@ minetest.register_node("bobblocks:wavyblock_off", {
},
on_rightclick = bobblocks.update_bobblock,
on_construct = unifieddyes.on_construct,
on_dig = unifieddyes.on_dig,
})
minetest.register_node("bobblocks:wavypole", {
@ -186,6 +192,7 @@ minetest.register_node("bobblocks:wavypole", {
sounds = default.node_sound_glass_defaults(),
groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3, ud_param2_colorable = 1},
on_construct = unifieddyes.on_construct,
on_dig = unifieddyes.on_dig,
--light_source = LIGHT_MAX-0,
})

View File

@ -74,6 +74,7 @@ minetest.register_node("castle_tapestries:tapestry", {
wall_side = {-0.5,-0.5,0.4375,0.5,1.5,0.5},
},
after_place_node = unifieddyes.fix_rotation_nsew,
on_dig = unifieddyes.on_dig,
on_rotate = unifieddyes.fix_after_screwdriver_nsew
})
@ -95,6 +96,7 @@ minetest.register_node("castle_tapestries:tapestry_long", {
wall_side = {-0.5,-0.5,0.4375,0.5,2.5,0.5},
},
after_place_node = unifieddyes.fix_rotation_nsew,
on_dig = unifieddyes.on_dig,
on_rotate = unifieddyes.fix_after_screwdriver_nsew
})
@ -116,6 +118,7 @@ minetest.register_node("castle_tapestries:tapestry_very_long", {
wall_side = {-0.5,-0.5,0.4375,0.5,3.5,0.5},
},
after_place_node = unifieddyes.fix_rotation_nsew,
on_dig = unifieddyes.on_dig,
on_rotate = unifieddyes.fix_after_screwdriver_nsew
})

View File

@ -1,3 +1,4 @@
default
unifieddyes
moreblocks?
signs_lib?

View File

@ -88,6 +88,7 @@ for _, color in ipairs(unifieddyes.HUES_WITH_GREY) do
after_place_node = function(pos, placer, itemstack, pointed_thing)
minetest.rotate_node(itemstack, placer, pointed_thing)
end,
on_dig = unifieddyes.on_dig,
groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=2, not_in_creative_inventory=1, ud_param2_colorable = 1},
}
)
@ -167,7 +168,8 @@ default.register_fence("coloredwood:fence", {
palette = "unifieddyes_palette_extended.png",
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, ud_param2_colorable = 1, not_in_creative_inventory=1},
sounds = default.node_sound_wood_defaults(),
material = "coloredwood:wood_block"
material = "coloredwood:wood_block",
on_dig = unifieddyes.on_dig,
})
groups = table.copy(minetest.registered_items["default:fence_wood"].groups)
@ -214,4 +216,8 @@ unifieddyes.register_color_craft({
}
})
if minetest.get_modpath("signs_lib") then
signs_lib.allowed_poles["coloredwood:fence"] = true
end
print("[Colored Wood] Loaded!")

View File

@ -258,33 +258,6 @@ minetest.register_node("computer:tower", {
minetest.register_alias("computer:tower_on", "computer:tower")
-- Printer/scaner combo
minetest.register_node("computer:printer", {
description = S("Printer-Scanner Combo"),
inventory_image = "computer_printer_inv.png",
tiles = {"computer_printer_t.png","computer_printer_bt.png","computer_printer_l.png",
"computer_printer_r.png","computer_printer_b.png","computer_printer_f.png"},
paramtype = "light",
paramtype2 = "facedir",
walkable = true,
groups = {snappy=3},
sound = default.node_sound_wood_defaults(),
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-0.4375, -0.3125, -0.125, 0.4375, -0.0625, 0.375},
{-0.4375, -0.5, -0.125, 0.4375, -0.4375, 0.375},
{-0.4375, -0.5, -0.125, -0.25, -0.0625, 0.375},
{0.25, -0.5, -0.125, 0.4375, -0.0625, 0.375},
{-0.4375, -0.5, -0.0625, 0.4375, -0.0625, 0.375},
{-0.375, -0.4375, 0.25, 0.375, -0.0625, 0.4375},
{-0.25, -0.25, 0.4375, 0.25, 0.0625, 0.5},
{-0.25, -0.481132, -0.3125, 0.25, -0.4375, 0}
},
},
})
--Rack Server
minetest.register_node("computer:server", {
drawtype = "nodebox",

View File

@ -1,2 +1,4 @@
default
homedecor_common
basic_materials
unifieddyes

View File

@ -94,6 +94,6 @@ end
local MODPATH = minetest.get_modpath("computer")
dofile(MODPATH.."/computers.lua")
dofile(MODPATH.."/miscitems.lua")
dofile(MODPATH.."/printers.lua")
dofile(MODPATH.."/recipes.lua")
dofile(MODPATH.."/tetris.lua")

View File

@ -1,68 +0,0 @@
-- Copyright (C) 2012-2013 Diego Martínez <kaeza@users.sf.net>
-- This file defines some items in order to not have to depend on other mods.
local S = homedecor.gettext
if (not minetest.get_modpath("homedecor")) then
minetest.register_craftitem(":basic_materials:plastic_sheet", {
description = S("Plastic sheet"),
inventory_image = "homedecor_plastic_sheeting.png",
})
minetest.register_craftitem(":homedecor:plastic_base", {
description = S("Unprocessed Plastic base"),
wield_image = "homedecor_plastic_base.png",
inventory_image = "homedecor_plastic_base_inv.png",
})
minetest.register_craft({
type = "shapeless",
output = 'homedecor:plastic_base 6',
recipe = { "default:junglegrass",
"default:junglegrass",
"default:junglegrass"
}
})
minetest.register_craft({
type = "shapeless",
output = 'homedecor:plastic_base 3',
recipe = { "default:dry_shrub",
"default:dry_shrub",
"default:dry_shrub"
},
})
minetest.register_craft({
type = "shapeless",
output = 'homedecor:plastic_base 4',
recipe = { "default:leaves",
"default:leaves",
"default:leaves",
"default:leaves",
"default:leaves",
"default:leaves"
}
})
minetest.register_craft({
type = "cooking",
output = "basic_materials:plastic_sheet",
recipe = "homedecor:plastic_base",
})
minetest.register_craft({
type = 'fuel',
recipe = 'homedecor:plastic_base',
burntime = 30,
})
minetest.register_craft({
type = 'fuel',
recipe = 'basic_materials:plastic_sheet',
burntime = 30,
})
end -- not homedecor

File diff suppressed because it is too large Load Diff

61
computer/printers.lua Normal file
View File

@ -0,0 +1,61 @@
-- Printers of some kind or another
local S = homedecor.gettext
minetest.register_node("computer:printer", {
description = S("Printer-Scanner Combo"),
inventory_image = "computer_printer_inv.png",
tiles = {"computer_printer_t.png","computer_printer_bt.png","computer_printer_l.png",
"computer_printer_r.png","computer_printer_b.png","computer_printer_f.png"},
paramtype = "light",
paramtype2 = "facedir",
walkable = true,
groups = {snappy=3},
sound = default.node_sound_wood_defaults(),
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-0.4375, -0.3125, -0.125, 0.4375, -0.0625, 0.375},
{-0.4375, -0.5, -0.125, 0.4375, -0.4375, 0.375},
{-0.4375, -0.5, -0.125, -0.25, -0.0625, 0.375},
{0.25, -0.5, -0.125, 0.4375, -0.0625, 0.375},
{-0.4375, -0.5, -0.0625, 0.4375, -0.0625, 0.375},
{-0.375, -0.4375, 0.25, 0.375, -0.0625, 0.4375},
{-0.25, -0.25, 0.4375, 0.25, 0.0625, 0.5},
{-0.25, -0.481132, -0.3125, 0.25, -0.4375, 0}
},
},
})
-- "bedflinger" style 3D Printer (Prusa i3 or equivalent)
local cbox = {
type = "fixed",
fixed = {-0.25, -0.25, -0.5, 0.3, 0.3, 0.25 }
}
minetest.register_node("computer:3dprinter_bedflinger", {
description = S('3D Printer ("bedflinger")'),
inventory_image = "computer_3dprinter_bedflinger_inv.png",
tiles = {
{ name = "computer_3dprinter_bedflinger.png", color = 0xffffffff },
"computer_3dprinter_filament.png"
},
paramtype = "light",
walkable = true,
groups = {snappy=3, ud_param2_colorable = 1},
sound = default.node_sound_wood_defaults(),
drawtype = "mesh",
mesh = "computer_3dprinter_bedflinger.obj",
paramtype2 = "colorwallmounted",
palette = "unifieddyes_palette_colorwallmounted.png",
selection_box = cbox,
collision_box = cbox,
after_place_node = function(pos, placer, itemstack, pointed_thing)
unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing)
end,
on_dig = unifieddyes.on_dig,
on_rotate = unifieddyes.fix_after_screwdriver_nsew,
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 B

7
concrete/locale/fr.txt Normal file
View File

@ -0,0 +1,7 @@
# technic_concrete translation template
Rebar = Armature
Concrete Block = Bloc de béton
Blast-resistant Concrete Block = Bloc de béton anti explosions
Concrete Post Platform = Plateforme en béton
Concrete Post = Pilier en béton

10
concrete/locale/pt_BR.txt Normal file
View File

@ -0,0 +1,10 @@
# Braziliam portuguese translation for technic_concrete
# Tradução portuguesa brasileira para technic_concrete
# By Sires
Rebar = Vergalhão
Concrete Block = Bloco de Concreto
Blast-resistant Concrete Block = Bloco de Concreto resistente-a-explosões
Concrete Post Platform = Plataforma para Poste de Concreto
Concrete Post = Poste de Concreto

Binary file not shown.

Before

Width:  |  Height:  |  Size: 311 B

After

Width:  |  Height:  |  Size: 214 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 813 B

After

Width:  |  Height:  |  Size: 583 B

View File

@ -1,44 +1,42 @@
players_income = {}
local players_income = {}
-- internationalization boilerplate
local MP = minetest.get_modpath(minetest.get_current_modname())
local S, NS = dofile(MP.."/intllib.lua")
local timer = 0
minetest.register_globalstep(function(dtime)
timer = timer + dtime;
if timer >= 720 then --720 for one day
timer = 0
for _,player in ipairs(minetest.get_connected_players()) do
local income_enabled = minetest.settings:get_bool("currency.income_enabled", true)
local income_item = minetest.settings:get("currency.income_item") or "currency:minegeld_10"
local income_count = tonumber(minetest.settings:get("currency.income_count")) or 1
local income_period = tonumber(minetest.settings:get("currency.income_period")) or 720
if income_enabled then
local timer = 0
minetest.register_globalstep(function(dtime)
timer = timer + dtime;
if timer >= income_period then
timer = 0
for _, player in ipairs(minetest.get_connected_players()) do
local name = player:get_player_name()
if players_income[name] == nil then
players_income[name] = 0
end
players_income[name] = 1
players_income[name] = income_count
minetest.log("info", "[Currency] "..S("basic income for @1", name))
end
end
end)
local function earn_income(player)
if not player or player.is_fake_player then return end
local name = player:get_player_name()
local income_count = players_income[name]
if income_count and income_count > 0 then
local inv = player:get_inventory()
inv:add_item("main", {name=income_item, count=income_count})
players_income[name] = nil
minetest.log("info", "[Currency] "..S("added basic income for @1 to inventory", name))
end
end
end)
earn_income = function(player)
if not player or player.is_fake_player then return end
local name = player:get_player_name()
if players_income[name] == nil then
players_income[name] = 0
end
if players_income[name] > 0 then
count = players_income[name]
local inv = player:get_inventory()
inv:add_item("main", {name="currency:minegeld_10", count=count})
players_income[name] = 0
minetest.log("info", "[Currency] "..S("added basic income for @1 to inventory", name))
end
minetest.register_on_dignode(function(pos, oldnode, digger) earn_income(digger) end)
minetest.register_on_placenode(function(pos, node, placer) earn_income(placer) end)
minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) earn_income(player) end)
end
minetest.register_on_dignode(function(pos, oldnode, digger)
earn_income(digger)
end)
minetest.register_on_placenode(function(pos, node, placer)
earn_income(placer)
end)

View File

@ -1 +1,3 @@
name = currency
depends = default
optional_depends = intllib,loot,pipeworks

11
currency/settingtypes.txt Normal file
View File

@ -0,0 +1,11 @@
# Is income enabled?
currency.income_enabled (Is currency income enabled?) bool true
# Item that is given as income by the currency mod
currency.income_item (Currency income item) string currency:minegeld_10
# Number of items given as income
currency.income_count (Currency income item) int 1 1 65535
# Length of time (in seconds) between checking if a user should get income
currency.income_period (Currency income period) int 720

View File

@ -108,10 +108,10 @@ local lcds = {
-- on ground
--* [1] = {delta = {x = 0, y =-0.4, z = 0}, pitch = math.pi / 2},
-- sides
[2] = {delta = {x = 0.437, y = 0, z = 0}, yaw = math.pi / -2},
[3] = {delta = {x = -0.437, y = 0, z = 0}, yaw = math.pi / 2},
[4] = {delta = {x = 0, y = 0, z = 0.437}, yaw = 0},
[5] = {delta = {x = 0, y = 0, z = -0.437}, yaw = math.pi},
[2] = {delta = {x = 0.42, y = 0, z = 0}, yaw = math.pi / -2},
[3] = {delta = {x = -0.42, y = 0, z = 0}, yaw = math.pi / 2},
[4] = {delta = {x = 0, y = 0, z = 0.42}, yaw = 0},
[5] = {delta = {x = 0, y = 0, z = -0.42}, yaw = math.pi},
}
local reset_meta = function(pos)
@ -173,7 +173,7 @@ local prepare_writing = function(pos)
if entity then
set_texture(entity)
rotate_text(pos)
end
end
end
local spawn_entity = function(pos)

View File

@ -30,7 +30,7 @@ minetest.register_node("digistuff:noteblock", {
local meta = minetest.get_meta(pos)
if fields.channel then meta:set_string("channel",fields.channel) end
end,
digiline =
digiline =
{
receptor = {},
effector = {
@ -62,3 +62,12 @@ minetest.register_node("digistuff:noteblock", {
},
},
})
minetest.register_craft({
output = "digistuff:noteblock",
recipe = {
{"mesecons_noteblock:noteblock"},
{"mesecons_luacontroller:luacontroller0000"},
{"digilines:wire_std_00000000"},
},
})

View File

@ -31,7 +31,7 @@ minetest.register_node("digistuff:piezo", {
local meta = minetest.get_meta(pos)
if fields.channel then meta:set_string("channel",fields.channel) end
end,
digiline =
digiline =
{
receptor = {},
effector = {
@ -78,3 +78,11 @@ minetest.register_node("digistuff:piezo", {
},
},
})
minetest.register_craft({
output = "digistuff:piezo",
recipe = {
{"quartz:quartz_crystal_piece","basic_materials:steel_strip"},
{"digilines:wire_std_00000000","mesecons_luacontroller:luacontroller0000"},
},
})

View File

@ -220,3 +220,12 @@ minetest.register_node("digistuff:piston_pusher", {
mesecon.register_mvps_stopper("digistuff:piston_ext")
mesecon.register_mvps_stopper("digistuff:piston_pusher")
minetest.register_craft({
output = "digistuff:piston",
recipe = {
{"mesecons_pistons:piston_normal_off"},
{"mesecons_luacontroller:luacontroller0000"},
{"digilines:wire_std_00000000"},
},
})

View File

@ -88,7 +88,7 @@ minetest.register_node("digistuff:button", {
{ -4/16, -2/16, 4/16, 4/16, 2/16, 6/16 } -- the button itself
}
},
digiline =
digiline =
{
receptor = {},
wire = {
@ -150,7 +150,7 @@ minetest.register_node("digistuff:button_off", {
{ -4/16, -2/16, 4/16, 4/16, 2/16, 6/16 } -- the button itself
}
},
digiline =
digiline =
{
receptor = {},
wire = {
@ -194,7 +194,7 @@ minetest.register_node("digistuff:button_off_pushed", {
{ -4/16, -2/16, 11/32, 4/16, 2/16, 6/16 }
}
},
digiline =
digiline =
{
receptor = {},
wire = {
@ -240,7 +240,7 @@ minetest.register_node("digistuff:button_on", {
{ -4/16, -2/16, 4/16, 4/16, 2/16, 6/16 } -- the button itself
}
},
digiline =
digiline =
{
receptor = {},
wire = {
@ -286,7 +286,7 @@ minetest.register_node("digistuff:button_on_pushed", {
{ -4/16, -2/16, 11/32, 4/16, 2/16, 6/16 }
}
},
digiline =
digiline =
{
receptor = {},
wire = {
@ -319,7 +319,7 @@ minetest.register_node("digistuff:wall_knob", {
paramtype2 = "facedir",
walkable = false,
sunlight_propagates = true,
digiline =
digiline =
{
receptor = {},
wire = {
@ -378,7 +378,7 @@ minetest.register_node("digistuff:wall_knob_configured", {
paramtype2 = "facedir",
walkable = false,
sunlight_propagates = true,
digiline =
digiline =
{
receptor = {},
wire = {
@ -426,3 +426,12 @@ minetest.register_node("digistuff:wall_knob_configured", {
end,
sounds = default and default.node_sound_stone_defaults(),
})
minetest.register_craft({
output = "digistuff:wall_knob",
recipe = {
{"", "mesecons_button:button_off", ""},
{"digilines:wire_std_00000000","mesecons_luacontroller:luacontroller0000", "digilines:wire_std_00000000"},
{"", "digilines:wire_std_00000000", ""},
},
})

View File

@ -177,17 +177,20 @@ if minetest.get_modpath("unifieddyes") then
unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing)
end
iclip_def.groups = {choppy=1, snappy=1, oddly_breakable_by_hand=1, ud_param2_colorable = 1}
iclip_def.on_dig = unifieddyes.on_dig
iclipfence_def.paramtype2 = "color"
iclipfence_def.palette = "unifieddyes_palette_extended.png"
iclipfence_def.on_construct = unifieddyes.on_construct
iclipfence_def.groups = {fence=1, choppy=1, snappy=1, oddly_breakable_by_hand=1, ud_param2_colorable = 1}
iclipfence_def.on_dig = unifieddyes.on_dig
sclip_def.paramtype2 = "colorwallmounted"
sclip_def.palette = "unifieddyes_palette_colorwallmounted.png"
sclip_def.after_place_node = function(pos, placer, itemstack, pointed_thing)
unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing)
end
sclip_def.on_dig = unifieddyes.on_dig
sclip_def.groups = {choppy=1, cracky=1, ud_param2_colorable = 1}
end

7
extranodes/locale/fr.txt Normal file
View File

@ -0,0 +1,7 @@
# technic_extranodes translation template
Marble = Marbre
Marble Bricks = Briques en marbre
Granite = Granite
Concrete = Béton

View File

@ -0,0 +1,9 @@
# Braziliam portuguese translation for technic_extranodes
# Tradução portuguesa brasileira para technic_extranodes
# By Sires
Marble = Mármore
Marble Bricks = Tijolos de Mármore
Granite = Granito
Concrete = Concreto

Binary file not shown.

Before

Width:  |  Height:  |  Size: 226 B

After

Width:  |  Height:  |  Size: 202 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 B

After

Width:  |  Height:  |  Size: 103 B

View File

@ -1,6 +1,40 @@
# facade
# Facade
Adds decorative clay and stone-type nodes to Minetest Game.
## Dependencies
- default (included in minetest_game)
- [mychisel](https://github.com/minetest-mods/mychisel) (**optional dependency!**)
## Requierments
This requieres MT/MTG 0.4.16+ to run (may work on older versions).
## License
Click [here](https://github.com/TumeniNodes/facade/blob/master/license.txt) to see the license.
## Installation
- Unzip the archive, rename the folder to facade and
place it in ..minetest/mods/
- GNU/Linux: If you use a system-wide installation place
it in ~/.minetest/mods/.
- If you only want this to be used in a single world, place
the folder in ..worldmods/ in your world directory.
For further information or help, see:
https://wiki.minetest.net/Installing_Mods
## Bugs, suggestions, features & bugfixes.
Report bugs or suggest ideas by [creating an issue](https://github.com/TumeniNodes/facade/issues/new).
If you know how to fix an issue, or want something to be added, consider opening a [pull request](https://github.com/TumeniNodes/facade/compare).
## Screenshots
![Preview](https://github.com/TumeniNodes/facade/blob/master/screenshot.png)
![Preview](https://github.com/TumeniNodes/facade/blob/master/screenshot2.png)
![Preview](https://github.com/TumeniNodes/facade/blob/master/screenshot3.png)
![Preview](https://github.com/TumeniNodes/facade/blob/master/screenshot4.png)
If you want to get additional info about this mod, go the [Minetest Forums](https://forum.minetest.net/viewtopic.php?f=9&t=18208).
Have fun with Facade!

View File

@ -1,2 +1,3 @@
default
mychisel?
columnia?

BIN
facade/facade_shaper.xcf Normal file

Binary file not shown.

View File

@ -1,648 +1,10 @@
facade = {}
local wehavechisels = minetest.get_modpath("mychisel")
-- Define the shapes and registration functions
dofile (minetest.get_modpath("facade") .. "/shapes.lua")
--------------
--Bannerstones
--------------
-- Register the nodes made from compatible materials
dofile (minetest.get_modpath("facade") .. "/materials.lua")
--Node will be called facade:<subname>_bannerstone
function facade.register_bannerstone(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_bannerstone" , {
description = desc .. " Bannerstone",
drawtype = "nodebox",
tiles = {
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png^facade_bannerstone.png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
{-0.5, 0.25, -0.5625, 0.5, 0.375, -0.5},
{-0.5, -0.375, -0.5625, 0.5, -0.25, -0.5},
},
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
}
},
})
end
--Node will be called facade:<subname>_bannerstone_corner
function facade.register_bannerstone_corner(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_bannerstone_corner", {
description = desc .. " Bannerstone Corner",
drawtype = "nodebox",
tiles = {
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png^facade_bannerstone.png",
"" .. modname.. "_" .. subname .. ".png^facade_bannerstone.png",
"" .. modname.. "_" .. subname .. ".png^facade_bannerstone.png",
"" .. modname.. "_" .. subname .. ".png^facade_bannerstone.png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
{-0.5625, 0.25, -0.5625, 0.5625, 0.375, 0.5625},
{-0.5625, -0.375, -0.5625, 0.5625, -0.25, 0.5625},
},
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
}
},
})
end
--------------
--Centerstones
--------------
--Node will be called facade:<subname>_centerstone
function facade.register_centerstone(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_centerstone", {
description = desc .. " Centerstone",
drawtype = "nodebox",
tiles = {"" .. modname.. "_" .. subname .. ".png^facade_centerstone.png"},
paramtype = "light",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.4375, -0.4375, -0.4375, 0.4375, 0.4375, 0.4375},
{-0.5, -0.25, 0.0625, 0.5, 0.25, 0.25},
{-0.5, -0.25, -0.25, 0.5, 0.25, -0.0625},
{-0.25, -0.25, -0.5, -0.0625, 0.25, 0.5},
{0.0625, -0.25, -0.5, 0.25, 0.25, 0.5},
{-0.5, 0.0625, -0.25, 0.5, 0.25, 0.25},
{-0.5, -0.25, -0.25, 0.5, -0.0625, 0.25},
{-0.25, -0.25, -0.5, 0.25, -0.0625, 0.5},
{-0.25, 0.0625, -0.5, 0.25, 0.25, 0.5},
{-0.25, -0.5, -0.25, 0.25, 0.5, -0.0625},
{-0.25, -0.5, 0.0625, 0.25, 0.5, 0.25},
{0.0625, -0.5, -0.1875, 0.25, 0.5, 0.1875},
{-0.25, -0.5, -0.1875, -0.0625, 0.5, 0.1875},
{-0.5, 0.3125, 0.3125, 0.5, 0.5, 0.5},
{-0.5, 0.3125, -0.5, 0.5, 0.5, -0.3125},
{0.3125, 0.3125, -0.5, 0.5, 0.5, 0.5},
{-0.5, 0.3125, -0.5, -0.3125, 0.5, 0.5},
{-0.5, -0.5, -0.5, -0.3125, -0.3125, 0.5},
{0.3125, -0.5, -0.5, 0.5, -0.3125, 0.5},
{-0.5, -0.5, -0.5, 0.5, -0.3125, -0.3125},
{-0.5, -0.5, 0.3125, 0.5, -0.3125, 0.5},
{0.3125, -0.5, -0.5, 0.5, 0.5, -0.3125},
{0.3125, -0.5, 0.3125, 0.5, 0.5, 0.5},
{-0.5, -0.5, 0.3125, -0.3125, 0.5, 0.5},
{-0.5, -0.5, -0.5, -0.3125, 0.5, -0.3125},
},
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
}
},
})
end
---------
--Columns
---------
--Node will be called facade:<subname>_column
function facade.register_column(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_column" , {
description = desc .. " Column",
drawtype = "nodebox",
tiles = {
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png^facade_column.png",
"" .. modname.. "_" .. subname .. ".png^facade_column.png"
},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.4375, 0.5, 0.5, 0.4375},
{-0.5, -0.5, -0.5, -0.3125, 0.5, 0.5},
{0.3125, -0.5, -0.5, 0.5, 0.5, 0.5},
{0.0625, -0.5, -0.5, 0.1875, 0.5, 0.5},
{-0.1875, -0.5, -0.5, -0.0625, 0.5, 0.5},
},
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
}
},
})
end
--Node will be called facade:<subname>_column_corner
function facade.register_column_corner(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_column_corner", {
description = desc .. " Column Corner",
drawtype = "nodebox",
tiles = {
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png^facade_column.png",
"" .. modname.. "_" .. subname .. ".png^facade_column.png",
"" .. modname.. "_" .. subname .. ".png^facade_column.png",
"" .. modname.. "_" .. subname .. ".png^facade_column.png"
},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.4375, -0.5, -0.4375, 0.4375, 0.5, 0.4375},
{-0.5, -0.5, 0.3125, -0.3125, 0.5, 0.5},
{0.3125, -0.5, -0.5, 0.5, 0.5, -0.3125},
{0.0625, -0.5, -0.5, 0.1875, 0.5, 0.5},
{-0.1875, -0.5, -0.5, -0.0625, 0.5, 0.5},
{0.3125, -0.5, 0.3125, 0.5, 0.5, 0.5},
{-0.5, -0.5, -0.5, -0.3125, 0.5, -0.3125},
{-0.5, -0.5, 0.0625, 0.5, 0.5, 0.1875},
{-0.5, -0.5, -0.1875, 0.5, 0.5, -0.0625},
},
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
}
},
})
end
---------
--Corbels
---------
--Node will be called facade:<subname>_corbel
function facade.register_corbel(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_corbel", {
description = desc .. " Corbel",
drawtype = "nodebox",
tiles = {"" .. modname.. "_" .. subname .. ".png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.5, 0, -0.5, 0.5, 0.5, 0.5},
{-0.5, -0.5, 0, 0.5, 0.5, 0.5},
{-0.1875, -0.3125, -0.3125, 0.1875, 0.5, 0},
},
},
-- selection_box = {
-- type = "fixed",
-- fixed = {
-- {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
-- }
-- },
})
end
--Node will be called facade:<subname>_corbel_corner
function facade.register_corbel_corner(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_corbel_corner", {
description = desc .. " Corbel Corner",
drawtype = "nodebox",
tiles = {"" .. modname.. "_" .. subname .. ".png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.5, 0, -0.5, 0.5, 0.5, 0.5},
{-0.5, -0.5, 0, 0, 0.5, 0.5},
{0, -0.3125, -0.3125, 0.3125, 0.5, 0},
},
},
-- selection_box = {
-- type = "fixed",
-- fixed = {
-- {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
-- }
-- },
})
end
--Node will be called facade:<subname>_corbel_corner_inner
function facade.register_corbel_corner_inner(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_corbel_corner_inner", {
description = desc .. " Corbel Inner Corner",
drawtype = "nodebox",
tiles = {"" .. modname.. "_" .. subname .. ".png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.5, 0, -0.5, 0.5, 0.5, 0.5},
{-0.5, -0.5, 0, 0.5, 0.5, 0.5},
{0, -0.3125, -0.3125, 0.3125, 0.5, 0},
{-0.5, -0.5, -0.5, 0, 0.5, 0.5},
},
},
-- selection_box = {
-- type = "fixed",
-- fixed = {
-- {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
-- }
-- },
})
end
--------------------------
--- Carved Stones
--------------------------
--Node will be called facade:<subname>_carved_stone_a
function facade.register_carved_stone_a(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_carved_stone_a", {
description = desc .. " Carved Stone A",
drawtype = "nodebox",
tiles = {
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png^facade_carved_stone_a.png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.4375, 0.5, 0.5, 0.5},
{-0.5, 0.4375, -0.5, 0.5, 0.5, -0.4375},
{-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5},
{-0.4375, -0.375, -0.5, -0.3125, 0.375, -0.4375},
{-0.5, -0.375, -0.5, -0.3125, -0.25, 0.5},
{-0.4375, 0.25, -0.5, 0.4375, 0.375, 0.5},
{0.3125, -0.125, -0.5, 0.4375, 0.25, 0.5},
{-0.1875, -0.375, -0.5, 0.5, -0.25, 0.5},
{-0.1875, -0.25, -0.5, -0.0625, 0.125, 0.5},
{0.0625, -0.125, -0.5, 0.3125, 0, 0.5},
{-0.0625, 0, -0.5, 0.1875, 0.125, 0.5},
},
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
},
},
})
end
--Node will be called facade:<subname>_carved_stone_a_corner
function facade.register_carved_stone_a_corner(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_carved_stone_a_corner", {
description = desc .. " Carved Stone A Corner",
drawtype = "nodebox",
tiles = {
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png^facade_carved_stone_a.png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png^facade_carved_stone_a.png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.4375, -0.5, -0.4375, 0.5, 0.5, 0.5},
{-0.5, 0.4375, -0.5, 0.5, 0.5, -0.4375},
{-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5},
{-0.4375, -0.375, -0.5, -0.3125, 0.375, -0.4375},
{-0.5, -0.375, -0.5, -0.3125, -0.25, 0.1875},
{-0.4375, 0.25, -0.5, 0.4375, 0.375, 0.5},
{0.3125, -0.125, -0.5, 0.4375, 0.25, 0.5},
{-0.1875, -0.375, -0.5, 0.5, -0.25, 0.5},
{-0.1875, -0.25, -0.5, -0.0625, 0.125, 0.5},
{0.0625, -0.125, -0.5, 0.3125, 0, 0.5},
{-0.0625, 0, -0.5, 0.1875, 0.125, 0.5},
{-0.5, 0.4375, -0.5, 0.5, 0.5, 0.5},
{-0.5, -0.125, -0.4375, 0.5, 0.375, -0.3125},
{-0.5, 0.25, -0.3125, 0.5, 0.375, 0.4375},
{-0.5, -0.375, 0.3125, 0.4375, 0.375, 0.4375},
{-0.5, -0.375, 0.3125, 0.4375, -0.25, 0.5},
{-0.5, -0.125, -0.3125, 0.4375, 0, -0.0625},
{-0.5, 0, -0.1875, 0.4375, 0.125, 0.1875},
{-0.5, -0.25, 0.0625, 0.4375, 0.125, 0.1875},
},
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
},
},
})
end
--------------------------
--- RGSpro Facia
--------------------------
--Node will be called facade:<subname>_rgspro
function facade.register_rgspro(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_rgspro", {
description = desc .. " RGSpro",
drawtype = "nodebox",
tiles = {
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png^facade_rgspro.png",
"" .. modname.. "_" .. subname .. ".png^facade_rgspro.png",
"" .. modname.. "_" .. subname .. ".png^facade_rgspro.png",
"" .. modname.. "_" .. subname .. ".png^facade_rgspro.png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, 0.375, 0.5, -0.3125, 0.5},
{-0.5, -0.3125, 0.25, 0.5, -0.125, 0.5},
{-0.5, -0.125, 0.125, 0.5, 0.5, 0.5},
},
},
-- selection_box = {
-- type = "fixed",
-- fixed = {
-- {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
-- },
-- },
})
end
--Node will be called facade:<subname>_rgspro_inner_corner
function facade.register_rgspro_inner_corner(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_rgspro_inner_corner", {
description = desc .. " RGSpro Inner Corner",
drawtype = "nodebox",
tiles = {
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png^facade_rgspro.png",
"" .. modname.. "_" .. subname .. ".png^facade_rgspro.png",
"" .. modname.. "_" .. subname .. ".png^facade_rgspro.png",
"" .. modname.. "_" .. subname .. ".png^facade_rgspro.png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, 0.375, 0.5, -0.3125, 0.5},
{-0.5, -0.3125, 0.25, 0.5, -0.125, 0.5},
{-0.5, -0.125, 0.125, 0.5, 0.5, 0.5},
{0.375, -0.5, -0.5, 0.5, -0.3125, 0.375},
{0.25, -0.3125, -0.5, 0.5, -0.0625, 0.25},
{0.125, -0.125, -0.5, 0.5, 0.5, 0.125},
},
},
-- selection_box = {
-- type = "fixed",
-- fixed = {
-- {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
-- },
-- },
})
end
--Node will be called facade:<subname>_rgspro_outer_corner
function facade.register_rgspro_outer_corner(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_rgspro_outer_corner", {
description = desc .. " RGSpro Outer Corner",
drawtype = "nodebox",
tiles = {
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png^facade_rgspro.png",
"" .. modname.. "_" .. subname .. ".png^facade_rgspro.png",
"" .. modname.. "_" .. subname .. ".png^facade_rgspro.png",
"" .. modname.. "_" .. subname .. ".png^facade_rgspro.png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, 0.375, 0.5, -0.3125, 0.5},
{-0.5, -0.3125, 0.25, 0.5, -0.0625, 0.5},
{-0.5, -0.125, 0.125, 0.5, 0.5, 0.5},
{-0.625, -0.5, 0.375, -0.5, -0.3125, 1.5},
{-0.75, -0.3125, 0.25, -0.5, -0.125, 1.5},
{-0.875, -0.125, 0.125, -0.5, 0.5, 1.5},
},
},
-- selection_box = {
-- type = "fixed",
-- fixed = {
-- {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
-- },
-- },
})
end
--------------------------
--- Corner Bricks
--------------------------
--Node will be called facade:<subname>_corner_bricks
function facade.register_corner_bricks(modname, subname, recipeitem, desc)
if not string.match(recipeitem,"clay")
then -- do not do for clay things that is ugly
minetest.register_node("facade:" .. subname .. "_corner_bricks", {
description = desc .. " Corner Bricks",
drawtype = "nodebox",
tiles = {
"" .. modname.. "_" .. subname .. "_brick.png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.5625, -0.5, 0.4375, -0.5, 0, 1},
{-0.5, -0.5, 0.4375, 0, 0, 0.5},
{-0.5625, 0, 0.5, -0.5, 0.5, 1.5},
{-0.5625, 0, 0.4375, 0.5, 0.5, 0.5},
},
},
-- selection_box = {
-- type = "fixed",
-- fixed = {
-- {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
-- },
-- },
})
end
end
--------------------------
--Register Nodes/Materials
--------------------------
function facade.register_facade_nodes(modname, subname, recipeitem, desc)
facade.register_bannerstone(modname, subname, recipeitem, desc)
facade.register_bannerstone_corner(modname, subname, recipeitem, desc)
facade.register_centerstone(modname, subname, recipeitem, desc)
facade.register_column(modname, subname, recipeitem, desc)
facade.register_column_corner(modname, subname, recipeitem, desc)
facade.register_corbel(modname, subname, recipeitem, desc)
facade.register_corbel_corner(modname, subname, recipeitem, desc)
facade.register_corbel_corner_inner(modname, subname, recipeitem, desc)
facade.register_carved_stone_a(modname, subname, recipeitem, desc)
facade.register_carved_stone_a_corner(modname, subname, recipeitem, desc)
facade.register_rgspro(modname, subname, recipeitem, desc)
facade.register_rgspro_inner_corner(modname, subname, recipeitem, desc)
facade.register_rgspro_outer_corner(modname, subname, recipeitem, desc)
facade.register_corner_bricks(modname, subname, recipeitem, desc)
if wehavechisels then -- register all nodes with mychisel mod to use them without creative priv
chisel.register_node("facade",subname, recipeitem, "bannerstone")
chisel.register_node("facade",subname, recipeitem, "bannerstone_corner")
chisel.register_node("facade",subname, recipeitem, "centerstone")
chisel.register_node("facade",subname, recipeitem, "column")
chisel.register_node("facade",subname, recipeitem, "column_corner")
chisel.register_node("facade",subname, recipeitem, "corbel")
chisel.register_node("facade",subname, recipeitem, "corbel_corner")
chisel.register_node("facade",subname, recipeitem, "corbel_corner_inner")
chisel.register_node("facade",subname, recipeitem, "carved_stone_a")
chisel.register_node("facade",subname, recipeitem, "carved_stone_a_corner")
chisel.register_node("facade",subname, recipeitem, "rgspro")
chisel.register_node("facade",subname, recipeitem, "rgspro_inner_corner")
chisel.register_node("facade",subname, recipeitem, "rgspro_outer_corner")
chisel.register_node("facade",subname, recipeitem, "corner_bricks")
end
end
if wehavechisels then chisel.add_mod("facade",14) end -- register the total number of different designs in this mod with mychisel
facade.register_facade_nodes("default", "clay", "default:clay", "Clay")
facade.register_facade_nodes("default", "desert_sandstone", "default:desert_sandstone", "Desert Sandstone")
facade.register_facade_nodes("default", "desert_stone", "default:desert_stone", "Desert Stone")
facade.register_facade_nodes("default", "sandstone", "default:sandstone", "Sandstone")
facade.register_facade_nodes("default", "silver_sandstone", "default:silver_sandstone", "Silver Sandstone")
facade.register_facade_nodes("default", "stone", "default:stone", "Stone")
--facade.register_facade_nodes("default", "obsidian", "default:obsidian", "Obsidian")
if minetest.get_modpath( "bakedclay") then
local clay = {
{"white", "White"},
{"grey", "Grey"},
{"black", "Black"},
{"red", "Red"},
{"yellow", "Yellow"},
{"green", "Green"},
{"cyan", "Cyan"},
{"blue", "Blue"},
{"magenta", "Magenta"},
{"orange", "Orange"},
{"violet", "Violet"},
{"brown", "Brown"},
{"pink", "Pink"},
{"dark_grey", "Dark Grey"},
{"dark_green", "Dark Green"},
}
for _, clay in pairs(clay) do
facade.register_facade_nodes("baked_clay", clay[1] , "bakedclay:" .. clay[1], clay[2] .. " Baked Clay")
end
end
if minetest.get_modpath( "darkage") then
facade.register_facade_nodes("darkage", "basalt", "darkage:basalt", "Basalt")
facade.register_facade_nodes("darkage", "chalk", "darkage:chalk", "Chalk")
facade.register_facade_nodes("darkage", "gneiss", "darkage:gneiss", "Gneiss")
facade.register_facade_nodes("darkage", "marble", "darkage:marble", "Marble")
facade.register_facade_nodes("darkage", "ors", "darkage:ors", "Ors")
facade.register_facade_nodes("darkage", "schist", "darkage:schist", "Schist")
facade.register_facade_nodes("darkage", "serpentine", "darkage:serpentine", "Serpentine")
facade.register_facade_nodes("darkage", "shale", "darkage:shale", "Shale")
facade.register_facade_nodes("darkage", "slate", "darkage:slate", "Slate")
end
if minetest.get_modpath( "nether") then
facade.register_facade_nodes("nether", "rack", "nether:rack", "Netherrack")
end
--[[if minetest.get_modpath( "lapis") then
facade.register_facade_nodes("lapis", "lapis_block", "lapis:lapis_block", "Lapis")
facade.register_facade_nodes("lapis", "lapis_lazurite", "lapis:lazurite", "Lazurite")
end]]--
-- Add a dedicated machine to produce the facade shapes
dofile (minetest.get_modpath("facade") .. "/shaper.lua")

58
facade/materials.lua Normal file
View File

@ -0,0 +1,58 @@
-- Registration of materials
facade.register_facade_nodes("default", "clay", "default:clay", "Clay")
facade.register_facade_nodes("default", "stone", "default:stone", "Stone")
facade.register_facade_nodes("default", "desert_stone", "default:desert_stone", "Desert Stone")
facade.register_facade_nodes("default", "sandstone", "default:sandstone", "Sandstone")
facade.register_facade_nodes("default", "desert_sandstone", "default:desert_sandstone", "Desert Sandstone")
facade.register_facade_nodes("default", "silver_sandstone", "default:silver_sandstone", "Silver Sandstone")
--facade.register_facade_nodes("default", "obsidian", "default:obsidian", "Obsidian")
if minetest.get_modpath( "bakedclay") then
local clay = {
{"white", "White"},
{"grey", "Grey"},
{"black", "Black"},
{"red", "Red"},
{"yellow", "Yellow"},
{"green", "Green"},
{"cyan", "Cyan"},
{"blue", "Blue"},
{"magenta", "Magenta"},
{"orange", "Orange"},
{"violet", "Violet"},
{"brown", "Brown"},
{"pink", "Pink"},
{"dark_grey", "Dark Grey"},
{"dark_green", "Dark Green"},
}
for _, clay in pairs(clay) do
facade.register_facade_nodes("baked_clay", clay[1] , "bakedclay:" .. clay[1], clay[2] .. " Baked Clay")
end
end
if minetest.get_modpath( "darkage") then
facade.register_facade_nodes("darkage", "basalt", "darkage:basalt", "Basalt")
facade.register_facade_nodes("darkage", "chalk", "darkage:chalk", "Chalk")
facade.register_facade_nodes("darkage", "gneiss", "darkage:gneiss", "Gneiss")
facade.register_facade_nodes("darkage", "marble", "darkage:marble", "Marble")
facade.register_facade_nodes("darkage", "ors", "darkage:ors", "Ors")
facade.register_facade_nodes("darkage", "schist", "darkage:schist", "Schist")
facade.register_facade_nodes("darkage", "serpentine", "darkage:serpentine", "Serpentine")
facade.register_facade_nodes("darkage", "shale", "darkage:shale", "Shale")
facade.register_facade_nodes("darkage", "slate", "darkage:slate", "Slate")
end
if minetest.get_modpath( "nether") then
facade.register_facade_nodes("nether", "rack", "nether:rack", "Netherrack")
end
--[[if minetest.get_modpath( "lapis") then
facade.register_facade_nodes("lapis", "lapis_block", "lapis:lapis_block", "Lapis")
facade.register_facade_nodes("lapis", "lapis_lazurite", "lapis:lazurite", "Lazurite")
end]]--

View File

@ -1 +1,4 @@
name = facade
depends = default
optional_depends = mychisel
description = Adds decorative clay and stone-type nodes to Minetest Game.

377
facade/shaper.lua Normal file
View File

@ -0,0 +1,377 @@
-- Facade Shaper
-- This machine serves the same purpose as the circular saw from moreblocks or the milling
-- maching from mymillwork. Namely, it provides a tool for creating shaped blocks that does
-- not rely on using recipes.
-- Balancing output per 1 input block with respect to apparent volume of output shape.
-- All current shapes are added, but shapes not present in this table will still be produced
-- one at a time — if that is the desired quantity, adding them is not required.
local output_ratios = {
bannerstone = 1,
bannerstone_corner = 1,
centerstone = 1,
column = 1,
column_corner = 1,
corbel = 1,
corbel_corner = 1,
corbel_corner_inner = 1,
carved_stone_a = 1,
carved_stone_a_corner = 1,
rgspro = 2,
rgspro_inner_corner = 1,
rgspro_outer_corner = 1,
corner_bricks = 2,
columnia_mid = 4,
columnia_bottom = 1,
columnia_top = 1,
columnia_crosslink = 1,
columnia_link = 4,
columnia_linkdown = 4,
}
-- The material to be used for buttons when no material is actually loaded.
-- It should be a generic material for which all the facade shapes are defined.
local demo_material = "default:stone"
-- Whether the facade should obey area protection for the inventories (as machines in technic mod)
-- or allow anybody to use them, but disallow the removal of machine itself (like circular saw in moreblocks)
local protect_inventories = false
local function prepare_formspec (material_name)
local output = string.gsub(material_name, "^.*:", "facade:")
local shaper_formspec =
"size[8,11;]"..
"label[0,0;" .. "Choose shape to produce:" .. "]"..
-- row 1, blocky shapes
"item_image_button[0,0.5;1,1;" .. output .. "_bannerstone" .. ";bannerstone; ]"..
"item_image_button[1,0.5;1,1;" .. output .. "_bannerstone_corner" .. ";bannerstone_corner; ]"..
"item_image_button[2,0.5;1,1;" .. output .. "_centerstone" .. ";centerstone; ]"..
"item_image_button[3,0.5;1,1;" .. output .. "_carved_stone_a" .. ";carved_stone_a; ]"..
"item_image_button[4,0.5;1,1;" .. output .. "_carved_stone_a_corner" .. ";carved_stone_a_corner; ]"..
"item_image_button[5,0.5;1,1;" .. output .. "_column" .. ";column; ]"..
"item_image_button[6,0.5;1,1;" .. output .. "_column_corner" .. ";column_corner; ]"..
-- row 2, corbel
"item_image_button[0,1.5;1,1;" .. output .. "_corbel" .. ";corbel; ]"..
"item_image_button[1,1.5;1,1;" .. output .. "_corbel_corner_inner" .. ";corbel_corner_inner; ]"..
"item_image_button[2,1.5;1,1;" .. output .. "_corbel_corner" .. ";corbel_corner; ]"..
-- row 3, cornice
"item_image_button[0,2.5;1,1;" .. output .. "_rgspro" .. ";rgspro; ]"..
"item_image_button[1,2.5;1,1;" .. output .. "_rgspro_inner_corner" .. ";rgspro_inner_corner; ]"..
"item_image_button[2,2.5;1,1;" .. output .. "_rgspro_outer_corner" .. ";rgspro_outer_corner; ]"
-- row 4, columnia
if not minetest.get_modpath("columnia") then
shaper_formspec = shaper_formspec ..
"item_image_button[0,3.5;1,1;" .. output .. "_columnia_mid" .. ";columnia_mid; ]"..
"item_image_button[1,3.5;1,1;" .. output .. "_columnia_bottom" .. ";columnia_bottom; ]"..
"item_image_button[2,3.5;1,1;" .. output .. "_columnia_crosslink" .. ";columnia_crosslink; ]"..
"item_image_button[3,3.5;1,1;" .. output .. "_columnia_link" .. ";columnia_link; ]"..
"item_image_button[4,3.5;1,1;" .. output .. "_columnia_linkdown" .. ";columnia_linkdown; ]"
-- this code is a provision in case top column pieces enter service
if minetest.registered_nodes[output .. "_columnia_top"] then
shaper_formspec = shaper_formspec ..
"item_image_button[5,3.5;1,1;" .. output .. "_columnia_top" .. ";columnia_top; ]"
end
end
-- row 5 for shapes which are not available for all materials
-- only one such shape exists so far, but more should be easy to add here
if minetest.registered_nodes[output .. "_corner_bricks"] then
shaper_formspec = shaper_formspec ..
"item_image_button[0,4.5;1,1;" .. output .. "_corner_bricks" .. ";corner_bricks; ]"
end
-- inventory part
shaper_formspec = shaper_formspec ..
"label[0, 5.5;".."In:".."]"..
"list[current_name;src;1,5.5;1,1;]"..
"label[3, 5.5;".."Out:".."]"..
"list[current_name;dst;4,5.5;4,1;]"..
"list[current_player;main;0,7;8,4;]"..
"listring[current_name;dst]"..
"listring[current_player;main]"..
"listring[current_name;src]"..
"listring[current_player;main]"
return(shaper_formspec)
end
-- a simple check for compatibile materials
local function check_material_applicability (material)
-- using centerstone node here, since it appears to be both one of the oldest
-- and defined for all materials as well, making it suitable for a quick check
if minetest.registered_nodes[string.gsub(material, "^.*:", "facade:") .. "_centerstone"] then
return true
else
return false
end
end
-- update the buttons to show shapes made from the actual material
local function update_formspec_put (pos, listname, index, stack, player)
if protect_inventories and minetest.is_protected(pos, player:get_player_name()) then
return
end
if listname ~= "src" then
return
end
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local material_name = stack:get_name()
if check_material_applicability(material_name) then
meta:set_string("formspec", prepare_formspec(material_name))
else
return
end
end
-- update the buttons to show shapes made from demo material if all material is removed
local function update_formspec_take (pos, listname, index, stack, player)
if protect_inventories and minetest.is_protected(pos, player:get_player_name()) then
return
end
if listname ~= "src" then
return
end
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
if inv:is_empty("src") then
meta:set_string("formspec", prepare_formspec(demo_material))
end
return
end
-- disallow putting in materials which are not supported
local function check_inventory_put (pos, listname, index, stack, player)
if protect_inventories and minetest.is_protected(pos, player:get_player_name()) then
return 0
end
if listname ~= "src" then
return 0
end
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local material_name = stack:get_name()
if check_material_applicability(material_name) then
return(stack:get_count())
else
return 0
end
end
local function check_inventory_take (pos, listname, index, stack, player)
if protect_inventories and minetest.is_protected(pos, player:get_player_name()) then
return 0
end
if listname ~= "src" and listname ~= "dst" then
return 0
end
return(stack:get_count())
end
local function check_inventory_move (pos, from_list, from_index, to_list, to_index, count, player)
if protect_inventories and minetest.is_protected(pos, player:get_player_name()) then
return 0
end
return(stack:get_count())
end
-- process the form fields and convert source material to desired shapes
local function form_handler(pos, formname, fields, sender)
if protect_inventories and minetest.is_protected(pos, sender:get_player_name()) then
return
end
if fields.quit then
return
end
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
if inv:is_empty("src") then
return
end
local inputstack = inv:get_stack("src", 1)
local inputname = inputstack:get_name()
for shape,_ in pairs(fields) do
local result = string.gsub(inputname, "^.*:", "facade:") .. "_" .. shape
-- one can never be overly paranoid, unlike the quick check before, this one is precise
if not minetest.registered_nodes[result] then
return
end
-- output quantities are adjusted to preserve roughly same mass of resulting products
if output_ratios[shape] then
result = result .. " " .. output_ratios[shape]
end
if not inv:room_for_item("dst", result) then
return
end
inputstack:take_item(1)
inv:set_stack("src", 1, inputstack)
inv:add_item("dst", result)
end
return
end
local function check_removability (pos, player)
local meta = minetest.get_meta(pos)
local owner = meta:set_string("owner")
local pname = player:get_player_name()
local inv = meta:get_inventory()
-- owner may always remove the device
if owner and owner ~= "" and pname and pname ~= "" and owner == pname then
if inv:is_empty("src") and inv:is_empty("dst") then
return true
else
return false
end
end
if minetest.is_protected(pos, player:get_player_name()) then
return false
end
if inv:is_empty("src") and inv:is_empty("dst") then
return true
end
return false
end
minetest.register_node("facade:shaper", {
description = "Shaper Machine",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
-- base
{-1/2, -1/2, -1/2, 1/2, -14/32, 1/2},
-- back
{-8/32, -1/2, 12/32, 8/32, 1/2, 16/32},
-- table
{-8/32, -4/32, -16/32, 8/32, 4/32, 16/32},
-- rear table sliding support
{-16/32, -4/32, 12/32, 16/32, 4/32, 16/32},
-- front table sliding support
{-8/32, -14/32, -12/32, 8/32, -4/32, -16/32},
-- top tool beam
{-4/32, 16/32, -8/32, 4/32, 12/32, 12/32},
-- cutter holder
{-2/32, 7/32, -2/32, 2/32, 14/32, 2/32},
-- cutter
{-1/128, 6/32, -1/32, 1/128, 7/32, 1/32},
},
},
selection_box = {
type = "fixed",
fixed = {
{-1/2, -1/2, -1/2, 1/2, 1/2, 1/2},
},
},
tiles = { "facade_shaper_top.png",
"facade_shaper_bottom.png",
"facade_shaper_right.png",
"facade_shaper_left.png",
"facade_shaper_back.png",
"facade_shaper_front.png"},
groups = { oddly_breakable_by_hand=2, cracky=3, dig_immediate=1 },
paramtype = "light",
paramtype2 = "facedir",
legacy_facedir_simple = true,
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("formspec", prepare_formspec(demo_material))
local inv = meta:get_inventory()
inv:set_size("src", 1)
inv:set_size("dst", 4)
end,
after_place_node = function(pos, placer)
local meta = minetest.get_meta(pos)
local owner = placer and placer:get_player_name() or ""
meta:set_string("owner", owner)
if owner then
meta:set_string("infotext", ("Facade Shaper (owned by %s)"):format(owner))
else
meta:set_string("infotext", "Facade Shaper")
end
end,
can_dig = check_removability,
allow_metadata_inventory_put = check_inventory_put,
allow_metadata_inventory_take = check_inventory_take,
allow_metadata_inventory_move = check_inventory_move,
on_metadata_inventory_put = update_formspec_put,
on_metadata_inventory_take = update_formspec_take,
on_receive_fields = form_handler,
})
minetest.register_craft({
output = 'facade:shaper',
recipe = {
{'', 'default:diamond', '' },
{'default:steel_ingot', 'default:steelblock', 'default:steel_ingot' },
{'', 'default:steelblock' , '' },
},
})

799
facade/shapes.lua Normal file
View File

@ -0,0 +1,799 @@
-- Node (shape) definition and registration
local wehavechisels = minetest.get_modpath("mychisel")
--------------
--Bannerstones
--------------
--Node will be called facade:<subname>_bannerstone
function facade.register_bannerstone(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_bannerstone" , {
description = desc .. " Bannerstone",
drawtype = "nodebox",
tiles = {
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png^facade_bannerstone.png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
{-0.5, 0.25, -0.5625, 0.5, 0.375, -0.5},
{-0.5, -0.375, -0.5625, 0.5, -0.25, -0.5},
},
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
}
},
})
end
--Node will be called facade:<subname>_bannerstone_corner
function facade.register_bannerstone_corner(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_bannerstone_corner", {
description = desc .. " Bannerstone Corner",
drawtype = "nodebox",
tiles = {
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png^facade_bannerstone.png",
"" .. modname.. "_" .. subname .. ".png^facade_bannerstone.png",
"" .. modname.. "_" .. subname .. ".png^facade_bannerstone.png",
"" .. modname.. "_" .. subname .. ".png^facade_bannerstone.png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
{-0.5625, 0.25, -0.5625, 0.5625, 0.375, 0.5625},
{-0.5625, -0.375, -0.5625, 0.5625, -0.25, 0.5625},
},
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
}
},
})
end
--------------
--Centerstones
--------------
--Node will be called facade:<subname>_centerstone
function facade.register_centerstone(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_centerstone", {
description = desc .. " Centerstone",
drawtype = "nodebox",
tiles = {"" .. modname.. "_" .. subname .. ".png^facade_centerstone.png"},
paramtype = "light",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.4375, -0.4375, -0.4375, 0.4375, 0.4375, 0.4375},
{-0.5, -0.25, 0.0625, 0.5, 0.25, 0.25},
{-0.5, -0.25, -0.25, 0.5, 0.25, -0.0625},
{-0.25, -0.25, -0.5, -0.0625, 0.25, 0.5},
{0.0625, -0.25, -0.5, 0.25, 0.25, 0.5},
{-0.5, 0.0625, -0.25, 0.5, 0.25, 0.25},
{-0.5, -0.25, -0.25, 0.5, -0.0625, 0.25},
{-0.25, -0.25, -0.5, 0.25, -0.0625, 0.5},
{-0.25, 0.0625, -0.5, 0.25, 0.25, 0.5},
{-0.25, -0.5, -0.25, 0.25, 0.5, -0.0625},
{-0.25, -0.5, 0.0625, 0.25, 0.5, 0.25},
{0.0625, -0.5, -0.1875, 0.25, 0.5, 0.1875},
{-0.25, -0.5, -0.1875, -0.0625, 0.5, 0.1875},
{-0.5, 0.3125, 0.3125, 0.5, 0.5, 0.5},
{-0.5, 0.3125, -0.5, 0.5, 0.5, -0.3125},
{0.3125, 0.3125, -0.5, 0.5, 0.5, 0.5},
{-0.5, 0.3125, -0.5, -0.3125, 0.5, 0.5},
{-0.5, -0.5, -0.5, -0.3125, -0.3125, 0.5},
{0.3125, -0.5, -0.5, 0.5, -0.3125, 0.5},
{-0.5, -0.5, -0.5, 0.5, -0.3125, -0.3125},
{-0.5, -0.5, 0.3125, 0.5, -0.3125, 0.5},
{0.3125, -0.5, -0.5, 0.5, 0.5, -0.3125},
{0.3125, -0.5, 0.3125, 0.5, 0.5, 0.5},
{-0.5, -0.5, 0.3125, -0.3125, 0.5, 0.5},
{-0.5, -0.5, -0.5, -0.3125, 0.5, -0.3125},
},
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
}
},
})
end
---------
--Columns
---------
--Node will be called facade:<subname>_column
function facade.register_column(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_column" , {
description = desc .. " Column",
drawtype = "nodebox",
tiles = {
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png^facade_column.png",
"" .. modname.. "_" .. subname .. ".png^facade_column.png"
},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.4375, 0.5, 0.5, 0.4375},
{-0.5, -0.5, -0.5, -0.3125, 0.5, 0.5},
{0.3125, -0.5, -0.5, 0.5, 0.5, 0.5},
{0.0625, -0.5, -0.5, 0.1875, 0.5, 0.5},
{-0.1875, -0.5, -0.5, -0.0625, 0.5, 0.5},
},
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
}
},
})
end
--Node will be called facade:<subname>_column_corner
function facade.register_column_corner(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_column_corner", {
description = desc .. " Column Corner",
drawtype = "nodebox",
tiles = {
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png^facade_column.png",
"" .. modname.. "_" .. subname .. ".png^facade_column.png",
"" .. modname.. "_" .. subname .. ".png^facade_column.png",
"" .. modname.. "_" .. subname .. ".png^facade_column.png"
},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.4375, -0.5, -0.4375, 0.4375, 0.5, 0.4375},
{-0.5, -0.5, 0.3125, -0.3125, 0.5, 0.5},
{0.3125, -0.5, -0.5, 0.5, 0.5, -0.3125},
{0.0625, -0.5, -0.5, 0.1875, 0.5, 0.5},
{-0.1875, -0.5, -0.5, -0.0625, 0.5, 0.5},
{0.3125, -0.5, 0.3125, 0.5, 0.5, 0.5},
{-0.5, -0.5, -0.5, -0.3125, 0.5, -0.3125},
{-0.5, -0.5, 0.0625, 0.5, 0.5, 0.1875},
{-0.5, -0.5, -0.1875, 0.5, 0.5, -0.0625},
},
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
}
},
})
end
---------
--Corbels
---------
--Node will be called facade:<subname>_corbel
function facade.register_corbel(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_corbel", {
description = desc .. " Corbel",
drawtype = "nodebox",
tiles = {"" .. modname.. "_" .. subname .. ".png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.5, 0, -0.5, 0.5, 0.5, 0.5},
{-0.5, -0.5, 0, 0.5, 0.5, 0.5},
{-0.1875, -0.3125, -0.3125, 0.1875, 0.5, 0},
},
},
-- selection_box = {
-- type = "fixed",
-- fixed = {
-- {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
-- }
-- },
})
end
--Node will be called facade:<subname>_corbel_corner
function facade.register_corbel_corner(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_corbel_corner", {
description = desc .. " Corbel Corner",
drawtype = "nodebox",
tiles = {"" .. modname.. "_" .. subname .. ".png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.5, 0, -0.5, 0.5, 0.5, 0.5},
{-0.5, -0.5, 0, 0, 0.5, 0.5},
{0, -0.3125, -0.3125, 0.3125, 0.5, 0},
},
},
-- selection_box = {
-- type = "fixed",
-- fixed = {
-- {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
-- }
-- },
})
end
--Node will be called facade:<subname>_corbel_corner_inner
function facade.register_corbel_corner_inner(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_corbel_corner_inner", {
description = desc .. " Corbel Inner Corner",
drawtype = "nodebox",
tiles = {"" .. modname.. "_" .. subname .. ".png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.5, 0, -0.5, 0.5, 0.5, 0.5},
{-0.5, -0.5, 0, 0.5, 0.5, 0.5},
{0, -0.3125, -0.3125, 0.3125, 0.5, 0},
{-0.5, -0.5, -0.5, 0, 0.5, 0.5},
},
},
-- selection_box = {
-- type = "fixed",
-- fixed = {
-- {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
-- }
-- },
})
end
--------------------------
--- Carved Stones
--------------------------
--Node will be called facade:<subname>_carved_stone_a
function facade.register_carved_stone_a(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_carved_stone_a", {
description = desc .. " Carved Stone A",
drawtype = "nodebox",
tiles = {
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png^facade_carved_stone_a.png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.4375, 0.5, 0.5, 0.5},
{-0.5, 0.4375, -0.5, 0.5, 0.5, -0.4375},
{-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5},
{-0.4375, -0.375, -0.5, -0.3125, 0.375, -0.4375},
{-0.5, -0.375, -0.5, -0.3125, -0.25, 0.5},
{-0.4375, 0.25, -0.5, 0.4375, 0.375, 0.5},
{0.3125, -0.125, -0.5, 0.4375, 0.25, 0.5},
{-0.1875, -0.375, -0.5, 0.5, -0.25, 0.5},
{-0.1875, -0.25, -0.5, -0.0625, 0.125, 0.5},
{0.0625, -0.125, -0.5, 0.3125, 0, 0.5},
{-0.0625, 0, -0.5, 0.1875, 0.125, 0.5},
},
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
},
},
})
end
--Node will be called facade:<subname>_carved_stone_a_corner
function facade.register_carved_stone_a_corner(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_carved_stone_a_corner", {
description = desc .. " Carved Stone A Corner",
drawtype = "nodebox",
tiles = {
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png^facade_carved_stone_a.png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png^facade_carved_stone_a.png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.4375, -0.5, -0.4375, 0.5, 0.5, 0.5},
{-0.5, 0.4375, -0.5, 0.5, 0.5, -0.4375},
{-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5},
{-0.4375, -0.375, -0.5, -0.3125, 0.375, -0.4375},
{-0.5, -0.375, -0.5, -0.3125, -0.25, 0.1875},
{-0.4375, 0.25, -0.5, 0.4375, 0.375, 0.5},
{0.3125, -0.125, -0.5, 0.4375, 0.25, 0.5},
{-0.1875, -0.375, -0.5, 0.5, -0.25, 0.5},
{-0.1875, -0.25, -0.5, -0.0625, 0.125, 0.5},
{0.0625, -0.125, -0.5, 0.3125, 0, 0.5},
{-0.0625, 0, -0.5, 0.1875, 0.125, 0.5},
{-0.5, 0.4375, -0.5, 0.5, 0.5, 0.5},
{-0.5, -0.125, -0.4375, 0.5, 0.375, -0.3125},
{-0.5, 0.25, -0.3125, 0.5, 0.375, 0.4375},
{-0.5, -0.375, 0.3125, 0.4375, 0.375, 0.4375},
{-0.5, -0.375, 0.3125, 0.4375, -0.25, 0.5},
{-0.5, -0.125, -0.3125, 0.4375, 0, -0.0625},
{-0.5, 0, -0.1875, 0.4375, 0.125, 0.1875},
{-0.5, -0.25, 0.0625, 0.4375, 0.125, 0.1875},
},
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
},
},
})
end
--------------------------
--- RGSpro Facia
--------------------------
--Node will be called facade:<subname>_rgspro
function facade.register_rgspro(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_rgspro", {
description = desc .. " RGSpro",
drawtype = "nodebox",
tiles = {
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png^facade_rgspro.png",
"" .. modname.. "_" .. subname .. ".png^facade_rgspro.png",
"" .. modname.. "_" .. subname .. ".png^facade_rgspro.png",
"" .. modname.. "_" .. subname .. ".png^facade_rgspro.png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, 0.375, 0.5, -0.3125, 0.5},
{-0.5, -0.3125, 0.25, 0.5, -0.125, 0.5},
{-0.5, -0.125, 0.125, 0.5, 0.5, 0.5},
},
},
-- selection_box = {
-- type = "fixed",
-- fixed = {
-- {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
-- },
-- },
})
end
--Node will be called facade:<subname>_rgspro_inner_corner
function facade.register_rgspro_inner_corner(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_rgspro_inner_corner", {
description = desc .. " RGSpro Inner Corner",
drawtype = "nodebox",
tiles = {
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png^facade_rgspro.png",
"" .. modname.. "_" .. subname .. ".png^facade_rgspro.png",
"" .. modname.. "_" .. subname .. ".png^facade_rgspro.png",
"" .. modname.. "_" .. subname .. ".png^facade_rgspro.png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, 0.375, 0.5, -0.3125, 0.5},
{-0.5, -0.3125, 0.25, 0.5, -0.125, 0.5},
{-0.5, -0.125, 0.125, 0.5, 0.5, 0.5},
{0.375, -0.5, -0.5, 0.5, -0.3125, 0.375},
{0.25, -0.3125, -0.5, 0.5, -0.0625, 0.25},
{0.125, -0.125, -0.5, 0.5, 0.5, 0.125},
},
},
-- selection_box = {
-- type = "fixed",
-- fixed = {
-- {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
-- },
-- },
})
end
--Node will be called facade:<subname>_rgspro_outer_corner
function facade.register_rgspro_outer_corner(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_rgspro_outer_corner", {
description = desc .. " RGSpro Outer Corner",
drawtype = "nodebox",
tiles = {
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png",
"" .. modname.. "_" .. subname .. ".png^facade_rgspro.png",
"" .. modname.. "_" .. subname .. ".png^facade_rgspro.png",
"" .. modname.. "_" .. subname .. ".png^facade_rgspro.png",
"" .. modname.. "_" .. subname .. ".png^facade_rgspro.png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, 0.375, 0.5, -0.3125, 0.5},
{-0.5, -0.3125, 0.25, 0.5, -0.0625, 0.5},
{-0.5, -0.125, 0.125, 0.5, 0.5, 0.5},
{-0.625, -0.5, 0.375, -0.5, -0.3125, 1.5},
{-0.75, -0.3125, 0.25, -0.5, -0.125, 1.5},
{-0.875, -0.125, 0.125, -0.5, 0.5, 1.5},
},
},
-- selection_box = {
-- type = "fixed",
-- fixed = {
-- {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
-- },
-- },
})
end
--------------------------
--- Corner Bricks
--------------------------
--Node will be called facade:<subname>_corner_bricks
function facade.register_corner_bricks(modname, subname, recipeitem, desc)
if not string.match(recipeitem,"clay")
then -- do not do for clay things that is ugly
minetest.register_node("facade:" .. subname .. "_corner_bricks", {
description = desc .. " Corner Bricks",
drawtype = "nodebox",
tiles = {
"" .. modname.. "_" .. subname .. "_brick.png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
node_box = {
type = "fixed",
fixed = {
{-0.5625, -0.5, 0.4375, -0.5, 0, 1},
{-0.5, -0.5, 0.4375, 0, 0, 0.5},
{-0.5625, 0, 0.5, -0.5, 0.5, 1.5},
{-0.5625, 0, 0.4375, 0.5, 0.5, 0.5},
},
},
})
end
end
--------------------------
--- Columnia shapes
--------------------------
-- From mod Columnia (2014 by Glunggi), LGPL 2.1
-- The shapes are using stock minetest.rotate_node() for positioning.
-- These shapes should not be registered if the regular columnia mod is in use
if not minetest.get_modpath("columnia") then
local columnia_rotate = function(itemstack, placer, pointed_thing)
if pointed_thing.type ~= "node" then
return itemstack
end
local p0 = pointed_thing.under
local p1 = pointed_thing.above
local param2 = 0
local placer_pos = placer:getpos()
if placer_pos then
local dir = {
x = p1.x - placer_pos.x,
y = p1.y - placer_pos.y,
z = p1.z - placer_pos.z
}
param2 = minetest.dir_to_facedir(dir)
end
if p0.y-1 == p1.y then
param2 = param2 + 20
if param2 == 21 then
param2 = 23
elseif param2 == 23 then
param2 = 21
end
end
return minetest.item_place(itemstack, placer, pointed_thing, param2)
end
-- Node will be called facade:<subname>_columnia_mid
function facade.register_columnia_mid(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_columnia_mid", {
description = desc .. " Column Middle",
drawtype = "nodebox",
tiles = {"" .. modname.. "_" .. subname .. ".png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
on_place = minetest.rotate_node,
node_box = {
type = "fixed",
fixed = {
{-0.25, -0.5, -0.25, 0.25, 0.5, 0.25},
},
},
})
end
-- Normally, a single shape should be fine both for bottom and top parts of
-- a column. If materials with textures that don't match with themselves
-- when rotated upside-down are added later on, then enable the next function.
-- Node will be called facade:<subname>_columnia_bottom
function facade.register_columnia_bottom(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_columnia_bottom", {
description = desc .. " Column Bottom/Top",
drawtype = "nodebox",
tiles = {"" .. modname.. "_" .. subname .. ".png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
on_place = minetest.rotate_node,
node_box = {
type = "fixed",
fixed = {
{-0.25, -0.5, -0.25, 0.25, 0.5, 0.25},
{-0.5, -0.5, -0.5, 0.5, -0.25, 0.5},
{-0.375, -0.5, -0.375, 0.375, 0, 0.375},
},
},
})
end
--[[
-- This function is commented out, because in the current state, when facade mod
-- uses materials without directional textures, having one shape for top
-- and bottom of columns is enough. However, for materials which have textures
-- that, when rotated, clearly stop matching the other blocks, this function
-- is preserved.
-- Node will be called facade:<subname>_columnia_top
function facade.register_columnia_top(modname, subname, recipeitem, desc)
-- whitelist items with textures of clear directionality (e.g. bricks)
if string.match(recipeitem, "brick")
then
minetest.register_node("facade:" .. subname .. "_columnia_top", {
description = desc .. " Column Top/Bottom",
drawtype = "nodebox",
tiles = {"" .. modname.. "_" .. subname .. ".png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
on_place = minetest.rotate_node,
node_box = {
type = "fixed",
fixed = {
{-0.25, -0.5, -0.25, 0.25, 0.5, 0.25},
{-0.5, 0.25, -0.5, 0.5, 0.5, 0.5},
{-0.375, 0, -0.375, 0.375, 0.5, 0.375},
},
},
})
end
end
]]--
-- Node will be called facade:<subname>_columnia_crosslink
function facade.register_columnia_crosslink(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_columnia_crosslink", {
description = desc .. " Column Crosslink",
drawtype = "nodebox",
tiles = {"" .. modname.. "_" .. subname .. ".png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
on_place = columnia_rotate,
node_box = {
type = "fixed",
fixed = {
{-0.25, -0.5, -0.25, 0.25, 0.5, 0.25},
{-0.5, 0, -0.25, 0.5, 0.5, 0.25},
{-0.25, 0, -0.5, 0.25, 0.5, 0.5},
{-0.4375, 0.0625, -0.4375, 0.4375, 0.4375, 0.4375},
},
},
})
end
-- Node will be called facade:<subname>_columnia_link
function facade.register_columnia_link(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_columnia_link", {
description = desc .. " Column Link",
drawtype = "nodebox",
tiles = {"" .. modname.. "_" .. subname .. ".png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
on_place = columnia_rotate,
node_box = {
type = "fixed",
fixed = {
{-0.25, 0, -0.5, 0.25, 0.5, 0.5},
},
},
})
end
-- Node will be called facade:<subname>_columnia_linkdown
function facade.register_columnia_linkdown(modname, subname, recipeitem, desc)
minetest.register_node("facade:" .. subname .. "_columnia_linkdown", {
description = desc .. " Column Linkdown",
drawtype = "nodebox",
tiles = {"" .. modname.. "_" .. subname .. ".png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1},
sounds = default.node_sound_stone_defaults(),
on_place = columnia_rotate,
node_box = {
type = "fixed",
fixed = {
{-0.25, 0, -0.5, 0.25, 0.5, 0.5},
{-0.125, -0.5, -0.125, 0.125, 0, 0.125},
{-0.1875, -0.5, -0.1875, 0.1875, -0.375, 0.1875},
{-0.1875, -0.125, -0.1875, 0.1875, 0, 0.1875},
},
},
})
end
end
--------------------------
--Register Nodes
--------------------------
function facade.register_facade_nodes(modname, subname, recipeitem, desc)
facade.register_bannerstone(modname, subname, recipeitem, desc)
facade.register_bannerstone_corner(modname, subname, recipeitem, desc)
facade.register_centerstone(modname, subname, recipeitem, desc)
facade.register_column(modname, subname, recipeitem, desc)
facade.register_column_corner(modname, subname, recipeitem, desc)
facade.register_corbel(modname, subname, recipeitem, desc)
facade.register_corbel_corner(modname, subname, recipeitem, desc)
facade.register_corbel_corner_inner(modname, subname, recipeitem, desc)
facade.register_carved_stone_a(modname, subname, recipeitem, desc)
facade.register_carved_stone_a_corner(modname, subname, recipeitem, desc)
facade.register_rgspro(modname, subname, recipeitem, desc)
facade.register_rgspro_inner_corner(modname, subname, recipeitem, desc)
facade.register_rgspro_outer_corner(modname, subname, recipeitem, desc)
facade.register_corner_bricks(modname, subname, recipeitem, desc)
if not minetest.get_modpath("columnia") then
facade.register_columnia_mid(modname, subname, recipeitem, desc)
facade.register_columnia_bottom(modname, subname, recipeitem, desc)
--facade.register_columnia_top(modname, subname, recipeitem, desc)
facade.register_columnia_crosslink(modname, subname, recipeitem, desc)
facade.register_columnia_link(modname, subname, recipeitem, desc)
facade.register_columnia_linkdown(modname, subname, recipeitem, desc)
end
if wehavechisels then
-- register all nodes with mychisel mod to use them without creative priv
chisel.register_node("facade",subname, recipeitem, "bannerstone")
chisel.register_node("facade",subname, recipeitem, "bannerstone_corner")
chisel.register_node("facade",subname, recipeitem, "centerstone")
chisel.register_node("facade",subname, recipeitem, "column")
chisel.register_node("facade",subname, recipeitem, "column_corner")
chisel.register_node("facade",subname, recipeitem, "corbel")
chisel.register_node("facade",subname, recipeitem, "corbel_corner")
chisel.register_node("facade",subname, recipeitem, "corbel_corner_inner")
chisel.register_node("facade",subname, recipeitem, "carved_stone_a")
chisel.register_node("facade",subname, recipeitem, "carved_stone_a_corner")
chisel.register_node("facade",subname, recipeitem, "rgspro")
chisel.register_node("facade",subname, recipeitem, "rgspro_inner_corner")
chisel.register_node("facade",subname, recipeitem, "rgspro_outer_corner")
chisel.register_node("facade",subname, recipeitem, "corner_bricks")
if not minetest.get_modpath("columnia") then
chisel.register_node("facade",subname, recipeitem, "columnia_mid")
chisel.register_node("facade",subname, recipeitem, "columnia_bottom")
--chisel.register_node("facade",subname, recipeitem, "columnia_top")
chisel.register_node("facade",subname, recipeitem, "columnia_crosslink")
chisel.register_node("facade",subname, recipeitem, "columnia_link")
chisel.register_node("facade",subname, recipeitem, "columnia_linkdown")
end
end
end
-- register the total number of different designs in this mod with mychisel
if wehavechisels then chisel.add_mod("facade",14) end

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -13,7 +13,7 @@ This mod works by adding your new plant to the {growing=1} group and numbering t
### Changelog:
- 1.42 - Soil needs water to be present within 3 blocks horizontally and 1 below to make wet soil, Jack 'o Lanterns now check protection.
- 1.42 - Soil needs water to be present within 3 blocks horizontally and 1 below to make wet soil, Jack 'o Lanterns now check protection, add chocolate block
- 1.41 - Each crop has it's own spawn rate (can be changed in farming.conf)
- 1.40 - Added Mithril Scythe to quick harvest and replant crops on right-click. Added Hoe's for MoreOres with Toolrank support.
- 1.39 - Added Rice, Rye and Oats thanks to Ademants Grains mod. Added Jaffa Cake and multigrain bread.

View File

@ -75,8 +75,8 @@ minetest.register_node("farming:barley_4", table.copy(crop_def))
crop_def.tiles = {"farming_barley_5.png"}
crop_def.drop = {
items = {
{items = {'farming:barley'}, rarity = 2},
{items = {'farming:seed_barley'}, rarity = 2},
{items = {"farming:barley"}, rarity = 2},
{items = {"farming:seed_barley"}, rarity = 2},
}
}
minetest.register_node("farming:barley_5", table.copy(crop_def))
@ -85,8 +85,8 @@ minetest.register_node("farming:barley_5", table.copy(crop_def))
crop_def.tiles = {"farming_barley_6.png"}
crop_def.drop = {
items = {
{items = {'farming:barley'}, rarity = 2},
{items = {'farming:seed_barley'}, rarity = 1},
{items = {"farming:barley"}, rarity = 2},
{items = {"farming:seed_barley"}, rarity = 1},
}
}
minetest.register_node("farming:barley_6", table.copy(crop_def))
@ -96,10 +96,10 @@ crop_def.tiles = {"farming_barley_7.png"}
crop_def.groups.growing = 0
crop_def.drop = {
items = {
{items = {'farming:barley'}, rarity = 1},
{items = {'farming:barley'}, rarity = 3},
{items = {'farming:seed_barley'}, rarity = 1},
{items = {'farming:seed_barley'}, rarity = 3},
{items = {"farming:barley"}, rarity = 1},
{items = {"farming:barley"}, rarity = 3},
{items = {"farming:seed_barley"}, rarity = 1},
{items = {"farming:seed_barley"}, rarity = 3},
}
}
minetest.register_node("farming:barley_7", table.copy(crop_def))

View File

@ -84,7 +84,7 @@ minetest.register_craftitem("farming:beans", {
minetest.register_craft({
output = "dye:green",
recipe = {
{'farming:beans'},
{"farming:beans"},
}
})
@ -162,9 +162,9 @@ minetest.register_node("farming:beanpole", {
minetest.register_craft({
output = "farming:beanpole",
recipe = {
{'', '', ''},
{'default:stick', '', 'default:stick'},
{'default:stick', '', 'default:stick'},
{"", "", ""},
{"default:stick", "", "default:stick"},
{"default:stick", "", "default:stick"},
}
})
@ -185,7 +185,7 @@ local crop_def = {
sunlight_propagates = true,
drop = {
items = {
{items = {'farming:beanpole'}, rarity = 1},
{items = {"farming:beanpole"}, rarity = 1},
}
},
selection_box = farming.select,
@ -216,10 +216,10 @@ crop_def.tiles = {"farming_beanpole_5.png"}
crop_def.groups.growing = 0
crop_def.drop = {
items = {
{items = {'farming:beanpole'}, rarity = 1},
{items = {'farming:beans 3'}, rarity = 1},
{items = {'farming:beans 2'}, rarity = 2},
{items = {'farming:beans 2'}, rarity = 3},
{items = {"farming:beanpole"}, rarity = 1},
{items = {"farming:beans 3"}, rarity = 1},
{items = {"farming:beans 2"}, rarity = 2},
{items = {"farming:beans 2"}, rarity = 3},
}
}
minetest.register_node("farming:beanpole_5", table.copy(crop_def))
@ -244,9 +244,9 @@ minetest.register_node("farming:beanbush", {
sunlight_propagates = true,
drop = {
items = {
{items = {'farming:beans 1'}, rarity = 1},
{items = {'farming:beans 1'}, rarity = 2},
{items = {'farming:beans 1'}, rarity = 3},
{items = {"farming:beans 1"}, rarity = 1},
{items = {"farming:beans 1"}, rarity = 2},
{items = {"farming:beans 1"}, rarity = 3},
}
},
selection_box = farming.select,

View File

@ -76,10 +76,10 @@ crop_def.tiles = {"farming_beetroot_5.png"}
crop_def.groups.growing = 0
crop_def.drop = {
max_items = 4, items = {
{items = {'farming:beetroot'}, rarity = 1},
{items = {'farming:beetroot'}, rarity = 2},
{items = {'farming:beetroot'}, rarity = 3},
{items = {'farming:beetroot'}, rarity = 4},
{items = {"farming:beetroot"}, rarity = 1},
{items = {"farming:beetroot"}, rarity = 2},
{items = {"farming:beetroot"}, rarity = 3},
{items = {"farming:beetroot"}, rarity = 4},
}
}
minetest.register_node("farming:beetroot_5", table.copy(crop_def))

View File

@ -78,9 +78,9 @@ crop_def.tiles = {"farming_blueberry_4.png"}
crop_def.groups.growing = 0
crop_def.drop = {
items = {
{items = {'farming:blueberries 2'}, rarity = 1},
{items = {'farming:blueberries'}, rarity = 2},
{items = {'farming:blueberries'}, rarity = 3},
{items = {"farming:blueberries 2"}, rarity = 1},
{items = {"farming:blueberries"}, rarity = 2},
{items = {"farming:blueberries"}, rarity = 3},
}
}
minetest.register_node("farming:blueberry_4", table.copy(crop_def))

Some files were not shown because too many files have changed in this diff Show More