This commit is contained in:
Milan2018 2021-05-15 22:34:12 +02:00
parent 79e311f654
commit 838f4f135f
40 changed files with 2246 additions and 663 deletions

22
xdecor/.gitignore vendored Normal file
View file

@ -0,0 +1,22 @@
## Files related to minetest development cycle
/*.patch
# GNU Patch reject file
*.rej
## Editors and Development environments
*~
*.swp
*.bak*
*.orig
# Vim
*.vim
# Kate
.*.kate-swp
.swp.*
# Eclipse (LDT)
.project
.settings/
.buildpath
.metadata
# Idea IDE
.idea/*

View file

@ -1,4 +1,3 @@
unused_args = false
allow_defined_top = true allow_defined_top = true
read_globals = { read_globals = {
@ -7,6 +6,9 @@ read_globals = {
"default", "default",
"stairs", "doors", "xpanes", "stairs", "doors", "xpanes",
"xdecor", "xbg", "xdecor", "xbg",
table = { fields = { "copy" } }, table = {fields = {"copy"}},
string = {fields = {"split"}},
"unpack", "unpack",
"stairsplus",
"mesecon"
} }

View file

@ -1,15 +1,17 @@
┌──────────────────────────────────────────────────────────────────────┐ ┌──────────────────────────────────────────────────────────────────────┐
│ Copyright (c) 2015-2017 kilbith <jeanpatrick.guerrero@gmail.com> │ │ Copyright (c) 2015-2017 kilbith <jeanpatrick.guerrero@gmail.com> │
│ │ │ │
│ Code: BSD │ │ Code: BSD │
│ Textures: WTFPL (credits: Gambit, kilbith, Cisoun) │ │ Textures: WTFPL (credits: Gambit, kilbith, Cisoun) │
│ Sounds: │ │ Textures (radio, speaker, hanging candle, rooster) by │
gigomaf <bartiko2@poczta.fm> (CC BY-NC 3.0) │
│ Sounds: │
│ - xdecor_boiling_water.ogg - by Audionautics - CC BY-SA │ │ - xdecor_boiling_water.ogg - by Audionautics - CC BY-SA │
│ freesound.org/people/Audionautics/sounds/133901/ │ freesound.org/people/Audionautics/sounds/133901/
│ - xdecor_enchanting.ogg - by Timbre - CC BY-SA-NC │ │ - xdecor_enchanting.ogg - by Timbre - CC BY-SA-NC │
│ freesound.org/people/Timbre/sounds/221683/ │ │ freesound.org/people/Timbre/sounds/221683/ │
│ - xdecor_bouncy.ogg - by Blender Foundation - CC BY 3.0 │ - xdecor_bouncy.ogg - by Blender Foundation - CC BY 3.0
opengameart.org/content/funny-comic-cartoon-bounce-sound │ opengameart.org/content/funny-comic-cartoon-bounce-sound │
└──────────────────────────────────────────────────────────────────────┘ └──────────────────────────────────────────────────────────────────────┘

View file

@ -1,13 +1,17 @@
## X-Decor ## ## X-Decor ##
##### A decoration mod meant to be simple and well-featured. ##### [![ContentDB](https://content.minetest.net/packages/jp/xdecor/shields/downloads/)](https://content.minetest.net/packages/jp/xdecor/)
##### It adds a bunch of cute cubes, various mechanisms and stuff for [cutting](https://forum.minetest.net/viewtopic.php?f=11&t=14085), [enchanting](https://forum.minetest.net/viewtopic.php?f=11&t=14087), cooking, etc. #####
##### This mod is a lightweight alternative to Home Decor and More Blocks all together. ##### A decoration mod meant to be simple and well-featured.
It adds a bunch of cute cubes, various mechanisms and stuff for [cutting](https://forum.minetest.net/viewtopic.php?f=11&t=14085), [enchanting](https://forum.minetest.net/viewtopic.php?f=11&t=14087), cooking, etc.
This mod is a lightweight alternative to HomeDecor and MoreBlocks.
### Requirements ###
This mod requires at least version 5.1 of Minetest.
### Credits ### ### Credits ###
##### Special thanks to Gambit for the textures from the PixelBOX pack for Minetest. ##### Special thanks to Gambit for the textures from the PixelBOX pack for Minetest.
Thanks to all contributors who keep this mod alive.
##### Thanks to all contributors that keep this mod alive. #####
![Preview](http://i.imgur.com/AVoyCQy.png) ![Preview](http://i.imgur.com/AVoyCQy.png)

View file

@ -1,8 +0,0 @@
default
bucket
doors
stairs
xpanes
fire?
oresplus?
moreblocks?

View file

@ -1 +0,0 @@
A decoration mod meant to be simple and well-featured.

View file

@ -18,25 +18,30 @@ function xdecor.sit(pos, node, clicker, pointed_thing)
if default.player_attached[player_name] then if default.player_attached[player_name] then
pos.y = pos.y - 0.5 pos.y = pos.y - 0.5
clicker:setpos(pos) clicker:set_pos(pos)
clicker:set_eye_offset({x=0, y=0, z=0}, {x=0, y=0, z=0}) clicker:set_eye_offset(vector.new(), vector.new())
clicker:set_physics_override(1, 1, 1) clicker:set_physics_override({speed = 1, jump = 1, gravity = 1})
default.player_attached[player_name] = false default.player_attached[player_name] = false
default.player_set_animation(clicker, "stand", 30) default.player_set_animation(clicker, "stand", 30)
elseif not default.player_attached[player_name] and node.param2 <= 3 and elseif not default.player_attached[player_name] and node.param2 <= 3 and
not ctrl.sneak and vector.equals(vel, {x=0,y=0,z=0}) then not ctrl.sneak and vector.equals(vel, vector.new()) then
clicker:set_eye_offset({x=0, y=-7, z=2}, {x=0, y=0, z=0}) clicker:set_eye_offset({x = 0, y = -7, z = 2}, vector.new())
clicker:set_physics_override(0, 0, 0) clicker:set_physics_override({speed = 0, jump = 0, gravity = 1})
clicker:setpos(pos) clicker:set_pos(pos)
default.player_attached[player_name] = true default.player_attached[player_name] = true
default.player_set_animation(clicker, "sit", 30) default.player_set_animation(clicker, "sit", 30)
if node.param2 == 0 then clicker:set_look_yaw(3.15) if node.param2 == 0 then
elseif node.param2 == 1 then clicker:set_look_yaw(7.9) clicker:set_look_yaw(3.15)
elseif node.param2 == 2 then clicker:set_look_yaw(6.28) elseif node.param2 == 1 then
elseif node.param2 == 3 then clicker:set_look_yaw(4.75) end clicker:set_look_yaw(7.9)
elseif node.param2 == 2 then
clicker:set_look_yaw(6.28)
elseif node.param2 == 3 then
clicker:set_look_yaw(4.75)
end
end end
end end
@ -47,6 +52,6 @@ function xdecor.sit_dig(pos, digger)
return false return false
end end
end end
return true return true
end end

View file

@ -2,21 +2,31 @@
function xdecor.maxn(T) function xdecor.maxn(T)
local n = 0 local n = 0
for k in pairs(T) do for k in pairs(T) do
if k > n then n = k end if k > n then
n = k
end
end end
return n return n
end end
-- Returns the length of an hash table. -- Returns the length of an hash table.
function xdecor.tablelen(T) function xdecor.tablelen(T)
local n = 0 local n = 0
for _ in pairs(T) do n = n + 1 end
for _ in pairs(T) do
n = n + 1
end
return n return n
end end
-- Deep copy of a table. Borrowed from mesecons mod (https://github.com/Jeija/minetest-mod-mesecons). -- Deep copy of a table. Borrowed from mesecons mod (https://github.com/Jeija/minetest-mod-mesecons).
function xdecor.tablecopy(T) function xdecor.tablecopy(T)
if type(T) ~= "table" then return T end -- No need to copy. if type(T) ~= "table" then
return T -- No need to copy.
end
local new = {} local new = {}
for k, v in pairs(T) do for k, v in pairs(T) do
@ -26,6 +36,7 @@ function xdecor.tablecopy(T)
new[k] = v new[k] = v
end end
end end
return new return new
end end
@ -41,7 +52,7 @@ function xdecor.stairs_valid_def(def)
not (def.groups.not_cuttable == 1) and not (def.groups.not_cuttable == 1) and
not def.groups.wool and not def.groups.wool and
(def.tiles and type(def.tiles[1]) == "string" and not (def.tiles and type(def.tiles[1]) == "string" and not
def.tiles[1]:find("default_mineral")) and def.tiles[1]:find("default_mineral")) and
not def.mesecons and not def.mesecons and
def.description and def.description and
def.description ~= "" and def.description ~= "" and

View file

@ -1,7 +1,13 @@
xdecor.box = { xdecor.box = {
slab_y = function(height, shift) slab_y = function(height, shift)
return {-0.5, -0.5 + (shift or 0), -0.5, 0.5, -0.5 + height + return {
(shift or 0), 0.5} -0.5,
-0.5 + (shift or 0),
-0.5,
0.5,
-0.5 + height + (shift or 0),
0.5
}
end, end,
slab_z = function(depth) slab_z = function(depth)
return {-0.5, -0.5, -0.5 + depth, 0.5, 0.5, 0.5} return {-0.5, -0.5, -0.5 + depth, 0.5, 0.5, 0.5}
@ -15,16 +21,18 @@ xdecor.box = {
} }
xdecor.nodebox = { xdecor.nodebox = {
regular = {type="regular"}, regular = {type = "regular"},
null = {type="fixed", fixed={0,0,0,0,0,0}} null = {
type = "fixed", fixed = {0,0,0,0,0,0}
}
} }
xdecor.pixelbox = function(size, boxes) xdecor.pixelbox = function(size, boxes)
local fixed = {} local fixed = {}
for _, box in pairs(boxes) do for _, box in ipairs(boxes) do
-- `unpack` has been changed to `table.unpack` in newest Lua versions. -- `unpack` has been changed to `table.unpack` in newest Lua versions.
local x, y, z, w, h, l = unpack(box) local x, y, z, w, h, l = unpack(box)
fixed[#fixed+1] = { fixed[#fixed + 1] = {
(x / size) - 0.5, (x / size) - 0.5,
(y / size) - 0.5, (y / size) - 0.5,
(z / size) - 0.5, (z / size) - 0.5,
@ -33,26 +41,27 @@ xdecor.pixelbox = function(size, boxes)
((z + l) / size) - 0.5 ((z + l) / size) - 0.5
} }
end end
return {type="fixed", fixed=fixed}
return {type = "fixed", fixed = fixed}
end end
local mt = {} local mt = {}
mt.__index = function(table, key) mt.__index = function(table, key)
local ref = xdecor.box[key] local ref = xdecor.box[key]
local ref_type = type(ref) local ref_type = type(ref)
if ref_type == "function" then if ref_type == "function" then
return function(...) return function(...)
return {type="fixed", fixed=ref(...)} return {type = "fixed", fixed = ref(...)}
end end
elseif ref_type == "table" then elseif ref_type == "table" then
return {type="fixed", fixed=ref} return {type = "fixed", fixed = ref}
elseif ref_type == "nil" then elseif ref_type == "nil" then
error(key.."could not be found among nodebox presets and functions") error(key .. "could not be found among nodebox presets and functions")
end end
error("unexpected datatype "..tostring(type(ref)).." while looking for "..key) error("unexpected datatype " .. tostring(type(ref)) .. " while looking for " .. key)
end end
setmetatable(xdecor.nodebox, mt) setmetatable(xdecor.nodebox, mt)

View file

@ -1,4 +1,4 @@
xbg = default.gui_bg..default.gui_bg_img..default.gui_slots xbg = default.gui_bg .. default.gui_bg_img .. default.gui_slots
local default_inventory_size = 32 local default_inventory_size = 32
local default_inventory_formspecs = { local default_inventory_formspecs = {
@ -6,30 +6,30 @@ local default_inventory_formspecs = {
list[context;main;0,0;8,1;] list[context;main;0,0;8,1;]
list[current_player;main;0,2;8,4;] list[current_player;main;0,2;8,4;]
listring[current_player;main] listring[current_player;main]
listring[context;main] ]] listring[context;main] ]] ..
..default.get_hotbar_bg(0,2), default.get_hotbar_bg(0,2),
["16"] = [[ size[8,7] ["16"] = [[ size[8,7]
list[context;main;0,0;8,2;] list[context;main;0,0;8,2;]
list[current_player;main;0,3;8,4;] list[current_player;main;0,3;8,4;]
listring[current_player;main] listring[current_player;main]
listring[context;main] ]] listring[context;main] ]] ..
..default.get_hotbar_bg(0,3), default.get_hotbar_bg(0,3),
["24"] = [[ size[8,8] ["24"] = [[ size[8,8]
list[context;main;0,0;8,3;] list[context;main;0,0;8,3;]
list[current_player;main;0,4;8,4;] list[current_player;main;0,4;8,4;]
listring[current_player;main] listring[current_player;main]
listring[context;main]" ]] listring[context;main]" ]] ..
..default.get_hotbar_bg(0,4), default.get_hotbar_bg(0,4),
["32"] = [[ size[8,9] ["32"] = [[ size[8,9]
list[context;main;0,0.3;8,4;] list[context;main;0,0.3;8,4;]
list[current_player;main;0,4.85;8,1;] list[current_player;main;0,4.85;8,1;]
list[current_player;main;0,6.08;8,3;8] list[current_player;main;0,6.08;8,3;8]
listring[current_player;main] listring[current_player;main]
listring[context;main] ]] listring[context;main] ]] ..
..default.get_hotbar_bg(0,4.85) default.get_hotbar_bg(0,4.85)
} }
local function get_formspec_by_size(size) local function get_formspec_by_size(size)
@ -42,13 +42,13 @@ local default_can_dig = function(pos)
return inv:is_empty("main") return inv:is_empty("main")
end end
function xdecor.register(name, def) local function xdecor_stairs_alternative(nodename, def)
local function xdecor_stairs_alternative(nodename, def)
local mod, name = nodename:match("(.*):(.*)") local mod, name = nodename:match("(.*):(.*)")
for groupname, value in pairs(def.groups) do for groupname, value in pairs(def.groups) do
if groupname ~= "cracky" and groupname ~= "choppy" and if groupname ~= "cracky" and groupname ~= "choppy" and
groupname ~= "flammable" and groupname ~= "crumbly" and groupname ~= "flammable" and groupname ~= "crumbly" and
groupname ~= "snappy" then groupname ~= "snappy" then
def.groups.groupname = nil def.groups.groupname = nil
end end
end end
@ -65,17 +65,18 @@ function xdecor.register(name, def)
sounds = def.sounds, sounds = def.sounds,
} }
) )
elseif minetest.get_modpath("stairs") then elseif minetest.get_modpath("stairs") then
stairs.register_stair_and_slab(name,nodename, stairs.register_stair_and_slab(name,nodename,
def.groups, def.groups,
def.tiles, def.tiles,
("%s Stair"):format(def.description), ("%s Stair"):format(def.description),
("%s Slab"):format(def.description), ("%s Slab"):format(def.description),
def.sounds def.sounds
) )
end end
end end
function xdecor.register(name, def)
def.drawtype = def.drawtype or (def.mesh and "mesh") or (def.node_box and "nodebox") def.drawtype = def.drawtype or (def.mesh and "mesh") or (def.node_box and "nodebox")
def.sounds = def.sounds or default.node_sound_defaults() def.sounds = def.sounds or default.node_sound_defaults()
@ -108,11 +109,14 @@ function xdecor.register(name, def)
local size = inventory.size or default_inventory_size local size = inventory.size or default_inventory_size
local inv = meta:get_inventory() local inv = meta:get_inventory()
inv:set_size("main", size) inv:set_size("main", size)
meta:set_string("formspec", (inventory.formspec or meta:set_string("formspec",
get_formspec_by_size(size))..xbg) (inventory.formspec or get_formspec_by_size(size)) .. xbg)
end end
def.can_dig = def.can_dig or default_can_dig def.can_dig = def.can_dig or default_can_dig
elseif infotext and not def.on_construct then elseif infotext and not def.on_construct then
def.on_construct = function(pos) def.on_construct = function(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
@ -120,12 +124,12 @@ function xdecor.register(name, def)
end end
end end
minetest.register_node("xdecor:"..name, def) minetest.register_node("xdecor:" .. name, def)
local workbench = minetest.settings:get_bool("enable_xdecor_workbench") local workbench = minetest.settings:get_bool("enable_xdecor_workbench")
if workbench == false and if workbench == false and
(minetest.get_modpath("moreblocks") or minetest.get_modpath("stairs")) then (minetest.get_modpath("moreblocks") or minetest.get_modpath("stairs")) then
if xdecor.stairs_valid_def(def) then if xdecor.stairs_valid_def(def) then
xdecor_stairs_alternative("xdecor:"..name, def) xdecor_stairs_alternative("xdecor:"..name, def)
end end

View file

@ -1,29 +1,15 @@
--local t = os.clock() --local t = os.clock()
local mver_major, mver_minor, mver_patch = 0, 4, 16 -- Minetest 0.4.16 minimum.
local client_version = minetest.get_version().string
local major, minor, patch = client_version:match("(%d+).(%d+).(%d+)")
if (major and minor and patch) and
((tonumber(major) < mver_major) or
(mver_major == tonumber(major) and tonumber(minor) < mver_minor) or
(mver_minor == tonumber(minor) and tonumber(patch) < mver_patch)) then
minetest.log("error", "[xdecor] Your Minetest client is too old to run this mod. Disabling.")
return
end
xdecor = {} xdecor = {}
local modpath = minetest.get_modpath("xdecor") local modpath = minetest.get_modpath("xdecor")
dofile(modpath.."/handlers/animations.lua") dofile(modpath .. "/handlers/animations.lua")
dofile(modpath.."/handlers/helpers.lua") dofile(modpath .. "/handlers/helpers.lua")
dofile(modpath.."/handlers/nodeboxes.lua") dofile(modpath .. "/handlers/nodeboxes.lua")
dofile(modpath.."/handlers/registration.lua") dofile(modpath .. "/handlers/registration.lua")
dofile(modpath.."/src/alias.lua") dofile(modpath .. "/src/nodes.lua")
dofile(modpath.."/src/nodes.lua") dofile(modpath .. "/src/recipes.lua")
dofile(modpath.."/src/recipes.lua")
local subpart = { local subpart = {
"chess", "chess",
@ -34,13 +20,13 @@ local subpart = {
"mailbox", "mailbox",
"mechanisms", "mechanisms",
"rope", "rope",
"workbench" "workbench",
} }
for _, name in pairs(subpart) do for _, name in ipairs(subpart) do
local enable = minetest.settings:get_bool("enable_xdecor_"..name) local enable = minetest.settings:get_bool("enable_xdecor_" .. name)
if enable or enable == nil then if enable or enable == nil then
dofile(modpath.."/src/"..name..".lua") dofile(modpath .. "/src/" .. name .. ".lua")
end end
end end

154
xdecor/locale/template.txt Normal file
View file

@ -0,0 +1,154 @@
# textdomain: xdecor
### chess.lua ###
Black Bishop=
Black King=
Black Knight=
Black Pawn=
Black Queen=
Black Rook=
Chess=
Chess Board=
Dumb AI=
Multiplayer=
New game=
Select a mode:=
Singleplayer=
Someone else plays black pieces!=
Someone else plays white pieces!=
White Bishop=
White King=
White Knight=
White Pawn=
White Queen=
White Rook=
You can't dig the chessboard, a game has been started. Reset it first if you're a current player, or dig it again in @1=
You can't reset the chessboard, a game has been started. If you aren't a current player, try again in @1=
check=
### cooking.lua ###
Bowl=
Bowl of soup=
Cauldron=
Cauldron (active) - Drop foods inside to make a soup=
Cauldron (active) - Use a bowl to eat the soup=
Cauldron (empty)=
Cauldron (idle)=
No room in your inventory to add a bowl of soup.=
No room in your inventory to add a bucket of water.=
### enchanting.lua ###
Axe=
Bronze=
Diamond=
Durability=
Efficiency=
Enchanted @1 @2 @3=
Enchantment Table=
Mese=
Pickaxe=
Sharpness=
Shovel=
Steel=
Sword=
Your tool digs faster=
Your tool last longer=
Your weapon inflicts more damages=
### hive.lua ###
Artificial Hive=
Bees are busy making honey…=
Honey=
### itemframe.lua ###
@1 (owned by @2)=
Item Frame=
### mailbox.lua ###
@1's Mailbox=
Last donators=
Mailbox=
Send your goods to@n@1=
The mailbox is full.=
### mechanisms.lua ###
Lever=
Stone Pressure Plate=
Wooden Pressure Plate=
### nodes.lua ###
Bamboo Frame=
Baricade=
Barrel=
Cactus Brick=
Candle=
Chainlink=
Chair=
Coal Stone Tile=
Cobweb=
Cushion=
Cushion Block=
Desert Stone Tile=
Empty Shelf=
Ender Chest=
Garden Stone Path=
Half Wooden Cabinet=
Hardened Clay=
Iron Light Box=
Ivy=
Japanese Door=
Lantern=
Moon Brick=
Multi Shelf=
Packed Ice=
Painting=
Potted Geranium=
Potted Rose=
Potted Tulip=
Potted Viola=
Potted White Dandelion=
Potted Yellow Dandelion=
Prison Door=
Red Curtain=
Runestone=
Rusty Iron Bars=
Rusty Prison Door=
Screen Door=
Slide Door=
Stone Tile=
Table=
Tatami=
Television=
Trampoline=
Wood Frame=
Wood Framed Glass=
Wooden Cabinet=
Wooden Light Box=
Wooden Tile=
Woodglass Door=
### rope.lua ###
Rope=
### workbench.lua ###
Back=
Crafting=
Cut=
Hammer=
Repair=
Storage=
Work Bench=

152
xdecor/locale/xdecor.de.tr Normal file
View file

@ -0,0 +1,152 @@
# textdomain: xdecor
### chess.lua ###
Black Bishop=schwarzer Läufer
Black King=schwarter König
Black Knight=schwarzes Pferd
Black Pawn=schwarzer Bauer
Black Queen=schwarze Dame
Black Rook=schwarzer Turm
Chess=Schach
Chess Board=Schachbrett
Dumb AI=dumme KI
Multiplayer=Mehrspieler
New game=neues Spiel
Select a mode:=Wähle einen Modus:
Singleplayer=Einzelspieler
Someone else plays black pieces!=Jemand anderes spielt Schwarz!
Someone else plays white pieces!=Jemand anderes spielt Weiß!
White Bishop=weißer Läufer
White King=weißer König
White Knight=weißes Pferd
White Pawn=weißer Bauer
White Queen=weiße Dame
White Rook=weißer Turm
You can't dig the chessboard, a game has been started. Reset it first if you're a current player, or dig it again in @1=Das Schachbrett ist während eines Schachspieles nicht abbaubar. Setze das Spiel zurück, falls du ein Mitspieler bist oder versuche es in @1 erneut.
You can't reset the chessboard, a game has been started. If you aren't a current player, try again in @1=Das Schachbrett kann nicht zurückgesetzt werden, da ein Spiel im Gang ist. Versuche es in @1 erneut, falls du kein Mitspieler bist.
check=Schach
### cooking.lua ###
Bowl=Schüssel
Bowl of soup=Suppenschüssel
Cauldron=Kessel
Cauldron (active) - Drop foods inside to make a soup=Kessel (aktiv) - Nahrungsmittel einwerfen, um Suppe zu machen.
Cauldron (active) - Use a bowl to eat the soup=Kessel (aktiv) - Benutze eine Schüssel, um die Suppe zu essen
Cauldron (empty)=Kessel (leer)
Cauldron (idle)=Kessel (untätig)
No room in your inventory to add a bowl of soup.=Zu wenig Platz im Inventar für eine Schüssel voll Suppe.
No room in your inventory to add a bucket of water.=Zu wenig Platz im Inventar für einen Eimer Wasser.
### enchanting.lua ###
Axe=axt
Bronze=Bronze
Diamond=Diamant
Durability=Haltbarkeit
Efficiency=Effizienz
Enchanted @1 @2 @3=verzauberte(s) @1@2 @3
Enchantment Table=Zaubertisch
Mese=Mese
Pickaxe=Spitzhacke
Sharpness=Schärfe
Shovel=Schaufel
Steel=Eisen
Sword=Schwert
Your tool digs faster=Dein Werkzeug arbeitet schneller
Your tool last longer=Dein Werkzeug hält länger
Your weapon inflicts more damages=Deine Waffe erzeugt mehr Schaden
### hive.lua ###
Artificial Hive=künstlicher Bienenstock
Bees are busy making honey…=Bienen sind beschäftigt, Honig herzustellen.
Honey=Honig
### itemframe.lua ###
@1 (owned by @2)=@1 (gehört @2)
Item Frame=Objektrahmen
### mailbox.lua ###
@1's Mailbox=Briefkasten von @1
Last donators=letzte Spender
Mailbox=Briefkasten
Send your goods to@n@1=Sende deine Waren an@n@1
The mailbox is full.=Der Briefkasten ist voll.
### mechanisms.lua ###
Lever=Schalthebel
Stone Pressure Plate=steinerne Druckplatte
Wooden Pressure Plate=hölzerne Druckplatte
### nodes.lua ###
Bamboo Frame=Bambusgerüst
Baricade=Barrikade
Barrel=Fass
Cactus Brick=Kaktusstein
Candle=Kerze
Chainlink=Kettenvorhang
Chair=einfacher Stuhl
Coal Stone Tile=Kohle-Stein-Block
Cobweb=Spinnenwebe
Cushion=Sitzkissen
Cushion Block=Sitzkissenblock
Desert Stone Tile=Wüstensteinblock
Empty Shelf=leeres Regal
Ender Chest=Endertruhe
Garden Stone Path=Steingartenweg
Half Wooden Cabinet=halber Holzschrank
Hardened Clay=gehärteter Ton
Iron Light Box=eiseneingefasster Lichtblock
Ivy=Efeu
Japanese Door=japanische Tür
Lantern=Laterne
Moon Brick=Naturziegelwand
Multi Shelf=Mehrzweckregal
Packed Ice=Packeis
Painting=Gemälde
Potted Geranium=Geranien im Topf
Potted Rose=Rosen im Topf
Potted Tulip=Tulpen im Topf
Potted Viola=Veilchen im Topf
Potted White Dandelion=weißer Löwenzahn im Topf
Potted Yellow Dandelion=gelber Löwenzahn im Topf
Prison Door=Verliestür
Red Curtain=roter Vorhang
Runestone=Runensteinblock
Rusty Iron Bars=rostige Eisenstäbe
Rusty Prison Door=rostige Verliestür
Screen Door=französische Glastür
Slide Door=Schiebetür
Stone Tile=steinerner Block
Table=einfacher Tisch
Tatami=Tatamimatte
Television=Fernseher
Trampoline=Trampolin
Wood Frame=hölzerner Zierrahmen
Wood Framed Glass=holzeingefasstes Glas
Wooden Cabinet=Holzschrank
Wooden Light Box=holzeingefasster Lichtblock
Wooden Tile=hölzerner Dekorblock
Woodglass Door=Tür mit Lichtausschnitt
### rope.lua ###
Rope=Seil
### workbench.lua ###
Back=Zurück
Crafting=Fertigung
Cut=Zuschnitt
Hammer=Hämmerchen
Repair=Reparatur
Storage=Aufbewahrung
Work Bench=Werkbank

154
xdecor/locale/xdecor.fr.tr Normal file
View file

@ -0,0 +1,154 @@
# textdomain: xdecor
### chess.lua ###
Black Bishop=Fou noir
Black King=Roi noir
Black Knight=Cavalier noir
Black Pawn=Pion noir
Black Queen=Reine noire
Black Rook=Tour noire
Chess=Echecs
Chess Board=Echiquier
Dumb AI=IA stupide
Multiplayer=Multijoueur
New game=Nouvelle partie
Select a mode:=Sélectionnez un mode de jeu:
Singleplayer=Solo
Someone else plays black pieces!=Quelquun dautre joue les pièces noires !
Someone else plays white pieces!=Quelquun dautre joue les pièces blanches !
White Bishop=Fou blanc
White King=Roi blanc
White Knight=Cavalier blanc
White Pawn=Pion blanc
White Queen=Reine blanche
White Rook=Tour blanche
You can't dig the chessboard, a game has been started. Reset it first if you're a current player, or dig it again in @1=Vous ne pouvez pas récupérer léchiquier, une partie à été commencée. Remettez le à zéro si vous cest votre tour de jouer, ou réessayez dans @1
You can't reset the chessboard, a game has been started. If you aren't a current player, try again in @1=Vous ne pouvez pas mettre à zéro léchiquier, une partie a été commencée. Si ce nest pas votre tour de jouer, réessayez dans @1
check=échec
### cooking.lua ###
Bowl=Bol
Bowl of soup=Bol de soupe
Cauldron=Chaudron
Cauldron (active) - Drop foods inside to make a soup=Chaudron (actif) - Placez des ingrédients à lintérieur pour faire une soupe
Cauldron (active) - Use a bowl to eat the soup=Chaudron (actif) - Utilisez un bol pour boire la soupe
Cauldron (empty)=Chaudron (vide)
Cauldron (idle)=Chaudron (inactif)
No room in your inventory to add a bowl of soup.=Pas de place dans votre inventaire pour ajouter un bol de soupe.
No room in your inventory to add a bucket of water.=Pas de place dans votre inventaire pour ajouter un seau deau.
### enchanting.lua ###
Axe=Hache
Bronze=Bronze
Diamond=Diamant
Durability=Durabilité
Efficiency=Efficacité
Enchanted @1 @2 @3=@2 en @1 enchantée @3
Enchantment Table=Table denchantements
Mese=Mese
Pickaxe=Pioche
Sharpness=Tranchant
Shovel=Pelle
Steel=Fer
Sword=Épée
Your tool digs faster=Votre outil creuse plus vite
Your tool last longer=Votre outil dure plus longtemps
Your weapon inflicts more damages=Votre arme inflige plus de dégâts
### hive.lua ###
Artificial Hive=Ruche artificielle
Bees are busy making honey…=Les abeilles sont occupées à fabriquer du miel…
Honey=Miel
### itemframe.lua ###
@1 (owned by @2)=@1 (propriété de @2)
Item Frame=Cadre
### mailbox.lua ###
@1's Mailbox=Boite aux lettres de @1
Last donators=Derniers donateurs
Mailbox=Boite aux lettres
Send your goods to@n@1=Envoyer vos biens à@n@1
The mailbox is full.=La boite aux lettres est pleine.
### mechanisms.lua ###
Lever=Levier
Stone Pressure Plate=Plaque de pression en pierre
Wooden Pressure Plate=Plaque de pression en bois
### nodes.lua ###
Bamboo Frame=Cadre en bambou
Baricade=Barricade
Barrel=Tonneau
Cactus Brick=Brique en cactus
Candle=Bougie
Chainlink=Maillon de chaîne
Chair=Chaise
Coal Stone Tile=Carreau en charbon et pierre
Cobweb=Toile daraignée
Cushion=Coussin
Cushion Block=Bloc de coussin
Desert Stone Tile=Carreau en pierre du désert
Empty Shelf=Étagère vide
Ender Chest=Coffre de lEnd
Garden Stone Path=Chemin de pierres de jardin
Half Wooden Cabinet=Demi meuble en bois
Hardened Clay=Argile durcie
Iron Light Box=Boite lumineuse en fer
Ivy=Lierre
Japanese Door=Porte japonaise
Lantern=Lanterne
Moon Brick=Brique lunaire
Multi Shelf=Étagères multiple
Packed Ice=Glace compactée
Painting=Tableau
Potted Geranium=Géranium en pot
Potted Rose=Rose en pot
Potted Tulip=Tulipe en pot
Potted Viola=Violette en pot
Potted White Dandelion=Pissenlit blanc en pot
Potted Yellow Dandelion=Pissenlit jaune en pot
Prison Door=Porte de prison
Red Curtain=Rideaux rouge
Runestone=Pierre runique
Rusty Iron Bars=Barreaux en fer rouillé
Rusty Prison Door=Barreaux de prison rouillés
Screen Door=Porte avec moustiquaire
Slide Door=Porte coulissante
Stone Tile=Carreau en pierre
Table=Table
Tatami=Tatami
Television=Télévision
Trampoline=Trampoline
Wood Frame=Cadre en bois
Wood Framed Glass=Verre encadré par du bois
Wooden Cabinet=Meuble en bois
Wooden Light Box=Boite lumineuse en bois
Wooden Tile=Carreau en bois
Woodglass Door=Porte vitrée
### rope.lua ###
Rope=Corde
### workbench.lua ###
Back=Retour
Crafting=Fabrication
Cut=Couper
Hammer=Marteau
Repair=Réparer
Storage=Stockage
Work Bench=Atelier

154
xdecor/locale/xdecor.it.tr Normal file
View file

@ -0,0 +1,154 @@
# textdomain: xdecor
# Author: Salvo 'LtWorf' Tomaselli <tiposchi@tiscali.it>
### chess.lua ###
Black Bishop=Alfiere nero
Black King=Re nero
Black Knight=Cavallo nero
Black Pawn=Pedone nero
Black Queen=Regina nera
Black Rook=Torre nera
Chess=Scacchi
Chess Board=Scacchiera
Dumb AI=AI stupida
Multiplayer=Multigiocatore
New game=Nuova partita
Select a mode:=Selezionare una modalità
Singleplayer=Singolo giocatore
Someone else plays black pieces!=Qualcun altro gioca con il nero!
Someone else plays white pieces!=Qualcun altro gioca con il bianco!
White Bishop=Alfiere bianco
White King=Re bianco
White Knight=Cavallo bianco
White Pawn=Pedone bianco
White Queen=Regina bianca
White Rook=Torre bianca
You can't dig the chessboard, a game has been started. Reset it first if you're a current player, or dig it again in @1=Non si può scavare la scacchiera, una partita è in corso. Resettarla se si è uno dei giocatori, o riprovare in @1
You can't reset the chessboard, a game has been started. If you aren't a current player, try again in @1=Non si può resettare la partita, un gioco è in corso. Se non si è uno dei giocatori, riprovare in @1
check=scacco
### cooking.lua ###
Bowl=Ciotola
Bowl of soup=Ciotola di zuppa
Cauldron=Calderone
Cauldron (active) - Drop foods inside to make a soup=Calderone (attivo) - Mettere gli ingredienti all'interno per fare una zuppa.
Cauldron (active) - Use a bowl to eat the soup=Calderone (actif) - Utilizzare una ciotola per mangiare la zuppa
Cauldron (empty)=Calderone (vuoto)
Cauldron (idle)=Calderone (inattivo)
No room in your inventory to add a bowl of soup.=Non c'è spazio nell'inventario per aggiungere una ciotola di zuppa.
No room in your inventory to add a bucket of water.=Non c'è spazio nell'inventario per aggiungere un secchio di acqua.
### enchanting.lua ###
Axe=Ascia
Bronze=Bronzo
Diamond=Diamante
Durability=Durabilità
Efficiency=Efficacia
Enchanted @1 @2 @3=@2 su @1 incantesimo @3
Enchantment Table=Tavolo per migliorie
Mese=Mese
Pickaxe=Piccone
Sharpness=Affilatezza
Shovel=Pala
Steel=Acciaio
Sword=Spada
Your tool digs faster=Il tuo utensile scava più rapidamente
Your tool last longer=Il tuo utensile dura di più
Your weapon inflicts more damages=La tua arma infligge più danno
### hive.lua ###
Artificial Hive=Favo artificiale
Bees are busy making honey…=Le api sono occupate a fare il miele…
Honey=Miele
### itemframe.lua ###
@1 (owned by @2)=@1 (proprietà di @2)
Item Frame=Teca
### mailbox.lua ###
@1's Mailbox=Cassetta delle lettere di @1
Last donators=Ultimi donatori
Mailbox=Cassetta delle lettere
Send your goods to@n@1=Invia i tuoi item a@n@1
The mailbox is full.=La cassetta delle lettere è piena
### mechanisms.lua ###
Lever=Leva
Stone Pressure Plate=Placca di pressione di pietra
Wooden Pressure Plate=Placca di pressione di legno
### nodes.lua ###
Bamboo Frame=Cornice di bambù
Baricade=Barricata
Barrel=Barile
Cactus Brick=Mattone di cactus
Candle=Candela
Chainlink=Cotta di maglia
Chair=Sedia
Coal Stone Tile=Mattonella di pietra di carbone
Cobweb=Ragnatela
Cushion=Cuscino
Cushion Block=Blocco di cuscini
Desert Stone Tile=Mattonella di pietra del deserto
Empty Shelf=Mensola vuota
Ender Chest=Baule ender
Garden Stone Path=Sentiero da giardino in pietra
Half Wooden Cabinet=Stipo di legno a metà
Hardened Clay=Argilla indurita
Iron Light Box=Scatola luminosa di ferro
Ivy=Edera
Japanese Door=Porta giapponese
Lantern=Lanterna
Moon Brick=Mattone lunare
Multi Shelf=Mensole
Packed Ice=Ghiaccio compatto
Painting=Dipinto
Potted Geranium=Geranio in vaso
Potted Rose=Rosa in vaso
Potted Tulip=Tulipano in vaso
Potted Viola=Violetta in vaso
Potted White Dandelion=Soffione bianco in vaso
Potted Yellow Dandelion=Soffione giallo in vaso
Prison Door=Porta di prigione
Red Curtain=Tenda rossa
Runestone=Pietra runica
Rusty Iron Bars=Sbarre di prigione arrugginite
Rusty Prison Door=Porta di prigione arrugginita
Screen Door=Porta a schermo
Slide Door=Porta scorrevole
Stone Tile=Mattonella di pietra
Table=Tavolo
Tatami=Tatami
Television=Televisione
Trampoline=Trampolino
Wood Frame=Cornice in legno
Wood Framed Glass=Cornice in legno con vetro
Wooden Cabinet=Stipo di legno
Wooden Light Box=Mattonella luminosa di legno
Wooden Tile=Mattonella di legno
Woodglass Door=Porta di vetro
### rope.lua ###
Rope=Corda
### workbench.lua ###
Back=Indietro
Crafting=Fabbricare
Cut=Tagliare
Hammer=Martello
Repair=Riparare
Storage=Conservare
Work Bench=Banco da lavoro

View file

@ -1 +1,5 @@
name = xdecor name = xdecor
description = A decoration mod meant to be simple and well-featured.
depends = default, bucket, doors, farming, stairs, xpanes
optional_depends = fire, oresplus, moreblocks, mesecons
min_minetest_version = 5.1.0

View file

@ -1 +0,0 @@
minetest.register_alias("xdecor:crafting_guide", "craftguide:book")

File diff suppressed because it is too large Load diff

View file

@ -1,4 +1,5 @@
local cauldron, sounds = {}, {} local cauldron, sounds = {}, {}
local S = minetest.get_translator("xdecor")
-- Add more ingredients here that make a soup. -- Add more ingredients here that make a soup.
local ingredients_list = { local ingredients_list = {
@ -17,7 +18,9 @@ cauldron.cbox = {
function cauldron.stop_sound(pos) function cauldron.stop_sound(pos)
local spos = minetest.hash_node_position(pos) local spos = minetest.hash_node_position(pos)
if sounds[spos] then minetest.sound_stop(sounds[spos]) end if sounds[spos] then
minetest.sound_stop(sounds[spos])
end
end end
function cauldron.idle_construct(pos) function cauldron.idle_construct(pos)
@ -29,11 +32,14 @@ end
function cauldron.boiling_construct(pos) function cauldron.boiling_construct(pos)
local spos = minetest.hash_node_position(pos) local spos = minetest.hash_node_position(pos)
sounds[spos] = minetest.sound_play("xdecor_boiling_water", { sounds[spos] = minetest.sound_play("xdecor_boiling_water", {
pos=pos, max_hear_distance=5, gain=0.8, loop=true pos = pos,
max_hear_distance = 5,
gain = 0.8,
loop = true
}) })
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
meta:set_string("infotext", "Cauldron (active) - Drop some foods inside to make a soup") meta:set_string("infotext", S("Cauldron (active) - Drop foods inside to make a soup"))
local timer = minetest.get_node_timer(pos) local timer = minetest.get_node_timer(pos)
timer:start(5.0) timer:start(5.0)
@ -51,29 +57,31 @@ function cauldron.filling(pos, node, clicker, itemstack)
inv:add_item("main", "bucket:bucket_water 1") inv:add_item("main", "bucket:bucket_water 1")
else else
minetest.chat_send_player(clicker:get_player_name(), minetest.chat_send_player(clicker:get_player_name(),
"No room in your inventory to add a bucket of water.") S("No room in your inventory to add a bucket of water."))
return itemstack return itemstack
end end
else else
itemstack:replace("bucket:bucket_water") itemstack:replace("bucket:bucket_water")
end end
minetest.set_node(pos, {name="xdecor:cauldron_empty", param2=node.param2}) minetest.set_node(pos, {name = "xdecor:cauldron_empty", param2 = node.param2})
elseif wield_item:sub(-6) == "_water" and node.name:sub(-6) == "_empty" then elseif wield_item:sub(-6) == "_water" and node.name:sub(-6) == "_empty" then
minetest.set_node(pos, {name="xdecor:cauldron_idle", param2=node.param2}) minetest.set_node(pos, {name = "xdecor:cauldron_idle", param2 = node.param2})
itemstack:replace("bucket:bucket_empty") itemstack:replace("bucket:bucket_empty")
end end
return itemstack return itemstack
end end
end end
function cauldron.idle_timer(pos) function cauldron.idle_timer(pos)
local below_node = {x=pos.x, y=pos.y-1, z=pos.z} local below_node = {x = pos.x, y = pos.y - 1, z = pos.z}
if not minetest.get_node(below_node).name:find("fire") then if not minetest.get_node(below_node).name:find("fire") then
return true return true
end end
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
minetest.set_node(pos, {name="xdecor:cauldron_boiling", param2=node.param2}) minetest.set_node(pos, {name = "xdecor:cauldron_boiling", param2 = node.param2})
return true return true
end end
@ -82,13 +90,17 @@ local function eatable(itemstring)
local item = itemstring:match("[%w_:]+") local item = itemstring:match("[%w_:]+")
local on_use_def = minetest.registered_items[item].on_use local on_use_def = minetest.registered_items[item].on_use
if not on_use_def then return end if not on_use_def then return end
return string.format("%q", string.dump(on_use_def)):find("item_eat") return string.format("%q", string.dump(on_use_def)):find("item_eat")
end end
function cauldron.boiling_timer(pos) function cauldron.boiling_timer(pos)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
local objs = minetest.get_objects_inside_radius(pos, 0.5) local objs = minetest.get_objects_inside_radius(pos, 0.5)
if not next(objs) then return true end
if not next(objs) then
return true
end
local ingredients = {} local ingredients = {}
for _, obj in pairs(objs) do for _, obj in pairs(objs) do
@ -96,60 +108,68 @@ function cauldron.boiling_timer(pos)
local itemstring = obj:get_luaentity().itemstring local itemstring = obj:get_luaentity().itemstring
local food = itemstring:match(":([%w_]+)") local food = itemstring:match(":([%w_]+)")
for _, ingredient in pairs(ingredients_list) do for _, ingredient in ipairs(ingredients_list) do
if food and (eatable(itemstring) or food:find(ingredient)) then if food and (eatable(itemstring) or food:find(ingredient)) then
ingredients[#ingredients+1] = food break ingredients[#ingredients + 1] = food
break
end end
end end
end end
end end
if #ingredients >= 2 then if #ingredients >= 2 then
for _, obj in pairs(objs) do obj:remove() end for _, obj in pairs(objs) do
minetest.set_node(pos, {name="xdecor:cauldron_soup", param2=node.param2}) obj:remove()
end
minetest.set_node(pos, {name = "xdecor:cauldron_soup", param2 = node.param2})
end end
local node_under = {x=pos.x, y=pos.y-1, z=pos.z} local node_under = {x = pos.x, y = pos.y - 1, z = pos.z}
if not minetest.get_node(node_under).name:find("fire") then if not minetest.get_node(node_under).name:find("fire") then
minetest.set_node(pos, {name="xdecor:cauldron_idle", param2=node.param2}) minetest.set_node(pos, {name = "xdecor:cauldron_idle", param2 = node.param2})
end end
return true return true
end end
function cauldron.take_soup(pos, node, clicker, itemstack) function cauldron.take_soup(pos, node, clicker, itemstack)
local inv = clicker:get_inventory() local inv = clicker:get_inventory()
local wield_item = clicker:get_wielded_item() local wield_item = clicker:get_wielded_item()
local item_name = wield_item:get_name()
if wield_item:get_name() == "xdecor:bowl" then if item_name == "xdecor:bowl" or item_name == "farming:bowl" then
if wield_item:get_count() > 1 then if wield_item:get_count() > 1 then
if inv:room_for_item("main", "xdecor:bowl_soup 1") then if inv:room_for_item("main", "xdecor:bowl_soup 1") then
itemstack:take_item() itemstack:take_item()
inv:add_item("main", "xdecor:bowl_soup 1") inv:add_item("main", "xdecor:bowl_soup 1")
else else
minetest.chat_send_player(clicker:get_player_name(), minetest.chat_send_player(clicker:get_player_name(),
"No room in your inventory to add a bowl of soup.") S("No room in your inventory to add a bowl of soup."))
return itemstack return itemstack
end end
else else
itemstack:replace("xdecor:bowl_soup 1") itemstack:replace("xdecor:bowl_soup 1")
end end
minetest.set_node(pos, {name="xdecor:cauldron_empty", param2=node.param2}) minetest.set_node(pos, {name = "xdecor:cauldron_empty", param2 = node.param2})
end end
return itemstack return itemstack
end end
xdecor.register("cauldron_empty", { xdecor.register("cauldron_empty", {
description = "Cauldron", description = S("Cauldron"),
groups = {cracky=2, oddly_breakable_by_hand=1}, groups = {cracky=2, oddly_breakable_by_hand=1},
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
tiles = {"xdecor_cauldron_top_empty.png", "xdecor_cauldron_sides.png"}, tiles = {"xdecor_cauldron_top_empty.png", "xdecor_cauldron_sides.png"},
infotext = "Cauldron (empty)", infotext = S("Cauldron (empty)"),
collision_box = xdecor.pixelbox(16, cauldron.cbox),
on_rightclick = cauldron.filling,
on_construct = function(pos) on_construct = function(pos)
cauldron.stop_sound(pos) cauldron.stop_sound(pos)
end, end,
on_rightclick = cauldron.filling,
collision_box = xdecor.pixelbox(16, cauldron.cbox)
}) })
xdecor.register("cauldron_idle", { xdecor.register("cauldron_idle", {
@ -157,58 +177,66 @@ xdecor.register("cauldron_idle", {
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
tiles = {"xdecor_cauldron_top_idle.png", "xdecor_cauldron_sides.png"}, tiles = {"xdecor_cauldron_top_idle.png", "xdecor_cauldron_sides.png"},
drop = "xdecor:cauldron_empty", drop = "xdecor:cauldron_empty",
infotext = "Cauldron (idle)", infotext = S("Cauldron (idle)"),
collision_box = xdecor.pixelbox(16, cauldron.cbox), collision_box = xdecor.pixelbox(16, cauldron.cbox),
on_rightclick = cauldron.filling, on_rightclick = cauldron.filling,
on_construct = cauldron.idle_construct, on_construct = cauldron.idle_construct,
on_timer = cauldron.idle_timer on_timer = cauldron.idle_timer,
}) })
xdecor.register("cauldron_boiling", { xdecor.register("cauldron_boiling", {
groups = {cracky=2, oddly_breakable_by_hand=1, not_in_creative_inventory=1}, groups = {cracky=2, oddly_breakable_by_hand=1, not_in_creative_inventory=1},
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
drop = "xdecor:cauldron_empty", drop = "xdecor:cauldron_empty",
infotext = "Cauldron (active) - Drop foods inside to make a soup", infotext = S("Cauldron (active) - Drop foods inside to make a soup"),
damage_per_second = 2, damage_per_second = 2,
tiles = {{name="xdecor_cauldron_top_anim_boiling_water.png", tiles = {
animation={type="vertical_frames", length=3.0}}, {
"xdecor_cauldron_sides.png"}, name = "xdecor_cauldron_top_anim_boiling_water.png",
animation = {type = "vertical_frames", length = 3.0}
},
"xdecor_cauldron_sides.png"
},
collision_box = xdecor.pixelbox(16, cauldron.cbox), collision_box = xdecor.pixelbox(16, cauldron.cbox),
on_rightclick = cauldron.filling, on_rightclick = cauldron.filling,
on_construct = cauldron.boiling_construct, on_construct = cauldron.boiling_construct,
on_timer = cauldron.boiling_timer,
on_destruct = function(pos) on_destruct = function(pos)
cauldron.stop_sound(pos) cauldron.stop_sound(pos)
end, end,
on_timer = cauldron.boiling_timer
}) })
xdecor.register("cauldron_soup", { xdecor.register("cauldron_soup", {
groups = {cracky=2, oddly_breakable_by_hand=1, not_in_creative_inventory=1}, groups = {cracky = 2, oddly_breakable_by_hand = 1, not_in_creative_inventory = 1},
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
drop = "xdecor:cauldron_empty", drop = "xdecor:cauldron_empty",
infotext = "Cauldron (active) - Use a bowl to eat the soup", infotext = S("Cauldron (active) - Use a bowl to eat the soup"),
damage_per_second = 2, damage_per_second = 2,
tiles = {{name="xdecor_cauldron_top_anim_soup.png", tiles = {
animation={type="vertical_frames", length=3.0}}, {
"xdecor_cauldron_sides.png"}, name = "xdecor_cauldron_top_anim_soup.png",
animation = {type = "vertical_frames", length = 3.0}
},
"xdecor_cauldron_sides.png"
},
collision_box = xdecor.pixelbox(16, cauldron.cbox), collision_box = xdecor.pixelbox(16, cauldron.cbox),
on_rightclick = cauldron.take_soup, on_rightclick = cauldron.take_soup,
on_destruct = function(pos) on_destruct = function(pos)
cauldron.stop_sound(pos) cauldron.stop_sound(pos)
end end,
}) })
-- Craft items -- Craft items
minetest.register_craftitem("xdecor:bowl", { minetest.register_craftitem("xdecor:bowl", {
description = "Bowl", description = S("Bowl"),
inventory_image = "xdecor_bowl.png", inventory_image = "xdecor_bowl.png",
wield_image = "xdecor_bowl.png", wield_image = "xdecor_bowl.png",
groups = {food_bowl = 1, flammable = 2}, groups = {food_bowl = 1, flammable = 2},
}) })
minetest.register_craftitem("xdecor:bowl_soup", { minetest.register_craftitem("xdecor:bowl_soup", {
description = "Bowl of soup", description = S("Bowl of soup"),
inventory_image = "xdecor_bowl_soup.png", inventory_image = "xdecor_bowl_soup.png",
wield_image = "xdecor_bowl_soup.png", wield_image = "xdecor_bowl_soup.png",
groups = {not_in_creative_inventory=1}, groups = {not_in_creative_inventory=1},

View file

@ -1,5 +1,8 @@
screwdriver = screwdriver or {} screwdriver = screwdriver or {}
local S = minetest.get_translator("xdecor")
local FS = function(...) return minetest.formspec_escape(S(...)) end
local ceil, abs, random = math.ceil, math.abs, math.random local ceil, abs, random = math.ceil, math.abs, math.random
local reg_tools = minetest.registered_tools
-- Cost in Mese crystal(s) for enchanting. -- Cost in Mese crystal(s) for enchanting.
local mese_cost = 1 local mese_cost = 1
@ -11,13 +14,17 @@ local enchanting = {
damages = 1, -- Sharpness damages = 1, -- Sharpness
} }
local function cap(S) return S:gsub("^%l", string.upper) end local function cap(str) return
str:gsub("^%l", string.upper)
end
local function to_percent(orig_value, final_value) local function to_percent(orig_value, final_value)
return abs(ceil(((final_value - orig_value) / orig_value) * 100)) return abs(ceil(((final_value - orig_value) / orig_value) * 100))
end end
function enchanting:get_tooltip(enchant, orig_caps, fleshy) function enchanting:get_tooltip(enchant, orig_caps, fleshy)
local bonus = {durable=0, efficiency=0, damages=0} local bonus = {durable = 0, efficiency = 0, damages = 0}
if orig_caps then if orig_caps then
bonus.durable = to_percent(orig_caps.uses, orig_caps.uses * enchanting.uses) bonus.durable = to_percent(orig_caps.uses, orig_caps.uses * enchanting.uses)
local sum_caps_times = 0 local sum_caps_times = 0
@ -28,45 +35,57 @@ function enchanting:get_tooltip(enchant, orig_caps, fleshy)
bonus.efficiency = to_percent(average_caps_time, average_caps_time - bonus.efficiency = to_percent(average_caps_time, average_caps_time -
enchanting.times) enchanting.times)
end end
if fleshy then if fleshy then
bonus.damages = to_percent(fleshy, fleshy + enchanting.damages) bonus.damages = to_percent(fleshy, fleshy + enchanting.damages)
end end
local specs = { -- not finished, to complete local specs = { -- not finished, to complete
durable = {"#00baff", " (+"..bonus.durable.."%)"}, durable = {"#00baff", " (+" .. bonus.durable .. "%)"},
fast = {"#74ff49", " (+"..bonus.efficiency.."%)"}, fast = {"#74ff49", " (+" .. bonus.efficiency .. "%)"},
sharp = {"#ffff00", " (+"..bonus.damages.."%)"}, sharp = {"#ffff00", " (+" .. bonus.damages .. "%)"},
} }
local enchant_loc = {
fast = S("Efficiency"),
durable = S("Durability"),
sharp = S("Sharpness"),
}
return minetest.colorize and minetest.colorize(specs[enchant][1], return minetest.colorize and minetest.colorize(specs[enchant][1],
"\n"..cap(enchant)..specs[enchant][2]) or "\n" .. enchant_loc[enchant] .. specs[enchant][2]) or
"\n"..cap(enchant)..specs[enchant][2] "\n" .. enchant_loc[enchant] .. specs[enchant][2]
end end
local enchant_buttons = { local enchant_buttons = {
[[ image_button[3.9,0.85;4,0.92;bg_btn.png;fast;Efficiency] "image_button[3.9,0.85;4,0.92;bg_btn.png;fast;"..FS("Efficiency").."]" ..
image_button[3.9,1.77;4,1.12;bg_btn.png;durable;Durability] ]], "image_button[3.9,1.77;4,1.12;bg_btn.png;durable;"..FS("Durability").."]",
"image_button[3.9,2.9;4,0.92;bg_btn.png;sharp;Sharpness]", "image_button[3.9,2.9;4,0.92;bg_btn.png;sharp;"..FS("Sharpness").."]",
} }
function enchanting.formspec(pos, num) function enchanting.formspec(pos, num)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local formspec = [[ size[9,9;] local formspec = [[
size[9,8.6;]
no_prepend[]
bgcolor[#080808BB;true] bgcolor[#080808BB;true]
background[0,0;9,9;ench_ui.png] listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]
background9[0,0;9,9;ench_ui.png;6]
list[context;tool;0.9,2.9;1,1;] list[context;tool;0.9,2.9;1,1;]
list[context;mese;2,2.9;1,1;] list[context;mese;2,2.9;1,1;]
list[current_player;main;0.5,4.5;8,4;] list[current_player;main;0.55,4.5;8,4;]
listring[current_player;main] listring[current_player;main]
listring[context;tool] listring[context;tool]
listring[current_player;main] listring[current_player;main]
listring[context;mese] listring[context;mese]
image[2,2.9;1,1;mese_layout.png] image[2,2.9;1,1;mese_layout.png]
tooltip[sharp;Your weapon inflicts more damages] ]]
tooltip[durable;Your tool last longer] .."tooltip[sharp;"..FS("Your weapon inflicts more damages").."]"
tooltip[fast;Your tool digs faster] ]] .."tooltip[durable;"..FS("Your tool last longer").."]"
..default.gui_slots..default.get_hotbar_bg(0.5,4.5) .."tooltip[fast;"..FS("Your tool digs faster").."]"
..default.gui_slots .. default.get_hotbar_bg(0.55, 4.5)
formspec = formspec..(enchant_buttons[num] or "") formspec = formspec .. (enchant_buttons[num] or "")
meta:set_string("formspec", formspec) meta:set_string("formspec", formspec)
end end
@ -78,7 +97,7 @@ function enchanting.on_put(pos, listname, _, stack)
"sword", "sword",
} }
for idx, tools in pairs(tool_groups) do for idx, tools in ipairs(tool_groups) do
if tools:find(stackname:match(":(%w+)")) then if tools:find(stackname:match(":(%w+)")) then
enchanting.formspec(pos, idx) enchanting.formspec(pos, idx)
end end
@ -93,11 +112,14 @@ function enchanting.fields(pos, _, fields, sender)
local mese = inv:get_stack("mese", 1) local mese = inv:get_stack("mese", 1)
local orig_wear = tool:get_wear() local orig_wear = tool:get_wear()
local mod, name = tool:get_name():match("(.*):(.*)") local mod, name = tool:get_name():match("(.*):(.*)")
local enchanted_tool = (mod or "")..":enchanted_"..(name or "").."_"..next(fields) local enchanted_tool = (mod or "") .. ":enchanted_" .. (name or "") .. "_" .. next(fields)
if mese:get_count() >= mese_cost and minetest.registered_tools[enchanted_tool] then if mese:get_count() >= mese_cost and reg_tools[enchanted_tool] then
minetest.sound_play("xdecor_enchanting", { minetest.sound_play("xdecor_enchanting", {
to_player=sender:get_player_name(), gain=0.8}) to_player = sender:get_player_name(),
gain = 0.8
})
tool:replace(enchanted_tool) tool:replace(enchanted_tool)
tool:add_wear(orig_wear) tool:add_wear(orig_wear)
mese:take_item(mese_cost) mese:take_item(mese_cost)
@ -112,37 +134,43 @@ function enchanting.dig(pos)
end end
local function allowed(tool) local function allowed(tool)
if not tool then return false end if not tool then return end
for item in pairs(minetest.registered_tools) do
if item:find("enchanted_"..tool) then return true end for item in pairs(reg_tools) do
if item:find("enchanted_" .. tool) then
return true
end
end end
return false
end end
function enchanting.put(_, listname, _, stack) function enchanting.put(_, listname, _, stack)
local stackname = stack:get_name() local stackname = stack:get_name()
if listname == "mese" and stackname == "default:mese_crystal" then if listname == "mese" and (stackname == "default:mese_crystal" or
stackname == "imese:industrial_mese_crystal") then
return stack:get_count() return stack:get_count()
elseif listname == "tool" and allowed(stackname:match("[^:]+$")) then elseif listname == "tool" and allowed(stackname:match("[^:]+$")) then
return 1 return 1
end end
return 0 return 0
end end
function enchanting.on_take(pos, listname) function enchanting.on_take(pos, listname)
if listname == "tool" then enchanting.formspec(pos, nil) end if listname == "tool" then
enchanting.formspec(pos)
end
end end
function enchanting.construct(pos) function enchanting.construct(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
meta:set_string("infotext", "Enchantment Table") meta:set_string("infotext", S("Enchantment Table"))
enchanting.formspec(pos, nil) enchanting.formspec(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
inv:set_size("tool", 1) inv:set_size("tool", 1)
inv:set_size("mese", 1) inv:set_size("mese", 1)
minetest.add_entity({x=pos.x, y=pos.y+0.85, z=pos.z}, "xdecor:book_open") minetest.add_entity({x = pos.x, y = pos.y + 0.85, z = pos.z}, "xdecor:book_open")
local timer = minetest.get_node_timer(pos) local timer = minetest.get_node_timer(pos)
timer:start(0.5) timer:start(0.5)
end end
@ -160,39 +188,45 @@ end
function enchanting.timer(pos) function enchanting.timer(pos)
local num = #minetest.get_objects_inside_radius(pos, 0.9) local num = #minetest.get_objects_inside_radius(pos, 0.9)
if num == 0 then if num == 0 then
minetest.add_entity({x=pos.x, y=pos.y+0.85, z=pos.z}, "xdecor:book_open") minetest.add_entity({x = pos.x, y = pos.y + 0.85, z = pos.z}, "xdecor:book_open")
end end
local minp = {x=pos.x-2, y=pos.y, z=pos.z-2} local minp = {x = pos.x - 2, y = pos.y, z = pos.z - 2}
local maxp = {x=pos.x+2, y=pos.y+1, z=pos.z+2} local maxp = {x = pos.x + 2, y = pos.y + 1, z = pos.z + 2}
local bookshelves = minetest.find_nodes_in_area(minp, maxp, "default:bookshelf") local bookshelves = minetest.find_nodes_in_area(minp, maxp, "default:bookshelf")
if #bookshelves == 0 then return true end if #bookshelves == 0 then
return true
end
local bookshelf_pos = bookshelves[random(1, #bookshelves)] local bookshelf_pos = bookshelves[random(1, #bookshelves)]
local x = pos.x - bookshelf_pos.x local x = pos.x - bookshelf_pos.x
local y = bookshelf_pos.y - pos.y local y = bookshelf_pos.y - pos.y
local z = pos.z - bookshelf_pos.z local z = pos.z - bookshelf_pos.z
if tostring(x..z):find(2) then if tostring(x .. z):find(2) then
minetest.add_particle({ minetest.add_particle({
pos = bookshelf_pos, pos = bookshelf_pos,
velocity = {x=x, y=2-y, z=z}, velocity = {x = x, y = 2 - y, z = z},
acceleration = {x=0, y=-2.2, z=0}, acceleration = {x = 0, y = -2.2, z = 0},
expirationtime = 1, expirationtime = 1,
size = 1.5, size = 1.5,
glow = 5, glow = 5,
texture = "xdecor_glyph"..random(1,18)..".png" texture = "xdecor_glyph" .. random(1,18) .. ".png"
}) })
end end
return true return true
end end
xdecor.register("enchantment_table", { xdecor.register("enchantment_table", {
description = "Enchantment Table", description = S("Enchantment Table"),
tiles = {"xdecor_enchantment_top.png", "xdecor_enchantment_bottom.png", tiles = {
"xdecor_enchantment_side.png", "xdecor_enchantment_side.png", "xdecor_enchantment_top.png", "xdecor_enchantment_bottom.png",
"xdecor_enchantment_side.png", "xdecor_enchantment_side.png"}, "xdecor_enchantment_side.png", "xdecor_enchantment_side.png",
groups = {cracky=1, level=1}, "xdecor_enchantment_side.png", "xdecor_enchantment_side.png"
},
groups = {cracky = 1, level = 1},
light_source = 6, light_source = 6,
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
@ -204,7 +238,9 @@ xdecor.register("enchantment_table", {
on_metadata_inventory_put = enchanting.on_put, on_metadata_inventory_put = enchanting.on_put,
on_metadata_inventory_take = enchanting.on_take, on_metadata_inventory_take = enchanting.on_take,
allow_metadata_inventory_put = enchanting.put, allow_metadata_inventory_put = enchanting.put,
allow_metadata_inventory_move = function() return 0 end allow_metadata_inventory_move = function()
return 0
end,
}) })
minetest.register_entity("xdecor:book_open", { minetest.register_entity("xdecor:book_open", {
@ -214,8 +250,8 @@ minetest.register_entity("xdecor:book_open", {
physical = false, physical = false,
textures = {"xdecor_book_open.png"}, textures = {"xdecor_book_open.png"},
on_activate = function(self) on_activate = function(self)
local pos = self.object:getpos() local pos = self.object:get_pos()
local pos_under = {x=pos.x, y=pos.y-1, z=pos.z} local pos_under = {x = pos.x, y = pos.y - 1, z = pos.z}
if minetest.get_node(pos_under).name ~= "xdecor:enchantment_table" then if minetest.get_node(pos_under).name ~= "xdecor:enchantment_table" then
self.object:remove() self.object:remove()
@ -227,7 +263,7 @@ function enchanting:register_tools(mod, def)
for tool in pairs(def.tools) do for tool in pairs(def.tools) do
for material in def.materials:gmatch("[%w_]+") do for material in def.materials:gmatch("[%w_]+") do
for enchant in def.tools[tool].enchants:gmatch("[%w_]+") do for enchant in def.tools[tool].enchants:gmatch("[%w_]+") do
local original_tool = minetest.registered_tools[mod..":"..tool.."_"..material] local original_tool = reg_tools[mod .. ":" .. tool .. "_" .. material]
if not original_tool then break end if not original_tool then break end
local original_toolcaps = original_tool.tool_capabilities local original_toolcaps = original_tool.tool_capabilities
@ -251,12 +287,13 @@ function enchanting:register_tools(mod, def)
fleshy = fleshy + enchanting.damages fleshy = fleshy + enchanting.damages
end end
minetest.register_tool(":"..mod..":enchanted_"..tool.."_"..material.."_"..enchant, { minetest.register_tool(":" .. mod .. ":enchanted_" .. tool .. "_" .. material .. "_" .. enchant, {
description = "Enchanted "..cap(material).." "..cap(tool).. description = S("Enchanted @1 @2 @3",
self:get_tooltip(enchant, original_groupcaps[group], fleshy), def.material_desc[material] or cap(material), def.tools[tool].desc or cap(tool),
inventory_image = original_tool.inventory_image.."^[colorize:violet:50", self:get_tooltip(enchant, original_groupcaps[group], fleshy)),
inventory_image = original_tool.inventory_image .. "^[colorize:violet:50",
wield_image = original_tool.wield_image, wield_image = original_tool.wield_image,
groups = {not_in_creative_inventory=1}, groups = {not_in_creative_inventory = 1},
tool_capabilities = { tool_capabilities = {
groupcaps = groupcaps, damage_groups = {fleshy = fleshy}, groupcaps = groupcaps, damage_groups = {fleshy = fleshy},
full_punch_interval = full_punch_interval, full_punch_interval = full_punch_interval,
@ -271,12 +308,13 @@ end
enchanting:register_tools("default", { enchanting:register_tools("default", {
materials = "steel, bronze, mese, diamond", materials = "steel, bronze, mese, diamond",
material_desc = {steel = S("Steel"), bronze = S("Bronze"), mese = S("Mese"), diamond = S("Diamond")},
tools = { tools = {
axe = {enchants = "durable, fast"}, axe = {enchants = "durable, fast", desc = S("Axe")},
pick = {enchants = "durable, fast"}, pick = {enchants = "durable, fast", desc = S("Pickaxe")},
shovel = {enchants = "durable, fast"}, shovel = {enchants = "durable, fast", desc = S("Shovel")},
sword = {enchants = "sharp"} sword = {enchants = "sharp", desc = S("Sword")}
} },
}) })
-- Recipes -- Recipes
@ -288,4 +326,4 @@ minetest.register_craft({
{"default:diamond", "default:obsidian", "default:diamond"}, {"default:diamond", "default:obsidian", "default:diamond"},
{"default:obsidian", "default:obsidian", "default:obsidian"} {"default:obsidian", "default:obsidian", "default:obsidian"}
} }
}) })

View file

@ -1,22 +1,24 @@
local hive = {} local hive = {}
local S = minetest.get_translator("xdecor")
local FS = function(...) return minetest.formspec_escape(S(...)) end
local honey_max = 16 local honey_max = 16
function hive.construct(pos) function hive.construct(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
local formspec = [[ size[8,5;] local formspec = "size[8,6;]"
label[0.5,0;Bees are busy making honey...] .."label[0.5,0;"..FS("Bees are busy making honey…").."]"
image[6,0;1,1;hive_bee.png] ..[[ image[6,1;1,1;hive_bee.png]
image[5,0;1,1;hive_layout.png] image[5,1;1,1;hive_layout.png]
list[context;honey;5,0;1,1;] list[context;honey;5,1;1,1;]
list[current_player;main;0,1.35;8,4;] list[current_player;main;0,2.35;8,4;]
listring[current_player;main] listring[current_player;main]
listring[context;honey] ]] listring[context;honey] ]] ..
..xbg..default.get_hotbar_bg(0,1.35) xbg .. default.get_hotbar_bg(0,2.35)
meta:set_string("formspec", formspec) meta:set_string("formspec", formspec)
meta:set_string("infotext", "Artificial Hive") meta:set_string("infotext", S("Artificial Hive"))
inv:set_size("honey", 1) inv:set_size("honey", 1)
local timer = minetest.get_node_timer(pos) local timer = minetest.get_node_timer(pos)
@ -25,7 +27,9 @@ end
function hive.timer(pos) function hive.timer(pos)
local time = (minetest.get_timeofday() or 0) * 24000 local time = (minetest.get_timeofday() or 0) * 24000
if time < 5500 or time > 18500 then return true end if time < 5500 or time > 18500 then
return true
end
local inv = minetest.get_meta(pos):get_inventory() local inv = minetest.get_meta(pos):get_inventory()
local honeystack = inv:get_stack("honey", 1) local honeystack = inv:get_stack("honey", 1)
@ -40,27 +44,35 @@ function hive.timer(pos)
inv:add_item("honey", "xdecor:honey") inv:add_item("honey", "xdecor:honey")
elseif honey == honey_max then elseif honey == honey_max then
local timer = minetest.get_node_timer(pos) local timer = minetest.get_node_timer(pos)
timer:stop() return true timer:stop()
return true
end end
return true return true
end end
xdecor.register("hive", { xdecor.register("hive", {
description = "Artificial Hive", description = S("Artificial Hive"),
tiles = {"xdecor_hive_top.png", "xdecor_hive_top.png", tiles = {"xdecor_hive_top.png", "xdecor_hive_top.png",
"xdecor_hive_side.png", "xdecor_hive_side.png", "xdecor_hive_side.png", "xdecor_hive_side.png",
"xdecor_hive_side.png", "xdecor_hive_front.png"}, "xdecor_hive_side.png", "xdecor_hive_front.png"},
groups = {choppy=3, oddly_breakable_by_hand=2, flammable=1}, groups = {choppy=3, oddly_breakable_by_hand=2, flammable=1},
on_construct = hive.construct, on_construct = hive.construct,
on_timer = hive.timer, on_timer = hive.timer,
can_dig = function(pos) can_dig = function(pos)
local inv = minetest.get_meta(pos):get_inventory() local inv = minetest.get_meta(pos):get_inventory()
return inv:is_empty("honey") return inv:is_empty("honey")
end, end,
on_punch = function(_, _, puncher) on_punch = function(_, _, puncher)
puncher:set_hp(puncher:get_hp() - 2) puncher:set_hp(puncher:get_hp() - 2)
end, end,
allow_metadata_inventory_put = function() return 0 end,
allow_metadata_inventory_put = function()
return 0
end,
on_metadata_inventory_take = function(pos, _, _, stack) on_metadata_inventory_take = function(pos, _, _, stack)
if stack:get_count() == honey_max then if stack:get_count() == honey_max then
local timer = minetest.get_node_timer(pos) local timer = minetest.get_node_timer(pos)
@ -72,11 +84,16 @@ xdecor.register("hive", {
-- Craft items -- Craft items
minetest.register_craftitem("xdecor:honey", { minetest.register_craftitem("xdecor:honey", {
description = "Honey", description = S("Honey"),
inventory_image = "xdecor_honey.png", inventory_image = "xdecor_honey.png",
wield_image = "xdecor_honey.png", wield_image = "xdecor_honey.png",
groups = {food_honey = 1, food_sugar = 1, flammable = 2, not_in_creative_inventory=1}, on_use = minetest.item_eat(2),
on_use = minetest.item_eat(2) groups = {
food_honey = 1,
food_sugar = 1,
flammable = 2,
not_in_creative_inventory = 1,
},
}) })
-- Recipes -- Recipes

View file

@ -1,4 +1,5 @@
local itemframe, tmp = {}, {} local itemframe, tmp = {}, {}
local S = minetest.get_translator("xdecor")
screwdriver = screwdriver or {} screwdriver = screwdriver or {}
local function remove_item(pos, node) local function remove_item(pos, node)
@ -6,15 +7,18 @@ local function remove_item(pos, node)
if not objs then return end if not objs then return end
for _, obj in pairs(objs) do for _, obj in pairs(objs) do
if obj and obj:get_luaentity() and local ent = obj:get_luaentity()
obj:get_luaentity().name == "xdecor:f_item" then if obj and ent and ent.name == "xdecor:f_item" then
obj:remove() break obj:remove() break
end end
end end
end end
local facedir = { local facedir = {
[0] = {x=0, y=0, z=1}, {x=1, y=0, z=0}, {x=0, y=0, z=-1}, {x=-1, y=0, z=0} [0] = {x = 0, y = 0, z = 1},
{x = 1, y = 0, z = 0},
{x = 0, y = 0, z = -1},
{x = -1, y = 0, z = 0}
} }
local function update_item(pos, node) local function update_item(pos, node)
@ -29,8 +33,8 @@ local function update_item(pos, node)
tmp.texture = ItemStack(itemstring):get_name() tmp.texture = ItemStack(itemstring):get_name()
local entity = minetest.add_entity(pos, "xdecor:f_item") local entity = minetest.add_entity(pos, "xdecor:f_item")
local yaw = math.pi*2 - node.param2 * math.pi/2 local yaw = (math.pi * 2) - node.param2 * (math.pi / 2)
entity:setyaw(yaw) entity:set_yaw(yaw)
local timer = minetest.get_node_timer(pos) local timer = minetest.get_node_timer(pos)
timer:start(15.0) timer:start(15.0)
@ -53,7 +57,7 @@ function itemframe.after_place(pos, placer, itemstack)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local name = placer:get_player_name() local name = placer:get_player_name()
meta:set_string("owner", name) meta:set_string("owner", name)
meta:set_string("infotext", "Item Frame (owned by "..name..")") meta:set_string("infotext", S("@1 (owned by @2)", S("Item Frame"), name))
end end
function itemframe.timer(pos) function itemframe.timer(pos)
@ -64,6 +68,7 @@ function itemframe.timer(pos)
if num == 0 and meta:get_string("item") ~= "" then if num == 0 and meta:get_string("item") ~= "" then
update_item(pos, node) update_item(pos, node)
end end
return true return true
end end
@ -81,7 +86,11 @@ function itemframe.rightclick(pos, node, clicker, itemstack)
local itemstring = itemstack:take_item():to_string() local itemstring = itemstack:take_item():to_string()
meta:set_string("item", itemstring) meta:set_string("item", itemstring)
update_item(pos, node) update_item(pos, node)
if itemstring == "" then
meta:set_string("infotext", S("@1 (owned by @2)", S("Item Frame"), owner))
else
meta:set_string("infotext", S("@1 (owned by @2)", itemstring, owner))
end
return itemstack return itemstack
end end
@ -91,8 +100,9 @@ function itemframe.punch(pos, node, puncher)
local owner = meta:get_string("owner") local owner = meta:get_string("owner")
local admin = minetest.check_player_privs(player_name, "protection_bypass") local admin = minetest.check_player_privs(player_name, "protection_bypass")
if not admin and player_name ~= owner then return end if admin and player_name == owner then
drop_item(pos, node) drop_item(pos, node)
end
end end
function itemframe.dig(pos, player) function itemframe.dig(pos, player)
@ -106,15 +116,17 @@ function itemframe.dig(pos, player)
end end
xdecor.register("itemframe", { xdecor.register("itemframe", {
description = "Item Frame", description = S("Item Frame"),
groups = {choppy=3, oddly_breakable_by_hand=2, flammable=3}, groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
on_rotate = screwdriver.disallow, on_rotate = screwdriver.disallow,
sunlight_propagates = true, sunlight_propagates = true,
inventory_image = "xdecor_itemframe.png", inventory_image = "xdecor_itemframe.png",
node_box = xdecor.nodebox.slab_z(0.9375), node_box = xdecor.nodebox.slab_z(0.9375),
tiles = {"xdecor_wood.png", "xdecor_wood.png", "xdecor_wood.png", tiles = {
"xdecor_wood.png", "xdecor_wood.png", "xdecor_itemframe.png"}, "xdecor_wood.png", "xdecor_wood.png", "xdecor_wood.png",
"xdecor_wood.png", "xdecor_wood.png", "xdecor_itemframe.png"
},
after_place_node = itemframe.after_place, after_place_node = itemframe.after_place,
on_timer = itemframe.timer, on_timer = itemframe.timer,
on_rightclick = itemframe.rightclick, on_rightclick = itemframe.rightclick,
@ -125,12 +137,12 @@ xdecor.register("itemframe", {
minetest.register_entity("xdecor:f_item", { minetest.register_entity("xdecor:f_item", {
visual = "wielditem", visual = "wielditem",
visual_size = {x=0.33, y=0.33}, visual_size = {x = 0.33, y = 0.33},
collisionbox = {0}, collisionbox = {0},
physical = false, physical = false,
textures = {"air"}, textures = {"air"},
on_activate = function(self, staticdata) on_activate = function(self, staticdata)
local pos = self.object:getpos() local pos = self.object:get_pos()
if minetest.get_node(pos).name ~= "xdecor:itemframe" then if minetest.get_node(pos).name ~= "xdecor:itemframe" then
self.object:remove() self.object:remove()
end end
@ -148,13 +160,16 @@ minetest.register_entity("xdecor:f_item", {
end end
end end
if self.texture then if self.texture then
self.object:set_properties({textures={self.texture}}) self.object:set_properties({
textures = {self.texture}
})
end end
end, end,
get_staticdata = function(self) get_staticdata = function(self)
if self.nodename and self.texture then if self.nodename and self.texture then
return self.nodename..";"..self.texture return self.nodename .. ";" .. self.texture
end end
return "" return ""
end end
}) })
@ -168,4 +183,4 @@ minetest.register_craft({
{"group:stick", "default:paper", "group:stick"}, {"group:stick", "default:paper", "group:stick"},
{"group:stick", "group:stick", "group:stick"} {"group:stick", "group:stick", "group:stick"}
} }
}) })

View file

@ -1,18 +1,28 @@
local mailbox = {} local mailbox = {}
screwdriver = screwdriver or {} screwdriver = screwdriver or {}
local S = minetest.get_translator("xdecor")
local FS = function(...) return minetest.formspec_escape(S(...)) end
local function get_img(img) local function get_img(img)
if not img then return end
local img_name = img:match("(.*)%.png") local img_name = img:match("(.*)%.png")
if img_name then return img_name..".png" end
if img_name then
return img_name .. ".png"
end
end end
local function img_col(stack) local function img_col(stack)
local def = minetest.registered_items[stack] local def = minetest.registered_items[stack]
if not def then return "" end if not def then
return ""
end
if def.inventory_image ~= "" then if def.inventory_image ~= "" then
local img = get_img(def.inventory_image) local img = get_img(def.inventory_image)
if img then return img end if img then
return img
end
end end
if def.tiles then if def.tiles then
@ -22,53 +32,58 @@ local function img_col(stack)
elseif type(tile) == "string" then elseif type(tile) == "string" then
img = get_img(tile) img = get_img(tile)
end end
if img then return img end
if img then
return img
end
end end
return "" return ""
end end
function mailbox:formspec(pos, owner, is_owner) function mailbox:formspec(pos, owner, is_owner)
local spos = pos.x..","..pos.y..","..pos.z local spos = pos.x .. "," .. pos.y .. "," .. pos.z
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local giver, img = "", "" local giver, img = "", ""
if is_owner then if is_owner then
for i = 1, 7 do for i = 1, 7 do
local giving = meta:get_string("giver"..i) local giving = meta:get_string("giver" .. i)
if giving ~= "" then if giving ~= "" then
local stack = meta:get_string("stack"..i) local stack = meta:get_string("stack" .. i)
local giver_name = giving:sub(1,12) local giver_name = giving:sub(1,12)
local stack_name = stack:match("[%w_:]+") local stack_name = stack:match("[%w_:]+")
local stack_count = stack:match("%s(%d+)") or 1 local stack_count = stack:match("%s(%d+)") or 1
giver = giver.."#FFFF00,"..giver_name..","..i.. giver = giver .. "#FFFF00," .. giver_name .. "," .. i ..
",#FFFFFF,x "..stack_count.."," ",#FFFFFF,x " .. stack_count .. ","
img = img..i.."="..
img_col(stack_name).."^\\[resize:16x16," img = img .. i .. "=" ..
img_col(stack_name) .. "^\\[resize:16x16,"
end end
end end
return [[ size[9.5,9] return "size[9.5,9]"
label[0,0;Mailbox] .."label[0,0;"..FS("Mailbox").."]"
label[6,0;Last donators] .."label[6,0;"..FS("Last donators").."]"
box[6,0.72;3.3,3.5;#555555] ..[[ box[6,0.72;3.3,3.5;#555555]
listring[current_player;main] listring[current_player;main]
list[current_player;main;0.75,5.25;8,4;] list[current_player;main;0.75,5.25;8,4;]
tableoptions[background=#00000000;highlight=#00000000;border=false] ]].. tableoptions[background=#00000000;highlight=#00000000;border=false] ]] ..
"tablecolumns[color;text;image,"..img.."0;color;text]".. "tablecolumns[color;text;image," .. img .. "0;color;text]" ..
"table[6,0.75;3.3,4;givers;"..giver.."]".. "table[6,0.75;3.3,4;givers;" .. giver .. "]" ..
"list[nodemeta:"..spos..";mailbox;0,0.75;6,4;]".. "list[nodemeta:" .. spos .. ";mailbox;0,0.75;6,4;]" ..
"listring[nodemeta:"..spos..";mailbox]".. "listring[nodemeta:" .. spos .. ";mailbox]" ..
xbg..default.get_hotbar_bg(0.75,5.25) xbg .. default.get_hotbar_bg(0.75, 5.25)
end end
return [[ size[8,5]
list[current_player;main;0,1.25;8,4;] ]].. return "size[8,5]" ..
"label[0,0;Send your goods to\n".. "list[current_player;main;0,1.25;8,4;]" ..
"label[0,0;"..FS("Send your goods to\n@1",
(minetest.colorize and (minetest.colorize and
minetest.colorize("#FFFF00", owner) or owner).."]".. minetest.colorize("#FFFF00", owner) or owner)) .. "]" ..
"list[nodemeta:"..spos..";drop;3.5,0;1,1;]".. "list[nodemeta:" .. spos .. ";drop;3.5,0;1,1;]" ..
xbg..default.get_hotbar_bg(0,1.25) xbg .. default.get_hotbar_bg(0, 1.25)
end end
function mailbox.dig(pos, player) function mailbox.dig(pos, player)
@ -85,10 +100,10 @@ function mailbox.after_place_node(pos, placer)
local player_name = placer:get_player_name() local player_name = placer:get_player_name()
meta:set_string("owner", player_name) meta:set_string("owner", player_name)
meta:set_string("infotext", player_name.."'s Mailbox") meta:set_string("infotext", S("@1's Mailbox", player_name))
local inv = meta:get_inventory() local inv = meta:get_inventory()
inv:set_size("mailbox", 6*4) inv:set_size("mailbox", 6 * 4)
inv:set_size("drop", 1) inv:set_size("drop", 1)
end end
@ -97,8 +112,9 @@ function mailbox.rightclick(pos, node, clicker, itemstack, pointed_thing)
local player = clicker:get_player_name() local player = clicker:get_player_name()
local owner = meta:get_string("owner") local owner = meta:get_string("owner")
minetest.show_formspec(player, "xdecor:mailbox", mailbox:formspec(pos, minetest.show_formspec(player, "xdecor:mailbox",
owner, (player == owner))) mailbox:formspec(pos, owner, (player == owner)))
return itemstack return itemstack
end end
@ -109,9 +125,10 @@ function mailbox.put(pos, listname, _, stack, player)
return -1 return -1
else else
minetest.chat_send_player(player:get_player_name(), minetest.chat_send_player(player:get_player_name(),
"The mailbox is full") S("The mailbox is full."))
end end
end end
return 0 return 0
end end
@ -124,8 +141,8 @@ function mailbox.on_put(pos, listname, _, stack, player)
inv:add_item("mailbox", stack) inv:add_item("mailbox", stack)
for i = 7, 2, -1 do for i = 7, 2, -1 do
meta:set_string("giver"..i, meta:get_string("giver"..(i-1))) meta:set_string("giver" .. i, meta:get_string("giver" .. (i - 1)))
meta:set_string("stack"..i, meta:get_string("stack"..(i-1))) meta:set_string("stack" .. i, meta:get_string("stack" .. (i - 1)))
end end
meta:set_string("giver1", player:get_player_name()) meta:set_string("giver1", player:get_player_name())
@ -139,6 +156,7 @@ function mailbox.allow_take(pos, listname, index, stack, player)
if player:get_player_name() ~= meta:get_string("owner") then if player:get_player_name() ~= meta:get_string("owner") then
return 0 return 0
end end
return stack:get_count() return stack:get_count()
end end
@ -147,11 +165,11 @@ function mailbox.allow_move(pos)
end end
xdecor.register("mailbox", { xdecor.register("mailbox", {
description = "Mailbox", description = S("Mailbox"),
tiles = {"xdecor_mailbox_top.png", "xdecor_mailbox_bottom.png", tiles = {"xdecor_mailbox_top.png", "xdecor_mailbox_bottom.png",
"xdecor_mailbox_side.png", "xdecor_mailbox_side.png", "xdecor_mailbox_side.png", "xdecor_mailbox_side.png",
"xdecor_mailbox.png", "xdecor_mailbox.png"}, "xdecor_mailbox.png", "xdecor_mailbox.png"},
groups = {cracky=3, oddly_breakable_by_hand=1}, groups = {cracky = 3, oddly_breakable_by_hand = 1},
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
can_dig = mailbox.dig, can_dig = mailbox.dig,
on_rightclick = mailbox.rightclick, on_rightclick = mailbox.rightclick,
@ -171,4 +189,4 @@ minetest.register_craft({
{"dye:red", "default:paper", "dye:red"}, {"dye:red", "default:paper", "dye:red"},
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"} {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}
} }
}) })

View file

@ -5,21 +5,24 @@ minetest.setting_set("nodetimer_interval", 0.1)
local plate = {} local plate = {}
screwdriver = screwdriver or {} screwdriver = screwdriver or {}
local S = minetest.get_translator("xdecor")
local function door_toggle(pos_actuator, pos_door, player) local function door_toggle(pos_actuator, pos_door, player)
local player_name = player:get_player_name() local player_name = player:get_player_name()
local actuator = minetest.get_node(pos_actuator) local actuator = minetest.get_node(pos_actuator)
local door = doors.get(pos_door) local door = doors.get(pos_door)
if not door then return end
if actuator.name:sub(-4) == "_off" then if actuator.name:sub(-4) == "_off" then
minetest.set_node(pos_actuator, minetest.set_node(pos_actuator,
{name=actuator.name:gsub("_off", "_on"), param2=actuator.param2}) {name = actuator.name:gsub("_off", "_on"), param2 = actuator.param2})
end end
door:open(player) door:open(player)
minetest.after(2, function() minetest.after(2, function()
if minetest.get_node(pos_actuator).name:sub(-3) == "_on" then if minetest.get_node(pos_actuator).name:sub(-3) == "_on" then
minetest.set_node(pos_actuator, minetest.set_node(pos_actuator,
{name=actuator.name, param2=actuator.param2}) {name = actuator.name, param2 = actuator.param2})
end end
-- Re-get player object (or nil) because 'player' could -- Re-get player object (or nil) because 'player' could
-- be an invalid object at this time (player left) -- be an invalid object at this time (player left)
@ -35,25 +38,27 @@ end
function plate.timer(pos) function plate.timer(pos)
local objs = minetest.get_objects_inside_radius(pos, 0.8) local objs = minetest.get_objects_inside_radius(pos, 0.8)
if not next(objs) or not doors.get then return true end if not next(objs) or not doors.get then return true end
local minp = {x=pos.x-2, y=pos.y, z=pos.z-2}
local maxp = {x=pos.x+2, y=pos.y, z=pos.z+2} local minp = {x = pos.x - 2, y = pos.y, z = pos.z - 2}
local maxp = {x = pos.x + 2, y = pos.y, z = pos.z + 2}
local doors = minetest.find_nodes_in_area(minp, maxp, "group:door") local doors = minetest.find_nodes_in_area(minp, maxp, "group:door")
for _, player in pairs(objs) do for _, player in pairs(objs) do
if player:is_player() then if player:is_player() then
for i=1, #doors do for i = 1, #doors do
door_toggle(pos, doors[i], player) door_toggle(pos, doors[i], player)
end end
break break
end end
end end
return true return true
end end
function plate.register(material, desc, def) function plate.register(material, desc, def)
xdecor.register("pressure_"..material.."_off", { xdecor.register("pressure_" .. material .. "_off", {
description = desc.." Pressure Plate", description = def.description or (desc .. " Pressure Plate"),
tiles = {"xdecor_pressure_"..material..".png"}, tiles = {"xdecor_pressure_" .. material .. ".png"},
drawtype = "nodebox", drawtype = "nodebox",
node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 1, 14}}), node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 1, 14}}),
groups = def.groups, groups = def.groups,
@ -63,13 +68,13 @@ function plate.register(material, desc, def)
on_construct = plate.construct, on_construct = plate.construct,
on_timer = plate.timer on_timer = plate.timer
}) })
xdecor.register("pressure_"..material.."_on", { xdecor.register("pressure_" .. material .. "_on", {
tiles = {"xdecor_pressure_"..material..".png"}, tiles = {"xdecor_pressure_" .. material .. ".png"},
drawtype = "nodebox", drawtype = "nodebox",
node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 0.4, 14}}), node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 0.4, 14}}),
groups = def.groups, groups = def.groups,
sounds = def.sounds, sounds = def.sounds,
drop = "xdecor:pressure_"..material.."_off", drop = "xdecor:pressure_" .. material .. "_off",
sunlight_propagates = true, sunlight_propagates = true,
on_rotate = screwdriver.rotate_simple on_rotate = screwdriver.rotate_simple
}) })
@ -77,32 +82,36 @@ end
plate.register("wood", "Wooden", { plate.register("wood", "Wooden", {
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
groups = {choppy=3, oddly_breakable_by_hand=2, flammable=2} groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2},
description = S("Wooden Pressure Plate"),
}) })
plate.register("stone", "Stone", { plate.register("stone", "Stone", {
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
groups = {cracky=3, oddly_breakable_by_hand=2} groups = {cracky = 3, oddly_breakable_by_hand = 2},
description = S("Stone Pressure Plate"),
}) })
xdecor.register("lever_off", { xdecor.register("lever_off", {
description = "Lever", description = S("Lever"),
tiles = {"xdecor_lever_off.png"}, tiles = {"xdecor_lever_off.png"},
drawtype = "nodebox", drawtype = "nodebox",
node_box = xdecor.pixelbox(16, {{2, 1, 15, 12, 14, 1}}), node_box = xdecor.pixelbox(16, {{2, 1, 15, 12, 14, 1}}),
groups = {cracky=3, oddly_breakable_by_hand=2}, groups = {cracky = 3, oddly_breakable_by_hand = 2},
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
sunlight_propagates = true, sunlight_propagates = true,
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
on_rightclick = function(pos, node, clicker, itemstack) on_rightclick = function(pos, node, clicker, itemstack)
if not doors.get then return itemstack end if not doors.get then return itemstack end
local minp = {x=pos.x-2, y=pos.y-1, z=pos.z-2} local minp = {x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}
local maxp = {x=pos.x+2, y=pos.y+1, z=pos.z+2} local maxp = {x = pos.x + 2, y = pos.y + 1, z = pos.z + 2}
local doors = minetest.find_nodes_in_area(minp, maxp, "group:door") local doors = minetest.find_nodes_in_area(minp, maxp, "group:door")
for i=1, #doors do for i = 1, #doors do
door_toggle(pos, doors[i], clicker) door_toggle(pos, doors[i], clicker)
end end
return itemstack return itemstack
end end
}) })
@ -111,7 +120,7 @@ xdecor.register("lever_on", {
tiles = {"xdecor_lever_on.png"}, tiles = {"xdecor_lever_on.png"},
drawtype = "nodebox", drawtype = "nodebox",
node_box = xdecor.pixelbox(16, {{2, 1, 15, 12, 14, 1}}), node_box = xdecor.pixelbox(16, {{2, 1, 15, 12, 14, 1}}),
groups = {cracky=3, oddly_breakable_by_hand=2, not_in_creative_inventory=1}, groups = {cracky = 3, oddly_breakable_by_hand = 2, not_in_creative_inventory = 1},
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
sunlight_propagates = true, sunlight_propagates = true,
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
@ -138,4 +147,4 @@ minetest.register_craft({
{"group:stick"}, {"group:stick"},
{"group:stone"} {"group:stone"}
} }
}) })

View file

@ -1,146 +1,177 @@
screwdriver = screwdriver or {} screwdriver = screwdriver or {}
local S = minetest.get_translator("xdecor")
local function register_pane(name, desc, def) local function register_pane(name, desc, def)
xpanes.register_pane(name, { xpanes.register_pane(name, {
description = desc, description = desc,
tiles = {"xdecor_"..name..".png"}, tiles = {"xdecor_" .. name .. ".png"},
drawtype = "airlike", drawtype = "airlike",
paramtype = "light", paramtype = "light",
textures = {"xdecor_"..name..".png", "xdecor_"..name..".png", "xpanes_space.png"}, textures = {"xdecor_" .. name .. ".png", "" ,"xdecor_" .. name .. ".png"},
inventory_image = "xdecor_"..name..".png", inventory_image = "xdecor_" .. name .. ".png",
wield_image = "xdecor_"..name..".png", wield_image = "xdecor_" .. name .. ".png",
groups = def.groups, groups = def.groups,
sounds = def.sounds or default.node_sound_defaults(), sounds = def.sounds or default.node_sound_defaults(),
recipe = def.recipe recipe = def.recipe
}) })
end end
register_pane("bamboo_frame", "Bamboo Frame", { register_pane("bamboo_frame", S("Bamboo Frame"), {
groups = {choppy=3, oddly_breakable_by_hand=2, pane=1, flammable=2}, groups = {choppy = 3, oddly_breakable_by_hand = 2, pane = 1, flammable = 2},
recipe = {{"default:papyrus", "default:papyrus", "default:papyrus"}, recipe = {
{"default:papyrus", "farming:cotton", "default:papyrus"}, {"default:papyrus", "default:papyrus", "default:papyrus"},
{"default:papyrus", "default:papyrus", "default:papyrus"}} {"default:papyrus", "farming:cotton", "default:papyrus"},
{"default:papyrus", "default:papyrus", "default:papyrus"}
}
}) })
register_pane("chainlink", "Chainlink", { register_pane("chainlink", S("Chainlink"), {
groups = {cracky=3, oddly_breakable_by_hand=2, pane=1}, groups = {cracky = 3, oddly_breakable_by_hand = 2, pane = 1},
recipe = {{"default:steel_ingot", "", "default:steel_ingot"}, recipe = {
{"", "default:steel_ingot", ""}, {"default:steel_ingot", "", "default:steel_ingot"},
{"default:steel_ingot", "", "default:steel_ingot"}} {"", "default:steel_ingot", ""},
{"default:steel_ingot", "", "default:steel_ingot"}
}
}) })
register_pane("rusty_bar", "Rusty Iron Bars", { register_pane("rusty_bar", S("Rusty Iron Bars"), {
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
groups = {cracky=2, pane=1}, groups = {cracky = 2, pane = 1},
recipe = {{"", "default:dirt", ""}, recipe = {
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, {"", "default:dirt", ""},
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}} {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}
}
}) })
register_pane("wood_frame", "Wood Frame", { register_pane("wood_frame", S("Wood Frame"), {
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
groups = {choppy=2, pane=1, flammable=2}, groups = {choppy = 2, pane = 1, flammable = 2},
recipe = {{"group:wood", "group:stick", "group:wood"}, recipe = {
{"group:stick", "group:stick", "group:stick"}, {"group:wood", "group:stick", "group:wood"},
{"group:wood", "group:stick", "group:wood"}} {"group:stick", "group:stick", "group:stick"},
{"group:wood", "group:stick", "group:wood"}
}
}) })
xdecor.register("baricade", { xdecor.register("baricade", {
description = "Baricade", description = S("Baricade"),
drawtype = "plantlike", drawtype = "plantlike",
paramtype2 = "facedir", paramtype2 = "facedir",
inventory_image = "xdecor_baricade.png", inventory_image = "xdecor_baricade.png",
tiles = {"xdecor_baricade.png"}, tiles = {"xdecor_baricade.png"},
groups = {choppy=2, oddly_breakable_by_hand=1, flammable=2}, groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
damage_per_second = 4, damage_per_second = 4,
selection_box = xdecor.nodebox.slab_y(0.3), selection_box = xdecor.nodebox.slab_y(0.3),
collision_box = xdecor.pixelbox(2, {{0, 0, 1, 2, 2, 0}}) collision_box = xdecor.pixelbox(2, {{0, 0, 1, 2, 2, 0}})
}) })
xdecor.register("barrel", { xdecor.register("barrel", {
description = "Barrel", description = S("Barrel"),
tiles = {"xdecor_barrel_top.png", "xdecor_barrel_top.png", "xdecor_barrel_sides.png"}, tiles = {"xdecor_barrel_top.png", "xdecor_barrel_top.png", "xdecor_barrel_sides.png"},
on_place = minetest.rotate_node, on_place = minetest.rotate_node,
groups = {choppy=2, oddly_breakable_by_hand=1, flammable=2}, groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
sounds = default.node_sound_wood_defaults() sounds = default.node_sound_wood_defaults()
}) })
local function register_storage(name, desc, def) local function register_storage(name, desc, def)
xdecor.register(name, { xdecor.register(name, {
description = desc, description = desc,
inventory = {size=def.inv_size or 24}, inventory = {size = def.inv_size or 24},
infotext = desc, infotext = desc,
tiles = def.tiles, tiles = def.tiles,
node_box = def.node_box, node_box = def.node_box,
on_rotate = def.on_rotate, on_rotate = def.on_rotate,
on_place = def.on_place, on_place = def.on_place,
groups = def.groups or {choppy=2, oddly_breakable_by_hand=1, flammable=2}, groups = def.groups or {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
sounds = default.node_sound_wood_defaults() sounds = default.node_sound_wood_defaults()
}) })
end end
register_storage("cabinet", "Wooden Cabinet", { register_storage("cabinet", S("Wooden Cabinet"), {
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
tiles = {"xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png", tiles = {
"xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png",
"xdecor_cabinet_sides.png", "xdecor_cabinet_front.png"} "xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png",
"xdecor_cabinet_sides.png", "xdecor_cabinet_front.png"
}
}) })
register_storage("cabinet_half", "Half Wooden Cabinet", { register_storage("cabinet_half", S("Half Wooden Cabinet"), {
inv_size = 8, inv_size = 8,
node_box = xdecor.nodebox.slab_y(0.5, 0.5), node_box = xdecor.nodebox.slab_y(0.5, 0.5),
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
tiles = {"xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png", tiles = {
"xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_sides.png", "xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png",
"xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_front.png"} "xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_sides.png",
"xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_front.png"
}
}) })
register_storage("empty_shelf", "Empty Shelf", { if minetest.get_modpath("moreblocks") then
on_rotate = screwdriver.rotate_simple, minetest.register_alias("xdecor:empty_shelf", "moreblocks:empty_shelf")
tiles = {"default_wood.png", "default_wood.png", "default_wood.png", else
"default_wood.png", "default_wood.png^xdecor_empty_shelf.png"} register_storage("empty_shelf", S("Empty Shelf"), {
}) on_rotate = screwdriver.rotate_simple,
tiles = {
"default_wood.png", "default_wood.png", "default_wood.png",
"default_wood.png", "default_wood.png^xdecor_empty_shelf.png"
}
})
end
register_storage("multishelf", "Multi Shelf", { register_storage("multishelf", S("Multi Shelf"), {
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
tiles = {"default_wood.png", "default_wood.png", "default_wood.png", tiles = {
"default_wood.png", "default_wood.png^xdecor_multishelf.png"}, "default_wood.png", "default_wood.png", "default_wood.png",
"default_wood.png", "default_wood.png^xdecor_multishelf.png"
},
}) })
xdecor.register("candle", { xdecor.register("candle", {
description = "Candle", description = S("Candle"),
light_source = 12, light_source = 12,
drawtype = "torchlike", drawtype = "torchlike",
inventory_image = "xdecor_candle_inv.png", inventory_image = "xdecor_candle_inv.png",
wield_image = "xdecor_candle_wield.png", wield_image = "xdecor_candle_wield.png",
paramtype2 = "wallmounted", paramtype2 = "wallmounted",
walkable = false, walkable = false,
groups = {dig_immediate=3, attached_node=1}, groups = {dig_immediate = 3, attached_node = 1},
tiles = {{name = "xdecor_candle_floor.png", tiles = {
animation = {type="vertical_frames", length=1.5}}, {
{name = "xdecor_candle_floor.png", name = "xdecor_candle_floor.png",
animation = {type="vertical_frames", length=1.5}}, animation = {type="vertical_frames", length = 1.5}
{name = "xdecor_candle_wall.png", },
animation = {type="vertical_frames", length=1.5}} {
name = "xdecor_candle_hanging.png",
animation = {type="vertical_frames", length = 1.5}
},
{
name = "xdecor_candle_wall.png",
animation = {type="vertical_frames", length = 1.5}
}
}, },
selection_box = { selection_box = {
type = "wallmounted", type = "wallmounted",
wall_top = {-0.25, -0.5, -0.25, 0.25, 0.1, 0.25}, wall_top = {-0.25, -0.3, -0.25, 0.25, 0.5, 0.25},
wall_bottom = {-0.25, -0.5, -0.25, 0.25, 0.1, 0.25}, wall_bottom = {-0.25, -0.5, -0.25, 0.25, 0.1, 0.25},
wall_side = {-0.5, -0.35, -0.15, -0.15, 0.4, 0.15} wall_side = {-0.5, -0.35, -0.15, -0.15, 0.4, 0.15}
} }
}) })
xdecor.register("chair", { xdecor.register("chair", {
description = "Chair", description = S("Chair"),
tiles = {"xdecor_wood.png"}, tiles = {"xdecor_wood.png"},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
groups = {choppy=3, oddly_breakable_by_hand=2, flammable=2}, groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2},
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
node_box = xdecor.pixelbox(16, { node_box = xdecor.pixelbox(16, {
{3, 0, 11, 2, 16, 2}, {11, 0, 11, 2, 16, 2}, {3, 0, 11, 2, 16, 2},
{5, 9, 11.5, 6, 6, 1}, {3, 0, 3, 2, 6, 2}, {11, 0, 11, 2, 16, 2},
{11, 0, 3, 2, 6, 2}, {3, 6, 3, 10, 2, 8} {5, 9, 11.5, 6, 6, 1},
{3, 0, 3, 2, 6, 2},
{11, 0, 3, 2, 6, 2},
{3, 6, 3, 10, 2, 8}
}), }),
can_dig = xdecor.sit_dig, can_dig = xdecor.sit_dig,
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
@ -151,7 +182,7 @@ xdecor.register("chair", {
}) })
xdecor.register("cobweb", { xdecor.register("cobweb", {
description = "Cobweb", description = S("Cobweb"),
drawtype = "plantlike", drawtype = "plantlike",
tiles = {"xdecor_cobweb.png"}, tiles = {"xdecor_cobweb.png"},
inventory_image = "xdecor_cobweb.png", inventory_image = "xdecor_cobweb.png",
@ -163,59 +194,61 @@ xdecor.register("cobweb", {
liquid_range = 0, liquid_range = 0,
walkable = false, walkable = false,
selection_box = {type = "regular"}, selection_box = {type = "regular"},
groups = {snappy=3, liquid=3, flammable=3}, groups = {snappy = 3, liquid = 3, flammable = 3},
sounds = default.node_sound_leaves_defaults() sounds = default.node_sound_leaves_defaults()
}) })
local curtain_colors = { local curtain_colors = {
"red", red = S("Red Curtain"),
} }
for _, c in pairs(curtain_colors) do for c, desc in pairs(curtain_colors) do
xdecor.register("curtain_"..c, { xdecor.register("curtain_" .. c, {
description = c:gsub("^%l", string.upper).." Curtain", description = desc,
walkable = false, walkable = false,
tiles = {"wool_white.png"}, tiles = {"wool_white.png"},
color = c, color = c,
inventory_image = "wool_white.png^[colorize:"..c.. inventory_image = "wool_white.png^[colorize:" .. c ..
":170^xdecor_curtain_open_overlay.png^[makealpha:255,126,126", ":170^xdecor_curtain_open_overlay.png^[makealpha:255,126,126",
wield_image = "wool_white.png^[colorize:"..c..":170", wield_image = "wool_white.png^[colorize:" .. c .. ":170",
drawtype = "signlike", drawtype = "signlike",
paramtype2 = "colorwallmounted", paramtype2 = "colorwallmounted",
groups = {dig_immediate=3, flammable=3}, groups = {dig_immediate = 3, flammable = 3},
selection_box = {type="wallmounted"}, selection_box = {type = "wallmounted"},
on_rightclick = function(pos, node, _, itemstack) on_rightclick = function(pos, node, _, itemstack)
minetest.set_node(pos, {name="xdecor:curtain_open_"..c, param2=node.param2}) minetest.set_node(pos, {name = "xdecor:curtain_open_" .. c, param2 = node.param2})
return itemstack return itemstack
end end
}) })
xdecor.register("curtain_open_"..c, { xdecor.register("curtain_open_" .. c, {
tiles = {"wool_white.png^xdecor_curtain_open_overlay.png^[makealpha:255,126,126"}, tiles = {"wool_white.png^xdecor_curtain_open_overlay.png^[makealpha:255,126,126"},
color = c, color = c,
drawtype = "signlike", drawtype = "signlike",
paramtype2 = "colorwallmounted", paramtype2 = "colorwallmounted",
walkable = false, walkable = false,
groups = {dig_immediate=3, flammable=3, not_in_creative_inventory=1}, groups = {dig_immediate = 3, flammable = 3, not_in_creative_inventory = 1},
selection_box = {type="wallmounted"}, selection_box = {type="wallmounted"},
drop = "xdecor:curtain_"..c, drop = "xdecor:curtain_" .. c,
on_rightclick = function(pos, node, _, itemstack) on_rightclick = function(pos, node, _, itemstack)
minetest.set_node(pos, {name="xdecor:curtain_"..c, param2=node.param2}) minetest.set_node(pos, {name="xdecor:curtain_" .. c, param2 = node.param2})
return itemstack return itemstack
end end
}) })
minetest.register_craft({ minetest.register_craft({
output = "xdecor:curtain_"..c.." 4", output = "xdecor:curtain_" .. c .. " 4",
recipe = {{"", "wool:"..c, ""}, recipe = {
{"", "wool:"..c, ""}} {"", "wool:" .. c, ""},
{"", "wool:" .. c, ""}
}
}) })
end end
xdecor.register("cushion", { xdecor.register("cushion", {
description = "Cushion", description = S("Cushion"),
tiles = {"xdecor_cushion.png"}, tiles = {"xdecor_cushion.png"},
groups = {snappy=3, flammable=3, fall_damage_add_percent=-50}, groups = {snappy = 3, flammable = 3, fall_damage_add_percent = -50},
on_place = minetest.rotate_node, on_place = minetest.rotate_node,
node_box = xdecor.nodebox.slab_y(0.5), node_box = xdecor.nodebox.slab_y(0.5),
can_dig = xdecor.sit_dig, can_dig = xdecor.sit_dig,
@ -227,9 +260,9 @@ xdecor.register("cushion", {
}) })
xdecor.register("cushion_block", { xdecor.register("cushion_block", {
description = "Cushion Block", description = S("Cushion Block"),
tiles = {"xdecor_cushion.png"}, tiles = {"xdecor_cushion.png"},
groups = {snappy=3, flammable=3, fall_damage_add_percent=-75, not_in_creative_inventory=1} groups = {snappy = 3, flammable = 3, fall_damage_add_percent = -75, not_in_creative_inventory = 1}
}) })
local function door_access(name) local function door_access(name)
@ -238,49 +271,98 @@ end
local xdecor_doors = { local xdecor_doors = {
japanese = { japanese = {
{"group:wood", "default:paper"}, recipe = {
{"default:paper", "group:wood"}, {"group:wood", "default:paper"},
{"group:wood", "default:paper"} }, {"default:paper", "group:wood"},
{"group:wood", "default:paper"}
},
desc = S("Japanese Door"),
},
prison = { prison = {
{"xpanes:bar_flat", "xpanes:bar_flat",}, recipe = {
{"xpanes:bar_flat", "xpanes:bar_flat",}, {"xpanes:bar_flat", "xpanes:bar_flat",},
{"xpanes:bar_flat", "xpanes:bar_flat"} }, {"xpanes:bar_flat", "xpanes:bar_flat",},
{"xpanes:bar_flat", "xpanes:bar_flat"}
},
desc = S("Prison Door"),
},
rusty_prison = { rusty_prison = {
{"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat",}, recipe = {
{"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat",}, {"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat",},
{"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat"} }, {"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat",},
{"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat"}
},
desc = S("Rusty Prison Door"),
},
screen = { screen = {
{"group:wood", "group:wood"}, recipe = {
{"xpanes:chainlink_flat", "xpanes:chainlink_flat"}, {"group:wood", "group:wood"},
{"group:wood", "group:wood"} }, {"xpanes:chainlink_flat", "xpanes:chainlink_flat"},
{"group:wood", "group:wood"}
},
desc = S("Screen Door"),
},
slide = { slide = {
{"default:paper", "default:paper"}, recipe = {
{"default:paper", "default:paper"}, {"default:paper", "default:paper"},
{"group:wood", "group:wood"} }, {"default:paper", "default:paper"},
{"group:wood", "group:wood"}
},
desc = S("Slide Door"),
},
woodglass = { woodglass = {
{"default:glass", "default:glass"}, recipe = {
{"group:wood", "group:wood"}, {"default:glass", "default:glass"},
{"group:wood", "group:wood"} } {"group:wood", "group:wood"},
{"group:wood", "group:wood"}
},
desc = S("Woodglass Door"),
},
} }
for name, recipe in pairs(xdecor_doors) do local mesecons_register
if minetest.global_exists("mesecon") then
mesecons_register = { effector = {
action_on = function(pos, node)
local door = doors.get(pos)
if door then
door:open()
end
end,
action_off = function(pos, node)
local door = doors.get(pos)
if door then
door:close()
end
end,
rules = mesecon.rules.pplate
}}
end
for name, def in pairs(xdecor_doors) do
if not doors.register then break end if not doors.register then break end
doors.register(name.."_door", { doors.register(name .. "_door", {
tiles = {{name = "xdecor_"..name.."_door.png", backface_culling=true}}, tiles = {
description = name:gsub("%f[%w]%l", string.upper):gsub("_", " ").." Door", {name = "xdecor_" .. name .. "_door.png", backface_culling = true}
inventory_image = "xdecor_"..name.."_door_inv.png", },
description = def.desc,
inventory_image = "xdecor_" .. name .. "_door_inv.png",
protected = door_access(name), protected = door_access(name),
groups = {choppy=2, cracky=2, oddly_breakable_by_hand=1, door=1}, groups = {choppy = 2, cracky = 2, oddly_breakable_by_hand = 1, door = 1},
recipe = recipe recipe = def.recipe,
mesecons = mesecons_register,
}) })
end end
xdecor.register("enderchest", { xdecor.register("enderchest", {
description = "Ender Chest", description = S("Ender Chest"),
tiles = {"xdecor_enderchest_top.png", "xdecor_enderchest_top.png", tiles = {
"xdecor_enderchest_side.png", "xdecor_enderchest_side.png", "xdecor_enderchest_top.png", "xdecor_enderchest_top.png",
"xdecor_enderchest_side.png", "xdecor_enderchest_front.png"}, "xdecor_enderchest_side.png", "xdecor_enderchest_side.png",
groups = {cracky=1, choppy=1}, "xdecor_enderchest_side.png", "xdecor_enderchest_front.png"
},
groups = {cracky = 1, choppy = 1},
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
on_construct = function(pos) on_construct = function(pos)
@ -290,8 +372,9 @@ xdecor.register("enderchest", {
list[current_player;main;0,5;8,4;] list[current_player;main;0,5;8,4;]
listring[current_player;enderchest] listring[current_player;enderchest]
listring[current_player;main] ]] listring[current_player;main] ]]
..xbg..default.get_hotbar_bg(0,5)) .. xbg .. default.get_hotbar_bg(0,5))
meta:set_string("infotext", "Ender Chest")
meta:set_string("infotext", S("Ender Chest"))
end end
}) })
@ -301,11 +384,11 @@ minetest.register_on_joinplayer(function(player)
end) end)
xdecor.register("ivy", { xdecor.register("ivy", {
description = "Ivy", description = S("Ivy"),
drawtype = "signlike", drawtype = "signlike",
walkable = false, walkable = false,
climbable = true, climbable = true,
groups = {snappy=3, flora=1, attached_node=1, plant=1, flammable=3}, groups = {snappy = 3, flora = 1, attached_node = 1, plant = 1, flammable = 3},
paramtype2 = "wallmounted", paramtype2 = "wallmounted",
selection_box = {type="wallmounted"}, selection_box = {type="wallmounted"},
tiles = {"xdecor_ivy.png"}, tiles = {"xdecor_ivy.png"},
@ -314,46 +397,76 @@ xdecor.register("ivy", {
sounds = default.node_sound_leaves_defaults() sounds = default.node_sound_leaves_defaults()
}) })
xdecor.register("rooster", {
description = S("Rooster"),
drawtype = "torchlike",
inventory_image = "xdecor_rooster.png",
walkable = false,
groups = {snappy = 3, attached_node = 1},
tiles = {"xdecor_rooster.png"},
})
xdecor.register("lantern", { xdecor.register("lantern", {
description = "Lantern", description = S("Lantern"),
light_source = 13, light_source = 13,
drawtype = "plantlike", drawtype = "plantlike",
inventory_image = "xdecor_lantern_inv.png", inventory_image = "xdecor_lantern_inv.png",
wield_image = "xdecor_lantern_inv.png", wield_image = "xdecor_lantern_inv.png",
paramtype2 = "wallmounted", paramtype2 = "wallmounted",
walkable = false, walkable = false,
groups = {snappy=3, attached_node=1}, groups = {snappy = 3, attached_node = 1},
tiles = {{name="xdecor_lantern.png", animation={type="vertical_frames", length=1.5}}}, tiles = {
{
name = "xdecor_lantern.png",
animation = {type="vertical_frames", length = 1.5}
}
},
selection_box = xdecor.pixelbox(16, {{4, 0, 4, 8, 16, 8}}) selection_box = xdecor.pixelbox(16, {{4, 0, 4, 8, 16, 8}})
}) })
for _, l in pairs({"iron", "wooden"}) do local xdecor_lightbox = {
xdecor.register(l.."_lightbox", { iron = S("Iron Light Box"),
description = l:gsub("^%l", string.upper).." Light Box", wooden = S("Wooden Light Box"),
tiles = {"xdecor_"..l.."_lightbox.png"}, wooden2 = S("Wooden Light Box 2"),
groups = {cracky=3, choppy=3, oddly_breakable_by_hand=2}, }
for l, desc in pairs(xdecor_lightbox) do
xdecor.register(l .. "_lightbox", {
description = desc,
tiles = {"xdecor_" .. l .. "_lightbox.png"},
groups = {cracky = 3, choppy = 3, oddly_breakable_by_hand = 2},
light_source = 13, light_source = 13,
sounds = default.node_sound_glass_defaults() sounds = default.node_sound_glass_defaults()
}) })
end end
for _, f in pairs({"dandelion_white", "dandelion_yellow", "geranium", local xdecor_potted = {
"rose", "tulip", "viola"}) do dandelion_white = S("Potted White Dandelion"),
xdecor.register("potted_"..f, { dandelion_yellow = S("Potted Yellow Dandelion"),
description = "Potted "..f:gsub("%f[%w]%l", string.upper):gsub("_", " "), geranium = S("Potted Geranium"),
rose = S("Potted Rose"),
tulip = S("Potted Tulip"),
viola = S("Potted Viola"),
}
for f, desc in pairs(xdecor_potted) do
xdecor.register("potted_" .. f, {
description = desc,
walkable = false, walkable = false,
groups = {snappy=3, flammable=3, plant=1, flower=1}, groups = {snappy = 3, flammable = 3, plant = 1, flower = 1},
tiles = {"xdecor_"..f.."_pot.png"}, tiles = {"xdecor_" .. f .. "_pot.png"},
inventory_image = "xdecor_"..f.."_pot.png", inventory_image = "xdecor_" .. f .. "_pot.png",
drawtype = "plantlike", drawtype = "plantlike",
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
selection_box = xdecor.nodebox.slab_y(0.3) selection_box = xdecor.nodebox.slab_y(0.3)
}) })
minetest.register_craft({ minetest.register_craft({
output = "xdecor:potted_"..f, output = "xdecor:potted_" .. f,
recipe = {{"default:clay_brick", "flowers:"..f, recipe = {
"default:clay_brick"}, {"", "default:clay_brick", ""}} {"default:clay_brick", "flowers:" .. f, "default:clay_brick"},
{"", "default:clay_brick", ""}
}
}) })
end end
@ -365,45 +478,52 @@ local painting_box = {
} }
xdecor.register("painting_1", { xdecor.register("painting_1", {
description = "Painting", description = S("Painting"),
tiles = {"xdecor_painting_1.png"}, tiles = {"xdecor_painting_1.png"},
inventory_image = "xdecor_painting_empty.png", inventory_image = "xdecor_painting_empty.png",
wield_image = "xdecor_painting_empty.png", wield_image = "xdecor_painting_empty.png",
paramtype2 = "wallmounted", paramtype2 = "wallmounted",
sunlight_propagates = true, sunlight_propagates = true,
groups = {choppy=3, oddly_breakable_by_hand=2, flammable=2, attached_node=1}, groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2, attached_node = 1},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
node_box = painting_box, node_box = painting_box,
node_placement_prediction = "", node_placement_prediction = "",
on_place = function(itemstack, placer, pointed_thing) on_place = function(itemstack, placer, pointed_thing)
local num = math.random(4) local num = math.random(4)
local leftover = minetest.item_place_node( local leftover = minetest.item_place_node(
ItemStack("xdecor:painting_"..num), placer, pointed_thing) ItemStack("xdecor:painting_" .. num), placer, pointed_thing)
if leftover:get_count() == 0 and if leftover:get_count() == 0 and
not minetest.setting_getbool("creative_mode") then not minetest.setting_getbool("creative_mode") then
itemstack:take_item() itemstack:take_item()
end end
return itemstack return itemstack
end end
}) })
for i = 2, 4 do for i = 2, 4 do
xdecor.register("painting_"..i, { xdecor.register("painting_" .. i, {
tiles = {"xdecor_painting_"..i..".png"}, tiles = {"xdecor_painting_" .. i .. ".png"},
paramtype2 = "wallmounted", paramtype2 = "wallmounted",
drop = "xdecor:painting_1", drop = "xdecor:painting_1",
sunlight_propagates = true, sunlight_propagates = true,
groups = {choppy=3, oddly_breakable_by_hand=2, flammable=2, groups = {
attached_node=1, not_in_creative_inventory=1}, choppy = 3,
oddly_breakable_by_hand = 2,
flammable = 2,
attached_node = 1,
not_in_creative_inventory = 1
},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
node_box = painting_box node_box = painting_box
}) })
end end
xdecor.register("stonepath", { xdecor.register("stonepath", {
description = "Garden Stone Path", description = S("Garden Stone Path"),
tiles = {"default_stone.png"}, tiles = {"default_stone.png"},
groups = {snappy=3}, groups = {snappy = 3},
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
sunlight_propagates = true, sunlight_propagates = true,
@ -418,32 +538,34 @@ local function register_hard_node(name, desc, def)
def = def or {} def = def or {}
xdecor.register(name, { xdecor.register(name, {
description = desc, description = desc,
tiles = {"xdecor_"..name..".png"}, tiles = {"xdecor_" .. name .. ".png"},
groups = def.groups or {cracky=1}, groups = def.groups or {cracky = 1},
sounds = def.sounds or default.node_sound_stone_defaults() sounds = def.sounds or default.node_sound_stone_defaults()
}) })
end end
register_hard_node("cactusbrick", "Cactus Brick") register_hard_node("cactusbrick", S("Cactus Brick"))
register_hard_node("coalstone_tile", "Coal Stone Tile") register_hard_node("coalstone_tile", S("Coal Stone Tile"))
register_hard_node("desertstone_tile", "Desert Stone Tile") register_hard_node("desertstone_tile", S("Desert Stone Tile"))
register_hard_node("hard_clay", "Hardened Clay") register_hard_node("hard_clay", S("Hardened Clay"))
register_hard_node("moonbrick", "Moon Brick") register_hard_node("moonbrick", S("Moon Brick"))
register_hard_node("stone_tile", "Stone Tile") register_hard_node("stone_tile", S("Stone Tile"))
register_hard_node("stone_rune", "Runestone") register_hard_node("stone_rune", S("Runestone"))
register_hard_node("packed_ice", "Packed Ice", {
groups = {cracky=1, puts_out_fire=1, slippery=3}, register_hard_node("packed_ice", S("Packed Ice"), {
groups = {cracky = 1, puts_out_fire = 1, slippery = 3},
sounds = default.node_sound_glass_defaults() sounds = default.node_sound_glass_defaults()
}) })
register_hard_node("wood_tile", "Wooden Tile", {
groups = {choppy=1, wood=1, flammable=2}, register_hard_node("wood_tile", S("Wooden Tile"), {
groups = {choppy = 1, wood = 1, flammable = 2},
sounds = default.node_sound_wood_defaults() sounds = default.node_sound_wood_defaults()
}) })
xdecor.register("table", { xdecor.register("table", {
description = "Table", description = S("Table"),
tiles = {"xdecor_wood.png"}, tiles = {"xdecor_wood.png"},
groups = {choppy=2, oddly_breakable_by_hand=1, flammable=2}, groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
node_box = xdecor.pixelbox(16, { node_box = xdecor.pixelbox(16, {
{0, 14, 0, 16, 2, 16}, {5.5, 0, 5.5, 5, 14, 6} {0, 14, 0, 16, 2, 16}, {5.5, 0, 5.5, 5, 14, 6}
@ -451,40 +573,65 @@ xdecor.register("table", {
}) })
xdecor.register("tatami", { xdecor.register("tatami", {
description = "Tatami", description = S("Tatami"),
tiles = {"xdecor_tatami.png"}, tiles = {"xdecor_tatami.png"},
wield_image = "xdecor_tatami.png", wield_image = "xdecor_tatami.png",
groups = {snappy=3, flammable=3}, groups = {snappy = 3, flammable = 3},
sunlight_propagates = true, sunlight_propagates = true,
node_box = xdecor.nodebox.slab_y(0.0625) node_box = xdecor.nodebox.slab_y(0.0625)
}) })
xdecor.register("trampoline", { xdecor.register("trampoline", {
description = "Trampoline", description = S("Trampoline"),
tiles = {"xdecor_trampoline.png", "mailbox_blank16.png", "xdecor_trampoline_sides.png"}, tiles = {"xdecor_trampoline.png", "mailbox_blank16.png", "xdecor_trampoline_sides.png"},
groups = {cracky=3, oddly_breakable_by_hand=1, fall_damage_add_percent=-80, bouncy=90}, groups = {cracky = 3, oddly_breakable_by_hand = 1, fall_damage_add_percent = -80, bouncy = 90},
node_box = xdecor.nodebox.slab_y(0.5), node_box = xdecor.nodebox.slab_y(0.5),
sounds = {footstep = {name="xdecor_bouncy", gain=0.8}} sounds = {
footstep = {
name = "xdecor_bouncy",
gain = 0.8
}
}
}) })
xdecor.register("tv", { xdecor.register("tv", {
description = "Television", description = S("Television"),
light_source = 11, light_source = 11,
groups = {cracky=3, oddly_breakable_by_hand=2}, groups = {cracky = 3, oddly_breakable_by_hand = 2},
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
tiles = {"xdecor_television_left.png^[transformR270", tiles = {
"xdecor_television_left.png^[transformR90", "xdecor_television_left.png^[transformR270",
"xdecor_television_left.png^[transformFX", "xdecor_television_left.png^[transformR90",
"xdecor_television_left.png", "xdecor_television_back.png", "xdecor_television_left.png^[transformFX",
{name="xdecor_television_front_animated.png", "xdecor_television_left.png", "xdecor_television_back.png",
animation = {type="vertical_frames", length=80.0}} } {
name = "xdecor_television_front_animated.png",
animation = {type = "vertical_frames", length = 80.0}
}
}
}) })
xdecor.register("woodframed_glass", { xdecor.register("woodframed_glass", {
description = "Wood Framed Glass", description = S("Wood Framed Glass"),
drawtype = "glasslike_framed", drawtype = "glasslike_framed",
sunlight_propagates = true, sunlight_propagates = true,
tiles = {"xdecor_woodframed_glass.png", "xdecor_woodframed_glass_detail.png"}, tiles = {"xdecor_woodframed_glass.png", "xdecor_woodframed_glass_detail.png"},
groups = {cracky=2, oddly_breakable_by_hand=1}, groups = {cracky = 2, oddly_breakable_by_hand = 1},
sounds = default.node_sound_glass_defaults() sounds = default.node_sound_glass_defaults()
}) })
for _, v in ipairs({"radio", "speaker"}) do
xdecor.register(v, {
description = v:gsub("^%l", string.upper),
on_rotate = screwdriver.rotate_simple,
tiles = {
"xdecor_" .. v .. "_top.png",
"xdecor_" .. v .. "_side.png",
"xdecor_" .. v .. "_side.png",
"xdecor_" .. v .. "_side.png",
"xdecor_" .. v .. "_back.png",
"xdecor_" .. v .. "_front.png",
},
groups = {cracky = 2, not_cuttable = 1},
})
end

View file

@ -66,9 +66,9 @@ minetest.register_craft({
minetest.register_craft({ minetest.register_craft({
output = "xdecor:cobweb", output = "xdecor:cobweb",
recipe = { recipe = {
{"farming:cotton", "", "farming:cotton"}, {"farming:string", "", "farming:string"},
{"", "farming:cotton", ""}, {"", "farming:string", ""},
{"farming:cotton", "", "farming:cotton"} {"farming:string", "", "farming:string"}
} }
}) })
@ -95,14 +95,16 @@ minetest.register_craft({
} }
}) })
minetest.register_craft({ if not minetest.get_modpath("moreblocks") then
output = "xdecor:empty_shelf", minetest.register_craft({
recipe = { output = "xdecor:empty_shelf",
{"group:wood", "group:wood", "group:wood"}, recipe = {
{"", "", ""}, {"group:wood", "group:wood", "group:wood"},
{"group:wood", "group:wood", "group:wood"} {"", "", ""},
} {"group:wood", "group:wood", "group:wood"}
}) }
})
end
minetest.register_craft({ minetest.register_craft({
output = "xdecor:enderchest", output = "xdecor:enderchest",
@ -174,7 +176,31 @@ minetest.register_craft({
minetest.register_craft({ minetest.register_craft({
output = "xdecor:painting_1", output = "xdecor:painting_1",
recipe = { recipe = {
{"default:sign_wall_wood", "dye:blue"} {"default:sign_wall_wood", "group:dye"}
}
})
minetest.register_craft({
output = "xdecor:radio",
type = "shapeless",
recipe = {"xdecor:speaker", "xdecor:speaker"}
})
minetest.register_craft({
output = "xdecor:rooster",
recipe = {
{"default:gold_ingot", "", "default:gold_ingot"},
{"", "default:gold_ingot", ""},
{"default:gold_ingot", "", "default:gold_ingot"}
}
})
minetest.register_craft({
output = "xdecor:speaker",
recipe = {
{"default:gold_ingot", "default:copper_ingot", "default:gold_ingot"},
{"default:copper_ingot", "", "default:copper_ingot"},
{"default:gold_ingot", "default:copper_ingot", "default:gold_ingot"}
} }
}) })
@ -265,3 +291,9 @@ minetest.register_craft({
} }
}) })
minetest.register_craft({
output = "xdecor:wooden2_lightbox",
type = "shapeless",
recipe = {"xdecor:wooden_lightbox"},
})

View file

@ -1,4 +1,5 @@
local rope = {} local rope = {}
local S = minetest.get_translator("xdecor")
-- Code by Mirko K. (modified by Temperest, Wulfsdad and kilbith) (License: GPL). -- Code by Mirko K. (modified by Temperest, Wulfsdad and kilbith) (License: GPL).
function rope.place(itemstack, placer, pointed_thing) function rope.place(itemstack, placer, pointed_thing)
@ -6,6 +7,7 @@ function rope.place(itemstack, placer, pointed_thing)
local pos = pointed_thing.above local pos = pointed_thing.above
local oldnode = minetest.get_node(pos) local oldnode = minetest.get_node(pos)
local stackname = itemstack:get_name() local stackname = itemstack:get_name()
if minetest.is_protected(pos, placer:get_player_name()) then if minetest.is_protected(pos, placer:get_player_name()) then
return itemstack return itemstack
end end
@ -18,12 +20,13 @@ function rope.place(itemstack, placer, pointed_thing)
oldnode = minetest.get_node(pos) oldnode = minetest.get_node(pos)
end end
end end
return itemstack return itemstack
end end
function rope.remove(pos, oldnode, digger, rope_name) function rope.remove(pos, oldnode, digger, rope_name)
local num = 0 local num = 0
local below = {x=pos.x, y=pos.y, z=pos.z} local below = {x = pos.x, y = pos.y, z = pos.z}
local digger_inv = digger:get_inventory() local digger_inv = digger:get_inventory()
while minetest.get_node(below).name == rope_name do while minetest.get_node(below).name == rope_name do
@ -31,24 +34,28 @@ function rope.remove(pos, oldnode, digger, rope_name)
below.y = below.y - 1 below.y = below.y - 1
num = num + 1 num = num + 1
end end
if num == 0 then return end if num == 0 then return end
digger_inv:add_item("main", rope_name.." "..num) digger_inv:add_item("main", rope_name.." "..num)
return true return true
end end
xdecor.register("rope", { xdecor.register("rope", {
description = "Rope", description = S("Rope"),
drawtype = "plantlike", drawtype = "plantlike",
walkable = false, walkable = false,
climbable = true, climbable = true,
groups = {snappy=3, flammable=3}, groups = {snappy = 3, flammable = 3},
tiles = {"xdecor_rope.png"}, tiles = {"xdecor_rope.png"},
inventory_image = "xdecor_rope_inv.png", inventory_image = "xdecor_rope_inv.png",
wield_image = "xdecor_rope_inv.png", wield_image = "xdecor_rope_inv.png",
selection_box = xdecor.pixelbox(8, {{3, 0, 3, 2, 8, 2}}), selection_box = xdecor.pixelbox(8, {{3, 0, 3, 2, 8, 2}}),
on_place = rope.place, on_place = rope.place,
on_punch = function(pos, node, puncher, pointed_thing) on_punch = function(pos, node, puncher, pointed_thing)
local player_name = puncher:get_player_name() local player_name = puncher:get_player_name()
if not minetest.is_protected(pos, player_name) or if not minetest.is_protected(pos, player_name) or
minetest.get_player_privs(player_name).protection_bypass then minetest.get_player_privs(player_name).protection_bypass then
rope.remove(pos, node, puncher, "xdecor:rope") rope.remove(pos, node, puncher, "xdecor:rope")
@ -65,4 +72,4 @@ minetest.register_craft({
{"farming:string"}, {"farming:string"},
{"farming:string"} {"farming:string"}
} }
}) })

View file

@ -1,121 +1,117 @@
local workbench = {} local workbench = {}
WB = {} local nodes = {}
screwdriver = screwdriver or {} screwdriver = screwdriver or {}
local min, ceil = math.min, math.ceil local min, ceil = math.min, math.ceil
local registered_nodes = minetest.registered_nodes local S = minetest.get_translator("xdecor")
local FS = function(...) return minetest.formspec_escape(S(...)) end
-- Nodes allowed to be cut -- Nodes allowed to be cut
-- Only the regular, solid blocks without metas or explosivity can be cut -- Only the regular, solid blocks without metas or explosivity can be cut
local nodes = {} for node, def in pairs(minetest.registered_nodes) do
for node, def in pairs(registered_nodes) do
if xdecor.stairs_valid_def(def) then if xdecor.stairs_valid_def(def) then
nodes[#nodes+1] = node nodes[#nodes + 1] = node
end end
end end
-- Optionally, you can register custom cuttable nodes in the workbench
WB.custom_nodes_register = {
-- "default:leaves",
}
setmetatable(nodes, {
__concat = function(t1, t2)
for i=1, #t2 do
t1[#t1+1] = t2[i]
end
return t1
end
})
nodes = nodes..WB.custom_nodes_register
-- Nodeboxes definitions -- Nodeboxes definitions
workbench.defs = { workbench.defs = {
-- Name Yield X Y Z W H L -- Name YieldX YZ WH L
{"nanoslab", 16, { 0, 0, 0, 8, 1, 8 }}, {"nanoslab", 16, { 0, 0, 0, 8, 1, 8 }},
{"micropanel", 16, { 0, 0, 0, 16, 1, 8 }}, {"micropanel", 16, { 0, 0, 0, 16, 1, 8 }},
{"microslab", 8, { 0, 0, 0, 16, 1, 16 }}, {"microslab", 8, { 0, 0, 0, 16, 1, 16 }},
{"thinstair", 8, { 0, 7, 0, 16, 1, 8 }, {"thinstair", 8, { 0, 7, 0, 16, 1, 8 },
{ 0, 15, 8, 16, 1, 8 }}, { 0, 15, 8, 16, 1, 8 }},
{"cube", 4, { 0, 0, 0, 8, 8, 8 }}, {"cube", 4, { 0, 0, 0, 8, 8, 8 }},
{"panel", 4, { 0, 0, 0, 16, 8, 8 }}, {"panel", 4, { 0, 0, 0, 16, 8, 8 }},
{"slab", 2, nil }, {"slab", 2, nil },
{"doublepanel", 2, { 0, 0, 0, 16, 8, 8 }, {"doublepanel", 2, { 0, 0, 0, 16, 8, 8 },
{ 0, 8, 8, 16, 8, 8 }}, { 0, 8, 8, 16, 8, 8 }},
{"halfstair", 2, { 0, 0, 0, 8, 8, 16 }, {"halfstair", 2, { 0, 0, 0, 8, 8, 16 },
{ 0, 8, 8, 8, 8, 8 }}, { 0, 8, 8, 8, 8, 8 }},
{"outerstair", 1, { 0, 0, 0, 16, 8, 16 }, {"stair_outer", 1, nil },
{ 0, 8, 8, 8, 8, 8 }},
{"stair", 1, nil }, {"stair", 1, nil },
{"innerstair", 1, { 0, 0, 0, 16, 8, 16 }, {"stair_inner", 1, nil }
{ 0, 8, 8, 16, 8, 8 },
{ 0, 8, 0, 8, 8, 8 }}
} }
local repairable_tools = {"pick", "axe", "shovel", "sword", "hoe", "armor", "shield"}
-- Tools allowed to be repaired -- Tools allowed to be repaired
function workbench:repairable(stack) function workbench:repairable(stack)
local tools = {"pick", "axe", "shovel", "sword", "hoe", "armor", "shield"} for _, t in ipairs(repairable_tools) do
for _, t in pairs(tools) do if stack:find(t) then
if stack:find(t) then return true end return true
end
end end
return false
end end
function workbench:get_output(inv, input, name) function workbench:get_output(inv, input, name)
local output = {} local output = {}
for i=1, #self.defs do for i = 1, #self.defs do
local nbox = self.defs[i] local nbox = self.defs[i]
local count = min(nbox[2] * input:get_count(), input:get_stack_max()) local count = min(nbox[2] * input:get_count(), input:get_stack_max())
local item = name.."_"..nbox[1] local item = name .. "_" .. nbox[1]
item = nbox[3] and item or "stairs:"..nbox[1].."_"..name:match(":(.*)")
output[#output+1] = item.." "..count item = nbox[3] and item or "stairs:" .. nbox[1] .. "_" .. name:match(":(.*)")
output[i] = item .. " " .. count
end end
inv:set_list("forms", output) inv:set_list("forms", output)
end end
local main_fs = "label[0.9,1.23;"..FS("Cut").."]"
.."label[0.9,2.23;"..FS("Repair").."]"
..[[ box[-0.05,1;2.05,0.9;#555555]
box[-0.05,2;2.05,0.9;#555555] ]]
.."button[0,0;2,1;craft;"..FS("Crafting").."]"
.."button[2,0;2,1;storage;"..FS("Storage").."]"
..[[ image[3,1;1,1;gui_arrow.png]
image[0,1;1,1;worktable_saw.png]
image[0,2;1,1;worktable_anvil.png]
image[3,2;1,1;hammer_layout.png]
list[context;input;2,1;1,1;]
list[context;tool;2,2;1,1;]
list[context;hammer;3,2;1,1;]
list[context;forms;4,0;4,3;]
listring[current_player;main]
listring[context;tool]
listring[current_player;main]
listring[context;hammer]
listring[current_player;main]
listring[context;forms]
listring[current_player;main]
listring[context;input]
]]
local crafting_fs = "image[5,1;1,1;gui_furnace_arrow_bg.png^[transformR270]"
.."button[0,0;1.5,1;back;< "..FS("Back").."]"
..[[ list[current_player;craft;2,0;3,3;]
list[current_player;craftpreview;6,1;1,1;]
listring[current_player;main]
listring[current_player;craft]
]]
local storage_fs = "list[context;storage;0,1;8,2;]"
.."button[0,0;1.5,1;back;< "..FS("Back").."]"
..[[listring[context;storage]
listring[current_player;main]
]]
local formspecs = { local formspecs = {
-- Main formspec -- Main formspec
[[ label[0.9,1.23;Cut] main_fs,
label[0.9,2.23;Repair]
box[-0.05,1;2.05,0.9;#555555]
box[-0.05,2;2.05,0.9;#555555]
button[0,0;2,1;craft;Crafting]
button[2,0;2,1;storage;Storage]
image[3,1;1,1;gui_furnace_arrow_bg.png^[transformR270]
image[0,1;1,1;worktable_saw.png]
image[0,2;1,1;worktable_anvil.png]
image[3,2;1,1;hammer_layout.png]
list[context;input;2,1;1,1;]
list[context;tool;2,2;1,1;]
list[context;hammer;3,2;1,1;]
list[context;forms;4,0;4,3;]
listring[current_player;main]
listring[context;tool]
listring[current_player;main]
listring[context;hammer]
listring[current_player;main]
listring[context;forms]
listring[current_player;main]
listring[context;input] ]],
-- Crafting formspec -- Crafting formspec
[[ image[5,1;1,1;gui_furnace_arrow_bg.png^[transformR270] crafting_fs,
button[0,0;1.5,1;back;< Back]
list[current_player;craft;2,0;3,3;]
list[current_player;craftpreview;6,1;1,1;]
listring[current_player;main]
listring[current_player;craft] ]],
-- Storage formspec -- Storage formspec
[[ list[context;storage;0,1;8,2;] storage_fs,
button[0,0;1.5,1;back;< Back]
listring[context;storage]
listring[current_player;main] ]]
} }
function workbench:set_formspec(meta, id) function workbench:set_formspec(meta, id)
meta:set_string("formspec", meta:set_string("formspec",
"size[8,7;]list[current_player;main;0,3.25;8,4;]".. "size[8,7;]list[current_player;main;0,3.25;8,4;]" ..
formspecs[id]..xbg..default.get_hotbar_bg(0,3.25)) formspecs[id] .. xbg .. default.get_hotbar_bg(0,3.25))
end end
function workbench.construct(pos) function workbench.construct(pos)
@ -128,17 +124,17 @@ function workbench.construct(pos)
inv:set_size("forms", 4*3) inv:set_size("forms", 4*3)
inv:set_size("storage", 8*2) inv:set_size("storage", 8*2)
meta:set_string("infotext", "Work Bench") meta:set_string("infotext", S("Work Bench"))
workbench:set_formspec(meta, 1) workbench:set_formspec(meta, 1)
end end
function workbench.fields(pos, _, fields) function workbench.fields(pos, _, fields)
if fields.quit then return end if fields.quit then return end
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local id = fields.back and 1 or local id = fields.back and 1 or fields.craft and 2 or fields.storage and 3
fields.craft and 2 or
fields.storage and 3
if not id then return end if not id then return end
workbench:set_formspec(meta, id) workbench:set_formspec(meta, id)
end end
@ -159,32 +155,30 @@ function workbench.timer(pos)
return return
end end
-- Tool's wearing range: 0-65535 | 0 = new condition -- Tool's wearing range: 0-65535; 0 = new condition
tool:add_wear(-500) tool:add_wear(-500)
hammer:add_wear(700) hammer:add_wear(700)
inv:set_stack("tool", 1, tool) inv:set_stack("tool", 1, tool)
inv:set_stack("hammer", 1, hammer) inv:set_stack("hammer", 1, hammer)
return true return true
end end
function workbench.put(_, listname, _, stack) function workbench.allow_put(pos, listname, index, stack, player)
local stackname = stack:get_name() local stackname = stack:get_name()
if (listname == "tool" and stack:get_wear() > 0 and if (listname == "tool" and stack:get_wear() > 0 and
workbench:repairable(stackname)) or workbench:repairable(stackname)) or
(listname == "input" and registered_nodes[stackname.."_cube"]) or (listname == "input" and minetest.registered_nodes[stackname .. "_cube"]) or
(listname == "hammer" and stackname == "xdecor:hammer") or (listname == "hammer" and stackname == "xdecor:hammer") or
listname == "storage" then listname == "storage" then
return stack:get_count() return stack:get_count()
end end
return 0 return 0
end end
function workbench.move(_, from_list, _, to_list, _, count) function workbench.on_put(pos, listname, index, stack, player)
return (to_list == "storage" and from_list ~= "forms") and count or 0
end
function workbench.on_put(pos, listname, _, stack)
local inv = minetest.get_meta(pos):get_inventory() local inv = minetest.get_meta(pos):get_inventory()
if listname == "input" then if listname == "input" then
local input = inv:get_stack("input", 1) local input = inv:get_stack("input", 1)
@ -195,6 +189,24 @@ function workbench.on_put(pos, listname, _, stack)
end end
end end
function workbench.allow_move(pos, from_list, from_index, to_list, to_index, count, player)
return (to_list == "storage" and from_list ~= "forms") and count or 0
end
function workbench.on_move(pos, from_list, from_index, to_list, to_index, count, player)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local from_stack = inv:get_stack(from_list, from_index)
local to_stack = inv:get_stack(to_list, to_index)
workbench.on_take(pos, from_list, from_index, from_stack, player)
workbench.on_put(pos, to_list, to_index, to_stack, player)
end
function workbench.allow_take(pos, listname, index, stack, player)
return stack:get_count()
end
function workbench.on_take(pos, listname, index, stack, player) function workbench.on_take(pos, listname, index, stack, player)
local inv = minetest.get_meta(pos):get_inventory() local inv = minetest.get_meta(pos):get_inventory()
local input = inv:get_stack("input", 1) local input = inv:get_stack("input", 1)
@ -202,7 +214,7 @@ function workbench.on_take(pos, listname, index, stack, player)
local stackname = stack:get_name() local stackname = stack:get_name()
if listname == "input" then if listname == "input" then
if stackname == inputname and registered_nodes[inputname.."_cube"] then if stackname == inputname and minetest.registered_nodes[inputname .. "_cube"] then
workbench:get_output(inv, input, stackname) workbench:get_output(inv, input, stackname)
else else
inv:set_list("forms", {}) inv:set_list("forms", {})
@ -223,12 +235,14 @@ function workbench.on_take(pos, listname, index, stack, player)
end end
xdecor.register("workbench", { xdecor.register("workbench", {
description = "Work Bench", description = S("Work Bench"),
groups = {cracky=2, choppy=2, oddly_breakable_by_hand=1}, groups = {cracky = 2, choppy = 2, oddly_breakable_by_hand = 1},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
tiles = {"xdecor_workbench_top.png", "xdecor_workbench_top.png", tiles = {
"xdecor_workbench_sides.png", "xdecor_workbench_sides.png", "xdecor_workbench_top.png","xdecor_workbench_top.png",
"xdecor_workbench_front.png", "xdecor_workbench_front.png"}, "xdecor_workbench_sides.png", "xdecor_workbench_sides.png",
"xdecor_workbench_front.png", "xdecor_workbench_front.png"
},
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
can_dig = workbench.dig, can_dig = workbench.dig,
on_timer = workbench.timer, on_timer = workbench.timer,
@ -236,17 +250,19 @@ xdecor.register("workbench", {
on_receive_fields = workbench.fields, on_receive_fields = workbench.fields,
on_metadata_inventory_put = workbench.on_put, on_metadata_inventory_put = workbench.on_put,
on_metadata_inventory_take = workbench.on_take, on_metadata_inventory_take = workbench.on_take,
allow_metadata_inventory_put = workbench.put, on_metadata_inventory_move = workbench.on_move,
allow_metadata_inventory_move = workbench.move allow_metadata_inventory_put = workbench.allow_put,
allow_metadata_inventory_take = workbench.allow_take,
allow_metadata_inventory_move = workbench.allow_move
}) })
for _, d in pairs(workbench.defs) do for _, d in ipairs(workbench.defs) do
for i=1, #nodes do for i = 1, #nodes do
pcall(function()
local node = nodes[i] local node = nodes[i]
local def = registered_nodes[node] local mod_name, item_name = node:match("^(.-):(.*)")
local def = minetest.registered_nodes[node]
if d[3] then if item_name and d[3] then
local groups = {} local groups = {}
local tiles local tiles
groups.not_in_creative_inventory = 1 groups.not_in_creative_inventory = 1
@ -267,14 +283,16 @@ for i=1, #nodes do
tiles = {def.tile_images[1]} tiles = {def.tile_images[1]}
end end
if not registered_nodes["stairs:slab_"..node:match(":(.*)")] then --TODO: Translation support for Stairs/Slab
stairs.register_stair_and_slab(node:match(":(.*)"), node, if not minetest.registered_nodes["stairs:slab_" .. item_name] then
groups, tiles, def.description.." Stair", stairs.register_stair_and_slab(item_name, node,
def.description.." Slab", def.sounds) groups, tiles, def.description .. " Stair",
def.description .. " Slab", def.sounds)
end end
minetest.register_node(":"..node.."_"..d[1], { minetest.register_node(":" .. node .. "_" .. d[1], {
description = def.description.." "..d[1]:gsub("^%l", string.upper), --TODO: Translation support
description = def.description .. " " .. d[1]:gsub("^%l", string.upper),
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
drawtype = "nodebox", drawtype = "nodebox",
@ -286,18 +304,29 @@ for i=1, #nodes do
sunlight_propagates = true, sunlight_propagates = true,
on_place = minetest.rotate_node on_place = minetest.rotate_node
}) })
elseif item_name and mod_name then
minetest.register_alias_force(
("%s:%s_innerstair"):format(mod_name, item_name),
("stairs:stair_inner_%s"):format(item_name)
)
minetest.register_alias_force(
("%s:%s_outerstair"):format(mod_name, item_name),
("stairs:stair_outer_%s"):format(item_name)
)
end end
end)
end end
end end
-- Craft items -- Craft items
minetest.register_tool("xdecor:hammer", { minetest.register_tool("xdecor:hammer", {
description = "Hammer", description = S("Hammer"),
inventory_image = "xdecor_hammer.png", inventory_image = "xdecor_hammer.png",
wield_image = "xdecor_hammer.png", wield_image = "xdecor_hammer.png",
on_use = function() do return end end on_use = function() do
return end
end
}) })
-- Recipes -- Recipes

Binary file not shown.

After

Width:  |  Height:  |  Size: 469 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB