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 = {
@ -8,5 +7,8 @@ read_globals = {
"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

@ -3,6 +3,8 @@
│ │ │ │
│ Code: BSD │ │ Code: BSD │
│ Textures: WTFPL (credits: Gambit, kilbith, Cisoun) │ │ Textures: WTFPL (credits: Gambit, kilbith, Cisoun) │
│ Textures (radio, speaker, hanging candle, rooster) by │
gigomaf <bartiko2@poczta.fm> (CC BY-NC 3.0) │
│ Sounds: │ │ 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/ │

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

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}
@ -16,12 +22,14 @@ 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] = {
@ -33,10 +41,12 @@ 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)
@ -55,4 +65,3 @@ mt.__index = function(table, key)
end end
setmetatable(xdecor.nodebox, mt) setmetatable(xdecor.nodebox, mt)

View file

@ -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,9 +42,9 @@ 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
@ -76,6 +76,7 @@ function xdecor.register(name, def)
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)

View file

@ -1,18 +1,5 @@
--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")
@ -21,7 +8,6 @@ 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")
@ -34,10 +20,10 @@ 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")

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,17 +57,19 @@ 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
@ -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,38 +108,45 @@ 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
obj:remove()
end
minetest.set_node(pos, {name = "xdecor:cauldron_soup", param2 = node.param2}) 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
@ -136,20 +155,21 @@ function cauldron.take_soup(pos, node, clicker, itemstack)
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,6 +35,7 @@ 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
@ -37,34 +45,45 @@ function enchanting:get_tooltip(enchant, orig_caps, fleshy)
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)
@ -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
@ -95,9 +114,12 @@ function enchanting.fields(pos, _, fields, sender)
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,31 +134,37 @@ 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)
@ -165,8 +193,11 @@ function enchanting.timer(pos)
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
@ -184,14 +215,17 @@ function enchanting.timer(pos)
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_top.png", "xdecor_enchantment_bottom.png",
"xdecor_enchantment_side.png", "xdecor_enchantment_side.png", "xdecor_enchantment_side.png", "xdecor_enchantment_side.png",
"xdecor_enchantment_side.png", "xdecor_enchantment_side.png"}, "xdecor_enchantment_side.png", "xdecor_enchantment_side.png"
},
groups = {cracky = 1, level = 1}, groups = {cracky = 1, level = 1},
light_source = 6, light_source = 6,
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
@ -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,7 +250,7 @@ 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
@ -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
@ -252,8 +288,9 @@ function enchanting:register_tools(mod, def)
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),
self:get_tooltip(enchant, original_groupcaps[group], fleshy)),
inventory_image = original_tool.inventory_image .. "^[colorize:violet:50", 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},
@ -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

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,9 +100,10 @@ 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)
if not player then return end if not player then return end
@ -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,
@ -130,7 +142,7 @@ minetest.register_entity("xdecor:f_item", {
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
}) })

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,7 +32,10 @@ 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 ""
@ -44,15 +57,16 @@ function mailbox:formspec(pos, owner, is_owner)
giver = giver .. "#FFFF00," .. giver_name .. "," .. i .. giver = giver .. "#FFFF00," .. giver_name .. "," .. i ..
",#FFFFFF,x " .. stack_count .. "," ",#FFFFFF,x " .. stack_count .. ","
img = img .. i .. "=" .. img = img .. i .. "=" ..
img_col(stack_name) .. "^\\[resize:16x16," 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] ]] ..
@ -62,11 +76,12 @@ function mailbox:formspec(pos, owner, is_owner)
"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
@ -85,7 +100,7 @@ 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)
@ -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
@ -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,7 +165,7 @@ 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"},

View file

@ -5,10 +5,13 @@ 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,
@ -35,6 +38,7 @@ 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 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 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")
@ -47,12 +51,13 @@ function plate.timer(pos)
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}}),
@ -77,16 +82,18 @@ 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}}),
@ -94,6 +101,7 @@ xdecor.register("lever_off", {
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}
@ -103,6 +111,7 @@ xdecor.register("lever_off", {
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
}) })

View file

