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
read_globals = {
@ -7,6 +6,9 @@ read_globals = {
"default",
"stairs", "doors", "xpanes",
"xdecor", "xbg",
table = { fields = { "copy" } },
table = {fields = {"copy"}},
string = {fields = {"split"}},
"unpack",
"stairsplus",
"mesecon"
}

View File

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

View File

@ -1,13 +1,17 @@
## X-Decor ##
##### 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 Home Decor and More Blocks all together. #####
[![ContentDB](https://content.minetest.net/packages/jp/xdecor/shields/downloads/)](https://content.minetest.net/packages/jp/xdecor/)
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 ###
##### Special thanks to Gambit for the textures from the PixelBOX pack for Minetest. #####
##### Thanks to all contributors that keep this mod alive. #####
Special thanks to Gambit for the textures from the PixelBOX pack for Minetest.
Thanks to all contributors who keep this mod alive.
![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
pos.y = pos.y - 0.5
clicker:setpos(pos)
clicker:set_eye_offset({x=0, y=0, z=0}, {x=0, y=0, z=0})
clicker:set_physics_override(1, 1, 1)
clicker:set_pos(pos)
clicker:set_eye_offset(vector.new(), vector.new())
clicker:set_physics_override({speed = 1, jump = 1, gravity = 1})
default.player_attached[player_name] = false
default.player_set_animation(clicker, "stand", 30)
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_physics_override(0, 0, 0)
clicker:setpos(pos)
clicker:set_eye_offset({x = 0, y = -7, z = 2}, vector.new())
clicker:set_physics_override({speed = 0, jump = 0, gravity = 1})
clicker:set_pos(pos)
default.player_attached[player_name] = true
default.player_set_animation(clicker, "sit", 30)
if node.param2 == 0 then clicker:set_look_yaw(3.15)
elseif node.param2 == 1 then 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
if node.param2 == 0 then
clicker:set_look_yaw(3.15)
elseif node.param2 == 1 then
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
@ -47,6 +52,6 @@ function xdecor.sit_dig(pos, digger)
return false
end
end
return true
end

View File

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

View File

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

View File

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

View File

@ -1,29 +1,15 @@
--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 = {}
local modpath = minetest.get_modpath("xdecor")
dofile(modpath.."/handlers/animations.lua")
dofile(modpath.."/handlers/helpers.lua")
dofile(modpath.."/handlers/nodeboxes.lua")
dofile(modpath.."/handlers/registration.lua")
dofile(modpath .. "/handlers/animations.lua")
dofile(modpath .. "/handlers/helpers.lua")
dofile(modpath .. "/handlers/nodeboxes.lua")
dofile(modpath .. "/handlers/registration.lua")
dofile(modpath.."/src/alias.lua")
dofile(modpath.."/src/nodes.lua")
dofile(modpath.."/src/recipes.lua")
dofile(modpath .. "/src/nodes.lua")
dofile(modpath .. "/src/recipes.lua")
local subpart = {
"chess",
@ -34,13 +20,13 @@ local subpart = {
"mailbox",
"mechanisms",
"rope",
"workbench"
"workbench",
}
for _, name in pairs(subpart) do
local enable = minetest.settings:get_bool("enable_xdecor_"..name)
for _, name in ipairs(subpart) do
local enable = minetest.settings:get_bool("enable_xdecor_" .. name)
if enable or enable == nil then
dofile(modpath.."/src/"..name..".lua")
dofile(modpath .. "/src/" .. name .. ".lua")
end
end

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

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

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

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

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

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

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

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

View File

@ -1 +1,5 @@
name = xdecor
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 S = minetest.get_translator("xdecor")
-- Add more ingredients here that make a soup.
local ingredients_list = {
@ -17,7 +18,9 @@ cauldron.cbox = {
function cauldron.stop_sound(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
function cauldron.idle_construct(pos)
@ -29,11 +32,14 @@ end
function cauldron.boiling_construct(pos)
local spos = minetest.hash_node_position(pos)
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)
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)
timer:start(5.0)
@ -51,29 +57,31 @@ function cauldron.filling(pos, node, clicker, itemstack)
inv:add_item("main", "bucket:bucket_water 1")
else
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
end
else
itemstack:replace("bucket:bucket_water")
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
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")
end
return itemstack
end
end
function cauldron.idle_timer(pos)
local below_node = {x=pos.x, y=pos.y-1, z=pos.z}
local below_node = {x = pos.x, y = pos.y - 1, z = pos.z}
if not minetest.get_node(below_node).name:find("fire") then
return true
end
local node = minetest.get_node(pos)
minetest.set_node(pos, {name="xdecor:cauldron_boiling", param2=node.param2})
minetest.set_node(pos, {name = "xdecor:cauldron_boiling", param2 = node.param2})
return true
end
@ -82,13 +90,17 @@ local function eatable(itemstring)
local item = itemstring:match("[%w_:]+")
local on_use_def = minetest.registered_items[item].on_use
if not on_use_def then return end
return string.format("%q", string.dump(on_use_def)):find("item_eat")
end
function cauldron.boiling_timer(pos)
local node = minetest.get_node(pos)
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 = {}
for _, obj in pairs(objs) do
@ -96,60 +108,68 @@ function cauldron.boiling_timer(pos)
local itemstring = obj:get_luaentity().itemstring
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
ingredients[#ingredients+1] = food break
ingredients[#ingredients + 1] = food
break
end
end
end
end
if #ingredients >= 2 then
for _, obj in pairs(objs) do obj:remove() end
minetest.set_node(pos, {name="xdecor:cauldron_soup", param2=node.param2})
for _, obj in pairs(objs) do
obj:remove()
end
minetest.set_node(pos, {name = "xdecor:cauldron_soup", param2 = node.param2})
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
minetest.set_node(pos, {name="xdecor:cauldron_idle", param2=node.param2})
minetest.set_node(pos, {name = "xdecor:cauldron_idle", param2 = node.param2})
end
return true
end
function cauldron.take_soup(pos, node, clicker, itemstack)
local inv = clicker:get_inventory()
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 inv:room_for_item("main", "xdecor:bowl_soup 1") then
itemstack:take_item()
inv:add_item("main", "xdecor:bowl_soup 1")
else
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
end
else
itemstack:replace("xdecor:bowl_soup 1")
end
minetest.set_node(pos, {name="xdecor:cauldron_empty", param2=node.param2})
minetest.set_node(pos, {name = "xdecor:cauldron_empty", param2 = node.param2})
end
return itemstack
end
xdecor.register("cauldron_empty", {
description = "Cauldron",
description = S("Cauldron"),
groups = {cracky=2, oddly_breakable_by_hand=1},
on_rotate = screwdriver.rotate_simple,
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)
cauldron.stop_sound(pos)
end,
on_rightclick = cauldron.filling,
collision_box = xdecor.pixelbox(16, cauldron.cbox)
})
xdecor.register("cauldron_idle", {
@ -157,58 +177,66 @@ xdecor.register("cauldron_idle", {
on_rotate = screwdriver.rotate_simple,
tiles = {"xdecor_cauldron_top_idle.png", "xdecor_cauldron_sides.png"},
drop = "xdecor:cauldron_empty",
infotext = "Cauldron (idle)",
infotext = S("Cauldron (idle)"),
collision_box = xdecor.pixelbox(16, cauldron.cbox),
on_rightclick = cauldron.filling,
on_construct = cauldron.idle_construct,
on_timer = cauldron.idle_timer
on_timer = cauldron.idle_timer,
})
xdecor.register("cauldron_boiling", {
groups = {cracky=2, oddly_breakable_by_hand=1, not_in_creative_inventory=1},
on_rotate = screwdriver.rotate_simple,
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,
tiles = {{name="xdecor_cauldron_top_anim_boiling_water.png",
animation={type="vertical_frames", length=3.0}},
"xdecor_cauldron_sides.png"},
tiles = {
{
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),
on_rightclick = cauldron.filling,
on_construct = cauldron.boiling_construct,
on_timer = cauldron.boiling_timer,
on_destruct = function(pos)
cauldron.stop_sound(pos)
end,
on_timer = cauldron.boiling_timer
})
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,
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,
tiles = {{name="xdecor_cauldron_top_anim_soup.png",
animation={type="vertical_frames", length=3.0}},
"xdecor_cauldron_sides.png"},
tiles = {
{
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),
on_rightclick = cauldron.take_soup,
on_destruct = function(pos)
cauldron.stop_sound(pos)
end
end,
})
-- Craft items
minetest.register_craftitem("xdecor:bowl", {
description = "Bowl",
description = S("Bowl"),
inventory_image = "xdecor_bowl.png",
wield_image = "xdecor_bowl.png",
groups = {food_bowl = 1, flammable = 2},
})
minetest.register_craftitem("xdecor:bowl_soup", {
description = "Bowl of soup",
description = S("Bowl of soup"),
inventory_image = "xdecor_bowl_soup.png",
wield_image = "xdecor_bowl_soup.png",
groups = {not_in_creative_inventory=1},

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,146 +1,177 @@
screwdriver = screwdriver or {}
local S = minetest.get_translator("xdecor")
local function register_pane(name, desc, def)
xpanes.register_pane(name, {
description = desc,
tiles = {"xdecor_"..name..".png"},
tiles = {"xdecor_" .. name .. ".png"},
drawtype = "airlike",
paramtype = "light",
textures = {"xdecor_"..name..".png", "xdecor_"..name..".png", "xpanes_space.png"},
inventory_image = "xdecor_"..name..".png",
wield_image = "xdecor_"..name..".png",
textures = {"xdecor_" .. name .. ".png", "" ,"xdecor_" .. name .. ".png"},
inventory_image = "xdecor_" .. name .. ".png",
wield_image = "xdecor_" .. name .. ".png",
groups = def.groups,
sounds = def.sounds or default.node_sound_defaults(),
recipe = def.recipe
})
end
register_pane("bamboo_frame", "Bamboo Frame", {
groups = {choppy=3, oddly_breakable_by_hand=2, pane=1, flammable=2},
recipe = {{"default:papyrus", "default:papyrus", "default:papyrus"},
{"default:papyrus", "farming:cotton", "default:papyrus"},
{"default:papyrus", "default:papyrus", "default:papyrus"}}
register_pane("bamboo_frame", S("Bamboo Frame"), {
groups = {choppy = 3, oddly_breakable_by_hand = 2, pane = 1, flammable = 2},
recipe = {
{"default:papyrus", "default:papyrus", "default:papyrus"},
{"default:papyrus", "farming:cotton", "default:papyrus"},
{"default:papyrus", "default:papyrus", "default:papyrus"}
}
})
register_pane("chainlink", "Chainlink", {
groups = {cracky=3, oddly_breakable_by_hand=2, pane=1},
recipe = {{"default:steel_ingot", "", "default:steel_ingot"},
{"", "default:steel_ingot", ""},
{"default:steel_ingot", "", "default:steel_ingot"}}
register_pane("chainlink", S("Chainlink"), {
groups = {cracky = 3, oddly_breakable_by_hand = 2, pane = 1},
recipe = {
{"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(),
groups = {cracky=2, pane=1},
recipe = {{"", "default:dirt", ""},
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}}
groups = {cracky = 2, pane = 1},
recipe = {
{"", "default:dirt", ""},
{"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(),
groups = {choppy=2, pane=1, flammable=2},
recipe = {{"group:wood", "group:stick", "group:wood"},
{"group:stick", "group:stick", "group:stick"},
{"group:wood", "group:stick", "group:wood"}}
groups = {choppy = 2, pane = 1, flammable = 2},
recipe = {
{"group:wood", "group:stick", "group:wood"},
{"group:stick", "group:stick", "group:stick"},
{"group:wood", "group:stick", "group:wood"}
}
})
xdecor.register("baricade", {
description = "Baricade",
description = S("Baricade"),
drawtype = "plantlike",
paramtype2 = "facedir",
inventory_image = "xdecor_baricade.png",
tiles = {"xdecor_baricade.png"},
groups = {choppy=2, oddly_breakable_by_hand=1, flammable=2},
groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
damage_per_second = 4,
selection_box = xdecor.nodebox.slab_y(0.3),
collision_box = xdecor.pixelbox(2, {{0, 0, 1, 2, 2, 0}})
})
xdecor.register("barrel", {
description = "Barrel",
description = S("Barrel"),
tiles = {"xdecor_barrel_top.png", "xdecor_barrel_top.png", "xdecor_barrel_sides.png"},
on_place = minetest.rotate_node,
groups = {choppy=2, oddly_breakable_by_hand=1, flammable=2},
groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
sounds = default.node_sound_wood_defaults()
})
local function register_storage(name, desc, def)
xdecor.register(name, {
description = desc,
inventory = {size=def.inv_size or 24},
inventory = {size = def.inv_size or 24},
infotext = desc,
tiles = def.tiles,
node_box = def.node_box,
on_rotate = def.on_rotate,
on_place = def.on_place,
groups = def.groups or {choppy=2, oddly_breakable_by_hand=1, flammable=2},
groups = def.groups or {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
sounds = default.node_sound_wood_defaults()
})
end
register_storage("cabinet", "Wooden Cabinet", {
register_storage("cabinet", S("Wooden Cabinet"), {
on_rotate = screwdriver.rotate_simple,
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"}
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"
}
})
register_storage("cabinet_half", "Half Wooden Cabinet", {
register_storage("cabinet_half", S("Half Wooden Cabinet"), {
inv_size = 8,
node_box = xdecor.nodebox.slab_y(0.5, 0.5),
on_rotate = screwdriver.rotate_simple,
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_front.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_front.png"
}
})
register_storage("empty_shelf", "Empty Shelf", {
on_rotate = screwdriver.rotate_simple,
tiles = {"default_wood.png", "default_wood.png", "default_wood.png",
"default_wood.png", "default_wood.png^xdecor_empty_shelf.png"}
})
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,
tiles = {
"default_wood.png", "default_wood.png", "default_wood.png",
"default_wood.png", "default_wood.png^xdecor_empty_shelf.png"
}
})
end
register_storage("multishelf", "Multi Shelf", {
register_storage("multishelf", S("Multi Shelf"), {
on_rotate = screwdriver.rotate_simple,
tiles = {"default_wood.png", "default_wood.png", "default_wood.png",
"default_wood.png", "default_wood.png^xdecor_multishelf.png"},
tiles = {
"default_wood.png", "default_wood.png", "default_wood.png",
"default_wood.png", "default_wood.png^xdecor_multishelf.png"
},
})
xdecor.register("candle", {
description = "Candle",
description = S("Candle"),
light_source = 12,
drawtype = "torchlike",
inventory_image = "xdecor_candle_inv.png",
wield_image = "xdecor_candle_wield.png",
paramtype2 = "wallmounted",
walkable = false,
groups = {dig_immediate=3, attached_node=1},
tiles = {{name = "xdecor_candle_floor.png",
animation = {type="vertical_frames", length=1.5}},
{name = "xdecor_candle_floor.png",
animation = {type="vertical_frames", length=1.5}},
{name = "xdecor_candle_wall.png",
animation = {type="vertical_frames", length=1.5}}
groups = {dig_immediate = 3, attached_node = 1},
tiles = {
{
name = "xdecor_candle_floor.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 = {
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_side = {-0.5, -0.35, -0.15, -0.15, 0.4, 0.15}
}
})
xdecor.register("chair", {
description = "Chair",
description = S("Chair"),
tiles = {"xdecor_wood.png"},
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,
node_box = xdecor.pixelbox(16, {
{3, 0, 11, 2, 16, 2}, {11, 0, 11, 2, 16, 2},
{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}
{3, 0, 11, 2, 16, 2},
{11, 0, 11, 2, 16, 2},
{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,
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
@ -151,7 +182,7 @@ xdecor.register("chair", {
})
xdecor.register("cobweb", {
description = "Cobweb",
description = S("Cobweb"),
drawtype = "plantlike",
tiles = {"xdecor_cobweb.png"},
inventory_image = "xdecor_cobweb.png",
@ -163,59 +194,61 @@ xdecor.register("cobweb", {
liquid_range = 0,
walkable = false,
selection_box = {type = "regular"},
groups = {snappy=3, liquid=3, flammable=3},
groups = {snappy = 3, liquid = 3, flammable = 3},
sounds = default.node_sound_leaves_defaults()
})
local curtain_colors = {
"red",
red = S("Red Curtain"),
}
for _, c in pairs(curtain_colors) do
xdecor.register("curtain_"..c, {
description = c:gsub("^%l", string.upper).." Curtain",
for c, desc in pairs(curtain_colors) do
xdecor.register("curtain_" .. c, {
description = desc,
walkable = false,
tiles = {"wool_white.png"},
color = c,
inventory_image = "wool_white.png^[colorize:"..c..
inventory_image = "wool_white.png^[colorize:" .. c ..
":170^xdecor_curtain_open_overlay.png^[makealpha:255,126,126",
wield_image = "wool_white.png^[colorize:"..c..":170",
wield_image = "wool_white.png^[colorize:" .. c .. ":170",
drawtype = "signlike",
paramtype2 = "colorwallmounted",
groups = {dig_immediate=3, flammable=3},
selection_box = {type="wallmounted"},
groups = {dig_immediate = 3, flammable = 3},
selection_box = {type = "wallmounted"},
on_rightclick = function(pos, node, _, itemstack)
minetest.set_node(pos, {name="xdecor:curtain_open_"..c, param2=node.param2})
minetest.set_node(pos, {name = "xdecor:curtain_open_" .. c, param2 = node.param2})
return itemstack
end
})
xdecor.register("curtain_open_"..c, {
xdecor.register("curtain_open_" .. c, {
tiles = {"wool_white.png^xdecor_curtain_open_overlay.png^[makealpha:255,126,126"},
color = c,
drawtype = "signlike",
paramtype2 = "colorwallmounted",
walkable = false,
groups = {dig_immediate=3, flammable=3, not_in_creative_inventory=1},
groups = {dig_immediate = 3, flammable = 3, not_in_creative_inventory = 1},
selection_box = {type="wallmounted"},
drop = "xdecor:curtain_"..c,
drop = "xdecor:curtain_" .. c,
on_rightclick = function(pos, node, _, itemstack)
minetest.set_node(pos, {name="xdecor:curtain_"..c, param2=node.param2})
minetest.set_node(pos, {name="xdecor:curtain_" .. c, param2 = node.param2})
return itemstack
end
})
minetest.register_craft({
output = "xdecor:curtain_"..c.." 4",
recipe = {{"", "wool:"..c, ""},
{"", "wool:"..c, ""}}
output = "xdecor:curtain_" .. c .. " 4",
recipe = {
{"", "wool:" .. c, ""},
{"", "wool:" .. c, ""}
}
})
end
xdecor.register("cushion", {
description = "Cushion",
description = S("Cushion"),
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,
node_box = xdecor.nodebox.slab_y(0.5),
can_dig = xdecor.sit_dig,
@ -227,9 +260,9 @@ xdecor.register("cushion", {
})
xdecor.register("cushion_block", {
description = "Cushion Block",
description = S("Cushion Block"),
tiles = {"xdecor_cushion.png"},
groups = {snappy=3, flammable=3, fall_damage_add_percent=-75, not_in_creative_inventory=1}
groups = {snappy = 3, flammable = 3, fall_damage_add_percent = -75, not_in_creative_inventory = 1}
})
local function door_access(name)
@ -238,49 +271,98 @@ end
local xdecor_doors = {
japanese = {
{"group:wood", "default:paper"},
{"default:paper", "group:wood"},
{"group:wood", "default:paper"} },
recipe = {
{"group:wood", "default:paper"},
{"default:paper", "group:wood"},
{"group:wood", "default:paper"}
},
desc = S("Japanese Door"),
},
prison = {
{"xpanes:bar_flat", "xpanes:bar_flat",},
{"xpanes:bar_flat", "xpanes:bar_flat",},
{"xpanes:bar_flat", "xpanes:bar_flat"} },
recipe = {
{"xpanes:bar_flat", "xpanes:bar_flat",},
{"xpanes:bar_flat", "xpanes:bar_flat",},
{"xpanes:bar_flat", "xpanes:bar_flat"}
},
desc = S("Prison Door"),
},
rusty_prison = {
{"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat",},
{"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat",},
{"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat"} },
recipe = {
{"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat",},
{"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat",},
{"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat"}
},
desc = S("Rusty Prison Door"),
},
screen = {
{"group:wood", "group:wood"},
{"xpanes:chainlink_flat", "xpanes:chainlink_flat"},
{"group:wood", "group:wood"} },
recipe = {
{"group:wood", "group:wood"},
{"xpanes:chainlink_flat", "xpanes:chainlink_flat"},
{"group:wood", "group:wood"}
},
desc = S("Screen Door"),
},
slide = {
{"default:paper", "default:paper"},
{"default:paper", "default:paper"},
{"group:wood", "group:wood"} },
recipe = {
{"default:paper", "default:paper"},
{"default:paper", "default:paper"},
{"group:wood", "group:wood"}
},
desc = S("Slide Door"),
},
woodglass = {
{"default:glass", "default:glass"},
{"group:wood", "group:wood"},
{"group:wood", "group:wood"} }
recipe = {
{"default:glass", "default:glass"},
{"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
doors.register(name.."_door", {
tiles = {{name = "xdecor_"..name.."_door.png", backface_culling=true}},
description = name:gsub("%f[%w]%l", string.upper):gsub("_", " ").." Door",
inventory_image = "xdecor_"..name.."_door_inv.png",
doors.register(name .. "_door", {
tiles = {
{name = "xdecor_" .. name .. "_door.png", backface_culling = true}
},
description = def.desc,
inventory_image = "xdecor_" .. name .. "_door_inv.png",
protected = door_access(name),
groups = {choppy=2, cracky=2, oddly_breakable_by_hand=1, door=1},
recipe = recipe
groups = {choppy = 2, cracky = 2, oddly_breakable_by_hand = 1, door = 1},
recipe = def.recipe,
mesecons = mesecons_register,
})
end
xdecor.register("enderchest", {
description = "Ender Chest",
tiles = {"xdecor_enderchest_top.png", "xdecor_enderchest_top.png",
"xdecor_enderchest_side.png", "xdecor_enderchest_side.png",
"xdecor_enderchest_side.png", "xdecor_enderchest_front.png"},
groups = {cracky=1, choppy=1},
description = S("Ender Chest"),
tiles = {
"xdecor_enderchest_top.png", "xdecor_enderchest_top.png",
"xdecor_enderchest_side.png", "xdecor_enderchest_side.png",
"xdecor_enderchest_side.png", "xdecor_enderchest_front.png"
},
groups = {cracky = 1, choppy = 1},
sounds = default.node_sound_stone_defaults(),
on_rotate = screwdriver.rotate_simple,
on_construct = function(pos)
@ -290,8 +372,9 @@ xdecor.register("enderchest", {
list[current_player;main;0,5;8,4;]
listring[current_player;enderchest]
listring[current_player;main] ]]
..xbg..default.get_hotbar_bg(0,5))
meta:set_string("infotext", "Ender Chest")
.. xbg .. default.get_hotbar_bg(0,5))
meta:set_string("infotext", S("Ender Chest"))
end
})
@ -301,11 +384,11 @@ minetest.register_on_joinplayer(function(player)
end)
xdecor.register("ivy", {
description = "Ivy",
description = S("Ivy"),
drawtype = "signlike",
walkable = false,
climbable = true,
groups = {snappy=3, flora=1, attached_node=1, plant=1, flammable=3},
groups = {snappy = 3, flora = 1, attached_node = 1, plant = 1, flammable = 3},
paramtype2 = "wallmounted",
selection_box = {type="wallmounted"},
tiles = {"xdecor_ivy.png"},
@ -314,46 +397,76 @@ xdecor.register("ivy", {
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", {
description = "Lantern",
description = S("Lantern"),
light_source = 13,
drawtype = "plantlike",
inventory_image = "xdecor_lantern_inv.png",
wield_image = "xdecor_lantern_inv.png",
paramtype2 = "wallmounted",
walkable = false,
groups = {snappy=3, attached_node=1},
tiles = {{name="xdecor_lantern.png", animation={type="vertical_frames", length=1.5}}},
groups = {snappy = 3, attached_node = 1},
tiles = {
{
name = "xdecor_lantern.png",
animation = {type="vertical_frames", length = 1.5}
}
},
selection_box = xdecor.pixelbox(16, {{4, 0, 4, 8, 16, 8}})
})
for _, l in pairs({"iron", "wooden"}) do
xdecor.register(l.."_lightbox", {
description = l:gsub("^%l", string.upper).." Light Box",
tiles = {"xdecor_"..l.."_lightbox.png"},
groups = {cracky=3, choppy=3, oddly_breakable_by_hand=2},
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", {
description = desc,
tiles = {"xdecor_" .. l .. "_lightbox.png"},
groups = {cracky = 3, choppy = 3, oddly_breakable_by_hand = 2},
light_source = 13,
sounds = default.node_sound_glass_defaults()
})
end
for _, f in pairs({"dandelion_white", "dandelion_yellow", "geranium",
"rose", "tulip", "viola"}) do
xdecor.register("potted_"..f, {
description = "Potted "..f:gsub("%f[%w]%l", string.upper):gsub("_", " "),
local xdecor_potted = {
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, {
description = desc,
walkable = false,
groups = {snappy=3, flammable=3, plant=1, flower=1},
tiles = {"xdecor_"..f.."_pot.png"},
inventory_image = "xdecor_"..f.."_pot.png",
groups = {snappy = 3, flammable = 3, plant = 1, flower = 1},
tiles = {"xdecor_" .. f .. "_pot.png"},
inventory_image = "xdecor_" .. f .. "_pot.png",
drawtype = "plantlike",
sounds = default.node_sound_leaves_defaults(),
selection_box = xdecor.nodebox.slab_y(0.3)
})
minetest.register_craft({
output = "xdecor:potted_"..f,
recipe = {{"default:clay_brick", "flowers:"..f,
"default:clay_brick"}, {"", "default:clay_brick", ""}}
output = "xdecor:potted_" .. f,
recipe = {
{"default:clay_brick", "flowers:" .. f, "default:clay_brick"},
{"", "default:clay_brick", ""}
}
})
end
@ -365,45 +478,52 @@ local painting_box = {
}
xdecor.register("painting_1", {
description = "Painting",
description = S("Painting"),
tiles = {"xdecor_painting_1.png"},
inventory_image = "xdecor_painting_empty.png",
wield_image = "xdecor_painting_empty.png",
paramtype2 = "wallmounted",
sunlight_propagates = true,
groups = {choppy=3, oddly_breakable_by_hand=2, flammable=2, attached_node=1},
groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2, attached_node = 1},
sounds = default.node_sound_wood_defaults(),
node_box = painting_box,
node_placement_prediction = "",
on_place = function(itemstack, placer, pointed_thing)
local num = math.random(4)
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
not minetest.setting_getbool("creative_mode") then
itemstack:take_item()
end
return itemstack
end
})
for i = 2, 4 do
xdecor.register("painting_"..i, {
tiles = {"xdecor_painting_"..i..".png"},
xdecor.register("painting_" .. i, {
tiles = {"xdecor_painting_" .. i .. ".png"},
paramtype2 = "wallmounted",
drop = "xdecor:painting_1",
sunlight_propagates = true,
groups = {choppy=3, oddly_breakable_by_hand=2, flammable=2,
attached_node=1, not_in_creative_inventory=1},
groups = {
choppy = 3,
oddly_breakable_by_hand = 2,
flammable = 2,
attached_node = 1,
not_in_creative_inventory = 1
},
sounds = default.node_sound_wood_defaults(),
node_box = painting_box
})
end
xdecor.register("stonepath", {
description = "Garden Stone Path",
description = S("Garden Stone Path"),
tiles = {"default_stone.png"},
groups = {snappy=3},
groups = {snappy = 3},
on_rotate = screwdriver.rotate_simple,
sounds = default.node_sound_stone_defaults(),
sunlight_propagates = true,
@ -418,32 +538,34 @@ local function register_hard_node(name, desc, def)
def = def or {}
xdecor.register(name, {
description = desc,
tiles = {"xdecor_"..name..".png"},
groups = def.groups or {cracky=1},
tiles = {"xdecor_" .. name .. ".png"},
groups = def.groups or {cracky = 1},
sounds = def.sounds or default.node_sound_stone_defaults()
})
end
register_hard_node("cactusbrick", "Cactus Brick")
register_hard_node("coalstone_tile", "Coal Stone Tile")
register_hard_node("desertstone_tile", "Desert Stone Tile")
register_hard_node("hard_clay", "Hardened Clay")
register_hard_node("moonbrick", "Moon Brick")
register_hard_node("stone_tile", "Stone Tile")
register_hard_node("stone_rune", "Runestone")
register_hard_node("packed_ice", "Packed Ice", {
groups = {cracky=1, puts_out_fire=1, slippery=3},
register_hard_node("cactusbrick", S("Cactus Brick"))
register_hard_node("coalstone_tile", S("Coal Stone Tile"))
register_hard_node("desertstone_tile", S("Desert Stone Tile"))
register_hard_node("hard_clay", S("Hardened Clay"))
register_hard_node("moonbrick", S("Moon Brick"))
register_hard_node("stone_tile", S("Stone Tile"))
register_hard_node("stone_rune", S("Runestone"))
register_hard_node("packed_ice", S("Packed Ice"), {
groups = {cracky = 1, puts_out_fire = 1, slippery = 3},
sounds = default.node_sound_glass_defaults()
})
register_hard_node("wood_tile", "Wooden Tile", {
groups = {choppy=1, wood=1, flammable=2},
register_hard_node("wood_tile", S("Wooden Tile"), {
groups = {choppy = 1, wood = 1, flammable = 2},
sounds = default.node_sound_wood_defaults()
})
xdecor.register("table", {
description = "Table",
description = S("Table"),
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(),
node_box = xdecor.pixelbox(16, {
{0, 14, 0, 16, 2, 16}, {5.5, 0, 5.5, 5, 14, 6}
@ -451,40 +573,65 @@ xdecor.register("table", {
})
xdecor.register("tatami", {
description = "Tatami",
description = S("Tatami"),
tiles = {"xdecor_tatami.png"},
wield_image = "xdecor_tatami.png",
groups = {snappy=3, flammable=3},
groups = {snappy = 3, flammable = 3},
sunlight_propagates = true,
node_box = xdecor.nodebox.slab_y(0.0625)
})
xdecor.register("trampoline", {
description = "Trampoline",
description = S("Trampoline"),
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),
sounds = {footstep = {name="xdecor_bouncy", gain=0.8}}
sounds = {
footstep = {
name = "xdecor_bouncy",
gain = 0.8
}
}
})
xdecor.register("tv", {
description = "Television",
description = S("Television"),
light_source = 11,
groups = {cracky=3, oddly_breakable_by_hand=2},
groups = {cracky = 3, oddly_breakable_by_hand = 2},
on_rotate = screwdriver.rotate_simple,
tiles = {"xdecor_television_left.png^[transformR270",
"xdecor_television_left.png^[transformR90",
"xdecor_television_left.png^[transformFX",
"xdecor_television_left.png", "xdecor_television_back.png",
{name="xdecor_television_front_animated.png",
animation = {type="vertical_frames", length=80.0}} }
tiles = {
"xdecor_television_left.png^[transformR270",
"xdecor_television_left.png^[transformR90",
"xdecor_television_left.png^[transformFX",
"xdecor_television_left.png", "xdecor_television_back.png",
{
name = "xdecor_television_front_animated.png",
animation = {type = "vertical_frames", length = 80.0}
}
}
})
xdecor.register("woodframed_glass", {
description = "Wood Framed Glass",
description = S("Wood Framed Glass"),
drawtype = "glasslike_framed",
sunlight_propagates = true,
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()
})
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({
output = "xdecor:cobweb",
recipe = {
{"farming:cotton", "", "farming:cotton"},
{"", "farming:cotton", ""},
{"farming:cotton", "", "farming:cotton"}
{"farming:string", "", "farming:string"},
{"", "farming:string", ""},
{"farming:string", "", "farming:string"}
}
})
@ -95,14 +95,16 @@ minetest.register_craft({
}
})
minetest.register_craft({
output = "xdecor:empty_shelf",
recipe = {
{"group:wood", "group:wood", "group:wood"},
{"", "", ""},
{"group:wood", "group:wood", "group:wood"}
}
})
if not minetest.get_modpath("moreblocks") then
minetest.register_craft({
output = "xdecor:empty_shelf",
recipe = {
{"group:wood", "group:wood", "group:wood"},
{"", "", ""},
{"group:wood", "group:wood", "group:wood"}
}
})
end
minetest.register_craft({
output = "xdecor:enderchest",
@ -174,7 +176,31 @@ minetest.register_craft({
minetest.register_craft({
output = "xdecor:painting_1",
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 S = minetest.get_translator("xdecor")
-- Code by Mirko K. (modified by Temperest, Wulfsdad and kilbith) (License: GPL).
function rope.place(itemstack, placer, pointed_thing)
@ -6,6 +7,7 @@ function rope.place(itemstack, placer, pointed_thing)
local pos = pointed_thing.above
local oldnode = minetest.get_node(pos)
local stackname = itemstack:get_name()
if minetest.is_protected(pos, placer:get_player_name()) then
return itemstack
end
@ -18,12 +20,13 @@ function rope.place(itemstack, placer, pointed_thing)
oldnode = minetest.get_node(pos)
end
end
return itemstack
end
function rope.remove(pos, oldnode, digger, rope_name)
local num = 0
local below = {x=pos.x, y=pos.y, z=pos.z}
local below = {x = pos.x, y = pos.y, z = pos.z}
local digger_inv = digger:get_inventory()
while minetest.get_node(below).name == rope_name do
@ -31,24 +34,28 @@ function rope.remove(pos, oldnode, digger, rope_name)
below.y = below.y - 1
num = num + 1
end
if num == 0 then return end
digger_inv:add_item("main", rope_name.." "..num)
return true
end
xdecor.register("rope", {
description = "Rope",
description = S("Rope"),
drawtype = "plantlike",
walkable = false,
climbable = true,
groups = {snappy=3, flammable=3},
groups = {snappy = 3, flammable = 3},
tiles = {"xdecor_rope.png"},
inventory_image = "xdecor_rope_inv.png",
wield_image = "xdecor_rope_inv.png",
selection_box = xdecor.pixelbox(8, {{3, 0, 3, 2, 8, 2}}),
on_place = rope.place,
on_punch = function(pos, node, puncher, pointed_thing)
local player_name = puncher:get_player_name()
if not minetest.is_protected(pos, player_name) or
minetest.get_player_privs(player_name).protection_bypass then
rope.remove(pos, node, puncher, "xdecor:rope")
@ -65,4 +72,4 @@ minetest.register_craft({
{"farming:string"},
{"farming:string"}
}
})
})

View File

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