@ -1,4 +1,5 @@
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, {
@ -6,7 +7,7 @@ local function register_pane(name, desc, def)
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,
@ -15,38 +16,46 @@ local function register_pane(name, desc, def)
}) })
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", "default:papyrus", "default:papyrus"},
{"default:papyrus", "farming:cotton", "default:papyrus"}, {"default:papyrus", "farming:cotton", "default:papyrus"},
{"default:papyrus", "default:papyrus", "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: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"}} {"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:wood", "group:stick", "group:wood"},
{"group:stick", "group:stick", "group:stick"}, {"group:stick", "group:stick", "group:stick"},
{"group:wood", "group:stick", "group:wood"}} {"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",
@ -58,7 +67,7 @@ xdecor.register("baricade", {
}) })
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},
@ -79,36 +88,48 @@ local function register_storage(name, desc, def)
}) })
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_cabinet_sides.png", "xdecor_cabinet_sides.png",
"xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_sides.png",
"xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_front.png"} "xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_front.png"
}
}) })
register_storage("empty_shelf", "Empty Shelf", { if minetest.get_modpath("moreblocks") then
minetest.register_alias("xdecor:empty_shelf", "moreblocks:empty_shelf")
else
register_storage("empty_shelf", S("Empty 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_empty_shelf.png"} "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",
@ -116,31 +137,41 @@ xdecor.register("candle", {
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",
@ -168,12 +199,12 @@ xdecor.register("cobweb", {
}) })
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,
@ -207,13 +238,15 @@ for _, c in pairs(curtain_colors) do
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,
@ -227,7 +260,7 @@ 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}
}) })
@ -238,48 +271,97 @@ end
local xdecor_doors = { local xdecor_doors = {
japanese = { japanese = {
recipe = {
{"group:wood", "default:paper"}, {"group:wood", "default:paper"},
{"default:paper", "group:wood"}, {"default:paper", "group:wood"},
{"group:wood", "default:paper"} }, {"group:wood", "default:paper"}
},
desc = S("Japanese Door"),
},
prison = { prison = {
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"} }, {"xpanes:bar_flat", "xpanes:bar_flat"}
},
desc = S("Prison Door"),
},
rusty_prison = { rusty_prison = {
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"} }, {"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat"}
},
desc = S("Rusty Prison Door"),
},
screen = { screen = {
recipe = {
{"group:wood", "group:wood"}, {"group:wood", "group:wood"},
{"xpanes:chainlink_flat", "xpanes:chainlink_flat"}, {"xpanes:chainlink_flat", "xpanes:chainlink_flat"},
{"group:wood", "group:wood"} }, {"group:wood", "group:wood"}
},
desc = S("Screen Door"),
},
slide = { slide = {
recipe = {
{"default:paper", "default:paper"}, {"default:paper", "default:paper"},
{"default:paper", "default:paper"}, {"default:paper", "default:paper"},
{"group:wood", "group:wood"} }, {"group:wood", "group:wood"}
},
desc = S("Slide Door"),
},
woodglass = { woodglass = {
recipe = {
{"default:glass", "default:glass"}, {"default:glass", "default:glass"},
{"group:wood", "group:wood"}, {"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}
},
description = def.desc,
inventory_image = "xdecor_" .. name .. "_door_inv.png", 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_top.png", "xdecor_enderchest_top.png",
"xdecor_enderchest_side.png", "xdecor_enderchest_side.png", "xdecor_enderchest_side.png", "xdecor_enderchest_side.png",
"xdecor_enderchest_side.png", "xdecor_enderchest_front.png"}, "xdecor_enderchest_side.png", "xdecor_enderchest_front.png"
},
groups = {cracky = 1, choppy = 1}, 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,
@ -291,7 +373,8 @@ xdecor.register("enderchest", {
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,7 +384,7 @@ 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,
@ -314,8 +397,17 @@ 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",
@ -323,13 +415,24 @@ xdecor.register("lantern", {
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 = {
iron = S("Iron Light Box"),
wooden = S("Wooden Light Box"),
wooden2 = S("Wooden Light Box 2"),
}
for l, desc in pairs(xdecor_lightbox) do
xdecor.register(l .. "_lightbox", { xdecor.register(l .. "_lightbox", {
description = l:gsub("^%l", string.upper).." Light Box", description = desc,
tiles = {"xdecor_" .. l .. "_lightbox.png"}, tiles = {"xdecor_" .. l .. "_lightbox.png"},
groups = {cracky = 3, choppy = 3, oddly_breakable_by_hand = 2}, groups = {cracky = 3, choppy = 3, oddly_breakable_by_hand = 2},
light_source = 13, light_source = 13,
@ -337,10 +440,18 @@ for _, l in pairs({"iron", "wooden"}) do
}) })
end end
for _, f in pairs({"dandelion_white", "dandelion_yellow", "geranium", local xdecor_potted = {
"rose", "tulip", "viola"}) do dandelion_white = S("Potted White Dandelion"),
dandelion_yellow = S("Potted Yellow Dandelion"),
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, { xdecor.register("potted_" .. f, {
description = "Potted "..f:gsub("%f[%w]%l", string.upper):gsub("_", " "), 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"},
@ -352,8 +463,10 @@ for _, f in pairs({"dandelion_white", "dandelion_yellow", "geranium",
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,7 +478,7 @@ 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",
@ -379,10 +492,12 @@ xdecor.register("painting_1", {
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
}) })
@ -393,15 +508,20 @@ for i = 2, 4 do
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,
@ -424,24 +544,26 @@ local function register_hard_node(name, desc, def)
}) })
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", {
register_hard_node("packed_ice", S("Packed Ice"), {
groups = {cracky = 1, puts_out_fire = 1, slippery = 3}, 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", {
register_hard_node("wood_tile", S("Wooden Tile"), {
groups = {choppy = 1, wood = 1, flammable = 2}, 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(),
@ -451,7 +573,7 @@ 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},
@ -460,31 +582,56 @@ xdecor.register("tatami", {
}) })
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^[transformR270",
"xdecor_television_left.png^[transformR90", "xdecor_television_left.png^[transformR90",
"xdecor_television_left.png^[transformFX", "xdecor_television_left.png^[transformFX",
"xdecor_television_left.png", "xdecor_television_back.png", "xdecor_television_left.png", "xdecor_television_back.png",
{name="xdecor_television_front_animated.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,6 +95,7 @@ minetest.register_craft({
} }
}) })
if not minetest.get_modpath("moreblocks") then
minetest.register_craft({ minetest.register_craft({
output = "xdecor:empty_shelf", output = "xdecor:empty_shelf",
recipe = { recipe = {
@ -103,6 +104,7 @@ minetest.register_craft({
{"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,6 +20,7 @@ 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
@ -31,13 +34,15 @@ 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,
@ -47,8 +52,10 @@ xdecor.register("rope", {
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")

View file

@ -1,34 +1,19 @@
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 YieldX YZ WH L -- Name YieldX YZ WH L
@ -44,21 +29,20 @@ workbench.defs = {
{ 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)
@ -67,22 +51,21 @@ function workbench:get_output(inv, input, name)
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(":(.*)") item = nbox[3] and item or "stairs:" .. nbox[1] .. "_" .. name:match(":(.*)")
output[#output+1] = item.." "..count output[i] = item .. " " .. count
end end
inv:set_list("forms", output) inv:set_list("forms", output)
end end
local formspecs = { local main_fs = "label[0.9,1.23;"..FS("Cut").."]"
-- Main formspec .."label[0.9,2.23;"..FS("Repair").."]"
[[ label[0.9,1.23;Cut] ..[[ box[-0.05,1;2.05,0.9;#555555]
label[0.9,2.23;Repair] box[-0.05,2;2.05,0.9;#555555] ]]
box[-0.05,1;2.05,0.9;#555555] .."button[0,0;2,1;craft;"..FS("Crafting").."]"
box[-0.05,2;2.05,0.9;#555555] .."button[2,0;2,1;storage;"..FS("Storage").."]"
button[0,0;2,1;craft;Crafting] ..[[ image[3,1;1,1;gui_arrow.png]
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,1;1,1;worktable_saw.png]
image[0,2;1,1;worktable_anvil.png] image[0,2;1,1;worktable_anvil.png]
image[3,2;1,1;hammer_layout.png] image[3,2;1,1;hammer_layout.png]
@ -97,19 +80,32 @@ local formspecs = {
listring[current_player;main] listring[current_player;main]
listring[context;forms] listring[context;forms]
listring[current_player;main] listring[current_player;main]
listring[context;input] ]], listring[context;input]
-- Crafting formspec ]]
[[ image[5,1;1,1;gui_furnace_arrow_bg.png^[transformR270]
button[0,0;1.5,1;back;< Back] local crafting_fs = "image[5,1;1,1;gui_furnace_arrow_bg.png^[transformR270]"
list[current_player;craft;2,0;3,3;] .."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;] list[current_player;craftpreview;6,1;1,1;]
listring[current_player;main] listring[current_player;main]
listring[current_player;craft] ]], 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 = {
-- Main formspec
main_fs,
-- Crafting formspec
crafting_fs,
-- 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)
@ -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_top.png","xdecor_workbench_top.png",
"xdecor_workbench_sides.png", "xdecor_workbench_sides.png", "xdecor_workbench_sides.png", "xdecor_workbench_sides.png",
"xdecor_workbench_front.png", "xdecor_workbench_front.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,13 +283,15 @@ 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
stairs.register_stair_and_slab(item_name, node,
groups, tiles, def.description .. " Stair", groups, tiles, def.description .. " Stair",
def.description .. " Slab", def.sounds) def.description .. " Slab", def.sounds)
end end
minetest.register_node(":" .. node .. "_" .. d[1], { minetest.register_node(":" .. node .. "_" .. d[1], {
--TODO: Translation support
description = def.description .. " " .. d[1]:gsub("^%l", string.upper), description = def.description .. " " .. d[1]:gsub("^%l", string.upper),
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
@ -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